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/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/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 eb29aaff41..c95f0ac49e 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)) //so monkeys can take off their backpacks -- Urist
+ if (ishuman(usr) || issmall(usr) || isanimal(usr)) //so monkeys can take off their backpacks -- Urist
if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech. why?
return
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/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/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/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/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 5faa78f10d..6b02734a7e 100644
--- a/code/modules/mob/living/life.dm
+++ b/code/modules/mob/living/life.dm
@@ -207,7 +207,7 @@
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)
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/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/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 13ee25a50a..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
@@ -71,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
@@ -170,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]
@@ -208,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!
@@ -242,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()
@@ -293,7 +347,6 @@
handle_paralysed()
handle_supernatural()
handle_atmos() //Atmos
- update_icon()
ai_log("Life() - stance=[stance] ai_inactive=[ai_inactive]", 4)
@@ -318,7 +371,7 @@
if(istype(loc,/obj/structure/closet))
var/obj/structure/closet/C = loc
if(C.welded)
- resist()
+ handle_resist()
else
C.open()
@@ -378,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
@@ -394,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)
@@ -498,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)
..()
@@ -591,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)
@@ -641,6 +699,9 @@
tally = 1
tally *= purge
+ if(m_intent == "walk")
+ tally *= 1.5
+
return tally+config.animal_delay
/mob/living/simple_animal/Stat()
@@ -655,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
@@ -738,7 +800,6 @@
/mob/living/simple_animal/handle_fire()
return
-
/mob/living/simple_animal/update_fire()
return
/mob/living/simple_animal/IgniteMob()
@@ -748,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))
@@ -1187,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)
@@ -1200,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)
@@ -1209,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, pick(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
@@ -1491,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_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/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/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/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/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/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/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/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 719cc3fc72..16fc5082af 100644
--- a/polaris.dme
+++ b/polaris.dme
@@ -1849,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"