From 4f384360f21cd62812e9081d32404119aad7539b Mon Sep 17 00:00:00 2001
From: curstwist <39442864+curstwist@users.noreply.github.com>
Date: Fri, 23 Jul 2021 00:06:37 -0400
Subject: [PATCH] modular lab security & ground floor (#50033)

* modular lab security & ground floor

also includes associated content additions.
---
 data/json/flags.json                          |  72 +++
 .../terrain-floors-indoor.json                |  69 +++
 .../terrain-mechanisms.json                   | 288 +++++++++++
 data/json/itemgroups/Labs/labs_common.json    |  18 +-
 data/json/itemgroups/electronics.json         |  22 +
 data/json/items/generic.json                  |  60 +--
 data/json/items/id_cards.json                 | 162 ++++++
 .../lab/lab_modular/lab_1x1_security.json     | 463 ++++++++++++++++++
 .../lab/lab_modular/lab_cargo_surface.json    | 354 +++++++++++++
 .../lab/lab_modular_palette.json              |  24 +-
 data/json/monstergroups/lab.json              |  51 ++
 .../lab_modular/lab_mini_specials.json        |  43 ++
 .../overmap_terrain/overmap_terrain_lab.json  |  54 ++
 13 files changed, 1625 insertions(+), 55 deletions(-)
 create mode 100644 data/json/items/id_cards.json
 create mode 100644 data/json/mapgen/lab/lab_modular/lab_1x1_security.json
 create mode 100644 data/json/mapgen/lab/lab_modular/lab_cargo_surface.json

diff --git a/data/json/flags.json b/data/json/flags.json
index 1f627691f0cc9..a3d0cf620fa93 100644
--- a/data/json/flags.json
+++ b/data/json/flags.json
@@ -1988,5 +1988,77 @@
     "id": "HARD",
     "type": "json_flag",
     "context": [  ]
+  },
+  {
+    "id": "SCIENCE_CARD_VISITOR",
+    "type": "json_flag",
+    "context": [ "GENERIC" ],
+    "info": "You could probably use this to get into a science facility."
+  },
+  {
+    "id": "SCIENCE_CARD_MAINTENANCE_GREEN",
+    "type": "json_flag",
+    "context": [ "GENERIC" ],
+    "info": "You could probably use this to get into a science facility."
+  },
+  {
+    "id": "SCIENCE_CARD_MAINTENANCE_YELLOW",
+    "type": "json_flag",
+    "context": [ "GENERIC" ],
+    "info": "You could probably use this to get into a secured maintence area."
+  },
+  {
+    "id": "SCIENCE_CARD_MAINTENANCE_BLUE",
+    "type": "json_flag",
+    "context": [ "GENERIC" ],
+    "info": "You could probably use this to get into a secured maintence area."
+  },
+  {
+    "id": "SCIENCE_CARD_TRANSPORT_1",
+    "type": "json_flag",
+    "context": [ "GENERIC" ],
+    "info": "You could probably use this to get into a science facility."
+  },
+  {
+    "id": "SCIENCE_CARD_SECURITY_YELLOW",
+    "type": "json_flag",
+    "context": [ "GENERIC" ],
+    "info": "You could probably use this to get into a secured law enforcement area."
+  },
+  {
+    "id": "SCIENCE_CARD_SECURITY_MAGENTA",
+    "type": "json_flag",
+    "context": [ "GENERIC" ],
+    "info": "You could probably use this to get into a secured law enforcement area."
+  },
+  {
+    "id": "SCIENCE_CARD_SECURITY_BLACK",
+    "type": "json_flag",
+    "context": [ "GENERIC" ],
+    "info": "You could probably use this to get into a secured  area."
+  },
+  {
+    "id": "SCIENCE_CARD_MUTAGEN_GREEN",
+    "type": "json_flag",
+    "context": [ "GENERIC" ],
+    "info": "You could probably use this to access a secure zone of a facility."
+  },
+  {
+    "id": "SCIENCE_CARD_MUTAGEN_PINK",
+    "type": "json_flag",
+    "context": [ "GENERIC" ],
+    "info": "You could probably use this to access a secure zone of a facility."
+  },
+  {
+    "id": "SCIENCE_CARD_MUTAGEN_CYAN",
+    "type": "json_flag",
+    "context": [ "GENERIC" ],
+    "info": "You could probably use this to access a secure zone of a facility."
+  },
+  {
+    "id": "SCIENCE_CARD_MEDICAL_RED",
+    "type": "json_flag",
+    "context": [ "GENERIC" ],
+    "info": "You could probably use this to access a secure zone of a facility."
   }
 ]
diff --git a/data/json/furniture_and_terrain/terrain-floors-indoor.json b/data/json/furniture_and_terrain/terrain-floors-indoor.json
index ecdd6572804a8..c2d2c4c64c57e 100644
--- a/data/json/furniture_and_terrain/terrain-floors-indoor.json
+++ b/data/json/furniture_and_terrain/terrain-floors-indoor.json
@@ -131,6 +131,75 @@
       ]
     }
   },
+  {
+    "type": "terrain",
+    "id": "t_strconc_floor_olight",
+    "name": "strong concrete floor, overhead light",
+    "description": "Extremely resilient floor made from carefully placed rebar and poured concrete with a still-functioning light attached to the ceiling above.",
+    "symbol": ".",
+    "color": "white",
+    "move_cost": 2,
+    "light_emitted": 120,
+    "roof": "t_flat_roof",
+    "looks_like": "t_thconc_floor_olight",
+    "flags": [ "TRANSPARENT", "SUPPORTS_ROOF", "INDOORS", "FLAT", "ROAD" ],
+    "bash": {
+      "str_min": 4,
+      "str_max": 12,
+      "sound": "glass breaking!",
+      "sound_fail": "whack!",
+      "sound_vol": 16,
+      "sound_fail_vol": 10,
+      "ter_set": "t_strconc_floor",
+      "items": [ { "item": "glass_shard", "count": [ 8, 16 ] } ]
+    }
+  },
+  {
+    "type": "terrain",
+    "id": "t_linoleum_gray_floor_olight",
+    "name": "gray linoleum floor, overhead light",
+    "description": "Linoleum flooring with a still-functioning light attached to the ceiling above.",
+    "symbol": ".",
+    "color": "white",
+    "move_cost": 2,
+    "light_emitted": 120,
+    "roof": "t_flat_roof",
+    "looks_like": "t_thconc_floor_olight",
+    "flags": [ "TRANSPARENT", "SUPPORTS_ROOF", "INDOORS", "FLAT", "ROAD" ],
+    "bash": {
+      "str_min": 4,
+      "str_max": 12,
+      "sound": "glass breaking!",
+      "sound_fail": "whack!",
+      "sound_vol": 16,
+      "sound_fail_vol": 10,
+      "ter_set": "t_linoleum_gray",
+      "items": [ { "item": "glass_shard", "count": [ 8, 16 ] } ]
+    }
+  },
+  {
+    "type": "terrain",
+    "id": "t_linoleum_whitefloor_olight",
+    "name": "white linoleum floor, overhead light",
+    "description": "Linoleum flooring with a still-functioning light attached to the ceiling above.",
+    "symbol": ".",
+    "color": "white",
+    "move_cost": 2,
+    "light_emitted": 120,
+    "roof": "t_flat_roof",
+    "looks_like": "t_thconc_floor_olight",
+    "flags": [ "TRANSPARENT", "SUPPORTS_ROOF", "INDOORS", "FLAT", "ROAD" ],
+    "bash": {
+      "str_min": 4,
+      "str_max": 12,
+      "sound": "glass breaking!",
+      "sound_fail": "whack!",
+      "sound_vol": 16,
+      "sound_fail_vol": 10,
+      "ter_set": "t_linoleum_white",
+      "items": [ { "item": "glass_shard", "count": [ 8, 16 ] } ]
+    }
+  },
   {
     "type": "terrain",
     "id": "t_ov_smreb_cage",
diff --git a/data/json/furniture_and_terrain/terrain-mechanisms.json b/data/json/furniture_and_terrain/terrain-mechanisms.json
index 57c9c988205bb..d4edb55099992 100644
--- a/data/json/furniture_and_terrain/terrain-mechanisms.json
+++ b/data/json/furniture_and_terrain/terrain-mechanisms.json
@@ -342,6 +342,294 @@
       "items": [ { "item": "plastic_chunk", "count": [ 0, 2 ] }, { "item": "scrap", "prob": 50 } ]
     }
   },
+  {
+    "type": "terrain",
+    "id": "t_card_science_visitor",
+    "name": "Facility entrance card reader",
+    "description": "This is a smartcard reader.  It sports the stylized symbol of an atom inside a flask that is universally known to indicate SCIENCE.  You could swipe a Visitor's Pass near it to unlock the gates.",
+    "//": "Entrance card for a lab.  Low security access.",
+    "symbol": "6",
+    "color": "cyan",
+    "copy-from": "t_card_science",
+    "looks_like": "t_card_science",
+    "examine_action": {
+      "type": "cardreader",
+      "flags": [ "SCIENCE_CARD_VISITOR" ],
+      "consume_card": true,
+      "allow_hacking": true,
+      "despawn_monsters": true,
+      "radius": 3,
+      "terrain_changes": { "t_door_metal_locked": "t_door_metal_c" },
+      "query": true,
+      "query_msg": "Are you sure you want to open this door?",
+      "success_msg": "You opened the door!",
+      "redundant_msg": "The door is already open."
+    }
+  },
+  {
+    "type": "terrain",
+    "id": "t_card_science_maintenance_green",
+    "name": "Maintenance: green zone card reader",
+    "description": "This is a smartcard reader.  It sports the stylized symbol of an atom and a wrench on a green background.  You could swipe a maintenance employee badge near it to unlock the gates.",
+    "//": "Entrance card for a lab.  Low security access.",
+    "symbol": "6",
+    "color": "green",
+    "copy-from": "t_card_science",
+    "looks_like": "t_card_science",
+    "examine_action": {
+      "type": "cardreader",
+      "flags": [ "SCIENCE_CARD_MAINTENANCE_GREEN" ],
+      "consume_card": false,
+      "allow_hacking": false,
+      "despawn_monsters": true,
+      "radius": 7,
+      "terrain_changes": { "t_door_metal_locked": "t_thconc_floor" },
+      "query": true,
+      "query_msg": "Are you sure you want to open this gate?",
+      "success_msg": "You opened the gate!",
+      "redundant_msg": "The gate is already open."
+    }
+  },
+  {
+    "type": "terrain",
+    "id": "t_card_science_maintenance_yellow",
+    "name": "Maintenance: yellow zone card reader",
+    "description": "This is a smartcard reader.  It sports the stylized symbol of an atom and a wrench on a yellow background.  You could swipe a maintenance employee badge near it to unlock the gates.",
+    "//": "Tier 2 card for a lab.  Medium security access.",
+    "symbol": "6",
+    "color": "yellow",
+    "copy-from": "t_card_science",
+    "looks_like": "t_card_science",
+    "examine_action": {
+      "type": "cardreader",
+      "flags": [ "SCIENCE_CARD_MAINTENANCE_YELLOW" ],
+      "consume_card": false,
+      "allow_hacking": true,
+      "despawn_monsters": false,
+      "radius": 3,
+      "terrain_changes": { "t_door_metal_locked": "t_door_metal_c" },
+      "query": true,
+      "query_msg": "Are you sure you want to open this door?",
+      "success_msg": "You opened the door!",
+      "redundant_msg": "The door is already open."
+    }
+  },
+  {
+    "type": "terrain",
+    "id": "t_card_science_maintenance_blue",
+    "name": "Maintenance: blue zone card reader",
+    "description": "This is a smartcard reader.  It sports the stylized symbol of an atom and a wrench on a blue background.  You could swipe a maintenance employee badge near it to unlock the gates.",
+    "//": "Tier 3 card for a lab.  High security access.",
+    "symbol": "6",
+    "color": "blue",
+    "copy-from": "t_card_science",
+    "looks_like": "t_card_science",
+    "examine_action": {
+      "type": "cardreader",
+      "flags": [ "SCIENCE_CARD_MAINTENANCE_BLUE" ],
+      "consume_card": false,
+      "allow_hacking": true,
+      "despawn_monsters": false,
+      "radius": 3,
+      "terrain_changes": { "t_door_metal_locked": "t_door_metal_c" },
+      "query": true,
+      "query_msg": "Are you sure you want to open this door?",
+      "success_msg": "You opened the door!",
+      "redundant_msg": "The door is already open."
+    }
+  },
+  {
+    "type": "terrain",
+    "id": "t_card_science_transport_1",
+    "name": "Freight hauler access card reader",
+    "description": "This is a smartcard reader.  It sports the stylized symbol of an atom and a truck.  You could swipe a transporter's badge near it to unlock the gates.",
+    "//": "Entrance card for a lab.  Low security access.",
+    "symbol": "6",
+    "color": "cyan",
+    "copy-from": "t_card_science",
+    "looks_like": "t_card_science",
+    "examine_action": {
+      "type": "cardreader",
+      "flags": [ "SCIENCE_CARD_TRANSPORT_1" ],
+      "consume_card": true,
+      "allow_hacking": false,
+      "despawn_monsters": false,
+      "radius": 7,
+      "terrain_changes": { "t_door_metal_locked": "t_thconc_floor" },
+      "query": true,
+      "query_msg": "Are you sure you want to open this gate?",
+      "success_msg": "You opened the gate!",
+      "redundant_msg": "The gate is already open."
+    }
+  },
+  {
+    "type": "terrain",
+    "id": "t_card_science_security_yellow",
+    "name": "Security: yellow zone card reader",
+    "description": "This is a smartcard reader.  It sports the stylized symbol of an atom and a taser on a yellow background.  You could swipe a security employee badge near it to unlock the gates.",
+    "//": "Tier 1 card for a lab.  Medium security access.",
+    "symbol": "6",
+    "color": "yellow",
+    "copy-from": "t_card_science",
+    "looks_like": "t_card_science",
+    "examine_action": {
+      "type": "cardreader",
+      "flags": [ "SCIENCE_CARD_SECURITY_YELLOW" ],
+      "consume_card": false,
+      "allow_hacking": true,
+      "despawn_monsters": true,
+      "radius": 2,
+      "terrain_changes": { "t_door_metal_locked": "t_door_metal_c" },
+      "query": true,
+      "query_msg": "Are you sure you want to open this door?",
+      "success_msg": "You opened the door!",
+      "redundant_msg": "The door is already open."
+    }
+  },
+  {
+    "type": "terrain",
+    "id": "t_card_science_security_magenta",
+    "name": "Security: magenta zone card reader",
+    "description": "This is a smartcard reader.  It sports the stylized symbol of an atom and a pistol on a magenta background.  You could swipe a security employee badge near it to unlock the gates.",
+    "//": "Tier 2 card for a lab.  Medium security access.",
+    "symbol": "6",
+    "color": "magenta",
+    "copy-from": "t_card_science",
+    "looks_like": "t_card_science",
+    "examine_action": {
+      "type": "cardreader",
+      "flags": [ "SCIENCE_CARD_SECURITY_MAGENTA" ],
+      "consume_card": false,
+      "allow_hacking": true,
+      "despawn_monsters": true,
+      "radius": 4,
+      "terrain_changes": { "t_door_metal_locked": "t_door_metal_c" },
+      "query": true,
+      "query_msg": "Are you sure you want to open this door?",
+      "success_msg": "You opened the door!",
+      "redundant_msg": "The door is already open."
+    }
+  },
+  {
+    "type": "terrain",
+    "id": "t_card_science_security_black",
+    "name": "Security: black zone card reader",
+    "description": "This is a smartcard reader.  It sports the stylized symbol of an atom and a rifle on a black background.  You could swipe a security employee badge near it to unlock the gates.",
+    "//": "Tier 3 card for a lab.  High security access.",
+    "symbol": "6",
+    "color": "black",
+    "copy-from": "t_card_science",
+    "looks_like": "t_card_science",
+    "examine_action": {
+      "type": "cardreader",
+      "flags": [ "SCIENCE_CARD_SECURITY_BLACK" ],
+      "consume_card": false,
+      "allow_hacking": true,
+      "despawn_monsters": true,
+      "radius": 3,
+      "terrain_changes": { "t_door_metal_locked": "t_door_metal_c" },
+      "query": true,
+      "query_msg": "Are you sure you want to open this door?",
+      "success_msg": "You opened the door!",
+      "redundant_msg": "The door is already open."
+    }
+  },
+  {
+    "type": "terrain",
+    "id": "t_card_science_mutagen_green",
+    "name": "Researcher: green zone card reader",
+    "description": "This is a smartcard reader.  It sports the stylized symbol of an atom and a flask on a green background.  You could swipe a researcher scientist badge near it to unlock the gates.",
+    "//": "Entrance card for a lab research areas.",
+    "symbol": "6",
+    "color": "green",
+    "copy-from": "t_card_science",
+    "looks_like": "t_card_science",
+    "examine_action": {
+      "type": "cardreader",
+      "flags": [ "SCIENCE_CARD_MUTAGEN_GREEN" ],
+      "consume_card": false,
+      "allow_hacking": true,
+      "despawn_monsters": true,
+      "radius": 3,
+      "terrain_changes": { "t_door_metal_locked": "t_door_metal_c" },
+      "query": true,
+      "query_msg": "Are you sure you want to open this door?",
+      "success_msg": "You opened the door!",
+      "redundant_msg": "The door is already open."
+    }
+  },
+  {
+    "type": "terrain",
+    "id": "t_card_science_mutagen_pink",
+    "name": "Researcher: pink zone card reader",
+    "description": "This is a smartcard reader.  It sports the stylized symbol of an atom and a flask on a pink background.  You could swipe a researcher scientist badge near it to unlock the gates.",
+    "//": "Entrance card for a lab research areas.",
+    "symbol": "6",
+    "color": "light_red",
+    "copy-from": "t_card_science",
+    "looks_like": "t_card_science",
+    "examine_action": {
+      "type": "cardreader",
+      "flags": [ "SCIENCE_CARD_MUTAGEN_PINK" ],
+      "consume_card": false,
+      "allow_hacking": true,
+      "despawn_monsters": true,
+      "radius": 3,
+      "terrain_changes": { "t_door_metal_locked": "t_door_metal_c" },
+      "query": true,
+      "query_msg": "Are you sure you want to open this door?",
+      "success_msg": "You opened the door!",
+      "redundant_msg": "The door is already open."
+    }
+  },
+  {
+    "type": "terrain",
+    "id": "t_card_science_mutagen_cyan",
+    "name": "Researcher: cyan zone card reader",
+    "description": "This is a smartcard reader.  It sports the stylized symbol of an atom and a flask on a cyan background.  You could swipe a researcher scientist badge near it to unlock the gates.",
+    "//": "Entrance card for a lab research areas.",
+    "symbol": "6",
+    "color": "cyan",
+    "copy-from": "t_card_science",
+    "looks_like": "t_card_science",
+    "examine_action": {
+      "type": "cardreader",
+      "flags": [ "SCIENCE_CARD_MUTAGEN_CYAN" ],
+      "consume_card": false,
+      "allow_hacking": true,
+      "despawn_monsters": true,
+      "radius": 3,
+      "terrain_changes": { "t_door_metal_locked": "t_door_metal_c" },
+      "query": true,
+      "query_msg": "Are you sure you want to open this door?",
+      "success_msg": "You opened the door!",
+      "redundant_msg": "The door is already open."
+    }
+  },
+  {
+    "type": "terrain",
+    "id": "t_card_science_medical_red",
+    "name": "Medical: Red zone card reader",
+    "description": "This is a smartcard reader.  It sports the stylized symbol of an atom and a syringe on a red background.  You could swipe a researcher scientist badge near it to unlock the gates.",
+    "//": "Entrance card for a lab medical areas.",
+    "symbol": "6",
+    "color": "cyan",
+    "copy-from": "t_card_science",
+    "looks_like": "t_card_science",
+    "examine_action": {
+      "type": "cardreader",
+      "flags": [ "SCIENCE_CARD_MEDICAL_RED" ],
+      "consume_card": false,
+      "allow_hacking": true,
+      "despawn_monsters": true,
+      "radius": 3,
+      "terrain_changes": { "t_door_metal_locked": "t_door_metal_c" },
+      "query": true,
+      "query_msg": "Are you sure you want to open this door?",
+      "success_msg": "You opened the door!",
+      "redundant_msg": "The door is already open."
+    }
+  },
   {
     "type": "terrain",
     "id": "t_card_reader_broken",
diff --git a/data/json/itemgroups/Labs/labs_common.json b/data/json/itemgroups/Labs/labs_common.json
index 99165c90b48b9..b53f3a114edb4 100644
--- a/data/json/itemgroups/Labs/labs_common.json
+++ b/data/json/itemgroups/Labs/labs_common.json
@@ -27,15 +27,27 @@
       },
       { "item": "mobile_memory_card", "prob": 50, "count": [ 2, 6 ] },
       { "item": "mobile_memory_card_encrypted", "prob": 5, "count": [ 1, 3 ] },
-      { "item": "id_science", "prob": 5, "count": [ 1, 3 ] },
-      { "item": "badge_doctor", "prob": 5, "count": [ 1, 3 ] },
+      { "item": "badge_doctor", "prob": 5, "count": [ 1, 2 ] },
       { "item": "wrapped_rad_badge", "prob": 7, "count": [ 1, 3 ] },
       { "item": "plastic_chunk", "prob": 30, "count": [ 1, 3 ] },
       { "item": "vac_sealer", "prob": 20 },
+      { "item": "id_science", "prob": 5, "count": [ 1, 3 ] },
+      { "item": "id_science_visitor_1", "prob": 10 },
+      { "item": "id_science_transport_1", "prob": 10 },
+      { "item": "id_science_maintenance_green", "prob": 10 },
+      { "item": "id_science_maintenance_yellow", "prob": 5 },
+      { "item": "id_science_maintenance_blue", "prob": 1 },
+      { "item": "id_science_security_yellow", "prob": 3 },
+      { "item": "id_science_security_magenta", "prob": 2 },
+      { "item": "id_science_security_black", "prob": 1 },
+      { "item": "id_science_mutagen_green", "prob": 3 },
+      { "item": "id_science_mutagen_pink", "prob": 2 },
+      { "item": "id_science_mutagen_cyan", "prob": 1 },
+      { "item": "id_science_medical_red", "prob": 7 },
       { "item": "id_military", "prob": 1 },
       { "item": "lanyard", "prob": 100, "count": [ 1, 6 ] },
       { "item": "canister_empty", "prob": 30, "count": [ 1, 6 ] },
-      { "item": "string_36", "prob": 60, "count": [ 1, 3 ] }
+      { "item": "string_36", "prob": 60, "count": [ 2, 8 ] }
     ]
   }
 ]
diff --git a/data/json/itemgroups/electronics.json b/data/json/itemgroups/electronics.json
index 8a3902bbd3fd5..067c020862bc0 100644
--- a/data/json/itemgroups/electronics.json
+++ b/data/json/itemgroups/electronics.json
@@ -145,5 +145,27 @@
       { "item": "AID_bio_ups" },
       { "item": "AID_bio_weight" }
     ]
+  },
+  {
+    "id": "batteries",
+    "type": "item_group",
+    "subtype": "collection",
+    "items": [
+      { "item": "light_minus_battery_cell", "prob": 30, "count": [ 2, 6 ] },
+      { "item": "light_minus_atomic_battery_cell", "prob": 5, "count": [ 1, 3 ] },
+      { "item": "light_minus_disposable_cell", "prob": 40, "count": [ 1, 3 ] },
+      { "item": "light_battery_cell", "prob": 30, "count": [ 1, 3 ] },
+      { "item": "light_plus_battery_cell", "prob": 15, "count": [ 1, 3 ] },
+      { "item": "light_atomic_battery_cell", "prob": 3, "count": [ 1, 3 ] },
+      { "item": "light_disposable_cell", "prob": 40, "count": [ 1, 3 ] },
+      { "item": "medium_battery_cell", "prob": 10, "count": [ 1, 3 ] },
+      { "item": "medium_plus_battery_cell", "prob": 5, "count": [ 1, 6 ] },
+      { "item": "medium_atomic_battery_cell", "prob": 3, "count": [ 1, 6 ] },
+      { "item": "medium_disposable_cell", "prob": 15, "count": [ 1, 3 ] },
+      { "item": "heavy_battery_cell", "prob": 10, "count": [ 1, 3 ] },
+      { "item": "heavy_plus_battery_cell", "prob": 5, "count": [ 1, 6 ] },
+      { "item": "heavy_atomic_battery_cell", "prob": 3, "count": [ 1, 6 ] },
+      { "item": "heavy_disposable_cell", "prob": 15, "count": [ 1, 3 ] }
+    ]
   }
 ]
diff --git a/data/json/items/generic.json b/data/json/items/generic.json
index 77d6d9076bcdb..668299f4948dd 100644
--- a/data/json/items/generic.json
+++ b/data/json/items/generic.json
@@ -2783,52 +2783,6 @@
     "volume": "5 ml",
     "to_hit": -3
   },
-  {
-    "type": "GENERIC",
-    "id": "id_science",
-    "symbol": ",",
-    "color": "blue",
-    "name": { "str": "science ID card" },
-    "description": "This ID card once belonged to a scientist.  The reverse side describes protocol for using it; this could grant access at one control panel, if you can find one.",
-    "price": 60000,
-    "flags": [ "SCIENCE_CARD" ],
-    "price_postapoc": 250,
-    "material": [ "plastic" ],
-    "weight": "6 g",
-    "volume": "15 ml",
-    "to_hit": -3
-  },
-  {
-    "type": "GENERIC",
-    "id": "id_military",
-    "symbol": ",",
-    "color": "green",
-    "name": { "str": "military ID card" },
-    "description": "This ID card once belonged to a military officer.  The reverse side describes protocol for using it; this could grant access at one control panel, if you can find one.",
-    "price": 120000,
-    "flags": [ "MILITARY_CARD" ],
-    "price_postapoc": 500,
-    "material": [ "plastic" ],
-    "weight": "6 g",
-    "volume": "5 ml",
-    "to_hit": -3
-  },
-  {
-    "type": "GENERIC",
-    "id": "id_industrial",
-    "looks_like": "id_science",
-    "symbol": ",",
-    "color": "green",
-    "name": { "str": "industrial ID card" },
-    "description": "This ID card once belonged to a high level technician.  The reverse side describes protocol for using it; this could grant access at one control panel, if you can find one.",
-    "price": 120000,
-    "flags": [ "INDUSTRIAL_CARD" ],
-    "price_postapoc": 100,
-    "material": [ "plastic" ],
-    "weight": "6 g",
-    "volume": "5 ml",
-    "to_hit": -3
-  },
   {
     "type": "GENERIC",
     "id": "neoprene",
@@ -3457,7 +3411,19 @@
           "money_one",
           "money_ten",
           "money_twenty",
-          "condom"
+          "condom",
+          "id_science_visitor_1",
+          "id_science_transport_1",
+          "id_science_maintenance_green",
+          "id_science_maintenance_yellow",
+          "id_science_maintenance_blue",
+          "id_science_security_yellow",
+          "id_science_security_magenta",
+          "id_science_security_black",
+          "id_science_mutagen_green",
+          "id_science_mutagen_pink",
+          "id_science_mutagen_cyan",
+          "id_science_medical_red"
         ]
       }
     ],
diff --git a/data/json/items/id_cards.json b/data/json/items/id_cards.json
new file mode 100644
index 0000000000000..bd63f30f8e165
--- /dev/null
+++ b/data/json/items/id_cards.json
@@ -0,0 +1,162 @@
+[
+  {
+    "type": "GENERIC",
+    "id": "id_science",
+    "symbol": ",",
+    "color": "blue",
+    "name": { "str": "science ID card" },
+    "description": "This ID card once belonged to a scientist.  The reverse side describes protocol for using it; this could grant access at one control panel, if you can find one.",
+    "price": 60000,
+    "flags": [ "SCIENCE_CARD" ],
+    "price_postapoc": 250,
+    "material": [ "plastic" ],
+    "weight": "6 g",
+    "volume": "15 ml",
+    "to_hit": -3
+  },
+  {
+    "type": "GENERIC",
+    "id": "id_military",
+    "symbol": ",",
+    "color": "green",
+    "name": { "str": "military ID card" },
+    "description": "This ID card once belonged to a military officer.  The reverse side describes protocol for using it; this could grant access at one control panel, if you can find one.",
+    "price": 120000,
+    "flags": [ "MILITARY_CARD" ],
+    "price_postapoc": 500,
+    "material": [ "plastic" ],
+    "weight": "6 g",
+    "volume": "5 ml",
+    "to_hit": -3
+  },
+  {
+    "type": "GENERIC",
+    "id": "id_industrial",
+    "looks_like": "id_science",
+    "symbol": ",",
+    "color": "green",
+    "name": { "str": "industrial ID card" },
+    "description": "This ID card once belonged to a high level technician.  The reverse side describes protocol for using it; this could grant access at one control panel, if you can find one.",
+    "price": 120000,
+    "flags": [ "INDUSTRIAL_CARD" ],
+    "price_postapoc": 100,
+    "material": [ "plastic" ],
+    "weight": "6 g",
+    "volume": "5 ml",
+    "to_hit": -3
+  },
+  {
+    "type": "GENERIC",
+    "id": "id_science_visitor_1",
+    "symbol": ",",
+    "color": "blue",
+    "name": { "str": "visitor's pass" },
+    "description": "This is a visitor's pass.  The reverse side describes protocol for using it; this could grant one-time access to a card reader, if you can find one.",
+    "price": 60000,
+    "flags": [ "SCIENCE_CARD_VISITOR" ],
+    "price_postapoc": 250,
+    "material": [ "plastic" ],
+    "weight": "6 g",
+    "volume": "15 ml",
+    "to_hit": -3
+  },
+  {
+    "type": "GENERIC",
+    "id": "id_science_maintenance_green",
+    "symbol": ",",
+    "copy-from": "id_science",
+    "name": { "str": "Maintenance: green zone badge" },
+    "description": "This is an employee badge for a maintence worker.  The reverse side describes protocol for using it; this could grant access to green zone card readers.",
+    "flags": [ "SCIENCE_CARD_MAINTENANCE_GREEN" ]
+  },
+  {
+    "type": "GENERIC",
+    "id": "id_science_maintenance_yellow",
+    "symbol": ",",
+    "copy-from": "id_science",
+    "name": { "str": "Maintenance: yellow zone badge" },
+    "description": "This is an employee badge for a maintence worker.  The reverse side describes protocol for using it; this could grant access to yellow zone card readers.",
+    "flags": [ "SCIENCE_CARD_MAINTENANCE_YELLOW" ]
+  },
+  {
+    "type": "GENERIC",
+    "id": "id_science_maintenance_blue",
+    "symbol": ",",
+    "copy-from": "id_science",
+    "name": { "str": "Maintenance: blue zone badge" },
+    "description": "This is an employee badge for a maintence worker.  The reverse side describes protocol for using it; this could grant access to blue zone card readers.",
+    "flags": [ "SCIENCE_CARD_MAINTENANCE_BLUE" ]
+  },
+  {
+    "type": "GENERIC",
+    "id": "id_science_transport_1",
+    "symbol": ",",
+    "copy-from": "id_science",
+    "name": { "str": "transport freight employee badge" },
+    "description": "This is an employee badge for a freight hauler.  The reverse side describes protocol for using it; this could grant one-time access to a transport freight card reader.",
+    "flags": [ "SCIENCE_CARD_TRANSPORT_1" ]
+  },
+  {
+    "type": "GENERIC",
+    "id": "id_science_security_yellow",
+    "symbol": ",",
+    "copy-from": "id_science",
+    "name": { "str": "Security: yellow zone badge" },
+    "description": "This is an employee badge for a security professional.  The reverse side describes protocol for using it; this could grant access to yellow zone card readers.",
+    "flags": [ "SCIENCE_CARD_SECURITY_YELLOW" ]
+  },
+  {
+    "type": "GENERIC",
+    "id": "id_science_security_magenta",
+    "symbol": ",",
+    "copy-from": "id_science",
+    "name": { "str": "Security: magenta zone badge" },
+    "description": "This is an employee badge for a security professional.  The reverse side describes protocol for using it; this could grant access to magenta zone card readers.",
+    "flags": [ "SCIENCE_CARD_SECURITY_MAGENTA" ]
+  },
+  {
+    "type": "GENERIC",
+    "id": "id_science_security_black",
+    "symbol": ",",
+    "copy-from": "id_science",
+    "name": { "str": "Security: black zone badge" },
+    "description": "This is an employee badge for a security professional.  The reverse side describes protocol for using it; this could grant access to black zone card readers.",
+    "flags": [ "SCIENCE_CARD_SECURITY_BLACK" ]
+  },
+  {
+    "type": "GENERIC",
+    "id": "id_science_mutagen_green",
+    "symbol": ",",
+    "copy-from": "id_science",
+    "name": { "str": "Researcher: green zone badge" },
+    "description": "This is an employee badge for a research scientist.  The reverse side describes protocol for using it; this could grant access to green zone card readers.",
+    "flags": [ "SCIENCE_CARD_MUTAGEN_GREEN" ]
+  },
+  {
+    "type": "GENERIC",
+    "id": "id_science_mutagen_pink",
+    "symbol": ",",
+    "copy-from": "id_science",
+    "name": { "str": "Researcher: pink zone badge" },
+    "description": "This is an employee badge for a research scientist.  The reverse side describes protocol for using it; this could grant access to pink zone card readers.",
+    "flags": [ "SCIENCE_CARD_MUTAGEN_PINK" ]
+  },
+  {
+    "type": "GENERIC",
+    "id": "id_science_mutagen_cyan",
+    "symbol": ",",
+    "copy-from": "id_science",
+    "name": { "str": "Researcher: cyan zone badge" },
+    "description": "This is an employee badge for a research scientist.  The reverse side describes protocol for using it; this could grant access to cyan zone card readers.",
+    "flags": [ "SCIENCE_CARD_MUTAGEN_CYAN" ]
+  },
+  {
+    "type": "GENERIC",
+    "id": "id_science_medical_red",
+    "symbol": ",",
+    "copy-from": "id_science",
+    "name": { "str": "Doctor: red zone badge" },
+    "description": "This is an employee badge for a medical doctor.  The reverse side describes protocol for using it; this could grant access to red zone card readers.",
+    "flags": [ "SCIENCE_CARD_MEDICAL_RED" ]
+  }
+]
diff --git a/data/json/mapgen/lab/lab_modular/lab_1x1_security.json b/data/json/mapgen/lab/lab_modular/lab_1x1_security.json
new file mode 100644
index 0000000000000..0da9e29815e62
--- /dev/null
+++ b/data/json/mapgen/lab/lab_modular/lab_1x1_security.json
@@ -0,0 +1,463 @@
+[
+  {
+    "method": "json",
+    "om_terrain": [ "lab_security_z0N" ],
+    "type": "mapgen",
+    "weight": 200,
+    "object": {
+      "fill_ter": "t_linoleum_white",
+      "rows": [
+        "__||||||||||||||||||||||",
+        "__||||||||||||||||||||||",
+        "__|;;;;;;;;;;;;;;;;;;;;|",
+        "__|;;;è;;;;;;è;;;;;;è;;|",
+        "__|;;;;;;;;;;;;;;;;;;;;|",
+        "__|££££££££££££££££££££|",
+        "__=;;;;;;;;;;;;;;;;;;;;=",
+        "__=;;;;;;;;;;;;;;;;;;;;=",
+        "__=;;;;;;;;;;;;;;;;;;;;=",
+        "__=;;;;;;;;;;;;;;;;;;;;=",
+        "__=;;;;;;;;;;;;;;;;;;;;=",
+        "__=;;;;;;;;;;;;;;;;;;;;=",
+        "__=;;;;;;;;;;;;;;;;;;;;=",
+        "__6££££££££££££££££££££¥",
+        "__|;;;;;;;;;;;;;;;;;;;;|",
+        "__|;;;è;;;;;;è;;;;;;è;;|",
+        "__|;;;;;;;;;;;;;;;;;;;;|",
+        "__||||||||||+|||||ɤJJJ||",
+        "__|......|H....H|;;;h;;|",
+        "``|......|H..s.H|;;;;;;|",
+        "``|......|..ë||||;;è;;;|",
+        "``|......|...+.S|;;;;;;|",
+        "``|......|+|||..|;;;;;;|",
+        "|||......|.@@|Yt|;;;;;;|"
+      ],
+      "palettes": [ "lab_common_palette", "lab_security_palette" ],
+      "terrain": {
+        "J": "t_thconc_floor",
+        "ɤ": "t_thconc_floor",
+        "h": "t_thconc_floor",
+        "`": "t_sidewalk",
+        "¥": "t_card_science_maintenance_green",
+        "6": "t_card_science_transport_1"
+      },
+      "place_monsters": [
+        { "monster": "GROUP_LAB_MAINTENANCE", "x": [ 5, 20 ], "y": [ 5, 14 ], "density": 0.2 },
+        { "monster": "GROUP_LAB_BASIC_SECURITY", "x": [ 5, 12 ], "y": 20, "density": 0.1 },
+        { "monster": "GROUP_LAB_MAINTENANCE", "x": 20, "y": 20, "density": 0.1 }
+      ],
+      "place_nested": [ { "chunks": [ [ "lab_security_6x6_open", 50 ], [ "lab_generic_6x6_open", 50 ] ], "x": 3, "y": 18 } ],
+      "place_vehicles": [ { "vehicle": "semi_truck", "x": 16, "y": 10, "chance": 20, "rotation": 180 } ]
+    }
+  },
+  {
+    "method": "json",
+    "om_terrain": [ "lab_security_z0" ],
+    "type": "mapgen",
+    "//": "TODO: trap the security hallway, fill out security area",
+    "weight": 200,
+    "object": {
+      "fill_ter": "t_linoleum_white",
+      "rows": [
+        "|||+||+||||||||||||==|||",
+        "|34.|P.P..+..h.|;;;;;;;;",
+        "X...|....h|III6:;;;;;;è;",
+        "XH..:J..II|::::|;;||||||",
+        "XH..:Jh...=;;;;;;;=;|PPT",
+        "-...:J..II|;è;;;;ɜ|;:.h.",
+        "XH..|Y..h.|;;;|||||;:.rr",
+        "XH..||:||||;;;|;;;|è|h.h",
+        "XH..=..ɛ|.|;;;|;è;+;||+|",
+        "|y..¥...|.|;è;|;;;|;;;;;",
+        "|||||..||||;;;|||||||;;;",
+        "|>..|..122|;;;+;Z|>;ƶ;;i",
+        "|...-..-22|;;;|WW|>;=;èi",
+        "|||||..||||;;;|||||||;;;",
+        "|y..¥...|.|;è;|;;;|;;;;;",
+        "XH..=..ɛ|.|;;;|;è;+;||+|",
+        "XH..||:||||;;;|;;;|è|h.h",
+        "XH..|Y...h|;;;|||||;:.rr",
+        "-...:J..II|;è;;;;ɜ|;:.h.",
+        "XH..:Jh...=;;;;;;;=;|yPP;",
+        "XH..:J..II|::::|;;||||||",
+        "X...|...h.|III6:;;;;;;è;",
+        "|34.|P.P..+..h.|;;;;;;;;",
+        "|||+||+||||||||||||==|||"
+      ],
+      "palettes": [ "lab_common_palette", "lab_security_palette" ],
+      "terrain": {
+        "ɜ": "t_thconc_floor",
+        "¥": "t_card_science_visitor",
+        "ƶ": "t_card_science_security_yellow",
+        "i": "t_thconc_floor"
+      },
+      "place_monsters": [ { "monster": "GROUP_LAB_BASIC_SECURITY", "x": [ 19, 23 ], "y": [ 5, 18 ], "density": 0.2 } ],
+      "place_nested": [
+        { "chunks": [ [ "lab_security_3x3_EW", 50 ], [ "lab_generic_3x3_EW_open", 50 ] ], "x": 15, "y": 7 },
+        { "chunks": [ [ "lab_security_3x3_EW", 50 ], [ "lab_generic_3x3_EW_open", 50 ] ], "x": 15, "y": 14 }
+      ],
+      "place_monster": [
+        { "monster": "mon_skitterbot", "x": 9, "y": 8, "chance": 100 },
+        { "monster": "mon_skitterbot", "x": 9, "y": 9, "chance": 100 },
+        { "monster": "mon_secubot", "x": 9, "y": 14, "chance": 100 },
+        { "monster": "mon_secubot", "x": 9, "y": 15, "chance": 100 }
+      ],
+      "computers": {
+        "6": {
+          "name": "Security Public Relations Zone",
+          "security": 3,
+          "options": [ { "name": "UNLOCK ENTRANCE", "action": "unlock_disarm", "security": 6 } ],
+          "failures": [ { "action": "damage" }, { "action": "shutdown" }, { "action": "manhacks" } ]
+        }
+      }
+    }
+  },
+  {
+    "method": "json",
+    "om_terrain": [ "lab_security_z0S" ],
+    "type": "mapgen",
+    "weight": 200,
+    "object": {
+      "fill_ter": "t_linoleum_white",
+      "rows": [
+        "|||......|tY|@@.|;;;;;;|",
+        "``|......|..|||+|;;;;;;|",
+        "``|......|S.+...|;;;;;;|",
+        "``|......||||ë..|;;;è;;|",
+        "``|......|H.s..H|;;;;;;|",
+        "__|......|H....H|;;;h;;|",
+        "__|||||||||||+||||ɤJJJ||",
+        "__|;;;;;;;;;;;;;;;;;;;;|",
+        "__|;;;è;;;;;;è;;;;;;è;;|",
+        "__|;;;;;;;;;;;;;;;;;;;;|",
+        "__6££££££££££££££££££££¥",
+        "__=;;;;;;;;;;;;;;;;;;;;=",
+        "__=;;;;;;;;;;;;;;;;;;;;=",
+        "__=;;;;;;;;;;;;;;;;;;;;=",
+        "__=;;;;;;;;;;;;;;;;;;;;=",
+        "__=;;;;;;;;;;;;;;;;;;;;=",
+        "__=;;;;;;;;;;;;;;;;;;;;=",
+        "__=;;;;;;;;;;;;;;;;;;;;=",
+        "__|££££££££££££££££££££|",
+        "__|;;;;;;;;;;;;;;;;;;;;|",
+        "__|;;;è;;;;;;è;;;;;;è;;|",
+        "__|;;;;;;;;;;;;;;;;;;;;|",
+        "__||||||||||||||||||||||",
+        "__||||||||||||||||||||||"
+      ],
+      "palettes": [ "lab_common_palette", "lab_security_palette" ],
+      "terrain": {
+        "J": "t_thconc_floor",
+        "ɤ": "t_thconc_floor",
+        "h": "t_thconc_floor",
+        "`": "t_sidewalk",
+        "¥": "t_card_science_maintenance_green",
+        "6": "t_card_science_transport_1"
+      },
+      "place_nested": [ { "chunks": [ [ "lab_security_6x6_open", 50 ], [ "lab_generic_6x6_open", 50 ] ], "x": 3, "y": 0 } ],
+      "place_vehicles": [ { "vehicle": "semi_truck", "x": 16, "y": 16, "chance": 20, "rotation": 180 } ],
+      "place_monster": [
+        { "monster": "mon_skitterbot", "x": 12, "y": 3, "chance": 100 },
+        { "monster": "mon_skitterbot", "x": 12, "y": 4, "chance": 100 },
+        { "monster": "mon_secubot", "x": 12, "y": 5, "chance": 100 },
+        { "monster": "mon_secubot", "x": 12, "y": 6, "chance": 100 }
+      ]
+    }
+  },
+  {
+    "method": "json",
+    "om_terrain": "lab_security_z-1",
+    "type": "mapgen",
+    "weight": 200,
+    "object": {
+      "fill_ter": "t_linoleum_gray",
+      "rows": [
+        "||||||||||||||||||||||||",
+        "|,,,,,,|;;;;;;;>;;;;;;;|",
+        "|,,,,,,|;;;;;;;;;;;;;;;|",
+        "|,,,ê,,|;;;è;;;;;;;è;;;|",
+        "|,,,,,,|;;;;;;;;;;;;;;;|",
+        "|,,,,,,|;;;;;;;;;;;;;;;|",
+        "|,,,,,,|;;;;;;;;;;;;;;;|",
+        "||||-X||||||||ƶ=||||||||",
+        "|,|,,,,,,¥,iii,,,,Y|;;;|",
+        "|,|,,,,,,=,,,,,ê,,,+;;;|",
+        "|||||,,||||JJJJ,h|||;;;|",
+        "|<,,|,,122|P,hJ,,+<|||||",
+        "|>,,-,,-22|P,,J,,+<|||||",
+        "|||||,,||||J,JJ,h|||;;;|",
+        "|,|,,,,,,=,,,,,ê,,,+;;;|",
+        "|,|,,,,,,¥,iii,,,,Y|;;;|",
+        "||||-X||||||||ƶ=||||||||",
+        "|,,,,,,|;;;;;;;;;;;;;;;|",
+        "|,,,,,,|;;;;;;;;;;;;;;;|",
+        "|,,,,,,|;;;è;;;;;;;è;;;|",
+        "|,,,ê,,|;;;;;;;;;;;;;;;|",
+        "|,,,,,,|;;;;;;;;;;;;;;;|",
+        "|,,,,,,|;;;;;;;>;;;;;;;|",
+        "||||||||||||||||||||||||"
+      ],
+      "palettes": [ "lab_common_palette", "lab_security_palette" ],
+      "terrain": { "¥": "t_card_science_security_yellow", "ƶ": "t_card_science_security_magenta" },
+      "place_signs": [
+        { "snippet": "lab_security_signage", "x": [ 10, 13 ], "y": 7 },
+        { "snippet": "lab_security_signage", "x": [ 17, 18 ], "y": 7 },
+        { "snippet": "lab_security_signage", "x": [ 10, 13 ], "y": 16 },
+        { "snippet": "lab_security_signage", "x": [ 17, 18 ], "y": 16 }
+      ],
+      "place_nested": [
+        { "chunks": [ [ "lab_security_3x3_EW", 50 ], [ "lab_generic_3x3_EW_open", 50 ] ], "x": 20, "y": 8 },
+        { "chunks": [ [ "lab_security_3x3_EW", 50 ], [ "lab_generic_3x3_EW_open", 50 ] ], "x": 20, "y": 13 },
+        { "chunks": [ [ "lab_security_prison_6x6_E", 100 ] ], "x": 8, "y": 1 },
+        { "chunks": [ [ "lab_security_prison_6x6_W", 100 ] ], "x": 17, "y": 1 },
+        { "chunks": [ [ "lab_security_prison_6x6_E", 100 ] ], "x": 8, "y": 17 },
+        { "chunks": [ [ "lab_security_prison_6x6_W", 100 ] ], "x": 17, "y": 17 },
+        { "chunks": [ [ "lab_security_6x6_open", 50 ], [ "lab_generic_6x6_open", 50 ] ], "x": 1, "y": 1 },
+        { "chunks": [ [ "lab_security_6x6_open", 100 ] ], "x": 1, "y": 17 }
+      ]
+    }
+  },
+  {
+    "method": "json",
+    "om_terrain": "lab_security_z-2",
+    "type": "mapgen",
+    "weight": 200,
+    "object": {
+      "fill_ter": "t_thconc_floor",
+      "rows": [
+        "|,,,,,,,,,ƶ,,,,,|⁴⁴⁴⁴⁴⁴⁴",
+        "|,,,,,,,,,=,,,,<|⁴⁴⁴⁴⁴⁴⁴",
+        "|,,,,,,,,,|,,,,,|⁴⁴⁴%%%%",
+        "|,,,,,,,,,|,,|#||⁴⁴%%~~~",
+        "|,,,,,,,,,|,,|>|⁴⁴%%~~~~",
+        "|,,,,ê,,,,|ƶ=|||⁴%%~~~~~",
+        "|,,,,,,,,,|⁴⁴⁴⁴⁴%%~~~~~~",
+        "|,,,,,,,,,|⁴⁴⁴⁴%%~~~~~~~",
+        "|,,,,,,,,,|⁴⁴⁴%%~~~~~~~~",
+        "|,,,,,,,,,|⁴⁴⁴%~~~~~~~~~",
+        "|||||,,||||⁴⁴⁴%~~~~~~~~~",
+        "|>..|,,122|⁴⁴⁴%~~~~~~~~~",
+        "|<..-,,-22|⁴⁴⁴%~~~~~~~~~",
+        "|||||,,||||⁴⁴⁴%~~~~~~~~~",
+        "|,,,,,,,,,|⁴⁴⁴%~~~~~~~~~",
+        "|,,,,,,,,,|⁴⁴⁴%%~~~~~~~~",
+        "|,,,,,,,,,|⁴⁴⁴⁴%%~~~~~~~",
+        "|,,,,,,,,,|⁴⁴⁴⁴⁴%%~~~~~~",
+        "|,,,,ê,,,,|ƶ=|||⁴%%~~~~~",
+        "|,,,,,,,,,|,,|>|⁴⁴%%~~~~",
+        "|,,,,,,,,,|,,|#||⁴⁴%%~~~",
+        "|,,,,,,,,,|,,,,,|⁴⁴⁴%%%%",
+        "|,,,,,,,,,=,,,,<|⁴⁴⁴⁴⁴⁴⁴",
+        "|,,,,,,,,,ƶ,,,,,|⁴⁴⁴⁴⁴⁴⁴"
+      ],
+      "palettes": [ "lab_common_palette", "lab_security_palette" ],
+      "terrain": { "ƶ": "t_card_science_security_magenta" },
+      "place_nested": [
+        { "chunks": [ [ "lab_security_10x10_S", 100 ], [ "null", 0 ] ], "x": 1, "y": 0 },
+        { "chunks": [ [ "lab_security_10x10_N", 100 ], [ "null", 0 ] ], "x": 1, "y": 14 }
+      ]
+    }
+  },
+  {
+    "method": "json",
+    "om_terrain": "lab_security_z-3",
+    "type": "mapgen",
+    "weight": 200,
+    "object": {
+      "fill_ter": "t_thconc_floor",
+      "rows": [
+        "|,,,,,,,|;|;;;;;;;;;;|;|",
+        "|,,,,,,,|;|;;;;;;;;;;|;|",
+        "|,,,,,,,|;|;;|ƶ=||¥=||||",
+        "|,,,ê,,,|;|;;|```|;;;;££",
+        "|,,,,,,,||¥==|<>`|;;;££;",
+        "|,,,,,,,|3,.,|```|;;££;;",
+        "|,,,,,,,],.,.|||||;££;;;",
+        "||||-|]]|.,.,|;;;;££;;;;",
+        "|;;|.,.,.,.,.|;;;££;;;;;",
+        "|;;+,.,.,.,.,X;;££;;;;;;",
+        "|||||,.||||,.X;;££££££££",
+        "|<,.|.,122|.,-;;££``````",
+        "|,.,),.)22|,.-;;££``````",
+        "|||||.,||||.,X;;££££££££",
+        "|;;+.,.,.,.,.X;;££;;;;;;",
+        "|;;|,.,.,.,.,|;;;££;;;;;",
+        "||||-|]]|,.,.|;;;;££;;;;",
+        "|,,,,,,,].,.,|||||;££;;;",
+        "|,,,,,,,|4.,.|```|;;££;;",
+        "|,,,,,,,||¥==|<>`|;;;££;",
+        "|,,,ê,,,|;|;;|```|;;;;££",
+        "|,,,,,,,|;|;;|ƶ=||¥=||||",
+        "|,,,,,,,|;|;;;;;;;;;;|;|",
+        "|,,,,,,,|;|;;;;;;;;;;|;|"
+      ],
+      "palettes": [ "lab_common_palette", "lab_security_palette" ],
+      "terrain": { "¥": "t_card_science_security_yellow", "ƶ": "t_card_science_security_magenta" },
+      "place_monster": [
+        { "monster": "mon_flashbang_hack", "x": 22, "y": 0, "chance": 100 },
+        { "monster": "mon_gasbomb_hack", "x": 22, "y": 1, "chance": 100 },
+        { "monster": "mon_flashbang_hack", "x": 22, "y": 22, "chance": 100 },
+        { "monster": "mon_gasbomb_hack", "x": 22, "y": 23, "chance": 100 },
+        { "monster": "mon_flashbang_hack", "x": 9, "y": 0, "chance": 100 },
+        { "monster": "mon_gasbomb_hack", "x": 9, "y": 1, "chance": 100 },
+        { "monster": "mon_skitterbot", "x": 9, "y": 2, "chance": 100 },
+        { "monster": "mon_flashbang_hack", "x": 9, "y": 3, "chance": 100 },
+        { "monster": "mon_skitterbot", "x": 9, "y": 20, "chance": 100 },
+        { "monster": "mon_gasbomb_hack", "x": 9, "y": 21, "chance": 100 },
+        { "monster": "mon_flashbang_hack", "x": 9, "y": 22, "chance": 100 },
+        { "monster": "mon_gasbomb_hack", "x": 9, "y": 23, "chance": 100 }
+      ],
+      "place_nested": [
+        { "chunks": [ [ "lab_generic_7x7_open", 50 ], [ "lab_generic_7x7_S", 50 ] ], "x": 1, "y": 0 },
+        { "chunks": [ [ "lab_generic_7x7_open", 50 ], [ "lab_generic_7x7_N", 50 ] ], "x": 1, "y": 17 }
+      ]
+    }
+  },
+  {
+    "method": "json",
+    "om_terrain": "lab_security_z-4",
+    "type": "mapgen",
+    "weight": 200,
+    "//": "TODO: possible mechanics area for trains.",
+    "object": {
+      "fill_ter": "t_thconc_floor",
+      "rows": [
+        "||||||||||||||||||||||||",
+        "|,,,,,,,,,|.,.,.|;;;;;;ն",
+        "|,,,,,,,,,|,.,.,|;;;;;;ն",
+        "|,,,,,,,,,|.,|##|;;;;;;ն",
+        "|,,,,,,,,,|,.|><|;;;;;;ն",
+        "|,,,,ê,,,,|=¥||||;;;;;;ն",
+        "|,,,,,,,,,|,.|;;|նննիննն",
+        "|,,,,,,,,,|.,||||;;;;;;;",
+        "|,,,,,,,,,|,.|;;;;;;;;;;",
+        "|,,,,,,,,,|.,|;;;;;;;;;;",
+        "|,,,,,,,,,|,.|;;;;;;;;;;",
+        "|||||,,,,,#.,=;;;;;;;;;;",
+        "|||||,,,,,#,.=;;;;;;;;;;",
+        "|,,,,,,,,,|.,ƶ;;;;;;;;;;",
+        "|,,,,,,,,,|,.|;;;;;;;;;;",
+        "|,,,,,,,,,|.,|;;;;;;;;;;",
+        "|,,,,,,,,,|,.||||;;;;;;;",
+        "|,,,,,,,,,|.,|;;|նննիննն",
+        "|,,,,ê,,,,|=¥||||;;;;;;ն",
+        "|,,,,,,,,,|.,|><|;;;;;;ն",
+        "|,,,,,,,,,|,.|##|;;;;;;ն",
+        "|,,,,,,,,,|.,.,.|;;;;;;ն",
+        "|,,,,,,,,,|,.,.,|;;;;;;ն",
+        "||||||||||||||||||||||||"
+      ],
+      "palettes": [ "lab_common_palette", "lab_security_palette" ],
+      "terrain": { "¥": "t_card_science_security_magenta", "ƶ": "t_card_science_maintenance_blue" },
+      "place_nested": [
+        { "chunks": [ [ "lab_security_10x10_S", 100 ], [ "null", 0 ] ], "x": 1, "y": 1 },
+        { "chunks": [ [ "lab_security_10x10_N", 100 ], [ "null", 0 ] ], "x": 1, "y": 13 },
+        { "chunks": [ [ "lab_cargo_5x5", 100 ] ], "x": 18, "y": 1 },
+        { "chunks": [ [ "lab_cargo_5x5", 100 ] ], "x": 18, "y": 18 }
+      ],
+      "place_vehicles": [
+        { "vehicle": "portable_generator", "x": [ 16, 21 ], "y": [ 14, 15 ], "chance": 30, "rotation": 90 },
+        { "vehicle": "handjack", "x": [ 16, 22 ], "y": 16, "chance": 30, "rotation": 90 },
+        { "vehicle": "forklift", "x": 18, "y": 9, "chance": 30, "rotation": 90 }
+      ]
+    }
+  },
+  {
+    "method": "json",
+    "om_terrain": "lab_security_z-5",
+    "//": "TODO: add nested rooms to right side.",
+    "type": "mapgen",
+    "weight": 200,
+    "object": {
+      "fill_ter": "t_metal_floor",
+      "rows": [
+        "||||||||||||||||||||||||",
+        "|,,,,,,,,,|`````¥``````ɜ",
+        "|,,,,,,,,,|`````=```````",
+        "|,,,,,,,,,|``|##|```````",
+        "|,,,,,,,,,|``|><|`ɜ`````",
+        "|,,,,,,,,,|``|||||||||||",
+        "|,,,,,,,,,|``|||||||||||",
+        "|,,,,,,,,,|``|||||||||||",
+        "|,,,,,,,,,|``|||||||||||",
+        "|,,,,,,,,,|``||,,,,,,|||",
+        "|,,,,,,,,,|``||,,,,,,|||",
+        "|||||,,,,,=``=,,,,,,,|||",
+        "|||||,,,,,=``=,,,,,,,|||",
+        "|,,,,,,,,,|``ƶ|,,,,,,|||",
+        "|,,,,,,,,,|``||,,,,,,|||",
+        "|,,,,,,,,,|``|||||||||||",
+        "|,,,,,,,,,|``|||||||||||",
+        "|,,,,,,,,,|``|||||||||||",
+        "|,,,,,,,,,|``|||||||||||",
+        "|,,,,,,,,,|``|><|`ɜ`````",
+        "|,,,,,,,,,|``|##|```````",
+        "|,,,,,,,,,|`````=```````",
+        "|,,,,,,,,,|`````¥``````ɜ",
+        "||||||||||||||||||||||||"
+      ],
+      "palettes": [ "lab_common_palette", "lab_security_palette" ],
+      "terrain": { "¥": "t_card_science_security_black", "ƶ": "t_card_science_security_magenta" },
+      "place_nested": [
+        { "chunks": [ [ "lab_security_10x10_S", 100 ], [ "null", 0 ] ], "x": 1, "y": 1 },
+        { "chunks": [ [ "lab_security_10x10_N", 100 ], [ "null", 0 ] ], "x": 1, "y": 13 }
+      ]
+    }
+  },
+  {
+    "method": "json",
+    "om_terrain": "lab_security_z-6_final_flr",
+    "//": "variant for a 6 floor lab (removed stairs down)",
+    "type": "mapgen",
+    "weight": 200,
+    "object": {
+      "fill_ter": "t_linoleum_gray",
+      "rows": [
+        "||||||||||||||||||||||||",
+        "|@@∞|,|∞@@|`````¥``````ɜ",
+        "|r,,+,+,hr|`````=```````",
+        "|rh,|,|,,r|``|##|```````",
+        "|||||,|||||``|><|`ɜ`````",
+        "|@@∞|,|∞@@|``|||||||||||",
+        "|r,,+,+,hr|``|||||||||||",
+        "|rh,|,|,,r|``||qqqqqqq||",
+        "|||||,|||||``||,,,,,,,||",
+        "|9,S|,,,,,|``||,,≠≠≠≠≠||",
+        "|9,,|,hfh,|``||,,,,,,,||",
+        "|||+|,hfh,#``=,,,≠≠≠≠≠||",
+        "|t+,#,hfh,#``=,,,,,,,,||",
+        "|||,|,hfh,|`6||qqq,,qq||",
+        "|t+,|,,,,,|``|||||=¥||||",
+        "|||||,|||||``||,$,,A,Q||",
+        "|@@∞|,|∞@@|``||,$,NN,Q||",
+        "|r,,+,+,,r|``|||||||||||",
+        "|rh,|,|,hr|``|||||||||||",
+        "|||||,|||||``|><|`ɜ`````",
+        "|@@∞|,|∞@@|``|##|```````",
+        "|r,,+,+,,r|`````=```````",
+        "|rh,|,|,hr|`````¥``````ɜ",
+        "||||||||||||||||||||||||"
+      ],
+      "palettes": [ "lab_common_palette", "lab_security_palette" ],
+      "terrain": { "ɜ": "t_metal_floor", "¥": "t_card_science_security_black", "ƶ": "t_card_science_security_magenta" },
+      "place_loot": [ { "item": "huge_atomic_battery_cell", "x": 21, "y": [ 15, 16 ], "chance": 50 } ],
+      "place_monster": [ { "monster": [ "mon_mech_recon", "mon_mech_combat" ], "x": 15, "y": [ 15, 16 ], "chance": 30 } ],
+      "items": {
+        "q": { "item": "guns_milspec", "chance": 40, "repeat": [ 1, 2 ] },
+        "r": { "item": "tools_gunsmith", "chance": 10 },
+        "≠": [
+          { "item": "ammo_milspec", "chance": 70, "repeat": [ 1, 2 ] },
+          { "item": "mags_milspec", "chance": 40, "repeat": [ 1, 2 ] }
+        ]
+      },
+      "computers": {
+        "6": {
+          "name": "Magazine Entrance",
+          "security": 6,
+          "options": [ { "name": "UNLOCK ENTRANCE", "action": "unlock", "security": 7 } ],
+          "failures": [ { "action": "damage" }, { "action": "shutdown" } ]
+        }
+      }
+    }
+  }
+]
diff --git a/data/json/mapgen/lab/lab_modular/lab_cargo_surface.json b/data/json/mapgen/lab/lab_modular/lab_cargo_surface.json
new file mode 100644
index 0000000000000..3af469ed8a7f9
--- /dev/null
+++ b/data/json/mapgen/lab/lab_modular/lab_cargo_surface.json
@@ -0,0 +1,354 @@
+[
+  {
+    "method": "json",
+    "om_terrain": [ [ "lab_res_8_SWD_ground", "lab_res_8_SED_ground" ] ],
+    "type": "mapgen",
+    "weight": 200,
+    "object": {
+      "fill_ter": "t_thconc_floor",
+      "rows": [
+        "|նննննն;;;;;;;;;;;;;;;;;;;;|||||||||||||||||||||",
+        "|;;;;;ն;££££££££££££££££££;|||;;;|;;;|;;;|;;;|||",
+        "|;;;;;ն;££;;;£;;;£;;;£;;;£;|||||||||||||||||||||",
+        "|;;è;;ի;£;£;;;£;;;£;;;£;;£;||£^££££££££££££££|||",
+        "|;;;;;ն;£;;£;;;£;;;£;;;£;£;||£♥♠;;;;;;;;;£;;0|||",
+        "|;;;;;ն;£;;;£;;;£;;;£;;;££;||£♥♠;;;;;;è;;££££|||",
+        "|նննննն;££;;;£;;;£;;;£;;;£;||£♥♠;;;;;;;;;£;;;|||",
+        "|;;;;;ն;£;£;;;£;;;£;;;£;;£;||£^££££££;;;;££££|||",
+        "|;;;;;ն;£;;£;;;£;;;£;;;£;£;||;;;;;;;£;;;;£;;;|||",
+        "|;;è;;ի;£;;;£;;;£;;;£;;;££;||0;;;;;;£;;;;££££|||",
+        "|;;;;;ն;££;;;£;;;£;;;£;;;£;|||||||||¥====|||||||",
+        "|;;;;;ն;£;£;;;£;;;£;;;£;;£;||||||||;£;;;;£||||||",
+        "|նննննն;££££££££££££££££££;;;;;;;;;;£;;;;£122|||",
+        "|;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;£;;;;£-22|||",
+        "|;£££££££££££££££££££££££££££££££££££;;;;£-22|||",
+        "|;£;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;£||||||",
+        "|;£;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;£|Y>|||",
+        "|;£è;;;;;;è;;;;;;è;;;;;;è;;;;;;è;;;;;;è;;£|;;|||",
+        "|;£;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;£|=6|||",
+        "|;££££££££££££££££££££££££££££££££££££££££;;;|||",
+        "|;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;|||",
+        "||||||||||||||||||||||||||||||||||||||||||||||||",
+        "||||||||||||||||||||||||||||||||||||||||||||||||",
+        "||||||||||||||||||||||||||||||||||||||||||||||||"
+      ],
+      "palettes": [ "lab_common_palette", "lab_security_palette" ],
+      "terrain": { "¥": "t_card_science_maintenance_green", "6": "t_card_science_maintenance_yellow" },
+      "place_nested": [
+        { "chunks": [ [ "lab_cargo_5x5", 100 ] ], "x": 1, "y": 1 },
+        { "chunks": [ [ "lab_cargo_5x5", 100 ] ], "x": 1, "y": 7 },
+        { "chunks": [ [ "lab_wall_chain_5x5", 50 ], [ "null", 50 ] ], "x": 1, "y": 0 },
+        { "chunks": [ [ "lab_wall_chain_5x5", 50 ], [ "null", 50 ] ], "x": 1, "y": 6 }
+      ],
+      "place_monster": [
+        { "monster": "mon_manhack", "x": 30, "y": 1, "chance": 100 },
+        { "monster": "mon_skitterbot", "x": 31, "y": 1, "chance": 100 },
+        { "monster": "mon_manhack", "x": 32, "y": 1, "chance": 100 },
+        { "monster": "mon_flashbang_hack", "x": 34, "y": 1, "chance": 100 },
+        { "monster": "mon_manhack", "x": 35, "y": 1, "chance": 100 },
+        { "monster": "mon_flashbang_hack", "x": 36, "y": 1, "chance": 100 },
+        { "monster": "mon_gasbomb_hack", "x": 38, "y": 1, "chance": 100 },
+        { "monster": "mon_secubot", "x": 39, "y": 1, "chance": 100 },
+        { "monster": "mon_gasbomb_hack", "x": 40, "y": 1, "chance": 100 },
+        { "monster": "mon_manhack", "x": 42, "y": 1, "chance": 100 },
+        { "monster": "mon_skitterbot", "x": 43, "y": 1, "chance": 100 },
+        { "monster": "mon_manhack", "x": 44, "y": 1, "chance": 100 }
+      ]
+    }
+  },
+  {
+    "method": "json",
+    "om_terrain": [ [ "lab_res_8_SWU_ground", "lab_res_8_SEU_ground" ] ],
+    "type": "mapgen",
+    "weight": 200,
+    "object": {
+      "fill_ter": "t_thconc_floor",
+      "rows": [
+        "|||նննննն;;;;;;;;;;;;;;;;;;|||||||||||||||||||||",
+        "|||;;;;;ն;££££££££££££££££;|||;;;|;;;|;;;|;;;|||",
+        "|||;;;;;ն;££;;;£;;;£;;;£;£;|||||||||||||||||||||",
+        "|||;;è;;ի;£;£;;;£;;;£;;;££;||£^££££££££££££££|||",
+        "|||;;;;;ն;£;;£;;;£;;;£;;;£;||£♥♠;;;;;;;;;£;;0|||",
+        "|||;;;;;ն;£;;;£;;;£;;;£;;£;||£♥♠;;;;;;è;;££££|||",
+        "|||նննննն;££;;;£;;;£;;;£;£;||£♥♠;;;;;;;;;£;;;|||",
+        "|||;;;;;ն;£;£;;;£;;;£;;;££;||£^££££££;;;;££££|||",
+        "|||;;;;;ն;£;;£;;;£;;;£;;;£;||;;;;;;;£;;;;£;;;|||",
+        "|||;;è;;ի;£;;;£;;;£;;;£;;£;||0;;;;;;£;;;;££££|||",
+        "|||;;;;;ն;££;;;£;;;£;;;£;£;|||||||||¥====|||||||",
+        "|||;;;;;ն;£;£;;;£;;;£;;;££;||||||||;£;;;;£||||||",
+        "|||նննննն;££££££££££££££££;;;;;;;;;;£;;;;£122|||",
+        "|||;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;£;;;;£-22|||",
+        "|||;£££££££££££££££££££££££££££££££££;;;;£-22|||",
+        "|||;£;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;£||||||",
+        "|||;£;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;£|>>|||",
+        "|||è£;;;;;è;;;;;;è;;;;;;è;;;;;;è;;;;;;è;;£|;;|||",
+        "|||;£;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;£|=6|||",
+        "|||;££££££££££££££££££££££££££££££££££££££;;;|||",
+        "|||;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;|||",
+        "||||||||||||||||||||||||||||||||||||||||||||||||",
+        "||||||||||||||||||||||||||||||||||||||||||||||||",
+        "||||||||||||||||||||||||||||||||||||||||||||||||"
+      ],
+      "palettes": [ "lab_common_palette", "lab_security_palette" ],
+      "terrain": { "¥": "t_card_science_maintenance_green", "6": "t_card_science_maintenance_yellow" },
+      "place_nested": [
+        { "chunks": [ [ "lab_cargo_5x5", 100 ] ], "x": 3, "y": 1 },
+        { "chunks": [ [ "lab_cargo_5x5", 100 ] ], "x": 3, "y": 7 },
+        { "chunks": [ [ "lab_wall_chain_5x5", 50 ], [ "null", 50 ] ], "x": 3, "y": 0 },
+        { "chunks": [ [ "lab_wall_chain_5x5", 50 ], [ "null", 50 ] ], "x": 3, "y": 0 },
+        { "chunks": [ [ "lab_wall_chain_5x5", 50 ], [ "null", 50 ] ], "x": 3, "y": 12 }
+      ],
+      "place_monster": [
+        { "monster": "mon_manhack", "x": 30, "y": 1, "chance": 100 },
+        { "monster": "mon_skitterbot", "x": 31, "y": 1, "chance": 100 },
+        { "monster": "mon_manhack", "x": 32, "y": 1, "chance": 100 },
+        { "monster": "mon_flashbang_hack", "x": 34, "y": 1, "chance": 100 },
+        { "monster": "mon_manhack", "x": 35, "y": 1, "chance": 100 },
+        { "monster": "mon_flashbang_hack", "x": 36, "y": 1, "chance": 100 },
+        { "monster": "mon_gasbomb_hack", "x": 38, "y": 1, "chance": 100 },
+        { "monster": "mon_secubot", "x": 39, "y": 1, "chance": 100 },
+        { "monster": "mon_gasbomb_hack", "x": 40, "y": 1, "chance": 100 },
+        { "monster": "mon_manhack", "x": 42, "y": 1, "chance": 100 },
+        { "monster": "mon_skitterbot", "x": 43, "y": 1, "chance": 100 },
+        { "monster": "mon_manhack", "x": 44, "y": 1, "chance": 100 }
+      ],
+      "place_vehicles": [ { "vehicle": "golf_cart", "x": [ 8, 20 ], "y": [ 17, 18 ], "chance": 100, "rotation": 90 } ]
+    }
+  },
+  {
+    "method": "json",
+    "om_terrain": [ [ "lab_CORE_2x1_SED_ground", "lab_CORE_2x1_SWD_ground" ] ],
+    "type": "mapgen",
+    "weight": 200,
+    "object": {
+      "fill_ter": "t_thconc_floor",
+      "rows": [
+        ";QQJJ;;JJQQ;£;;;£;;;£|;;;;Z|;£;;;;;;;£;ն;;;;;|||",
+        ";;;;;;;;;;;;£;;;£;;;£ʔr;;hrʔ;£;;;;;;;£;ն;;;;;|||",
+        ";;;;;;;;;;;;£;;;£;;;£ʔr;;;rʔ;£;;;;;;;£;ի;;;;;|||",
+        ";;;;;;;;;;;;£;;;£;;;£|ʔʔʔʔʔ|;£;;;;;;;£;ն;;;;;|||",
+        ";;;;;;;;;;;;£;;;£;;;£;;;;;;;;£;;;;;;;£;ն;;;;;|||",
+        ";;;;;;;;;è;;£;;;£;;;£;;è;;;;;£;;;;;;;£;ն;;;;è|||",
+        ";;;;;;;;;;;;£;;;£;;;£;;;;;;;;£;;;;;;;£;ն;;;;;|||",
+        ";;;;;;;;;;;;£;;;£;;;£;;;;;;;;£;;;;;;;£;ն;;;;;|||",
+        ";;è;;;;;;è;;£;;;£;;;£;;è;;;;;£è;;;;è;£;ի;;;;;|||",
+        ";;;;;;;;;;;;£;;;£;;;£;;;;;;;;£;;;;;;;£;ն;;;;;|||",
+        "£££££££££££££;£;£;£;££££££££££;;;;;;;£;ն;;;;;|||",
+        ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;£;ն;;;;;|||",
+        ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;£;ն;;;;è|||",
+        ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;£;ն;;;;;|||",
+        ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;£;ի;;;;;|||",
+        ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;£;ն;;;;;|||",
+        ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;£;ն;;;;;|||",
+        ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;£;նննննն|||",
+        "££££££££££££££££££££££££££££££££££££££;;;;;;;|||",
+        ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;|||",
+        ";;è;;;;;;è;;;;;;è;;;;;;è;;;;;;è;;;;;;è;;;;;;è|||",
+        ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;|||",
+        "|;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;|||",
+        "|;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;|||"
+      ],
+      "palettes": [ "lab_common_palette", "lab_maintenance_palette" ],
+      "place_nested": [
+        { "chunks": [ [ "lab_cargo_5x5", 100 ] ], "x": 40, "y": 0 },
+        { "chunks": [ [ "lab_cargo_5x5", 100 ] ], "x": 40, "y": 6 },
+        { "chunks": [ [ "lab_cargo_5x5", 100 ] ], "x": 40, "y": 12 },
+        { "chunks": [ [ "lab_cargo_5x5", 100 ] ], "x": 40, "y": 18 },
+        { "chunks": [ [ "lab_cargo_5x5", 100 ] ], "x": 24, "y": 5 },
+        { "chunks": [ [ "lab_wall_chain_5x5", 50 ], [ "null", 50 ] ], "x": 40, "y": 5 },
+        { "chunks": [ [ "lab_wall_chain_5x5", 50 ], [ "null", 50 ] ], "x": 40, "y": 11 },
+        { "chunks": [ [ "lab_wall_chain_5x5", 50 ], [ "null", 50 ] ], "x": 40, "y": 17 }
+      ],
+      "place_vehicles": [
+        { "vehicle": "golf_cart_4seat", "x": 2, "y": 6, "chance": 100, "rotation": 180 },
+        { "vehicle": "forklift", "x": 8, "y": 3, "chance": 100, "rotation": 90 },
+        { "vehicle": "truck_trailer", "x": 5, "y": 14, "chance": 30, "rotation": 180 },
+        { "vehicle": "portable_generator", "x": 5, "y": [ 2, 8 ], "chance": 30, "rotation": 90 },
+        { "vehicle": "handjack", "x": 1, "y": [ 2, 8 ], "chance": 30, "rotation": 90 },
+        { "vehicle": "forklift", "x": [ 31, 35 ], "y": [ 14, 21 ], "chance": 30, "rotation": 90 },
+        { "vehicle": "handjack", "x": [ 40, 44 ], "y": [ 1, 4 ], "chance": 10, "rotation": 0 },
+        { "vehicle": "handjack", "x": [ 40, 44 ], "y": [ 8, 10 ], "chance": 10, "rotation": 0 },
+        { "vehicle": "handjack", "x": [ 40, 44 ], "y": [ 14, 16 ], "chance": 10, "rotation": 0 },
+        { "vehicle": "handjack", "x": [ 40, 44 ], "y": [ 20, 22 ], "chance": 10, "rotation": 0 }
+      ]
+    }
+  },
+  {
+    "method": "json",
+    "om_terrain": [ [ "lab_CORE_2x1_NED_ground", "lab_CORE_2x1_NWD_ground" ] ],
+    "type": "mapgen",
+    "weight": 200,
+    "object": {
+      "fill_ter": "t_thconc_floor",
+      "rows": [
+        "|;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ն;;;;;|||",
+        "|;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ն;;;;;|||",
+        ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ն;;;;;|||",
+        ";;è;;;;;;è;;;;;;è;;;;;;è;;;;;;è;;;;;;è;ի;;;;è|||",
+        ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ն;;;;;|||",
+        "££££££££££££££££££££££££££££££££££££££;ն;;;;;|||",
+        ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;£;ն;;;;;|||",
+        ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;£;ն;;;;;|||",
+        ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;£;ն;;;;;|||",
+        ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;£;ի;;;;;|||",
+        ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;£;ն;;;;è|||",
+        ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;£;ն;;;;;|||",
+        ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;£;ն;;;;;|||",
+        "£££££££££££££;£;£;£;££££££££££;;;;;;;£;ն;;;;;|||",
+        ";;;;;;;;;;;;£;;;£;;;£;;;;;;;;£;;;;;;;£;ն;;;;;|||",
+        ";;è;;;;;;è;;£;;;£;;;£;;è;;;;;£è;;;;;è£;ի;;;;;|||",
+        ";;;;;;;;;;;;£;;;£;;;£;;;;;;;;£;;;;;;;£;ն;;;;;|||",
+        ";;;;;;;;;;;;£;;;£;;;£;;;;;;;;£;;;;;;;£;ն;;;;è|||",
+        ";;;;;;;;;è;;£;;;£;;;£;;è;;;;;£;;;;;;;£;ն;;;;;|||",
+        ";;;;;;;;;;;;£;;;£;;;£;;;;;;;;£;;;;;;;£;ն;;;;;|||",
+        ";;;;;;;;;;;;£;;;£;;;£|ʔʔʔʔʔ|;£;;;;;;;£;ն;;;;;|||",
+        ";;;;;;;;;;;;£;;;£;;;£ʔr;;hrʔ;£;;;;;;;£;ի;;;;;|||",
+        ";;;;;;;;;;;;£;;;£;;;£ʔr;;;rʔ;£;;;;;;;£;ն;;;;;|||",
+        ";QQJJ;;JJQQ;£;;;£;;;£|;;;;Z|;£;;;;;;;£;ն;;;;;|||"
+      ],
+      "palettes": [ "lab_common_palette", "lab_maintenance_palette" ],
+      "place_nested": [
+        { "chunks": [ [ "lab_cargo_5x5", 100 ] ], "x": 40, "y": 0 },
+        { "chunks": [ [ "lab_cargo_5x5", 100 ] ], "x": 40, "y": 6 },
+        { "chunks": [ [ "lab_cargo_5x5", 100 ] ], "x": 40, "y": 12 },
+        { "chunks": [ [ "lab_cargo_5x5", 100 ] ], "x": 40, "y": 18 },
+        { "chunks": [ [ "lab_cargo_5x5", 100 ] ], "x": 24, "y": 14 },
+        { "chunks": [ [ "lab_wall_chain_5x5", 50 ], [ "null", 50 ] ], "x": 40, "y": 5 },
+        { "chunks": [ [ "lab_wall_chain_5x5", 50 ], [ "null", 50 ] ], "x": 40, "y": 11 },
+        { "chunks": [ [ "lab_wall_chain_5x5", 50 ], [ "null", 50 ] ], "x": 40, "y": 17 }
+      ],
+      "place_vehicles": [
+        { "vehicle": "truck_trailer", "x": 5, "y": 8, "chance": 30, "rotation": 180 },
+        { "vehicle": "portable_generator", "x": 5, "y": [ 18, 21 ], "chance": 30, "rotation": 90 },
+        { "vehicle": "handjack", "x": 1, "y": [ 18, 21 ], "chance": 30, "rotation": 90 },
+        { "vehicle": "cart_animal_compartment", "x": 4, "y": 19, "chance": 30, "rotation": 0 },
+        { "vehicle": "forklift", "x": 8, "y": 19, "chance": 30, "rotation": 0 },
+        { "vehicle": "forklift", "x": [ 31, 35 ], "y": [ 14, 21 ], "chance": 30, "rotation": 90 },
+        { "vehicle": "handjack", "x": [ 40, 44 ], "y": [ 1, 4 ], "chance": 10, "rotation": 0 },
+        { "vehicle": "handjack", "x": [ 40, 44 ], "y": [ 8, 10 ], "chance": 10, "rotation": 0 },
+        { "vehicle": "handjack", "x": [ 40, 44 ], "y": [ 14, 16 ], "chance": 10, "rotation": 0 },
+        { "vehicle": "handjack", "x": [ 40, 44 ], "y": [ 20, 22 ], "chance": 10, "rotation": 0 }
+      ]
+    }
+  },
+  {
+    "method": "json",
+    "om_terrain": [ [ "lab_CORE_2x1_WC_ground", "lab_CORE_2x1_EC_ground" ] ],
+    "type": "mapgen",
+    "weight": 200,
+    "object": {
+      "fill_ter": "t_thconc_floor",
+      "rows": [
+        "|||||||||||||===¥===||#|;hrʔ;£;;;;;;;£;նննննն|||",
+        "|;;;;;;;;;;;£;;;£;;;£;;|;;rʔ;£;;;;;;;£;ն;;;;è|||",
+        "|;;;;;;;;;;;£;;;£;;;£;;||ʔʔ|;£;;;;;;;£;ն;;;;;|||",
+        "|#||||;;;;;;£;;;£;;;£;;|;;;;;£;;;;;;;£;ի;;;;;|||",
+        "|;;QQ|Q;;;;;£;£;£;£;£;;|;;;;;£;;;;;;;£;ն;;;;;|||",
+        "|;;;J|;;;;;;;;;;;;;;;;;|;;;;;£;;;;;;;£;ն;;;;;|||",
+        "|;;QQ|||||;;;;;;;;;;;;;|;;;;;£;;;;;;;£;նննննն|||",
+        "||;|||P;rʔ;;;;;;;;;;;;q|;;;;;£;;;;;;;£;ն;;;;;|||",
+        "|R;;;+;hrʔ;;;;;;;;;;;;q|;;;;;£;;;;;;;£;ն;;;;è|||",
+        "|R;;;|y;;ʔ;;;;;;;;;;;;Q|;;;;;£;;;;;;;£;ն;;;;;|||",
+        "|;;;;|+|||ʋ;;ʍ;;;;;;;;J|;;;;;£;;;;;;;£;ն;;;;;|||",
+        "|3;;H|;;t|N;AN;;;;;;;;J|;;;;;£;;;;;;;£;ի;;;;;|||",
+        "|Y;;H|;SY|N;;N;;;;;;;;J|;;;;;£;;;;;;;£;ի;;;;;|||",
+        "|4;;H|+|||ã;;ʉ;;;;;;;;J|;;;;;£;;;;;;;£;ն;;;;;|||",
+        "|;;;;|;;;ʔ;;;A;;;;;;;;Q|;;;;;£;;;;;;;£;ն;;;;;|||",
+        "|y;E;+;r;ʔ;;;;;;;;;;;;q|;;;;;£;;;;;;;£;ն;;;;è|||",
+        "||;|||Prhʔ;;;;;;;;;;;;q|;;;;;£;;;;;;;£;ն;;;;;|||",
+        "|;;qq|||||;;;;;;;;;;;;;|;;;;;£;;;;;;;£;նննննն|||",
+        "|;;;J|;;;;;;;;;;;;;;;;;|;;;;;£;;;;;;;£;ն;;;;;|||",
+        "|;;qq|Q;;;;;£;£;£;£;£;;|;;;;;£;;;;;;;£;ն;;;;;|||",
+        "|#||||;;;;;;£;;;£;;;£;;|;;;;;£;;;;;;;£;ի;;;;;|||",
+        "|;;;;;;;;;;;£;;;£;;;£;;||ʔʔ|;£;;;;;;;£;ն;;;;;|||",
+        "|;;;;;;;;;;;£;;;£;;;£;;|;;rʔ;£;;;;;;;£;ն;;;;è|||",
+        "|||||||||||||===¥===||#|;hrʔ;£;;;;;;;£;նննննն|||"
+      ],
+      "palettes": [ "lab_common_palette", "lab_maintenance_palette" ],
+      "terrain": { "¥": "t_card_science_maintenance_green" },
+      "place_nested": [
+        { "chunks": [ [ "lab_cargo_5x5", 100 ] ], "x": 40, "y": 1 },
+        { "chunks": [ [ "lab_cargo_5x5", 100 ] ], "x": 40, "y": 7 },
+        { "chunks": [ [ "lab_cargo_5x5", 100 ] ], "x": 40, "y": 12 },
+        { "chunks": [ [ "lab_cargo_5x5", 100 ] ], "x": 40, "y": 18 },
+        { "chunks": [ [ "lab_wall_chain_5x5", 50 ], [ "null", 50 ] ], "x": 40, "y": 1 },
+        { "chunks": [ [ "lab_wall_chain_5x5", 50 ], [ "null", 50 ] ], "x": 40, "y": 6 },
+        { "chunks": [ [ "lab_wall_chain_5x5", 50 ], [ "null", 50 ] ], "x": 40, "y": 17 },
+        { "chunks": [ [ "lab_wall_chain_5x5", 50 ], [ "null", 50 ] ], "x": 40, "y": 23 }
+      ],
+      "items": {
+        "R": { "item": "SUS_engineering_bookcase", "chance": 30 },
+        "Q": { "item": "gas_charging_rack", "chance": 30 },
+        "J": [ { "item": "mechanics", "chance": 30 } ],
+        "N": [ { "item": "mechanics", "chance": 30 } ],
+        "q": [ { "item": "mechanics", "chance": 30 } ]
+      },
+      "place_loot": [
+        { "item": "hd_tow_cable", "x": 22, "y": [ 7, 8 ], "chance": 10 },
+        { "item": "jumper_cable", "x": 22, "y": [ 7, 8 ], "chance": 10 },
+        { "item": "jumper_cable_heavy", "x": 22, "y": [ 7, 8 ], "chance": 7 },
+        { "item": "folding_basket", "x": 22, "y": [ 10, 13 ], "chance": 5 },
+        { "item": "bike_basket", "x": 22, "y": [ 10, 13 ], "chance": 5 },
+        { "item": "bike_rack", "x": 22, "y": [ 10, 13 ], "chance": 7 },
+        { "item": "mounted_spare_tire", "x": 22, "y": [ 10, 13 ], "chance": 10 },
+        { "item": "cargo_lock", "x": 22, "y": [ 10, 13 ], "chance": 25 },
+        { "item": "cargo_rack", "x": 22, "y": [ 10, 13 ], "chance": 10 },
+        { "item": "animal_locker", "x": 22, "y": [ 10, 13 ], "chance": 15 },
+        { "item": "craftrig", "x": 22, "y": [ 10, 13 ], "chance": 5 },
+        { "item": "forgerig", "x": 22, "y": [ 10, 13 ], "chance": 2 },
+        { "item": "weldrig", "x": 22, "y": [ 10, 13 ], "chance": 5 },
+        { "item": "v_table", "x": 22, "y": [ 10, 13 ], "chance": 7 },
+        { "item": "towel_hanger", "x": 22, "y": [ 10, 13 ], "chance": 10 },
+        { "item": "workbench", "x": 22, "y": [ 10, 13 ], "chance": 7 },
+        { "item": "recharge_station", "x": 22, "y": [ 15, 16 ], "chance": 15 },
+        { "item": "minifreezer", "x": 22, "y": [ 15, 16 ], "chance": 10 },
+        { "item": "mountable_heater", "x": 22, "y": [ 15, 16 ], "chance": 10 },
+        { "item": "mountable_cooler", "x": 22, "y": [ 15, 16 ], "chance": 10 }
+      ],
+      "place_vehicles": [
+        { "vehicle": "cart_chassis_2", "x": 20, "y": 8, "chance": 30, "rotation": 90 },
+        { "vehicle": "engine_crane", "x": 15, "y": 11, "chance": 30, "rotation": 0 },
+        { "vehicle": "welding_cart", "x": 17, "y": [ 12, 14 ], "chance": 30, "rotation": 180 },
+        { "vehicle": "cart_chassis", "x": 8, "y": 19, "chance": 30, "rotation": 180 }
+      ]
+    }
+  },
+  {
+    "method": "json",
+    "om_terrain": [ [ "lab_2x1_CORE_-1W", "lab_2x1_CORE_-1E" ] ],
+    "//": "level -1 for cargo ramps. TODO: complete this level for maintence expansion.",
+    "type": "mapgen",
+    "weight": 200,
+    "object": {
+      "fill_ter": "t_thconc_floor",
+      "rows": [
+        "??????????||||||||||||||||||||||||||||||||||||||",
+        "??????????||||||||||||||||||||||||||||||||||||||",
+        "??????????||||||||||||||||||||||||||||||||||||||",
+        "??????????||||;;;;;;;;;;;;;;;;;;;;;;;;;;;;;|||||",
+        "??????????||||;;♠♥;;;;;;;;;;;;♣♦;;;;;;;;;;;|||||",
+        "??????????||||;;♠♥;;;;;;;;;;;;♣♦;;;;;;;;;;;|||||",
+        "??????????||||;;♠♥;;;;;;;;;;;;♣♦;;;;;;;;;;;|||||",
+        "??????????||||;;;;;;;;;;;;;;;;;;;;;;;;;;;;;|||||",
+        "??????????||||||||||||||||||||||||||||||||||||||",
+        "??????????||||||||||||||||||||||||||||||||||||||",
+        "??????????||||||||||||||||||||||||||||||||||||||",
+        "??????????||||||||||||||||||||||||||||||||||||||",
+        "??????????|||||||||||||||||||||||||||||;;;122|||",
+        "??????????|||||||||||||||||||||||||||||;;;-22|||",
+        "??????????|||||||||||||||||||||||||||||;;;-22|||",
+        "??????????|||||||||||||||||||||||||||||;;;||||||",
+        "??????????|||||||||||||||||||||||||||||;;;|><|||",
+        "??????????|||||||||||||||||||||||||||||;;;#;;|||",
+        "??????????||||||||||||||||||||||||||||||||||||||",
+        "??????????||||||||||||||||||||||||||||||||||||||",
+        "??????????||||||||||||||||||||||||||||||||||||||",
+        "??????????||||||||||||||||||||||||||||||||||||||",
+        "??????????||||||||||||||||||||||||||||||||||||||",
+        "??????????????????????????????????||||??????????"
+      ],
+      "palettes": [ "lab_common_palette", "lab_maintenance_palette" ],
+      "terrain": { "?": "t_soil" }
+    }
+  }
+]
diff --git a/data/json/mapgen_palettes/lab/lab_modular_palette.json b/data/json/mapgen_palettes/lab/lab_modular_palette.json
index 1d432b3867241..2eceab97e6041 100644
--- a/data/json/mapgen_palettes/lab/lab_modular_palette.json
+++ b/data/json/mapgen_palettes/lab/lab_modular_palette.json
@@ -45,10 +45,16 @@
       "¶": "t_carpet_concrete_yellow",
       "ꞝ": "t_carpet_concrete_green",
       "£": "t_thconc_y",
+      "ß": "t_thconc_r",
       "<": "t_stairs_up",
       ">": "t_stairs_down",
       "ի": "t_chaingate_c",
       "ն": "t_chainfence",
+      "è": "t_thconc_floor_olight",
+      "é": "t_strconc_floor_olight",
+      "ê": "t_linoleum_gray_floor_olight",
+      "ë": "t_linoleum_whitefloor_olight",
+      "î": "t_metal_floor_olight",
       "♥": "t_ramp_down_high",
       "♠": "t_ramp_down_low",
       "♦": "t_ramp_up_high",
@@ -252,7 +258,7 @@
     "id": "lab_maintenance_palette",
     "//": "for maintenance areas of labs.",
     "liquids": { "ɜ": { "liquid": "water_clean", "amount": [ 0, 100 ] } },
-    "terrain": { ";": "t_thconc_floor", "1": "t_elevator_control", "2": "t_elevator", "7": "t_sewage_pump", "0": "t_sewage_pipe" },
+    "terrain": { ";": "t_thconc_floor", "1": "t_elevator_control_off", "2": "t_elevator", "7": "t_sewage_pump", "0": "t_sewage_pipe" },
     "furniture": {
       "ƃ": "f_warehouse_shelf",
       "W": "f_generator_broken",
@@ -264,7 +270,7 @@
       "Æ": "f_55gal_firebarrel",
       "ʉ": "f_arcfurnace_empty",
       "ʋ": "f_drill_press",
-      "ʌ": "f_hydraulic_press",
+      "ã": "f_hydraulic_press",
       "ʍ": "f_air_compressor",
       "ʭ": "f_ladder",
       "5": "f_water_purifier",
@@ -290,7 +296,7 @@
       "⁴": "t_strconc_floor",
       "_": "t_pavement",
       "7": "t_reinforced_glass_shutter",
-      "1": "t_elevator_control",
+      "1": "t_elevator_control_off",
       "2": "t_elevator"
     },
     "furniture": {
@@ -313,7 +319,15 @@
       "ɜ": { "monster": "mon_turret_rifle" },
       "ɛ": { "monster": "mon_turret_rifle" }
     },
-    "items": { "3": { "item": "vending_food", "chance": 90 }, "4": { "item": "vending_drink", "chance": 90 } }
+    "items": {
+      "3": { "item": "vending_food", "chance": 90 },
+      "4": { "item": "vending_drink", "chance": 90 },
+      "∞": [
+        { "item": "clothing_soldier_set", "chance": 100 },
+        { "item": "gear_soldier_sidearm", "chance": 33 },
+        { "item": "book_military", "chance": 33 }
+      ]
+    }
   },
   {
     "type": "palette",
@@ -437,7 +451,7 @@
     "type": "palette",
     "id": "lab_medical_palette",
     "//": "for normal medical clinic areas of labs.",
-    "terrain": { "1": "t_elevator_control", "2": "t_elevator" },
+    "terrain": { "1": "t_elevator_control_off", "2": "t_elevator" },
     "furniture": {
       "W": "f_generator_broken",
       "ɔ": "f_autodoc",
diff --git a/data/json/monstergroups/lab.json b/data/json/monstergroups/lab.json
index 5875a65b99ba8..18895f01a2ee0 100644
--- a/data/json/monstergroups/lab.json
+++ b/data/json/monstergroups/lab.json
@@ -185,5 +185,56 @@
       { "monster": "mon_zombie_brute_shocker", "freq": 1, "cost_multiplier": 5 },
       { "monster": "mon_lab_rat", "freq": 20, "cost_multiplier": 20, "pack_size": [ 2, 8 ] }
     ]
+  },
+  {
+    "type": "monstergroup",
+    "name": "GROUP_LAB_BASIC_SECURITY",
+    "default": "mon_zombie_labsecurity",
+    "monsters": [
+      { "monster": "mon_feral_labsecurity_9mm", "freq": 18, "cost_multiplier": 8 },
+      { "monster": "mon_feral_labsecurity_flashlight", "freq": 18, "cost_multiplier": 2 },
+      { "monster": "mon_zombie_labsecurity", "freq": 40, "cost_multiplier": 0, "pack_size": [ 2, 3 ] },
+      { "monster": "mon_zombie_hazmat", "freq": 10, "cost_multiplier": 1, "pack_size": [ 1, 2 ] },
+      { "monster": "mon_zombie", "freq": 30, "cost_multiplier": 1, "pack_size": [ 2, 4 ] },
+      { "monster": "mon_zombie_fat", "freq": 20, "cost_multiplier": 1, "pack_size": [ 1, 2 ] },
+      { "monster": "mon_zombie_tough", "freq": 20, "cost_multiplier": 2 },
+      { "monster": "mon_zombie_crawler", "freq": 10, "cost_multiplier": 1 },
+      { "monster": "mon_zombie_technician", "freq": 3, "cost_multiplier": 2 },
+      { "monster": "mon_zombie_necro", "freq": 1, "cost_multiplier": 15 },
+      { "monster": "mon_eyebot", "freq": 10, "cost_multiplier": 10 }
+    ]
+  },
+  {
+    "type": "monstergroup",
+    "name": "GROUP_LAB_MILITARY",
+    "default": "mon_zombie_soldier",
+    "monsters": [
+      { "monster": "mon_feral_labsecurity_9mm", "freq": 12, "cost_multiplier": 8 },
+      { "monster": "mon_feral_labsecurity_flashlight", "freq": 12, "cost_multiplier": 2 },
+      { "monster": "mon_zombie_labsecurity", "freq": 5, "cost_multiplier": 0, "pack_size": [ 2, 3 ] },
+      { "monster": "mon_zombie_hazmat", "freq": 5, "cost_multiplier": 1, "pack_size": [ 1, 3 ] },
+      { "monster": "mon_zombie_bio_op", "freq": 15, "cost_multiplier": 5 },
+      { "monster": "mon_zombie_bio_op2", "freq": 10, "cost_multiplier": 10 },
+      { "monster": "mon_zombie_armored", "freq": 3, "cost_multiplier": 15 },
+      { "monster": "mon_zombie_soldier", "freq": 25, "cost_multiplier": 0, "pack_size": [ 1, 4 ] }
+    ]
+  },
+  {
+    "type": "monstergroup",
+    "name": "GROUP_LAB_MAINTENANCE",
+    "default": "mon_zombie_technician",
+    "monsters": [
+      { "monster": "mon_zombie_technician", "freq": 30, "cost_multiplier": 5 },
+      { "monster": "mon_zombie_hazmat", "freq": 20, "cost_multiplier": 1, "pack_size": [ 1, 3 ] },
+      { "monster": "mon_feral_human_pipe", "freq": 18, "cost_multiplier": 8, "pack_size": [ 1, 3 ] },
+      { "monster": "mon_feral_human_crowbar", "freq": 18, "cost_multiplier": 8, "pack_size": [ 1, 3 ] },
+      { "monster": "mon_eyebot", "freq": 5, "cost_multiplier": 1 },
+      { "monster": "mon_hazmatbot", "freq": 7, "cost_multiplier": 1, "pack_size": [ 1, 2 ] },
+      { "monster": "mon_zombie", "freq": 30, "cost_multiplier": 1, "pack_size": [ 1, 3 ] },
+      { "monster": "mon_zombie_fat", "freq": 30, "cost_multiplier": 1 },
+      { "monster": "mon_zombie_tough", "freq": 20, "cost_multiplier": 2 },
+      { "monster": "mon_zombie_crawler", "freq": 5, "cost_multiplier": 1 },
+      { "monster": "mon_zombie_electric", "freq": 3, "cost_multiplier": 5 }
+    ]
   }
 ]
diff --git a/data/json/overmap/overmap_special/lab_modular/lab_mini_specials.json b/data/json/overmap/overmap_special/lab_modular/lab_mini_specials.json
index 0c7d69ff8c8ed..3d86131e81aea 100644
--- a/data/json/overmap/overmap_special/lab_modular/lab_mini_specials.json
+++ b/data/json/overmap/overmap_special/lab_modular/lab_mini_specials.json
@@ -21,5 +21,48 @@
     "city_distance": [ 3, -1 ],
     "city_sizes": [ 1, 16 ],
     "occurrences": [ 0, 0 ]
+  },
+  {
+    "type": "overmap_special",
+    "id": "Lab_SECURITY_1x1x6",
+    "//": "6 z-level security tower. This includes the main lab entrance and security themed floors.",
+    "overmaps": [
+      { "point": [ 0, 0, 0 ], "overmap": "lab_security_z0_north" },
+      { "point": [ 0, 0, -1 ], "overmap": "lab_security_z-1_north" },
+      { "point": [ 0, 0, -2 ], "overmap": "lab_security_z-2_north" },
+      { "point": [ 0, 0, -3 ], "overmap": "lab_security_z-3_north" },
+      { "point": [ 0, 0, -4 ], "overmap": "lab_security_z-4_north" },
+      { "point": [ 0, 0, -5 ], "overmap": "lab_security_z-5_north" },
+      { "point": [ 0, 0, -6 ], "overmap": "lab_security_z-6_final_flr_north" }
+    ],
+    "locations": [ "land" ],
+    "city_distance": [ 3, -1 ],
+    "city_sizes": [ 1, 16 ],
+    "occurrences": [ 0, 0 ]
+  },
+  {
+    "type": "overmap_special",
+    "id": "Lab_CARGO_Surface",
+    "//": "Ground level for the freight/cargo company lab top and -1 connecting ramp/maintenance access.",
+    "overmaps": [
+      { "point": [ 0, 0, 0 ], "overmap": "lab_CORE_2x1_WC_ground_north" },
+      { "point": [ 0, -1, 0 ], "overmap": "lab_CORE_2x1_NED_ground_north" },
+      { "point": [ -1, -1, 0 ], "overmap": "lab_security_z0N_north" },
+      { "point": [ -1, 1, 0 ], "overmap": "lab_security_z0S_north" },
+      { "point": [ 0, -2, 0 ], "overmap": "lab_res_8_SEU_ground_south", "locations": [ "land" ] },
+      { "point": [ 0, 2, 0 ], "overmap": "lab_res_8_SWD_ground_north", "locations": [ "land" ] },
+      { "point": [ 0, 1, 0 ], "overmap": "lab_CORE_2x1_SED_ground_north" },
+      { "point": [ 1, -2, 0 ], "overmap": "lab_res_8_SWU_ground_south", "locations": [ "land" ] },
+      { "point": [ 1, 2, 0 ], "overmap": "lab_res_8_SED_ground_north", "locations": [ "land" ] },
+      { "point": [ 1, -1, 0 ], "overmap": "lab_CORE_2x1_NWD_ground_north" },
+      { "point": [ 1, 0, 0 ], "overmap": "lab_CORE_2x1_EC_ground_north" },
+      { "point": [ 1, 1, 0 ], "overmap": "lab_CORE_2x1_SWD_ground_north" },
+      { "point": [ 0, 2, -1 ], "overmap": "lab_2x1_CORE_-1W_north" },
+      { "point": [ 1, 2, -1 ], "overmap": "lab_2x1_CORE_-1E_north" }
+    ],
+    "locations": [ "land" ],
+    "city_distance": [ 3, -1 ],
+    "city_sizes": [ 1, 16 ],
+    "occurrences": [ 0, 0 ]
   }
 ]
diff --git a/data/json/overmap/overmap_terrain/overmap_terrain_lab.json b/data/json/overmap/overmap_terrain/overmap_terrain_lab.json
index 079ce64758d87..0dca32d24fd05 100644
--- a/data/json/overmap/overmap_terrain/overmap_terrain_lab.json
+++ b/data/json/overmap/overmap_terrain/overmap_terrain_lab.json
@@ -307,6 +307,7 @@
       "lab_surface_brick_blockE1"
     ],
     "name": "parking lot",
+    "//": "parking lot attached to Research facility.",
     "sym": "_",
     "color": "dark_gray",
     "spawns": { "group": "GROUP_LAB_SURFACE", "population": [ 5, 20 ], "chance": 50 },
@@ -331,6 +332,7 @@
       "lab_surface_parking_blockE1"
     ],
     "name": "parking lot",
+    "//": "parking lot attached to modular mutagen lab.",
     "sym": "_",
     "color": "dark_gray",
     "spawns": { "group": "GROUP_VANILLA", "population": [ 5, 20 ], "chance": 30 },
@@ -512,5 +514,57 @@
     "sym": "l",
     "color": "dark_gray",
     "see_cost": 2
+  },
+  {
+    "type": "overmap_terrain",
+    "id": [
+      "lab_security_z-1",
+      "lab_security_z-2",
+      "lab_security_z-3",
+      "lab_security_z-4",
+      "lab_security_z-5",
+      "lab_security_z-6_final_flr"
+    ],
+    "name": "Lab Security Zone",
+    "sym": "S",
+    "//": "6 underground levels for a modular security tower.",
+    "color": "yellow",
+    "see_cost": 5,
+    "spawns": { "group": "GROUP_VANILLA", "population": [ 1, 4 ], "chance": 30 },
+    "flags": [ "RISK_HIGH" ]
+  },
+  {
+    "type": "overmap_terrain",
+    "id": [ "lab_2x1_CORE_-1W", "lab_2x1_CORE_-1E" ],
+    "name": "Lab Cargo Zone",
+    "sym": "C",
+    "color": "white",
+    "see_cost": 5,
+    "flags": [ "RISK_HIGH" ]
+  },
+  {
+    "type": "overmap_terrain",
+    "id": [
+      "lab_res_8_SWD_ground",
+      "lab_res_8_SED_ground",
+      "lab_res_8_SWU_ground",
+      "lab_res_8_SEU_ground",
+      "lab_CORE_2x1_SED_ground",
+      "lab_CORE_2x1_SWD_ground",
+      "lab_CORE_2x1_NED_ground",
+      "lab_CORE_2x1_NWD_ground",
+      "lab_CORE_2x1_WC_ground",
+      "lab_CORE_2x1_EC_ground",
+      "lab_security_z0",
+      "lab_security_z0N",
+      "lab_security_z0S"
+    ],
+    "name": "Trans-Coast Logistics",
+    "sym": "F",
+    "//": "Front/Fake company entrance for a lab.  Includes main and auxillary entrances including the start of the security tower.",
+    "color": "light_gray",
+    "see_cost": 5,
+    "spawns": { "group": "GROUP_VANILLA", "population": [ 5, 15 ], "chance": 30 },
+    "flags": [ "RISK_HIGH" ]
   }
 ]