diff --git a/code/_helpers/game.dm b/code/_helpers/game.dm
index 3c050c1819..78c6944075 100644
--- a/code/_helpers/game.dm
+++ b/code/_helpers/game.dm
@@ -339,6 +339,23 @@ proc
return 1
#undef SIGN
+/proc/flick_overlay(image/I, list/show_to, duration, gc_after)
+ for(var/client/C in show_to)
+ C.images += I
+ spawn(duration)
+ if(gc_after)
+ qdel(I)
+ for(var/client/C in show_to)
+ C.images -= I
+
+/proc/flick_overlay_view(image/I, atom/target, duration, gc_after) //wrapper for the above, flicks to everyone who can see the target atom
+ var/list/viewing = list()
+ for(var/m in viewers(target))
+ var/mob/M = m
+ if(M.client)
+ viewing += M.client
+ flick_overlay(I, viewing, duration, gc_after)
+
proc/isInSight(var/atom/A, var/atom/B)
var/turf/Aturf = get_turf(A)
var/turf/Bturf = get_turf(B)
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index 79e7beb87c..9bf89b27bd 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -201,20 +201,22 @@
L.resist()
if("mov_intent")
- if(iscarbon(usr))
- var/mob/living/carbon/C = usr
- if(C.legcuffed)
- C << "You are legcuffed! You cannot run until you get [C.legcuffed] removed!"
- C.m_intent = "walk" //Just incase
- C.hud_used.move_intent.icon_state = "walking"
- return 1
- switch(usr.m_intent)
+ if(isliving(usr))
+ if(iscarbon(usr))
+ var/mob/living/carbon/C = usr
+ if(C.legcuffed)
+ C << "You are legcuffed! You cannot run until you get [C.legcuffed] removed!"
+ C.m_intent = "walk" //Just incase
+ C.hud_used.move_intent.icon_state = "walking"
+ return 1
+ var/mob/living/L = usr
+ switch(L.m_intent)
if("run")
- usr.m_intent = "walk"
- usr.hud_used.move_intent.icon_state = "walking"
+ L.m_intent = "walk"
+ L.hud_used.move_intent.icon_state = "walking"
if("walk")
- usr.m_intent = "run"
- usr.hud_used.move_intent.icon_state = "running"
+ L.m_intent = "run"
+ L.hud_used.move_intent.icon_state = "running"
if("m_intent")
if(!usr.m_int)
switch(usr.m_intent)
@@ -485,8 +487,6 @@
if(isAI(usr))
var/mob/living/silicon/ai/AI = usr
AI.view_images()
- else
- return 0
return 1
/obj/screen/inventory/Click()
diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm
index a80ff05eac..e2a4c28c6b 100644
--- a/code/_onclick/other_mobs.dm
+++ b/code/_onclick/other_mobs.dm
@@ -73,27 +73,38 @@
Animals
*/
/mob/living/simple_animal/UnarmedAttack(var/atom/A, var/proximity)
- if(!..())
- return
-
- if(prob(spattack_prob))
- if(spattack_min_range <= 1)
- target_mob = A
- SpecialAtkTarget()
- target_mob = null
- return
-
- if(melee_damage_upper == 0 && istype(A,/mob/living))
- custom_emote(1,"[friendly] [A]!")
+ if(!(. = ..()))
return
setClickCooldown(get_attack_speed())
- if(isliving(A))
- target_mob = A
- PunchTarget()
- target_mob = null
- else
- A.attack_generic(src, rand(melee_damage_lower, melee_damage_upper), attacktext)
+
+ if(has_hands && istype(A,/obj) && a_intent != I_HURT)
+ var/obj/O = A
+ return O.attack_hand(src)
+
+ switch(a_intent)
+ if(I_HELP)
+ if(isliving(A))
+ custom_emote(1,"[pick(friendly)] [A]!")
+
+ if(I_HURT)
+ if(prob(spattack_prob))
+ if(spattack_min_range <= 1)
+ SpecialAtkTarget()
+
+ else if(melee_damage_upper == 0 && istype(A,/mob/living))
+ custom_emote(1,"[pick(friendly)] [A]!")
+
+ else
+ DoPunch(A)
+
+ if(I_GRAB)
+ if(has_hands)
+ A.attack_hand(src)
+
+ if(I_DISARM)
+ if(has_hands)
+ A.attack_hand(src)
/mob/living/simple_animal/RangedAttack(var/atom/A)
setClickCooldown(get_attack_speed())
diff --git a/code/controllers/subsystems/garbage.dm b/code/controllers/subsystems/garbage.dm
index 1ff49edba2..34b32d5873 100644
--- a/code/controllers/subsystems/garbage.dm
+++ b/code/controllers/subsystems/garbage.dm
@@ -442,4 +442,5 @@ SUBSYSTEM_DEF(garbage)
/image/Destroy()
..()
- return QDEL_HINT_HARDDEL_NOW
+ loc = null
+ return QDEL_HINT_QUEUE
diff --git a/code/datums/supplypacks/hospitality.dm b/code/datums/supplypacks/hospitality.dm
index 83d46edde1..f3de751f23 100644
--- a/code/datums/supplypacks/hospitality.dm
+++ b/code/datums/supplypacks/hospitality.dm
@@ -61,3 +61,17 @@
cost = 15
containertype = /obj/structure/closet/crate/freezer
containername = "Pizza crate"
+
+/datum/supply_packs/hospitality/gifts
+ name = "Gift crate"
+ contains = list(
+ /obj/item/toy/bouquet = 3,
+ /obj/item/weapon/storage/fancy/heartbox = 2,
+ /obj/item/weapon/paper/card/smile,
+ /obj/item/weapon/paper/card/heart,
+ /obj/item/weapon/paper/card/cat,
+ /obj/item/weapon/paper/card/flower
+ )
+ cost = 10
+ containertype = /obj/structure/closet/crate
+ containername = "crate of gifts"
\ No newline at end of file
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index 734b09ae4f..e9d93b48a3 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -52,7 +52,11 @@
if (danger_level == 0)
atmosphere_alarm.clearAlarm(src, alarm_source)
else
- atmosphere_alarm.triggerAlarm(src, alarm_source, severity = danger_level)
+ var/obj/machinery/alarm/atmosalarm = alarm_source //maybe other things can trigger these, who knows
+ if(istype(atmosalarm))
+ atmosphere_alarm.triggerAlarm(src, alarm_source, severity = danger_level, hidden = atmosalarm.alarms_hidden)
+ else
+ atmosphere_alarm.triggerAlarm(src, alarm_source, severity = danger_level)
//Check all the alarms before lowering atmosalm. Raising is perfectly fine.
for (var/obj/machinery/alarm/AA in src)
diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm
index 28557928be..775ef6a7cd 100644
--- a/code/game/machinery/alarm.dm
+++ b/code/game/machinery/alarm.dm
@@ -81,6 +81,8 @@
var/report_danger_level = 1
+ var/alarms_hidden = FALSE //If the alarms from this machine are visible on consoles
+
/obj/machinery/alarm/nobreach
breach_detection = 0
@@ -88,6 +90,9 @@
report_danger_level = 0
breach_detection = 0
+/obj/machinery/alarm/alarms_hidden
+ alarms_hidden = TRUE
+
/obj/machinery/alarm/server/New()
..()
req_access = list(access_rd, access_atmospherics, access_engine_equip)
@@ -812,6 +817,10 @@ FIRE ALARM
panel_open = 0
var/seclevel
circuit = /obj/item/weapon/circuitboard/firealarm
+ var/alarms_hidden = FALSE //If the alarms from this machine are visible on consoles
+
+/obj/machinery/firealarm/alarms_hidden
+ alarms_hidden = TRUE
/obj/machinery/firealarm/update_icon()
overlays.Cut()
@@ -980,7 +989,7 @@ FIRE ALARM
return
var/area/area = get_area(src)
for(var/obj/machinery/firealarm/FA in area)
- fire_alarm.triggerAlarm(loc, FA, duration)
+ fire_alarm.triggerAlarm(loc, FA, duration, hidden = alarms_hidden)
update_icon()
//playsound(src.loc, 'sound/ambience/signal.ogg', 75, 0)
return
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index d546ef4676..df2387e71f 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -27,7 +27,8 @@
/obj/item/toy/waterflower = 1,
/obj/random/action_figure = 1,
/obj/random/plushie = 1,
- /obj/item/toy/cultsword = 1
+ /obj/item/toy/cultsword = 1,
+ /obj/item/toy/bouquet/fake = 1
)
/obj/machinery/computer/arcade/New()
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index c616d1ee5b..673e366313 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -112,7 +112,7 @@ Class Procs:
var/panel_open = 0
var/global/gl_uid = 1
var/interact_offline = 0 // Can the machine be interacted with while de-powered.
- var/circuit = null
+ var/obj/item/weapon/circuitboard/circuit = null
/obj/machinery/New(l, d=0)
..(l)
@@ -402,7 +402,7 @@ Class Procs:
if(A.frame_type.circuit)
A.need_circuit = 0
- if(A.frame_type.frame_class == "machine")
+ if(A.frame_type.frame_class == FRAME_CLASS_MACHINE)
for(var/obj/D in component_parts)
D.forceMove(src.loc)
if(A.components)
@@ -412,15 +412,15 @@ Class Procs:
component_parts = list()
A.check_components()
- if(A.frame_type.frame_class == "alarm")
- A.state = 2
- else if(A.frame_type.frame_class == "computer" || A.frame_type.frame_class == "display")
+ if(A.frame_type.frame_class == FRAME_CLASS_ALARM)
+ A.state = FRAME_FASTENED
+ else if(A.frame_type.frame_class == FRAME_CLASS_COMPUTER || A.frame_type.frame_class == FRAME_CLASS_DISPLAY)
if(stat & BROKEN)
- A.state = 3
+ A.state = FRAME_WIRED
else
- A.state = 4
+ A.state = FRAME_PANELED
else
- A.state = 3
+ A.state = FRAME_WIRED
A.set_dir(dir)
A.pixel_x = pixel_x
@@ -430,4 +430,4 @@ Class Procs:
M.loc = null
M.deconstruct(src)
qdel(src)
- return 1
\ No newline at end of file
+ return 1
diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm
index e858100e63..47fa55be1a 100644
--- a/code/game/objects/effects/mines.dm
+++ b/code/game/objects/effects/mines.dm
@@ -1,6 +1,6 @@
/obj/effect/mine
- name = "mine"
- desc = "A small explosive mine with 'HE' and a grenade symbol on the side."
+ name = "land mine" //The name and description are deliberately NOT modified, so you can't game the mines you find.
+ desc = "A small explosive land mine."
density = 0
anchored = 1
icon = 'icons/obj/weapons.dmi'
@@ -21,6 +21,7 @@
s.set_up(3, 1, src)
s.start()
explosion(loc, 0, 2, 3, 4) //land mines are dangerous, folks.
+ visible_message("\The [src.name] detonates!")
qdel(s)
qdel(src)
@@ -38,10 +39,12 @@
/obj/effect/mine/Bumped(mob/M as mob|obj)
- if(triggered) return
+ if(triggered)
+ return
if(istype(M, /mob/living/))
- explode(M)
+ if(!M.hovering)
+ explode(M)
/obj/effect/mine/attackby(obj/item/W as obj, mob/living/user as mob)
if(isscrewdriver(W))
@@ -62,8 +65,6 @@
wires.Interact(user)
/obj/effect/mine/dnascramble
- name = "radiation mine"
- desc = "A small explosive mine with a radiation symbol on the side."
mineitemtype = /obj/item/weapon/mine/dnascramble
/obj/effect/mine/dnascramble/explode(var/mob/living/M)
@@ -71,31 +72,31 @@
triggered = 1
s.set_up(3, 1, src)
s.start()
- M.radiation += 50
- randmutb(M)
- domutcheck(M,null)
+ if(M)
+ M.radiation += 50
+ randmutb(M)
+ domutcheck(M,null)
+ visible_message("\The [src.name] flashes violently before disintegrating!")
spawn(0)
qdel(s)
qdel(src)
/obj/effect/mine/stun
- name = "stun mine"
- desc = "A small explosive mine with a lightning bolt symbol on the side."
mineitemtype = /obj/item/weapon/mine/stun
/obj/effect/mine/stun/explode(var/mob/living/M)
triggered = 1
- M.Stun(30)
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread()
s.set_up(3, 1, src)
s.start()
+ if(M)
+ M.Stun(30)
+ visible_message("\The [src.name] flashes violently before disintegrating!")
spawn(0)
qdel(s)
qdel(src)
/obj/effect/mine/n2o
- name = "nitrous oxide mine"
- desc = "A small explosive mine with three Z's on the side."
mineitemtype = /obj/item/weapon/mine/n2o
/obj/effect/mine/n2o/explode(var/mob/living/M)
@@ -103,12 +104,11 @@
for (var/turf/simulated/floor/target in range(1,src))
if(!target.blocks_air)
target.assume_gas("sleeping_agent", 30)
+ visible_message("\The [src.name] detonates!")
spawn(0)
qdel(src)
/obj/effect/mine/phoron
- name = "incendiary mine"
- desc = "A small explosive mine with a fire symbol on the side."
mineitemtype = /obj/item/weapon/mine/phoron
/obj/effect/mine/phoron/explode(var/mob/living/M)
@@ -117,12 +117,11 @@
if(!target.blocks_air)
target.assume_gas("phoron", 30)
target.hotspot_expose(1000, CELL_VOLUME)
+ visible_message("\The [src.name] detonates!")
spawn(0)
qdel(src)
/obj/effect/mine/kick
- name = "kick mine"
- desc = "Concentrated war crimes. Handle with care."
mineitemtype = /obj/item/weapon/mine/kick
/obj/effect/mine/kick/explode(var/mob/living/M)
@@ -130,14 +129,13 @@
triggered = 1
s.set_up(3, 1, src)
s.start()
- qdel(M.client)
+ if(M)
+ qdel(M.client)
spawn(0)
qdel(s)
qdel(src)
/obj/effect/mine/frag
- name = "fragmentation mine"
- desc = "A small explosive mine with 'FRAG' and a grenade symbol on the side."
mineitemtype = /obj/item/weapon/mine/frag
var/fragment_types = list(/obj/item/projectile/bullet/pellet/fragment)
var/num_fragments = 20 //total number of fragments produced by the grenade
@@ -153,13 +151,14 @@
if(!O)
return
src.fragmentate(O, 20, 7, list(/obj/item/projectile/bullet/pellet/fragment)) //only 20 weak fragments because you're stepping directly on it
+ visible_message("\The [src.name] detonates!")
spawn(0)
qdel(s)
qdel(src)
-/obj/effect/mine/training
- name = "training mine"
- desc = "A mine with its payload removed, for EOD training and demonstrations."
+/obj/effect/mine/training //Name and Desc commented out so it's possible to trick people with the training mines
+// name = "training mine"
+// desc = "A mine with its payload removed, for EOD training and demonstrations."
mineitemtype = /obj/item/weapon/mine/training
/obj/effect/mine/training/explode(var/mob/living/M)
@@ -170,56 +169,62 @@
qdel(src)
/obj/effect/mine/emp
- name = "EMP Mine"
- desc = "A small explosive mine with a lightning bolt symbol on the side."
mineitemtype = /obj/item/weapon/mine/emp
/obj/effect/mine/emp/explode(var/mob/living/M)
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread()
s.set_up(3, 1, src)
s.start()
+ visible_message("\The [src.name] flashes violently before disintegrating!")
empulse(loc, 2, 4, 7, 10, 1) // As strong as an EMP grenade
spawn(0)
qdel(src)
+/obj/effect/mine/incendiary
+ mineitemtype = /obj/item/weapon/mine/incendiary
+
+/obj/effect/mine/incendiary/explode(var/mob/living/M)
+ triggered = 1
+ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread()
+ s.set_up(3, 1, src)
+ s.start()
+ if(M)
+ M.adjust_fire_stacks(5)
+ M.fire_act()
+ visible_message("\The [src.name] bursts into flames!")
+ spawn(0)
+ qdel(src)
+
+/////////////////////////////////////////////
+// The held item version of the above mines
+/////////////////////////////////////////////
/obj/item/weapon/mine
name = "mine"
desc = "A small explosive mine with 'HE' and a grenade symbol on the side."
icon = 'icons/obj/weapons.dmi'
icon_state = "uglymine"
- var/arming = 0
var/countdown = 10
- var/minetype = /obj/effect/mine
+ var/minetype = /obj/effect/mine //This MUST be an /obj/effect/mine type, or it'll runtime.
-/obj/item/weapon/mine/attack_self(mob/user as mob)
- if(!arming)
- to_chat(user, "You prime \the [name]! [countdown] seconds!")
- icon_state = initial(icon_state) + "armed"
- arming = 1
+/obj/item/weapon/mine/attack_self(mob/user as mob) // You do not want to move or throw a land mine while priming it... Explosives + Sudden Movement = Bad Times
+ add_fingerprint(user)
+ msg_admin_attack("[user.name] ([user.ckey]) primed \a [src] (JMP)")
+ user.visible_message("[user] starts priming \the [src.name].", "You start priming \the [src.name]. Hold still!")
+ if(do_after(user, 10 SECONDS))
playsound(loc, 'sound/weapons/armbomb.ogg', 75, 1, -3)
- add_fingerprint(user)
- if(iscarbon(user))
- var/mob/living/carbon/C = user
- C.throw_mode_on()
- spawn(countdown*10)
- if(arming)
- prime()
- if(user)
- msg_admin_attack("[user.name] ([user.ckey]) primed \a [src] (JMP)")
- return
+ prime(user)
else
- to_chat(user, "You cancel \the [name]'s priming sequence.")
- arming = 0
- countdown = initial(countdown)
- icon_state = initial(icon_state)
- add_fingerprint(user)
+ visible_message("[user] triggers \the [src.name]!", "You accidentally trigger \the [src.name]!")
+ prime(user, TRUE)
return
-/obj/item/weapon/mine/proc/prime(mob/user as mob)
+/obj/item/weapon/mine/proc/prime(mob/user as mob, var/explode_now = FALSE)
visible_message("\The [src.name] beeps as the priming sequence completes.")
- var/atom/R = new minetype(get_turf(src))
+ var/obj/effect/mine/R = new minetype(get_turf(src))
src.transfer_fingerprints_to(R)
R.add_fingerprint(user)
+ if(explode_now)
+ R.explode(user)
spawn(0)
qdel(src)
@@ -262,3 +267,8 @@
name = "emp mine"
desc = "A small explosive mine with a lightning bolt symbol on the side."
minetype = /obj/effect/mine/emp
+
+/obj/item/weapon/mine/incendiary
+ name = "incendiary mine"
+ desc = "A small explosive mine with a fire symbol on the side."
+ minetype = /obj/effect/mine/incendiary
\ No newline at end of file
diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm
index 16e9daf9cc..6c1afb2c83 100644
--- a/code/game/objects/items/robot/robot_items.dm
+++ b/code/game/objects/items/robot/robot_items.dm
@@ -54,6 +54,8 @@
/obj/item/borg/sight/material
name = "\proper material scanner vision"
sight_mode = BORGMATERIAL
+ icon_state = "material"
+ icon = 'icons/obj/clothing/glasses.dmi'
/obj/item/borg/sight/hud
name = "hud"
diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm
index 784eadd3b9..ff680ab468 100644
--- a/code/game/objects/items/stacks/rods.dm
+++ b/code/game/objects/items/stacks/rods.dm
@@ -36,7 +36,7 @@
icon_state = "rods"
var/global/list/datum/stack_recipe/rods_recipes = list( \
- new/datum/stack_recipe("grille", /obj/structure/grille, 2, time = 10, one_per_turf = 1, on_floor = 1),
+ new/datum/stack_recipe("grille", /obj/structure/grille, 2, time = 10, one_per_turf = 1, on_floor = 0),
new/datum/stack_recipe("catwalk", /obj/structure/catwalk, 2, time = 80, one_per_turf = 1, on_floor = 1))
/obj/item/stack/rods/attackby(obj/item/W as obj, mob/user as mob)
@@ -44,7 +44,7 @@ var/global/list/datum/stack_recipe/rods_recipes = list( \
var/obj/item/weapon/weldingtool/WT = W
if(get_amount() < 2)
- user << "You need at least two rods to do this."
+ to_chat(user, "You need at least two rods to do this.")
return
if(WT.remove_fuel(0,user))
@@ -91,15 +91,15 @@ var/global/list/datum/stack_recipe/rods_recipes = list( \
else if(!in_use)
if(get_amount() < 2)
- user << "You need at least two rods to do this."
+ to_chat(user, "You need at least two rods to do this.")
return
- usr << "Assembling grille..."
+ to_chat(usr, "Assembling grille...")
in_use = 1
if (!do_after(usr, 10))
in_use = 0
return
var/obj/structure/grille/F = new /obj/structure/grille/ ( usr.loc )
- usr << "You assemble a grille"
+ to_chat(usr, "You assemble a grille")
in_use = 0
F.add_fingerprint(usr)
use(2)
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index 62f02816ed..c86993fa31 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -16,6 +16,7 @@
* Action figures
* Plushies
* Toy cult sword
+ * Bouquets
*/
@@ -872,6 +873,19 @@
w_class = ITEMSIZE_LARGE
attack_verb = list("attacked", "slashed", "stabbed", "poked")
+//Flowers fake & real
+
+/obj/item/toy/bouquet
+ name = "bouquet"
+ desc = "A lovely bouquet of flowers. Smells nice!"
+ icon = 'icons/obj/items.dmi'
+ icon_state = "bouquet"
+ w_class = ITEMSIZE_SMALL
+
+/obj/item/toy/bouquet/fake
+ name = "plastic bouquet"
+ desc = "A cheap plastic bouquet of flowers. Smells like cheap, toxic plastic."
+
/* NYET.
/obj/item/weapon/toddler
icon_state = "toddler"
diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm
index 3df73b9793..8cc10444ef 100644
--- a/code/game/objects/items/weapons/storage/fancy.dm
+++ b/code/game/objects/items/weapons/storage/fancy.dm
@@ -10,6 +10,8 @@
* Candle Box
* Crayon Box
* Cigarette Box
+ * Vial Box
+ * Box of Chocolates
*/
/obj/item/weapon/storage/fancy/
@@ -313,3 +315,34 @@
/obj/item/weapon/storage/lockbox/vials/attackby(obj/item/weapon/W as obj, mob/user as mob)
..()
update_icon()
+
+/*
+ * Box of Chocolates/Heart Box
+ */
+
+/obj/item/weapon/storage/fancy/heartbox
+ icon_state = "heartbox"
+ name = "box of chocolates"
+ var/startswith = 6
+ max_storage_space = ITEMSIZE_COST_SMALL * 6
+ can_hold = list(
+ /obj/item/weapon/reagent_containers/food/snacks/chocolatepiece,
+ /obj/item/weapon/reagent_containers/food/snacks/chocolatepiece/white,
+ /obj/item/weapon/reagent_containers/food/snacks/chocolatepiece/truffle
+ )
+
+/obj/item/weapon/storage/fancy/heartbox/New()
+ ..()
+ new /obj/item/weapon/reagent_containers/food/snacks/chocolatepiece(src)
+ new /obj/item/weapon/reagent_containers/food/snacks/chocolatepiece(src)
+ new /obj/item/weapon/reagent_containers/food/snacks/chocolatepiece(src)
+ new /obj/item/weapon/reagent_containers/food/snacks/chocolatepiece/white(src)
+ new /obj/item/weapon/reagent_containers/food/snacks/chocolatepiece/white(src)
+ new /obj/item/weapon/reagent_containers/food/snacks/chocolatepiece/truffle(src)
+ update_icon()
+ return
+
+/obj/item/weapon/storage/fancy/heartbox/update_icon(var/itemremoved = 0)
+ if (contents.len == 0)
+ icon_state = "heartbox_empty"
+ return
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm
index 448602d665..c3c84d1663 100644
--- a/code/game/objects/items/weapons/storage/storage.dm
+++ b/code/game/objects/items/weapons/storage/storage.dm
@@ -52,7 +52,7 @@
if(!canremove)
return
- if (ishuman(usr) || issmall(usr) || isanimal(usr) || isobserver(usr)) //so monkeys can take off their backpacks -- Urist
+ if (isliving(usr) || isobserver(usr))
if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech. why?
return
diff --git a/code/game/objects/random/random.dm b/code/game/objects/random/random.dm
index 18674db086..05ba702853 100644
--- a/code/game/objects/random/random.dm
+++ b/code/game/objects/random/random.dm
@@ -1123,4 +1123,18 @@ var/list/multi_point_spawns
/obj/item/clothing/suit/space/void/mining/alt,
/obj/item/clothing/head/helmet/space/void/mining/alt
)
- )
\ No newline at end of file
+ )
+
+/obj/random/landmine
+ name = "Random Land Mine"
+ desc = "This is a random land mine."
+ icon = 'icons/obj/weapons.dmi'
+ icon_state = "uglymine"
+ spawn_nothing_percentage = 25
+
+/obj/random/landmine/item_to_spawn()
+ return pick(prob(30);/obj/effect/mine,
+ prob(25);/obj/effect/mine/frag,
+ prob(25);/obj/effect/mine/emp,
+ prob(10);/obj/effect/mine/stun,
+ prob(10);/obj/effect/mine/incendiary,)
\ No newline at end of file
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index aec6ce94c1..6fea7e6ece 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -104,7 +104,7 @@
playsound(src, W.usesound, 100, 1)
anchored = !anchored
user.visible_message("[user] [anchored ? "fastens" : "unfastens"] the grille.", \
- "You have [anchored ? "fastened the grille to" : "unfastened the grill from"] the floor.")
+ "You have [anchored ? "fastened the grille to" : "unfastened the grille from"] the floor.")
return
//window placing begin //TODO CONVERT PROPERLY TO MATERIAL DATUM
diff --git a/code/game/objects/structures/snowman.dm b/code/game/objects/structures/snowman.dm
new file mode 100644
index 0000000000..b3947621b9
--- /dev/null
+++ b/code/game/objects/structures/snowman.dm
@@ -0,0 +1,24 @@
+/obj/structure/snowman
+ name = "snowman"
+ icon = 'icons/obj/snowman.dmi'
+ icon_state = "snowman"
+ desc = "A happy little snowman smiles back at you!"
+ anchored = 1
+
+/obj/structure/snowman/attack_hand(mob/user as mob)
+ if(user.a_intent == I_HURT)
+ user << "In one hit, [src] easily crumples into a pile of snow. You monster."
+ var/turf/simulated/floor/F = get_turf(src)
+ if (istype(F))
+ new /obj/item/stack/material/snow(F)
+ qdel(src)
+
+/obj/structure/snowman/borg
+ name = "snowborg"
+ icon_state = "snowborg"
+ desc = "A snowy little robot. It even has a monitor for a head."
+
+/obj/structure/snowman/spider
+ name = "snow spider"
+ icon_state = "snowspider"
+ desc = "An impressively crafted snow spider. Not nearly as creepy as the real thing."
\ No newline at end of file
diff --git a/code/game/turfs/simulated/wall_types.dm b/code/game/turfs/simulated/wall_types.dm
index 699125e0b3..f187a54c8f 100644
--- a/code/game/turfs/simulated/wall_types.dm
+++ b/code/game/turfs/simulated/wall_types.dm
@@ -39,6 +39,8 @@
..(newloc,"silver","gold")
/turf/simulated/wall/sandstonediamond/New(var/newloc)
..(newloc,"sandstone","diamond")
+/turf/simulated/wall/snowbrick/New(var/newloc)
+ ..(newloc,"packed snow")
// Kind of wondering if this is going to bite me in the butt.
/turf/simulated/wall/skipjack/New(var/newloc)
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 7258b265a2..04740237f1 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -59,7 +59,6 @@ var/list/admin_verbs_admin = list(
/client/proc/check_antagonists,
/client/proc/admin_memo, //admin memo system. show/delete/write. +SERVER needed to delete admin memos of others,
/client/proc/dsay, //talk in deadchat using our ckey/fakekey,
- /client/proc/ghost_view, //let us see ghosts WHENEVERRRR
// /client/proc/toggle_hear_deadcast, //toggles whether we hear deadchat,
/client/proc/investigate_show, //various admintools for investigation. Such as a singulo grief-log,
/client/proc/secrets,
@@ -213,7 +212,6 @@ var/list/admin_verbs_debug = list(
/client/proc/jumptomob,
/client/proc/jumptocoord,
/client/proc/dsay,
- /client/proc/ghost_view,
/client/proc/toggle_debug_logs,
/client/proc/admin_ghost, //allows us to ghost/reenter body at will,
/datum/admins/proc/view_runtimes,
@@ -326,7 +324,6 @@ var/list/admin_verbs_mod = list(
/datum/admins/proc/show_player_info,
/client/proc/player_panel_new,
/client/proc/dsay,
- /client/proc/ghost_view,
/datum/admins/proc/show_skills,
/datum/admins/proc/show_player_panel,
/client/proc/check_antagonists,
@@ -351,7 +348,6 @@ var/list/admin_verbs_event_manager = list(
/client/proc/admin_ghost,
/datum/admins/proc/show_player_info,
/client/proc/dsay,
- /client/proc/ghost_view,
/client/proc/cmd_admin_subtle_message,
/client/proc/debug_variables,
/client/proc/check_antagonists,
@@ -491,26 +487,6 @@ var/list/admin_verbs_event_manager = list(
body.key = "@[key]" //Haaaaaaaack. But the people have spoken. If it breaks; blame adminbus
feedback_add_details("admin_verb","O") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-/client/proc/ghost_view()
- set category = "Admin"
- set name = "Ghost View"
- set desc = "Toggles ability to see ghosts, even while in a mob."
- if(!holder) return
- if(!mob.plane_holder) return
-
- var/choice = alert(src,"Do you want to see ghosts, or not?","Ghost viewing","Show 'em!","Cancel","Hide 'em!")
- if(choice == "Cancel")
- return
-
- if(choice == "Show 'em!" && mob.plane_holder)
- mob.plane_holder.set_vis(VIS_GHOSTS,TRUE)
- usr.see_invisible = SEE_INVISIBLE_CULT
- to_chat(src,"Ghosts are now visible (while in this mob).")
- else if(mob.plane_holder)
- mob.plane_holder.set_vis(VIS_GHOSTS,FALSE)
- usr.see_invisible = initial(mob.see_invisible)
- to_chat(src,"Ghosts are now hidden (while in this mob).")
-
/client/proc/invisimin()
set name = "Invisimin"
set category = "Admin"
@@ -1046,7 +1022,7 @@ var/list/admin_verbs_event_manager = list(
set category = "Fun"
set name = "Man Up"
set desc = "Tells mob to man up and deal with it."
-
+
if(alert("Are you sure you want to tell them to man up?","Confirmation","Deal with it","No")=="No") return
T << "Man up and deal with it."
@@ -1059,7 +1035,7 @@ var/list/admin_verbs_event_manager = list(
set category = "Fun"
set name = "Man Up Global"
set desc = "Tells everyone to man up and deal with it."
-
+
if(alert("Are you sure you want to tell the whole server up?","Confirmation","Deal with it","No")=="No") return
for (var/mob/T as mob in mob_list)
diff --git a/code/modules/alarm/alarm.dm b/code/modules/alarm/alarm.dm
index d0a6a8be4c..26ffdade04 100644
--- a/code/modules/alarm/alarm.dm
+++ b/code/modules/alarm/alarm.dm
@@ -23,12 +23,13 @@
var/area/last_name //The last acquired name, used should origin be lost
var/area/last_camera_area //The last area in which cameras where fetched, used to see if the camera list should be updated.
var/end_time //Used to set when this alarm should clear, in case the origin is lost.
+ var/hidden = FALSE //If this alarm can be seen from consoles or other things.
-/datum/alarm/New(var/atom/origin, var/atom/source, var/duration, var/severity)
+/datum/alarm/New(var/atom/origin, var/atom/source, var/duration, var/severity, var/hidden)
src.origin = origin
cameras() // Sets up both cameras and last alarm area.
- set_source_data(source, duration, severity)
+ set_source_data(source, duration, severity, hidden)
/datum/alarm/proc/process()
// Has origin gone missing?
@@ -43,17 +44,19 @@
AS.duration = 0
AS.end_time = world.time + ALARM_RESET_DELAY
-/datum/alarm/proc/set_source_data(var/atom/source, var/duration, var/severity)
+/datum/alarm/proc/set_source_data(var/atom/source, var/duration, var/severity, var/hidden)
var/datum/alarm_source/AS = sources_assoc[source]
if(!AS)
AS = new/datum/alarm_source(source)
sources += AS
sources_assoc[source] = AS
+ src.hidden = hidden
// Currently only non-0 durations can be altered (normal alarms VS EMP blasts)
if(AS.duration)
duration = SecondsToTicks(duration)
AS.duration = duration
AS.severity = severity
+ src.hidden = min(src.hidden, hidden)
/datum/alarm/proc/clear(var/source)
var/datum/alarm_source/AS = sources_assoc[source]
diff --git a/code/modules/alarm/alarm_handler.dm b/code/modules/alarm/alarm_handler.dm
index afa45d7649..a07ca8bd3b 100644
--- a/code/modules/alarm/alarm_handler.dm
+++ b/code/modules/alarm/alarm_handler.dm
@@ -12,7 +12,7 @@
A.process()
check_alarm_cleared(A)
-/datum/alarm_handler/proc/triggerAlarm(var/atom/origin, var/atom/source, var/duration = 0, var/severity = 1)
+/datum/alarm_handler/proc/triggerAlarm(var/atom/origin, var/atom/source, var/duration = 0, var/severity = 1, var/hidden = 0)
var/new_alarm
//Proper origin and source mandatory
if(!(origin && source))
@@ -23,9 +23,9 @@
//see if there is already an alarm of this origin
var/datum/alarm/existing = alarms_assoc[origin]
if(existing)
- existing.set_source_data(source, duration, severity)
+ existing.set_source_data(source, duration, severity, hidden)
else
- existing = new/datum/alarm(origin, source, duration, severity)
+ existing = new/datum/alarm(origin, source, duration, severity, hidden)
new_alarm = 1
alarms |= existing
@@ -48,10 +48,10 @@
return check_alarm_cleared(existing)
/datum/alarm_handler/proc/major_alarms()
- return alarms
+ return visible_alarms()
/datum/alarm_handler/proc/minor_alarms()
- return alarms
+ return visible_alarms()
/datum/alarm_handler/proc/check_alarm_cleared(var/datum/alarm/alarm)
if ((alarm.end_time && world.time > alarm.end_time) || !alarm.sources.len)
@@ -63,7 +63,7 @@
/datum/alarm_handler/proc/on_alarm_change(var/datum/alarm/alarm, var/was_raised)
for(var/obj/machinery/camera/C in alarm.cameras())
- if(was_raised)
+ if(was_raised && !alarm.hidden)
C.add_network(category)
else
C.remove_network(category)
@@ -95,3 +95,10 @@
/datum/alarm_handler/proc/notify_listeners(var/alarm, var/was_raised)
for(var/listener in listeners)
call(listener, listeners[listener])(src, alarm, was_raised)
+
+/datum/alarm_handler/proc/visible_alarms()
+ var/list/visible_alarms = new()
+ for(var/datum/alarm/A in alarms)
+ if(!A.hidden)
+ visible_alarms.Add(A)
+ return visible_alarms
\ No newline at end of file
diff --git a/code/modules/alarm/atmosphere_alarm.dm b/code/modules/alarm/atmosphere_alarm.dm
index 9751319111..94f2e91e05 100644
--- a/code/modules/alarm/atmosphere_alarm.dm
+++ b/code/modules/alarm/atmosphere_alarm.dm
@@ -1,19 +1,16 @@
/datum/alarm_handler/atmosphere
category = "Atmosphere Alarms"
-/datum/alarm_handler/atmosphere/triggerAlarm(var/atom/origin, var/atom/source, var/duration = 0, var/severity = 1)
- ..()
-
/datum/alarm_handler/atmosphere/major_alarms()
var/list/major_alarms = new()
- for(var/datum/alarm/A in alarms)
+ for(var/datum/alarm/A in visible_alarms())
if(A.max_severity() > 1)
major_alarms.Add(A)
return major_alarms
/datum/alarm_handler/atmosphere/minor_alarms()
var/list/minor_alarms = new()
- for(var/datum/alarm/A in alarms)
+ for(var/datum/alarm/A in visible_alarms())
if(A.max_severity() == 1)
minor_alarms.Add(A)
return minor_alarms
diff --git a/code/modules/client/preference_setup/global/setting_datums.dm b/code/modules/client/preference_setup/global/setting_datums.dm
index 71559fed0e..07047c36df 100644
--- a/code/modules/client/preference_setup/global/setting_datums.dm
+++ b/code/modules/client/preference_setup/global/setting_datums.dm
@@ -98,6 +98,12 @@ var/list/_client_preferences_by_type
enabled_description = "Show"
disabled_description = "Hide"
+/datum/client_preference/attack_icons
+ description ="Attack icons"
+ key = "ATTACK_ICONS"
+ enabled_description = "Show"
+ disabled_description = "Hide"
+
/datum/client_preference/show_typing_indicator
description ="Typing indicator"
key = "SHOW_TYPING"
diff --git a/code/modules/client/preference_setup/loadout/loadout_suit.dm b/code/modules/client/preference_setup/loadout/loadout_suit.dm
index 0208c234d4..76bbebcc3f 100644
--- a/code/modules/client/preference_setup/loadout/loadout_suit.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_suit.dm
@@ -181,27 +181,22 @@
/datum/gear/suit/roles/poncho/security
display_name = "poncho, security"
path = /obj/item/clothing/accessory/poncho/roles/security
- allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer")
/datum/gear/suit/roles/poncho/medical
display_name = "poncho, medical"
path = /obj/item/clothing/accessory/poncho/roles/medical
- allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist", "Psychiatrist")
/datum/gear/suit/roles/poncho/engineering
display_name = "poncho, engineering"
path = /obj/item/clothing/accessory/poncho/roles/engineering
- allowed_roles = list("Chief Engineer","Atmospheric Technician", "Station Engineer")
/datum/gear/suit/roles/poncho/science
display_name = "poncho, science"
path = /obj/item/clothing/accessory/poncho/roles/science
- allowed_roles = list("Research Director","Scientist", "Roboticist", "Xenobiologist")
/datum/gear/suit/roles/poncho/cargo
display_name = "poncho, cargo"
path = /obj/item/clothing/accessory/poncho/roles/cargo
- allowed_roles = list("Quartermaster","Cargo Technician")
/datum/gear/suit/roles/poncho/cloak/hos
display_name = "cloak, head of security"
diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm
index 370306539a..ef9d0e713d 100644
--- a/code/modules/clothing/gloves/color.dm
+++ b/code/modules/clothing/gloves/color.dm
@@ -9,10 +9,11 @@
desc = "These gloves are cheap copies of proper insulated gloves. No way this can end badly."
name = "budget insulated gloves"
icon_state = "yellow"
- siemens_coefficient = 1 //Set to a default of 1, gets overridden in New()
+ siemens_coefficient = 1 //Set to a default of 1, gets overridden in initialize()
permeability_coefficient = 0.05
-/obj/item/clothing/gloves/fyellow/New()
+/obj/item/clothing/gloves/fyellow/initialize()
+ . = ..()
//Picks a value between 0 and 1, in 5% increments
var/shock_pick = rand(0,20)
siemens_coefficient = shock_pick * 0.05
diff --git a/code/modules/lore_codex/codex.dm b/code/modules/lore_codex/codex.dm
index b440189021..67027beb74 100644
--- a/code/modules/lore_codex/codex.dm
+++ b/code/modules/lore_codex/codex.dm
@@ -28,6 +28,7 @@
name = "Daedalus Pocket Newscaster"
desc = "A regularly-updating compendium of articles on current events. Essential for new arrivals in the Vir system and anyone interested in politics."
icon_state = "newscodex"
+ w_class = ITEMSIZE_SMALL
root_type = /datum/lore/codex/category/main_news
// Combines SOP/Regs/Law
@@ -37,4 +38,4 @@
Internal Affairs."
icon_state = "corp_regs"
root_type = /datum/lore/codex/category/main_corp_regs
- throwforce = 5 // Throw the book at 'em.
\ No newline at end of file
+ throwforce = 5 // Throw the book at 'em.
diff --git a/code/modules/materials/material_recipes.dm b/code/modules/materials/material_recipes.dm
index 6a10383f76..bb5a4674f4 100644
--- a/code/modules/materials/material_recipes.dm
+++ b/code/modules/materials/material_recipes.dm
@@ -167,4 +167,19 @@
/material/snow/generate_recipes()
recipes = list()
- recipes += new/datum/stack_recipe("snowball", /obj/item/weapon/material/snow/snowball, 1, time = 10)
\ No newline at end of file
+ recipes += new/datum/stack_recipe("snowball", /obj/item/weapon/material/snow/snowball, 1, time = 10)
+ recipes += new/datum/stack_recipe("snow brick", /obj/item/stack/material/snowbrick, 2, time = 10)
+ recipes += new/datum/stack_recipe("snowman", /obj/structure/snowman, 2, time = 15)
+ recipes += new/datum/stack_recipe("snow robot", /obj/structure/snowman/borg, 2, time = 10)
+ recipes += new/datum/stack_recipe("snow spider", /obj/structure/snowman/spider, 3, time = 20)
+
+/material/snowbrick/generate_recipes()
+ recipes = list()
+ recipes += new/datum/stack_recipe("[display_name] door", /obj/structure/simple_door, 10, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
+ recipes += new/datum/stack_recipe("[display_name] barricade", /obj/structure/barricade, 5, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
+ recipes += new/datum/stack_recipe("[display_name] stool", /obj/item/weapon/stool, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
+ recipes += new/datum/stack_recipe("[display_name] chair", /obj/structure/bed/chair, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
+ recipes += new/datum/stack_recipe("[display_name] bed", /obj/structure/bed, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
+ recipes += new/datum/stack_recipe("[display_name] double bed", /obj/structure/bed/double, 4, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
+ recipes += new/datum/stack_recipe("[display_name] wall girders", /obj/structure/girder, 2, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
+ recipes += new/datum/stack_recipe("[display_name] ashtray", /obj/item/weapon/material/ashtray, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
\ No newline at end of file
diff --git a/code/modules/materials/material_sheets.dm b/code/modules/materials/material_sheets.dm
index d212851071..54d56fd773 100644
--- a/code/modules/materials/material_sheets.dm
+++ b/code/modules/materials/material_sheets.dm
@@ -269,10 +269,16 @@
/obj/item/stack/material/snow
name = "snow"
- desc = "The temptation to build a snowfort rises."
+ desc = "The temptation to build a snowman rises."
icon_state = "sheet-snow"
default_type = "snow"
+/obj/item/stack/material/snowbrick
+ name = "snow brick"
+ desc = "For all of your igloo building needs."
+ icon_state = "sheet-snowbrick"
+ default_type = "packed snow"
+
/obj/item/stack/material/leather
name = "leather"
desc = "The by-product of mob grinding."
diff --git a/code/modules/materials/materials.dm b/code/modules/materials/materials.dm
index 2aad17f180..9137fb416c 100644
--- a/code/modules/materials/materials.dm
+++ b/code/modules/materials/materials.dm
@@ -752,6 +752,7 @@ var/list/name_to_material
stack_origin_tech = list(TECH_MATERIAL = 1)
door_icon_base = "wood"
destruction_desc = "crumples"
+ radiation_resistance = 1
/material/snow
name = MAT_SNOW
@@ -769,6 +770,25 @@ var/list/name_to_material
destruction_desc = "crumples"
sheet_singular_name = "pile"
sheet_plural_name = "pile" //Just a bigger pile
+ radiation_resistance = 1
+
+/material/snowbrick //only slightly stronger than snow, used to make igloos mostly
+ name = "packed snow"
+ flags = MATERIAL_BRITTLE
+ stack_type = /obj/item/stack/material/snowbrick
+ icon_base = "stone"
+ icon_reinf = "reinf_stone"
+ icon_colour = "#D8FDFF"
+ integrity = 50
+ weight = 2
+ hardness = 2
+ protectiveness = 0 // 0%
+ stack_origin_tech = list(TECH_MATERIAL = 1)
+ melting_point = T0C+1
+ destruction_desc = "crumbles"
+ sheet_singular_name = "brick"
+ sheet_plural_name = "bricks"
+ radiation_resistance = 1
/material/cloth //todo
name = "cloth"
diff --git a/code/modules/mob/_modifiers/traits_phobias.dm b/code/modules/mob/_modifiers/traits_phobias.dm
index c96c6890e6..0fbe099c22 100644
--- a/code/modules/mob/_modifiers/traits_phobias.dm
+++ b/code/modules/mob/_modifiers/traits_phobias.dm
@@ -204,6 +204,9 @@
if(istype(thing, /obj/item/toy/plushie/spider)) // Plushies are spooky so people can be assholes with them.
fear_amount += 1
+ if(istype(thing, /obj/structure/snowman/spider)) //Snow spiders are also spooky so people can be assholes with those too.
+ fear_amount += 1
+
if(istype(thing, /mob/living/simple_animal/hostile/giant_spider)) // Actual giant spiders are the scariest of them all.
var/mob/living/simple_animal/hostile/giant_spider/S = thing
if(S.stat == DEAD) // Dead giant spiders are less scary than alive ones.
@@ -437,7 +440,7 @@
fear_amount += 1
if(istype(S.species, /datum/species/shapeshifter/promethean))
fear_amount += 4
-
+
return fear_amount
/datum/modifier/trait/phobia/trypanophobe
diff --git a/code/modules/mob/animations.dm b/code/modules/mob/animations.dm
index 5ba954106b..9074357afa 100644
--- a/code/modules/mob/animations.dm
+++ b/code/modules/mob/animations.dm
@@ -140,39 +140,86 @@ note dizziness decrements automatically in the mob's Life() proc.
//reset the pixel offsets to zero
is_floating = 0
-/atom/movable/proc/do_attack_animation(mob/M)
+/atom/movable/proc/do_attack_animation(atom/A)
var/pixel_x_diff = 0
var/pixel_y_diff = 0
- var/direction = get_dir(src, M)
- switch(direction)
- if(NORTH)
- pixel_y_diff = 8
- if(SOUTH)
- pixel_y_diff = -8
- if(EAST)
- pixel_x_diff = 8
- if(WEST)
- pixel_x_diff = -8
- if(NORTHEAST)
- pixel_x_diff = 8
- pixel_y_diff = 8
- if(NORTHWEST)
- pixel_x_diff = -8
- pixel_y_diff = 8
- if(SOUTHEAST)
- pixel_x_diff = 8
- pixel_y_diff = -8
- if(SOUTHWEST)
- pixel_x_diff = -8
- pixel_y_diff = -8
- animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff, time = 2)
- animate(pixel_x = old_x, pixel_y = old_y, time = 2)
+ var/direction = get_dir(src, A)
+ if(direction & NORTH)
+ pixel_y_diff = 8
+ else if(direction & SOUTH)
+ pixel_y_diff = -8
-/mob/do_attack_animation(atom/A)
+ if(direction & EAST)
+ pixel_x_diff = 8
+ else if(direction & WEST)
+ pixel_x_diff = -8
+
+ var/default_pixel_x = initial(pixel_x)
+ var/default_pixel_y = initial(pixel_y)
+ var/mob/mob = src
+ if(istype(mob))
+ default_pixel_x = mob.default_pixel_x
+ default_pixel_y = mob.default_pixel_y
+
+ animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff, time = 2)
+ animate(pixel_x = default_pixel_x, pixel_y = default_pixel_y, time = 2)
+
+/mob/living/do_attack_animation(atom/A)
..()
is_floating = 0 // If we were without gravity, the bouncing animation got stopped, so we make sure we restart the bouncing after the next movement.
+ // What icon do we use for the attack?
+ var/obj/used_item
+ if(hand && l_hand) // Attacked with item in left hand.
+ used_item = l_hand
+ else if (!hand && r_hand) // Attacked with item in right hand.
+ used_item = r_hand
+
+ //Couldn't find an item, do they have a sprite specified (like animal claw stuff?)
+ if(!used_item && !(attack_icon && attack_icon_state))
+ return FALSE //Didn't find an item, not doing animation.
+
+ var/image/I
+
+ if(used_item) //Found an in-hand item to animate
+ I = image(used_item.icon, A, used_item.icon_state, A.layer + 1)
+ //Color the icon
+ I.color = used_item.color
+ // Scale the icon.
+ I.transform *= 0.75
+ else //They had a hardcoded one specified
+ I = image(attack_icon, A, attack_icon_state, A.layer + 1)
+ I.dir = dir
+
+ //Check for clients with pref enabled
+ var/list/viewing = list()
+ for(var/m in viewers(A))
+ var/mob/M = m
+ var/client/C = M.client
+ if(C && C.is_preference_enabled(/datum/client_preference/attack_icons))
+ viewing += M.client
+ flick_overlay(I, viewing, 5, TRUE) // 5 ticks/half a second
+
+ // Set the direction of the icon animation.
+ var/direction = get_dir(src, A)
+ if(direction & NORTH)
+ I.pixel_y = -16
+ else if(direction & SOUTH)
+ I.pixel_y = 16
+
+ if(direction & EAST)
+ I.pixel_x = -16
+ else if(direction & WEST)
+ I.pixel_x = 16
+
+ if(!direction) // Attacked self?!
+ I.pixel_z = 16
+
+ // And animate the attack!
+ animate(I, alpha = 175, pixel_x = 0, pixel_y = 0, pixel_z = 0, time = 3)
+ return TRUE //Found an item, doing item attack animation.
+
/mob/proc/spin(spintime, speed)
spawn()
var/D = dir
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 7de4ffc901..0c42876b42 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -137,33 +137,6 @@
return shock_damage
-/mob/proc/swap_hand()
- return
-
-/mob/living/carbon/swap_hand()
- src.hand = !( src.hand )
- if(hud_used.l_hand_hud_object && hud_used.r_hand_hud_object)
- if(hand) //This being 1 means the left hand is in use
- hud_used.l_hand_hud_object.icon_state = "l_hand_active"
- hud_used.r_hand_hud_object.icon_state = "r_hand_inactive"
- else
- hud_used.l_hand_hud_object.icon_state = "l_hand_inactive"
- hud_used.r_hand_hud_object.icon_state = "r_hand_active"
- return
-
-/mob/living/carbon/proc/activate_hand(var/selhand) //0 or "r" or "right" for right hand; 1 or "l" or "left" for left hand.
-
- if(istext(selhand))
- selhand = lowertext(selhand)
-
- if(selhand == "right" || selhand == "r")
- selhand = 0
- if(selhand == "left" || selhand == "l")
- selhand = 1
-
- if(selhand != src.hand)
- swap_hand()
-
/mob/living/carbon/proc/help_shake_act(mob/living/carbon/M)
if (src.health >= config.health_threshold_crit)
if(src == M && istype(src, /mob/living/carbon/human))
@@ -320,62 +293,6 @@
update_icons_layers(FALSE) //apply the now updated overlays to the mob
update_icons_body()
-//Throwing stuff
-/mob/proc/throw_item(atom/target)
- return
-
-/mob/living/carbon/throw_item(atom/target)
- src.throw_mode_off()
- if(usr.stat || !target)
- return
- if(target.type == /obj/screen) return
-
- var/atom/movable/item = src.get_active_hand()
-
- if(!item) return
-
- var/throw_range = item.throw_range
- if (istype(item, /obj/item/weapon/grab))
- var/obj/item/weapon/grab/G = item
- item = G.throw_held() //throw the person instead of the grab
- if(ismob(item))
- var/mob/M = item
-
- //limit throw range by relative mob size
- throw_range = round(M.throw_range * min(src.mob_size/M.mob_size, 1))
-
- var/turf/start_T = get_turf(loc) //Get the start and target tile for the descriptors
- var/turf/end_T = get_turf(target)
- if(start_T && end_T)
- var/start_T_descriptor = "tile at [start_T.x], [start_T.y], [start_T.z] in area [get_area(start_T)]"
- var/end_T_descriptor = "tile at [end_T.x], [end_T.y], [end_T.z] in area [get_area(end_T)]"
-
- M.attack_log += text("\[[time_stamp()]\] Has been thrown by [usr.name] ([usr.ckey]) from [start_T_descriptor] with the target [end_T_descriptor]")
- usr.attack_log += text("\[[time_stamp()]\] Has thrown [M.name] ([M.ckey]) from [start_T_descriptor] with the target [end_T_descriptor]")
- msg_admin_attack("[usr.name] ([usr.ckey]) has thrown [M.name] ([M.ckey]) from [start_T_descriptor] with the target [end_T_descriptor] (JMP)")
-
- src.drop_from_inventory(item)
- if(!item || !isturf(item.loc))
- return
-
- //actually throw it!
- src.visible_message("[src] has thrown [item].")
-
- if(!src.lastarea)
- src.lastarea = get_area(src.loc)
- if((istype(src.loc, /turf/space)) || (src.lastarea.has_gravity == 0))
- src.inertia_dir = get_dir(target, src)
- step(src, inertia_dir)
-
-
-/*
- if(istype(src.loc, /turf/space) || (src.flags & NOGRAV)) //they're in space, move em one space in the opposite direction
- src.inertia_dir = get_dir(target, src)
- step(src, inertia_dir)
-*/
-
-
- item.throw_at(target, throw_range, item.throw_speed, src)
/mob/living/carbon/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
..()
diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm
index 183b9a59e1..2e4ff84563 100644
--- a/code/modules/mob/living/carbon/human/human_attackhand.dm
+++ b/code/modules/mob/living/carbon/human/human_attackhand.dm
@@ -8,7 +8,7 @@
return u_attack
return null
-/mob/living/carbon/human/attack_hand(mob/living/carbon/M as mob)
+/mob/living/carbon/human/attack_hand(mob/living/M as mob)
var/datum/gender/TT = gender_datums[M.get_visible_gender()]
var/mob/living/carbon/human/H = M
if(istype(H))
@@ -18,7 +18,8 @@
if(!temp || !temp.is_usable())
H << "You can't use your hand."
return
- H.break_cloak()
+ M.break_cloak()
+
..()
// Should this all be in Touch()?
@@ -64,7 +65,8 @@
return
if(istype(M,/mob/living/carbon))
- M.spread_disease_to(src, "Contact")
+ var/mob/living/carbon/C = M
+ C.spread_disease_to(src, "Contact")
switch(M.a_intent)
if(I_HELP)
diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm
index 5e3d9e59b3..700e55dcec 100644
--- a/code/modules/mob/living/carbon/human/human_movement.dm
+++ b/code/modules/mob/living/carbon/human/human_movement.dm
@@ -189,7 +189,7 @@
volume *= 0.5
else if(shoes)
var/obj/item/clothing/shoes/feet = shoes
- if(feet)
+ if(istype(feet))
volume *= feet.step_volume_mod
if(!has_organ(BP_L_FOOT) && !has_organ(BP_R_FOOT))
diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm
index c825008837..6b02734a7e 100644
--- a/code/modules/mob/living/life.dm
+++ b/code/modules/mob/living/life.dm
@@ -207,13 +207,17 @@
return TRUE
else if(glow_toggle)
- set_light(2, l_color = glow_color) //2 is PDA brightness, so neutral in terms of balance
+ set_light(glow_range, glow_intensity, glow_color)
else
set_light(0)
return FALSE
/mob/living/proc/handle_darksight()
+ if(!seedarkness) //Cheap 'always darksight' var
+ dsoverlay.alpha = 255
+ return
+
var/darksightedness = min(see_in_dark/world.view,1.0) //A ratio of how good your darksight is, from 'nada' to 'really darn good'
var/current = dsoverlay.alpha/255 //Our current adjustedness
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 8399c224ce..6c35871ab9 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -1085,3 +1085,80 @@ default behaviour is:
else // No colors, so remove the client's color.
animate(client, color = null, time = 10)
+
+/mob/living/swap_hand()
+ src.hand = !( src.hand )
+ if(hud_used.l_hand_hud_object && hud_used.r_hand_hud_object)
+ if(hand) //This being 1 means the left hand is in use
+ hud_used.l_hand_hud_object.icon_state = "l_hand_active"
+ hud_used.r_hand_hud_object.icon_state = "r_hand_inactive"
+ else
+ hud_used.l_hand_hud_object.icon_state = "l_hand_inactive"
+ hud_used.r_hand_hud_object.icon_state = "r_hand_active"
+ return
+
+/mob/living/proc/activate_hand(var/selhand) //0 or "r" or "right" for right hand; 1 or "l" or "left" for left hand.
+
+ if(istext(selhand))
+ selhand = lowertext(selhand)
+
+ if(selhand == "right" || selhand == "r")
+ selhand = 0
+ if(selhand == "left" || selhand == "l")
+ selhand = 1
+
+ if(selhand != src.hand)
+ swap_hand()
+
+/mob/living/throw_item(atom/target)
+ src.throw_mode_off()
+ if(usr.stat || !target)
+ return
+ if(target.type == /obj/screen) return
+
+ var/atom/movable/item = src.get_active_hand()
+
+ if(!item) return
+
+ var/throw_range = item.throw_range
+ if (istype(item, /obj/item/weapon/grab))
+ var/obj/item/weapon/grab/G = item
+ item = G.throw_held() //throw the person instead of the grab
+ if(ismob(item))
+ var/mob/M = item
+
+ //limit throw range by relative mob size
+ throw_range = round(M.throw_range * min(src.mob_size/M.mob_size, 1))
+
+ var/turf/start_T = get_turf(loc) //Get the start and target tile for the descriptors
+ var/turf/end_T = get_turf(target)
+ if(start_T && end_T)
+ var/start_T_descriptor = "tile at [start_T.x], [start_T.y], [start_T.z] in area [get_area(start_T)]"
+ var/end_T_descriptor = "tile at [end_T.x], [end_T.y], [end_T.z] in area [get_area(end_T)]"
+
+ M.attack_log += text("\[[time_stamp()]\] Has been thrown by [usr.name] ([usr.ckey]) from [start_T_descriptor] with the target [end_T_descriptor]")
+ usr.attack_log += text("\[[time_stamp()]\] Has thrown [M.name] ([M.ckey]) from [start_T_descriptor] with the target [end_T_descriptor]")
+ msg_admin_attack("[usr.name] ([usr.ckey]) has thrown [M.name] ([M.ckey]) from [start_T_descriptor] with the target [end_T_descriptor] (JMP)")
+
+ src.drop_from_inventory(item)
+ if(!item || !isturf(item.loc))
+ return
+
+ //actually throw it!
+ src.visible_message("[src] has thrown [item].")
+
+ if(!src.lastarea)
+ src.lastarea = get_area(src.loc)
+ if((istype(src.loc, /turf/space)) || (src.lastarea.has_gravity == 0))
+ src.inertia_dir = get_dir(target, src)
+ step(src, inertia_dir)
+
+
+/*
+ if(istype(src.loc, /turf/space) || (src.flags & NOGRAV)) //they're in space, move em one space in the opposite direction
+ src.inertia_dir = get_dir(target, src)
+ step(src, inertia_dir)
+*/
+
+
+ item.throw_at(target, throw_range, item.throw_speed, src)
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index a7f85be9a8..b36cd29d21 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -47,8 +47,10 @@
var/evasion = 0 // Makes attacks harder to land. Negative numbers increase hit chance.
var/force_max_speed = 0 // If 1, the mob runs extremely fast and cannot be slowed.
-
+
var/image/dsoverlay = null //Overlay used for darksight eye adjustments
var/glow_toggle = 0 // If they're glowing!
+ var/glow_range = 2
+ var/glow_intensity = null
var/glow_color = "#FFFFFF" // The color they're glowing!
diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm
index 8299258184..349432e3d2 100644
--- a/code/modules/mob/living/silicon/robot/life.dm
+++ b/code/modules/mob/living/silicon/robot/life.dm
@@ -151,7 +151,7 @@
return 1
/mob/living/silicon/robot/handle_regular_hud_updates()
-
+ var/fullbright = FALSE
if (src.stat == 2 || (XRAY in mutations) || (src.sight_mode & BORGXRAY))
src.sight |= SEE_TURFS
src.sight |= SEE_MOBS
@@ -163,18 +163,22 @@
src.sight |= SEE_MOBS
src.see_in_dark = 8
see_invisible = SEE_INVISIBLE_MINIMUM
+ fullbright = TRUE
else if (src.sight_mode & BORGMESON)
src.sight |= SEE_TURFS
src.see_in_dark = 8
see_invisible = SEE_INVISIBLE_MINIMUM
+ fullbright = TRUE
else if (src.sight_mode & BORGMATERIAL)
src.sight |= SEE_OBJS
src.see_in_dark = 8
see_invisible = SEE_INVISIBLE_MINIMUM
+ fullbright = TRUE
else if (src.sight_mode & BORGTHERM)
src.sight |= SEE_MOBS
src.see_in_dark = 8
src.see_invisible = SEE_INVISIBLE_LEVEL_TWO
+ fullbright = TRUE
else if (!seedarkness)
src.sight &= ~SEE_MOBS
src.sight &= ~SEE_TURFS
@@ -188,7 +192,7 @@
src.see_in_dark = 8 // see_in_dark means you can FAINTLY see in the dark, humans have a range of 3 or so, tajaran have it at 8
src.see_invisible = SEE_INVISIBLE_LIVING // This is normal vision (25), setting it lower for normal vision means you don't "see" things like darkness since darkness
// has a "invisible" value of 15
-
+ plane_holder.set_vis(VIS_FULLBRIGHT,fullbright)
..()
if (src.healths)
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index 689d27dce8..09321af981 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -322,6 +322,8 @@
/mob/living/silicon/proc/receive_alarm(var/datum/alarm_handler/alarm_handler, var/datum/alarm/alarm, was_raised)
if(!next_alarm_notice)
next_alarm_notice = world.time + SecondsToTicks(10)
+ if(alarm.hidden)
+ return
var/list/alarms = queued_alarms[alarm_handler]
if(was_raised)
diff --git a/code/modules/mob/living/simple_animal/aliens/alien.dm b/code/modules/mob/living/simple_animal/aliens/alien.dm
index 62a3b5e767..0f7cc35c77 100644
--- a/code/modules/mob/living/simple_animal/aliens/alien.dm
+++ b/code/modules/mob/living/simple_animal/aliens/alien.dm
@@ -25,7 +25,7 @@
melee_damage_lower = 25
melee_damage_upper = 25
- attacktext = "slashed"
+ attacktext = list("slashed")
attack_sound = 'sound/weapons/bladeslice.ogg'
a_intent = I_HURT
diff --git a/code/modules/mob/living/simple_animal/aliens/creature.dm b/code/modules/mob/living/simple_animal/aliens/creature.dm
index 3de6d687af..980623c017 100644
--- a/code/modules/mob/living/simple_animal/aliens/creature.dm
+++ b/code/modules/mob/living/simple_animal/aliens/creature.dm
@@ -16,7 +16,7 @@
melee_damage_lower = 5
melee_damage_upper = 5
- attacktext = "chomped"
+ attacktext = list("chomped")
attack_sound = 'sound/weapons/bite.ogg'
speak_emote = list("gibbers")
diff --git a/code/modules/mob/living/simple_animal/aliens/drone.dm b/code/modules/mob/living/simple_animal/aliens/drone.dm
index c3ae697448..35e09030dd 100644
--- a/code/modules/mob/living/simple_animal/aliens/drone.dm
+++ b/code/modules/mob/living/simple_animal/aliens/drone.dm
@@ -25,6 +25,7 @@
projectiletype = /obj/item/projectile/beam/drone
projectilesound = 'sound/weapons/laser3.ogg'
destroy_surroundings = 0
+ hovering = TRUE
//Drones aren't affected by atmos.
min_oxy = 0
diff --git a/code/modules/mob/living/simple_animal/aliens/faithless.dm b/code/modules/mob/living/simple_animal/aliens/faithless.dm
index 24eacae40e..09de8a24fb 100644
--- a/code/modules/mob/living/simple_animal/aliens/faithless.dm
+++ b/code/modules/mob/living/simple_animal/aliens/faithless.dm
@@ -20,7 +20,7 @@
melee_damage_lower = 5
melee_damage_upper = 5
- attacktext = "gripped"
+ attacktext = list("gripped")
attack_sound = 'sound/hallucinations/growl1.ogg'
min_oxy = 0
diff --git a/code/modules/mob/living/simple_animal/aliens/hivebot.dm b/code/modules/mob/living/simple_animal/aliens/hivebot.dm
index 0a7fcd7613..03776d7178 100644
--- a/code/modules/mob/living/simple_animal/aliens/hivebot.dm
+++ b/code/modules/mob/living/simple_animal/aliens/hivebot.dm
@@ -20,7 +20,7 @@
melee_damage_lower = 15
melee_damage_upper = 15
- attacktext = "clawed"
+ attacktext = list("clawed")
projectilesound = 'sound/weapons/Gunshot.ogg'
projectiletype = /obj/item/projectile/bullet/hivebot
diff --git a/code/modules/mob/living/simple_animal/aliens/mimic.dm b/code/modules/mob/living/simple_animal/aliens/mimic.dm
index 77ba92ff6a..8230256086 100644
--- a/code/modules/mob/living/simple_animal/aliens/mimic.dm
+++ b/code/modules/mob/living/simple_animal/aliens/mimic.dm
@@ -24,7 +24,7 @@
harm_intent_damage = 5
melee_damage_lower = 8
melee_damage_upper = 12
- attacktext = "attacked"
+ attacktext = list("attacked")
attack_sound = 'sound/weapons/bite.ogg'
min_oxy = 0
@@ -55,7 +55,7 @@
// Aggro when you try to open them. Will also pickup loot when spawns and drop it when dies.
/mob/living/simple_animal/hostile/mimic/crate
- attacktext = "bitten"
+ attacktext = list("bitten")
stop_automated_movement = 1
wander = 0
diff --git a/code/modules/mob/living/simple_animal/aliens/shade.dm b/code/modules/mob/living/simple_animal/aliens/shade.dm
index 2d502bc10a..e8da069e1d 100644
--- a/code/modules/mob/living/simple_animal/aliens/shade.dm
+++ b/code/modules/mob/living/simple_animal/aliens/shade.dm
@@ -20,7 +20,7 @@
melee_damage_lower = 5
melee_damage_upper = 15
- attacktext = "drained the life from"
+ attacktext = list("drained the life from")
minbodytemp = 0
maxbodytemp = 4000
diff --git a/code/modules/mob/living/simple_animal/animals/bat.dm b/code/modules/mob/living/simple_animal/animals/bat.dm
index a429b2ca7f..726c94f143 100644
--- a/code/modules/mob/living/simple_animal/animals/bat.dm
+++ b/code/modules/mob/living/simple_animal/animals/bat.dm
@@ -24,7 +24,7 @@
melee_damage_upper = 3
environment_smash = 1
- attacktext = "bites"
+ attacktext = list("bites")
attack_sound = 'sound/weapons/bite.ogg'
min_oxy = 0
diff --git a/code/modules/mob/living/simple_animal/animals/carp.dm b/code/modules/mob/living/simple_animal/animals/carp.dm
index 9126642197..4dc4daffda 100644
--- a/code/modules/mob/living/simple_animal/animals/carp.dm
+++ b/code/modules/mob/living/simple_animal/animals/carp.dm
@@ -8,6 +8,7 @@
faction = "carp"
intelligence_level = SA_ANIMAL
+ hovering = TRUE
maxHealth = 25
health = 25
speed = 4
@@ -20,7 +21,7 @@
harm_intent_damage = 8
melee_damage_lower = 15
melee_damage_upper = 15
- attacktext = "bitten"
+ attacktext = list("bitten")
attack_sound = 'sound/weapons/bite.ogg'
//Space carp aren't affected by atmos.
diff --git a/code/modules/mob/living/simple_animal/animals/cat.dm b/code/modules/mob/living/simple_animal/animals/cat.dm
index 039540ed30..81cd043ce0 100644
--- a/code/modules/mob/living/simple_animal/animals/cat.dm
+++ b/code/modules/mob/living/simple_animal/animals/cat.dm
@@ -9,7 +9,6 @@
icon_dead = "cat2_dead"
icon_rest = "cat2_rest"
- hostile = 1 //To mice, anyway.
investigates = 1
specific_targets = 1 //Only targets with Found()
run_at_them = 0 //DOMESTICATED
diff --git a/code/modules/mob/living/simple_animal/animals/farm_animals.dm b/code/modules/mob/living/simple_animal/animals/farm_animals.dm
index 2fe58dc76f..213aff73bf 100644
--- a/code/modules/mob/living/simple_animal/animals/farm_animals.dm
+++ b/code/modules/mob/living/simple_animal/animals/farm_animals.dm
@@ -19,7 +19,7 @@
melee_damage_lower = 1
melee_damage_upper = 5
- attacktext = "kicked"
+ attacktext = list("kicked")
speak_chance = 1
speak = list("EHEHEHEHEH","eh?")
@@ -98,7 +98,7 @@
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "kicks"
- attacktext = "kicked"
+ attacktext = list("kicked")
speak_chance = 1
speak = list("moo?","moo","MOOOOOO")
@@ -168,7 +168,7 @@
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "kicks"
- attacktext = "kicked"
+ attacktext = list("kicked")
has_langs = list("Bird")
speak_chance = 2
@@ -216,7 +216,7 @@ var/global/chicken_count = 0
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "kicks"
- attacktext = "kicked"
+ attacktext = list("kicked")
has_langs = list("Bird")
speak_chance = 2
diff --git a/code/modules/mob/living/simple_animal/animals/goose.dm b/code/modules/mob/living/simple_animal/animals/goose.dm
index a2ac8515b8..dd3b93c479 100644
--- a/code/modules/mob/living/simple_animal/animals/goose.dm
+++ b/code/modules/mob/living/simple_animal/animals/goose.dm
@@ -21,7 +21,7 @@
harm_intent_damage = 5
melee_damage_lower = 5 //they're meant to be annoying, not threatening.
melee_damage_upper = 5 //unless there's like a dozen of them, then you're screwed.
- attacktext = "pecked"
+ attacktext = list("pecked")
attack_sound = 'sound/weapons/bite.ogg'
//SPACE geese aren't affected by atmos.
diff --git a/code/modules/mob/living/simple_animal/animals/lizard.dm b/code/modules/mob/living/simple_animal/animals/lizard.dm
index e9032a96ef..38822faf0d 100644
--- a/code/modules/mob/living/simple_animal/animals/lizard.dm
+++ b/code/modules/mob/living/simple_animal/animals/lizard.dm
@@ -15,7 +15,7 @@
response_disarm = "shoos"
response_harm = "stomps on"
- attacktext = "bitten"
+ attacktext = list("bitten")
melee_damage_lower = 1
melee_damage_upper = 2
diff --git a/code/modules/mob/living/simple_animal/animals/penguin.dm b/code/modules/mob/living/simple_animal/animals/penguin.dm
index 13ecb0d0ca..4bb985d1ac 100644
--- a/code/modules/mob/living/simple_animal/animals/penguin.dm
+++ b/code/modules/mob/living/simple_animal/animals/penguin.dm
@@ -18,7 +18,7 @@
harm_intent_damage = 5
melee_damage_lower = 10
melee_damage_upper = 15
- attacktext = "pecked"
+ attacktext = list("pecked")
has_langs = list("Bird")
speak_chance = 0
diff --git a/code/modules/mob/living/simple_animal/animals/spiderbot.dm b/code/modules/mob/living/simple_animal/animals/spiderbot.dm
index ff3f03bf57..7ae8edfb7a 100644
--- a/code/modules/mob/living/simple_animal/animals/spiderbot.dm
+++ b/code/modules/mob/living/simple_animal/animals/spiderbot.dm
@@ -21,7 +21,7 @@
melee_damage_lower = 1
melee_damage_upper = 3
- attacktext = "shocked"
+ attacktext = list("shocked")
min_oxy = 0
max_tox = 0
diff --git a/code/modules/mob/living/simple_animal/animals/tomato.dm b/code/modules/mob/living/simple_animal/animals/tomato.dm
index d1bffc6fe1..48882fea57 100644
--- a/code/modules/mob/living/simple_animal/animals/tomato.dm
+++ b/code/modules/mob/living/simple_animal/animals/tomato.dm
@@ -18,6 +18,6 @@
harm_intent_damage = 5
melee_damage_upper = 15
melee_damage_lower = 10
- attacktext = "mauled"
+ attacktext = list("mauled")
meat_type = /obj/item/weapon/reagent_containers/food/snacks/tomatomeat
diff --git a/code/modules/mob/living/simple_animal/animals/tree.dm b/code/modules/mob/living/simple_animal/animals/tree.dm
index 3db514345f..37169d42a1 100644
--- a/code/modules/mob/living/simple_animal/animals/tree.dm
+++ b/code/modules/mob/living/simple_animal/animals/tree.dm
@@ -22,7 +22,7 @@
harm_intent_damage = 5
melee_damage_lower = 8
melee_damage_upper = 12
- attacktext = "bitten"
+ attacktext = list("bitten")
attack_sound = 'sound/weapons/bite.ogg'
min_oxy = 0
diff --git a/code/modules/mob/living/simple_animal/animals/worm.dm b/code/modules/mob/living/simple_animal/animals/worm.dm
index 48ed6039c5..da30dbf8fd 100644
--- a/code/modules/mob/living/simple_animal/animals/worm.dm
+++ b/code/modules/mob/living/simple_animal/animals/worm.dm
@@ -56,7 +56,7 @@
melee_damage_lower = 10
melee_damage_upper = 15
- attacktext = "bitten"
+ attacktext = list("bitten")
animate_movement = SLIDE_STEPS
diff --git a/code/modules/mob/living/simple_animal/borer/borer.dm b/code/modules/mob/living/simple_animal/borer/borer.dm
index e18a345066..b89e2f2af6 100644
--- a/code/modules/mob/living/simple_animal/borer/borer.dm
+++ b/code/modules/mob/living/simple_animal/borer/borer.dm
@@ -16,7 +16,7 @@
a_intent = I_HURT
stop_automated_movement = 1
status_flags = CANPUSH
- attacktext = "nipped"
+ attacktext = list("nipped")
friendly = "prods"
wander = 0
pass_flags = PASSTABLE
diff --git a/code/modules/mob/living/simple_animal/constructs/constructs.dm b/code/modules/mob/living/simple_animal/constructs/constructs.dm
index 412f37f172..c0034b1908 100644
--- a/code/modules/mob/living/simple_animal/constructs/constructs.dm
+++ b/code/modules/mob/living/simple_animal/constructs/constructs.dm
@@ -8,6 +8,7 @@
response_disarm = "flailed at"
response_harm = "punched"
intelligence_level = SA_HUMANOID // Player controlled.
+ hovering = TRUE
icon_dead = "shade_dead"
speed = -1
a_intent = I_HURT
@@ -100,7 +101,7 @@
harm_intent_damage = 0
melee_damage_lower = 30
melee_damage_upper = 30
- attacktext = "smashed their armoured gauntlet into"
+ attacktext = list("smashed their armoured gauntlet into")
mob_size = MOB_HUGE
speed = 3
environment_smash = 2
@@ -152,7 +153,7 @@
health = 75
melee_damage_lower = 25
melee_damage_upper = 25
- attacktext = "slashed"
+ attacktext = list("slashed")
speed = -1
environment_smash = 1
see_in_dark = 7
@@ -177,7 +178,7 @@
harm_intent_damage = 5
melee_damage_lower = 5
melee_damage_upper = 5
- attacktext = "rammed"
+ attacktext = list("rammed")
speed = 0
environment_smash = 1
attack_sound = 'sound/weapons/rapidslice.ogg'
@@ -206,7 +207,7 @@
harm_intent_damage = 0
melee_damage_lower = 50
melee_damage_upper = 50
- attacktext = "brutally crushed"
+ attacktext = list("brutally crushed")
speed = 5
environment_smash = 2
attack_sound = 'sound/weapons/heavysmash.ogg'
@@ -230,7 +231,7 @@
health = 150
melee_damage_lower = 25
melee_damage_upper = 25
- attacktext = "violently stabbed"
+ attacktext = list("violently stabbed")
speed = -1
environment_smash = 1
see_in_dark = 7
diff --git a/code/modules/mob/living/simple_animal/humanoids/clown.dm b/code/modules/mob/living/simple_animal/humanoids/clown.dm
index ee1341ff38..5751a058c4 100644
--- a/code/modules/mob/living/simple_animal/humanoids/clown.dm
+++ b/code/modules/mob/living/simple_animal/humanoids/clown.dm
@@ -26,7 +26,7 @@
harm_intent_damage = 8
melee_damage_lower = 10
melee_damage_upper = 10
- attacktext = "attacked"
+ attacktext = list("attacked")
attack_sound = 'sound/items/bikehorn.ogg'
min_oxy = 5
diff --git a/code/modules/mob/living/simple_animal/humanoids/mechamobs.dm b/code/modules/mob/living/simple_animal/humanoids/mechamobs.dm
index 975d938ea9..c7645d2352 100644
--- a/code/modules/mob/living/simple_animal/humanoids/mechamobs.dm
+++ b/code/modules/mob/living/simple_animal/humanoids/mechamobs.dm
@@ -28,7 +28,7 @@
harm_intent_damage = 0
melee_damage_lower = 35
melee_damage_upper = 35
- attacktext = "slashed"
+ attacktext = list("slashed")
attack_sound = 'sound/weapons/bladeslice.ogg'
min_oxy = 0
diff --git a/code/modules/mob/living/simple_animal/humanoids/pirate.dm b/code/modules/mob/living/simple_animal/humanoids/pirate.dm
index f0c7c05ddc..8921f3c519 100644
--- a/code/modules/mob/living/simple_animal/humanoids/pirate.dm
+++ b/code/modules/mob/living/simple_animal/humanoids/pirate.dm
@@ -28,7 +28,7 @@
harm_intent_damage = 5
melee_damage_lower = 30
melee_damage_upper = 30
- attacktext = "slashed"
+ attacktext = list("slashed")
attack_sound = 'sound/weapons/bladeslice.ogg'
min_oxy = 5
diff --git a/code/modules/mob/living/simple_animal/humanoids/russian.dm b/code/modules/mob/living/simple_animal/humanoids/russian.dm
index 1589fe2a7d..2c3fc68c71 100644
--- a/code/modules/mob/living/simple_animal/humanoids/russian.dm
+++ b/code/modules/mob/living/simple_animal/humanoids/russian.dm
@@ -30,7 +30,7 @@
harm_intent_damage = 5
melee_damage_lower = 15
melee_damage_upper = 15
- attacktext = "punched"
+ attacktext = list("punched")
min_oxy = 5
max_oxy = 0
diff --git a/code/modules/mob/living/simple_animal/humanoids/syndicate.dm b/code/modules/mob/living/simple_animal/humanoids/syndicate.dm
index b053094663..b525cf6141 100644
--- a/code/modules/mob/living/simple_animal/humanoids/syndicate.dm
+++ b/code/modules/mob/living/simple_animal/humanoids/syndicate.dm
@@ -31,7 +31,7 @@
melee_damage_lower = 10
melee_damage_upper = 15
environment_smash = 1
- attacktext = "punched"
+ attacktext = list("punched")
min_oxy = 5
max_oxy = 0
@@ -75,7 +75,7 @@
melee_damage_lower = 20
melee_damage_upper = 25
- attacktext = "slashed"
+ attacktext = list("slashed")
status_flags = 0
@@ -167,6 +167,7 @@
icon_state = "viscerator_attack"
icon_living = "viscerator_attack"
intelligence_level = SA_ROBOTIC
+ hovering = TRUE
faction = "syndicate"
maxHealth = 15
@@ -177,7 +178,7 @@
melee_damage_lower = 15
melee_damage_upper = 15
attack_sound = 'sound/weapons/bladeslice.ogg'
- attacktext = "cut"
+ attacktext = list("cut")
min_oxy = 0
max_oxy = 0
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 184176ec8e..d59bbc6d86 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -16,6 +16,12 @@
//Settings for played mobs
var/show_stat_health = 1 // Does the percentage health show in the stat panel for the mob
var/ai_inactive = 0 // Set to 1 to turn off most AI actions
+ var/has_hands = 0 // Set to 1 to enable the use of hands and the hands hud
+ var/list/hud_gears // Slots to show on the hud (typically none)
+ var/ui_icons // Icon file path to use for the HUD, otherwise generic icons are used
+ var/r_hand_sprite // If they have hands,
+ var/l_hand_sprite // they could use some icons.
+ var/player_msg // Message to print to players about 'how' to play this mob on login.
//Mob icon/appearance settings
var/icon_living = "" // The iconstate if we're alive, required
@@ -23,6 +29,8 @@
var/icon_gib = "generic_gib" // The iconstate for being gibbed, optional. Defaults to a generic gib animation.
var/icon_rest = null // The iconstate for resting, optional
var/image/modifier_overlay = null // Holds overlays from modifiers.
+ attack_icon = 'icons/effects/effects.dmi' //Just the default, played like the weapon attack anim
+ attack_icon_state = "slash" //Just the default
//Mob talking settings
universal_speak = 0 // Can all mobs in the entire universe understand this one?
@@ -69,7 +77,7 @@
var/cold_damage_per_tick = 2 // Same as heat_damage_per_tick, only if the bodytemperature it's lower than minbodytemp
var/fire_alert = 0 // 0 = fine, 1 = hot, 2 = cold
- var/min_oxy = 5 // Oxygen in moles, minimum, 0 is 'no minimum
+ var/min_oxy = 5 // Oxygen in moles, minimum, 0 is 'no minimum'
var/max_oxy = 0 // Oxygen in moles, maximum, 0 is 'no maximum'
var/min_tox = 0 // Phoron min
var/max_tox = 1 // Phoron max
@@ -104,8 +112,8 @@
//Mob melee settings
var/melee_damage_lower = 2 // Lower bound of randomized melee damage
var/melee_damage_upper = 6 // Upper bound of randomized melee damage
- var/attacktext = "attacked" // "You are [attacktext] by the mob!"
- var/friendly = "nuzzles" // What mobs do to people when they aren't really hostile
+ var/list/attacktext = list("attacked") // "You are [attacktext] by the mob!"
+ var/list/friendly = list("nuzzles") // "The mob [friendly] the person."
var/attack_sound = null // Sound to play when I attack
var/environment_smash = 0 // How much environment damage do I do when I hit stuff?
var/melee_miss_chance = 15 // percent chance to miss a melee attack.
@@ -125,14 +133,14 @@
//Damage resistances
var/resistance = 0 // Damage reduction for all types
- var/list/resistances = list(
- HALLOSS = 0,
- BRUTE = 1,
- BURN = 1,
- TOX = 1,
- OXY = 0,
- CLONE = 0
- )
+ var/list/armor = list( // Values for normal getarmor() checks
+ "melee" = 0,
+ "bullet" = 0,
+ "laser" = 0,
+ "energy" = 0,
+ "bomb" = 0,
+ "bio" = 100,
+ "rad" = 100)
//Scary debug things
var/debug_ai = 0 // Logging level for this mob (1,2,3)
@@ -168,6 +176,7 @@
home_turf = get_turf(src)
path_overlay = new(path_icon,path_icon_state)
move_to_delay = max(2,move_to_delay) //Protection against people coding things incorrectly and A* pathing 100% of the time
+ maxHealth = health
for(var/L in has_langs)
languages |= all_languages[L]
@@ -206,21 +215,17 @@
//Client attached
/mob/living/simple_animal/Login()
- if(src && src.client)
- src.client.screen = list()
- src.client.screen += src.client.void
- ai_inactive = 1
- handle_stance(STANCE_IDLE)
- LoseTarget()
- src.client << "Mob AI disabled while you are controlling the mob."
- ..()
+ . = ..()
+ ai_inactive = 1
+ handle_stance(STANCE_IDLE)
+ LoseTarget()
+ to_chat(src,"Mob AI disabled while you are controlling the mob.
You are \the [src]. [player_msg]")
//Client detatched
/mob/living/simple_animal/Logout()
- if(src && !src.client)
- spawn(15 SECONDS) //15 seconds to get back into the mob before it goes wild
- if(src && !src.client)
- ai_inactive = initial(ai_inactive) //So if they never have an AI, they stay that way.
+ spawn(15 SECONDS) //15 seconds to get back into the mob before it goes wild
+ if(src && !src.client)
+ ai_inactive = initial(ai_inactive) //So if they never have an AI, they stay that way.
..()
//For debug purposes!
@@ -240,23 +245,74 @@
if(health > getMaxHealth())
health = getMaxHealth()
+ //Update our hud if we have one
+ if(healths)
+ if(stat != DEAD)
+ var/heal_per = (health / getMaxHealth()) * 100
+ switch(heal_per)
+ if(100 to INFINITY)
+ healths.icon_state = "health0"
+ if(80 to 100)
+ healths.icon_state = "health1"
+ if(60 to 80)
+ healths.icon_state = "health2"
+ if(40 to 60)
+ healths.icon_state = "health3"
+ if(20 to 40)
+ healths.icon_state = "health4"
+ if(0 to 20)
+ healths.icon_state = "health5"
+ else
+ healths.icon_state = "health6"
+ else
+ healths.icon_state = "health7"
+
+ //Updates the nutrition while we're here
+ if(nutrition_icon)
+ var/food_per = (nutrition / initial(nutrition)) * 100
+ switch(food_per)
+ if(90 to INFINITY)
+ nutrition_icon.icon_state = "nutrition0"
+ if(75 to 90)
+ nutrition_icon.icon_state = "nutrition1"
+ if(50 to 75)
+ nutrition_icon.icon_state = "nutrition2"
+ if(25 to 50)
+ nutrition_icon.icon_state = "nutrition3"
+ if(0 to 25)
+ nutrition_icon.icon_state = "nutrition4"
+
/mob/living/simple_animal/update_icon()
- ..()
+ . = ..()
+ var/mutable_appearance/ma = new(src)
+ ma.layer = layer
+ ma.plane = plane
+
+ ma.overlays = list(modifier_overlay)
+
//Awake and normal
if((stat == CONSCIOUS) && (!icon_rest || !resting || !incapacitated(INCAPACITATION_DISABLED) ))
- icon_state = icon_living
+ ma.icon_state = icon_living
//Dead
else if(stat >= DEAD)
- icon_state = icon_dead
+ ma.icon_state = icon_dead
//Resting or KO'd
else if(((stat == UNCONSCIOUS) || resting || incapacitated(INCAPACITATION_DISABLED) ) && icon_rest)
- icon_state = icon_rest
+ ma.icon_state = icon_rest
//Backup
else
- icon_state = initial(icon_state)
+ ma.icon_state = initial(icon_state)
+
+ if(has_hands)
+ if(r_hand_sprite)
+ ma.overlays += r_hand_sprite
+ if(l_hand_sprite)
+ ma.overlays += l_hand_sprite
+
+ appearance = ma
// If your simple mob's update_icon() call calls overlays.Cut(), this needs to be called after this, or manually apply modifier_overly to overlays.
/mob/living/simple_animal/update_modifier_visuals()
@@ -291,7 +347,6 @@
handle_paralysed()
handle_supernatural()
handle_atmos() //Atmos
- update_icon()
ai_log("Life() - stance=[stance] ai_inactive=[ai_inactive]", 4)
@@ -316,7 +371,7 @@
if(istype(loc,/obj/structure/closet))
var/obj/structure/closet/C = loc
if(C.welded)
- resist()
+ handle_resist()
else
C.open()
@@ -376,7 +431,7 @@
// Handle interacting with and taking damage from atmos
// TODO - Refactor this to use handle_environment() like a good /mob/living
/mob/living/simple_animal/proc/handle_atmos()
- var/atmos_suitable = 1
+ var/atmos_unsuitable = 0
var/atom/A = src.loc
@@ -392,41 +447,52 @@
if(min_oxy)
if(Environment.gas["oxygen"] < min_oxy)
- atmos_suitable = 0
+ atmos_unsuitable = 1
if(max_oxy)
if(Environment.gas["oxygen"] > max_oxy)
- atmos_suitable = 0
+ atmos_unsuitable = 1
if(min_tox)
if(Environment.gas["phoron"] < min_tox)
- atmos_suitable = 0
+ atmos_unsuitable = 2
if(max_tox)
if(Environment.gas["phoron"] > max_tox)
- atmos_suitable = 0
+ atmos_unsuitable = 2
if(min_n2)
if(Environment.gas["nitrogen"] < min_n2)
- atmos_suitable = 0
+ atmos_unsuitable = 1
if(max_n2)
if(Environment.gas["nitrogen"] > max_n2)
- atmos_suitable = 0
+ atmos_unsuitable = 1
if(min_co2)
if(Environment.gas["carbon_dioxide"] < min_co2)
- atmos_suitable = 0
+ atmos_unsuitable = 1
if(max_co2)
if(Environment.gas["carbon_dioxide"] > max_co2)
- atmos_suitable = 0
+ atmos_unsuitable = 1
//Atmos effect
if(bodytemperature < minbodytemp)
fire_alert = 2
adjustBruteLoss(cold_damage_per_tick)
+ if(fire)
+ fire.icon_state = "fire1"
else if(bodytemperature > maxbodytemp)
fire_alert = 1
adjustBruteLoss(heat_damage_per_tick)
+ if(fire)
+ fire.icon_state = "fire2"
else
fire_alert = 0
+ if(fire)
+ fire.icon_state = "fire0"
- if(!atmos_suitable)
+ if(atmos_unsuitable)
adjustBruteLoss(unsuitable_atoms_damage)
+ if(oxygen)
+ oxygen.icon_state = "oxy1"
+ else if(oxygen)
+ if(oxygen)
+ oxygen.icon_state = "oxy0"
// For setting the stance WITHOUT processing it
/mob/living/simple_animal/proc/set_stance(var/new_stance)
@@ -459,7 +525,7 @@
stop_automated_movement = 0
//Search for targets while idle
- if(hostile)
+ if(hostile || specific_targets)
FindTarget()
if(STANCE_FOLLOW)
annoyed = 15
@@ -467,7 +533,7 @@
if(follow_until_time && world.time > follow_until_time)
LoseFollow()
return
- if(hostile)
+ if(hostile || specific_targets)
FindTarget()
if(STANCE_ATTACK)
annoyed = 50
@@ -496,26 +562,19 @@
custom_emote(2, act_desc)
/mob/living/simple_animal/bullet_act(var/obj/item/projectile/Proj)
- if(!Proj)
- return
ai_log("bullet_act() I was shot by: [Proj.firer]",2)
- if(Proj.taser_effect)
- stun_effect_act(0, Proj.agony)
-
+ //Projectiles with bonus SA damage
if(!Proj.nodamage)
var/true_damage = Proj.damage
if(!Proj.SA_vulnerability || Proj.SA_vulnerability == intelligence_level)
- true_damage += Proj.SA_bonus_damage
- adjustBruteLoss(true_damage)
+ Proj.damage += Proj.SA_bonus_damage
+
+ . = ..()
if(Proj.firer)
react_to_attack(Proj.firer)
- Proj.on_hit(src)
-
- return 0
-
// When someone clicks us with an empty hand
/mob/living/simple_animal/attack_hand(mob/living/carbon/human/M as mob)
..()
@@ -554,7 +613,8 @@
react_to_attack(M)
if(I_HURT)
- adjustBruteLoss(harm_intent_damage)
+ var/armor = run_armor_check(def_zone = null, attack_flag = "melee")
+ apply_damage(damage = harm_intent_damage, damagetype = BURN, def_zone = null, blocked = armor, blocked = resistance, used_weapon = null, sharp = FALSE, edge = FALSE)
M.visible_message("[M] [response_harm] \the [src]!")
M.do_attack_animation(src)
ai_log("attack_hand() I was hit by: [M]",2)
@@ -588,24 +648,25 @@
if(O.force)
react_to_attack(user)
-/mob/living/simple_animal/hit_with_weapon(obj/item/O, mob/living/user, var/effective_force, var/hit_zone)
- visible_message("\The [src] has been attacked with \the [O] by [user].")
+ return ..()
+/mob/living/simple_animal/hit_with_weapon(obj/item/O, mob/living/user, var/effective_force, var/hit_zone)
+ effective_force = O.force
+
+ //Animals can't be stunned(?)
+ if(O.damtype == HALLOSS)
+ effective_force = 0
+ if(supernatural && istype(O,/obj/item/weapon/nullrod))
+ effective_force *= 2
+ purge = 3
if(O.force <= resistance)
- user << "This weapon is ineffective, it does no damage."
+ to_chat(user,"This weapon is ineffective, it does no damage.")
return 2
- var/damage = O.force
- if (O.damtype == HALLOSS)
- damage = 0
- if(supernatural && istype(O,/obj/item/weapon/nullrod))
- damage *= 2
- purge = 3
- adjustBruteLoss(damage)
ai_log("hit_with_weapon() I was h_w_weapon'd by: [user]",2)
react_to_attack(user)
- return 0
+ . = ..()
// When someone throws something at us
/mob/living/simple_animal/hitby(atom/movable/AM)
@@ -638,6 +699,9 @@
tally = 1
tally *= purge
+ if(m_intent == "walk")
+ tally *= 1.5
+
return tally+config.animal_delay
/mob/living/simple_animal/Stat()
@@ -652,6 +716,7 @@
icon_state = icon_rest
else
icon_state = icon_living
+ update_icon()
/mob/living/simple_animal/death(gibbed, deathmessage = "dies!")
density = 0 //We don't block even if we did before
@@ -673,18 +738,20 @@
/mob/living/simple_animal/ex_act(severity)
if(!blinded)
flash_eyes()
+ var/armor = run_armor_check(def_zone = null, attack_flag = "bomb")
+ var/bombdam = 500
switch (severity)
if (1.0)
- adjustBruteLoss(500)
- gib()
- return
-
+ bombdam = 500
if (2.0)
- adjustBruteLoss(60)
+ bombdam = 60
+ if (3.0)
+ bombdam = 30
+ apply_damage(damage = bombdam, damagetype = BRUTE, def_zone = null, blocked = armor, blocked = resistance, used_weapon = null, sharp = FALSE, edge = FALSE)
- if(3.0)
- adjustBruteLoss(30)
+ if(bombdam > maxHealth)
+ gib()
// Check target_mob if worthy of attack (i.e. check if they are dead or empty mecha)
/mob/living/simple_animal/proc/SA_attackable(target_mob)
@@ -733,7 +800,6 @@
/mob/living/simple_animal/handle_fire()
return
-
/mob/living/simple_animal/update_fire()
return
/mob/living/simple_animal/IgniteMob()
@@ -743,7 +809,7 @@
//We got hit! Consider hitting them back!
/mob/living/simple_animal/proc/react_to_attack(var/mob/living/M)
- if(stat || M == target_mob) return //Not if we're dead or already hitting them
+ if(ai_inactive || stat || M == target_mob) return //Not if we're dead or already hitting them
if(M in friends || M.faction == faction) return //I'll overlook it THIS time...
ai_log("react_to_attack([M])",1)
if(retaliate && set_target(M, 1))
@@ -1182,8 +1248,8 @@
if(prob(melee_miss_chance))
src.attack_log += text("\[[time_stamp()]\] attacked [L.name] ([L.ckey])")
L.attack_log += text("\[[time_stamp()]\] was attacked by [src.name] ([src.ckey])")
- src.visible_message("[src] misses [L]!")
- src.do_attack_animation(src)
+ visible_message("[src] misses [L]!")
+ do_attack_animation(src)
return L
else
DoPunch(L)
@@ -1195,7 +1261,7 @@
// This is the actual act of 'punching'. Override for special behaviour.
/mob/living/simple_animal/proc/DoPunch(var/atom/A)
- if(!Adjacent(target_mob)) // They could've moved in the meantime.
+ if(!Adjacent(A)) // They could've moved in the meantime.
return FALSE
var/damage_to_do = rand(melee_damage_lower, melee_damage_upper)
@@ -1204,16 +1270,15 @@
if(!isnull(M.outgoing_melee_damage_percent))
damage_to_do *= M.outgoing_melee_damage_percent
- if(attack_sound)
- playsound(src, attack_sound, 75, 1)
-
// SA attacks can be blocked with shields.
if(ishuman(A))
var/mob/living/carbon/human/H = A
if(H.check_shields(damage = damage_to_do, damage_source = src, attacker = src, def_zone = null, attack_text = "the attack"))
return FALSE
- A.attack_generic(src, damage_to_do, attacktext)
+ if(A.attack_generic(src, damage_to_do, pick(attacktext)) && attack_sound)
+ playsound(src, attack_sound, 75, 1)
+
return TRUE
//The actual top-level ranged attack proc
@@ -1371,23 +1436,23 @@
for(var/obj/structure/window/obstacle in problem_turf)
if(obstacle.dir == reverse_dir[dir]) // So that windows get smashed in the right order
ai_log("DestroySurroundings() directional window hit",3)
- obstacle.attack_generic(src, damage_to_do, attacktext)
+ obstacle.attack_generic(src, damage_to_do, pick(attacktext))
return
else if(obstacle.is_fulltile())
ai_log("DestroySurroundings() full tile window hit",3)
- obstacle.attack_generic(src, damage_to_do, attacktext)
+ obstacle.attack_generic(src, damage_to_do, pick(attacktext))
return
var/obj/structure/obstacle = locate(/obj/structure, problem_turf)
if(istype(obstacle, /obj/structure/window) || istype(obstacle, /obj/structure/closet) || istype(obstacle, /obj/structure/table) || istype(obstacle, /obj/structure/grille))
ai_log("DestroySurroundings() generic structure hit [obstacle]",3)
- obstacle.attack_generic(src, damage_to_do ,attacktext)
+ obstacle.attack_generic(src, damage_to_do, pick(attacktext))
return
for(var/obj/machinery/door/baddoor in problem_turf) //Required since firelocks take up the same turf
if(baddoor.density)
ai_log("DestroySurroundings() door hit [baddoor]",3)
- baddoor.attack_generic(src, damage_to_do ,attacktext)
+ baddoor.attack_generic(src, damage_to_do, pick(attacktext))
return
//Check for shuttle bumrush
@@ -1435,7 +1500,7 @@
if (shock_damage < 1)
return 0
- adjustFireLoss(shock_damage)
+ apply_damage(damage = shock_damage, damagetype = BURN, def_zone = null, blocked = null, blocked = resistance, used_weapon = null, sharp = FALSE, edge = FALSE)
playsound(loc, "sparks", 50, 1, -1)
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
@@ -1447,14 +1512,15 @@
if(taser_kill)
var/stunDam = 0
var/agonyDam = 0
+ var/armor = run_armor_check(def_zone = null, attack_flag = "energy")
if(stun_amount)
stunDam += stun_amount * 0.5
- adjustFireLoss(stunDam)
+ apply_damage(damage = stunDam, damagetype = BURN, def_zone = null, blocked = armor, blocked = resistance, used_weapon = used_weapon, sharp = FALSE, edge = FALSE)
if(agony_amount)
agonyDam += agony_amount * 0.5
- adjustFireLoss(agonyDam)
+ apply_damage(damage = agonyDam, damagetype = BURN, def_zone = null, blocked = armor, blocked = resistance, used_weapon = used_weapon, sharp = FALSE, edge = FALSE)
/mob/living/simple_animal/emp_act(severity)
if(!isSynthetic())
@@ -1469,6 +1535,13 @@
if(4)
adjustFireLoss(rand(1, 6))
+/mob/living/simple_animal/getarmor(def_zone, attack_flag)
+ var/armorval = armor[attack_flag]
+ if(!armorval)
+ return 0
+ else
+ return armorval
+
// Force it to target something
/mob/living/simple_animal/proc/taunt(var/mob/living/new_target, var/forced = FALSE)
if(intelligence_level == SA_HUMANOID && !forced)
@@ -1478,10 +1551,134 @@
/mob/living/simple_animal/is_sentient()
return intelligence_level != SA_PLANT && intelligence_level != SA_ROBOTIC
+// Hand procs for player-controlled SA's
+/mob/living/simple_animal/swap_hand()
+ src.hand = !( src.hand )
+ if(hud_used.l_hand_hud_object && hud_used.r_hand_hud_object)
+ if(hand) //This being 1 means the left hand is in use
+ hud_used.l_hand_hud_object.icon_state = "l_hand_active"
+ hud_used.r_hand_hud_object.icon_state = "r_hand_inactive"
+ else
+ hud_used.l_hand_hud_object.icon_state = "l_hand_inactive"
+ hud_used.r_hand_hud_object.icon_state = "r_hand_active"
+ return
+
+/mob/living/simple_animal/put_in_active_hand(var/obj/item/I)
+ if(!has_hands || !istype(I))
+ return
+
+//Puts the item into our active hand if possible. returns 1 on success.
+/mob/living/simple_animal/put_in_active_hand(var/obj/item/W)
+ if(!has_hands)
+ return FALSE
+ return (hand ? put_in_l_hand(W) : put_in_r_hand(W))
+
+/mob/living/simple_animal/put_in_l_hand(var/obj/item/W)
+ if(!..() || l_hand)
+ return 0
+ W.forceMove(src)
+ l_hand = W
+ W.equipped(src,slot_l_hand)
+ W.add_fingerprint(src)
+ update_inv_l_hand()
+ return TRUE
+
+/mob/living/simple_animal/put_in_r_hand(var/obj/item/W)
+ if(!..() || r_hand)
+ return 0
+ W.forceMove(src)
+ r_hand = W
+ W.equipped(src,slot_r_hand)
+ W.add_fingerprint(src)
+ update_inv_r_hand()
+ return TRUE
+
+/mob/living/simple_animal/update_inv_r_hand()
+ if(QDESTROYING(src))
+ return
+
+ if(r_hand)
+ r_hand.screen_loc = ui_rhand //TODO
+
+ //determine icon state to use
+ var/t_state
+ if(r_hand.item_state_slots && r_hand.item_state_slots[slot_r_hand_str])
+ t_state = r_hand.item_state_slots[slot_r_hand_str]
+ else if(r_hand.item_state)
+ t_state = r_hand.item_state
+ else
+ t_state = r_hand.icon_state
+
+ //determine icon to use
+ var/icon/t_icon
+ if(r_hand.item_icons && (slot_r_hand_str in r_hand.item_icons))
+ t_icon = r_hand.item_icons[slot_r_hand_str]
+ else if(r_hand.icon_override)
+ t_state += "_r"
+ t_icon = r_hand.icon_override
+ else
+ t_icon = INV_R_HAND_DEF_ICON
+
+ //apply color
+ var/image/standing = image(icon = t_icon, icon_state = t_state)
+ standing.color = r_hand.color
+
+ r_hand_sprite = standing
+
+ else
+ r_hand_sprite = null
+
+ update_icon()
+
+/mob/living/simple_animal/update_inv_l_hand()
+ if(QDESTROYING(src))
+ return
+
+ if(l_hand)
+ l_hand.screen_loc = ui_lhand //TODO
+
+ //determine icon state to use
+ var/t_state
+ if(l_hand.item_state_slots && l_hand.item_state_slots[slot_l_hand_str])
+ t_state = l_hand.item_state_slots[slot_l_hand_str]
+ else if(l_hand.item_state)
+ t_state = l_hand.item_state
+ else
+ t_state = l_hand.icon_state
+
+ //determine icon to use
+ var/icon/t_icon
+ if(l_hand.item_icons && (slot_l_hand_str in l_hand.item_icons))
+ t_icon = l_hand.item_icons[slot_l_hand_str]
+ else if(l_hand.icon_override)
+ t_state += "_l"
+ t_icon = l_hand.icon_override
+ else
+ t_icon = INV_L_HAND_DEF_ICON
+
+ //apply color
+ var/image/standing = image(icon = t_icon, icon_state = t_state)
+ standing.color = l_hand.color
+
+ l_hand_sprite = standing
+
+ else
+ l_hand_sprite = null
+
+ update_icon()
+
+//Can insert extra huds into the hud holder here.
+/mob/living/simple_animal/proc/extra_huds(var/datum/hud/hud,var/icon/ui_style,var/list/hud_elements)
+ return
+
+//If they can or cannot use tools/machines/etc
+/mob/living/simple_animal/IsAdvancedToolUser()
+ return has_hands
+
//Commands, reactions, etc
/mob/living/simple_animal/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/alt_name = "", var/italics = 0, var/mob/speaker = null, var/sound/speech_sound, var/sound_vol)
..()
- if(reacts && speaker && (message in reactions) && (!hostile || isliving(speaker)) && say_understands(speaker,language))
+ if(!ai_inactive && reacts && speaker && (message in reactions) && (!hostile || isliving(speaker)) && say_understands(speaker,language))
var/mob/living/L = speaker
if(L.faction == faction)
spawn(10)
diff --git a/code/modules/mob/living/simple_animal/simple_hud.dm b/code/modules/mob/living/simple_animal/simple_hud.dm
new file mode 100644
index 0000000000..72d7bf07a3
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/simple_hud.dm
@@ -0,0 +1,308 @@
+/mob/living/simple_animal/instantiate_hud(var/datum/hud/hud)
+ if(!client)
+ return //Why bother.
+
+ var/ui_style = 'icons/mob/screen1_animal.dmi'
+ if(ui_icons)
+ ui_style = ui_icons
+
+ var/ui_color = "#ffffff"
+ var/ui_alpha = 255
+
+ var/list/adding = list()
+ var/list/other = list()
+ var/list/hotkeybuttons = list()
+
+ hud.adding = adding
+ hud.other = other
+ hud.hotkeybuttons = hotkeybuttons
+
+ var/list/hud_elements = list()
+ var/obj/screen/using
+ var/obj/screen/inventory/inv_box
+
+ var/has_hidden_gear
+ if(LAZYLEN(hud_gears))
+ for(var/gear_slot in hud_gears)
+ inv_box = new /obj/screen/inventory()
+ inv_box.icon = ui_style
+ inv_box.color = ui_color
+ inv_box.alpha = ui_alpha
+
+ var/list/slot_data = hud_gears[gear_slot]
+ inv_box.name = gear_slot
+ inv_box.screen_loc = slot_data["loc"]
+ inv_box.slot_id = slot_data["slot"]
+ inv_box.icon_state = slot_data["state"]
+
+ if(slot_data["dir"])
+ inv_box.set_dir(slot_data["dir"])
+
+ if(slot_data["toggle"])
+ other += inv_box
+ has_hidden_gear = 1
+ else
+ adding += inv_box
+
+ if(has_hidden_gear)
+ using = new /obj/screen()
+ using.name = "toggle"
+ using.icon = ui_style
+ using.icon_state = "other"
+ using.screen_loc = ui_inventory
+ using.hud_layerise()
+ using.color = ui_color
+ using.alpha = ui_alpha
+ adding += using
+
+ //Intent Backdrop
+ using = new /obj/screen()
+ using.name = "act_intent"
+ using.icon = ui_style
+ using.icon_state = "intent_"+a_intent
+ using.screen_loc = ui_acti
+ using.color = ui_color
+ using.alpha = ui_alpha
+ hud.adding += using
+ hud.action_intent = using
+
+ hud_elements |= using
+
+ //Small intent quarters
+ var/icon/ico
+
+ ico = new(ui_style, "black")
+ ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1)
+ ico.DrawBox(rgb(255,255,255,1),1,ico.Height()/2,ico.Width()/2,ico.Height())
+ using = new /obj/screen( src )
+ using.name = I_HELP
+ using.icon = ico
+ using.screen_loc = ui_acti
+ using.alpha = ui_alpha
+ using.layer = LAYER_HUD_ITEM //These sit on the intent box
+ hud.adding += using
+ hud.help_intent = using
+
+ ico = new(ui_style, "black")
+ ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1)
+ ico.DrawBox(rgb(255,255,255,1),ico.Width()/2,ico.Height()/2,ico.Width(),ico.Height())
+ using = new /obj/screen( src )
+ using.name = I_DISARM
+ using.icon = ico
+ using.screen_loc = ui_acti
+ using.alpha = ui_alpha
+ using.layer = LAYER_HUD_ITEM
+ hud.adding += using
+ hud.disarm_intent = using
+
+ ico = new(ui_style, "black")
+ ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1)
+ ico.DrawBox(rgb(255,255,255,1),ico.Width()/2,1,ico.Width(),ico.Height()/2)
+ using = new /obj/screen( src )
+ using.name = I_GRAB
+ using.icon = ico
+ using.screen_loc = ui_acti
+ using.alpha = ui_alpha
+ using.layer = LAYER_HUD_ITEM
+ hud.adding += using
+ hud.grab_intent = using
+
+ ico = new(ui_style, "black")
+ ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1)
+ ico.DrawBox(rgb(255,255,255,1),1,1,ico.Width()/2,ico.Height()/2)
+ using = new /obj/screen( src )
+ using.name = I_HURT
+ using.icon = ico
+ using.screen_loc = ui_acti
+ using.alpha = ui_alpha
+ using.layer = LAYER_HUD_ITEM
+ hud.adding += using
+ hud.hurt_intent = using
+
+ //Move intent (walk/run)
+ using = new /obj/screen()
+ using.name = "mov_intent"
+ using.icon = ui_style
+ using.icon_state = (m_intent == "run" ? "running" : "walking")
+ using.screen_loc = ui_movi
+ using.color = ui_color
+ using.alpha = ui_alpha
+ hud.adding += using
+ hud.move_intent = using
+
+ //Resist button
+ using = new /obj/screen()
+ using.name = "resist"
+ using.icon = ui_style
+ using.icon_state = "act_resist"
+ using.screen_loc = ui_pull_resist
+ using.color = ui_color
+ using.alpha = ui_alpha
+ hud.hotkeybuttons += using
+
+ //Pull button
+ pullin = new /obj/screen()
+ pullin.icon = ui_style
+ pullin.icon_state = "pull0"
+ pullin.name = "pull"
+ pullin.screen_loc = ui_pull_resist
+ hud.hotkeybuttons += pullin
+ hud_elements |= pullin
+
+ //Health status
+ healths = new /obj/screen()
+ healths.icon = ui_style
+ healths.icon_state = "health0"
+ healths.name = "health"
+ healths.screen_loc = ui_health
+ hud_elements |= healths
+
+ //Oxygen dep icon
+ oxygen = new /obj/screen()
+ oxygen.icon = ui_style
+ oxygen.icon_state = "oxy0"
+ oxygen.name = "oxygen"
+ oxygen.screen_loc = ui_oxygen
+ hud_elements |= oxygen
+
+ //Toxins present icon
+ toxin = new /obj/screen()
+ toxin.icon = ui_style
+ toxin.icon_state = "tox0"
+ toxin.name = "toxin"
+ toxin.screen_loc = ui_toxin
+ hud_elements |= toxin
+
+ //Fire warning
+ fire = new /obj/screen()
+ fire.icon = ui_style
+ fire.icon_state = "fire0"
+ fire.name = "fire"
+ fire.screen_loc = ui_fire
+ hud_elements |= fire
+
+ //Pressure warning
+ pressure = new /obj/screen()
+ pressure.icon = ui_style
+ pressure.icon_state = "pressure0"
+ pressure.name = "pressure"
+ pressure.screen_loc = ui_pressure
+ hud_elements |= pressure
+
+ //Body temp warning
+ bodytemp = new /obj/screen()
+ bodytemp.icon = ui_style
+ bodytemp.icon_state = "temp0"
+ bodytemp.name = "body temperature"
+ bodytemp.screen_loc = ui_temp
+ hud_elements |= bodytemp
+
+ //Nutrition status
+ nutrition_icon = new /obj/screen()
+ nutrition_icon.icon = ui_style
+ nutrition_icon.icon_state = "nutrition0"
+ nutrition_icon.name = "nutrition"
+ nutrition_icon.screen_loc = ui_nutrition
+ hud_elements |= nutrition_icon
+
+ pain = new /obj/screen( null )
+
+ zone_sel = new /obj/screen/zone_sel( null )
+ zone_sel.icon = ui_style
+ zone_sel.color = ui_color
+ zone_sel.alpha = ui_alpha
+ zone_sel.overlays.Cut()
+ zone_sel.overlays += image('icons/mob/zone_sel.dmi', "[zone_sel.selecting]")
+ hud_elements |= zone_sel
+
+ //Hand things
+ if(has_hands)
+ //Drop button
+ using = new /obj/screen()
+ using.name = "drop"
+ using.icon = ui_style
+ using.icon_state = "act_drop"
+ using.screen_loc = ui_drop_throw
+ using.color = ui_color
+ using.alpha = ui_alpha
+ hud.hotkeybuttons += using
+
+ //Equip detail
+ using = new /obj/screen()
+ using.name = "equip"
+ using.icon = ui_style
+ using.icon_state = "act_equip"
+ using.screen_loc = ui_equip
+ using.color = ui_color
+ using.alpha = ui_alpha
+ hud.adding += using
+
+ //Hand slots themselves
+ inv_box = new /obj/screen/inventory/hand()
+ inv_box.hud = src
+ inv_box.name = "r_hand"
+ inv_box.icon = ui_style
+ inv_box.icon_state = "r_hand_inactive"
+ if(!hand) //This being 0 or null means the right hand is in use
+ inv_box.icon_state = "r_hand_active"
+ inv_box.screen_loc = ui_rhand
+ inv_box.slot_id = slot_r_hand
+ inv_box.color = ui_color
+ inv_box.alpha = ui_alpha
+
+ hud.r_hand_hud_object = inv_box
+ hud.adding += inv_box
+
+ inv_box = new /obj/screen/inventory/hand()
+ inv_box.hud = src
+ inv_box.name = "l_hand"
+ inv_box.icon = ui_style
+ inv_box.icon_state = "l_hand_inactive"
+ if(hand) //This being 1 means the left hand is in use
+ inv_box.icon_state = "l_hand_active"
+ inv_box.screen_loc = ui_lhand
+ inv_box.slot_id = slot_l_hand
+ inv_box.color = ui_color
+ inv_box.alpha = ui_alpha
+ hud.l_hand_hud_object = inv_box
+ hud.adding += inv_box
+
+ //Swaphand titlebar
+ using = new /obj/screen/inventory()
+ using.name = "hand"
+ using.icon = ui_style
+ using.icon_state = "hand1"
+ using.screen_loc = ui_swaphand1
+ using.color = ui_color
+ using.alpha = ui_alpha
+ hud.adding += using
+
+ using = new /obj/screen/inventory()
+ using.name = "hand"
+ using.icon = ui_style
+ using.icon_state = "hand2"
+ using.screen_loc = ui_swaphand2
+ using.color = ui_color
+ using.alpha = ui_alpha
+ hud.adding += using
+
+ //Throw button
+ throw_icon = new /obj/screen()
+ throw_icon.icon = ui_style
+ throw_icon.icon_state = "act_throw_off"
+ throw_icon.name = "throw"
+ throw_icon.screen_loc = ui_drop_throw
+ throw_icon.color = ui_color
+ throw_icon.alpha = ui_alpha
+ hud.hotkeybuttons += throw_icon
+ hud_elements |= throw_icon
+
+ extra_huds(hud,ui_style,hud_elements)
+
+ client.screen = list()
+
+ client.screen += hud_elements
+ client.screen += adding + hotkeybuttons
+ client.screen += client.void
+
+ return
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index a21da32479..917790df41 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -1129,4 +1129,11 @@ mob/proc/yank_out_object()
/mob/proc/update_client_color()
if(client && client.color)
animate(client, color = null, time = 10)
- return
\ No newline at end of file
+ return
+
+/mob/proc/swap_hand()
+ return
+
+//Throwing stuff
+/mob/proc/throw_item(atom/target)
+ return
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index 1f7fb2d64d..cc446a0488 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -219,6 +219,15 @@
var/get_rig_stats = 0 //Moved from computer.dm
+
var/hud_typing = 0 //Typing indicator stuff.
var/typing //Simple mobs use this variable.
- var/obj/effect/decal/typing_indicator
\ No newline at end of file
+ var/obj/effect/decal/typing_indicator
+
+ var/low_priority = FALSE //Skip processing life() if there's just no players on this Z-level
+
+ var/default_pixel_x = 0 //For offsetting mobs
+ var/default_pixel_y = 0
+
+ var/attack_icon //Icon to use when attacking w/o anything in-hand
+ var/attack_icon_state //State for above
diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm
index cf14862981..1602c8cb47 100644
--- a/code/modules/mob/mob_grab.dm
+++ b/code/modules/mob/mob_grab.dm
@@ -181,6 +181,9 @@
//Updating pixelshift, position and direction
//Gets called on process, when the grab gets upgraded or the assailant moves
/obj/item/weapon/grab/proc/adjust_position()
+ if(!affecting)
+ qdel(src)
+ return
if(affecting.buckled)
animate(affecting, pixel_x = 0, pixel_y = 0, 4, 1, LINEAR_EASING)
return
@@ -236,7 +239,7 @@
if(!assailant.canmove || assailant.lying)
qdel(src)
return
-
+
var/datum/gender/TU = gender_datums[assailant.get_visible_gender()]
last_action = world.time
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index 451bac05d6..4b625e15f1 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -328,7 +328,7 @@ var/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HURT)
set name = "a-intent"
set hidden = 1
- if(ishuman(src) || isbrain(src) || isslime(src))
+ if(isliving(src))
switch(input)
if(I_HELP,I_DISARM,I_GRAB,I_HURT)
a_intent = input
diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm
index af72ba4dd4..b59bd402d3 100644
--- a/code/modules/mob/mob_movement.dm
+++ b/code/modules/mob/mob_movement.dm
@@ -51,14 +51,14 @@
attack_self()
return
if(SOUTHWEST)
- if(iscarbon(usr))
+ if(isliving(usr))
var/mob/living/carbon/C = usr
C.toggle_throw_mode()
else
usr << "This mob type cannot throw items."
return
if(NORTHWEST)
- if(iscarbon(usr))
+ if(isliving(usr))
var/mob/living/carbon/C = usr
if(!C.get_active_hand())
usr << "You have nothing to drop in your hand."
@@ -79,8 +79,9 @@
/client/verb/swap_hand()
set hidden = 1
- if(istype(mob, /mob/living/carbon))
- mob:swap_hand()
+ if(istype(mob, /mob/living))
+ var/mob/living/L = mob
+ L.swap_hand()
if(istype(mob,/mob/living/silicon/robot))
var/mob/living/silicon/robot/R = mob
R.cycle_modules()
diff --git a/code/modules/mob/update_icons.dm b/code/modules/mob/update_icons.dm
index 3eab4b967f..ae6e01a249 100644
--- a/code/modules/mob/update_icons.dm
+++ b/code/modules/mob/update_icons.dm
@@ -5,6 +5,7 @@
return
/mob/proc/update_icons()
+ update_icon() //Ugh.
return
/mob/proc/update_icons_layers(var/update_icons = TRUE)
diff --git a/code/modules/nano/modules/alarm_monitor.dm b/code/modules/nano/modules/alarm_monitor.dm
index f3fca46d43..264fdee9cc 100644
--- a/code/modules/nano/modules/alarm_monitor.dm
+++ b/code/modules/nano/modules/alarm_monitor.dm
@@ -26,7 +26,7 @@
/datum/nano_module/alarm_monitor/proc/all_alarms()
var/list/all_alarms = new()
for(var/datum/alarm_handler/AH in alarm_handlers)
- all_alarms += AH.alarms
+ all_alarms += AH.visible_alarms()
return all_alarms
diff --git a/code/modules/nano/modules/atmos_control.dm b/code/modules/nano/modules/atmos_control.dm
index 742696396b..b1dd3ab759 100644
--- a/code/modules/nano/modules/atmos_control.dm
+++ b/code/modules/nano/modules/atmos_control.dm
@@ -36,6 +36,8 @@
// TODO: Move these to a cache, similar to cameras
for(var/obj/machinery/alarm/alarm in (monitored_alarms.len ? monitored_alarms : machines))
+ if(!monitored_alarms.len && alarm.alarms_hidden)
+ continue
alarms[++alarms.len] = list(
"name" = sanitize(alarm.name),
"ref"= "\ref[alarm]",
diff --git a/code/modules/organs/internal/eyes.dm b/code/modules/organs/internal/eyes.dm
index 07d70bc6e2..77350a73db 100644
--- a/code/modules/organs/internal/eyes.dm
+++ b/code/modules/organs/internal/eyes.dm
@@ -93,3 +93,7 @@
/obj/item/organ/internal/eyes/proc/additional_flash_effects(var/intensity)
return -1
+
+/obj/item/organ/internal/eyes/emp_act(severity)
+ ..() //Returns if the organ isn't robotic
+ owner.eye_blurry += (4/severity)
\ No newline at end of file
diff --git a/code/modules/organs/subtypes/machine.dm b/code/modules/organs/subtypes/machine.dm
index b775f93a8e..55e3f2cd5f 100644
--- a/code/modules/organs/subtypes/machine.dm
+++ b/code/modules/organs/subtypes/machine.dm
@@ -17,6 +17,9 @@
owner.stat = 0
owner.visible_message("\The [owner] twitches visibly!")
+/obj/item/organ/internal/cell/emp_act(severity)
+ ..()
+ owner.nutrition = max(0, owner.nutrition - rand(10/severity, 50/severity))
// Used for an MMI or posibrain being installed into a human.
/obj/item/organ/internal/mmi_holder
@@ -83,6 +86,10 @@
holder_mob.drop_from_inventory(src)
qdel(src)
+/obj/item/organ/internal/mmi_holder/emp_act(severity)
+ ..()
+ owner.adjustToxLoss(rand(6/severity, 12/severity))
+
/obj/item/organ/internal/mmi_holder/posibrain
name = "positronic brain interface"
brain_type = /obj/item/device/mmi/digital/posibrain
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index b708e58253..4fd94901cc 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -35,6 +35,50 @@
var/const/signfont = "Times New Roman"
var/const/crayonfont = "Comic Sans MS"
+/obj/item/weapon/paper/card
+ name = "blank card"
+ desc = "A gift card with space to write on the cover."
+ icon_state = "greetingcard"
+ slot_flags = null //no fun allowed!!!!
+
+/obj/item/weapon/paper/card/AltClick() //No fun allowed
+ return
+
+/obj/item/weapon/paper/card/update_icon()
+ return
+
+/obj/item/weapon/paper/card/smile
+ name = "happy card"
+ desc = "A gift card with a smiley face on the cover."
+ icon_state = "greetingcard_smile"
+
+/obj/item/weapon/paper/card/cat
+ name = "cat card"
+ desc = "A gift card with a cat on the cover."
+ icon_state = "greetingcard_cat"
+
+/obj/item/weapon/paper/card/flower
+ name = "flower card"
+ desc = "A gift card with a flower on the cover."
+ icon_state = "greetingcard_flower"
+
+/obj/item/weapon/paper/card/heart
+ name = "heart card"
+ desc = "A gift card with a heart on the cover."
+ icon_state = "greetingcard_heart"
+
+/obj/item/weapon/paper/card/New()
+ ..()
+ pixel_y = rand(-8, 8)
+ pixel_x = rand(-9, 9)
+ stamps = null
+
+ if(info != initial(info))
+ info = html_encode(info)
+ info = replacetext(info, "\n", "
")
+ info = parsepencode(info)
+ return
+
/obj/item/weapon/paper/alien
name = "alien tablet"
desc = "It looks highly advanced"
@@ -319,7 +363,7 @@
if(P.lit && !user.restrained())
if(istype(P, /obj/item/weapon/flame/lighter/zippo))
class = "rose"
-
+
user.visible_message("[user] holds \the [P] up to \the [src], it looks like [TU.hes] trying to burn it!", \
"You hold \the [P] up to \the [src], burning it slowly.")
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 91114105bd..725e31c1ba 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -56,6 +56,9 @@
/obj/machinery/power/apc/hyper
cell_type = /obj/item/weapon/cell/hyper
+/obj/machinery/power/apc/alarms_hidden
+ alarms_hidden = TRUE
+
/obj/machinery/power/apc
name = "area power controller"
desc = "A control terminal for the area electrical systems."
@@ -107,12 +110,12 @@
var/failure_timer = 0
var/force_update = 0
var/updating_icon = 0
- var/secret = FALSE // If true, it won't show up on the alert computer.
var/global/list/status_overlays_lock
var/global/list/status_overlays_charging
var/global/list/status_overlays_equipment
var/global/list/status_overlays_lighting
var/global/list/status_overlays_environ
+ var/alarms_hidden = FALSE //If power alarms from this APC are visible on consoles
/obj/machinery/power/apc/updateDialog()
if (stat & (BROKEN|MAINT))
@@ -226,7 +229,7 @@
area.apc = src
if(istype(area, /area/submap))
- secret = TRUE
+ alarms_hidden = TRUE
update_icon()
@@ -1113,8 +1116,7 @@
equipment = autoset(equipment, 0)
lighting = autoset(lighting, 0)
environ = autoset(environ, 0)
- if(!secret)
- power_alarm.triggerAlarm(loc, src)
+ power_alarm.triggerAlarm(loc, src, hidden=alarms_hidden)
autoflag = 0
// update icon & area power if anything changed
@@ -1144,24 +1146,21 @@
equipment = autoset(equipment, 2)
lighting = autoset(lighting, 1)
environ = autoset(environ, 1)
- if(!secret)
- power_alarm.triggerAlarm(loc, src)
+ power_alarm.triggerAlarm(loc, src, hidden=alarms_hidden)
autoflag = 2
else if(cell.percent() <= 15) // <15%, turn off lighting & equipment
if((autoflag > 1 && longtermpower < 0) || (autoflag > 1 && longtermpower >= 0))
equipment = autoset(equipment, 2)
lighting = autoset(lighting, 2)
environ = autoset(environ, 1)
- if(!secret)
- power_alarm.triggerAlarm(loc, src)
+ power_alarm.triggerAlarm(loc, src, hidden=alarms_hidden)
autoflag = 1
else // zero charge, turn all off
if(autoflag != 0)
equipment = autoset(equipment, 0)
lighting = autoset(lighting, 0)
environ = autoset(environ, 0)
- if(!secret)
- power_alarm.triggerAlarm(loc, src)
+ power_alarm.triggerAlarm(loc, src, hidden=alarms_hidden)
autoflag = 0
// val 0=off, 1=off(auto) 2=on 3=on(auto)
diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm
index 8bda4d37ac..d574938d98 100644
--- a/code/modules/projectiles/guns/energy/special.dm
+++ b/code/modules/projectiles/guns/energy/special.dm
@@ -22,7 +22,7 @@
force = 5
slot_flags = SLOT_BELT|SLOT_HOLSTER
charge_cost = 480
- projectile_type = /obj/item/projectile/ion
+ projectile_type = /obj/item/projectile/ion/pistol
/obj/item/weapon/gun/energy/phasegun
name = "phase pistol"
diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm
index e86ff4c864..4e366bed6d 100644
--- a/code/modules/projectiles/projectile/special.dm
+++ b/code/modules/projectiles/projectile/special.dm
@@ -9,15 +9,26 @@
light_range = 2
light_power = 0.5
light_color = "#55AAFF"
- var/pulse_range = 1
-
+ var/sev1_range = 0
+ var/sev2_range = 1
+ var/sev3_range = 1
+ var/sev4_range = 2
/obj/item/projectile/ion/on_hit(var/atom/target, var/blocked = 0)
- empulse(target, pulse_range, pulse_range, pulse_range, pulse_range)
+ empulse(target, sev1_range, sev2_range, sev3_range, sev4_range)
return 1
/obj/item/projectile/ion/small
- pulse_range = 0
+ sev1_range = -1
+ sev2_range = 0
+ sev3_range = 0
+ sev4_range = 1
+
+/obj/item/projectile/ion/pistol
+ sev1_range = 0
+ sev2_range = 0
+ sev3_range = 0
+ sev4_range = 0
/obj/item/projectile/bullet/gyro
name ="explosive bolt"
diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm
index 7dd4bbeadd..37634ac28a 100644
--- a/code/modules/reagents/Chemistry-Recipes.dm
+++ b/code/modules/reagents/Chemistry-Recipes.dm
@@ -2210,9 +2210,8 @@
name = "Deuterium"
id = "deuterium"
result = null
- required_reagents = list("water" = 10)
- catalysts = list("hydrophoron" = 5)
- result_amount = 1
+ required_reagents = list("hydrophoron" = 5, "water" = 10)
+ result_amount = 15
/datum/chemical_reaction/deuterium/on_reaction(var/datum/reagents/holder, var/created_volume)
var/turf/T = get_turf(holder.my_atom)
diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm
index 9fb6314829..51f675ec7d 100644
--- a/code/modules/reagents/reagent_containers/food/snacks.dm
+++ b/code/modules/reagents/reagent_containers/food/snacks.dm
@@ -376,6 +376,29 @@
reagents.add_reagent("coco", 2)
bitesize = 2
+/obj/item/weapon/reagent_containers/food/snacks/chocolatepiece
+ name = "chocolate piece"
+ desc = "A luscious milk chocolate piece filled with gooey caramel."
+ icon_state = "chocolatepiece"
+ filling_color = "#7D5F46"
+ center_of_mass = list("x"=15, "y"=15)
+ nutriment_amt = 1
+ nutriment_desc = list("chocolate" = 3, "caramel" = 2, "lusciousness" = 1)
+ bitesize = 2
+
+/obj/item/weapon/reagent_containers/food/snacks/chocolatepiece/white
+ name = "white chocolate piece"
+ desc = "A creamy white chocolate piece drizzled in milk chocolate."
+ icon_state = "chocolatepiece_white"
+ filling_color = "#E2DAD3"
+ nutriment_desc = list("white chocolate" = 3, "creaminess" = 1)
+
+/obj/item/weapon/reagent_containers/food/snacks/chocolatepiece/truffle
+ name = "chocolate truffle"
+ desc = "A bite-sized milk chocolate truffle that could buy anyone's love."
+ icon_state = "chocolatepiece_truffle"
+ nutriment_desc = list("chocolate" = 3, "undying devotion" = 3)
+
/obj/item/weapon/reagent_containers/food/snacks/chocolateegg
name = "Chocolate Egg"
desc = "Such sweet, fattening food."
diff --git a/html/changelogs/Anewbe - Mines.yml b/html/changelogs/Anewbe - Mines.yml
new file mode 100644
index 0000000000..502771f248
--- /dev/null
+++ b/html/changelogs/Anewbe - Mines.yml
@@ -0,0 +1,40 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+#################################
+
+# Your name.
+author: Anewbe
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - rscadd: "Added a random mine spawner, for use in PoIs. Replaces mines in PoIs with the random spawner."
+ - rscadd: "Mines now give a visible message when they go off."
+ - tweak: "Land mines on the ground can no longer be told apart from one another, to prevent gaming the system."
+ - bugfix: "Hovering mobs (viscerators, drones, Poly, carp) no longer set off land mines."
+ - tweak: "Arming a land mine now takes concentration. If you move, it will boom."
diff --git a/html/changelogs/BattlefieldCommander-doyouwannabuildasnowman.yml b/html/changelogs/BattlefieldCommander-doyouwannabuildasnowman.yml
new file mode 100644
index 0000000000..4ee55c6114
--- /dev/null
+++ b/html/changelogs/BattlefieldCommander-doyouwannabuildasnowman.yml
@@ -0,0 +1,38 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+#################################
+
+# Your name.
+author: battlefieldCommander
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - rscadd: "Added packed snow brick material. Craft it using snow piles."
+ - recadd: "Added snow girders and igloo walls. Craft them using snow bricks."
+ - rscadd: "Added various snowmen. Craft them using snow piles. Punch 'em to destroy."
\ No newline at end of file
diff --git a/html/changelogs/PrismaticGynoid-universalponchos.yml b/html/changelogs/PrismaticGynoid-universalponchos.yml
new file mode 100644
index 0000000000..185525498b
--- /dev/null
+++ b/html/changelogs/PrismaticGynoid-universalponchos.yml
@@ -0,0 +1,4 @@
+author: PrismaticGynoid
+delete-after: True
+changes:
+ - tweak: "Changed department ponchos to be open to any job, just like department jackets."
diff --git a/html/changelogs/schnayy-giftcrates.yml b/html/changelogs/schnayy-giftcrates.yml
new file mode 100644
index 0000000000..08c0668df5
--- /dev/null
+++ b/html/changelogs/schnayy-giftcrates.yml
@@ -0,0 +1,9 @@
+author: Schnayy
+
+delete-after: True
+
+changes:
+ - rscadd: "Adds bouquets. Can be ordered via 'gift crate' in cargo."
+ - rscadd: "Adds fake bouquets for the cheap. Can currently be won from arcade machines."
+ - rscadd: "Adds chocolate heart-shaped boxes. Can be ordered via 'gift crate' in cargo."
+ - rscadd: "Adds gift cards with four cover variations. Function like paper. Can be ordered via 'gift crate' in cargo."
\ No newline at end of file
diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi
index adcd4fbee2..1bbb1d7d76 100644
Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ
diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi
index 75249fb4ab..c497e7c73d 100644
Binary files a/icons/mob/hud.dmi and b/icons/mob/hud.dmi differ
diff --git a/icons/mob/items/lefthand.dmi b/icons/mob/items/lefthand.dmi
index a7628b6aeb..a42fe56547 100644
Binary files a/icons/mob/items/lefthand.dmi and b/icons/mob/items/lefthand.dmi differ
diff --git a/icons/mob/items/righthand.dmi b/icons/mob/items/righthand.dmi
index 4dd154277e..54720b1f6d 100644
Binary files a/icons/mob/items/righthand.dmi and b/icons/mob/items/righthand.dmi differ
diff --git a/icons/mob/screen1_animal.dmi b/icons/mob/screen1_animal.dmi
new file mode 100644
index 0000000000..51b971a075
Binary files /dev/null and b/icons/mob/screen1_animal.dmi differ
diff --git a/icons/obj/bureaucracy.dmi b/icons/obj/bureaucracy.dmi
index e8d3946b34..e32b870d99 100644
Binary files a/icons/obj/bureaucracy.dmi and b/icons/obj/bureaucracy.dmi differ
diff --git a/icons/obj/food.dmi b/icons/obj/food.dmi
index 14f54fb5dc..d282fb3e6a 100644
Binary files a/icons/obj/food.dmi and b/icons/obj/food.dmi differ
diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi
index bebe9efbee..b8dc87695a 100644
Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ
diff --git a/icons/obj/library.dmi b/icons/obj/library.dmi
index 6a1f99d2cd..4ef2ddddc6 100644
Binary files a/icons/obj/library.dmi and b/icons/obj/library.dmi differ
diff --git a/icons/obj/snowman.dmi b/icons/obj/snowman.dmi
new file mode 100644
index 0000000000..ba6444df3f
Binary files /dev/null and b/icons/obj/snowman.dmi differ
diff --git a/icons/obj/stacks.dmi b/icons/obj/stacks.dmi
index 5146598051..f25ca29526 100644
Binary files a/icons/obj/stacks.dmi and b/icons/obj/stacks.dmi differ
diff --git a/maps/southern_cross/loadout/loadout_accessories.dm b/maps/southern_cross/loadout/loadout_accessories.dm
index 31e900f89b..1a23e18e9c 100644
--- a/maps/southern_cross/loadout/loadout_accessories.dm
+++ b/maps/southern_cross/loadout/loadout_accessories.dm
@@ -27,3 +27,8 @@
display_name = "drop pouches, white"
path = /obj/item/clothing/accessory/storage/white_drop_pouches
allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor","Search and Rescue","Explorer","Shaft Miner")
+
+/datum/gear/accessory/holster
+ display_name = "holster selection (Security, CD, HoP)"
+ path = /obj/item/clothing/accessory/holster
+ allowed_roles = list("Colony Director","Head of Personnel","Security Officer","Warden","Head of Security","Detective","Explorer")
\ No newline at end of file
diff --git a/maps/submaps/surface_submaps/plains/Boathouse.dmm b/maps/submaps/surface_submaps/plains/Boathouse.dmm
new file mode 100644
index 0000000000..24463d7810
--- /dev/null
+++ b/maps/submaps/surface_submaps/plains/Boathouse.dmm
@@ -0,0 +1,117 @@
+"aa" = (/turf/template_noop,/area/template_noop)
+"ab" = (/turf/template_noop,/area/submap/Boathouse)
+"ac" = (/turf/simulated/floor/outdoors/rocks,/area/submap/Boathouse)
+"ad" = (/turf/simulated/floor/water,/area/submap/Boathouse)
+"ae" = (/turf/simulated/floor/water/deep,/area/submap/Boathouse)
+"af" = (/obj/structure/flora/tree/sif,/turf/template_noop,/area/submap/Boathouse)
+"ag" = (/obj/structure/table/bench/wooden,/turf/template_noop,/area/submap/Boathouse)
+"ah" = (/obj/structure/table/woodentable,/turf/template_noop,/area/submap/Boathouse)
+"ai" = (/turf/simulated/wall/wood,/area/submap/Boathouse)
+"aj" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/obj/item/clothing/accessory/jacket,/obj/item/clothing/accessory/jacket,/obj/item/clothing/head/beanie,/turf/simulated/floor/wood,/area/submap/Boathouse)
+"ak" = (/turf/simulated/floor/wood,/area/submap/Boathouse)
+"al" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/obj/item/weapon/gun/projectile/shotgun/doublebarrel,/obj/item/weapon/storage/box/beanbags,/turf/simulated/floor/wood,/area/submap/Boathouse)
+"am" = (/turf/simulated/floor/carpet/turcarpet,/area/submap/Boathouse)
+"an" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/toolbox/mechanical,/turf/simulated/floor/wood,/area/submap/Boathouse)
+"ao" = (/obj/structure/railing{dir = 8},/obj/structure/railing,/turf/simulated/floor/water,/area/submap/Boathouse)
+"ap" = (/obj/structure/railing,/turf/simulated/floor/water,/area/submap/Boathouse)
+"aq" = (/obj/item/weapon/stool/padded,/turf/simulated/floor/wood,/area/submap/Boathouse)
+"ar" = (/obj/structure/table/woodentable,/obj/item/weapon/deck/cards,/turf/simulated/floor/carpet/turcarpet,/area/submap/Boathouse)
+"as" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/snacks/chips,/turf/simulated/floor/carpet/turcarpet,/area/submap/Boathouse)
+"at" = (/obj/structure/table/woodentable,/obj/item/trash/candle,/turf/simulated/floor/wood,/area/submap/Boathouse)
+"au" = (/obj/item/weapon/stool,/turf/simulated/floor/wood,/area/submap/Boathouse)
+"av" = (/turf/simulated/floor/wood{tag = "icon-wood_broken6"; icon_state = "wood_broken6"},/area/submap/Boathouse)
+"aw" = (/obj/structure/railing{dir = 8},/turf/simulated/floor/water,/area/submap/Boathouse)
+"ax" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey,/turf/simulated/floor/carpet/turcarpet,/area/submap/Boathouse)
+"ay" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/glass2/shot,/turf/simulated/floor/carpet/turcarpet,/area/submap/Boathouse)
+"az" = (/obj/structure/table/woodentable,/obj/item/weapon/tape_roll,/obj/random/firstaid,/turf/simulated/floor/wood,/area/submap/Boathouse)
+"aA" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/glass2/shot,/obj/item/weapon/reagent_containers/food/drinks/glass2/shot,/obj/item/weapon/reagent_containers/food/drinks/glass2/shot,/turf/simulated/floor/carpet/turcarpet,/area/submap/Boathouse)
+"aB" = (/turf/simulated/floor/wood{tag = "icon-wood_broken2"; icon_state = "wood_broken2"},/area/submap/Boathouse)
+"aC" = (/obj/structure/railing{dir = 8},/obj/structure/railing{tag = "icon-railing0 (NORTH)"; icon_state = "railing0"; dir = 1},/turf/simulated/floor/water,/area/submap/Boathouse)
+"aD" = (/obj/structure/railing{tag = "icon-railing0 (NORTH)"; icon_state = "railing0"; dir = 1},/turf/simulated/floor/water,/area/submap/Boathouse)
+"aE" = (/obj/vehicle/boat/sifwood,/turf/simulated/floor/water,/area/submap/Boathouse)
+"aF" = (/obj/structure/window/reinforced/full,/turf/simulated/floor/wood,/area/submap/Boathouse)
+"aG" = (/obj/structure/table/woodentable,/obj/item/weapon/oar,/obj/item/weapon/oar,/turf/simulated/floor/wood,/area/submap/Boathouse)
+"aH" = (/obj/structure/railing{tag = "icon-railing0 (WEST)"; icon_state = "railing0"; dir = 8},/turf/simulated/floor/water,/area/submap/Boathouse)
+"aI" = (/obj/structure/table/woodentable,/obj/item/weapon/cell/device/weapon,/turf/simulated/floor/wood,/area/submap/Boathouse)
+"aJ" = (/turf/simulated/floor/wood{tag = "icon-wood_broken4"; icon_state = "wood_broken4"},/area/submap/Boathouse)
+"aK" = (/obj/structure/railing{tag = "icon-railing0 (WEST)"; icon_state = "railing0"; dir = 8},/obj/structure/railing{tag = "icon-railing0 (NORTH)"; icon_state = "railing0"; dir = 1},/turf/simulated/floor/water,/area/submap/Boathouse)
+"aL" = (/obj/structure/simple_door/wood,/turf/simulated/floor/wood,/area/submap/Boathouse)
+"aM" = (/obj/structure/closet/secure_closet/freezer/fridge,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/fruitsalad,/turf/simulated/floor/wood,/area/submap/Boathouse)
+"aN" = (/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/submap/Boathouse)
+"aO" = (/turf/simulated/floor/carpet/bcarpet,/area/submap/Boathouse)
+"aP" = (/obj/structure/window/reinforced/full,/turf/simulated/wall/wood,/area/submap/Boathouse)
+"aQ" = (/obj/structure/table/woodentable,/obj/item/weapon/material/knife,/turf/simulated/floor/wood,/area/submap/Boathouse)
+"aR" = (/obj/structure/bookcase,/turf/simulated/floor/carpet/bcarpet,/area/submap/Boathouse)
+"aS" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/bag/trash,/turf/simulated/floor/wood,/area/submap/Boathouse)
+"aT" = (/obj/structure/table/woodentable,/obj/item/weapon/flame/lighter,/obj/item/weapon/storage/fancy/candle_box,/turf/simulated/floor/wood,/area/submap/Boathouse)
+"aU" = (/obj/structure/bed/chair/wood,/turf/simulated/floor/carpet/bcarpet,/area/submap/Boathouse)
+"aV" = (/obj/structure/table/rack,/obj/item/clothing/accessory/poncho/blue,/obj/item/clothing/accessory/poncho/blue,/turf/simulated/floor/wood,/area/submap/Boathouse)
+"aW" = (/obj/structure/coatrack,/turf/simulated/floor/wood,/area/submap/Boathouse)
+"aX" = (/obj/structure/table/rack,/obj/item/clothing/suit/storage/hooded/wintercoat,/obj/item/clothing/suit/storage/hooded/wintercoat,/obj/item/clothing/head/hood/winter,/obj/item/clothing/shoes/boots/winter,/turf/simulated/floor/wood,/area/submap/Boathouse)
+"aY" = (/obj/structure/table/rack,/obj/item/clothing/accessory/storage,/obj/item/clothing/accessory/storage,/turf/simulated/floor/wood,/area/submap/Boathouse)
+"aZ" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp,/turf/simulated/floor/carpet/bcarpet,/area/submap/Boathouse)
+"ba" = (/obj/structure/table/woodentable,/turf/simulated/floor/carpet/bcarpet,/area/submap/Boathouse)
+"bb" = (/turf/simulated/floor/outdoors/dirt,/area/submap/Boathouse)
+
+(1,1,1) = {"
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaabababababababababababacacacacacacacacacacacacacacacacacacabababababababababaa
+aaabababababababababacacadadadadadadadadadadadadadadadadadadacacabababababababaa
+aaabababababababacacacacadadadadadadadadadadadadadadadadadadadacacacabababababaa
+aaababababababacacadadadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeadadadacacababababaa
+aaabababababacacadadadadadadadadadadadaeaeaeaeaeaeaeaeaeaeadadadadadacacabababaa
+aaababababacacadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadacababababaa
+aaabababacacadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadacababababaa
+aaabababacadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadacacababababaa
+aaababacacadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadacabababababaa
+aaabacacadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeadadadadadacacabababababaa
+aaabacadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadadadadadadadacababababababaa
+aaacacadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeadadadadadadadadadadadacababababababaa
+aaacadadadadadadadaeaeaeaeaeaeaeaeaeaeaeadadadadadadadadadadacacacababababababaa
+aaacadadadadadadadaeaeaeaeaeaeaeaeaeaeadadadadadadadadadacacacababababababababaa
+aaacacadadadadadadaeaeaeaeaeaeaeaeaeaeadadadadacacacacacacababababababababababaa
+aaabacadadadadadadaeaeaeaeaeaeaeaeaeaeadadadacacababababababababafababababababaa
+aaabacacadadadadadaeaeaeaeaeaeaeaeaeadadadadacababagagagagababababababababababaa
+aaababacacadadadadadaeaeaeaeaeaeaeaeadadadacabababahahahahababababababababababaa
+aaabababacadadadadadaeaeadaeaeaeaeaeadadadacabababagagagagababababababababababaa
+aaabababacacacadadadadaeadadaeaeaeaeaeadadacacabababababababababababafababababaa
+aaabababababacacacadadadadadaeaeaeaeaeadadadacacacababababababababababababababaa
+aaababababababacacacadadadadaeaeaeaeaeadadadadadacacacabababacacacacabababababaa
+aaababababababababacacacadadaeaeaeaeaeadadadadadadadacacacacacadadacacababababaa
+aaababababababababababacadadaeaeaeaeaeadaeadadadadadadadadadadadadadacababababaa
+aaababababababababababacadadadaeaeaeaeaeaeadadadadadadadadadadadadadacacabababaa
+aaababababababababababacadadadaeaeaeaeaeaeaeadadadadadadadadadadadadadacabababaa
+aaababababababababababacadadadadaeaeaeaeaeaeadadadadadadadadaeaeadadadacacababaa
+aaabababababababababacacadadadadaeaeaeaeaeaeaeaeaeadadadadaeaeaeadadadadacacabaa
+aaabababababababababacacadadadadadaeaeaeaeaeaeaeaeaeaeadaeaeaeadadadadadadacabaa
+aaabababababababababacacadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadadadacabaa
+aaabababababababababacacadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeadadadadadacacabaa
+aaababababababababacacadadadadadadadadadaeaeaeaeaeaeaeaeaeaeadadadadadadacacabaa
+aaababababababababacacadadadadadadadadadaeaeaeaeaeaeaeaeaeaeadadadadadadadacabaa
+aaabababababababababacadadadadadadadadadadaeaeaeaeaeaeaeaeaeadadadadadadadacabaa
+aaabababaiaiaiaiaiaiacacadadadadadadadadadaeaeaeaeaeaeaeaeaeadadadadadadadacabaa
+aaabaiaiaiaiaiaiaiaiaiaiaiaiaiaiadadadadadadaeaeaeaeaeaeaeaeadadadadadadadacabaa
+aaaiaiajakakalaiakakakakaiaiaiaiadadadadadadaeaeaeaeaeaeaeaeadadadadadadacacabaa
+aaaiaiakamamakaianakakakaoapapapadadadadadadaeaeaeaeaeaeaeadadadadadadacacababaa
+aaaiaiaqarasaqaiatauakakakavakakawadadadadadaeaeaeaeaeaeaeadadadadadadacabababaa
+aaaiaiaqaxayaqaiazakakakakakakakawadadadadadadaeaeaeaeaeaeadadadadadadacabababaa
+aaaiaiaqaAayaqaiakakakaBaCaDaEaDadadadadadadadaeaeaeaeaeaeadadadadadacacabababaa
+aaaiaiakamamakaiakakakakawadadadadadadadadadaeaeaeaeaeaeadadadadadadadacabababaa
+aaabaFakamamakaiaGakakakaoapadapadadadadadadaeaeaeaeaeaeadadadadadadadacacababaa
+aaabaFakamamakaiatauakakakakakakaHadadadadadaeaeaeaeaeaeadadadadadadadadacababaa
+aaabaFakamamakaiaIakakakakakaJakaHadadadadadadaeaeaeaeaeaeaeaeadadadadadacacabaa
+aaabaFakamamakaiakakakakaKaDaDaDadadadadadadadadaeaeaeaeaeaeaeaeadadadadadacabaa
+aaabaFakamamakaiaiaLaiakaHadadadadadadadadadadadaeaeaeaeadaeaeaeadadadadadacabaa
+aaaiaiakamamakaiaiakaiakaHadadadadadadadadadadadaeaeaeaeadadadaeaeadadadadacabaa
+aaaiaiaMamamakaiaiaLaiaiaiaiaiaiadadadadadadadadaeaeaeadadadadadadadadadacacabaa
+aaaiaiaNamamakakakakakakaLaOaOaPadadadadadadadadaeaeadadadadadadadadadadacababaa
+aaaiaiaQamamamamamamamakaiaRaOaPadadadadadadadaeaeaeadadadadadadadadadadacababaa
+aaaiaiaSaTakakamamamamakaiaRaUaPadadadadadadadaeaeaeadadadadadadadadadadacababaa
+aaaiaiaiaiaiaVaWakakaXaYaiaZbaaPadadadadadadadaeaeaeadadadadadadadadadacacababaa
+aaabaiaiaiaiaiaiaLaLaiaiaiaiaiaiadadadadadadadadadadadadadadadadadadadacabababaa
+aaababaiaiaiabaiakakaiabaiaiaiacacacadadadadadadadadadadadadadadadadadacabababaa
+aaababababababaiaLaLaiababababababacacacacadadadadadacacadadadadadacacacabababaa
+aaababbbbbbbbbbbbbbbbbbbbbbbbbababababacacacadadacacacacacacacacacacabababababaa
+aaabababababbbbbbbbbbbbbbbbbbbbbbbbbabababacacacacababababababababababababababaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+"}
diff --git a/maps/submaps/surface_submaps/plains/Diner.dmm b/maps/submaps/surface_submaps/plains/Diner.dmm
new file mode 100644
index 0000000000..33c7a8d150
--- /dev/null
+++ b/maps/submaps/surface_submaps/plains/Diner.dmm
@@ -0,0 +1,110 @@
+"aa" = (/turf/template_noop,/area/template_noop)
+"ab" = (/turf/template_noop,/area/submap/Diner)
+"ac" = (/turf/simulated/floor/outdoors/dirt,/area/submap/Diner)
+"ad" = (/turf/simulated/wall,/area/submap/Diner)
+"ae" = (/obj/structure/window/reinforced/full,/turf/simulated/floor/tiled/white,/area/submap/Diner)
+"af" = (/obj/effect/floor_decal/corner/red/diagonal,/turf/simulated/floor/tiled/white,/area/submap/Diner)
+"ag" = (/obj/structure/table/standard,/obj/machinery/microwave,/turf/simulated/floor/tiled/white,/area/submap/Diner)
+"ah" = (/obj/structure/table/standard,/turf/simulated/floor/tiled/white,/area/submap/Diner)
+"ai" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/condiment/enzyme,/obj/item/weapon/reagent_containers/glass/beaker,/turf/simulated/floor/tiled/white,/area/submap/Diner)
+"aj" = (/obj/structure/table/standard,/obj/machinery/light{dir = 1},/obj/item/weapon/material/knife/butch,/turf/simulated/floor/tiled/white,/area/submap/Diner)
+"ak" = (/obj/machinery/vending/cola,/turf/simulated/floor/tiled/white,/area/submap/Diner)
+"al" = (/obj/machinery/vending/dinnerware,/turf/simulated/floor/tiled/white,/area/submap/Diner)
+"am" = (/obj/structure/sink/kitchen,/turf/simulated/wall,/area/submap/Diner)
+"an" = (/obj/structure/flora/tree/sif,/turf/template_noop,/area/submap/Diner)
+"ao" = (/obj/structure/bed/chair/wood{dir = 1},/obj/effect/floor_decal/corner/red/diagonal,/turf/simulated/floor/tiled/white,/area/submap/Diner)
+"ap" = (/turf/simulated/floor/tiled/white,/area/submap/Diner)
+"aq" = (/obj/effect/floor_decal/corner/red/diagonal,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/white,/area/submap/Diner)
+"ar" = (/obj/effect/floor_decal/corner/red/diagonal,/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/condiment/small/saltshaker,/obj/item/weapon/material/kitchen/utensil/fork,/turf/simulated/floor/tiled/white,/area/submap/Diner)
+"as" = (/obj/effect/floor_decal/corner/red/diagonal,/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/condiment/small/peppermill,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled/white,/area/submap/Diner)
+"at" = (/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/submap/Diner)
+"au" = (/obj/structure/table/standard,/obj/item/weapon/book/manual/chef_recipes,/turf/simulated/floor/tiled/white,/area/submap/Diner)
+"av" = (/obj/structure/table/standard,/obj/item/weapon/material/kitchen/rollingpin,/turf/simulated/floor/tiled/white,/area/submap/Diner)
+"aw" = (/obj/machinery/cooker/cereal,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled/white,/area/submap/Diner)
+"ax" = (/obj/structure/bed/chair/wood,/obj/effect/floor_decal/corner/red/diagonal,/turf/simulated/floor/tiled/white,/area/submap/Diner)
+"ay" = (/obj/structure/closet/secure_closet/freezer/fridge,/obj/item/weapon/storage/fancy/egg_box,/obj/item/weapon/storage/fancy/egg_box,/obj/item/weapon/reagent_containers/food/drinks/bottle/milk,/obj/item/weapon/reagent_containers/food/drinks/bottle/milk,/obj/item/weapon/reagent_containers/food/drinks/bottle/milk,/obj/item/weapon/reagent_containers/food/drinks/bottle/cream,/obj/item/weapon/reagent_containers/food/drinks/bottle/cream,/obj/item/weapon/reagent_containers/food/drinks/bottle/cream,/obj/item/weapon/reagent_containers/food/drinks/bottle/cream,/obj/item/weapon/reagent_containers/food/condiment/sugar,/turf/simulated/floor/tiled/white,/area/submap/Diner)
+"az" = (/obj/structure/simple_door/wood,/turf/simulated/floor/tiled/white,/area/submap/Diner)
+"aA" = (/obj/structure/simple_door/wood,/turf/simulated/wall,/area/submap/Diner)
+"aB" = (/obj/structure/simple_door/wood,/turf/simulated/floor/tiled/freezer,/area/submap/Diner)
+"aC" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/condiment/small/saltshaker,/obj/effect/floor_decal/corner/red/diagonal,/obj/item/weapon/material/kitchen/utensil/fork,/turf/simulated/floor/tiled/white,/area/submap/Diner)
+"aD" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/condiment/small/peppermill,/obj/effect/floor_decal/corner/red/diagonal,/turf/simulated/floor/tiled/white,/area/submap/Diner)
+"aE" = (/obj/effect/floor_decal/corner/red/diagonal,/obj/item/weapon/stool/padded,/turf/simulated/floor/tiled/white,/area/submap/Diner)
+"aF" = (/obj/structure/table/standard,/obj/effect/floor_decal/corner/red/diagonal,/turf/simulated/floor/tiled/white,/area/submap/Diner)
+"aG" = (/obj/effect/floor_decal/corner/red{dir = 5},/turf/simulated/floor/tiled/white,/area/submap/Diner)
+"aH" = (/turf/simulated/floor/tiled,/area/submap/Diner)
+"aI" = (/turf/simulated/floor/tiled/freezer,/area/submap/Diner)
+"aJ" = (/obj/structure/closet/crate/freezer,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/turf/simulated/floor/tiled/freezer,/area/submap/Diner)
+"aK" = (/obj/structure/table/standard,/obj/effect/floor_decal/corner/red/diagonal,/obj/item/weapon/reagent_containers/food/condiment/small/saltshaker,/turf/simulated/floor/tiled/white,/area/submap/Diner)
+"aL" = (/obj/effect/floor_decal/corner/red/diagonal,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled/white,/area/submap/Diner)
+"aM" = (/obj/machinery/light/small{brightness_color = "#DA0205"; brightness_power = 1; brightness_range = 5; dir = 8},/turf/simulated/floor/tiled,/area/submap/Diner)
+"aN" = (/obj/machinery/light/small{brightness_color = "#DA0205"; brightness_power = 1; brightness_range = 5; dir = 8},/turf/simulated/floor/tiled/freezer,/area/submap/Diner)
+"aO" = (/obj/structure/closet/crate/freezer,/obj/machinery/light/small{dir = 4},/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/turf/simulated/floor/tiled/freezer,/area/submap/Diner)
+"aP" = (/obj/structure/table/standard,/obj/effect/floor_decal/corner/red/diagonal,/obj/item/weapon/reagent_containers/food/condiment/small/peppermill,/turf/simulated/floor/tiled/white,/area/submap/Diner)
+"aQ" = (/obj/effect/floor_decal/corner/red/diagonal,/obj/structure/table/standard,/obj/machinery/microwave,/turf/simulated/floor/tiled/white,/area/submap/Diner)
+"aR" = (/obj/structure/closet/crate/freezer,/obj/item/weapon/reagent_containers/food/condiment/flour,/obj/item/weapon/reagent_containers/food/condiment/flour,/obj/item/weapon/reagent_containers/food/condiment/flour,/obj/item/weapon/reagent_containers/food/condiment/flour,/obj/item/weapon/reagent_containers/food/condiment/flour,/obj/item/weapon/reagent_containers/food/condiment/flour,/obj/item/weapon/reagent_containers/food/condiment/flour,/turf/simulated/floor/tiled/freezer,/area/submap/Diner)
+"aS" = (/obj/effect/floor_decal/corner/red/diagonal,/obj/structure/coatrack,/turf/simulated/floor/tiled/white,/area/submap/Diner)
+"aT" = (/obj/effect/floor_decal/corner/red/diagonal,/obj/structure/table/standard,/turf/simulated/floor/tiled/white,/area/submap/Diner)
+"aU" = (/obj/structure/closet/crate/freezer,/turf/simulated/floor/tiled/freezer,/area/submap/Diner)
+"aV" = (/obj/machinery/gibber,/turf/simulated/floor/tiled/freezer,/area/submap/Diner)
+"aW" = (/obj/machinery/light/small,/turf/simulated/floor/tiled/white,/area/submap/Diner)
+"aX" = (/obj/effect/floor_decal/corner/red{dir = 9},/turf/simulated/floor/tiled/white,/area/submap/Diner)
+"aY" = (/obj/machinery/cooker/fryer,/turf/simulated/floor/tiled/white,/area/submap/Diner)
+"aZ" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/outdoors/dirt,/area/submap/Diner)
+"ba" = (/obj/effect/floor_decal/corner/red/diagonal,/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/submap/Diner)
+"bb" = (/obj/effect/floor_decal/corner/red/diagonal,/obj/machinery/cooker/grill,/turf/simulated/floor/tiled/white,/area/submap/Diner)
+"bc" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/submap/Diner)
+"bd" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/tiled,/area/submap/Diner)
+"be" = (/obj/structure/simple_door/wood,/turf/simulated/floor/tiled,/area/submap/Diner)
+"bf" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled/white,/area/submap/Diner)
+"bg" = (/obj/effect/floor_decal/corner/red/diagonal,/obj/structure/closet/secure_closet/freezer/fridge,/obj/item/weapon/storage/fancy/egg_box,/obj/item/weapon/storage/fancy/egg_box,/obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice,/obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice,/obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice,/obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice,/obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice,/obj/item/weapon/reagent_containers/food/drinks/bottle/milk,/obj/item/weapon/reagent_containers/food/drinks/bottle/milk,/obj/item/weapon/reagent_containers/food/drinks/bottle/milk,/obj/item/weapon/reagent_containers/food/drinks/bottle/milk,/obj/item/weapon/reagent_containers/food/drinks/bottle/cream,/obj/item/weapon/reagent_containers/food/drinks/bottle/cream,/turf/simulated/floor/tiled/white,/area/submap/Diner)
+"bh" = (/obj/structure/table/standard,/obj/machinery/chemical_dispenser/bar_coffee,/turf/simulated/floor/tiled/white,/area/submap/Diner)
+"bi" = (/obj/item/frame/apc,/turf/simulated/floor/lino,/area/submap/Diner)
+"bj" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp,/turf/simulated/floor/lino,/area/submap/Diner)
+"bk" = (/obj/structure/bed/chair/office/light,/turf/simulated/floor/lino,/area/submap/Diner)
+"bl" = (/turf/simulated/floor/lino,/area/submap/Diner)
+"bm" = (/obj/structure/bed/chair/wood{dir = 1},/obj/effect/floor_decal/corner/red/diagonal,/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/submap/Diner)
+"bn" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/lino,/area/submap/Diner)
+"bo" = (/obj/structure/table/woodentable,/obj/item/weapon/cell/high,/turf/simulated/floor/lino,/area/submap/Diner)
+"bp" = (/obj/structure/table/woodentable,/turf/simulated/floor/lino,/area/submap/Diner)
+"bq" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/lino,/area/submap/Diner)
+"br" = (/obj/structure/simple_door/wood,/turf/simulated/floor/lino,/area/submap/Diner)
+"bs" = (/obj/effect/floor_decal/corner/red/diagonal,/obj/structure/windoor_assembly{tag = "icon-l_windoor_assembly01"; icon_state = "l_windoor_assembly01"; dir = 2},/turf/simulated/floor/tiled/white,/area/submap/Diner)
+"bt" = (/obj/structure/bookcase,/turf/simulated/floor/lino,/area/submap/Diner)
+"bu" = (/obj/effect/floor_decal/corner/red/diagonal,/obj/machinery/space_heater,/obj/machinery/light,/turf/simulated/floor/tiled/white,/area/submap/Diner)
+"bv" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/tiled/hydro,/area/submap/Diner)
+"bw" = (/turf/simulated/floor/tiled/hydro,/area/submap/Diner)
+"bx" = (/obj/structure/toilet,/turf/simulated/floor/tiled/hydro,/area/submap/Diner)
+"by" = (/obj/structure/bed/chair/wood{dir = 4},/obj/effect/floor_decal/corner/red/diagonal,/turf/simulated/floor/tiled/white,/area/submap/Diner)
+"bz" = (/obj/structure/bed/chair/wood{dir = 8},/obj/effect/floor_decal/corner/red/diagonal,/turf/simulated/floor/tiled/white,/area/submap/Diner)
+"bA" = (/obj/structure/simple_door/wood,/turf/simulated/floor/tiled/hydro,/area/submap/Diner)
+"bB" = (/obj/structure/mirror{dir = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/tiled/hydro,/area/submap/Diner)
+"bC" = (/obj/machinery/light/small,/turf/simulated/floor/tiled/hydro,/area/submap/Diner)
+"bD" = (/obj/structure/table/standard,/turf/simulated/floor/tiled/hydro,/area/submap/Diner)
+
+(1,1,1) = {"
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaabababacabababababadaeaeadadadadadadadadabababaa
+aaabababacacabababadadafafadagahaiajakalamadababaa
+aaabanacacacababadadafaoaoadapapapapapapapadadabaa
+aaababacacacabadadaqafarasadatapauahavapapawadadaa
+aaababacacacabadafafafaxaxadapapapapapapapapayadaa
+aaababacacacabaeaoaoafafafadazazadaAadadaBadadadaa
+aaababacacacabaeaCaDafafaEaFaGaGadaHadaIaIaIaJadaa
+aaababacacacabaeaxaxafafaEaKafaLadaMadaNaIaIaOadaa
+aaababacacacabadafafafafaEaPafaQadaHadaRaIaIaIadaa
+aaababacacacacadadadaSafaEaFafaTadaHadaUaIaIaVadaa
+aaababacacacacazaWazaXafaEaFafaYadaHadadadadadadaa
+aaababacacacaZadadadbaafaEaFafbbadaHbcbdaHbebdbeaa
+aaanabacacacabaeaoaoafafaEaFafbfadbcbcbcbcbeaHbeaa
+aaababacacacabaeaCaDafafaEaFafbgadbcadadadadadadaa
+aaababacacacabaeaxaxafafaEaFafbhadaHadbibjbkbladaa
+aaababacacacabadbmaoafafaEaPafahadaHadbnbobpbqadaa
+aaababacacacabaeaCaDafafaEaKafaLadaMbrblblblbladaa
+aaababacacacabaeaxaxafafaEaFahbsadaHadblblbtbtadaa
+aaababacacacabaeafafafafafafafafadadadadadadadadaa
+aaababacacacabadadbuafafafafafafadbvbwbxadadadadaa
+aaabababacabababadadafafbyaDbzafbAbwbwbwadadadabaa
+aaabanababababababadadafbyaCbzafadbBbCbDadadababaa
+aaabababababababababadadaeaeaeadadadadadadabababaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+"}
diff --git a/maps/submaps/surface_submaps/plains/Mechpt.dmm b/maps/submaps/surface_submaps/plains/Mechpt.dmm
new file mode 100644
index 0000000000..3f122e9900
--- /dev/null
+++ b/maps/submaps/surface_submaps/plains/Mechpt.dmm
@@ -0,0 +1,45 @@
+"a" = (/turf/template_noop,/area/template_noop)
+"b" = (/turf/template_noop,/area/submap/Mechpt)
+"c" = (/obj/item/trash/chips,/turf/template_noop,/area/submap/Mechpt)
+"d" = (/obj/structure/railing,/turf/template_noop,/area/submap/Mechpt)
+"e" = (/obj/structure/railing,/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/snacks/chips,/turf/template_noop,/area/submap/Mechpt)
+"f" = (/obj/structure/railing,/obj/structure/table/woodentable,/obj/item/weapon/cell/high,/obj/item/weapon/cell/high,/turf/template_noop,/area/submap/Mechpt)
+"g" = (/obj/structure/railing,/obj/structure/table/woodentable,/turf/template_noop,/area/submap/Mechpt)
+"h" = (/obj/structure/railing,/obj/structure/table/woodentable,/obj/item/weapon/spacecash/c10,/obj/item/weapon/spacecash/c10,/turf/template_noop,/area/submap/Mechpt)
+"i" = (/obj/structure/railing{tag = "icon-railing0 (EAST)"; icon_state = "railing0"; dir = 4},/turf/template_noop,/area/submap/Mechpt)
+"j" = (/turf/simulated/floor/outdoors/dirt,/area/submap/Mechpt)
+"k" = (/obj/structure/railing{tag = "icon-railing0 (WEST)"; icon_state = "railing0"; dir = 8},/turf/template_noop,/area/submap/Mechpt)
+"l" = (/obj/item/stack/rods,/turf/simulated/floor/outdoors/dirt,/area/submap/Mechpt)
+"m" = (/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor/outdoors/dirt,/area/submap/Mechpt)
+"n" = (/obj/effect/decal/cleanable/blood/oil/streak,/turf/simulated/floor/outdoors/dirt,/area/submap/Mechpt)
+"o" = (/obj/effect/decal/mecha_wreckage/ripley/deathripley,/turf/simulated/floor/outdoors/dirt,/area/submap/Mechpt)
+"p" = (/obj/effect/decal/mecha_wreckage/ripley/firefighter,/turf/simulated/floor/outdoors/dirt,/area/submap/Mechpt)
+"q" = (/obj/item/stack/cable_coil,/turf/simulated/floor/outdoors/dirt,/area/submap/Mechpt)
+"r" = (/obj/structure/railing{tag = "icon-railing0 (NORTH)"; icon_state = "railing0"; dir = 1},/turf/template_noop,/area/submap/Mechpt)
+"s" = (/obj/structure/railing{tag = "icon-railing0 (NORTH)"; icon_state = "railing0"; dir = 1},/obj/structure/table/woodentable,/obj/structure/reagent_dispensers/beerkeg,/turf/template_noop,/area/submap/Mechpt)
+"t" = (/obj/structure/railing{tag = "icon-railing0 (NORTH)"; icon_state = "railing0"; dir = 1},/obj/structure/table/woodentable,/obj/item/weapon/spacecash/c50,/turf/template_noop,/area/submap/Mechpt)
+"u" = (/obj/structure/railing{tag = "icon-railing0 (NORTH)"; icon_state = "railing0"; dir = 1},/obj/structure/table/woodentable,/turf/template_noop,/area/submap/Mechpt)
+"v" = (/obj/structure/railing{tag = "icon-railing0 (NORTH)"; icon_state = "railing0"; dir = 1},/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer,/turf/template_noop,/area/submap/Mechpt)
+
+(1,1,1) = {"
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+abbbbbbbbbbbbbbbbbbbbbbbbbbbba
+abbbbbbbbbcbbbbbbbbbbbbbbbbbba
+abbdddddddddefghgdddddddddddba
+abijjjjjjjjjjjjjjjjjjjjjjjjjka
+abijjjjjjjjjjjjjjjjjjjjjjjjjka
+abijjjljjjjjjjjjjjjmjjjnjjjjka
+abijjjjjmjjjjjjjjjjjjjjjjjjjka
+ajjjjjjjjjjojjjjjjjjjjjjjjjjja
+abjjjjjjjjjjjjjjjjjjjjjjjjjjja
+abijjjjjjjjjjjpjjjmjjjjjjjjjka
+abijjjjjjjjjjjjjjjjjjjjjjjjjka
+abijjjjjjjmjjqjjjjjjjjjjjjjjka
+abijnjjjjjjjjjjjjjjjjjjjjjjjka
+abijjjjjjjjjjjjjjjjjjjjjjjjjka
+abbrrrrrrrrrstutvrrrrrrrrrrrba
+abbbbbbbbbbbbbbbbbbbbbbbbbbbba
+abbbbbbbbbbbbbbbbbbbbbbbbbbbba
+abbbbbbbbbbbbbbbbbbbbbbbbbbbba
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+"}
diff --git a/maps/submaps/surface_submaps/plains/PooledR.dmm b/maps/submaps/surface_submaps/plains/PooledR.dmm
new file mode 100644
index 0000000000..8415e01135
--- /dev/null
+++ b/maps/submaps/surface_submaps/plains/PooledR.dmm
@@ -0,0 +1,55 @@
+"a" = (/turf/template_noop,/area/template_noop)
+"b" = (/turf/template_noop,/area/submap/PooledR)
+"c" = (/turf/simulated/mineral/ignore_mapgen,/area/submap/PooledR)
+"d" = (/obj/structure/flora/tree/sif,/turf/template_noop,/area/submap/PooledR)
+"e" = (/obj/structure/table/woodentable,/turf/template_noop,/area/submap/PooledR)
+"f" = (/obj/structure/table/woodentable,/obj/item/weapon/material/knife,/turf/template_noop,/area/submap/PooledR)
+"g" = (/obj/structure/flora/ausbushes/palebush,/turf/template_noop,/area/submap/PooledR)
+"h" = (/obj/structure/table/woodentable,/obj/item/weapon/gun/energy/retro,/turf/template_noop,/area/submap/PooledR)
+"i" = (/obj/structure/flora/ausbushes/reedbush,/turf/template_noop,/area/submap/PooledR)
+"j" = (/turf/simulated/floor/outdoors/rocks,/area/submap/PooledR)
+"k" = (/obj/structure/flora/ausbushes,/turf/template_noop,/area/submap/PooledR)
+"l" = (/turf/simulated/floor/water,/area/submap/PooledR)
+"m" = (/obj/structure/flora/ausbushes/grassybush,/turf/template_noop,/area/submap/PooledR)
+"n" = (/mob/living/simple_animal/fish/trout,/turf/simulated/floor/water,/area/submap/PooledR)
+"o" = (/mob/living/simple_animal/fish/salmon,/turf/simulated/floor/water,/area/submap/PooledR)
+"p" = (/turf/simulated/floor/water/deep,/area/submap/PooledR)
+"q" = (/mob/living/simple_animal/fish/bass,/turf/simulated/floor/water/deep,/area/submap/PooledR)
+
+(1,1,1) = {"
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+abbbbbbbbbbbbbbbbbbbbbbbbbbbcccbbba
+abbbbbbbbbbbbbbbbbbbbbbbbbbbccccbba
+abbbbbbbbbbbbbbbbbbbbbbbbbcccccccba
+abbbbbbbbbbbbbbbbbbbbdbbbbcccccccba
+abbbbbbbbbbbdbbbbbbbbbbbbbcccccccba
+abbbbbbbbbbbbbbbbbbbbbdbbccccccccba
+abbbbbbbbbbbbbbbbbbbbbbbbccccccccba
+abbbbbbbbbbbbbbbbbbbbbbbbccccccccba
+abbbbbbbbbbbbbbbbbbbbbbbbccccccccba
+abbbbbbbbbbbbbbbbbbbbbbbbcccccccbba
+abbdbbbbbbbbbbbbbbbbbbbbbeccccccbba
+abbbbbbbdbbbbbbbbbbbbbbbbfcccccbbba
+abbbbbbbbbbbbbbbbbbbbgbbbhcccccbbba
+abccbbbbbbbbbbbbbbbbbbibccccccbbbba
+abcccbbbgbbbbbbibbjjjjjjccccccbbbba
+abcccbbbbbbkbbbjjjjlllllccccccbbbba
+acccccbbbbbbbjjjjllllllllcccccbbbba
+acccccbmbbbjjjllllllllllllccccbbbba
+acccccbbbijjjllllllllnlllccccccbbba
+abccccbbjjjllllllllllllllccccccbbba
+abcccccjjlllllolllllpppppccccccbbba
+abccccccjlllllllllppppppcccccccbbba
+abcccccccccllllppppqppppccccccccbba
+abccccccccccclpppppppppcccccccccbba
+abccccccccccccpppppppppcccccccccbba
+abcccccccccccccpppppppccccccccccbba
+abbccccccccccccccccppccccccccccbbba
+abbcccccccccccccccccccccccccccccbba
+abbbcccccccccccccccccccccccccccbbba
+abbbbcccccccccccccccccccccccccbbbba
+abbbbbbbbccccccccccccccccccccbbbbba
+abbbbbbbbbbbbbcccccccccccbbbbbbbbba
+abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+"}
diff --git a/maps/submaps/surface_submaps/plains/Rocky2.dmm b/maps/submaps/surface_submaps/plains/Rocky2.dmm
new file mode 100644
index 0000000000..eaa06c481a
--- /dev/null
+++ b/maps/submaps/surface_submaps/plains/Rocky2.dmm
@@ -0,0 +1,40 @@
+"a" = (/turf/template_noop,/area/template_noop)
+"b" = (/turf/template_noop,/area/submap/Rocky2)
+"c" = (/turf/simulated/mineral/ignore_mapgen,/area/submap/Rocky2)
+"d" = (/obj/structure/flora/tree/sif,/turf/template_noop,/area/submap/Rocky2)
+"e" = (/turf/simulated/floor/outdoors/dirt,/area/submap/Rocky2)
+"f" = (/obj/structure/flora/tree/pine,/turf/template_noop,/area/submap/Rocky2)
+"g" = (/obj/structure/flora/ausbushes/grassybush,/turf/template_noop,/area/submap/Rocky2)
+"h" = (/obj/structure/flora/ausbushes/fullgrass,/turf/template_noop,/area/submap/Rocky2)
+"i" = (/obj/structure/flora/ausbushes/sparsegrass,/turf/template_noop,/area/submap/Rocky2)
+"j" = (/obj/structure/flora/ausbushes/sunnybush,/turf/template_noop,/area/submap/Rocky2)
+"k" = (/obj/structure/flora/ausbushes/stalkybush,/turf/template_noop,/area/submap/Rocky2)
+"l" = (/obj/structure/flora/tree/dead,/turf/template_noop,/area/submap/Rocky2)
+
+(1,1,1) = {"
+aaaaaaaaaaaaaaaaaaaaaaaaa
+abbbbbbbbbbbbbbbbbccbbbba
+abbbbbbbcccccccccbcccbbda
+abbbbbbccccccccbbbccccbba
+abbbeecccccccccbbcccccbba
+afbbecccccccbccbcccccccba
+abbbecccccccgbbbcccccccba
+abbbbccccccbbbbbcccccceba
+abbbbcccccbhbfbbbcccceeea
+abbbbbbcccbbbbbbicccceeea
+abbbbbbcccbdbbhbbcccceeea
+abdbbbccccbbbbbbbbccceeea
+abbbbccccbbhbbbbbbcceeeea
+abbbccccccfbbbdbbbcccceea
+abbeccccccbbbbbbficccceea
+abbeccccccbgbhbbbbccccbba
+abbeecccccbbbbbbbbcccccba
+abbeecccccjbdbbbhbcccccba
+abbbecccccbbbbbbbccccccba
+abbbeccceebbkbbbbccccccba
+abbbbccceeccbbfbcccccbbba
+abbbbccceeeccccccccccbbba
+ablbbcccbeccccccbbbcbblba
+abbbbbbbbbbbcccbbbbbbbbba
+aaaaaaaaaaaaaaaaaaaaaaaaa
+"}
diff --git a/maps/submaps/surface_submaps/plains/Shakden.dmm b/maps/submaps/surface_submaps/plains/Shakden.dmm
index 15614265ef..8720149d63 100644
--- a/maps/submaps/surface_submaps/plains/Shakden.dmm
+++ b/maps/submaps/surface_submaps/plains/Shakden.dmm
@@ -1,13 +1,14 @@
"a" = (/turf/template_noop,/area/template_noop)
"b" = (/turf/template_noop,/area/submap/Shakden)
"c" = (/turf/simulated/mineral/ignore_mapgen,/area/submap/Shakden)
-"d" = (/turf/simulated/floor/outdoors/dirt,/area/submap/Shakden)
-"e" = (/obj/effect/decal/remains/mouse,/turf/simulated/floor/outdoors/dirt,/area/submap/Shakden)
-"f" = (/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/turf/simulated/floor/outdoors/dirt,/area/submap/Shakden)
-"g" = (/mob/living/simple_animal/hostile/shantak{hostile = 0},/turf/simulated/floor/outdoors/dirt,/area/submap/Shakden)
-"h" = (/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/turf/simulated/floor/outdoors/dirt,/area/submap/Shakden)
-"i" = (/obj/item/weapon/reagent_containers/food/snacks/meat,/turf/simulated/floor/outdoors/dirt,/area/submap/Shakden)
-"j" = (/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/material/knife/hook,/turf/simulated/floor/outdoors/dirt,/area/submap/Shakden)
+"d" = (/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/Shakden)
+"e" = (/obj/effect/decal/remains/mouse,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/Shakden)
+"f" = (/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/Shakden)
+"g" = (/mob/living/simple_animal/hostile/shantak{hostile = 0},/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/Shakden)
+"h" = (/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/Shakden)
+"i" = (/mob/living/simple_animal/hostile/shantak{hostile = 0},/turf/simulated/floor/outdoors/dirt,/area/submap/Shakden)
+"j" = (/obj/item/weapon/reagent_containers/food/snacks/meat,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/Shakden)
+"k" = (/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/material/knife/hook,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/Shakden)
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaa
@@ -25,7 +26,7 @@ abcedddddddddccdddba
accddgddgdddcccdddba
acccdddddddcccdddbba
acccddgdddfcccdddbba
-accccdddgijcccddcbba
+accccdddijkcccddcbba
abccccddddecccddccba
abccccccccccccccccba
abbccccccbbbbccccbba
diff --git a/maps/submaps/surface_submaps/plains/Smol3.dmm b/maps/submaps/surface_submaps/plains/Smol3.dmm
new file mode 100644
index 0000000000..fce902093c
--- /dev/null
+++ b/maps/submaps/surface_submaps/plains/Smol3.dmm
@@ -0,0 +1,23 @@
+"a" = (/turf/template_noop,/area/template_noop)
+"b" = (/turf/template_noop,/area/submap/Smol3)
+"c" = (/turf/simulated/wall/wood,/area/submap/Smol3)
+"d" = (/obj/structure/simple_door/wood,/turf/template_noop,/area/submap/Smol3)
+"e" = (/turf/simulated/floor/outdoors/dirt,/area/submap/Smol3)
+"f" = (/obj/structure/closet/crate/freezer,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/meat,/turf/simulated/floor/outdoors/dirt,/area/submap/Smol3)
+"g" = (/obj/structure/closet/crate/freezer,/obj/item/weapon/reagent_containers/food/snacks/chips,/obj/item/weapon/reagent_containers/food/snacks/chips,/obj/item/weapon/reagent_containers/food/drinks/cans/waterbottle,/obj/item/weapon/reagent_containers/food/drinks/cans/waterbottle,/obj/item/weapon/reagent_containers/food/drinks/cans/waterbottle,/obj/item/weapon/reagent_containers/food/drinks/cans/waterbottle,/obj/item/weapon/reagent_containers/food/drinks/cans/waterbottle,/obj/item/weapon/reagent_containers/food/drinks/cans/waterbottle,/turf/simulated/floor/outdoors/dirt,/area/submap/Smol3)
+"h" = (/obj/structure/table/woodentable,/obj/item/weapon/paper{desc = "Lamen's Hunter Shack! Selling freshly hunted meat for six thalers a slab. Support Locale hunters! Also selling Getmore Products for 3 thalers a bag, or 2 thalers for a bottle of water. Please place all payments into the nearbye bag."},/turf/simulated/floor/outdoors/dirt,/area/submap/Smol3)
+"i" = (/obj/structure/table/woodentable,/turf/simulated/floor/outdoors/dirt,/area/submap/Smol3)
+"j" = (/obj/structure/table/woodentable,/obj/item/weapon/moneybag,/turf/simulated/floor/outdoors/dirt,/area/submap/Smol3)
+
+(1,1,1) = {"
+aaaaaaaaaaaaaaa
+abbbbbbbbbbbbba
+abbbccdccbbbbba
+abbbceeecbbbbba
+abbbcfegcbbbbba
+abbbchijcbbbbba
+abbeeeeeeebbbba
+abeeeeeeeeeebba
+abbbbbbbbbbbbba
+aaaaaaaaaaaaaaa
+"}
diff --git a/maps/submaps/surface_submaps/plains/Theifc.dmm b/maps/submaps/surface_submaps/plains/Theifc.dmm
new file mode 100644
index 0000000000..d17d59ca15
--- /dev/null
+++ b/maps/submaps/surface_submaps/plains/Theifc.dmm
@@ -0,0 +1,39 @@
+"a" = (/turf/template_noop,/area/template_noop)
+"b" = (/turf/template_noop,/area/submap/Theifc)
+"c" = (/turf/simulated/mineral/ignore_mapgen,/area/submap/Theifc)
+"d" = (/obj/structure/ore_box,/obj/item/weapon/ore/coal,/obj/item/weapon/ore/coal,/obj/item/weapon/ore/coal,/obj/item/weapon/ore/coal,/obj/item/weapon/ore/coal,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/Theifc)
+"e" = (/obj/structure/closet/crate,/obj/item/weapon/extinguisher,/obj/item/weapon/extinguisher,/obj/item/weapon/extinguisher,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/Theifc)
+"f" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/Theifc)
+"g" = (/obj/item/weapon/ore/coal,/obj/item/weapon/ore/coal,/obj/item/weapon/ore/coal,/obj/item/weapon/ore/coal,/obj/item/weapon/ore/coal,/obj/item/weapon/ore/coal,/obj/item/weapon/ore/coal,/obj/item/weapon/ore/coal,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/Theifc)
+"h" = (/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/Theifc)
+"i" = (/obj/structure/closet/crate,/obj/item/weapon/lipstick,/obj/item/weapon/lipstick/black,/obj/item/weapon/lipstick/random,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/Theifc)
+"j" = (/obj/structure/table/steel,/obj/item/weapon/beartrap,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/Theifc)
+"k" = (/obj/vehicle/train/cargo/trolley,/obj/random/firstaid,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/Theifc)
+"l" = (/obj/structure/closet/crate,/obj/item/weapon/folder/blue,/obj/item/weapon/folder/red,/obj/item/weapon/folder/white,/obj/item/weapon/folder/yellow,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/Theifc)
+"m" = (/obj/structure/table/steel,/obj/item/weapon/paper{desc = "This is some bullshit. First chance we got to knick something that looks half decent turns out to be mostly junk. And now we're getting calls that the other stash we've got has got a spider problem. Fuck this, Between the shitty weather, The pissed of bugs, And now apparently some NT goon running around in the area there's hardly enough reason to stick around. I'm telling Carl I'm out tommorow."; name = "Note"},/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/Theifc)
+"n" = (/obj/vehicle/train/cargo/trolley,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/Theifc)
+"o" = (/obj/structure/closet/crate,/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/Theifc)
+"p" = (/obj/structure/closet/crate,/obj/item/weapon/storage/box/shotgunammo,/obj/item/weapon/storage/box/practiceshells,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/Theifc)
+
+(1,1,1) = {"
+aaaaaaaaaaaaaaaaaaaaaaaaa
+abcbbbbbcccccccbbbbbbbbba
+abccccccccdecccccbbbbbbba
+accccccccfghcchcccbbbbbba
+accccccchhhhihhccccbbbbba
+abcccccjhhkhhhlccccbbbbba
+abbccccmhhnhhhocccccbbbba
+abbbbbcchhhhhhpccccccbbba
+abbbbcccchhhhchccccccbbba
+abbbcccccchhcccccccccbbba
+abbbbccchhhhccccccccbbbba
+abbbbbhhhhhcccccccccbbbba
+abbbbbhhhccccccccccbbbbba
+abbbccccccccccccccbbbbbba
+abbbbbcccccccccccbbbbbbba
+abbbbbbbbbbbbbbbbbbbbbbba
+abbbbbbbbbbbbbbbbbbbbbbba
+abbbbbbbbbbbbbbbbbbbbbbba
+abbbbbbbbbbbbbbbbbbbbbbba
+aaaaaaaaaaaaaaaaaaaaaaaaa
+"}
diff --git a/maps/submaps/surface_submaps/plains/plains.dm b/maps/submaps/surface_submaps/plains/plains.dm
index 3ec4b24c52..563e41b717 100644
--- a/maps/submaps/surface_submaps/plains/plains.dm
+++ b/maps/submaps/surface_submaps/plains/plains.dm
@@ -12,8 +12,22 @@
#include "bonfire.dmm"
#include "Rocky5.dmm"
#include "Field1.dmm"
+#include "Theifc.dmm"
+#include "smol2.dmm"
+#include "Mechpt.dmm"
+#include "Boathouse.dmm"
+#include "PooledR.dmm"
+#include "Smol3.dmm"
+#include "Diner.dmm"
+#include "Snow1.dmm"
+#include "Snow2.dmm"
+#include "Snow3.dmm"
+#include "Snow4.dmm"
+#include "Snow5.dmm"
+
#endif
+
// The 'plains' is the area outside the immediate perimeter of the big outpost.
// POIs here should not be dangerous, be mundane, and be somewhat conversative on the loot. Some of the loot can be useful, but it shouldn't trivialize the Wilderness.
@@ -94,4 +108,76 @@
name = "Field 1"
desc = "A regular field with a tug on it"
mappath = 'maps/submaps/surface_submaps/plains/Field1.dmm'
- cost = 20
\ No newline at end of file
+ cost = 20
+
+/datum/map_template/surface/plains/Theifc
+ name = "Theif Cave"
+ desc = "A theives stash"
+ mappath = 'maps/submaps/surface_submaps/plains/Theifc.dmm'
+ cost = 20
+
+/datum/map_template/surface/plains/smol2
+ name = "Small 2"
+ desc = "A small formation of mishaped surgery"
+ mappath = 'maps/submaps/surface_submaps/plains/smol2.dmm'
+ cost = 10
+
+/datum/map_template/surface/plains/Mechpt
+ name = "Mechpit"
+ desc = "A illmade Mech brawling ring"
+ mappath = 'maps/submaps/surface_submaps/plains/Mechpt.dmm'
+ cost = 15
+
+/datum/map_template/surface/plains/Boathouse
+ name = "Boathouse"
+ desc = "A fance house on a lake."
+ mappath = 'maps/submaps/surface_submaps/plains/Boathouse.dmm'
+ cost = 30
+
+/datum/map_template/surface/plains/PooledR
+ name = "Pooled Rocks"
+ desc = "An intresting rocky location"
+ mappath = 'maps/submaps/surface_submaps/plains/PooledR.dmm'
+ cost = 15
+
+/datum/map_template/surface/plains/Smol3
+ name = "Small 3"
+ desc = "A small stand"
+ mappath = 'maps/submaps/surface_submaps/plains/Smol3.dmm'
+ cost = 10
+
+/datum/map_template/surface/plains/Diner
+ name = "Diner"
+ desc = "Old Timey Tasty"
+ mappath = 'maps/submaps/surface_submaps/plains/Diner.dmm'
+ cost = 25
+
+/datum/map_template/surface/plains/snow1
+ name = "Snow1"
+ desc = "Snow"
+ mappath = 'maps/submaps/surface_submaps/plains/snow1.dmm'
+ cost = 5
+
+/datum/map_template/surface/plains/snow2
+ name = "Snow2"
+ desc = "More snow"
+ mappath = 'maps/submaps/surface_submaps/plains/snow2.dmm'
+ cost = 5
+
+/datum/map_template/surface/plains/snow3
+ name = "Snow3"
+ desc = "Snow Snow Snow"
+ mappath = 'maps/submaps/surface_submaps/plains/snow3.dmm'
+ cost = 5
+
+/datum/map_template/surface/plains/snow4
+ name = "Snow4"
+ desc = "Too much snow"
+ mappath = 'maps/submaps/surface_submaps/plains/snow4.dmm'
+ cost = 5
+
+/datum/map_template/surface/plains/snow5
+ name = "Snow5"
+ desc = "Please stop the snow"
+ mappath = 'maps/submaps/surface_submaps/plains/snow5.dmm'
+ cost = 5
diff --git a/maps/submaps/surface_submaps/plains/plains_areas.dm b/maps/submaps/surface_submaps/plains/plains_areas.dm
index 6ff8b085df..2e6c0f7015 100644
--- a/maps/submaps/surface_submaps/plains/plains_areas.dm
+++ b/maps/submaps/surface_submaps/plains/plains_areas.dm
@@ -36,3 +36,40 @@
/area/submap/Field1
name = "Field 1"
+
+/area/submap/Theifc
+ name = "Theif Cave"
+
+/area/submap/smol2
+ name = "Small 2"
+
+/area/submap/Mechpt
+ name = "Mech Pit"
+
+/area/submap/Boathouse
+ name = "Boathouse"
+
+/area/submap/Smol3
+ name = "Small 3"
+
+/area/submap/PooledR
+ name = "Pooled Rocks"
+
+/area/submap/Diner
+ name = "Diner"
+
+/area/submap/snow1
+ name = "Snow1"
+
+/area/submap/snow2
+ name = "Snow2"
+
+/area/submap/snow3
+ name = "Snow3"
+
+/area/submap/snow4
+ name = "Snow4"
+
+/area/submap/snow5
+ name = "Snow5"
+
diff --git a/maps/submaps/surface_submaps/plains/smol2.dmm b/maps/submaps/surface_submaps/plains/smol2.dmm
new file mode 100644
index 0000000000..739a000ce1
--- /dev/null
+++ b/maps/submaps/surface_submaps/plains/smol2.dmm
@@ -0,0 +1,21 @@
+"a" = (/turf/template_noop,/area/template_noop)
+"b" = (/turf/template_noop,/area/submap/smol2)
+"c" = (/obj/structure/flora/tree/sif,/turf/template_noop,/area/submap/smol2)
+"d" = (/turf/simulated/mineral/ignore_mapgen,/area/submap/smol2)
+"e" = (/obj/item/stack/material/wood/sif,/obj/item/stack/material/wood/sif,/obj/item/stack/material/wood/sif,/obj/item/stack/material/wood/sif,/obj/item/stack/material/wood/sif,/obj/item/stack/material/wood/sif,/turf/template_noop,/area/submap/smol2)
+"f" = (/obj/structure/table/woodentable,/turf/template_noop,/area/submap/smol2)
+"g" = (/obj/item/weapon/storage/firstaid,/obj/item/stack/medical/splint,/obj/item/weapon/reagent_containers/pill/tramadol,/turf/template_noop,/area/submap/smol2)
+"h" = (/obj/effect/decal/cleanable/blood,/turf/template_noop,/area/submap/smol2)
+
+(1,1,1) = {"
+aaaaaaaaaa
+abbbcbbdda
+abbbbbddda
+acbbebbdda
+abbbbfddba
+abbbghddba
+adddddddba
+abddddbbba
+abbbbbbbba
+aaaaaaaaaa
+"}
diff --git a/maps/submaps/surface_submaps/plains/snow1.dmm b/maps/submaps/surface_submaps/plains/snow1.dmm
new file mode 100644
index 0000000000..ec5c8ea00c
--- /dev/null
+++ b/maps/submaps/surface_submaps/plains/snow1.dmm
@@ -0,0 +1,16 @@
+"a" = (/turf/template_noop,/area/template_noop)
+"b" = (/turf/template_noop,/area/submap/snow1)
+"c" = (/turf/simulated/floor/outdoors/snow,/area/submap/snow1)
+
+(1,1,1) = {"
+aaaaaaaaaa
+abbbcccbba
+abbcccccba
+abccccccba
+abccccccca
+acccccccba
+accccccbba
+abcccccbba
+abbbbbbbba
+aaaaaaaaaa
+"}
diff --git a/maps/submaps/surface_submaps/plains/snow2.dmm b/maps/submaps/surface_submaps/plains/snow2.dmm
new file mode 100644
index 0000000000..bedbb62d51
--- /dev/null
+++ b/maps/submaps/surface_submaps/plains/snow2.dmm
@@ -0,0 +1,26 @@
+"a" = (/turf/template_noop,/area/template_noop)
+"b" = (/turf/template_noop,/area/submap/smol2)
+"c" = (/turf/simulated/floor/outdoors/snow,/area/submap/smol2)
+
+(1,1,1) = {"
+aaaaaaaaaaaaaaa
+abbbbbbbbbcbbba
+abbbbbbbbcccbba
+abbbbbbcccccbba
+abbbbbccccccbba
+abbbbccccccbbba
+abbbbccccccbbba
+abbbbccccccbbba
+abbbcccccccbbba
+abbbcccccccbbba
+abbbcccccccbbba
+abbbccccccbbbba
+abbcccccccbbbba
+abbccccccbbbbba
+abbcccccbbbbbba
+abbccccbbbbbbba
+abccccbbbbbbbba
+abccbcbbbbbbbba
+abbbbbbbbbbbbba
+aaaaaaaaaaaaaaa
+"}
diff --git a/maps/submaps/surface_submaps/plains/snow3.dmm b/maps/submaps/surface_submaps/plains/snow3.dmm
new file mode 100644
index 0000000000..56e9a78878
--- /dev/null
+++ b/maps/submaps/surface_submaps/plains/snow3.dmm
@@ -0,0 +1,16 @@
+"a" = (/turf/template_noop,/area/template_noop)
+"b" = (/turf/template_noop,/area/submap/snow3)
+"c" = (/turf/simulated/floor/outdoors/snow,/area/submap/snow3)
+
+(1,1,1) = {"
+aaaaaaaaaaaaaaaaaaaa
+abbbbccccccbbbbbbbba
+abbcccccccccccccbbba
+abccccccccccccccccca
+abccccccccccccccccca
+abccccccccccccccccba
+abccccccccccccccbbba
+abbbcccccccccccbbbba
+abbbbbbbcccbbbbbbbba
+aaaaaaaaaaaaaaaaaaaa
+"}
diff --git a/maps/submaps/surface_submaps/plains/snow4.dmm b/maps/submaps/surface_submaps/plains/snow4.dmm
new file mode 100644
index 0000000000..4d766fcf82
--- /dev/null
+++ b/maps/submaps/surface_submaps/plains/snow4.dmm
@@ -0,0 +1,16 @@
+"a" = (/turf/template_noop,/area/template_noop)
+"b" = (/turf/template_noop,/area/submap/snow4)
+"c" = (/turf/simulated/floor/outdoors/snow,/area/submap/snow4)
+
+(1,1,1) = {"
+aaaaaaaaaa
+abbcbbbbba
+abcccbcbba
+abccccccba
+abbccccbba
+abcccccbba
+acccccccba
+acccbcccba
+abcbbbccba
+aaaaaaaaaa
+"}
diff --git a/maps/submaps/surface_submaps/plains/snow5.dmm b/maps/submaps/surface_submaps/plains/snow5.dmm
new file mode 100644
index 0000000000..d14b78e01e
--- /dev/null
+++ b/maps/submaps/surface_submaps/plains/snow5.dmm
@@ -0,0 +1,22 @@
+"a" = (/turf/template_noop,/area/template_noop)
+"b" = (/turf/template_noop,/area/submap/snow5)
+"c" = (/turf/simulated/floor/outdoors/snow,/area/submap/snow5)
+
+(1,1,1) = {"
+aaaaaaaaaaaa
+abbcccccbbba
+abcccccccbba
+abcccccccbba
+abbcccccccba
+abbcccccccba
+abbbcccccbba
+abbbccccccba
+abbbbcccccba
+abbbbcccccba
+abbbbccccbba
+abbbcccccbba
+abbbccccbbba
+abbbcccbbbba
+abbcccbbbbba
+aaaaaaaaaaaa
+"}
diff --git a/maps/submaps/surface_submaps/wilderness/CaveS.dmm b/maps/submaps/surface_submaps/wilderness/CaveS.dmm
index 36d0d00ca5..9f5a411ec5 100644
--- a/maps/submaps/surface_submaps/wilderness/CaveS.dmm
+++ b/maps/submaps/surface_submaps/wilderness/CaveS.dmm
@@ -3,35 +3,39 @@
"c" = (/obj/item/ammo_casing/a45,/turf/template_noop,/area/submap/CaveS)
"d" = (/turf/simulated/mineral/ignore_mapgen,/area/submap/CaveS)
"e" = (/obj/item/ammo_casing/a45,/obj/item/weapon/reagent_containers/food/snacks/xenomeat/spidermeat,/turf/template_noop,/area/submap/CaveS)
-"f" = (/turf/simulated/floor/outdoors/dirt,/area/submap/CaveS)
-"g" = (/obj/effect/spider/stickyweb,/turf/simulated/floor/outdoors/dirt,/area/submap/CaveS)
-"h" = (/obj/item/ammo_casing/a45,/obj/item/ammo_casing/a45,/turf/template_noop,/area/submap/CaveS)
-"i" = (/obj/item/weapon/reagent_containers/food/snacks/xenomeat/spidermeat,/turf/template_noop,/area/submap/CaveS)
-"j" = (/obj/item/clothing/accessory/storage/webbing,/obj/item/weapon/material/knife/tacknife/combatknife,/turf/simulated/floor/outdoors/dirt,/area/submap/CaveS)
-"k" = (/mob/living/simple_animal/hostile/giant_spider,/turf/simulated/floor/outdoors/dirt,/area/submap/CaveS)
-"l" = (/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/outdoors/dirt,/area/submap/CaveS)
-"m" = (/mob/living/simple_animal/hostile/giant_spider/lurker,/turf/simulated/floor/outdoors/dirt,/area/submap/CaveS)
-"n" = (/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/outdoors/dirt,/area/submap/CaveS)
-"o" = (/obj/effect/mine,/turf/simulated/floor/outdoors/dirt,/area/submap/CaveS)
-"p" = (/mob/living/simple_animal/hostile/giant_spider/webslinger,/turf/simulated/floor/outdoors/dirt,/area/submap/CaveS)
-"q" = (/obj/effect/decal/cleanable/cobweb2,/mob/living/simple_animal/hostile/giant_spider/lurker,/turf/simulated/floor/outdoors/dirt,/area/submap/CaveS)
-"r" = (/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/CaveS)
-"s" = (/mob/living/simple_animal/hostile/giant_spider/hunter,/turf/simulated/floor/outdoors/dirt,/area/submap/CaveS)
-"t" = (/obj/structure/flora/tree/sif,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/CaveS)
-"u" = (/turf/simulated/floor,/area/submap/CaveS)
-"v" = (/obj/structure/closet/crate,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/obj/item/weapon/storage/toolbox,/obj/random/toolbox,/turf/simulated/floor,/area/submap/CaveS)
-"w" = (/obj/structure/loot_pile/maint/technical,/turf/simulated/floor,/area/submap/CaveS)
-"x" = (/obj/structure/table/woodentable,/turf/simulated/floor,/area/submap/CaveS)
-"y" = (/obj/machinery/power/port_gen/pacman,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor,/area/submap/CaveS)
-"z" = (/turf/simulated/wall,/area/submap/CaveS)
-"A" = (/obj/structure/closet/crate,/obj/item/weapon/reagent_containers/hypospray,/obj/item/weapon/reagent_containers/glass/bottle/stoxin,/obj/item/weapon/reagent_containers/glass/bottle/antitoxin,/obj/item/weapon/reagent_containers/pill/antitox,/obj/item/weapon/reagent_containers/pill/antitox,/obj/item/weapon/reagent_containers/pill/antitox,/obj/item/weapon/reagent_containers/pill/paracetamol,/obj/random/firstaid,/turf/simulated/floor,/area/submap/CaveS)
-"B" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor,/area/submap/CaveS)
-"C" = (/obj/structure/closet/crate,/obj/random/contraband,/obj/random/contraband,/obj/random/contraband,/obj/random/energy,/obj/item/weapon/material/star,/obj/item/weapon/material/star,/obj/item/weapon/material/star,/obj/item/weapon/material/star,/obj/item/weapon/material/star,/turf/simulated/floor,/area/submap/CaveS)
-"D" = (/obj/effect/spider/stickyweb,/mob/living/simple_animal/hostile/giant_spider/lurker,/turf/simulated/floor/outdoors/dirt,/area/submap/CaveS)
-"E" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/submap/CaveS)
-"F" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor,/area/submap/CaveS)
-"G" = (/obj/machinery/computer/communications,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor,/area/submap/CaveS)
-"H" = (/obj/structure/loot_pile/maint/boxfort,/turf/simulated/floor,/area/submap/CaveS)
+"f" = (/obj/random/landmine,/turf/template_noop,/area/submap/CaveS)
+"g" = (/obj/item/ammo_casing/a45,/obj/random/landmine,/turf/template_noop,/area/submap/CaveS)
+"h" = (/obj/random/landmine,/turf/simulated/floor/outdoors/dirt,/area/submap/CaveS)
+"i" = (/obj/effect/spider/stickyweb,/turf/simulated/floor/outdoors/dirt,/area/submap/CaveS)
+"j" = (/obj/item/ammo_casing/a45,/obj/item/ammo_casing/a45,/turf/template_noop,/area/submap/CaveS)
+"k" = (/turf/simulated/floor/outdoors/dirt,/area/submap/CaveS)
+"l" = (/obj/item/weapon/reagent_containers/food/snacks/xenomeat/spidermeat,/turf/template_noop,/area/submap/CaveS)
+"m" = (/obj/item/clothing/accessory/storage/webbing,/obj/item/weapon/material/knife/tacknife/combatknife,/turf/simulated/floor/outdoors/dirt,/area/submap/CaveS)
+"n" = (/mob/living/simple_animal/hostile/giant_spider,/turf/simulated/floor/outdoors/dirt,/area/submap/CaveS)
+"o" = (/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/outdoors/dirt,/area/submap/CaveS)
+"p" = (/mob/living/simple_animal/hostile/giant_spider/lurker,/turf/simulated/floor/outdoors/dirt,/area/submap/CaveS)
+"q" = (/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/outdoors/dirt,/area/submap/CaveS)
+"r" = (/mob/living/simple_animal/hostile/giant_spider/webslinger,/turf/simulated/floor/outdoors/dirt,/area/submap/CaveS)
+"s" = (/obj/effect/decal/cleanable/cobweb2,/mob/living/simple_animal/hostile/giant_spider/lurker,/turf/simulated/floor/outdoors/dirt,/area/submap/CaveS)
+"t" = (/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/CaveS)
+"u" = (/mob/living/simple_animal/hostile/giant_spider/hunter,/turf/simulated/floor/outdoors/dirt,/area/submap/CaveS)
+"v" = (/obj/structure/flora/tree/sif,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/CaveS)
+"w" = (/obj/random/landmine,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/CaveS)
+"x" = (/turf/simulated/floor,/area/submap/CaveS)
+"y" = (/obj/structure/closet/crate,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/obj/item/weapon/storage/toolbox,/obj/random/toolbox,/turf/simulated/floor,/area/submap/CaveS)
+"z" = (/obj/structure/loot_pile/maint/technical,/turf/simulated/floor,/area/submap/CaveS)
+"A" = (/obj/structure/table/woodentable,/turf/simulated/floor,/area/submap/CaveS)
+"B" = (/obj/random/landmine,/turf/simulated/floor,/area/submap/CaveS)
+"C" = (/obj/machinery/power/port_gen/pacman,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor,/area/submap/CaveS)
+"D" = (/turf/simulated/wall,/area/submap/CaveS)
+"E" = (/obj/structure/closet/crate,/obj/item/weapon/reagent_containers/hypospray,/obj/item/weapon/reagent_containers/glass/bottle/stoxin,/obj/item/weapon/reagent_containers/glass/bottle/antitoxin,/obj/item/weapon/reagent_containers/pill/antitox,/obj/item/weapon/reagent_containers/pill/antitox,/obj/item/weapon/reagent_containers/pill/antitox,/obj/item/weapon/reagent_containers/pill/paracetamol,/obj/random/firstaid,/obj/random/landmine,/turf/simulated/floor,/area/submap/CaveS)
+"F" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor,/area/submap/CaveS)
+"G" = (/obj/structure/closet/crate,/obj/random/contraband,/obj/random/contraband,/obj/random/contraband,/obj/random/energy,/obj/item/weapon/material/star,/obj/item/weapon/material/star,/obj/item/weapon/material/star,/obj/item/weapon/material/star,/obj/item/weapon/material/star,/turf/simulated/floor,/area/submap/CaveS)
+"H" = (/obj/effect/spider/stickyweb,/mob/living/simple_animal/hostile/giant_spider/lurker,/turf/simulated/floor/outdoors/dirt,/area/submap/CaveS)
+"I" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/submap/CaveS)
+"J" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor,/area/submap/CaveS)
+"K" = (/obj/machinery/computer/communications,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor,/area/submap/CaveS)
+"L" = (/obj/structure/loot_pile/maint/boxfort,/turf/simulated/floor,/area/submap/CaveS)
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -42,34 +46,34 @@ abbbbbbbbbbbbbbbbbbbbbcbbbbbbbbbbbbbbbba
abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba
abbbbbbbbbbbbbbbcbbbbbbcccdddddbbbbbbbba
abbbbbbbbbbbbbbbbbbbbbbbeddddddddbbddbba
-abbbbbbbbbbbbbbbbbbbbbbbdddddddddddddbba
-abbbbdddddbbbbcbbbbcbbbfgddddddddddddbba
-abbbbddddddddbbbbbhbbbbffddddddddddddbba
-abbbddddddddddbbbbcbibdgfggdddddddddbbba
-abbbdddddddddddbbbbbbdddgfffdddddddbbbba
-abbbddddddddddddbbbbddddddffgddddddbbbba
-abbdddddjdffgdddbbddddddddffffffddddbbba
-abbdddkffffffdddbbdddddddlffffffkdddbbba
-abbdddgfffffmddbbddddddddfffffffdddddbba
-abbddddfffffdddbdddddddddffddddfnddddbba
-abdddddddffffddddddddddddofddddffdddddba
-abdddddddffffndddddlfkffffddddlfddddddba
-abddddddddffffffffffffffffddddofddddddda
-abdddddddddpfffffffffffffffqddffddddddda
-abdddddrrdddddffdddmdddddgffffffddddddba
-abdddrrrrdddddffddddddddddofffsddddddbba
-abddrtrrrdddddffmdddddddddddddddddddbbba
-abddrrrrrrdddddfffffddddddddmfddddddbbba
-abdddrrrtrgddddfffofffogdddfffffdddbbbba
-abdddrrrrrfffffffdfffffgddffuuvfffddbbba
-abddrrrrrrrffffgdddgffffffffuuuwfdddbbba
-abddrrrrrrffddddddddfofffffuxxuuffddbbba
-abdddrrrrrffmddddddfffgdffuyzzAfffdddbba
-abdddddtrffddddddgffffddffuBzzCffddddbba
-abdddddddrgddddddDffffddffuEFGuuddddbbba
-abbddddddddddddddfffffdddffuuuudddddbbba
-abbdddddddddddddddfgdddddfffuHdddddbbbba
-abbdddddddddddddddddddddddmffddddbbbbbba
+abbbbbbbbbbbbbbbbbbbbbfbdddddddddddddbba
+abbbbdddddbbbbcbbbbgbbbhiddddddddddddbba
+abbbbddddddddbbbbbjbbfbkkddddddddddddbba
+abbbddddddddddbbbbcblbdikiidddddddddbbba
+abbbdddddddddddbbbbbbdddikkkdddddddbbbba
+abbbddddddddddddbbbbddddddhkiddddddbbbba
+abbdddddmdkkidddbbddddddddkkkkkkddddbbba
+abbdddnkkkkkkdddbbdddddddokkkkkkndddbbba
+abbdddikkkkkpddbbddddddddkkkkkkkdddddbba
+abbddddkkkkkdddbdddddddddkkddddkqddddbba
+abdddddddkkkkddddddddddddhkddddkkdddddba
+abdddddddkkkkqdddddoknkkkkddddokddddddba
+abddddddddkkkkkkkkkkkkkkkkddddhkddddddda
+abdddddddddrkkkkkkkkkkkkkkksddkkddddddda
+abdddddttdddddkkdddpdddddikkkkkkddddddba
+abdddttttdddddkkddddddddddkkkkuddddddbba
+abddtvtttdddddkkpdddddddddddddddddddbbba
+abddttwtttdddddkkkkkddddddddpkddddddbbba
+abdddtttvtiddddkkkkkkkhidddkkkkkdddbbbba
+abdddtttwtkkkkkkkdkkkkkiddkkxxykkkddbbba
+abddtttttttkkkkidddikkkhkkkkxxxzkdddbbba
+abddttttttkkddddddddkhkkkkkxAABxkkddbbba
+abdddtttttkkpddddddkkkidkkxCDDEkkkdddbba
+abdddddvtkkddddddikkkkddkkxFDDGkkddddbba
+abdddddddtiddddddHkkkkddkkxIJKBxddddbbba
+abbddddddddddddddkkkkkdddkkxxxxdddddbbba
+abbdddddddddddddddkidddddkkkxLdddddbbbba
+abbdddddddddddddddddddddddpkkddddbbbbbba
abbbdddddddddddddddddddddddddddbbbbbbbba
abbbddddbbbbdddddddbbdddddddddbbbbbbbbba
abbbddbbbbbbbddddbbbbdbbdddddbbbbbbbbbba
diff --git a/maps/submaps/surface_submaps/wilderness/DoomP.dmm b/maps/submaps/surface_submaps/wilderness/DoomP.dmm
index c98433cff4..761eac23e4 100644
--- a/maps/submaps/surface_submaps/wilderness/DoomP.dmm
+++ b/maps/submaps/surface_submaps/wilderness/DoomP.dmm
@@ -5,126 +5,129 @@
"ae" = (/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/turf/template_noop,/area/submap/DoomP)
"af" = (/turf/simulated/floor/water,/area/submap/DoomP)
"ag" = (/obj/structure/flora/tree/sif,/turf/template_noop,/area/submap/DoomP)
-"ah" = (/obj/effect/mine,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/DoomP)
+"ah" = (/obj/random/landmine,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/DoomP)
"ai" = (/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/DoomP)
-"aj" = (/obj/effect/decal/cleanable/blood,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/DoomP)
+"aj" = (/obj/effect/decal/cleanable/blood,/obj/random/landmine,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/DoomP)
"ak" = (/turf/simulated/floor/water/deep,/area/submap/DoomP)
-"al" = (/obj/effect/decal/remains/mouse,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/DoomP)
-"am" = (/obj/effect/decal/remains/deer,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/DoomP)
-"an" = (/obj/structure/flora/tree/sif,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/DoomP)
-"ao" = (/obj/machinery/light/small,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/DoomP)
-"ap" = (/obj/machinery/porta_turret,/turf/simulated/floor/plating,/area/submap/DoomP)
-"aq" = (/turf/simulated/wall/r_wall,/area/submap/DoomP)
-"ar" = (/obj/structure/sign/warning/secure_area,/turf/simulated/wall/r_wall,/area/submap/DoomP)
-"as" = (/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/submap/DoomP)
-"at" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plating,/area/submap/DoomP)
-"au" = (/obj/effect/floor_decal/borderfloor{dir = 9},/turf/simulated/floor/tiled,/area/submap/DoomP)
-"av" = (/obj/structure/bed/chair,/obj/effect/floor_decal/borderfloor{dir = 1},/turf/simulated/floor/tiled,/area/submap/DoomP)
-"aw" = (/obj/effect/floor_decal/borderfloor{dir = 1},/turf/simulated/floor/tiled,/area/submap/DoomP)
-"ax" = (/obj/structure/bed/chair,/obj/effect/floor_decal/borderfloor{dir = 1},/mob/living/simple_animal/hostile/syndicate/ranged{desc = "Even less friendly than he looks."; speak = list("Wish I had better equipment...","I knew I should have been a line chef...","Fuckin' helmet keeps fogging up.","Anyone else smell that?")},/turf/simulated/floor/tiled,/area/submap/DoomP)
-"ay" = (/obj/machinery/light/small{dir = 1},/obj/effect/floor_decal/borderfloor{dir = 1},/turf/simulated/floor/tiled,/area/submap/DoomP)
-"az" = (/obj/machinery/vending/cigarette,/obj/effect/floor_decal/borderfloor{dir = 5},/turf/simulated/floor/tiled,/area/submap/DoomP)
-"aA" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/tiled,/area/submap/DoomP)
-"aB" = (/obj/machinery/power/smes/buildable/point_of_interest,/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/submap/DoomP)
-"aC" = (/obj/machinery/power/smes/buildable/point_of_interest,/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/submap/DoomP)
-"aD" = (/obj/machinery/power/apc{dir = 1; name = "PAPC"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/tiled/techfloor/grid,/area/submap/DoomP)
-"aE" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/port_gen/pacman,/turf/simulated/floor/plating,/area/submap/DoomP)
-"aF" = (/obj/structure/table/standard,/obj/random/toolbox,/turf/simulated/floor/tiled/techfloor/grid,/area/submap/DoomP)
-"aG" = (/obj/structure/table/standard,/obj/item/stack/material/phoron{amount = 25},/turf/simulated/floor/tiled/techfloor/grid,/area/submap/DoomP)
-"aH" = (/obj/structure/closet/secure_closet/engineering_electrical,/turf/simulated/floor/tiled/techfloor/grid,/area/submap/DoomP)
-"aI" = (/obj/structure/lattice,/turf/simulated/floor/outdoors/rocks,/area/submap/DoomP)
-"aJ" = (/obj/structure/bed/chair{dir = 4},/obj/effect/floor_decal/borderfloor{dir = 8},/mob/living/simple_animal/hostile/syndicate/ranged{desc = "Even less friendly than he looks."; speak = list("Wish I had better equipment...","I knew I should have been a line chef...","Fuckin' helmet keeps fogging up.","Anyone else smell that?")},/turf/simulated/floor/tiled,/area/submap/DoomP)
-"aK" = (/obj/structure/table/standard,/turf/simulated/floor/tiled,/area/submap/DoomP)
-"aL" = (/obj/structure/table/standard,/obj/item/pizzabox,/turf/simulated/floor/tiled,/area/submap/DoomP)
-"aM" = (/turf/simulated/floor/tiled,/area/submap/DoomP)
-"aN" = (/obj/machinery/vending/snack,/obj/effect/floor_decal/borderfloor{dir = 4},/turf/simulated/floor/tiled,/area/submap/DoomP)
-"aO" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/tiled/techfloor/grid,/area/submap/DoomP)
-"aP" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/tiled/techfloor/grid,/area/submap/DoomP)
-"aQ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/tiled/techfloor/grid,/area/submap/DoomP)
-"aR" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled/techfloor/grid,/area/submap/DoomP)
-"aS" = (/turf/simulated/floor/tiled/techfloor/grid,/area/submap/DoomP)
-"aT" = (/obj/machinery/light/small,/turf/simulated/floor/tiled/techfloor/grid,/area/submap/DoomP)
-"aU" = (/obj/structure/lattice,/turf/simulated/floor/water,/area/submap/DoomP)
-"aV" = (/obj/machinery/light/small{dir = 8},/obj/effect/floor_decal/borderfloor{dir = 8},/turf/simulated/floor/tiled,/area/submap/DoomP)
-"aW" = (/obj/machinery/vending/cola,/obj/effect/floor_decal/borderfloor/corner{dir = 4},/turf/simulated/floor/tiled,/area/submap/DoomP)
-"aX" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/tiled,/area/submap/DoomP)
-"aY" = (/obj/machinery/door/airlock/engineering,/turf/simulated/floor/tiled/techfloor/grid,/area/submap/DoomP)
-"aZ" = (/obj/structure/sign/electricshock,/turf/simulated/wall/r_wall,/area/submap/DoomP)
-"ba" = (/obj/effect/floor_decal/borderfloor{dir = 10},/turf/simulated/floor/tiled,/area/submap/DoomP)
-"bb" = (/obj/effect/floor_decal/borderfloor,/turf/simulated/floor/tiled,/area/submap/DoomP)
-"bc" = (/obj/machinery/light/small,/obj/effect/floor_decal/borderfloor,/turf/simulated/floor/tiled,/area/submap/DoomP)
-"bd" = (/obj/effect/floor_decal/borderfloor/corner{dir = 8},/turf/simulated/floor/tiled,/area/submap/DoomP)
-"be" = (/obj/machinery/door/airlock/hatch,/turf/simulated/floor/tiled,/area/submap/DoomP)
-"bf" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/tiled,/area/submap/DoomP)
-"bg" = (/obj/machinery/door/airlock/highsecurity,/turf/simulated/floor/tiled/techfloor,/area/submap/DoomP)
-"bh" = (/obj/machinery/door/airlock,/turf/simulated/floor/tiled/white,/area/submap/DoomP)
-"bi" = (/turf/simulated/floor/tiled/techfloor,/area/submap/DoomP)
-"bj" = (/obj/structure/table/standard,/turf/simulated/floor/tiled/techfloor,/area/submap/DoomP)
-"bk" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/syndie_kit/spy,/turf/simulated/floor/tiled/techfloor,/area/submap/DoomP)
-"bl" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/smokes,/turf/simulated/floor/tiled/techfloor,/area/submap/DoomP)
-"bm" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/handcuffs,/turf/simulated/floor/tiled/techfloor,/area/submap/DoomP)
-"bn" = (/obj/structure/table/rack,/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/turf/simulated/floor/tiled/techfloor,/area/submap/DoomP)
-"bo" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/laser/mounted,/turf/simulated/floor/tiled/techfloor,/area/submap/DoomP)
-"bp" = (/obj/structure/table/rack,/obj/item/weapon/gun/projectile/contender,/obj/item/ammo_magazine/s357,/obj/item/ammo_magazine/s357,/obj/item/ammo_magazine/s357,/turf/simulated/floor/tiled/techfloor,/area/submap/DoomP)
-"bq" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/obj/item/toy/plushie/spider,/obj/effect/floor_decal/corner/lime/full{dir = 8},/turf/simulated/floor/tiled/white,/area/submap/DoomP)
-"br" = (/obj/structure/table/standard,/obj/effect/floor_decal/corner/lime{dir = 5},/turf/simulated/floor/tiled/white,/area/submap/DoomP)
-"bs" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/obj/effect/floor_decal/corner/lime{dir = 5},/turf/simulated/floor/tiled/white,/area/submap/DoomP)
-"bt" = (/obj/structure/table/standard,/obj/item/device/flashlight/lamp,/obj/effect/floor_decal/corner/lime{dir = 5},/turf/simulated/floor/tiled/white,/area/submap/DoomP)
-"bu" = (/obj/structure/table/standard,/obj/structure/bedsheetbin,/obj/effect/floor_decal/corner/lime{dir = 1},/turf/simulated/floor/tiled/white,/area/submap/DoomP)
-"bv" = (/turf/simulated/floor/tiled/white,/area/submap/DoomP)
-"bw" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/tiled/white,/area/submap/DoomP)
-"bx" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/tiled/white,/area/submap/DoomP)
-"by" = (/obj/machinery/light/small,/turf/simulated/floor/tiled/techfloor,/area/submap/DoomP)
-"bz" = (/obj/machinery/light/small{dir = 8},/obj/effect/floor_decal/corner/lime/full,/turf/simulated/floor/tiled/white,/area/submap/DoomP)
-"bA" = (/obj/effect/floor_decal/corner/lime{dir = 10},/turf/simulated/floor/tiled/white,/area/submap/DoomP)
-"bB" = (/obj/machinery/light/small{dir = 4; pixel_y = 0},/obj/effect/floor_decal/corner/lime{dir = 10},/turf/simulated/floor/tiled/white,/area/submap/DoomP)
-"bC" = (/obj/machinery/shower{dir = 1},/obj/structure/curtain/open/shower,/turf/simulated/floor/tiled/white,/area/submap/DoomP)
-"bD" = (/obj/structure/toilet{dir = 1},/turf/simulated/floor/tiled/white,/area/submap/DoomP)
-"bE" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/submap/DoomP)
-"bF" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/submap/DoomP)
-"bG" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/submap/DoomP)
-"bH" = (/obj/structure/lattice,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/DoomP)
+"al" = (/obj/effect/decal/cleanable/blood,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/DoomP)
+"am" = (/obj/random/landmine,/turf/simulated/floor/outdoors/rocks,/area/submap/DoomP)
+"an" = (/obj/effect/decal/remains/mouse,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/DoomP)
+"ao" = (/obj/effect/decal/remains/deer,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/DoomP)
+"ap" = (/obj/effect/decal/remains/mouse,/obj/random/landmine,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/DoomP)
+"aq" = (/obj/structure/flora/tree/sif,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/DoomP)
+"ar" = (/obj/machinery/light/small,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/DoomP)
+"as" = (/obj/machinery/porta_turret,/turf/simulated/floor/plating,/area/submap/DoomP)
+"at" = (/turf/simulated/wall/r_wall,/area/submap/DoomP)
+"au" = (/obj/structure/sign/warning/secure_area,/turf/simulated/wall/r_wall,/area/submap/DoomP)
+"av" = (/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/submap/DoomP)
+"aw" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plating,/area/submap/DoomP)
+"ax" = (/obj/effect/floor_decal/borderfloor{dir = 9},/turf/simulated/floor/tiled,/area/submap/DoomP)
+"ay" = (/obj/structure/bed/chair,/obj/effect/floor_decal/borderfloor{dir = 1},/turf/simulated/floor/tiled,/area/submap/DoomP)
+"az" = (/obj/effect/floor_decal/borderfloor{dir = 1},/turf/simulated/floor/tiled,/area/submap/DoomP)
+"aA" = (/obj/structure/bed/chair,/obj/effect/floor_decal/borderfloor{dir = 1},/mob/living/simple_animal/hostile/syndicate/ranged{desc = "Even less friendly than he looks."; speak = list("Wish I had better equipment...","I knew I should have been a line chef...","Fuckin' helmet keeps fogging up.","Anyone else smell that?")},/turf/simulated/floor/tiled,/area/submap/DoomP)
+"aB" = (/obj/machinery/light/small{dir = 1},/obj/effect/floor_decal/borderfloor{dir = 1},/turf/simulated/floor/tiled,/area/submap/DoomP)
+"aC" = (/obj/machinery/vending/cigarette,/obj/effect/floor_decal/borderfloor{dir = 5},/turf/simulated/floor/tiled,/area/submap/DoomP)
+"aD" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/tiled,/area/submap/DoomP)
+"aE" = (/obj/machinery/power/smes/buildable/point_of_interest,/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/submap/DoomP)
+"aF" = (/obj/machinery/power/smes/buildable/point_of_interest,/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/submap/DoomP)
+"aG" = (/obj/machinery/power/apc{dir = 1; name = "PAPC"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/tiled/techfloor/grid,/area/submap/DoomP)
+"aH" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/port_gen/pacman,/turf/simulated/floor/plating,/area/submap/DoomP)
+"aI" = (/obj/structure/table/standard,/obj/random/toolbox,/turf/simulated/floor/tiled/techfloor/grid,/area/submap/DoomP)
+"aJ" = (/obj/structure/table/standard,/obj/item/stack/material/phoron{amount = 25},/turf/simulated/floor/tiled/techfloor/grid,/area/submap/DoomP)
+"aK" = (/obj/structure/closet/secure_closet/engineering_electrical,/turf/simulated/floor/tiled/techfloor/grid,/area/submap/DoomP)
+"aL" = (/obj/structure/lattice,/turf/simulated/floor/outdoors/rocks,/area/submap/DoomP)
+"aM" = (/obj/structure/bed/chair{dir = 4},/obj/effect/floor_decal/borderfloor{dir = 8},/mob/living/simple_animal/hostile/syndicate/ranged{desc = "Even less friendly than he looks."; speak = list("Wish I had better equipment...","I knew I should have been a line chef...","Fuckin' helmet keeps fogging up.","Anyone else smell that?")},/turf/simulated/floor/tiled,/area/submap/DoomP)
+"aN" = (/obj/structure/table/standard,/turf/simulated/floor/tiled,/area/submap/DoomP)
+"aO" = (/obj/structure/table/standard,/obj/item/pizzabox,/turf/simulated/floor/tiled,/area/submap/DoomP)
+"aP" = (/turf/simulated/floor/tiled,/area/submap/DoomP)
+"aQ" = (/obj/machinery/vending/snack,/obj/effect/floor_decal/borderfloor{dir = 4},/turf/simulated/floor/tiled,/area/submap/DoomP)
+"aR" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/tiled/techfloor/grid,/area/submap/DoomP)
+"aS" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/tiled/techfloor/grid,/area/submap/DoomP)
+"aT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/tiled/techfloor/grid,/area/submap/DoomP)
+"aU" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled/techfloor/grid,/area/submap/DoomP)
+"aV" = (/turf/simulated/floor/tiled/techfloor/grid,/area/submap/DoomP)
+"aW" = (/obj/machinery/light/small,/turf/simulated/floor/tiled/techfloor/grid,/area/submap/DoomP)
+"aX" = (/obj/structure/lattice,/turf/simulated/floor/water,/area/submap/DoomP)
+"aY" = (/obj/machinery/light/small{dir = 8},/obj/effect/floor_decal/borderfloor{dir = 8},/turf/simulated/floor/tiled,/area/submap/DoomP)
+"aZ" = (/obj/machinery/vending/cola,/obj/effect/floor_decal/borderfloor/corner{dir = 4},/turf/simulated/floor/tiled,/area/submap/DoomP)
+"ba" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/tiled,/area/submap/DoomP)
+"bb" = (/obj/machinery/door/airlock/engineering,/turf/simulated/floor/tiled/techfloor/grid,/area/submap/DoomP)
+"bc" = (/obj/structure/sign/electricshock,/turf/simulated/wall/r_wall,/area/submap/DoomP)
+"bd" = (/obj/effect/floor_decal/borderfloor{dir = 10},/turf/simulated/floor/tiled,/area/submap/DoomP)
+"be" = (/obj/effect/floor_decal/borderfloor,/turf/simulated/floor/tiled,/area/submap/DoomP)
+"bf" = (/obj/machinery/light/small,/obj/effect/floor_decal/borderfloor,/turf/simulated/floor/tiled,/area/submap/DoomP)
+"bg" = (/obj/effect/floor_decal/borderfloor/corner{dir = 8},/turf/simulated/floor/tiled,/area/submap/DoomP)
+"bh" = (/obj/machinery/door/airlock/hatch,/turf/simulated/floor/tiled,/area/submap/DoomP)
+"bi" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/tiled,/area/submap/DoomP)
+"bj" = (/obj/machinery/door/airlock/highsecurity,/turf/simulated/floor/tiled/techfloor,/area/submap/DoomP)
+"bk" = (/obj/machinery/door/airlock,/turf/simulated/floor/tiled/white,/area/submap/DoomP)
+"bl" = (/turf/simulated/floor/tiled/techfloor,/area/submap/DoomP)
+"bm" = (/obj/structure/table/standard,/turf/simulated/floor/tiled/techfloor,/area/submap/DoomP)
+"bn" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/syndie_kit/spy,/turf/simulated/floor/tiled/techfloor,/area/submap/DoomP)
+"bo" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/smokes,/turf/simulated/floor/tiled/techfloor,/area/submap/DoomP)
+"bp" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/handcuffs,/turf/simulated/floor/tiled/techfloor,/area/submap/DoomP)
+"bq" = (/obj/structure/table/rack,/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/turf/simulated/floor/tiled/techfloor,/area/submap/DoomP)
+"br" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/laser/mounted,/turf/simulated/floor/tiled/techfloor,/area/submap/DoomP)
+"bs" = (/obj/structure/table/rack,/obj/item/weapon/gun/projectile/contender,/obj/item/ammo_magazine/s357,/obj/item/ammo_magazine/s357,/obj/item/ammo_magazine/s357,/turf/simulated/floor/tiled/techfloor,/area/submap/DoomP)
+"bt" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/obj/item/toy/plushie/spider,/obj/effect/floor_decal/corner/lime/full{dir = 8},/turf/simulated/floor/tiled/white,/area/submap/DoomP)
+"bu" = (/obj/structure/table/standard,/obj/effect/floor_decal/corner/lime{dir = 5},/turf/simulated/floor/tiled/white,/area/submap/DoomP)
+"bv" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/obj/effect/floor_decal/corner/lime{dir = 5},/turf/simulated/floor/tiled/white,/area/submap/DoomP)
+"bw" = (/obj/structure/table/standard,/obj/item/device/flashlight/lamp,/obj/effect/floor_decal/corner/lime{dir = 5},/turf/simulated/floor/tiled/white,/area/submap/DoomP)
+"bx" = (/obj/structure/table/standard,/obj/structure/bedsheetbin,/obj/effect/floor_decal/corner/lime{dir = 1},/turf/simulated/floor/tiled/white,/area/submap/DoomP)
+"by" = (/turf/simulated/floor/tiled/white,/area/submap/DoomP)
+"bz" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/tiled/white,/area/submap/DoomP)
+"bA" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/tiled/white,/area/submap/DoomP)
+"bB" = (/obj/machinery/light/small,/turf/simulated/floor/tiled/techfloor,/area/submap/DoomP)
+"bC" = (/obj/machinery/light/small{dir = 8},/obj/effect/floor_decal/corner/lime/full,/turf/simulated/floor/tiled/white,/area/submap/DoomP)
+"bD" = (/obj/effect/floor_decal/corner/lime{dir = 10},/turf/simulated/floor/tiled/white,/area/submap/DoomP)
+"bE" = (/obj/machinery/light/small{dir = 4; pixel_y = 0},/obj/effect/floor_decal/corner/lime{dir = 10},/turf/simulated/floor/tiled/white,/area/submap/DoomP)
+"bF" = (/obj/machinery/shower{dir = 1},/obj/structure/curtain/open/shower,/turf/simulated/floor/tiled/white,/area/submap/DoomP)
+"bG" = (/obj/structure/toilet{dir = 1},/turf/simulated/floor/tiled/white,/area/submap/DoomP)
+"bH" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/submap/DoomP)
+"bI" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/submap/DoomP)
+"bJ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/submap/DoomP)
+"bK" = (/obj/structure/lattice,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/DoomP)
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaabababababababababababababababababababababababababababababababababababacacacacacacacacabababababababadadadabababaeabaa
aaaeabababababababababababababababababababababababababababababababababacacafafafafafafacacacacababacadadadadadacacacabaa
aaababacacacacacacacabababababababagababababacacacacacacacacababacacacacafafafafafafafafafafacacacacadadahadacafafacabaa
-aaabacacafafafafafacacacacacacababaeabacacacacafafafafacacacacacafafafafafafafafafafafafafacacadadadadadacacacafafacabaa
+aaabacacafafafafafacacacacacacababaeabacacacacafafafafacacacacacafafafafafafafafafafafafafacacadadahadadacacacafafacabaa
aaabacafafafafafafafafafafafacacacacacacafafafafafafafafafafafafafafafafafafafafafafafafacacadaiadadajacacafafafafacacaa
-aaabacafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafacacacadadadadadadacafafafafafafacaa
-aaabacafafafafakakakakakakafafafafafafafafafafafafafakakakakakakakafafafafafafafafacacadajadadahadadadacafafafafafafacaa
-aaabacafafafafafakakakakakafafafafafafafafafakakakakakakakakakakakakakakafafafafafacadahadadadadadadacacafafafafafafacaa
-aaabacacafafafafafakakakakafafafafafafafafafakakakakakakakakakakakakakafafafafafacacaladadadamadahacacafafafafafafafacaa
-aaababacafafafafafafakakakakakafafafakakakakakakakakakakakakakakakakakakakakakafafacacadadadadadacacafafafafafafafafacaa
-aaababacafafafafafafakakakakakakakakakakakakakakakakakakakakakakakakakakafafafafafafacadadadaiadacacafafafafafafafacacaa
-aaababacacafafafafafafakakakakakakakakakakakakakakakakakakakakakakakakakafafafafafacacadahadadacacafafafafafafafafacabaa
+aaabacafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafacacacahadadadadadacafafafafafafacaa
+aaabacafafafafakakakakakakafafafafafafafafafafafafafakakakakakakakafafafafafafafafacacadaladadahadadadacafafafafafafacaa
+aaabacafafafafafakakakakakafafafafafafafafafakakakakakakakakakakakakakakafafafafafacadahadadadadadadamacafafafafafafacaa
+aaabacacafafafafafakakakakafafafafafafafafafakakakakakakakakakakakakakafafafafafacacanadadadaoadahacacafafafafafafafacaa
+aaababacafafafafafafakakakakakafafafakakakakakakakakakakakakakakakakakakakakakafafacacadadahadadacacafafafafafafafafacaa
+aaababacafafafafafafakakakakakakakakakakakakakakakakakakakakakakakakakakafafafafafafacadadadaiadacamafafafafafafafacacaa
+aaababacacafafafafafafakakakakakakakakakakakakakakakakakakakakakakakakakafafafafafacamadahadadacacafafafafafafafafacabaa
aaabababacafafafafafafafakakakakakakakakakakakakafafakakakakakakakakakafafafafafafacacadadadadacafafafafafafafafafacabaa
-aaabababacacafafafafafafafakakakakakakakakakakafafafafakakakakakakakakakafafafafafacacadadalacacafafafafafafafacacacabaa
+aaabababacacafafafafafafafakakakakakakakakakakafafafafakakakakakakakakakafafafafafamacadadapacacafafafafafafafacacacabaa
aaababababacafafafafafafakakakakakakakakakafafafafafafafafafafafafafafafafafafacacacadadadadacafafafafakafafafacacababaa
-aaababababacacafafafafafafakakakakakakafafafafafafafafafafafafafafafafafafafacacadadadadadacacafafafakakafafafafacababaa
-aaababababacacafafafafafakakakakakafafafafafafafafafafafafafafafafafafafafacacadadadadacacacafafafafakakakafafafacacabaa
-aaababababaeacafafafafakakakakakafafafafafafafafafafafafafafafafafafafafacacadadadacacacafafafafafafakakakafafafafacabaa
-aaababababacacafafakakakakakakakakafafafafafafafafafacacacacacacacafafacacadadacacacafafafafafafafafakakakafafafafacabaa
+aaababababacacafafafafafafakakakakakakafafafafafafafafafafafafafafafafafafafacacadahadahadacacafafafakakafafafafacababaa
+aaababababacacafafafafafakakakakakafafafafafafafafafafafafafafafafafafafafacacahadadadacacacafafafafakakakafafafacacabaa
+aaababababaeacafafafafakakakakakafafafafafafafafafafafafafafafafafafafafacacadadadamacacafafafafafafakakakafafafafacabaa
+aaababababacacafafakakakakakakakakafafafafafafafafafacacacacacacacafafacamadadacacacafafafafafafafafakakakafafafafacabaa
aaababababacafafafakakakakakakakakakakafafafafafacacacadadadadadacacacacadadacacafafafafafafafakafakakakafafafafafacabaa
-aaabababacacafafafafakakakakakakakafafafafafafacacadadanadadadadadadadadadadacafafafafafafafafakakakakakafafafafafacabaa
-aaabababacafafafafafafakakakakakafafafafafafacacadadadadadadanadadadadadadadacafafafafafafafakakakakakakafafafafacacabaa
+aaabababacacafafafafakakakakakakakafafafafafafacacadadaqadadadadadadadadadadacafafafafafafafafakakakakakafafafafafacabaa
+aaabababacafafafafafafakakakakakafafafafafafacacadadadadadadaqadadadahadadadamafafafafafafafakakakakakakafafafafacacabaa
aaabababacafafafafafafakakakakakafafafafafacacadadadadadadadadadadadadadadacacafafafafafafafakakakakakakakakafafacacabaa
aaabababacafafafafafafafakakakakafafafafacacadadadadadadadadadadadadadadadadacacafafafafafafakakakakakakakakafafafacabaa
aaabababacafafafafafafafakakakafafafafafacadadadadadadadadadadadadadadadadadadacacafafafafafafakakakakakakafafafafacabaa
-aaabababacafafafafafafafakakakakakafafafacadadadadadadadaoadadadadadaoadadadadadacacafafafafafafakakakakafafafafafacabaa
-aaabababacafafafafafafafakakakakakafafafacadadapadadapadaqarasasasaraqadapadadapadacafafafafafafakakakakafafafafafacabaa
-aaabababacafafafafafafafakakakakakakafafacaqaqaqaqaqaqaqaqaqaqataqaqaqaqaqaqaqaqaqaqaqafafafafafakakakakafafafafacacabaa
-aaabababacacafafafafafafakakakakakakafafacaqauavawaxayaxawazaqaAaqaBaCaCaCaDaEaFaGaHaqafafafafafakakakakafafafafacacabaa
-aaabababacacacafafafafakakakakakakakafapaIaqaJaKaLaKaKaKaMaNaqaMaqaOaPaPaPaQaRaSaTaSaqaUapafafafakakakafafafafafafacabaa
-aaabababababacacafafafakakakakakakakafafafaqaVaKaKaKaKaKaMaWaqaXaqaqaqaqaqaqaYaZaqaqaqafafafafafakakakafafafafafafacabaa
-aaababababababacafafafakakakakakakakakafafaqbabbbbbcbbbbbdaMbeaMaMbfaMaMaMaMaMbfaMaMaqafafafafafakakakafafafafafafafacaa
-aaabababagabababacafafakakakakakakakakapaUaqbgaqaqaqaqaqaqaqaqaqaqaqaqaqaqbhaqaqaqaqaqaUapafafafakakakafafafafafafafacaa
-aaababababababacacafafafakakakakakakakakafaqbibjbkblbmbnbobpaqbqbrbsbtbsbubvbhbwbhbxaqafafafafafakakakafafafafafafafacaa
-aaababababababacafafafafakakakakakakakakafaqbibibybibibybibiaqbzbAbAbAbAbAbBaqbCaqbDaqafafafafakakakakakafafafafafafacaa
-aaababababababacafafafafakakakakakakakakakaqaqaqaqaqaqaqaqaqaqaqaqbEbFbFbFbGaqaqaqaqaqafafafafakakakakafafafafafafafacaa
-aaabababababacacafafafakakakakakakakakakakafafafafaIacacadadadadbHadadadadadbHacacafafafafafafakakakakafafafafafafafacaa
-aaabababababacafafafafakakakakakakakakakakakakafafapafacacacacacapadadadadadapacafafafafafafakakakakakafafafafafafacacaa
+aaabababacafafafafafafafakakakakakafafafacadadadadadadadaradadadadadaradadadadadacacafafafafafafakakakakafafafafafacabaa
+aaabababacafafafafafafafakakakakakafafafacadadasadadasadatauavavavauatadasadadasadacafafafafafafakakakakafafafafafacabaa
+aaabababacafafafafafafafakakakakakakafafacatatatatatatatatatatawatatatatatatatatatatatafafafafafakakakakafafafafacacabaa
+aaabababacacafafafafafafakakakakakakafafacataxayazaAaBaAazaCataDataEaFaFaFaGaHaIaJaKatafafafafafakakakakafafafafacacabaa
+aaabababacacacafafafafakakakakakakakafasaLataMaNaOaNaNaNaPaQataPataRaSaSaSaTaUaVaWaVataXasafafafakakakafafafafafafacabaa
+aaabababababacacafafafakakakakakakakafafafataYaNaNaNaNaNaPaZatbaatatatatatatbbbcatatatafafafafafakakakafafafafafafacabaa
+aaababababababacafafafakakakakakakakakafafatbdbebebfbebebgaPbhaPaPbiaPaPaPaPaPbiaPaPatafafafafafakakakafafafafafafafacaa
+aaabababagabababacafafakakakakakakakakasaXatbjatatatatatatatatatatatatatatbkatatatatataXasafafafakakakafafafafafafafacaa
+aaababababababacacafafafakakakakakakakakafatblbmbnbobpbqbrbsatbtbubvbwbvbxbybkbzbkbAatafafafafafakakakafafafafafafafacaa
+aaababababababacafafafafakakakakakakakakafatblblbBblblbBblblatbCbDbDbDbDbDbEatbFatbGatafafafafakakakakakafafafafafafacaa
+aaababababababacafafafafakakakakakakakakakatatatatatatatatatatatatbHbIbIbIbJatatatatatafafafafakakakakafafafafafafafacaa
+aaabababababacacafafafakakakakakakakakakakafafafafaLacacadadadadbKadadadadadbKacacafafafafafafakakakakafafafafafafafacaa
+aaabababababacafafafafakakakakakakakakakakakakafafasafacacacacacasadadadadadasacafafafafafafakakakakakafafafafafafacacaa
aaababababacacafafafafakakakakakakakakakakakakakafafafafafafafacacadadadadadacacafafafafafakakakakakakafafafafafafacabaa
aaababababacafafafafafafakakakakakakakakakakakakafafafafafafafafacacacacacacacafafafafafafafakakakakakafafafafafacacabaa
aaabababacacafafafafafafakakakakakakakakakakakakakafafafafafafafafafafafafafafafafafafafafafafakakakafafafafafafacababaa
diff --git a/maps/submaps/surface_submaps/wilderness/Drugden.dmm b/maps/submaps/surface_submaps/wilderness/Drugden.dmm
new file mode 100644
index 0000000000..2d73991959
--- /dev/null
+++ b/maps/submaps/surface_submaps/wilderness/Drugden.dmm
@@ -0,0 +1,74 @@
+"a" = (/turf/template_noop,/area/template_noop)
+"b" = (/turf/template_noop,/area/submap/Drugd)
+"c" = (/turf/simulated/mineral/ignore_mapgen,/area/submap/Drugd)
+"d" = (/turf/simulated/wall,/area/submap/Drugd)
+"e" = (/obj/machinery/door/airlock,/turf/simulated/floor,/area/submap/Drugd)
+"f" = (/turf/simulated/floor/tiled,/area/submap/Drugd)
+"g" = (/obj/effect/floor_decal/rust,/turf/simulated/floor/tiled,/area/submap/Drugd)
+"h" = (/obj/random/trash,/turf/simulated/floor,/area/submap/Drugd)
+"i" = (/obj/structure/closet/cabinet,/obj/item/weapon/lipstick/random,/turf/simulated/floor/carpet,/area/submap/Drugd)
+"j" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/obj/structure/curtain/open/bed,/turf/simulated/floor/carpet,/area/submap/Drugd)
+"k" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/pill/happy,/turf/simulated/floor/carpet,/area/submap/Drugd)
+"l" = (/turf/simulated/floor,/area/submap/Drugd)
+"m" = (/obj/structure/curtain/black,/turf/simulated/floor,/area/submap/Drugd)
+"n" = (/obj/random/trash,/turf/simulated/floor/carpet,/area/submap/Drugd)
+"o" = (/turf/simulated/floor/carpet,/area/submap/Drugd)
+"p" = (/mob/living/simple_animal/mouse,/turf/simulated/floor,/area/submap/Drugd)
+"q" = (/obj/structure/closet/cabinet,/turf/simulated/floor/carpet,/area/submap/Drugd)
+"r" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/pill/methylphenidate,/turf/simulated/floor/carpet,/area/submap/Drugd)
+"s" = (/obj/structure/bed/chair/comfy/beige{tag = "icon-armchair_preview (NORTH)"; icon_state = "armchair_preview"; dir = 1},/turf/simulated/floor/carpet,/area/submap/Drugd)
+"t" = (/obj/item/weapon/reagent_containers/pill/citalopram,/turf/simulated/floor/carpet,/area/submap/Drugd)
+"u" = (/obj/random/junk,/turf/simulated/floor,/area/submap/Drugd)
+"v" = (/obj/structure/closet/cabinet,/obj/item/weapon/contraband/poster,/turf/simulated/floor/carpet,/area/submap/Drugd)
+"w" = (/obj/structure/bed/chair/comfy/beige,/turf/simulated/floor/carpet,/area/submap/Drugd)
+"x" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp,/obj/item/weapon/reagent_containers/syringe/drugs,/turf/simulated/floor/carpet,/area/submap/Drugd)
+"y" = (/obj/structure/bed/chair/comfy/beige,/obj/item/weapon/reagent_containers/pill/citalopram,/turf/simulated/floor/carpet,/area/submap/Drugd)
+"z" = (/obj/structure/loot_pile/maint/junk,/turf/simulated/floor,/area/submap/Drugd)
+"A" = (/obj/item/weapon/reagent_containers/pill/citalopram,/obj/item/weapon/reagent_containers/pill/citalopram,/turf/simulated/floor/carpet,/area/submap/Drugd)
+"B" = (/obj/structure/table/standard,/turf/simulated/floor/tiled,/area/submap/Drugd)
+"C" = (/obj/structure/table/standard,/obj/item/stack/medical/splint,/turf/simulated/floor/tiled,/area/submap/Drugd)
+"D" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/pill/citalopram,/obj/item/weapon/reagent_containers/pill/citalopram,/turf/simulated/floor/tiled,/area/submap/Drugd)
+"E" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/pill/tramadol,/obj/item/weapon/reagent_containers/pill/tramadol,/turf/simulated/floor/tiled,/area/submap/Drugd)
+"F" = (/obj/structure/closet/cabinet,/obj/item/clothing/accessory/jacket,/obj/item/weapon/material/butterfly/switchblade,/turf/simulated/floor/carpet,/area/submap/Drugd)
+"G" = (/obj/item/weapon/reagent_containers/pill/zoom,/obj/random/trash,/turf/simulated/floor/carpet,/area/submap/Drugd)
+"H" = (/obj/item/weapon/reagent_containers/pill/zoom,/turf/simulated/floor/carpet,/area/submap/Drugd)
+"I" = (/obj/structure/loot_pile/maint/boxfort,/turf/simulated/floor/carpet,/area/submap/Drugd)
+"J" = (/obj/structure/table/standard,/obj/item/weapon/surgical/scalpel,/turf/simulated/floor/tiled,/area/submap/Drugd)
+"K" = (/obj/item/wheelchair,/turf/simulated/floor/tiled,/area/submap/Drugd)
+"L" = (/obj/structure/table/standard,/obj/random/firstaid,/turf/simulated/floor,/area/submap/Drugd)
+"M" = (/obj/structure/loot_pile/maint/junk,/turf/simulated/floor/tiled,/area/submap/Drugd)
+"N" = (/obj/effect/floor_decal/rust,/obj/structure/table/standard,/turf/simulated/floor/tiled,/area/submap/Drugd)
+"O" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/pill/tramadol,/turf/simulated/floor/carpet,/area/submap/Drugd)
+"P" = (/mob/living/simple_animal/hostile/hivebot/range/guard,/turf/simulated/floor,/area/submap/Drugd)
+"Q" = (/obj/structure/girder,/turf/simulated/floor,/area/submap/Drugd)
+"R" = (/obj/item/weapon/material/shard,/turf/simulated/floor,/area/submap/Drugd)
+"S" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp,/turf/simulated/floor/carpet,/area/submap/Drugd)
+"T" = (/obj/structure/table/woodentable,/turf/simulated/floor/carpet,/area/submap/Drugd)
+
+(1,1,1) = {"
+aaaaaaaaaaaaaaaaaaaaaaaaa
+abbbbbbbbbbbbbbbbbbbbbbba
+abbbbbbbbbbbbbbbbbbbbbbba
+abbbbbbbbbbbbbbbbbbbbbbba
+abbcccccbbbbbbbbbbbbbbbba
+abbccccccbbbbbbbbccccbbba
+abcccccccccbbbbbccccccbba
+abcccccccccddeddcccccccba
+abcccccccccdfffddddddccba
+abcccccccccdgghdijkjdccca
+abcccccccccdgllmnooodccca
+abcccccccccdplldqrstdccca
+abcccccccccdulhddddddccca
+abcccccccccdllldvwxydccba
+acccccddddddzlgmoooAdccba
+acccccdBCDEdllfdFGHIdccba
+acccccdJKgLdlfMddddddccba
+abccccdNllLdhlgdqOwwdccca
+abbcccdlPllelllmoooodccca
+abbcccdQlRldllhdqSTndccca
+abbcccddddddludddddddccca
+abbccccccccccccccccccccba
+abbbcccccccccccccccccccba
+abbbbcccccbbbbbccccbccbba
+aaaaaaaaaaaaaaaaaaaaaaaaa
+"}
diff --git a/maps/submaps/surface_submaps/wilderness/MCamp1.dmm b/maps/submaps/surface_submaps/wilderness/MCamp1.dmm
index 3033ffdf62..bebe7a2de8 100644
--- a/maps/submaps/surface_submaps/wilderness/MCamp1.dmm
+++ b/maps/submaps/surface_submaps/wilderness/MCamp1.dmm
@@ -1,53 +1,60 @@
"a" = (/turf/template_noop,/area/template_noop)
"b" = (/turf/template_noop,/area/submap/MilitaryCamp1)
"c" = (/turf/simulated/floor/outdoors/dirt,/area/submap/MilitaryCamp1)
-"d" = (/obj/effect/mine,/turf/template_noop,/area/submap/MilitaryCamp1)
+"d" = (/obj/random/landmine,/turf/template_noop,/area/submap/MilitaryCamp1)
"e" = (/obj/structure/flora/bush,/turf/template_noop,/area/submap/MilitaryCamp1)
"f" = (/obj/effect/decal/cleanable/blood,/turf/template_noop,/area/submap/MilitaryCamp1)
-"g" = (/obj/effect/decal/remains,/turf/simulated/floor/outdoors/dirt,/area/submap/MilitaryCamp1)
-"h" = (/obj/structure/flora/tree/sif,/turf/template_noop,/area/submap/MilitaryCamp1)
-"i" = (/obj/item/stack/rods,/turf/template_noop,/area/submap/MilitaryCamp1)
-"j" = (/obj/effect/mine,/turf/simulated/floor/outdoors/dirt,/area/submap/MilitaryCamp1)
-"k" = (/turf/simulated/wall,/area/submap/MilitaryCamp1)
-"l" = (/turf/simulated/floor,/area/submap/MilitaryCamp1)
-"m" = (/obj/item/weapon/material/shard,/turf/template_noop,/area/submap/MilitaryCamp1)
-"n" = (/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/turf/simulated/floor,/area/submap/MilitaryCamp1)
-"o" = (/obj/structure/girder,/turf/simulated/floor,/area/submap/MilitaryCamp1)
-"p" = (/obj/machinery/computer/communications,/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/turf/simulated/floor,/area/submap/MilitaryCamp1)
-"q" = (/obj/structure/table/standard,/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/turf/simulated/floor,/area/submap/MilitaryCamp1)
-"r" = (/obj/effect/mine,/turf/simulated/floor,/area/submap/MilitaryCamp1)
-"s" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/submap/MilitaryCamp1)
-"t" = (/obj/machinery/computer/security,/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/turf/simulated/floor,/area/submap/MilitaryCamp1)
-"u" = (/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/turf/simulated/floor,/area/submap/MilitaryCamp1)
-"v" = (/obj/machinery/door/airlock,/turf/simulated/floor,/area/submap/MilitaryCamp1)
-"w" = (/obj/effect/decal/cleanable/dirt,/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/turf/simulated/floor,/area/submap/MilitaryCamp1)
-"x" = (/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/turf/template_noop,/area/submap/MilitaryCamp1)
-"y" = (/obj/structure/table,/turf/simulated/floor,/area/submap/MilitaryCamp1)
-"z" = (/obj/structure/table/standard,/obj/random/firstaid,/turf/simulated/floor,/area/submap/MilitaryCamp1)
-"A" = (/obj/machinery/door/airlock,/obj/effect/mine,/turf/simulated/floor,/area/submap/MilitaryCamp1)
-"B" = (/obj/structure/flora/tree/dead,/turf/template_noop,/area/submap/MilitaryCamp1)
-"C" = (/obj/structure/table/standard,/obj/item/weapon/gun/projectile/automatic/c20r,/turf/simulated/floor,/area/submap/MilitaryCamp1)
-"D" = (/obj/structure/table/standard,/obj/item/weapon/gun/energy/gun,/turf/simulated/floor,/area/submap/MilitaryCamp1)
+"g" = (/obj/random/landmine,/turf/simulated/floor/outdoors/dirt,/area/submap/MilitaryCamp1)
+"h" = (/obj/effect/decal/remains,/turf/simulated/floor/outdoors/dirt,/area/submap/MilitaryCamp1)
+"i" = (/obj/effect/mine,/turf/template_noop,/area/submap/MilitaryCamp1)
+"j" = (/obj/effect/decal/remains,/obj/random/landmine,/turf/simulated/floor/outdoors/dirt,/area/submap/MilitaryCamp1)
+"k" = (/obj/structure/flora/tree/sif,/turf/template_noop,/area/submap/MilitaryCamp1)
+"l" = (/obj/item/stack/rods,/turf/template_noop,/area/submap/MilitaryCamp1)
+"m" = (/turf/simulated/wall,/area/submap/MilitaryCamp1)
+"n" = (/obj/random/landmine,/turf/simulated/floor,/area/submap/MilitaryCamp1)
+"o" = (/turf/simulated/floor,/area/submap/MilitaryCamp1)
+"p" = (/obj/item/weapon/material/shard,/turf/template_noop,/area/submap/MilitaryCamp1)
+"q" = (/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/turf/simulated/floor,/area/submap/MilitaryCamp1)
+"r" = (/obj/structure/girder,/turf/simulated/floor,/area/submap/MilitaryCamp1)
+"s" = (/obj/machinery/computer/communications,/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/turf/simulated/floor,/area/submap/MilitaryCamp1)
+"t" = (/obj/structure/table/standard,/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/turf/simulated/floor,/area/submap/MilitaryCamp1)
+"u" = (/obj/effect/mine,/obj/random/landmine,/turf/simulated/floor,/area/submap/MilitaryCamp1)
+"v" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/submap/MilitaryCamp1)
+"w" = (/obj/machinery/computer/security,/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/turf/simulated/floor,/area/submap/MilitaryCamp1)
+"x" = (/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/turf/simulated/floor,/area/submap/MilitaryCamp1)
+"y" = (/obj/item/weapon/material/shard,/obj/random/landmine,/turf/template_noop,/area/submap/MilitaryCamp1)
+"z" = (/obj/machinery/door/airlock,/turf/simulated/floor,/area/submap/MilitaryCamp1)
+"A" = (/obj/effect/decal/cleanable/dirt,/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/turf/simulated/floor,/area/submap/MilitaryCamp1)
+"B" = (/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/turf/template_noop,/area/submap/MilitaryCamp1)
+"C" = (/obj/structure/table,/turf/simulated/floor,/area/submap/MilitaryCamp1)
+"D" = (/obj/structure/table/standard,/obj/random/firstaid,/turf/simulated/floor,/area/submap/MilitaryCamp1)
+"E" = (/obj/machinery/door/airlock,/obj/effect/mine,/turf/simulated/floor,/area/submap/MilitaryCamp1)
+"F" = (/obj/structure/flora/tree/dead,/turf/template_noop,/area/submap/MilitaryCamp1)
+"G" = (/obj/random/landmine,/turf/template_noop,/area/template_noop)
+"H" = (/obj/effect/decal/cleanable/dirt,/obj/random/landmine,/turf/simulated/floor,/area/submap/MilitaryCamp1)
+"I" = (/obj/structure/table/standard,/obj/item/weapon/gun/projectile/automatic/c20r,/turf/simulated/floor,/area/submap/MilitaryCamp1)
+"J" = (/obj/structure/table/standard,/obj/item/weapon/gun/energy/gun,/turf/simulated/floor,/area/submap/MilitaryCamp1)
+"K" = (/obj/effect/decal/cleanable/blood,/obj/random/landmine,/turf/template_noop,/area/submap/MilitaryCamp1)
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaa
abbcbdbefdbbbbbbbbba
-acgcbbbbbbbfdbcgbbba
-abccbbdbbhibbbccjhba
-abhbbikkllkklkmcbbba
-abbbbkkkllkkkkkbdbda
-abbdkknllokpqnkkbeba
-abbbkknorsktuukkbbba
-abbmkkvkkwkkkvkoxdba
-abbblknllslnwskkbbba
-afdblknllyznsskkbdba
-abbbokvAkkkkvvkobBba
-abbxkknlosssnnkkbbba
-aBbbkkCDkllnnnkkmbfa
-abbebkkkkvlkkkkbdbba
-abdbbbkkkslkkkbccdba
-abcbbbbkkbmkkbjcbbba
-acgcdbbbddbibbcghbba
-abccebdbhfbbdccbbbba
+aghcdbbbbbbfibcjbbba
+abccbbdbbklbbbccgkba
+adkbblmmnommnmpcbbba
+abbbbmmmonmmmmmbdbda
+abbdmmqoormstqmmbeba
+abbbmmqruvmwxxmmbbda
+abbymmzmmAmmmzmrBdba
+abbbomqoovoqAvmmbbba
+afdbomqooCDqvvmmbida
+abbbrmzEmmmmzzmrbFba
+GbbBmmqorvHvqqmmbbba
+aFbbmmIJmooqqqmmpbKa
+abbebmmmmzommmmbibba
+abddbbmmmvommmbcciba
+abcbbdbmmbymmbgcbbba
+acjcdbbbidblbdcjkbba
+abccebdbkfbbdccbbbba
aaaaaaaaaaaaaaaaaaaa
"}
diff --git a/maps/submaps/surface_submaps/wilderness/Rockybase.dmm b/maps/submaps/surface_submaps/wilderness/Rockybase.dmm
index efda8c92a0..b42bbb2ad1 100644
--- a/maps/submaps/surface_submaps/wilderness/Rockybase.dmm
+++ b/maps/submaps/surface_submaps/wilderness/Rockybase.dmm
@@ -9,151 +9,165 @@
"ai" = (/obj/machinery/porta_turret/stationary,/turf/simulated/floor,/area/submap/Rockybase)
"aj" = (/obj/effect/decal/cleanable/blood,/turf/simulated/floor,/area/submap/Rockybase)
"ak" = (/obj/structure/flora/tree/sif,/turf/template_noop,/area/template_noop)
-"al" = (/obj/machinery/light,/turf/simulated/floor,/area/submap/Rockybase)
-"am" = (/turf/simulated/wall/r_wall,/area/submap/Rockybase)
-"an" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/submap/Rockybase)
-"ao" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"ap" = (/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 5; pixel_y = 0},/obj/structure/curtain/open/shower,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/tiled/hydro,/area/submap/Rockybase)
-"aq" = (/turf/simulated/floor/tiled/hydro,/area/submap/Rockybase)
-"ar" = (/obj/machinery/shower{dir = 8; icon_state = "shower"; pixel_x = -5; pixel_y = 0},/obj/structure/curtain/open/shower,/obj/item/weapon/soap,/turf/simulated/floor/tiled/hydro,/area/submap/Rockybase)
-"as" = (/obj/structure/table/woodentable,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/holofloor/lino,/area/submap/Rockybase)
-"at" = (/obj/structure/table/woodentable,/turf/simulated/floor/holofloor/lino,/area/submap/Rockybase)
-"au" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp,/turf/simulated/floor/holofloor/lino,/area/submap/Rockybase)
-"av" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/turf/simulated/floor/holofloor/lino,/area/submap/Rockybase)
-"aw" = (/turf/simulated/floor/holofloor/lino,/area/submap/Rockybase)
-"ax" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/turf/simulated/floor/holofloor/lino,/area/submap/Rockybase)
-"ay" = (/obj/structure/table/woodentable,/obj/machinery/light{dir = 1},/turf/simulated/floor/holofloor/lino,/area/submap/Rockybase)
-"az" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/obj/item/toy/plushie/spider,/turf/simulated/floor/holofloor/lino,/area/submap/Rockybase)
-"aA" = (/obj/structure/closet/l3closet/janitor,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"aB" = (/mob/living/bot/cleanbot{faction = "malf_drone"},/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"aC" = (/obj/item/weapon/stool,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"aD" = (/obj/item/weapon/storage/belt/janitor,/obj/structure/table/standard,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"aE" = (/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"aF" = (/obj/structure/table/standard,/obj/item/device/laptop,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"aG" = (/obj/structure/table/standard,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"aH" = (/obj/structure/table/rack,/obj/item/weapon/gun/projectile/pistol,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"aI" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/gun/taser,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"aJ" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"aK" = (/obj/machinery/vending/coffee,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"aL" = (/obj/structure/table/rack,/obj/item/weapon/gun/projectile/shotgun/pump/combat,/obj/item/weapon/gun/projectile/shotgun/pump/combat,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"aM" = (/obj/machinery/vending/hydronutrients,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"aN" = (/obj/structure/closet/crate/hydroponics,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"aO" = (/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 5; pixel_y = 0},/obj/structure/curtain/open/shower,/turf/simulated/floor/tiled/hydro,/area/submap/Rockybase)
-"aP" = (/obj/machinery/shower{dir = 8; icon_state = "shower"; pixel_x = -5; pixel_y = 0},/obj/structure/curtain/open/shower,/turf/simulated/floor/tiled/hydro,/area/submap/Rockybase)
-"aQ" = (/obj/structure/janitorialcart,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"aR" = (/obj/structure/table/standard,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"aS" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"aT" = (/obj/structure/table/standard,/obj/item/weapon/paper{info = "Carl's absolutly fucked in the head. He's trying to squeeze as much drone production out as he can since he's worried we're gonna get found out but he's getting sloppier with each batch. Now's he's telling us he can speed the time on the IFF encoding. I already have a hard enough time getting these damn things not to stare at walls and now he's gonna shortchange the only part of these tincans that tells em not to turn us into paste on a wall. I told Richter to get out while he can, We're counting days before either some Sif task force shows up at our door or these things decide we aren't there friends anymore."; name = "Note"},/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"aU" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"aV" = (/obj/machinery/vending/security,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"aW" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/shotgunshells,/obj/item/weapon/storage/box/shotgunshells,/obj/item/weapon/storage/box/shotgunshells,/obj/item/ammo_magazine/m10mm,/obj/item/ammo_magazine/m10mm,/obj/item/ammo_magazine/m10mm,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"aX" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"aY" = (/obj/machinery/shower{dir = 8; icon_state = "shower"; pixel_x = -5; pixel_y = 0},/obj/structure/curtain/open/shower,/obj/machinery/light/small{dir = 4; pixel_y = 0},/turf/simulated/floor/tiled/hydro,/area/submap/Rockybase)
-"aZ" = (/obj/item/mecha_parts/part/gygax_left_leg,/turf/simulated/floor/holofloor/lino,/area/submap/Rockybase)
-"ba" = (/obj/machinery/light,/turf/simulated/floor/holofloor/lino,/area/submap/Rockybase)
-"bb" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/obj/item/weapon/gun/projectile/pistol,/turf/simulated/floor/holofloor/lino,/area/submap/Rockybase)
-"bc" = (/obj/structure/closet/crate/trashcart,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"bd" = (/obj/structure/loot_pile/maint/trash,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"be" = (/obj/structure/table/standard,/obj/item/weapon/storage/bag/trash,/obj/item/weapon/storage/bag/trash,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"bf" = (/obj/structure/table/standard,/obj/item/weapon/paper_bin,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"bg" = (/obj/machinery/light,/obj/structure/table/standard,/obj/item/weapon/pen,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"bh" = (/obj/machinery/door/airlock/security{icon_state = "door_locked"; locked = 1},/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"bi" = (/obj/machinery/light,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"bj" = (/obj/structure/table/rack,/obj/item/weapon/gun/projectile/automatic/c20r,/obj/item/weapon/gun/projectile/automatic/c20r,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"bk" = (/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"bl" = (/obj/machinery/door/airlock,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"bm" = (/mob/living/bot/farmbot{faction = "malf_drone"; name = "Mr. Weddleton"},/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"bn" = (/obj/machinery/portable_atmospherics/hydroponics,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"bo" = (/obj/machinery/vending/cola,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"bp" = (/obj/structure/door_assembly,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"bq" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"br" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"bs" = (/mob/living/simple_animal/hostile/malf_drone/lesser,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"bt" = (/obj/effect/decal/cleanable/blood,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"bu" = (/obj/effect/decal/remains,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"bv" = (/obj/machinery/door/airlock,/turf/simulated/floor/tiled/hydro,/area/submap/Rockybase)
-"bw" = (/obj/machinery/vending/snack,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"bx" = (/obj/item/stack/rods,/obj/structure/girder,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"by" = (/obj/item/mecha_parts/part/gygax_right_arm,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"bz" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/tiled/hydro,/area/submap/Rockybase)
-"bA" = (/obj/machinery/door/airlock/engineering,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"bB" = (/turf/simulated/wall,/area/submap/Rockybase)
-"bC" = (/obj/structure/table/standard,/obj/item/device/kit/paint/gygax/darkgygax,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"bD" = (/obj/structure/table/standard,/obj/item/weapon/paper{info = "I've decided to go forward and start some small scale tests of the Vicerator delivery grenades, Might as wall make sure they work like the real ones. There are a few Fauna areas nearbye and we're working to make sure the kinks in the code are worked out. Once we've made sure they stay flying we'll work on the IFF signals."; name = "V-Grenade Notice 2"},/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"bE" = (/obj/structure/table/standard,/obj/random/toolbox,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"bF" = (/obj/structure/table/standard,/obj/random/toolbox,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"bG" = (/obj/structure/table/standard,/obj/item/weapon/paper{info = "We've finally been able to get the Vicerator delivery grenades working, Took awhile to make sure the latching mechanism didn't fail but we're sure we've got it this time. Vel'Shem's worried about the miners having there own drone fab now but I say it's a small price to pay to keep the metal flowing, Especially since there telling us NT's starting to monopolize the metal rich parts."; name = "V-Grenade Notice 1"},/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"bH" = (/obj/structure/table/standard,/obj/item/stack/material/diamond,/obj/item/stack/material/diamond,/obj/item/stack/material/diamond,/obj/item/stack/material/diamond,/obj/item/stack/material/diamond,/obj/item/stack/material/diamond,/obj/item/stack/material/diamond,/obj/item/stack/material/diamond,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"bI" = (/obj/structure/table/standard,/obj/item/weapon/grenade/spawnergrenade/manhacks,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"bJ" = (/obj/structure/table/standard,/obj/item/stack/material/steel,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"bK" = (/obj/structure/table/standard,/obj/machinery/light{dir = 1},/obj/item/weapon/circuitboard/mecha/gygax/main,/obj/item/weapon/circuitboard/mecha/gygax/peripherals,/obj/item/weapon/circuitboard/mecha/gygax/targeting,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"bL" = (/obj/item/weapon/material/shard,/turf/simulated/floor,/area/submap/Rockybase)
-"bM" = (/obj/structure/table/standard,/obj/fiftyspawner/rods,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"bN" = (/obj/machinery/vending/engivend,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"bO" = (/obj/machinery/vending/tool,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"bP" = (/obj/structure/table/standard,/obj/item/weapon/storage/toolbox,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"bQ" = (/obj/structure/table/standard,/obj/item/weapon/storage/toolbox/mechanical,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"bR" = (/obj/item/mecha_parts/part/gygax_torso,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"bS" = (/obj/machinery/light{dir = 1},/obj/structure/closet/crate/medical,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"bT" = (/obj/structure/table/standard,/obj/structure/table/standard,/obj/effect/decal/cleanable/dirt,/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/burn,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"bU" = (/obj/structure/table/standard,/obj/item/clothing/mask/breath/medical,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"bV" = (/obj/structure/closet/secure_closet/medical2,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"bW" = (/obj/structure/toilet{dir = 4},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/tiled/hydro,/area/submap/Rockybase)
-"bX" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/tiled/hydro,/area/submap/Rockybase)
-"bY" = (/obj/structure/table/standard,/obj/item/device/mmi/digital/robot,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"bZ" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"ca" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"cb" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/port_gen/pacman,/turf/simulated/floor,/area/submap/Rockybase)
-"cc" = (/obj/item/stack/rods,/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"cd" = (/obj/effect/decal/cleanable/dirt,/obj/structure/girder,/turf/simulated/floor,/area/submap/Rockybase)
-"ce" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/submap/Rockybase)
-"cf" = (/obj/effect/decal/cleanable/dirt,/obj/structure/table,/turf/simulated/floor,/area/submap/Rockybase)
-"cg" = (/obj/structure/girder,/turf/simulated/floor,/area/submap/Rockybase)
-"ch" = (/obj/structure/closet/secure_closet/medical1,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"ci" = (/obj/machinery/light/small{dir = 4; pixel_y = 0},/turf/simulated/floor/tiled/hydro,/area/submap/Rockybase)
-"cj" = (/obj/machinery/drone_fabricator,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"ck" = (/obj/machinery/mecha_part_fabricator,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"cl" = (/obj/machinery/pros_fabricator,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"cm" = (/obj/structure/table/standard,/obj/item/mecha_parts/mecha_equipment/repair_droid,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"cn" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"co" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"cp" = (/obj/machinery/power/terminal{dir = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"cq" = (/obj/machinery/power/smes/buildable/point_of_interest,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor,/area/submap/Rockybase)
-"cr" = (/obj/machinery/vending/medical,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"cs" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"ct" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/submap/Rockybase)
-"cu" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/obj/item/weapon/material/shard,/turf/simulated/floor,/area/submap/Rockybase)
-"cv" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/submap/Rockybase)
-"cw" = (/obj/item/mecha_parts/part/gygax_armour,/turf/simulated/floor,/area/submap/Rockybase)
-"cx" = (/obj/item/mecha_parts/chassis/gygax,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"cy" = (/mob/living/simple_animal/hostile/mecha/malf_drone{name = "Autonomous Mechanized Drone"},/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"cz" = (/obj/machinery/vending/robotics,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"cA" = (/obj/machinery/power/apc{cell_type = /obj/item/weapon/cell/super; dir = 8; name = "Unknown APC"; pixel_x = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"cB" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"cC" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"cD" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"cE" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/blood,/turf/simulated/floor,/area/submap/Rockybase)
-"cF" = (/obj/item/mecha_parts/part/gygax_right_leg,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"cG" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/item/mecha_parts/part/gygax_left_arm,/turf/simulated/floor/tiled/hydro,/area/submap/Rockybase)
-"cH" = (/obj/machinery/vending,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"cI" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"cJ" = (/obj/machinery/power/smes/buildable/point_of_interest,/obj/structure/cable/green,/turf/simulated/floor,/area/submap/Rockybase)
-"cK" = (/obj/machinery/light{dir = 8},/obj/structure/closet/secure_closet/medical3,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"cL" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/mob/living/simple_animal/hostile/malf_drone/lesser,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"cM" = (/obj/structure/closet/secure_closet/hydroponics,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"cN" = (/obj/machinery/mech_recharger,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"cO" = (/obj/structure/table/standard,/obj/item/stack/material/plasteel,/obj/item/stack/material/glass/reinforced,/obj/item/stack/material/phoron{amount = 25},/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"cP" = (/obj/structure/table/standard,/obj/item/stack/material/glass,/obj/item/stack/material/steel,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"cQ" = (/obj/structure/table/standard,/obj/item/mecha_parts/part/gygax_head,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"cR" = (/obj/structure/closet/toolcloset,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"cS" = (/obj/structure/closet/secure_closet/medical3,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"cT" = (/obj/item/weapon/surgical/surgicaldrill,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"cU" = (/obj/structure/loot_pile/maint/technical,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"cV" = (/obj/item/clothing/suit/space/void/medical,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"cW" = (/obj/effect/decal/cleanable/dirt,/mob/living/bot/medbot{faction = "malf_drone"},/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"cX" = (/obj/machinery/vending/hydroseeds,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"cY" = (/obj/structure/closet/crate/secure/hydrosec,/turf/simulated/floor/tiled,/area/submap/Rockybase)
-"cZ" = (/obj/effect/decal/remains,/turf/template_noop,/area/template_noop)
+"al" = (/obj/effect/floor_decal/industrial/danger,/turf/simulated/floor,/area/submap/Rockybase)
+"am" = (/obj/machinery/light,/obj/effect/floor_decal/industrial/danger,/turf/simulated/floor,/area/submap/Rockybase)
+"an" = (/obj/effect/decal/cleanable/blood,/obj/effect/floor_decal/industrial/danger,/turf/simulated/floor,/area/submap/Rockybase)
+"ao" = (/turf/simulated/wall/r_wall,/area/submap/Rockybase)
+"ap" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/submap/Rockybase)
+"aq" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"ar" = (/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 5; pixel_y = 0},/obj/structure/curtain/open/shower,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/tiled/hydro,/area/submap/Rockybase)
+"as" = (/turf/simulated/floor/tiled/hydro,/area/submap/Rockybase)
+"at" = (/obj/machinery/shower{dir = 8; icon_state = "shower"; pixel_x = -5; pixel_y = 0},/obj/structure/curtain/open/shower,/obj/item/weapon/soap,/turf/simulated/floor/tiled/hydro,/area/submap/Rockybase)
+"au" = (/obj/structure/table/woodentable,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/holofloor/lino,/area/submap/Rockybase)
+"av" = (/obj/structure/table/woodentable,/turf/simulated/floor/holofloor/lino,/area/submap/Rockybase)
+"aw" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp,/turf/simulated/floor/holofloor/lino,/area/submap/Rockybase)
+"ax" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/turf/simulated/floor/holofloor/lino,/area/submap/Rockybase)
+"ay" = (/turf/simulated/floor/holofloor/lino,/area/submap/Rockybase)
+"az" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/turf/simulated/floor/holofloor/lino,/area/submap/Rockybase)
+"aA" = (/obj/structure/table/woodentable,/obj/machinery/light{dir = 1},/turf/simulated/floor/holofloor/lino,/area/submap/Rockybase)
+"aB" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/obj/item/toy/plushie/spider,/turf/simulated/floor/holofloor/lino,/area/submap/Rockybase)
+"aC" = (/obj/structure/closet/l3closet/janitor,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"aD" = (/mob/living/bot/cleanbot{faction = "malf_drone"},/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"aE" = (/obj/item/weapon/stool,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"aF" = (/obj/item/weapon/storage/belt/janitor,/obj/structure/table/standard,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"aG" = (/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"aH" = (/obj/structure/table/standard,/obj/item/device/laptop,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"aI" = (/obj/structure/table/standard,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"aJ" = (/obj/structure/table/rack,/obj/item/weapon/gun/projectile/pistol,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"aK" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/gun/taser,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"aL" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"aM" = (/obj/machinery/vending/coffee,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"aN" = (/obj/structure/table/rack,/obj/item/weapon/gun/projectile/shotgun/pump/combat,/obj/item/weapon/gun/projectile/shotgun/pump/combat,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"aO" = (/obj/machinery/vending/hydronutrients,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"aP" = (/obj/structure/closet/crate/hydroponics,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"aQ" = (/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 5; pixel_y = 0},/obj/structure/curtain/open/shower,/turf/simulated/floor/tiled/hydro,/area/submap/Rockybase)
+"aR" = (/obj/machinery/shower{dir = 8; icon_state = "shower"; pixel_x = -5; pixel_y = 0},/obj/structure/curtain/open/shower,/turf/simulated/floor/tiled/hydro,/area/submap/Rockybase)
+"aS" = (/obj/structure/janitorialcart,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"aT" = (/obj/structure/table/standard,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"aU" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"aV" = (/obj/structure/table/standard,/obj/item/weapon/paper{info = "Carl's absolutly fucked in the head. He's trying to squeeze as much drone production out as he can since he's worried we're gonna get found out but he's getting sloppier with each batch. Now's he's telling us he can speed the time on the IFF encoding. I already have a hard enough time getting these damn things not to stare at walls and now he's gonna shortchange the only part of these tincans that tells em not to turn us into paste on a wall. I told Richter to get out while he can, We're counting days before either some Sif task force shows up at our door or these things decide we aren't there friends anymore."; name = "Note"},/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"aW" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"aX" = (/obj/machinery/vending/security,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"aY" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/shotgunshells,/obj/item/weapon/storage/box/shotgunshells,/obj/item/weapon/storage/box/shotgunshells,/obj/item/ammo_magazine/m10mm,/obj/item/ammo_magazine/m10mm,/obj/item/ammo_magazine/m10mm,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"aZ" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"ba" = (/obj/machinery/shower{dir = 8; icon_state = "shower"; pixel_x = -5; pixel_y = 0},/obj/structure/curtain/open/shower,/obj/machinery/light/small{dir = 4; pixel_y = 0},/turf/simulated/floor/tiled/hydro,/area/submap/Rockybase)
+"bb" = (/obj/item/mecha_parts/part/gygax_left_leg,/turf/simulated/floor/holofloor/lino,/area/submap/Rockybase)
+"bc" = (/obj/machinery/light,/turf/simulated/floor/holofloor/lino,/area/submap/Rockybase)
+"bd" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/obj/item/weapon/gun/projectile/pistol,/turf/simulated/floor/holofloor/lino,/area/submap/Rockybase)
+"be" = (/obj/structure/closet/crate/trashcart,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"bf" = (/obj/structure/loot_pile/maint/trash,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"bg" = (/obj/structure/table/standard,/obj/item/weapon/storage/bag/trash,/obj/item/weapon/storage/bag/trash,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"bh" = (/obj/structure/table/standard,/obj/item/weapon/paper_bin,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"bi" = (/obj/machinery/light,/obj/structure/table/standard,/obj/item/weapon/pen,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"bj" = (/obj/machinery/door/airlock/security{icon_state = "door_locked"; locked = 1},/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"bk" = (/obj/machinery/light,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"bl" = (/obj/structure/table/rack,/obj/item/weapon/gun/projectile/automatic/c20r,/obj/item/weapon/gun/projectile/automatic/c20r,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"bm" = (/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"bn" = (/obj/machinery/door/airlock,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"bo" = (/mob/living/bot/farmbot{faction = "malf_drone"; name = "Mr. Weddleton"},/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"bp" = (/obj/machinery/portable_atmospherics/hydroponics,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"bq" = (/obj/machinery/vending/cola,/obj/effect/floor_decal/borderfloor{dir = 1},/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"br" = (/obj/effect/floor_decal/borderfloor{dir = 1},/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"bs" = (/obj/machinery/light{dir = 1},/obj/effect/floor_decal/borderfloor{dir = 1},/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"bt" = (/obj/structure/door_assembly,/obj/effect/floor_decal/borderfloor{dir = 1},/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"bu" = (/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/borderfloor{dir = 1},/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"bv" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/cobweb2,/obj/effect/floor_decal/borderfloor{dir = 1},/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"bw" = (/mob/living/simple_animal/hostile/malf_drone/lesser,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"bx" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"by" = (/obj/effect/decal/cleanable/blood,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"bz" = (/obj/effect/decal/remains,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"bA" = (/obj/machinery/door/airlock,/turf/simulated/floor/tiled/hydro,/area/submap/Rockybase)
+"bB" = (/obj/machinery/vending/snack,/obj/effect/floor_decal/borderfloor,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"bC" = (/obj/effect/floor_decal/borderfloor,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"bD" = (/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/borderfloor,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"bE" = (/obj/item/stack/rods,/obj/structure/girder,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"bF" = (/obj/effect/decal/remains,/obj/effect/floor_decal/borderfloor,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"bG" = (/obj/machinery/light,/obj/effect/floor_decal/borderfloor,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"bH" = (/obj/effect/decal/cleanable/blood,/obj/effect/floor_decal/borderfloor,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"bI" = (/obj/item/mecha_parts/part/gygax_right_arm,/obj/effect/floor_decal/borderfloor,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"bJ" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/tiled/hydro,/area/submap/Rockybase)
+"bK" = (/obj/machinery/door/airlock/engineering,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"bL" = (/obj/effect/floor_decal/rust,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"bM" = (/turf/simulated/wall,/area/submap/Rockybase)
+"bN" = (/obj/structure/table/standard,/obj/item/device/kit/paint/gygax/darkgygax,/obj/item/borg/upgrade/syndicate,/obj/item/borg/upgrade/vtec,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"bO" = (/obj/structure/table/standard,/obj/item/weapon/paper{info = "I've decided to go forward and start some small scale tests of the Vicerator delivery grenades, Might as wall make sure they work like the real ones. There are a few Fauna areas nearbye and we're working to make sure the kinks in the code are worked out. Once we've made sure they stay flying we'll work on the IFF signals."; name = "V-Grenade Notice 2"},/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"bP" = (/obj/structure/table/standard,/obj/random/toolbox,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"bQ" = (/obj/structure/table/standard,/obj/random/toolbox,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"bR" = (/obj/structure/table/standard,/obj/item/weapon/paper{info = "We've finally been able to get the Vicerator delivery grenades working, Took awhile to make sure the latching mechanism didn't fail but we're sure we've got it this time. Vel'Shem's worried about the miners having there own drone fab now but I say it's a small price to pay to keep the metal flowing, Especially since there telling us NT's starting to monopolize the metal rich parts."; name = "V-Grenade Notice 1"},/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"bS" = (/obj/structure/table/standard,/obj/item/stack/material/diamond,/obj/item/stack/material/diamond,/obj/item/stack/material/diamond,/obj/item/stack/material/diamond,/obj/item/stack/material/diamond,/obj/item/stack/material/diamond,/obj/item/stack/material/diamond,/obj/item/stack/material/diamond,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"bT" = (/obj/structure/table/standard,/obj/item/weapon/grenade/spawnergrenade/manhacks,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"bU" = (/obj/structure/table/standard,/obj/item/stack/material/steel,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"bV" = (/obj/structure/table/standard,/obj/machinery/light{dir = 1},/obj/item/weapon/circuitboard/mecha/gygax/main,/obj/item/weapon/circuitboard/mecha/gygax/peripherals,/obj/item/weapon/circuitboard/mecha/gygax/targeting,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"bW" = (/obj/structure/door_assembly,/obj/effect/floor_decal/rust,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"bX" = (/obj/item/weapon/material/shard,/turf/simulated/floor,/area/submap/Rockybase)
+"bY" = (/obj/structure/table/standard,/obj/fiftyspawner/rods,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"bZ" = (/obj/machinery/vending/engivend,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"ca" = (/obj/machinery/vending/tool,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"cb" = (/obj/structure/table/standard,/obj/item/weapon/storage/toolbox,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"cc" = (/obj/structure/table/standard,/obj/item/weapon/storage/toolbox/mechanical,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"cd" = (/obj/item/mecha_parts/part/gygax_torso,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"ce" = (/obj/machinery/light{dir = 1},/obj/structure/closet/crate/medical,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"cf" = (/obj/structure/table/standard,/obj/structure/table/standard,/obj/effect/decal/cleanable/dirt,/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/burn,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"cg" = (/obj/structure/table/standard,/obj/item/clothing/mask/breath/medical,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"ch" = (/obj/structure/closet/secure_closet/medical2,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"ci" = (/obj/structure/toilet{dir = 4},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/tiled/hydro,/area/submap/Rockybase)
+"cj" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/tiled/hydro,/area/submap/Rockybase)
+"ck" = (/obj/structure/table/standard,/obj/item/device/mmi/digital/robot,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"cl" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"cm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"cn" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/port_gen/pacman,/turf/simulated/floor,/area/submap/Rockybase)
+"co" = (/obj/structure/door_assembly,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"cp" = (/obj/item/stack/rods,/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"cq" = (/obj/effect/decal/cleanable/dirt,/obj/structure/girder,/turf/simulated/floor,/area/submap/Rockybase)
+"cr" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/submap/Rockybase)
+"cs" = (/obj/effect/decal/cleanable/dirt,/obj/structure/table,/turf/simulated/floor,/area/submap/Rockybase)
+"ct" = (/obj/structure/girder,/turf/simulated/floor,/area/submap/Rockybase)
+"cu" = (/obj/structure/closet/secure_closet/medical1,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"cv" = (/obj/machinery/light/small{dir = 4; pixel_y = 0},/turf/simulated/floor/tiled/hydro,/area/submap/Rockybase)
+"cw" = (/obj/machinery/drone_fabricator,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"cx" = (/obj/machinery/mecha_part_fabricator,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"cy" = (/obj/machinery/pros_fabricator,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"cz" = (/obj/structure/table/standard,/obj/item/mecha_parts/mecha_equipment/repair_droid,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"cA" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"cB" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"cC" = (/obj/machinery/power/terminal{dir = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"cD" = (/obj/machinery/power/smes/buildable/point_of_interest,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor,/area/submap/Rockybase)
+"cE" = (/obj/machinery/vending/medical,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"cF" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"cG" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/submap/Rockybase)
+"cH" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/obj/item/weapon/material/shard,/turf/simulated/floor,/area/submap/Rockybase)
+"cI" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/submap/Rockybase)
+"cJ" = (/obj/item/mecha_parts/part/gygax_armour,/turf/simulated/floor,/area/submap/Rockybase)
+"cK" = (/obj/item/mecha_parts/chassis/gygax,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"cL" = (/mob/living/simple_animal/hostile/mecha/malf_drone{name = "Autonomous Mechanized Drone"},/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"cM" = (/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"cN" = (/obj/machinery/vending/robotics,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"cO" = (/obj/machinery/power/apc{cell_type = /obj/item/weapon/cell/super; dir = 8; name = "Unknown APC"; pixel_x = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"cP" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"cQ" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"cR" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"cS" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/blood,/turf/simulated/floor,/area/submap/Rockybase)
+"cT" = (/obj/item/mecha_parts/part/gygax_right_leg,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"cU" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/item/mecha_parts/part/gygax_left_arm,/turf/simulated/floor/tiled/hydro,/area/submap/Rockybase)
+"cV" = (/obj/machinery/vending,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"cW" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"cX" = (/obj/machinery/power/smes/buildable/point_of_interest,/obj/structure/cable/green,/turf/simulated/floor,/area/submap/Rockybase)
+"cY" = (/obj/machinery/light{dir = 8},/obj/structure/closet/secure_closet/medical3,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"cZ" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/mob/living/simple_animal/hostile/malf_drone/lesser,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"da" = (/obj/structure/closet/secure_closet/hydroponics,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"db" = (/obj/machinery/mech_recharger,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"dc" = (/obj/structure/table/standard,/obj/item/stack/material/plasteel,/obj/item/stack/material/glass/reinforced,/obj/item/stack/material/phoron{amount = 25},/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"dd" = (/obj/structure/table/standard,/obj/item/stack/material/glass,/obj/item/stack/material/steel,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"de" = (/obj/structure/table/standard,/obj/item/mecha_parts/part/gygax_head,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"df" = (/obj/structure/closet/toolcloset,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"dg" = (/obj/structure/closet/secure_closet/medical3,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"dh" = (/obj/item/weapon/surgical/surgicaldrill,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"di" = (/obj/structure/loot_pile/maint/technical,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"dj" = (/obj/item/clothing/suit/space/void/medical,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"dk" = (/obj/effect/decal/cleanable/dirt,/mob/living/bot/medbot{faction = "malf_drone"},/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"dl" = (/obj/machinery/vending/hydroseeds,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"dm" = (/obj/structure/closet/crate/secure/hydrosec,/turf/simulated/floor/tiled,/area/submap/Rockybase)
+"dn" = (/obj/effect/decal/remains,/turf/template_noop,/area/template_noop)
(1,1,1) = {"
aaabababababababababababababababababababaaababababababababababababababababababababababababababababaa
@@ -164,26 +178,26 @@ abadadadadadadadadadadadadadadadaeadadadadadadadadadadadadadadadadadadadadadadad
abadadafafafafafadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaeadadadadadadadadadadab
abadadafafafafafafagadadadafafafafafadadadadadadadadahahahahahahadadadadadadadadadafafafagadadadadab
abadafafafafafafafafafafafafafafafafafadadadadadaiahahajahahahahahaiadadadadadafafafafafafafafafadab
-akadafafafafafafafafafafafafafafafafafafafafafahahalahahahahahajalahahafafafafafafafafafafafafafadab
-abadafafamamamamamamamamamamamamamamamamamamamamamamamanaoaoanamamamamamamamamamamamamamafafafafadab
-abadafamamapaqaramasatauavawawataxayaxatazamamaAaBaCaDamaEaEamaFaGaHaIaJaKamaEaLamaMaNamamafafafadab
-abafafamamaOaqaPamawawawawawawawawawawawawamamaQaEaEaRamaSaEamaTaUaEaEaEaVamaEaWamaEaXamamafafafadab
-abafafamamaOaqaYamawaZawawbaawatbbataxataxamambcaEbdbeamaEaEambfbgaEaEaEaEbhbibjamaEbkamamafafafadab
-abafafamamaqaqaqamamamblamamamamamamamamamamamamblamamamaoaoamamamamamblamamamamambmbnamamafafafadab
-abafafamamamblamamboaEaEaEaEaJaEaEaEaEbpaEaJaEaEaEaEaEaEaEaEaEaEaJaEaEaEaEbqbqbramaEbkamamafafafadab
-abafafamamaSaEaEaEaEaEaEbsbqbqaEbtbuaEaEaEaEaEaEaEaEaEaEbqaEaEaEaEaEaEaEaEbsbqbqblaEbkamamafafafadab
-abadafamamambvamambwaEaEbqbqbqaEaEaEbxaEahbubiaEbtaEbqbqbqaEaEaEaEaEbiaEaEaEaEbyamaEbnamamafafafadab
-abadafamambzaqaqamamamamamamamamamamamahahamamamambAamamamamaEamamamamamamamamamamaEbkamamafafafadab
-abadafamambBbBaqambCbDbEbFbGbHbIbJbKbpahbLbMambNbOaEbPbQambRaEaEbSbTbUbqaEaEaEbVamaEbkamamafafafadab
-abadafamambWbvbXamaEaEaEaEaEaEaEaEaEaEaEahbYamaEaEbZcacbambpaEbqbqcccdcecfcgaEchamaEbnamamafafafaeab
-abadafamambBbBciamaEcjaEaEcjaEaEckaEclaEahcmamcnbqcocpcqamcraEbqcsctcucvctcwahaEamaEbkamamafafadadab
-abadafamambWbvaqamcnaEaEcxaEcyaEbqbqaEaEaEczamcAcBcCcBcDamaEaEbqcEcvcvctcfahbLaEamaEcFamamafafadadab
-abadafamambBbBcGamaEcjaEaEahahbqbqbqbqaEaEcHamaEaEcIcpcJamcKaEaEcLctcecececeahbqamaEcMamamafagadadab
-abadafamambWbvaqamaEaEaEaEaEaEbicNaEcNaEaEbOamcOcPcQaEcRamcSaEcTaEaEcUcgcUcVbqcWamcXcYamamafafadadab
-abadafafamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamafafadadadab
+akadafafafafafafafafafafafafafafafafafafafafafalalamalalalalalanamalalafafafafafafafafafafafafafadab
+abadafafaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoapaqaqapaoaoaoaoaoaoaoaoaoaoaoaoaoafafafafadab
+abadafaoaoarasataoauavawaxayayavazaAazavaBaoaoaCaDaEaFaoaGaGaoaHaIaJaKaLaMaoaGaNaoaOaPaoaoafafafadab
+abafafaoaoaQasaRaoayayayayayayayayayayayayaoaoaSaGaGaTaoaUaGaoaVaWaGaGaGaXaoaGaYaoaGaZaoaoafafafadab
+abafafaoaoaQasbaaoaybbayaybcayavbdavazavazaoaobeaGbfbgaoaGaGaobhbiaGaGaGaGbjbkblaoaGbmaoaoafafafadab
+abafafaoaoasasasaoaoaobnaoaoaoaoaoaoaoaoaoaoaoaobnaoaoaoaqaqaoaoaoaoaobnaoaoaoaoaobobpaoaoafafafadab
+abafafaoaoaobnaoaobqbrbrbrbrbsbrbrbrbrbtbrbsbrbrbrbrbrbrbrbrbrbrbsbrbrbrbrbububvaoaGbmaoaoafafafadab
+abafafaoaoaUaGaGaGaGaGaGbwbxbxaGbybzaGaGaGaGaGaGaGaGaGaGbxaGaGaGaGaGaGaGaGbwbxbxbnaGbmaoaoafafafadab
+abadafaoaoaobAaoaobBbCbCbDbDbDbCbCbCbEaGahbFbGbCbHbCbDbDbDbCbCbCbCbCbGbCbCbCbCbIaoaGbpaoaoafafafadab
+abadafaoaobJasasaoaoaoaoaoaoaoaoaoaoaoahahaoaoaoaobKaoaoaoaobLaoaoaoaoaoaoaoaoaoaoaGbmaoaoafafafadab
+abadafaoaobMbMasaobNbObPbQbRbSbTbUbVbWahbXbYaobZcaaGcbccaocdbLaGcecfcgbxaGaGaGchaoaGbmaoaoafafafadab
+abadafaoaocibAcjaoaGaGaGaGaGaGaGaGaGbLbLahckaoaGaGclcmcnaocoaGbxbxcpcqcrcsctaGcuaoaGbpaoaoafafafaeab
+abadafaoaobMbMcvaoaGcwaGaGcwaGaGcxaGcybLahczaocAbxcBcCcDaocEaGbxcFcGcHcIcGcJahaGaoaGbmaoaoafafadadab
+abadafaoaocibAasaocAaGaGcKaGcLaGcMbxcMbLbLcNaocOcPcQcPcRaoaGaGbxcScIcIcGcsahbXaGaoaGcTaoaoafafadadab
+abadafaoaobMbMcUaoaGcwaGaGahahbxbxbxbxaGaGcVaoaGaGcWcCcXaocYaGaGcZcGcrcrcrcrahbxaoaGdaaoaoafagadadab
+abadafaoaocibAasaoaGaGaGaGaGaGbkdbaGdbaGaGcaaodcdddeaGdfaodgaGdhaGaGdictdidjbxdkaodldmaoaoafafadadab
+abadafafaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoafafadadadab
abadafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafadadadab
abadafafafafafafafafafafafafafafafafafafafafafafafafafafafafafadafafafadadadafafafafafafafadadadadab
abadadafafafafafafafafafafafafagadadadafafafafafafadadadadadadadadadadadadadadadadadadadadadadadadab
abadaeadadadadadadafafafafafadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadab
-aaabcZababababababababababababababababababaaababababababababababababababababakababababababcZabakabab
+aaabdnababababababababababababababababababaaababababababababababababababababakababababababdnabakabab
"}
diff --git a/maps/submaps/surface_submaps/wilderness/wilderness.dm b/maps/submaps/surface_submaps/wilderness/wilderness.dm
index 1a18123b05..dc62645edb 100644
--- a/maps/submaps/surface_submaps/wilderness/wilderness.dm
+++ b/maps/submaps/surface_submaps/wilderness/wilderness.dm
@@ -23,6 +23,7 @@
#include "DecoupledEngine.dmm"
#include "DoomP.dmm"
#include "CaveS.dmm"
+#include "Drugden.dmm"
#endif
@@ -178,4 +179,10 @@
name = "CaveS"
desc = "Chitter chitter!"
mappath = 'maps/submaps/surface_submaps/wilderness/CaveS.dmm'
+ cost = 20
+
+/datum/map_template/surface/wilderness/normal/Drugden
+ name = "Drugden"
+ desc = "The remains of ill thought out whims."
+ mappath = 'maps/submaps/surface_submaps/wilderness/Drugden.dmm'
cost = 20
\ No newline at end of file
diff --git a/maps/submaps/surface_submaps/wilderness/wilderness_areas.dm b/maps/submaps/surface_submaps/wilderness/wilderness_areas.dm
index 0c52e7c840..3751fa3be6 100644
--- a/maps/submaps/surface_submaps/wilderness/wilderness_areas.dm
+++ b/maps/submaps/surface_submaps/wilderness/wilderness_areas.dm
@@ -71,3 +71,7 @@
/area/submap/CaveS
name = "CaveS"
+
+/area/submap/Drugd
+ name = "DrugDen"
+
diff --git a/polaris.dme b/polaris.dme
index 980abe6f52..e026cf9978 100644
--- a/polaris.dme
+++ b/polaris.dme
@@ -1046,6 +1046,7 @@
#include "code\game\objects\structures\safe.dm"
#include "code\game\objects\structures\signs.dm"
#include "code\game\objects\structures\simple_doors.dm"
+#include "code\game\objects\structures\snowman.dm"
#include "code\game\objects\structures\tank_dispenser.dm"
#include "code\game\objects\structures\target_stake.dm"
#include "code\game\objects\structures\transit_tubes.dm"
@@ -1848,6 +1849,7 @@
#include "code\modules\mob\living\silicon\robot\subtypes\syndicate.dm"
#include "code\modules\mob\living\simple_animal\corpse.dm"
#include "code\modules\mob\living\simple_animal\simple_animal.dm"
+#include "code\modules\mob\living\simple_animal\simple_hud.dm"
#include "code\modules\mob\living\simple_animal\aliens\alien.dm"
#include "code\modules\mob\living\simple_animal\aliens\creature.dm"
#include "code\modules\mob\living\simple_animal\aliens\drone.dm"