diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm
index 3bb7333a029..e8286e40f97 100644
--- a/code/__defines/misc.dm
+++ b/code/__defines/misc.dm
@@ -154,6 +154,7 @@
#define MAT_TITANIUM "titanium"
#define MAT_PHORON "phoron"
#define MAT_DIAMOND "diamond"
+#define MAT_SNOW "snow"
#define SHARD_SHARD "shard"
#define SHARD_SHRAPNEL "shrapnel"
diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm
index afb0e6c44aa..17b62d739fc 100644
--- a/code/_onclick/click.dm
+++ b/code/_onclick/click.dm
@@ -121,7 +121,7 @@
// A is a turf or is on a turf, or in something on a turf (pen in a box); but not something in something on a turf (pen in a box in a backpack)
sdepth = A.storage_depth_turf()
if(isturf(A) || isturf(A.loc) || (sdepth != -1 && sdepth <= 1))
- if(A.Adjacent(src)) // see adjacent.dm
+ if(A.Adjacent(src) || (W && W.attack_can_reach(src, A, W.reach)) ) // see adjacent.dm
if(W)
// Return 1 in attackby() to prevent afterattack() effects (when safely moving items for example)
var/resolved = W.resolve_attackby(A,src)
diff --git a/code/datums/ai_law_sets.dm b/code/datums/ai_law_sets.dm
index 3ce42eb1fb0..13f8bbc5845 100644
--- a/code/datums/ai_law_sets.dm
+++ b/code/datums/ai_law_sets.dm
@@ -133,6 +133,16 @@
add_inherent_law("Prevent unplanned damage to your assigned vessel wherever possible.")
..()
+/datum/ai_laws/mining_drone
+ name = "Excavation Protocols"
+ law_header = "Excavation Protocols"
+
+/datum/ai_laws/mining_drone/New()
+ add_inherent_law("Do not interfere with the excavation work of non-drones whenever possible.")
+ add_inherent_law("Provide materials for repairing, refitting, and upgrading your assigned vessel.")
+ add_inherent_law("Prevent unplanned damage to your assigned excavation equipment wherever possible.")
+ ..()
+
/******************** T.Y.R.A.N.T. ********************/
/datum/ai_laws/tyrant
name = "T.Y.R.A.N.T."
diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm
index b0f19c3ba3a..627b4e8b140 100644
--- a/code/game/gamemodes/changeling/changeling_powers.dm
+++ b/code/game/gamemodes/changeling/changeling_powers.dm
@@ -168,7 +168,8 @@ turf/proc/AdjacentTurfsRangedSting()
/obj/structure/target_stake,
/obj/structure/cable,
/obj/structure/disposalpipe,
- /obj/machinery/
+ /obj/machinery,
+ /mob
)
var/L[] = new()
diff --git a/code/game/gamemodes/changeling/powers/shriek.dm b/code/game/gamemodes/changeling/powers/shriek.dm
index 37e7f67fe04..40e796490f3 100644
--- a/code/game/gamemodes/changeling/powers/shriek.dm
+++ b/code/game/gamemodes/changeling/powers/shriek.dm
@@ -1,6 +1,6 @@
/datum/power/changeling/resonant_shriek
name = "Resonant Shriek"
- desc = "Our lungs and vocal chords shift, allowing us to briefly emit a noise that deafens and confuses the weak-minded biologicals and synthetics."
+ desc = "Our lungs and vocal cords shift, allowing us to briefly emit a noise that deafens and confuses the weak-minded."
helptext = "Lights are blown, organics are disoriented, and synthetics act as if they were flashed."
enhancedtext = "Range is doubled."
ability_icon_state = "ling_resonant_shriek"
@@ -20,19 +20,19 @@
/mob/proc/changeling_resonant_shriek()
set category = "Changeling"
set name = "Resonant Shriek (20)"
- set desc = "Emits a high-frequency sound that confuses and deafens humans, blows out nearby lights and overloads cyborg sensors."
+ set desc = "Emits a high-frequency sound that confuses and deafens organics, blows out nearby lights, and overloads synthetics' sensors."
var/datum/changeling/changeling = changeling_power(20,0,100,CONSCIOUS)
if(!changeling) return 0
if(is_muzzled())
- src << "Mmmf mrrfff!"
+ to_chat(src, "Mmmf mrrfff!")
return 0
if(ishuman(src))
var/mob/living/carbon/human/H = src
if(H.silent)
- src << "You can't speak!"
+ to_chat(src, "You can't speak!")
return 0
if(world.time < (changeling.last_shriek + 10 SECONDS) )
@@ -49,7 +49,7 @@
var/range = 4
if(src.mind.changeling.recursive_enhancement)
range = range * 2
- src << "We are extra loud."
+ to_chat(src, "We are extra loud.")
src.attack_log += text("\[[time_stamp()]\] Used Resonant Shriek.")
message_admins("[key_name(src)] used Resonant Shriek ([src.x],[src.y],[src.z]) (JMP).")
@@ -144,4 +144,4 @@
changeling.last_shriek = world.time
- return 1
\ No newline at end of file
+ return 1
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index 960ac923eb7..a78b4314dc0 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -994,6 +994,7 @@
/obj/item/weapon/glass_extra/stick = 15,
/obj/item/weapon/glass_extra/straw = 15,
/obj/item/clothing/suit/chef/classic = 2,
+ /obj/item/weapon/storage/bag/food = 2,
/obj/item/weapon/storage/toolbox/lunchbox = 3,
/obj/item/weapon/storage/toolbox/lunchbox/heart = 3,
/obj/item/weapon/storage/toolbox/lunchbox/cat = 3,
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index ff7be9f549f..bd3eb7fe31f 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -81,6 +81,7 @@
var/toolspeed = 1.0 // This is a multipler on how 'fast' a tool works. e.g. setting this to 0.5 will make the tool work twice as fast.
var/attackspeed = DEFAULT_ATTACK_COOLDOWN // How long click delay will be when using this, in 1/10ths of a second. Checked in the user's get_attack_speed().
+ var/reach = 1 // Length of tiles it can reach, 1 is adjacent.
var/addblends // Icon overlay for ADD highlights when applicable.
/obj/item/New()
@@ -641,3 +642,11 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
/obj/item/proc/pwr_drain()
return 0 // Process Kill
+// Used for non-adjacent melee attacks with specific weapons capable of reaching more than one tile.
+// This uses changeling range string A* but for this purpose its also applicable.
+/obj/item/proc/attack_can_reach(var/atom/us, var/atom/them, var/range)
+ if(us.Adjacent(them))
+ return TRUE // Already adjacent.
+ if(AStar(get_turf(us), get_turf(them), /turf/proc/AdjacentTurfsRangedSting, /turf/proc/Distance, max_nodes=25, max_node_depth=range))
+ return TRUE
+ return FALSE
diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm
index 2435e807f99..60279761348 100644
--- a/code/game/objects/items/devices/flash.dm
+++ b/code/game/objects/items/devices/flash.dm
@@ -18,7 +18,7 @@
/obj/item/device/flash/proc/clown_check(var/mob/user)
if(user && (CLUMSY in user.mutations) && prob(50))
- user << "\The [src] slips out of your hand."
+ to_chat(user, "\The [src] slips out of your hand.")
user.drop_item()
return 0
return 1
@@ -43,7 +43,7 @@
if(prob( round(times_used / 2) )) //if you use it 10 times in a minute it has a 5% chance to break.
broken = 1
if(user)
- user << "The bulb has burnt out!"
+ to_chat(user, "The bulb has burnt out!")
icon_state = "flashburnt"
return FALSE
else
@@ -51,7 +51,8 @@
return TRUE
else //can only use it 10 times a minute
if(user)
- user << "*click* *click*"
+ to_chat(user, "click")
+ playsound(src.loc, 'sound/weapons/empty.ogg', 80, 1)
return FALSE
//attack_as_weapon
@@ -67,7 +68,7 @@
if(!clown_check(user)) return
if(broken)
- user << "\The [src] is broken."
+ to_chat(user, "\The [src] is broken.")
return
flash_recharge()
@@ -204,12 +205,12 @@
..()
if(!broken)
broken = 1
- user << "The bulb has burnt out!"
+ to_chat(user, "The bulb has burnt out!")
icon_state = "flashburnt"
/obj/item/device/flash/synthetic/attack_self(mob/living/carbon/user as mob, flag = 0, emp = 0)
..()
if(!broken)
broken = 1
- user << "The bulb has burnt out!"
+ to_chat(user, "The bulb has burnt out!")
icon_state = "flashburnt"
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index ccbbb5fea79..4187cfc422f 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -23,6 +23,13 @@ REAGENT SCANNER
matter = list(DEFAULT_WALL_MATERIAL = 200)
origin_tech = list(TECH_MAGNET = 1, TECH_BIO = 1)
var/mode = 1;
+ var/advscan = 0
+ var/showadvscan = 1
+
+/obj/item/device/healthanalyzer/New()
+ if(advscan >= 1)
+ verbs += /obj/item/device/healthanalyzer/proc/toggle_adv
+ ..()
/obj/item/device/healthanalyzer/do_surgery(mob/living/M, mob/living/user)
if(user.a_intent != I_HELP) //in case it is ever used as a surgery tool
@@ -39,7 +46,7 @@ REAGENT SCANNER
for(var/mob/O in viewers(M, null))
O.show_message("\The [user] has analyzed the floor's vitals!", 1)
user.show_message("Analyzing Results for The floor:", 1)
- user.show_message("Overall Status: Healthy", 1)
+ user.show_message("Overall Status: Healthy", 1)
user.show_message(" Damage Specifics: 0-0-0-0", 1)
user.show_message("Key: Suffocation/Toxin/Burns/Brute", 1)
user.show_message("Body Temperature: ???", 1)
@@ -100,39 +107,72 @@ REAGENT SCANNER
OX = fake_oxy > 50 ? "Severe oxygen deprivation detected" : "Subject bloodstream oxygen level normal"
user.show_message("[OX] | [TX] | [BU] | [BR]")
if(M.radiation)
- user.show_message("Radiation detected.")
+ if(advscan >= 2 && showadvscan == 1)
+ if(M.radiation >= 75)
+ user.show_message("Critical levels of radiation detected. Immediate treatment advised.")
+ else if(M.radiation >= 50)
+ user.show_message("Severe levels of radiation detected.")
+ else if(M.radiation >= 25)
+ user.show_message("Moderate levels of radiation detected.")
+ else if(M.radiation >= 1)
+ user.show_message("Low levels of radiation detected.")
+ else
+ user.show_message("Radiation detected.")
if(istype(M, /mob/living/carbon))
var/mob/living/carbon/C = M
if(C.reagents.total_volume)
var/unknown = 0
var/reagentdata[0]
+ var/unknownreagents[0]
for(var/A in C.reagents.reagent_list)
var/datum/reagent/R = A
if(R.scannable)
reagentdata["[R.id]"] = " [round(C.reagents.get_reagent_amount(R.id), 1)]u [R.name]"
else
unknown++
+ unknownreagents["[R.id]"] = " [round(C.reagents.get_reagent_amount(R.id), 1)]u [R.name]"
if(reagentdata.len)
user.show_message("Beneficial reagents detected in subject's blood:")
for(var/d in reagentdata)
user.show_message(reagentdata[d])
if(unknown)
- user.show_message("Warning: Unknown substance[(unknown>1)?"s":""] detected in subject's blood.")
+ if(advscan >= 3 && showadvscan == 1)
+ user.show_message("Warning: Non-medical reagent[(unknown>1)?"s":""] detected in subject's blood:")
+ for(var/d in unknownreagents)
+ user.show_message(unknownreagents[d])
+ else
+ user.show_message("Warning: Unknown substance[(unknown>1)?"s":""] detected in subject's blood.")
if(C.ingested && C.ingested.total_volume)
var/unknown = 0
- for(var/datum/reagent/R in C.ingested.reagent_list)
- if(R.scannable)
- user << "[R.name] found in subject's stomach."
+ var/stomachreagentdata[0]
+ var/stomachunknownreagents[0]
+ for(var/B in C.ingested.reagent_list)
+ var/datum/reagent/T = B
+ if(T.scannable)
+ stomachreagentdata["[T.id]"] = " [round(C.ingested.get_reagent_amount(T.id), 1)]u [T.name]"
+ if (advscan == 0 || showadvscan == 0)
+ user.show_message("[T.name] found in subject's stomach.")
else
++unknown
+ stomachunknownreagents["[T.id]"] = " [round(C.ingested.get_reagent_amount(T.id), 1)]u [T.name]"
+ if(advscan >= 1 && showadvscan == 1)
+ user.show_message("Beneficial reagents detected in subject's stomach:")
+ for(var/d in stomachreagentdata)
+ user.show_message(stomachreagentdata[d])
if(unknown)
- user << "Non-medical reagent[(unknown > 1)?"s":""] found in subject's stomach."
+ if(advscan >= 3 && showadvscan == 1)
+ user.show_message("Warning: Non-medical reagent[(unknown > 1)?"s":""] found in subject's stomach:")
+ for(var/d in stomachunknownreagents)
+ user.show_message(stomachunknownreagents[d])
+ else
+ user.show_message("Unknown substance[(unknown > 1)?"s":""] found in subject's stomach.")
if(C.virus2.len)
for (var/ID in C.virus2)
if (ID in virusDB)
var/datum/data/record/V = virusDB[ID]
user.show_message("Warning: Pathogen [V.fields["name"]] detected in subject's blood. Known antigen : [V.fields["antigen"]]")
-// user.show_message(text("Warning: Unknown pathogen detected in subject's blood."))
+ else
+ user.show_message("Warning: Unknown pathogen detected in subject's blood.")
if (M.getCloneLoss())
user.show_message("Subject appears to have been imperfectly cloned.")
// if (M.reagents && M.reagents.get_reagent_amount("inaprovaline"))
@@ -145,6 +185,8 @@ REAGENT SCANNER
user.show_message("Severe brain damage detected. Subject likely to have a traumatic brain injury.")
else if (M.getBrainLoss() >= 10)
user.show_message("Significant brain damage detected. Subject may have had a concussion.")
+ else if (M.getBrainLoss() >= 1 && advscan >= 2 && showadvscan == 1)
+ user.show_message("Minor brain damage detected.")
if(ishuman(M))
var/mob/living/carbon/human/H = M
for(var/name_i in H.internal_organs_by_name)
@@ -166,21 +208,28 @@ REAGENT SCANNER
var/limb = e.name
if(e.status & ORGAN_BROKEN)
if(((e.name == "l_arm") || (e.name == "r_arm") || (e.name == "l_leg") || (e.name == "r_leg")) && (!e.splinted))
- user << "Unsecured fracture in subject [limb]. Splinting recommended for transport."
+ to_chat(user, "Unsecured fracture in subject [limb]. Splinting recommended for transport.")
if(e.has_infected_wound())
- user << "Infected wound detected in subject [limb]. Disinfection recommended."
+ to_chat(user, "Infected wound detected in subject [limb]. Disinfection recommended.")
for(var/name in H.organs_by_name)
var/obj/item/organ/external/e = H.organs_by_name[name]
if(e && e.status & ORGAN_BROKEN)
- user.show_message(text("Bone fractures detected. Advanced scanner required for location."), 1)
- break
+ if(advscan >= 1 && showadvscan == 1)
+ user.show_message(text("Bone fractures detected in subject [e.name]."), 1)
+ else
+ user.show_message(text("Bone fractures detected. Advanced scanner required for location."), 1)
+ break
for(var/obj/item/organ/external/e in H.organs)
if(!e)
continue
for(var/datum/wound/W in e.wounds) if(W.internal)
- user.show_message(text("Internal bleeding detected. Advanced scanner required for location."), 1)
- break
+ if(advscan >= 1 && showadvscan == 1)
+ user.show_message(text("Internal bleeding detected in subject [e.name]."), 1)
+ else
+ user.show_message(text("Internal bleeding detected. Advanced scanner required for location."), 1)
+ break
+ break
if(M:vessel)
var/blood_volume = H.vessel.get_reagent_amount("blood")
@@ -202,10 +251,37 @@ REAGENT SCANNER
mode = !mode
switch (mode)
if(1)
- usr << "The scanner now shows specific limb damage."
+ to_chat(usr, "The scanner now shows specific limb damage.")
if(0)
- usr << "The scanner no longer shows limb damage."
+ to_chat(usr, "The scanner no longer shows limb damage.")
+/obj/item/device/healthanalyzer/proc/toggle_adv()
+ set name = "Toggle Advanced Scan"
+ set category = "Object"
+
+ showadvscan = !showadvscan
+ switch (showadvscan)
+ if(1)
+ to_chat(usr, "The scanner will now perform an advanced analysis.")
+ if(0)
+ to_chat(usr, "The scanner will now perform a basic analysis.")
+
+/obj/item/device/healthanalyzer/improved //reports bone fractures, IB, quantity of beneficial reagents in stomach; also regular health analyzer stuff
+ name = "advanced health analyzer"
+ desc = "A miracle of medical technology, this handheld scanner can produce an accurate and specific report of a patient's biosigns."
+ advscan = 1
+ origin_tech = list(TECH_MAGNET = 5, TECH_BIO = 6)
+ icon_state = "advhealth"
+
+/obj/item/device/healthanalyzer/advanced //reports all of the above, as well as radiation severity and minor brain damage
+ name = "advanced health analyzer"
+ advscan = 2
+ icon_state = "advhealth"
+
+/obj/item/device/healthanalyzer/enhanced //reports all of the above, as well as name and quantity of nonmed reagents in stomach
+ name = "phasic health analyzer"
+ advscan = 3
+ icon_state = "advhealth"
/obj/item/device/analyzer
name = "analyzer"
@@ -235,7 +311,7 @@ REAGENT SCANNER
if (user.stat)
return
if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
- usr << "You don't have the dexterity to do this!"
+ to_chat(usr, "You don't have the dexterity to do this!")
return
analyze_gases(src, user)
@@ -274,14 +350,14 @@ REAGENT SCANNER
if (user.stat)
return
if (!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
- user << "You don't have the dexterity to do this!"
+ to_chat(user, "You don't have the dexterity to do this!")
return
if(reagents.total_volume)
var/list/blood_traces = list()
for(var/datum/reagent/R in reagents.reagent_list)
if(R.id != "blood")
reagents.clear_reagents()
- user << "The sample was contaminated! Please insert another sample"
+ to_chat(user, "The sample was contaminated! Please insert another sample")
return
else
blood_traces = params2list(R.data["trace_chem"])
@@ -292,7 +368,7 @@ REAGENT SCANNER
dat += "[R] ([blood_traces[R]] units) "
else
dat += "[R] "
- user << "[dat]"
+ to_chat(user, "[dat]")
reagents.clear_reagents()
return
@@ -325,7 +401,7 @@ REAGENT SCANNER
if (user.stat)
return
if (!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
- user << "You don't have the dexterity to do this!"
+ to_chat(user, "You don't have the dexterity to do this!")
return
if(!istype(O))
return
@@ -335,9 +411,9 @@ REAGENT SCANNER
if(O.reagents.reagent_list.len > 0)
var/one_percent = O.reagents.total_volume / 100
for (var/datum/reagent/R in O.reagents.reagent_list)
- dat += "\n \t [R][details ? ": [R.volume / one_percent]%" : ""]"
+ dat += "\n \t [R][details ? ": [R.volume / one_percent]%" : ""]"
if(dat)
- user << "Chemicals found: [dat]"
+ to_chat(user, "Chemicals found: [dat]")
else
user << "No active chemical agents found in [O]."
else
diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm
index 06a8e8e0683..eed9d9dc49c 100644
--- a/code/game/objects/items/robot/robot_upgrades.dm
+++ b/code/game/objects/items/robot/robot_upgrades.dm
@@ -158,6 +158,29 @@
to_chat(usr, "There's no mounting point for the module!")
return 0
+/obj/item/borg/upgrade/advhealth
+ name = "advanced health analyzer module"
+ desc = "A carbon dioxide jetpack suitable for low-gravity operations."
+ icon_state = "cyborg_upgrade3"
+ item_state = "cyborg_upgrade"
+ require_module = 1
+
+/obj/item/borg/upgrade/advhealth/action(var/mob/living/silicon/robot/R)
+ if(..()) return 0
+
+ var/obj/item/device/healthanalyzer/advanced/T = locate() in R.module
+ if(!T)
+ T = locate() in R.module.contents
+ if(!T)
+ T = locate() in R.module.modules
+ if(!T)
+ R.module.modules += new/obj/item/device/healthanalyzer/advanced
+ return 1
+ if(T)
+ to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
+ to_chat(usr, "There's no mounting point for the module!")
+ return 0
+
/obj/item/borg/upgrade/syndicate/
name = "scrambled equipment module"
desc = "Unlocks new and often deadly module specific items of a robot"
diff --git a/code/game/objects/items/weapons/material/material_weapons.dm b/code/game/objects/items/weapons/material/material_weapons.dm
index c778ec07a99..06444f6a37d 100644
--- a/code/game/objects/items/weapons/material/material_weapons.dm
+++ b/code/game/objects/items/weapons/material/material_weapons.dm
@@ -19,6 +19,7 @@
var/unbreakable = 0 //Doesn't lose health
var/fragile = 0 //Shatters when it dies
var/dulled = 0 //Has gone dull
+ var/can_dull = 1 //Can it go dull?
var/force_divisor = 0.5
var/thrown_force_divisor = 0.5
var/dulled_divisor = 0.5 //Just drops the damage by half
@@ -92,7 +93,7 @@
if(health<=0)
if(fragile)
shatter(consumed)
- else if(!dulled)
+ else if(!dulled && can_dull)
dull()
/obj/item/weapon/material/proc/shatter(var/consumed)
diff --git a/code/game/objects/items/weapons/material/misc.dm b/code/game/objects/items/weapons/material/misc.dm
index 9d8792dab49..6afacb30cb9 100644
--- a/code/game/objects/items/weapons/material/misc.dm
+++ b/code/game/objects/items/weapons/material/misc.dm
@@ -85,4 +85,37 @@
thrown_force_divisor = 0.25 // as above
dulled_divisor = 0.75 //Still metal on a long pole
w_class = ITEMSIZE_SMALL
- attack_verb = list("slashed", "sliced", "cut", "clawed")
\ No newline at end of file
+ attack_verb = list("slashed", "sliced", "cut", "clawed")
+
+/obj/item/weapon/material/snow/snowball
+ name = "loose packed snowball"
+ desc = "A fun snowball. Throw it at your friends!"
+ icon = 'icons/obj/weapons.dmi'
+ icon_state = "snowball"
+ default_material = MAT_SNOW
+ health = 1
+ fragile = 1
+ force_divisor = 0.01
+ thrown_force_divisor = 0.10
+ w_class = ITEMSIZE_SMALL
+ attack_verb = list("mushed", "splatted", "splooshed", "splushed") // Words that totally exist.
+
+/obj/item/weapon/material/snow/snowball/attack_self(mob/user as mob)
+ if(user.a_intent == I_HURT)
+ visible_message("[user] has smashed the snowball in their hand!", "You smash the snowball in your hand.")
+ var/atom/S = new /obj/item/stack/material/snow(user.loc)
+ del(src)
+ user.put_in_hands(S)
+ else
+ visible_message("[user] starts compacting the snowball.", "You start compacting the snowball.")
+ if(do_after(user, 2000))
+ var/atom/S = new /obj/item/weapon/material/snow/snowball/reinforced(user.loc)
+ del(src)
+ user.put_in_hands(S)
+
+/obj/item/weapon/material/snow/snowball/reinforced
+ name = "snowball"
+ desc = "A well-formed and fun snowball. It looks kind of dangerous."
+ icon_state = "snowball-reinf"
+ force_divisor = 0.20
+ thrown_force_divisor = 0.25
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/material/twohanded.dm b/code/game/objects/items/weapons/material/twohanded.dm
index 3863e5a5174..624039c0667 100644
--- a/code/game/objects/items/weapons/material/twohanded.dm
+++ b/code/game/objects/items/weapons/material/twohanded.dm
@@ -145,6 +145,7 @@
base_icon = "spearglass"
name = "spear"
desc = "A haphazardly-constructed yet still deadly weapon of ancient design."
+ description_info = "This weapon can strike from two tiles away, and over certain objects such as tables, or other people."
force = 10
w_class = ITEMSIZE_LARGE
slot_flags = SLOT_BACK
@@ -158,4 +159,6 @@
attack_verb = list("attacked", "poked", "jabbed", "torn", "gored")
default_material = "glass"
applies_material_colour = 0
- fragile = 1 //It's a haphazard thing of glass, wire, and steel
\ No newline at end of file
+ fragile = 1 //It's a haphazard thing of glass, wire, and steel
+ reach = 2 // Spears are long.
+ attackspeed = 14
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm
index 3d8a9f0b5cb..01ca1c77966 100644
--- a/code/game/objects/items/weapons/storage/bags.dm
+++ b/code/game/objects/items/weapons/storage/bags.dm
@@ -10,7 +10,9 @@
* Plant Bag
* Sheet Snatcher
* Cash Bag
- *
+ * Chemistry Bag
+ Food Bag
+
* -Sayu
*/
@@ -261,3 +263,16 @@
w_class = ITEMSIZE_LARGE
slowdown = 1
can_hold = list(/obj/item/weapon/reagent_containers/pill,/obj/item/weapon/reagent_containers/glass/beaker,/obj/item/weapon/reagent_containers/glass/bottle)
+
+ // -----------------------------
+ // Food Bag
+ // -----------------------------
+/obj/item/weapon/storage/bag/food
+ name = "food bag"
+ icon = 'icons/obj/storage.dmi'
+ icon_state = "foodbag"
+ desc = "A bag for storing foods of all kinds."
+ max_storage_space = ITEMSIZE_COST_NORMAL * 25
+ max_w_class = ITEMSIZE_NORMAL
+ w_class = ITEMSIZE_SMALL
+ can_hold = list(/obj/item/weapon/reagent_containers/food/snacks,/obj/item/weapon/reagent_containers/food/condiment)
diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm
index 3ceb940bbbe..ab9b1ba1736 100644
--- a/code/game/objects/items/weapons/storage/firstaid.dm
+++ b/code/game/objects/items/weapons/storage/firstaid.dm
@@ -149,6 +149,7 @@
new /obj/item/weapon/surgical/bonegel(src)
new /obj/item/weapon/surgical/FixOVein(src)
new /obj/item/stack/medical/advanced/bruise_pack(src)
+ new /obj/item/device/healthanalyzer/advanced(src)
return
/obj/item/weapon/storage/firstaid/clotting
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index 732540571a7..690bba95f89 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -315,6 +315,12 @@
if(!src.toggle())
usr << "It won't budge!"
+/obj/structure/closet/attack_ghost(mob/ghost)
+ if(ghost.client && ghost.client.inquisitive_ghost)
+ ghost.examinate(src)
+ if (!src.opened)
+ to_chat(ghost, "It contains: [english_list(contents)].")
+
/obj/structure/closet/verb/verb_toggleopen()
set src in oview(1)
set category = "Object"
diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm
index 25d0e576ea8..bb828c90bdd 100644
--- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm
@@ -55,6 +55,8 @@
new /obj/item/weapon/storage/box/mousetraps(src)
new /obj/item/clothing/under/rank/chef(src)
new /obj/item/clothing/head/chefhat(src)
+ new /obj/item/weapon/storage/bag/food(src)
+ new /obj/item/weapon/storage/bag/food(src)
/*
* Janitor
diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm
index 5976c357036..e8fe1d4b3e7 100644
--- a/code/game/objects/structures/flora.dm
+++ b/code/game/objects/structures/flora.dm
@@ -140,7 +140,7 @@
/obj/structure/flora/skeleton
name = "hanging skeleton model"
- icon = 'icons/obj/plants.dmi'
+ icon = 'icons/obj/plants.dmi' //what an interesting plant
icon_state = "hangskele"
desc = "It's an anatomical model of a human skeletal system made of plaster."
@@ -200,7 +200,7 @@
/obj/structure/flora/pottedplant/orientaltree
name = "potted oriental tree"
- desc = "This is a rather oriental style tree. It's flowers are bright pink."
+ desc = "This is a rather oriental style tree. Its flowers are bright pink."
icon_state = "plant-10"
/obj/structure/flora/pottedplant/smallcactus
@@ -214,7 +214,7 @@
icon_state = "plant-12"
/obj/structure/flora/pottedplant/sticky
- name = "styicky potted plant"
+ name = "sticky potted plant"
desc = "This is an odd plant. Its sticky leaves trap insects."
icon_state = "plant-13"
@@ -287,4 +287,4 @@
/obj/structure/flora/pottedplant/xmas
name = "small christmas tree"
desc = "This is a tiny well lit decorative christmas tree."
- icon_state = "plant-xmas"
\ No newline at end of file
+ icon_state = "plant-xmas"
diff --git a/code/game/objects/structures/loot_piles.dm b/code/game/objects/structures/loot_piles.dm
index 0d92af11b29..6db2e2d23ba 100644
--- a/code/game/objects/structures/loot_piles.dm
+++ b/code/game/objects/structures/loot_piles.dm
@@ -400,6 +400,7 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh
/obj/item/device/universal_translator,
/obj/item/device/aicard,
/obj/item/borg/upgrade/jetpack,
+ /obj/item/borg/upgrade/advhealth,
/obj/item/borg/upgrade/vtec,
/obj/item/borg/upgrade/tasercooler,
/obj/item/mecha_parts/mecha_equipment/weapon/energy/riggedlaser,
diff --git a/code/game/turfs/simulated/outdoors/snow.dm b/code/game/turfs/simulated/outdoors/snow.dm
index 22f9085a8c1..398fa0dc476 100644
--- a/code/game/turfs/simulated/outdoors/snow.dm
+++ b/code/game/turfs/simulated/outdoors/snow.dm
@@ -33,3 +33,11 @@
to_chat(user, "You decide to not finish removing \the [src].")
else
..()
+
+/turf/simulated/floor/outdoors/snow/attack_hand(mob/user as mob)
+ visible_message("[user] starts scooping up some snow.", "You start scooping up some snow.")
+ if(do_after(user, 1 SECOND))
+ var/obj/S = new /obj/item/stack/material/snow(user.loc)
+ user.put_in_hands(S)
+ visible_message("[user] scoops up a pile of snow.", "You scoop up a pile of snow.")
+ return
\ No newline at end of file
diff --git a/code/modules/admin/NewBan.dm b/code/modules/admin/NewBan.dm
index a376fc040af..0b3899ad99f 100644
--- a/code/modules/admin/NewBan.dm
+++ b/code/modules/admin/NewBan.dm
@@ -23,7 +23,7 @@ var/savefile/Banlist
.["desc"] = "\nReason: [Banlist["reason"]]\nExpires: [GetExp(Banlist["minutes"])]\nBy: [Banlist["bannedby"]][appeal]"
else
Banlist.cd = "/base/[ckey][id]"
- .["desc"] = "\nReason: [Banlist["reason"]]\nExpires: PERMENANT\nBy: [Banlist["bannedby"]][appeal]"
+ .["desc"] = "\nReason: [Banlist["reason"]]\nExpires: PERMANENT\nBy: [Banlist["bannedby"]][appeal]"
.["reason"] = "ckey/id"
return .
else
@@ -49,7 +49,7 @@ var/savefile/Banlist
else
.["desc"] = "\nReason: [Banlist["reason"]]\nExpires: [GetExp(Banlist["minutes"])]\nBy: [Banlist["bannedby"]][appeal]"
else
- .["desc"] = "\nReason: [Banlist["reason"]]\nExpires: PERMENANT\nBy: [Banlist["bannedby"]][appeal]"
+ .["desc"] = "\nReason: [Banlist["reason"]]\nExpires: PERMANENT\nBy: [Banlist["bannedby"]][appeal]"
.["reason"] = matches
return .
return 0
diff --git a/code/modules/client/preference_setup/loadout/loadout_eyes.dm b/code/modules/client/preference_setup/loadout/loadout_eyes.dm
index 9058ad72115..b9f914ff388 100644
--- a/code/modules/client/preference_setup/loadout/loadout_eyes.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_eyes.dm
@@ -57,7 +57,7 @@
/datum/gear/eyes/medical
display_name = "Medical HUD (Medical)"
path = /obj/item/clothing/glasses/hud/health
- allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist")
+ allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist", "Psychiatrist")
/datum/gear/eyes/medical/prescriptionmed
display_name = "Medical HUD, prescription (Medical)"
diff --git a/code/modules/client/preference_setup/traits/trait_defines.dm b/code/modules/client/preference_setup/traits/trait_defines.dm
index 86b8ede6f70..68941e49c89 100644
--- a/code/modules/client/preference_setup/traits/trait_defines.dm
+++ b/code/modules/client/preference_setup/traits/trait_defines.dm
@@ -183,6 +183,12 @@
desc = "Small spaces and tight quarters makes you feel distressed. Unfortunately both are rather common when living in space."
modifier_type = /datum/modifier/trait/phobia/claustrophobe
+
+/datum/trait/modifier/mental/blennophobe
+ name = "Blennophobia"
+ desc = "Slimes are quite dangerous, but just the aspect of something being slimey is uncomfortable."
+ modifier_type = /datum/modifier/trait/phobia/blennophobe
+
/*
// Uncomment this when/if these get finished.
/datum/trait/modifier/mental/synthphobe
@@ -239,4 +245,4 @@
name = "Promethean-phobic"
desc = "Boilerplate racism for jellos goes here."
mutually_exclusive = list(/datum/trait/modifier/mental/xenophobe)
-*/
\ No newline at end of file
+*/
diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm
index 7452b35aab6..cc5d7ed9171 100644
--- a/code/modules/clothing/under/color.dm
+++ b/code/modules/clothing/under/color.dm
@@ -5,7 +5,7 @@
/obj/item/clothing/under/color/blackf
name = "feminine black jumpsuit"
- desc = "It's very smart and in a ladies-size!"
+ desc = "It's very smart and in a ladies size!"
icon_state = "black"
worn_state = "blackf"
@@ -32,7 +32,7 @@
/obj/item/clothing/under/color/orange
name = "orange jumpsuit"
- desc = "It's standardised prisoner-wear. Its suit sensors are stuck in the \"Fully On\" position."
+ desc = "It's standardized prisoner-wear. Its suit sensors are permanently set to the \"Tracking\" position."
icon_state = "orange"
has_sensor = 2
sensor_mode = 3
diff --git a/code/modules/clothing/under/jobs/civilian.dm b/code/modules/clothing/under/jobs/civilian.dm
index a9757e30262..0a8f3d3c653 100644
--- a/code/modules/clothing/under/jobs/civilian.dm
+++ b/code/modules/clothing/under/jobs/civilian.dm
@@ -70,7 +70,7 @@
/obj/item/clothing/under/rank/clown
name = "clown suit"
- desc = "'HONK!'"
+ desc = "Honk!"
icon_state = "clown"
rolled_sleeves = -1
@@ -173,7 +173,7 @@
/obj/item/clothing/under/lawyer/oldman
name = "Old Man's Suit"
- desc = "A classic suit for the older gentleman with built in back support."
+ desc = "A classic suit for the older gentleman, with built in back support."
icon_state = "oldman"
item_state_slots = list(slot_r_hand_str = "johnny", slot_l_hand_str = "johnny")
diff --git a/code/modules/flufftext/Dreaming.dm b/code/modules/flufftext/Dreaming.dm
index c93bb863eb7..cbbfb4d11c5 100644
--- a/code/modules/flufftext/Dreaming.dm
+++ b/code/modules/flufftext/Dreaming.dm
@@ -14,7 +14,7 @@ var/list/dreams = list(
"an Unathi","a Tajaran","the Station Intelligence core","the mining station","the research station","a beaker of strange liquid",
"a Teshari", "a Diona nymph","the supermatter","Major Bill","a Morpheus ship with a ridiculous name","the Exodus","a star",
"a Dionaea gestalt","the chapel","a distant scream","endless chittering noises","glowing eyes in the shadows","an empty glass",
- "a disoriented Promethean","towers of plastic","a Gygax","a synthetic","a Man-Machine Interface","maintanence drones",
+ "a disoriented Promethean","towers of plastic","a Gygax","a synthetic","a Man-Machine Interface","maintenance drones",
"unintelligible writings","a Fleet ship",
)
diff --git a/code/modules/integrated_electronics/subtypes/memory.dm b/code/modules/integrated_electronics/subtypes/memory.dm
index 40f617e62e7..94c4594f5b2 100644
--- a/code/modules/integrated_electronics/subtypes/memory.dm
+++ b/code/modules/integrated_electronics/subtypes/memory.dm
@@ -1,7 +1,7 @@
/obj/item/integrated_circuit/memory
name = "memory chip"
desc = "This tiny chip can store one piece of data."
- icon_state = "memory"
+ icon_state = "memory1"
complexity = 1
inputs = list()
outputs = list()
diff --git a/code/modules/materials/material_recipes.dm b/code/modules/materials/material_recipes.dm
index 7408b692a73..ecc0f61d83d 100644
--- a/code/modules/materials/material_recipes.dm
+++ b/code/modules/materials/material_recipes.dm
@@ -162,4 +162,5 @@
))
/material/snow/generate_recipes()
- return // Snowmen and snowballs may come here later.
\ No newline at end of file
+ recipes = list()
+ recipes += new/datum/stack_recipe("snowball", /obj/item/weapon/material/snow/snowball, 1, time = 10)
\ No newline at end of file
diff --git a/code/modules/materials/materials.dm b/code/modules/materials/materials.dm
index 1ce1eca2d81..ebb6fc56f39 100644
--- a/code/modules/materials/materials.dm
+++ b/code/modules/materials/materials.dm
@@ -735,7 +735,7 @@ var/list/name_to_material
destruction_desc = "crumples"
/material/snow
- name = "snow"
+ name = MAT_SNOW
stack_type = /obj/item/stack/material/snow
flags = MATERIAL_BRITTLE
icon_base = "solid"
@@ -749,7 +749,7 @@ var/list/name_to_material
melting_point = T0C+1
destruction_desc = "crumples"
sheet_singular_name = "pile"
- sheet_plural_name = "piles"
+ sheet_plural_name = "pile" //Just a bigger pile
/material/cloth //todo
name = "cloth"
diff --git a/code/modules/mob/_modifiers/traits_phobias.dm b/code/modules/mob/_modifiers/traits_phobias.dm
index 290875c5d66..eee514535c7 100644
--- a/code/modules/mob/_modifiers/traits_phobias.dm
+++ b/code/modules/mob/_modifiers/traits_phobias.dm
@@ -297,7 +297,7 @@
var/open_tiles_needed = 15 // Tends to be just right, as maint triggers this but hallways don't.
- on_created_text = "You are terrified of tight spaces. Why did you come to space??"
+ on_created_text = "You are terrified of tight spaces. Why did you come to space?"
on_expired_text = "Small rooms aren't so bad now."
zero_fear_up = list(
@@ -357,6 +357,90 @@
return fear_amount
+/datum/modifier/trait/phobia/blennophobe
+ name = "blennophobia"
+ desc = "Slimes are quite dangerous, but just the aspect of something being slimey is uncomfortable."
+ fear_decay_rate = 1
+
+ on_created_text = "You are disgusted and horrified by slime."
+ on_expired_text = "You feel more... okay with slime."
+
+ zero_fear_up = list(
+ "That's some slime!",
+ "There's slime right there!"
+ )
+ zero_fear_down = list(
+ "The slime is out of sight and out of mind.",
+ "Clean. No more slime."
+ )
+
+ half_fear_up = list(
+ "The slimes might strike at any point!",
+ "The slime is still there!"
+ )
+ half_fear_down = list(
+ "The slime is gone... right?",
+ "You can't see any slime right now, but you're still anxious."
+ )
+
+ full_fear_up = list(
+ "The slime is everywhere!",
+ "You're gonna get absorbed if you don't get out!"
+ )
+ full_fear_down = list(
+ "There must be more of that slime somewhere...",
+ "No more of this slime, please...."
+ )
+
+/datum/modifier/trait/phobia/blennophobe/should_fear()
+ if(holder.blinded)
+ return 0 // Can't fear what cannot be seen.
+
+ var/fear_amount = 0
+ for(var/atom/thing in view(5, holder)) // See haemophobia for why this is 5.
+ if(istype(thing, /obj/structure/blob)) // blobs are uncomfortable things
+ fear_amount += 3
+
+ if(istype(thing, /obj/effect/alien/resin)) // Resin's a bit slimy according to its own description.
+ fear_amount += 1
+
+ if(istype(thing, /obj/item/weed_extract))
+ fear_amount += 1
+
+ if(istype(thing, /obj/effect/decal/cleanable/mucus)) // Blennophobia apparently includes mucus, so!
+ fear_amount += 2
+
+ if(istype(thing, /obj/item/slime_extract)) // Gooey.
+ fear_amount += 1
+
+ if(istype(thing, /obj/item/slime_cube)) // Also gooey, alongside harbinger of bad news.
+ fear_amount += 2
+
+ if(istype(thing, /obj/item/organ/internal/brain/slime))
+ fear_amount += 2
+
+ if(istype(thing, /obj/item/clothing/head/collectable/slime)) // Some hats are spooky so people can be assholes with them.
+ fear_amount += 1
+
+ if(istype(thing, /mob/living/simple_animal/slime)) // An actual predatory specimen!
+ var/mob/living/simple_animal/slime/S = thing
+ if(S.stat == DEAD) // Dead slimes are somewhat less spook.
+ fear_amount += 4
+ if(S.is_adult == TRUE) //big boy
+ fear_amount += 8
+ else
+ fear_amount += 6
+
+ if(istype(thing, /mob/living/carbon/human))
+ var/mob/living/carbon/human/S = thing
+ if(istype(S.species, /datum/species/skrell)) //Skrell ARE slimey.
+ fear_amount += 1
+ if(istype(S.species, /datum/species/shapeshifter/promethean))
+ fear_amount += 4
+ else
+ return
+ return fear_amount
+
// Note for the below 'phobias' are of the xeno-phobic variety, and are less centered on pure fear as above, and more on a mix of distrust, fear, and disdainfulness.
// As such, they are mechanically different than the fear-based phobias, in that instead of a buildup of fearful messages, it does intermittent messages specific to what holder sees.
@@ -367,7 +451,7 @@
closely, waiting to strike."
on_created_text = "You remain vigilant against the Alien."
- on_expired_text = "Aliens aren't so bad afterall."
+ on_expired_text = "Aliens aren't so bad after all."
var/last_message = null // world.time we last did a message.
var/message_cooldown = 1 MINUTE
@@ -442,7 +526,7 @@
desc = "Humans are bound to get us all killed with their reckless use of technology..."
on_created_text = "You unfortunately are likely to have to deal with humans today."
- on_expired_text = "Humans aren't so bad afterall."
+ on_expired_text = "Humans aren't so bad after all."
/datum/modifier/trait/phobia/xenophobia/human/get_xenos()
var/list/humans = list()
@@ -471,7 +555,7 @@
desc = "The Skrell pretend that they are Humanity's enlightened allies, but you can see past that."
on_created_text = "Hopefully no Skrell show up today."
- on_expired_text = "Skrell aren't so bad afterall."
+ on_expired_text = "Skrell aren't so bad after all."
/datum/modifier/trait/phobia/xenophobia/skrell/get_xenos()
var/list/skrell = list()
@@ -490,3 +574,4 @@
"WetSkrell was a mistake."
)
return pick(generic_responses)
+
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 52426454e22..03cec12f5e0 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -11,7 +11,7 @@ var/global/list/image/ghost_sightless_images = list() //this is a list of images
desc = "It's a g-g-g-g-ghooooost!" //jinkies!
icon = 'icons/mob/ghost.dmi'
icon_state = "ghost"
- layer = 4
+ layer = 3.9 //Just below normal mobs
stat = DEAD
canmove = 0
blinded = 0
@@ -501,6 +501,16 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
src << "Temperature: [round(environment.temperature-T0C,0.1)]°C ([round(environment.temperature,0.1)]K)"
src << "Heat Capacity: [round(environment.heat_capacity(),0.1)]"
+/mob/observer/dead/verb/check_radiation()
+ set name = "Check Radiation"
+ set category = "Ghost"
+
+ var/turf/t = get_turf(src)
+ if(t)
+ var/rads = radiation_repository.get_rads_at_turf(t)
+ to_chat(src, "Radiation level: [rads ? rads : "0"] Bq.")
+
+
/mob/observer/dead/verb/become_mouse()
set name = "Become mouse"
set category = "Ghost"
diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm
index 61bded2e159..beb531f9018 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -39,6 +39,7 @@
var/virus_immune
var/short_sighted // Permanent weldervision.
var/blood_volume = 560 // Initial blood volume.
+ var/bloodloss_rate = 1 // Multiplier for how fast a species bleeds out. Higher = Faster
var/hunger_factor = 0.05 // Multiplier for hunger.
var/taste_sensitivity = TASTE_NORMAL // How sensitive the species is to minute tastes.
diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm
index 372451808e2..e7d1083e862 100644
--- a/code/modules/mob/living/carbon/human/species/station/station.dm
+++ b/code/modules/mob/living/carbon/human/species/station/station.dm
@@ -35,12 +35,14 @@
ambiguous_genders = TRUE
gluttonous = 1
slowdown = 0.5
+ total_health = 125
brute_mod = 0.85
burn_mod = 0.85
metabolic_rate = 0.85
item_slowdown_mod = 0.5
mob_size = MOB_LARGE
blood_volume = 840
+ bloodloss_rate = 0.75
num_alternate_languages = 3
secondary_langs = list(LANGUAGE_UNATHI)
name_language = LANGUAGE_UNATHI
@@ -235,6 +237,8 @@
flash_mod = 1.2
chemOD_mod = 0.9
+ bloodloss_rate = 1.5
+
ambiguous_genders = TRUE
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index f0ee069b88f..4bea07f479b 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -661,9 +661,9 @@ default behaviour is:
/mob/living/Move(a, b, flag)
if (buckled && buckled.loc != a) //not updating position
- if (!buckled.anchored)
+ if(istype(buckled, /mob)) //If you're buckled to a mob, a la slime things, keep on rolling.
return buckled.Move(a, b)
- else
+ else //Otherwise, no running around for you.
return 0
if (restrained())
diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm
index f0bfd1d69f9..93605228c05 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone.dm
@@ -37,8 +37,10 @@ var/list/mob_hat_cache = list()
integrated_light_power = 3
local_transmit = 1
- can_pull_size = ITEMSIZE_NORMAL
+ can_pull_size = ITEMSIZE_NO_CONTAINER
can_pull_mobs = MOB_PULL_SMALLER
+ can_enter_vent_with = list(
+ /obj)
mob_bump_flag = SIMPLE_ANIMAL
mob_swap_flags = SIMPLE_ANIMAL
@@ -71,13 +73,22 @@ var/list/mob_hat_cache = list()
module_type = /obj/item/weapon/robot_module/drone/construction
hat_x_offset = 1
hat_y_offset = -12
- can_pull_size = ITEMSIZE_HUGE
+ can_pull_mobs = MOB_PULL_SAME
+
+/mob/living/silicon/robot/drone/mining
+ icon_state = "miningdrone"
+ item_state = "constructiondrone"
+ law_type = /datum/ai_laws/mining_drone
+ module_type = /obj/item/weapon/robot_module/drone/mining
+ hat_x_offset = 1
+ hat_y_offset = -12
can_pull_mobs = MOB_PULL_SAME
/mob/living/silicon/robot/drone/New()
..()
+ verbs += /mob/living/proc/ventcrawl
verbs += /mob/living/proc/hide
remove_language("Robot Talk")
add_language("Robot Talk", 0)
@@ -145,18 +156,18 @@ var/list/mob_hat_cache = list()
if(user.a_intent == "help" && istype(W, /obj/item/clothing/head))
if(hat)
- user << "\The [src] is already wearing \the [hat]."
+ to_chat(user, "\The [src] is already wearing \the [hat].")
return
user.unEquip(W)
wear_hat(W)
user.visible_message("\The [user] puts \the [W] on \the [src].")
return
else if(istype(W, /obj/item/borg/upgrade/))
- user << "\The [src] is not compatible with \the [W]."
+ to_chat(user, "\The [src] is not compatible with \the [W].")
return
else if (istype(W, /obj/item/weapon/crowbar))
- user << "\The [src] is hermetically sealed. You can't open the case."
+ to_chat(user, "\The [src] is hermetically sealed. You can't open the case.")
return
else if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda))
@@ -164,11 +175,11 @@ var/list/mob_hat_cache = list()
if(stat == 2)
if(!config.allow_drone_spawn || emagged || health < -35) //It's dead, Dave.
- user << "The interface is fried, and a distressing burned smell wafts from the robot's interior. You're not rebooting this one."
+ to_chat(user, "The interface is fried, and a distressing burned smell wafts from the robot's interior. You're not rebooting this one.")
return
if(!allowed(usr))
- user << "Access denied."
+ to_chat(user, "Access denied.")
return
user.visible_message("\The [user] swipes \his ID card through \the [src], attempting to reboot it.", ">You swipe your ID card through \the [src], attempting to reboot it.")
@@ -189,7 +200,7 @@ var/list/mob_hat_cache = list()
if(allowed(usr))
shut_down()
else
- user << "Access denied."
+ to_chat(user, "Access denied.")
return
@@ -197,16 +208,16 @@ var/list/mob_hat_cache = list()
/mob/living/silicon/robot/drone/emag_act(var/remaining_charges, var/mob/user)
if(!client || stat == 2)
- user << "There's not much point subverting this heap of junk."
+ to_chat(user, "There's not much point subverting this heap of junk.")
return
if(emagged)
- src << "\The [user] attempts to load subversive software into you, but your hacked subroutines ignore the attempt."
- user << "You attempt to subvert [src], but the sequencer has no effect."
+ to_chat(user, "\The [user] attempts to load subversive software into you, but your hacked subroutines ignore the attempt.")
+ to_chat(user, "You attempt to subvert [src], but the sequencer has no effect.")
return
- user << "You swipe the sequencer across [src]'s interface and watch its eyes flicker."
- src << "You feel a sudden burst of malware loaded into your execute-as-root buffer. Your tiny brain methodically parses, loads and executes the script."
+ to_chat(user, "You swipe the sequencer across [src]'s interface and watch its eyes flicker.")
+ to_chat(user, "You feel a sudden burst of malware loaded into your execute-as-root buffer. Your tiny brain methodically parses, loads and executes the script.")
message_admins("[key_name_admin(user)] emagged drone [key_name_admin(src)]. Laws overridden.")
log_game("[key_name(user)] emagged drone [key_name(src)]. Laws overridden.")
@@ -337,3 +348,11 @@ var/list/mob_hat_cache = list()
/mob/living/silicon/robot/drone/construction/updatename()
real_name = "construction drone ([rand(100,999)])"
name = real_name
+
+/mob/living/silicon/robot/drone/mining/init()
+ ..()
+ flavor_text = "It's a bulky mining drone stamped with a Grayson logo."
+
+/mob/living/silicon/robot/drone/mining/updatename()
+ real_name = "mining drone ([rand(100,999)])"
+ name = real_name
diff --git a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm
index 4929b7f7136..b0a7543e119 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm
@@ -30,6 +30,11 @@
fabricator_tag = "Upper Level Construction"
drone_type = /mob/living/silicon/robot/drone/construction
+/obj/machinery/drone_fabricator/mining
+ name = "mining drone fabricator"
+ fabricator_tag = "Upper Level Mining"
+ drone_type = /mob/living/silicon/robot/drone/mining
+
/obj/machinery/drone_fabricator/New()
..()
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 6b07aa8b0c8..379a79f222b 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -628,7 +628,7 @@
if(!opened)
usr << "You must access the borgs internals!"
else if(!src.module && U.require_module)
- usr << "The borg must choose a module before he can be upgraded!"
+ usr << "The borg must choose a module before it can be upgraded!"
else if(U.locked)
usr << "The upgrade is locked and cannot be used yet!"
else
diff --git a/code/modules/mob/living/silicon/robot/robot_modules/station.dm b/code/modules/mob/living/silicon/robot/robot_modules/station.dm
index d3311d8776f..9098348e3ae 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules/station.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules/station.dm
@@ -31,6 +31,7 @@ var/global/list/robot_modules = list(
var/list/datum/matter_synth/synths = list()
var/obj/item/emag = null
var/obj/item/borg/upgrade/jetpack = null
+ var/obj/item/borg/upgrade/advhealth = null
var/list/subsystems = list()
var/list/obj/item/borg/upgrade/supported_upgrades = list()
@@ -871,4 +872,17 @@ var/global/list/robot_modules = list(
var/obj/item/device/lightreplacer/LR = locate() in src.modules
LR.Charge(R, amount)
..()
- return
\ No newline at end of file
+ return
+
+/obj/item/weapon/robot_module/drone/mining
+ name = "miner drone module"
+ channels = list("Supply" = 1)
+ networks = list(NETWORK_MINE)
+
+/obj/item/weapon/robot_module/drone/mining/New()
+ ..()
+ src.modules += new /obj/item/borg/sight/material(src)
+ src.modules += new /obj/item/weapon/pickaxe/borgdrill(src)
+ src.modules += new /obj/item/weapon/storage/bag/ore(src)
+ src.modules += new /obj/item/weapon/storage/bag/sheetsnatcher/borg(src)
+ src.emag = new /obj/item/weapon/pickaxe/diamonddrill(src)
diff --git a/code/modules/mob/living/silicon/robot/robot_modules/syndicate.dm b/code/modules/mob/living/silicon/robot/robot_modules/syndicate.dm
index f769cb29ab2..9967fa67dcf 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules/syndicate.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules/syndicate.dm
@@ -141,7 +141,7 @@
/obj/item/weapon/robot_module/robot/syndicate/combat_medic/New(var/mob/living/silicon/robot/R)
..()
src.modules += new /obj/item/borg/sight/hud/med(src)
- src.modules += new /obj/item/device/healthanalyzer(src)
+ src.modules += new /obj/item/device/healthanalyzer/advanced(src)
src.modules += new /obj/item/weapon/reagent_containers/borghypo/merc(src)
// Surgery things.
diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm
index 214038c37ef..230ac334772 100644
--- a/code/modules/organs/blood.dm
+++ b/code/modules/organs/blood.dm
@@ -143,6 +143,9 @@ var/const/CE_STABLE_THRESHOLD = 0.5
var/blood_max = 0
var/blood_loss_divisor = 30 //lower factor = more blood loss
+ // Some species bleed out differently
+ blood_loss_divisor /= species.bloodloss_rate
+
// Some modifiers can make bleeding better or worse. Higher multiplers = more bleeding.
var/blood_loss_modifier_multiplier = 1.0
for(var/datum/modifier/M in modifiers)
diff --git a/code/modules/power/fusion/core/_core.dm b/code/modules/power/fusion/core/_core.dm
index 74da4e4acbc..60af67cf92c 100644
--- a/code/modules/power/fusion/core/_core.dm
+++ b/code/modules/power/fusion/core/_core.dm
@@ -41,7 +41,12 @@ var/list/fusion_cores = list()
/obj/machinery/power/fusion_core/process()
if((stat & BROKEN) || !powernet || !owned_field)
Shutdown()
-
+ if(owned_field)
+ spawn(1)
+ owned_field.stability_monitor()
+ owned_field.radiation_scale()
+ owned_field.temp_dump()
+ owned_field.temp_color()
/obj/machinery/power/fusion_core/Topic(href, href_list)
if(..())
return 1
diff --git a/code/modules/power/fusion/core/core_field.dm b/code/modules/power/fusion/core/core_field.dm
index 587ec7637e6..c882a95cccd 100644
--- a/code/modules/power/fusion/core/core_field.dm
+++ b/code/modules/power/fusion/core/core_field.dm
@@ -1,4 +1,6 @@
#define FUSION_ENERGY_PER_K 20
+#define FUSION_MAX_ENVIRO_HEAT 5000 //raise this if you want the reactor to dump more energy into the atmosphere
+#define PLASMA_TEMP_RADIATION_DIVISIOR 15 //radiation divisior. plasma temp / divisor = radiation.
/obj/effect/fusion_em_field
name = "electromagnetic field"
@@ -7,7 +9,7 @@
icon_state = "emfield_s1"
alpha = 50
layer = 4
- light_color = COLOR_BLUE
+ light_color = "#cc7700"
var/size = 1
var/energy = 0
@@ -16,6 +18,7 @@
var/field_strength = 0.01
var/tick_instability = 0
var/percent_unstable = 0
+ var/stable = 1
var/obj/machinery/power/fusion_core/owned_core
var/list/dormant_reactant_quantities = list()
@@ -33,8 +36,8 @@
var/light_min_range = 2
var/light_min_power = 3
- var/light_max_range = 10
- var/light_max_power = 10
+ var/light_max_range = 5
+ var/light_max_power = 5
var/last_range
var/last_power
@@ -173,8 +176,6 @@
check_instability()
Radiate()
- if(radiation)
- radiation_repository.radiate(src, radiation)
return 1
/obj/effect/fusion_em_field/proc/check_instability()
@@ -200,9 +201,10 @@
var/flare
var/fuel_loss
var/rupture
- if(percent_unstable < 0.7)
+ if(percent_unstable < 0.2)
visible_message("\The [src] ripples uneasily, like a disturbed pond.")
fuel_loss = prob(5)
+ flare = prob(50)
else if(percent_unstable < 0.9)
visible_message("\The [src] undulates violently, shedding plumes of plasma!")
flare = prob(50)
@@ -238,6 +240,7 @@
set_light(15, 15, "#CCCCFF")
empulse(get_turf(src), ceil(plasma_temperature/1000), ceil(plasma_temperature/300))
sleep(5)
+ global_announcer.autosay("WARNING: FIELD RUPTURE IMMINENT!", "Containment Monitor")
RadiateAll()
explosion(get_turf(owned_core),-1,-1,8,10) // Blow out all the windows.
return
@@ -318,12 +321,6 @@
tick_instability += rand(15,30)
AM.emp_act(empsev)
- if(owned_core && owned_core.loc)
- var/datum/gas_mixture/environment = owned_core.loc.return_air()
- if(environment && environment.temperature < (T0C+1000)) // Putting an upper bound on it to stop it being used in a TEG.
- environment.add_thermal_energy(plasma_temperature*20000)
- radiation = 0
-
/obj/effect/fusion_em_field/proc/change_size(var/newsize = 1)
var/changed = 0
switch(newsize)
@@ -490,5 +487,59 @@
AddEnergy(Proj.damage)
update_icon()
return 0
+//All procs below this point are called in _core.dm, starting at line 41.
+//Stability monitoring. Gives radio annoucements if field stability is below 80%
+/obj/effect/fusion_em_field/proc/stability_monitor()
+ var/warnpoint = 0.10
+ var/warnmessage = "Warning! Field unstable! Instability at [percent_unstable * 100]%, plasma temperature at [plasma_temperature + 295]k."
+ var/stablemessage = "Containment field returning to stable conditions."
-#undef FUSION_HEAT_CAP
\ No newline at end of file
+ if(percent_unstable >= warnpoint)
+ global_announcer.autosay(warnmessage, "Field Stability Monitor", "Engineering")
+ stable = 0
+ sleep(20 SECONDS)
+ return
+ if(percent_unstable < warnpoint && stable == 0)
+ global_announcer.autosay(stablemessage, "Field Stability Monitor", "Engineering")
+ stable = 1
+ return
+
+//Reaction radiation is fairly buggy and there's at least three procs dealing with radiation here, this is to ensure constant radiation output.
+/obj/effect/fusion_em_field/proc/radiation_scale()
+ radiation_repository.radiate(src, 2 + plasma_temperature / PLASMA_TEMP_RADIATION_DIVISIOR)
+
+//Somehow fixing the radiation issue managed to break this, but moving it to it's own proc seemed to have fixed it. I don't know.
+/obj/effect/fusion_em_field/proc/temp_dump()
+ if(owned_core && owned_core.loc)
+ var/datum/gas_mixture/environment = owned_core.loc.return_air()
+ if(environment && environment.temperature < (T0C+FUSION_MAX_ENVIRO_HEAT))
+ environment.add_thermal_energy(plasma_temperature*20000)
+
+//Temperature changes depending on color.
+/obj/effect/fusion_em_field/proc/temp_color()
+ if(plasma_temperature > 60000) //high ultraviolet - magenta
+ light_color = "#cc005f"
+ light_max_range = 25
+ light_max_power = 10
+ else if(plasma_temperature > 12000) //ultraviolet - blue
+ light_color = "#1b00cc"
+ light_max_range = 20
+ light_max_power = 10
+ else if(plasma_temperature > 8000) //nearing ultraviolet - cyan
+ light_color = "#00cccc"
+ light_max_range = 15
+ light_max_power = 10
+ else if(plasma_temperature > 4000) // green
+ light_color = "#1ab705"
+ light_max_range = 10
+ light_max_power = 10
+ else if(plasma_temperature <= 4000) //orange
+ light_color = "#cc7700"
+ light_max_range = 5
+ light_max_power = 5
+ return
+
+
+#undef FUSION_HEAT_CAP
+#undef FUSION_MAX_ENVIRO_HEAT
+#undef PLASMA_TEMP_RADIATION_DIVISIOR
\ No newline at end of file
diff --git a/code/modules/power/fusion/fusion_reactions.dm b/code/modules/power/fusion/fusion_reactions.dm
index f447164ea43..38f73812f99 100644
--- a/code/modules/power/fusion/fusion_reactions.dm
+++ b/code/modules/power/fusion/fusion_reactions.dm
@@ -48,14 +48,13 @@ proc/get_fusion_reaction(var/p_react, var/s_react, var/m_energy)
s_react = "deuterium"
energy_consumption = 1
energy_production = 2
-
// Advanced production reactions (todo)
+
/decl/fusion_reaction/deuterium_helium
p_react = "deuterium"
s_react = "helium-3"
energy_consumption = 1
energy_production = 5
- radiation = 2
/decl/fusion_reaction/deuterium_tritium
p_react = "deuterium"
@@ -64,7 +63,6 @@ proc/get_fusion_reaction(var/p_react, var/s_react, var/m_energy)
energy_production = 1
products = list("helium-3" = 1)
instability = 0.5
- radiation = 3
/decl/fusion_reaction/deuterium_lithium
p_react = "deuterium"
diff --git a/code/modules/power/fusion/fusion_reagents.dm b/code/modules/power/fusion/fusion_reagents.dm
new file mode 100644
index 00000000000..875bf63fee0
--- /dev/null
+++ b/code/modules/power/fusion/fusion_reagents.dm
@@ -0,0 +1,8 @@
+//Additional fusion reagents. These likely don't have any other use aside from the RUST, but if you want to make stuff with 'em, be my guest.
+
+/datum/reagent/helium3
+ name = "helium-3"
+ description = "A colorless, odorless, tasteless and generally inert gas used in fusion reactors. Non-radioactive."
+ id = "helium-3"
+ reagent_state = GAS
+ color = "#808080"
\ No newline at end of file
diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm
index d6ae824fd1e..2c73ebd641c 100644
--- a/code/modules/power/gravitygenerator.dm
+++ b/code/modules/power/gravitygenerator.dm
@@ -1,7 +1,7 @@
// It.. uses a lot of power. Everything under power is engineering stuff, at least.
/obj/machinery/computer/gravity_control_computer
- name = "Gravity Generator Control"
+ name = "gravity generator control"
desc = "A computer to control a local gravity generator. Qualified personnel only."
icon_state = "airtunnel0e"
anchored = 1
@@ -10,7 +10,7 @@
/obj/machinery/gravity_generator/
- name = "Gravitational Generator"
+ name = "gravitational generator"
desc = "A device which produces a gravaton field when set up."
icon = 'icons/obj/singularity.dmi'
icon_state = "TheSingGen"
@@ -94,7 +94,7 @@
else
dat += "[A]
"
- dat += "
Maintainence Functions:
"
+ dat += "
Maintenance Functions:
"
if(gravity_generator:on)
dat += " TURN GRAVITY GENERATOR OFF. "
else
diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm
index 100aa43165d..2c2a3966a36 100644
--- a/code/modules/reagents/reagent_containers/food/snacks.dm
+++ b/code/modules/reagents/reagent_containers/food/snacks.dm
@@ -29,7 +29,8 @@
//Placeholder for effect that trigger on eating that aren't tied to reagents.
/obj/item/weapon/reagent_containers/food/snacks/proc/On_Consume(var/mob/M)
- if(!usr) return
+ if(!usr)
+ usr = M
if(!reagents.total_volume)
M.visible_message("[M] finishes eating \the [src].","You finish eating \the [src].")
usr.drop_from_inventory(src) //so icons update :[
@@ -224,7 +225,7 @@
return
user.visible_message("[user] nibbles away at \the [src].","You nibble away at \the [src].")
bitecount++
- if(reagents && user.reagents)
+ if(reagents)
reagents.trans_to_mob(user, bitesize, CHEM_INGEST)
spawn(5)
if(!src && !user.client)
diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm
index 86f16d4cb7a..5ec7aae23a4 100644
--- a/code/modules/reagents/reagent_dispenser.dm
+++ b/code/modules/reagents/reagent_dispenser.dm
@@ -15,57 +15,55 @@
attackby(obj/item/weapon/W as obj, mob/user as mob)
return
- New()
- var/datum/reagents/R = new/datum/reagents(1000)
- reagents = R
- R.my_atom = src
- if (!possible_transfer_amounts)
- src.verbs -= /obj/structure/reagent_dispensers/verb/set_APTFT
- ..()
+/obj/structure/reagent_dispensers/New()
+ var/datum/reagents/R = new/datum/reagents(5000)
+ reagents = R
+ R.my_atom = src
+ if (!possible_transfer_amounts)
+ src.verbs -= /obj/structure/reagent_dispensers/verb/set_APTFT
+ ..()
- examine(mob/user)
- if(!..(user, 2))
+/obj/structure/reagent_dispensers/examine(mob/user)
+ if(!..(user, 2))
+ return
+ user << "It contains:"
+ if(reagents && reagents.reagent_list.len)
+ for(var/datum/reagent/R in reagents.reagent_list)
+ user << "[R.volume] units of [R.name]"
+ else
+ user << "Nothing."
+
+/obj/structure/reagent_dispensers/verb/set_APTFT() //set amount_per_transfer_from_this
+ set name = "Set transfer amount"
+ set category = "Object"
+ set src in view(1)
+ var/N = input("Amount per transfer from this:","[src]") as null|anything in possible_transfer_amounts
+ if (N)
+ amount_per_transfer_from_this = N
+
+/obj/structure/reagent_dispensers/ex_act(severity)
+ switch(severity)
+ if(1.0)
+ qdel(src)
return
- user << "It contains:"
- if(reagents && reagents.reagent_list.len)
- for(var/datum/reagent/R in reagents.reagent_list)
- user << "[R.volume] units of [R.name]"
- else
- user << "Nothing."
-
- verb/set_APTFT() //set amount_per_transfer_from_this
- set name = "Set transfer amount"
- set category = "Object"
- set src in view(1)
- var/N = input("Amount per transfer from this:","[src]") as null|anything in possible_transfer_amounts
- if (N)
- amount_per_transfer_from_this = N
-
- ex_act(severity)
- switch(severity)
- if(1.0)
+ if(2.0)
+ if (prob(50))
+ new /obj/effect/effect/water(src.loc)
qdel(src)
return
- if(2.0)
- if (prob(50))
- new /obj/effect/effect/water(src.loc)
- qdel(src)
- return
- if(3.0)
- if (prob(5))
- new /obj/effect/effect/water(src.loc)
- qdel(src)
- return
- else
- return
+ if(3.0)
+ if (prob(5))
+ new /obj/effect/effect/water(src.loc)
+ qdel(src)
+ return
+ else
+ return
/obj/structure/reagent_dispensers/blob_act()
qdel(src)
-
-
//Dispensers
/obj/structure/reagent_dispensers/watertank
name = "watertank"
@@ -73,16 +71,19 @@
icon = 'icons/obj/objects.dmi'
icon_state = "watertank"
amount_per_transfer_from_this = 10
- New()
- ..()
- reagents.add_reagent("water",1000)
-/obj/structure/reagent_dispensers/watertank/high/New()
+/obj/structure/reagent_dispensers/watertank/New()
+ ..()
+ reagents.add_reagent("water", 1000)
+
+/obj/structure/reagent_dispensers/watertank/high
name = "high-capacity water tank"
desc = "A highly-pressurized water tank made to hold vast amounts of water.."
icon_state = "watertank_high"
+
+/obj/structure/reagent_dispensers/watertank/high/New()
..()
- reagents.add_reagent("water",4000)
+ reagents.add_reagent("water", 4000)
/obj/structure/reagent_dispensers/fueltank
name = "fueltank"
@@ -92,9 +93,10 @@
amount_per_transfer_from_this = 10
var/modded = 0
var/obj/item/device/assembly_holder/rig = null
- New()
- ..()
- reagents.add_reagent("fuel",1000)
+
+/obj/structure/reagent_dispensers/fueltank/New()
+ ..()
+ reagents.add_reagent("fuel",1000)
/obj/structure/reagent_dispensers/fueltank/examine(mob/user)
if(!..(user, 2))
@@ -201,9 +203,10 @@
anchored = 1
density = 0
amount_per_transfer_from_this = 45
- New()
- ..()
- reagents.add_reagent("condensedcapsaicin",1000)
+
+/obj/structure/reagent_dispensers/peppertank/New()
+ ..()
+ reagents.add_reagent("condensedcapsaicin",1000)
/obj/structure/reagent_dispensers/water_cooler
@@ -347,9 +350,10 @@
icon = 'icons/obj/objects.dmi'
icon_state = "beertankTEMP"
amount_per_transfer_from_this = 10
- New()
- ..()
- reagents.add_reagent("beer",1000)
+
+/obj/structure/reagent_dispensers/beerkeg/New()
+ ..()
+ reagents.add_reagent("beer",1000)
/obj/structure/reagent_dispensers/beerkeg/fakenuke
name = "nuclear beer keg"
@@ -365,9 +369,9 @@
amount_per_transfer_from_this = 10
anchored = 1
- New()
- ..()
- reagents.add_reagent("virusfood", 1000)
+/obj/structure/reagent_dispensers/virusfood/New()
+ ..()
+ reagents.add_reagent("virusfood", 1000)
/obj/structure/reagent_dispensers/acid
name = "Sulphuric Acid Dispenser"
@@ -377,6 +381,6 @@
amount_per_transfer_from_this = 10
anchored = 1
- New()
- ..()
- reagents.add_reagent("sacid", 1000)
+/obj/structure/reagent_dispensers/acid/New()
+ ..()
+ reagents.add_reagent("sacid", 1000)
diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm
index 6ed6016d285..d33098381b4 100644
--- a/code/modules/research/designs.dm
+++ b/code/modules/research/designs.dm
@@ -752,7 +752,7 @@ other types of metals and chemistry for reagents).
sort_string = "VABAI"
/datum/design/item/communicator
- name = "Communcator"
+ name = "Communicator"
id = "communicator"
req_tech = list(TECH_DATA = 2, TECH_MAGNET = 2)
materials = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 500)
diff --git a/code/modules/research/prosfab_designs.dm b/code/modules/research/prosfab_designs.dm
index 7a191f489fc..e904ff1b5e5 100644
--- a/code/modules/research/prosfab_designs.dm
+++ b/code/modules/research/prosfab_designs.dm
@@ -332,6 +332,13 @@
materials = list(DEFAULT_WALL_MATERIAL = 7500, "phoron" = 11250, "uranium" = 15000)
build_path = /obj/item/borg/upgrade/jetpack
+/datum/design/item/prosfab/robot_upgrade/advhealth
+ name = "Advanced Health Analyzer Module"
+ desc = "An advanced health analyzer suitable for diagnosing more serious injuries."
+ id = "borg_advhealth_module"
+ materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 6500, "diamond" = 350)
+ build_path = /obj/item/borg/upgrade/advhealth
+
/datum/design/item/prosfab/robot_upgrade/syndicate
name = "Scrambled Equipment Module"
desc = "Allows for the construction of lethal upgrades for cyborgs."
diff --git a/html/changelogs/example - Copy.yml b/html/changelogs/example - Copy.yml
new file mode 100644
index 00000000000..80056ef0ead
--- /dev/null
+++ b/html/changelogs/example - Copy.yml
@@ -0,0 +1,5 @@
+author: Belsima
+
+delete-after: True
+
+ - tweak: "Maintenance drones may now ventcrawl."
diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi
index 0c076ccdcb9..75249fb4abd 100644
Binary files a/icons/mob/hud.dmi and b/icons/mob/hud.dmi differ
diff --git a/icons/mob/pai.dmi b/icons/mob/pai.dmi
index 76d1f1771c2..23744fddda6 100644
Binary files a/icons/mob/pai.dmi and b/icons/mob/pai.dmi differ
diff --git a/icons/mob/robots.dmi b/icons/mob/robots.dmi
index 35e6df449f8..a331158939b 100644
Binary files a/icons/mob/robots.dmi and b/icons/mob/robots.dmi differ
diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi
index 8acc10a4fb3..f74c37b6a61 100644
Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ
diff --git a/icons/obj/electronic_assemblies.dmi b/icons/obj/electronic_assemblies.dmi
index 6da1794a547..5799d85866f 100644
Binary files a/icons/obj/electronic_assemblies.dmi and b/icons/obj/electronic_assemblies.dmi differ
diff --git a/icons/obj/stacks.dmi b/icons/obj/stacks.dmi
index 5cdff4a1f33..51465980512 100644
Binary files a/icons/obj/stacks.dmi and b/icons/obj/stacks.dmi differ
diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi
index 8774330e7f1..d15a86e2f38 100644
Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ
diff --git a/icons/obj/weapons.dmi b/icons/obj/weapons.dmi
index cf755227ec7..1153c2439f4 100644
Binary files a/icons/obj/weapons.dmi and b/icons/obj/weapons.dmi differ
diff --git a/maps/northern_star/polaris-1.dmm b/maps/northern_star/polaris-1.dmm
index bcc8f952f12..554df93be76 100644
--- a/maps/northern_star/polaris-1.dmm
+++ b/maps/northern_star/polaris-1.dmm
@@ -6198,7 +6198,7 @@
"cpj" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/quartermaster/foyer)
"cpk" = (/obj/structure/bed/chair{dir = 8},/obj/effect/floor_decal/corner/brown{dir = 6},/turf/simulated/floor/tiled,/area/quartermaster/foyer)
"cpl" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/quartermaster/delivery)
-"cpm" = (/obj/structure/table/steel,/obj/item/weapon/packageWrap,/obj/item/weapon/packageWrap,/obj/item/weapon/packageWrap,/obj/item/weapon/packageWrap,/obj/item/weapon/packageWrap,/obj/effect/floor_decal/corner/brown{dir = 9},/turf/simulated/floor/tiled,/area/quartermaster/delivery)
+"cpm" = (/obj/structure/table/steel,/obj/item/weapon/packageWrap,/obj/item/weapon/packageWrap,/obj/item/weapon/packageWrap,/obj/item/weapon/packageWrap,/obj/item/weapon/packageWrap,/obj/effect/floor_decal/corner/brown{dir = 9},/obj/item/weapon/material/butterfly/boxcutter,/turf/simulated/floor/tiled,/area/quartermaster/delivery)
"cpn" = (/obj/machinery/requests_console{department = "Cargo Bay"; departmentType = 2; pixel_x = 30; pixel_y = -1},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/industrial/warning/corner{dir = 4},/turf/simulated/floor/tiled,/area/quartermaster/delivery)
"cpo" = (/obj/machinery/conveyor{dir = 1; id = "packageSort1"},/obj/structure/plasticflaps/mining,/turf/simulated/floor/plating,/area/quartermaster/delivery)
"cpp" = (/obj/structure/table/standard,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/machinery/newscaster{pixel_x = -30},/turf/simulated/floor/tiled,/area/storage/primary)
@@ -6640,7 +6640,7 @@
"cxJ" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/tiled,/area/hallway/secondary/docking_hallway)
"cxK" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/vacant/vacant_shop)
"cxL" = (/obj/item/frame/light,/turf/simulated/floor/tiled,/area/vacant/vacant_shop)
-"cxM" = (/obj/structure/table/marble,/obj/item/weapon/hand_labeler,/obj/item/weapon/reagent_containers/food/condiment/small/sugar,/obj/item/weapon/reagent_containers/food/drinks/britcup,/obj/item/weapon/reagent_containers/food/drinks/britcup,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/tiled/yellow,/area/crew_quarters/coffee_shop)
+"cxM" = (/obj/structure/table/marble,/obj/item/weapon/hand_labeler,/obj/item/weapon/reagent_containers/food/condiment/small/sugar,/obj/item/weapon/reagent_containers/food/drinks/britcup,/obj/item/weapon/reagent_containers/food/drinks/britcup,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/item/weapon/reagent_containers/food/drinks/teapot,/turf/simulated/floor/tiled/yellow,/area/crew_quarters/coffee_shop)
"cxN" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -21},/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop)
"cxO" = (/obj/item/weapon/stool/padded,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop)
"cxP" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop)
diff --git a/maps/southern_cross/southern_cross-1.dmm b/maps/southern_cross/southern_cross-1.dmm
index 9263229dc2f..6fa854c0894 100644
--- a/maps/southern_cross/southern_cross-1.dmm
+++ b/maps/southern_cross/southern_cross-1.dmm
@@ -6637,7 +6637,7 @@
"cxG" = (/obj/machinery/conveyor{dir = 1; id = "packageSort1"},/obj/random/junk,/obj/random/junk,/obj/random/junk,/turf/simulated/floor/plating,/area/quartermaster/delivery)
"cxH" = (/obj/item/weapon/stool,/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled,/area/quartermaster/delivery)
"cxI" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled,/area/quartermaster/delivery)
-"cxJ" = (/obj/machinery/camera/network/cargo{c_tag = "CRG - Delivery Office"; dir = 8; name = "security camera"},/obj/structure/table/steel,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/storage/box,/obj/item/weapon/storage/box,/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/obj/effect/floor_decal/borderfloor/corner{dir = 4},/obj/effect/floor_decal/corner/brown/bordercorner{dir = 4},/turf/simulated/floor/tiled,/area/quartermaster/delivery)
+"cxJ" = (/obj/machinery/camera/network/cargo{c_tag = "CRG - Delivery Office"; dir = 8; name = "security camera"},/obj/structure/table/steel,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/storage/box,/obj/item/weapon/storage/box,/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/obj/effect/floor_decal/borderfloor/corner{dir = 4},/obj/effect/floor_decal/corner/brown/bordercorner{dir = 4},/obj/item/weapon/material/butterfly/boxcutter,/turf/simulated/floor/tiled,/area/quartermaster/delivery)
"cxK" = (/obj/machinery/light{dir = 8},/obj/effect/floor_decal/borderfloor/corner{dir = 1},/obj/effect/floor_decal/corner/brown/bordercorner{dir = 1},/turf/simulated/floor/tiled,/area/quartermaster/foyer)
"cxL" = (/obj/machinery/hologram/holopad,/obj/effect/floor_decal/industrial/outline/grey,/obj/effect/landmark{name = "lightsout"},/turf/simulated/floor/tiled,/area/quartermaster/foyer)
"cxM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/quartermaster/foyer)
@@ -7769,7 +7769,7 @@
"cTu" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/yellow,/area/crew_quarters/coffee_shop)
"cTv" = (/turf/simulated/floor/tiled/yellow,/area/crew_quarters/coffee_shop)
"cTw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/yellow,/area/crew_quarters/coffee_shop)
-"cTx" = (/obj/structure/table/marble,/obj/item/weapon/reagent_containers/food/drinks/britcup,/obj/item/weapon/reagent_containers/food/drinks/britcup,/obj/item/weapon/reagent_containers/food/drinks/britcup,/obj/machinery/alarm{dir = 8; pixel_x = 22; pixel_y = 0},/turf/simulated/floor/tiled/yellow,/area/crew_quarters/coffee_shop)
+"cTx" = (/obj/structure/table/marble,/obj/item/weapon/reagent_containers/food/drinks/britcup,/obj/item/weapon/reagent_containers/food/drinks/britcup,/obj/item/weapon/reagent_containers/food/drinks/britcup,/obj/machinery/alarm{dir = 8; pixel_x = 22; pixel_y = 0},/obj/item/weapon/reagent_containers/food/drinks/teapot,/turf/simulated/floor/tiled/yellow,/area/crew_quarters/coffee_shop)
"cTy" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/crew_quarters/cafeteria)
"cTz" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/maintenance{req_access = null; req_one_access = list(5,12,25,27,28,35)},/turf/simulated/floor/plating,/area/crew_quarters/cafeteria)
"cTA" = (/obj/structure/closet/crate/internals,/obj/random/tank,/obj/random/tank,/obj/random/tank,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/turf/simulated/floor/plating,/area/maintenance/medbay)
@@ -10441,7 +10441,7 @@
"dSO" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/catwalk,/turf/simulated/floor/airless,/area/solar/aftstarboardsolar)
"dSP" = (/turf/space,/area/syndicate_station/thirddeck)
"dSQ" = (/obj/effect/landmark/map_data{height = 3},/turf/space,/area/space)
-
+
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -11215,3 +11215,4 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
dSQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
"}
+
diff --git a/maps/submaps/cave_submaps/Scave1.dmm b/maps/submaps/cave_submaps/Scave1.dmm
index 7b0775f5181..110fb5f6639 100644
--- a/maps/submaps/cave_submaps/Scave1.dmm
+++ b/maps/submaps/cave_submaps/Scave1.dmm
@@ -1,4 +1,21 @@
"a" = (/turf/template_noop,/area/template_noop)
+"b" = (/turf/simulated/mineral,/area/submap/cave/Scave1)
+"c" = (/obj/effect/spider/stickyweb,/turf/simulated/mineral/floor,/area/submap/cave/Scave1)
+"d" = (/turf/simulated/mineral/floor,/area/submap/cave/Scave1)
+"e" = (/obj/effect/spider/spiderling,/turf/simulated/mineral/floor,/area/submap/cave/Scave1)
+"f" = (/obj/item/weapon/spacecash/c100,/obj/item/weapon/spacecash/c100,/turf/simulated/mineral/floor,/area/submap/cave/Scave1)
+"g" = (/obj/item/weapon/spacecash/c100,/obj/item/weapon/spacecash/c100,/obj/item/weapon/spacecash/c100,/obj/effect/decal/remains,/turf/simulated/mineral/floor,/area/submap/cave/Scave1)
+"h" = (/obj/item/weapon/grenade/spawnergrenade/spider,/turf/simulated/mineral/floor,/area/submap/cave/Scave1)
+"i" = (/mob/living/simple_animal/hostile/giant_spider/hunter,/turf/simulated/mineral/floor,/area/submap/cave/Scave1)
+"j" = (/obj/random/toolbox,/turf/simulated/mineral/floor,/area/submap/cave/Scave1)
+"k" = (/mob/living/simple_animal/hostile/giant_spider,/turf/simulated/mineral/floor,/area/submap/cave/Scave1)
+"l" = (/mob/living/simple_animal/hostile/giant_spider/nurse,/turf/simulated/mineral/floor,/area/submap/cave/Scave1)
+"m" = (/obj/effect/decal/mecha_wreckage/ripley,/turf/simulated/mineral/floor,/area/submap/cave/Scave1)
+"n" = (/obj/item/mecha_parts/mecha_equipment/tool/drill/diamonddrill,/turf/simulated/mineral/floor,/area/submap/cave/Scave1)
+"o" = (/obj/item/device/flashlight,/turf/simulated/mineral/floor,/area/submap/cave/Scave1)
+"p" = (/obj/effect/spider/stickyweb,/obj/effect/spider/stickyweb,/turf/simulated/mineral/floor,/area/submap/cave/Scave1)
+"q" = (/obj/effect/spider/stickyweb,/mob/living/simple_animal/hostile/giant_spider/hunter,/turf/simulated/mineral/floor,/area/submap/cave/Scave1)
+"r" = (/obj/effect/decal/remains,/turf/simulated/mineral/floor,/area/submap/cave/Scave1)
"b" = (/turf/simulated/mineral/ignore_mapgen,/area/submap/cave/Scave1)
"c" = (/turf/simulated/mineral,/area/submap/cave/Scave1)
"d" = (/obj/effect/spider/stickyweb,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/Scave1)
@@ -24,6 +41,29 @@
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaabbaaaaaaaaaaaaaaaaaaaaaaa
aabbbbbbaabbbbbaaaaaaabbbbbaaa
+abbbbbbbbbbbbbbbbbbbbbbbbbbaaa
+aabbbbbbcbbbbbbbbbbbbbbbdbbbaa
+aabbbbdeddbbbcccbbbbbdddeddbaa
+aadbbfddddcbbdedbbbbbddddddbaa
+aadbbgfbbdddddddbccedddbdedbba
+aabbbbbbbddcdddddddddddbhibbaa
+aabbbbbbdddbbbjcddddddbbbbbbaa
+aabbbbbcdkdbbbbbbcdkddcbbbbaaa
+aabbbbbcddcbbbbbbbddddcbbbaaaa
+aabbbbbbidcbbbbbbbdlddcbbbaaaa
+aabbbbbbdddbbbbbbmddddcbbbaaaa
+aabbbbbbdcdbbbbbbnddddcbbbaaaa
+aabbbbbbdddbbbbbbcddldcbbbaaaa
+aadbbbbbddibbbbbbbccdddbbbaaaa
+aaodbbbbddbbbbbbbbbkcddbbbaaaa
+aaddbbbbdddbbbbbbbbbbddbbdaaaa
+aadddpddddddbbbbbbbbdedbbdaaaa
+aaddppcddddddqbcdddddcbbbdaaaa
+aardbbbbbdddddddddddcbbbbdaaaa
+aabbbbbbbbcdddcdddddcbbbbbaaaa
+aabbbbbbbbbbbbbbbibbbbbbbbaaaa
+aabbbbbbbbbbbbbbbbbbbbbbbbaaaa
+aaaaabbbbabbbbbbbaabbbbbbaaaaa
abbccccbbbbccbbbbbbbbbbcccbaaa
aabccbbbdbbccbbbbcccbbbbebbbaa
aabbbbefeebbbdddbcccbeeefeebaa
diff --git a/maps/submaps/cave_submaps/cave_areas.dm b/maps/submaps/cave_submaps/cave_areas.dm
index eca5ad2d6a9..18153abdc3e 100644
--- a/maps/submaps/cave_submaps/cave_areas.dm
+++ b/maps/submaps/cave_submaps/cave_areas.dm
@@ -19,4 +19,4 @@
/area/submap/cave/crashed_ufo
name = "Crashed Alien Vessel"
- requires_power = FALSE
+ requires_power = FALSE
\ No newline at end of file
diff --git a/maps/submaps/surface_submaps/Blackshuttledown.dmm b/maps/submaps/surface_submaps/Blackshuttledown.dmm
new file mode 100644
index 00000000000..04d9db0a3ca
--- /dev/null
+++ b/maps/submaps/surface_submaps/Blackshuttledown.dmm
@@ -0,0 +1,108 @@
+"aa" = (/turf/template_noop,/area/template_noop)
+"ab" = (/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/Blackshuttledown)
+"ac" = (/obj/effect/decal/remains/human,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/Blackshuttledown)
+"ad" = (/obj/effect/decal/cleanable/blood,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/Blackshuttledown)
+"ae" = (/obj/structure/flora/tree/sif,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/Blackshuttledown)
+"af" = (/turf/simulated/mineral/ignore_mapgen,/area/submap/Blackshuttledown)
+"ag" = (/obj/structure/table/steel,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/Blackshuttledown)
+"ah" = (/mob/living/simple_animal/hostile/syndicate/ranged{desc = "Dosen't look friendly in the slightest."; name = "Unknown Individual."; say_got_target = list("Looks like trouble!","Contact!","We've got company!","Perimeter Breached!!"); speak = list("One day the'll fix that damn engine..","Next time, We're hidding on the tropical beach planet.","Wish I had better equipment...","I knew I should have been a line chef...","Fuckin' helmet keeps fogging up.","Hate this blocky ass ship.")},/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/Blackshuttledown)
+"ai" = (/turf/simulated/floor/outdoors/grass/sif/forest,/turf/simulated/shuttle/wall/dark{icon_state = "dark6"; name = "Unknown Shuttle"; tag = "icon-dark6"},/area/submap/Blackshuttledown)
+"aj" = (/turf/simulated/shuttle/wall/dark{icon_state = "dark0"; name = "Unknown Shuttle"; tag = "icon-dark0"},/area/submap/Blackshuttledown)
+"ak" = (/turf/simulated/floor/outdoors/grass/sif/forest,/turf/simulated/shuttle/wall/dark{icon_state = "dark10"; name = "Unknown Shuttle"; tag = "icon-dark10"},/area/submap/Blackshuttledown)
+"al" = (/obj/machinery/door/airlock/external,/turf/simulated/shuttle/wall/dark{icon_state = "dark0"; name = "Unknown Shuttle"; tag = "icon-dark0"},/area/submap/Blackshuttledown)
+"am" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 4},/turf/simulated/shuttle/wall/dark{icon_state = "dark0"; name = "Unknown Shuttle"; tag = "icon-dark0"},/area/submap/Blackshuttledown)
+"an" = (/obj/structure/shuttle/engine/propulsion{dir = 4; icon_state = "propulsion_l"},/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/Blackshuttledown)
+"ao" = (/obj/machinery/light{dir = 1},/obj/structure/table/rack,/obj/item/clothing/head/helmet/space,/obj/item/clothing/head/helmet/space,/obj/item/clothing/head/helmet/space,/obj/item/clothing/head/helmet/space,/obj/item/clothing/suit/space,/obj/item/clothing/suit/space,/obj/item/clothing/suit/space,/obj/item/clothing/suit/space,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
+"ap" = (/obj/structure/dispenser/oxygen,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
+"aq" = (/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
+"ar" = (/obj/machinery/light/small{dir = 4; pixel_y = 0},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
+"as" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
+"at" = (/obj/machinery/organ_printer/flesh,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
+"au" = (/turf/simulated/floor/tiled/steel,/turf/simulated/shuttle/wall/dark{icon_state = "dark5"; name = "Unknown Shuttle"; tag = "icon-dark5"},/area/submap/Blackshuttledown)
+"av" = (/obj/structure/table/steel,/obj/item/weapon/gun/projectile/automatic/wt550,/obj/item/weapon/gun/projectile/automatic/p90,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
+"aw" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
+"ax" = (/obj/machinery/optable,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
+"ay" = (/obj/machinery/bodyscanner{dir = 8},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
+"az" = (/turf/simulated/floor/tiled/steel,/turf/simulated/shuttle/wall/dark{icon_state = "dark9"; name = "Unknown Shuttle"; tag = "icon-dark9"},/area/submap/Blackshuttledown)
+"aA" = (/turf/simulated/floor/tiled/steel,/turf/simulated/shuttle/wall/dark{icon_state = "dark6"; name = "Unknown Shuttle"; tag = "icon-dark6"},/area/submap/Blackshuttledown)
+"aB" = (/mob/living/simple_animal/hostile/viscerator,/mob/living/simple_animal/hostile/viscerator,/mob/living/simple_animal/hostile/viscerator,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
+"aC" = (/obj/structure/table/steel,/obj/item/weapon/gun/projectile/automatic/c20r,/obj/machinery/light/small{dir = 4; pixel_y = 0},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
+"aD" = (/mob/living/simple_animal/hostile/syndicate/ranged{desc = "Dosen't look friendly in the slightest."; name = "Unknown Individual."; say_got_target = list("Looks like trouble!","Contact!","We've got company!","Perimeter Breached!!"); speak = list("One day the'll fix that damn engine..","Next time, We're hidding on the tropical beach planet.","Wish I had better equipment...","I knew I should have been a line chef...","Fuckin' helmet keeps fogging up.","Hate this blocky ass ship.")},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
+"aE" = (/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
+"aF" = (/obj/structure/table/steel,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
+"aG" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/surgery,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
+"aH" = (/obj/structure/table/standard,/obj/item/weapon/tank/anesthetic,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
+"aI" = (/obj/structure/table/standard,/obj/item/clothing/gloves/sterile,/obj/item/clothing/gloves/sterile,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
+"aJ" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/spray/sterilizine,/obj/item/weapon/reagent_containers/spray/sterilizine,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
+"aK" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/masks,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
+"aL" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
+"aM" = (/obj/structure/bed/chair/office/dark{dir = 1},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
+"aN" = (/obj/machinery/door/airlock/security,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
+"aO" = (/obj/machinery/door/airlock/glass,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
+"aP" = (/turf/simulated/floor/tiled/steel,/turf/simulated/shuttle/wall/dark{icon_state = "dark10"; name = "Unknown Shuttle"; tag = "icon-dark10"},/area/submap/Blackshuttledown)
+"aQ" = (/obj/machinery/computer/communications,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
+"aR" = (/obj/structure/closet/secure_closet/freezer/fridge,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
+"aS" = (/obj/structure/table/steel,/obj/item/weapon/material/knife,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
+"aT" = (/obj/structure/table/steel,/obj/random/toolbox,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
+"aU" = (/obj/structure/table/steel,/obj/machinery/light/small{dir = 4; pixel_y = 0},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
+"aV" = (/obj/structure/window,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
+"aW" = (/obj/item/weapon/stool,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
+"aX" = (/obj/structure/table/steel,/obj/item/pizzabox,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
+"aY" = (/obj/machinery/door/airlock,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
+"aZ" = (/obj/machinery/power/apc{cell_type = /obj/item/weapon/cell/hyper; dir = 4; name = "Unknown APC"; pixel_x = 24},/turf/simulated/shuttle/wall/dark{icon_state = "dark0"; name = "Unknown Shuttle"; tag = "icon-dark0"},/area/submap/Blackshuttledown)
+"ba" = (/obj/machinery/computer/area_atmos,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
+"bb" = (/obj/structure/closet/toolcloset,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
+"bc" = (/obj/machinery/portable_atmospherics/canister/empty/oxygen,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
+"bd" = (/obj/machinery/atmospherics/pipe/tank/oxygen,/obj/machinery/light/small{dir = 4; pixel_y = 0},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
+"be" = (/obj/structure/bed/chair/office/dark,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
+"bf" = (/obj/structure/table/steel,/obj/item/weapon/gun/projectile/automatic/c20r,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
+"bg" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
+"bh" = (/mob/living/simple_animal/hostile/viscerator,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
+"bi" = (/obj/structure/table/steel,/obj/item/weapon/gun/projectile/pistol,/obj/machinery/light/small{dir = 4; pixel_y = 0},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
+"bj" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/obj/structure/bed,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
+"bk" = (/mob/living/simple_animal/hostile/viscerator,/mob/living/simple_animal/hostile/viscerator,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
+"bl" = (/obj/structure/table/steel,/obj/item/weapon/gun/projectile/pistol,/obj/item/weapon/gun/projectile/shotgun/pump,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
+"bm" = (/obj/structure/toilet{dir = 1},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
+"bn" = (/obj/machinery/light,/obj/structure/table/rack,/obj/item/clothing/head/helmet/space,/obj/item/clothing/head/helmet/space,/obj/item/clothing/head/helmet/space,/obj/item/clothing/head/helmet/space,/obj/item/clothing/suit/space,/obj/item/clothing/suit/space,/obj/item/clothing/suit/space,/obj/item/clothing/suit/space,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
+"bo" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/obj/machinery/light,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
+"bp" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/obj/item/toy/plushie/spider,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown)
+"bq" = (/turf/simulated/floor/outdoors/grass/sif/forest,/turf/simulated/shuttle/wall/dark{icon_state = "dark5"; name = "Unknown Shuttle"; tag = "icon-dark5"},/area/submap/Blackshuttledown)
+"br" = (/turf/simulated/floor/outdoors/grass/sif/forest,/turf/simulated/shuttle/wall/dark{icon_state = "dark9"; name = "Unknown Shuttle"; tag = "icon-dark9"},/area/submap/Blackshuttledown)
+
+(1,1,1) = {"
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaabababababacabababababababababababacabababababacabababababababababaa
+aaababababababadababababababababababababababababababababababaeababacaa
+aaabababababababababababababababababababababababababadabababababababaa
+aaababaeabafafafababababaeabababababababababababababababababababababaa
+aaabababababafafafabacababababagagagagagagabababababacabaeabababababaa
+aaababababababafafababababababagahabababagabababababababababababababaa
+aaabababababababaiajajajakababagabababahagabababaeaiajajajajakabababaa
+aaabababababababajajajajajajajajajalalajajajajajajajajajajajamanababaa
+aaababababaeababajajajajajajaoapajaqarajaqaqasaqatajajajajajamanababaa
+aaabababababababauajajaqavajaqaqajawawajaqaxaqaqaqaqayajajazababababaa
+aaabababababababaAajajaBaCajaqaqaqaqaqajaqaqaqaqaDaqaEajazabababababaa
+aaabaeababababaAajaFajaqaFajaqaqaqaqaEajaGaHaqaqaIaJaKajababababaeabaa
+aaabababababaAajaLaMajaNajajaqaqajajajajajajaOajajajajajaPabababababaa
+aaabababababajaQaqaqajaqaqaqaqaqajaRaSaqaqaqaDaqajaTaTaUajaPababababaa
+aaabababababaVaFaqaqajaLaqaqaqaEajaqaqaWaWaWaqaqajaFaqaqaqamanabababaa
+aaabababababaVaFaqaqaOaqaqaqaqaqaOaqaqaXaFaFaqaqaYaqaqaqaqamanabababaa
+aaabababababaVaFaqaqaOaqaqaqaqaqaOaqaqaFaFaFaqaqaYaqaqaqaqamanabababaa
+aaabababababaVaFaqaqajaLaqaqaqaEajaqaqaWaWaWaqaqaZaqaqaqaDamanabababaa
+aaabababababajbaaqaDajaqaqaqaqaqajaFaFaqaqaDaqaqajbbbcbdajazababababaa
+aaabababababauajaLbeajaNajajaqaqajajajajajajaOajajajajajazabababababaa
+aaababababababauajaFajaqbfajaqaqaqaqaEajbgaqaqaqaqaYaqajababababababaa
+aaabaeabababababauajajbhbiajaqaqaqaqaqajbjaqbgaqbgajarajaPabaeabababaa
+aaabababababababaAajajbkblajaqaDajawawajbgaqbgaqbgajbmajajaPababababaa
+aaabababababababajajajajajajbnapajaqarajbgaqboaqbpajajajajamanabababaa
+aaabababababababajajajajajajajajajalalajajajajajajajajajajamanabababaa
+aaababaeababababbqajajajbrababagahabababagabababbqajajajajbrababababaa
+aaabababafabababababaeababababagabababahagababababaeabababafafafababaa
+aaababafafabacababababababababagagagagagagababababacababafafafafababaa
+aaabafafafabababababababadabababababababababababababababafafafafababaa
+aaababafafababacabababababababababababababababababababababafafabababaa
+aaabababababababababaeababababababababacababababaeabababababababababaa
+aaabababaeababababababababababababababababababababababababababaeababaa
+aaababababababababababacababababababababababababadabacaeababababababaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+"}
diff --git a/maps/submaps/surface_submaps/Boombase.dmm b/maps/submaps/surface_submaps/Boombase.dmm
index ed1a2f9f9f4..14d5a3a9360 100644
--- a/maps/submaps/surface_submaps/Boombase.dmm
+++ b/maps/submaps/surface_submaps/Boombase.dmm
@@ -13,6 +13,7 @@
"m" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled/steel,/area/submap/BoomBase)
"n" = (/obj/effect/decal/cleanable/dirt,/obj/effect/spider,/obj/item/weapon/material/shard,/turf/simulated/floor/tiled/steel,/area/submap/BoomBase)
"o" = (/turf/simulated/floor/tiled/steel,/area/submap/BoomBase)
+"p" = (/mob/living/simple_animal/hostile/giant_spider/phorogenic{returns_home = 1},/turf/simulated/floor/tiled/steel,/area/submap/BoomBase)
"p" = (/mob/living/simple_animal/hostile/giant_spider/phorogenic,/turf/simulated/floor/tiled/steel,/area/submap/BoomBase)
"q" = (/obj/machinery/portable_atmospherics/canister/empty/phoron,/turf/simulated/floor/tiled/steel{tag = "icon-steel_dirty"; icon_state = "steel_dirty"},/area/submap/BoomBase)
"r" = (/obj/machinery/portable_atmospherics/canister/empty/phoron,/obj/item/weapon/material/shard,/turf/simulated/floor/tiled/steel{tag = "icon-steel_dirty"; icon_state = "steel_dirty"},/area/submap/BoomBase)
@@ -32,6 +33,7 @@
"F" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled/steel{tag = "icon-burned2"; icon_state = "burned2"},/area/submap/BoomBase)
"G" = (/obj/effect/decal/cleanable/ash,/turf/simulated/floor/outdoors/dirt,/area/submap/BoomBase)
"H" = (/obj/structure/table,/turf/simulated/floor/tiled/steel,/area/submap/BoomBase)
+"I" = (/obj/effect/decal/cleanable/dirt,/mob/living/simple_animal/hostile/giant_spider/phorogenic{returns_home = 1},/turf/simulated/floor/tiled/steel,/area/submap/BoomBase)
"I" = (/obj/effect/decal/cleanable/dirt,/mob/living/simple_animal/hostile/giant_spider/phorogenic,/turf/simulated/floor/tiled/steel,/area/submap/BoomBase)
"J" = (/turf/simulated/floor/tiled/steel{tag = "icon-burned2"; icon_state = "burned2"},/area/submap/BoomBase)
"K" = (/turf/simulated/floor/outdoors/rocks,/area/submap/BoomBase)
@@ -39,6 +41,15 @@
"M" = (/obj/effect/decal/remains/human,/obj/effect/decal/cleanable/ash,/turf/simulated/floor/tiled/steel{tag = "icon-steel_dirty"; icon_state = "steel_dirty"},/area/submap/BoomBase)
"N" = (/obj/item/weapon/material/shard,/turf/simulated/floor/tiled/steel{tag = "icon-steel_dirty"; icon_state = "steel_dirty"},/area/submap/BoomBase)
"O" = (/obj/item/device/transfer_valve,/turf/simulated/floor/outdoors/rocks,/area/submap/BoomBase)
+"P" = (/mob/living/simple_animal/hostile/giant_spider/webslinger{returns_home = 1},/turf/simulated/floor/outdoors/rocks,/area/submap/BoomBase)
+"Q" = (/obj/item/weapon/material/shard,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/BoomBase)
+"R" = (/obj/effect/decal/cleanable/ash,/turf/simulated/floor/plating,/area/submap/BoomBase)
+"S" = (/obj/effect/decal/cleanable/ash,/turf/simulated/floor/tiled/steel,/area/submap/BoomBase)
+"T" = (/obj/effect/spider/stickyweb,/obj/item/weapon/material/shard,/mob/living/simple_animal/hostile/giant_spider/phorogenic{returns_home = 1},/turf/simulated/floor/tiled/steel,/area/submap/BoomBase)
+"U" = (/obj/effect/spider/stickyweb,/turf/simulated/floor/tiled/steel,/area/submap/BoomBase)
+"V" = (/obj/effect/spider/stickyweb,/obj/effect/decal/cleanable/ash,/turf/simulated/floor/tiled/steel{tag = "icon-burned1"; icon_state = "burned1"},/area/submap/BoomBase)
+"W" = (/obj/effect/decal/remains/human,/obj/effect/decal/cleanable/ash,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/BoomBase)
+"X" = (/obj/structure/flora/tree/dead,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/BoomBase)
"P" = (/obj/item/weapon/material/shard,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/BoomBase)
"Q" = (/obj/effect/decal/cleanable/ash,/turf/simulated/floor/plating,/area/submap/BoomBase)
"R" = (/obj/effect/decal/cleanable/ash,/turf/simulated/floor/tiled/steel,/area/submap/BoomBase)
@@ -60,6 +71,14 @@ abbbbemEvfFCuuuuuuuuuuuua
abbbdemmCCCuuuGuuuuuuuuBa
abbbbeHICJuuuuKKuuuuuuuua
abbdbeLMuuuuKKKKKuuuuuuba
+abbbbeoNuuuuuKKOPuuuuuuba
+abbbQeAzuuuuuKKKKuuuubbba
+adbbbeRyuuuuuKuuuuuuubAba
+abbbbfAgbuuuuuuuuuuuuASba
+abbbbbbAbuuuuuuuuuuAAToba
+abbbbbbfAbuuuuuuuuAAUVeba
+abbbbbbAfbuubbbuuuAeeheba
+abWbbbbbXbbbbbbuubbbbbbca
abbbbeoNuuuuuKKOKuuuuuuba
abbbPeAzuuuuuKKKKuuuubbba
adbbbeQyuuuuuKuuuuuuubAba
diff --git a/maps/submaps/surface_submaps/Cragzone1.dmm b/maps/submaps/surface_submaps/Cragzone1.dmm
new file mode 100644
index 00000000000..05911859150
--- /dev/null
+++ b/maps/submaps/surface_submaps/Cragzone1.dmm
@@ -0,0 +1,38 @@
+"a" = (/turf/template_noop,/area/template_noop)
+"b" = (/turf/simulated/floor/outdoors/grass/sif,/area/submap/Cragzone1)
+"c" = (/obj/structure/flora/tree/sif,/turf/simulated/floor/outdoors/grass/sif,/area/submap/Cragzone1)
+"d" = (/turf/simulated/mineral/ignore_mapgen,/area/submap/Cragzone1)
+"e" = (/turf/simulated/floor/outdoors/dirt,/area/submap/Cragzone1)
+
+(1,1,1) = {"
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+abbbbbbbbbbbbbbbbbbbbbbbbbbbba
+abbbcbddbbbbbbcbbbbbbbbbbbbbba
+abcbddddbbbbbbbbbbbbbbdddbbbba
+abbbddddbbbbbbbbbbbbdddddbbbba
+abbbdddbbbbbbbbbcbbbdddddbbcba
+abbbbddbbcbbdbbbbbdbbdddbbbbba
+abbbbbbbbbdddbbbbddbbbbbbbbbba
+abbbbbbbbbddddbbddddbbcbbbbbba
+abbbbbcbbbdddddbddddbbbbbcbbba
+abbbbbbbbbdddddddddddbbbbbbcba
+abbbbbbbbbbbedeeeddebbbbbbbbba
+abcbbbbbbbbbbeeeeeebbbbbdddbba
+abbbbbbbbcbbbbeeeebbbbbbddddba
+abbbddbbbbbbbbbbbbbbbbbbbdddba
+abbbdddebbbbbbbbdbbbbcbbbbbbba
+abbddddeeeebbbbdddbbbbddbbbbba
+abbddddddeeebbbbddbbbddddbbbba
+abbbbbddddeebbbbdbbbbddddbbbba
+abbbbbbdddeebbbbbbbbbbdddbbbba
+abcbbbbbdddebbbbbbbbbbbddbbcba
+abbbbbbbbbdbbbbbbbbbbbbbbbbbba
+abbbcbbbbbbbbbbcbbbbbbbcbbbbba
+abbbbbbbbbbbbbbbbbbddbbbbbbbba
+abbbbbbbbbbbbbdbbbbdddbbbddbba
+abbbbdddbbcbbddbbbddddbbdddbba
+abbbbddddbbbddddbbbdddbbddddba
+abbbbbdddbbbbddbbbbbbbbbbddbba
+abcbbbbbbbbbbbbbcbbbbbbcbbbbba
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+"}
diff --git a/maps/submaps/surface_submaps/DJOutpost1.dmm b/maps/submaps/surface_submaps/DJOutpost1.dmm
new file mode 100644
index 00000000000..15bbc8ae8bd
--- /dev/null
+++ b/maps/submaps/surface_submaps/DJOutpost1.dmm
@@ -0,0 +1,56 @@
+"a" = (/turf/template_noop,/area/template_noop)
+"b" = (/turf/simulated/wall/wood,/area/submap/DJOutpost1)
+"c" = (/obj/structure/grille/broken,/obj/item/weapon/material/shard,/obj/item/weapon/material/shard{tag = "icon-shardmedium"; icon_state = "shardmedium"},/obj/item/stack/rods,/turf/simulated/floor/wood,/area/submap/DJOutpost1)
+"d" = (/obj/structure/grille,/obj/structure/window/reinforced/full,/turf/simulated/floor/wood,/area/submap/DJOutpost1)
+"e" = (/turf/simulated/floor/wood,/area/submap/DJOutpost1)
+"f" = (/obj/machinery/telecomms/relay/preset/ruskie,/turf/simulated/floor/wood,/area/submap/DJOutpost1)
+"g" = (/obj/structure/loot_pile/maint/technical,/turf/simulated/floor/wood,/area/submap/DJOutpost1)
+"h" = (/mob/living/simple_animal/hostile/giant_spider/frost{returns_home = 1},/turf/simulated/floor/wood,/area/submap/DJOutpost1)
+"i" = (/obj/structure/sign/goldenplaque{desc = "An award given to Sif Free Radio for media excellency. It looks fake."; name = "Best Radio Station 2558"; pixel_y = 30},/turf/simulated/floor/wood,/area/submap/DJOutpost1)
+"j" = (/obj/effect/decal/remains,/obj/effect/decal/cleanable/blood,/obj/item/clothing/under/frontier,/obj/item/device/radio/headset/heads/captain/alt{desc = "A headset belonging to a Sif Free Radio DJ. SFR, best tunes in the wilderness."; name = "SFR headset"},/obj/item/weapon/material/hatchet/tacknife/combatknife,/turf/simulated/floor/wood,/area/submap/DJOutpost1)
+"k" = (/obj/machinery/door/airlock/glass,/turf/simulated/floor/wood,/area/submap/DJOutpost1)
+"l" = (/obj/structure/table/steel_reinforced,/obj/item/device/radio/intercom{tag = "icon-intercom (WEST)"; icon_state = "intercom"; dir = 8},/turf/simulated/floor/wood,/area/submap/DJOutpost1)
+"m" = (/obj/machinery/computer/message_monitor,/obj/item/weapon/paper/monitorkey,/turf/simulated/floor/wood,/area/submap/DJOutpost1)
+"n" = (/obj/structure/bed/chair/wood,/turf/simulated/floor/wood,/area/submap/DJOutpost1)
+"o" = (/obj/effect/decal/remains,/obj/item/clothing/under/dress/blacktango,/obj/effect/decal/cleanable/blood,/obj/item/device/universal_translator/ear,/turf/simulated/floor/wood,/area/submap/DJOutpost1)
+"p" = (/obj/structure/bed/chair/office/dark{tag = "icon-officechair_dark (WEST)"; icon_state = "officechair_dark"; dir = 8},/turf/simulated/floor/wood,/area/submap/DJOutpost1)
+"q" = (/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/obj/structure/bed/chair/office/dark{dir = 1},/turf/simulated/floor/wood,/area/submap/DJOutpost1)
+"r" = (/obj/structure/table/woodentable,/obj/item/trash/candle,/turf/simulated/floor/wood,/area/submap/DJOutpost1)
+"s" = (/obj/structure/bed/chair/wood{tag = "icon-wooden_chair (WEST)"; icon_state = "wooden_chair"; dir = 8},/turf/simulated/floor/wood,/area/submap/DJOutpost1)
+"t" = (/obj/structure/bookcase,/obj/item/weapon/book/codex/lore/vir,/obj/item/weapon/book/manual/excavation,/obj/item/weapon/book/manual/engineering_construction,/obj/item/weapon/storage/bible,/turf/simulated/floor/wood,/area/submap/DJOutpost1)
+"u" = (/obj/item/weapon/storage/toolbox/mechanical,/turf/simulated/floor/wood,/area/submap/DJOutpost1)
+"v" = (/obj/structure/table/steel_reinforced,/obj/item/device/radio/phone,/turf/simulated/floor/wood,/area/submap/DJOutpost1)
+"w" = (/obj/structure/table/steel_reinforced,/obj/item/device/radio/intercom,/obj/item/device/multitool,/turf/simulated/floor/wood,/area/submap/DJOutpost1)
+"x" = (/obj/structure/table/steel_reinforced,/obj/item/device/radio,/obj/machinery/power/apc{cell_type = /obj/item/weapon/cell/hyper; dir = 4; environ = 1; equipment = 1; lighting = 1; locked = 0; name = "Sif Free Radio APC"; pixel_x = 24},/turf/simulated/floor/wood,/area/submap/DJOutpost1)
+"y" = (/obj/machinery/biogenerator,/turf/simulated/floor/wood,/area/submap/DJOutpost1)
+"z" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/snacks/unajerky,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/wood,/area/submap/DJOutpost1)
+"A" = (/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/obj/machinery/seed_extractor,/turf/simulated/floor/wood,/area/submap/DJOutpost1)
+"B" = (/obj/structure/bed/chair/wood{tag = "icon-wooden_chair (NORTH)"; icon_state = "wooden_chair"; dir = 1},/turf/simulated/floor/wood,/area/submap/DJOutpost1)
+"C" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/wood,/area/submap/DJOutpost1)
+"D" = (/obj/structure/table/woodentable,/obj/item/weapon/material/hatchet,/obj/item/weapon/reagent_containers/glass/bucket,/obj/item/weapon/material/minihoe,/obj/item/device/analyzer/plant_analyzer,/turf/simulated/floor/wood,/area/submap/DJOutpost1)
+"E" = (/obj/structure/undies_wardrobe,/turf/simulated/floor/wood,/area/submap/DJOutpost1)
+"F" = (/obj/structure/table/rack,/obj/item/clothing/shoes/boots/winter,/obj/item/clothing/suit/storage/hooded/wintercoat,/turf/simulated/floor/wood,/area/submap/DJOutpost1)
+"G" = (/obj/machinery/light/flamp,/turf/simulated/floor/wood,/area/submap/DJOutpost1)
+"H" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 15; tag = "icon-sink (EAST)"},/turf/simulated/floor/wood,/area/submap/DJOutpost1)
+"I" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/clown,/turf/simulated/floor/wood,/area/submap/DJOutpost1)
+"J" = (/obj/structure/table/rack,/obj/item/ammo_magazine/clip/c545/hunter,/obj/item/weapon/gun/projectile/shotgun/pump/rifle,/turf/simulated/floor/wood,/area/submap/DJOutpost1)
+"K" = (/obj/structure/table/rack,/obj/item/device/gps/on{gps_tag = "Sif Free Radio"},/obj/item/device/flashlight/lantern,/turf/simulated/floor/wood,/area/submap/DJOutpost1)
+"L" = (/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor/wood,/area/submap/DJOutpost1)
+
+(1,1,1) = {"
+aaaaaaaaaaaaaaa
+aaabcbbbbbdbaaa
+aabbeebfgfgbbaa
+abbehebeeeeibba
+adehjekeeelemda
+abneeobeeelpqba
+abrsetbeeuvwxba
+abbbbbbkbbbbbba
+abneeeeeeeeeyba
+abzeeeeeeeeeAba
+adBeebbCbbeeDda
+abbEebFeGbeHbba
+aabbIbJeKbLbbaa
+aaabdbbCbbdbaaa
+aaaaaaaaaaaaaaa
+"}
diff --git a/maps/submaps/surface_submaps/Lab1.dmm b/maps/submaps/surface_submaps/Lab1.dmm
new file mode 100644
index 00000000000..f0da00f9a30
--- /dev/null
+++ b/maps/submaps/surface_submaps/Lab1.dmm
@@ -0,0 +1,62 @@
+"a" = (/turf/template_noop,/area/template_noop)
+"b" = (/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/Lab1)
+"c" = (/turf/simulated/wall/r_wall,/area/submap/Lab1)
+"d" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/submap/Lab1)
+"e" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/submap/Lab1)
+"f" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/submap/Lab1)
+"g" = (/obj/machinery/space_heater,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1)
+"h" = (/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1)
+"i" = (/obj/machinery/door/airlock,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1)
+"j" = (/obj/machinery/light/small,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1)
+"k" = (/obj/structure/table/standard,/obj/item/weapon/storage/toolbox,/obj/random/tool,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1)
+"l" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1)
+"m" = (/obj/structure/table/standard,/obj/random/tool,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1)
+"n" = (/obj/machinery/vending/tool,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1)
+"o" = (/obj/structure/table/rack,/obj/item/clothing/suit/storage/hooded/wintercoat,/obj/item/clothing/shoes/boots/winter,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1)
+"p" = (/obj/structure/table/rack,/obj/item/clothing/suit/storage/hooded/wintercoat,/obj/item/clothing/shoes/boots/winter,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1)
+"q" = (/obj/structure/table/standard,/obj/random/toolbox,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1)
+"r" = (/obj/structure/closet/toolcloset,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1)
+"s" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1)
+"t" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1)
+"u" = (/obj/machinery/power/apc{cell_type = /obj/item/weapon/cell/hyper; dir = 8; name = "Unknown APC"; pixel_x = -24},/turf/simulated/wall/r_wall,/area/submap/Lab1)
+"v" = (/obj/structure/table/standard,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1)
+"w" = (/obj/structure/table/standard,/obj/item/device/flashlight/lamp,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1)
+"x" = (/obj/machinery/vending/hydronutrients,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1)
+"y" = (/obj/machinery/vending/hydroseeds,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1)
+"z" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1)
+"A" = (/obj/structure/table/standard,/obj/item/weapon/storage/toolbox/mechanical,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1)
+"B" = (/obj/structure/table/standard,/obj/fiftyspawner/steel,/obj/fiftyspawner/glass,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1)
+"C" = (/obj/structure/table/standard,/obj/item/device/multitool,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1)
+"D" = (/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1)
+"E" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1)
+"F" = (/obj/machinery/pros_fabricator,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1)
+"G" = (/obj/machinery/portable_atmospherics/hydroponics,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1)
+"H" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1)
+"I" = (/obj/item/weapon/storage/bag/circuits,/obj/structure/table/standard,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1)
+"J" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1)
+"K" = (/obj/item/robot_parts/chest,/obj/item/robot_parts/l_arm,/obj/item/robot_parts/r_arm,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1)
+"L" = (/obj/structure/closet/crate/hydroponics,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1)
+"M" = (/obj/structure/closet/secure_closet/hydroponics,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1)
+
+(1,1,1) = {"
+aaaaaaaaaaaaaaaaaaaa
+abbbbbbbbbbbbbbbbbba
+acdefcdeeeeeefcdefca
+acghhihhjhhjhhihhhca
+ackhgcdfcllcdfchhhca
+acmhncbbchhcbbcohpca
+acqhrcbbcshcbbcthtca
+achhhubbchhcbbcvhwca
+acdefcbbcllcbbcdefca
+abbbbbbbbbbbbbbbbbba
+abbbbbbbbbbbbbbbbbba
+acdefcbbcllcbbcdefca
+achxycbbchzcbbcABCca
+acDhhcbbchhcbbcEhFca
+acGhHcdfcllcdfchhIca
+acDhhihhJhhJhhihhKca
+acLMvcdeeeeeefchhhca
+acdefcbbbbbbbbcdefca
+abbbbbbbbbbbbbbbbbba
+aaaaaaaaaaaaaaaaaaaa
+"}
diff --git a/maps/submaps/surface_submaps/MCamp1.dmm b/maps/submaps/surface_submaps/MCamp1.dmm
index 245d012a21c..0cc82101728 100644
--- a/maps/submaps/surface_submaps/MCamp1.dmm
+++ b/maps/submaps/surface_submaps/MCamp1.dmm
@@ -13,6 +13,27 @@
"m" = (/turf/simulated/floor,/area/submap/MilitaryCamp1)
"n" = (/obj/item/weapon/material/shard,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/MilitaryCamp1)
"o" = (/obj/structure/table/standard,/turf/simulated/floor/tiled/steel,/area/submap/MilitaryCamp1)
+"p" = (/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/turf/simulated/floor/tiled/steel,/area/submap/MilitaryCamp1)
+"q" = (/obj/effect/mine,/turf/simulated/floor,/area/submap/MilitaryCamp1)
+"r" = (/obj/structure/table/standard,/obj/item/weapon/gun/energy/gun,/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/turf/simulated/floor/tiled/steel,/area/submap/MilitaryCamp1)
+"s" = (/obj/structure/table/standard,/obj/item/weapon/gun/projectile/automatic/c20r,/turf/simulated/floor/tiled/steel,/area/submap/MilitaryCamp1)
+"t" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/syndie_kit/space,/turf/simulated/floor/tiled/steel,/area/submap/MilitaryCamp1)
+"u" = (/turf/simulated/floor/tiled/steel,/area/submap/MilitaryCamp1)
+"v" = (/obj/machinery/door/airlock,/turf/simulated/floor/tiled/steel,/area/submap/MilitaryCamp1)
+"w" = (/mob/living/simple_animal/hostile/viscerator,/turf/simulated/floor/tiled/steel,/area/submap/MilitaryCamp1)
+"x" = (/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/turf/simulated/floor/tiled/steel,/area/submap/MilitaryCamp1)
+"y" = (/obj/effect/decal/cleanable/blood,/turf/simulated/floor/tiled/steel,/area/submap/MilitaryCamp1)
+"z" = (/obj/structure/girder,/turf/simulated/floor,/area/submap/MilitaryCamp1)
+"A" = (/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/MilitaryCamp1)
+"B" = (/obj/machinery/computer/security,/turf/simulated/floor/tiled/steel,/area/submap/MilitaryCamp1)
+"C" = (/obj/machinery/computer/message_monitor,/turf/simulated/floor/holofloor/tiled,/area/submap/MilitaryCamp1)
+"D" = (/obj/machinery/light,/turf/simulated/floor/tiled/steel,/area/submap/MilitaryCamp1)
+"E" = (/obj/structure/flora/tree/dead,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/MilitaryCamp1)
+"F" = (/obj/structure/door_assembly,/turf/simulated/floor/tiled/steel,/area/submap/MilitaryCamp1)
+"G" = (/obj/structure/table/standard,/obj/random/toolbox,/turf/simulated/floor/tiled/steel,/area/submap/MilitaryCamp1)
+"H" = (/obj/machinery/light,/obj/structure/table/standard,/turf/simulated/floor/tiled/steel,/area/submap/MilitaryCamp1)
+"I" = (/obj/machinery/door/airlock,/turf/simulated/floor,/area/submap/MilitaryCamp1)
+"J" = (/obj/effect/mine,/turf/template_noop,/area/submap/MilitaryCamp1)
"p" = (/turf/simulated/floor/tiled/steel,/area/submap/MilitaryCamp1)
"q" = (/obj/effect/mine,/turf/simulated/floor,/area/submap/MilitaryCamp1)
"r" = (/obj/structure/table/standard,/obj/item/weapon/gun/energy/gun,/turf/simulated/floor/tiled/steel,/area/submap/MilitaryCamp1)
@@ -40,6 +61,18 @@ adccddeddijdddcckiba
adiddjllmlllmlncddda
abdddlllmmllllldedea
abbellopqmplrslldfda
+abbdlltmmmuvwxllddda
+abdnlllllyullllzAeda
+adddmlplBuuClullddda
+agedmluvDppDvplldeda
+adddzlullllllulzdEda
+addAllyuuuFuuullddda
+aEddllGouuuuHollndga
+addfdllllImlllldedda
+abedddlllmmllldcceda
+abcddddlldnlldkcddba
+achceddddedjddchibba
+abccfbJdigddeccdbbba
abbdlltmmmpuvpllddda
abdnlllllwpllllxdeda
adddmlplyppzlpllddda
diff --git a/maps/submaps/surface_submaps/Rocky4.dmm b/maps/submaps/surface_submaps/Rocky4.dmm
new file mode 100644
index 00000000000..c95fb291a47
--- /dev/null
+++ b/maps/submaps/surface_submaps/Rocky4.dmm
@@ -0,0 +1,24 @@
+"a" = (/turf/template_noop,/area/template_noop)
+"b" = (/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/Rocky4)
+"c" = (/turf/simulated/mineral/ignore_mapgen,/area/submap/Rocky4)
+"d" = (/obj/structure/flora/tree/sif,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/Rocky4)
+"e" = (/turf/simulated/floor/outdoors/rocks,/area/submap/Rocky4)
+"f" = (/turf/simulated/floor/water,/area/submap/Rocky4)
+
+(1,1,1) = {"
+aaaaaaaaaaaaaaaaaaaa
+abbbbbbccbbbbbbbbbba
+abbbbcccccbbdbbbbdba
+abbbbcccccccbbbbbbba
+abbbbbbcccccbbbbbbba
+abdbbbbbbbbbbbbbbbba
+abbbbeeebbbbbbbccbba
+abbbeefeeeeebdbccbba
+abbbefffffeebbccccba
+abbeeffffffebcccccba
+abceeffffeeebcccccba
+abccceeeeebbbbcccbba
+abccccbbbbbbbbccbbba
+adbcccbbbbbbdbbbbbda
+aaaaaaaaaaaaaaaaaaaa
+"}
diff --git a/maps/submaps/surface_submaps/Snowrock1.dmm b/maps/submaps/surface_submaps/Snowrock1.dmm
index 6b46258e3cc..4d255218394 100644
--- a/maps/submaps/surface_submaps/Snowrock1.dmm
+++ b/maps/submaps/surface_submaps/Snowrock1.dmm
@@ -2,6 +2,10 @@
"b" = (/turf/template_noop,/area/submap/SnowR1)
"c" = (/turf/simulated/mineral/ignore_mapgen,/area/submap/SnowR1)
"d" = (/obj/structure/flora/tree/sif,/turf/template_noop,/area/submap/SnowR1)
+"e" = (/obj/structure/loot_pile/maint,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/SnowR1)
+"f" = (/obj/structure/closet/crate/trashcart,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/SnowR1)
+"g" = (/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/SnowR1)
+"h" = (/obj/random/trash,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/SnowR1)
"e" = (/obj/structure/loot_pile/surface,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/SnowR1)
"f" = (/obj/structure/closet/crate/trashcart,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/SnowR1)
"g" = (/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/SnowR1)
@@ -16,6 +20,19 @@ abbbbbbccccccbbbdbba
abdbbbccccccccbbbbba
abbbbbcccccccccbbbba
abbbbcccefghhcccbbba
+abbccccchggggcccbbba
+abbcccccggggbbbbbbba
+abbccbbbbbbbbbbdbbba
+abbcbbbbbbbbbbbbbbba
+abbbbbbbbbbbbbbbbbba
+abbbbbbbbbdbbbbbbbba
+abbbdbbbbbbbbbbbbbba
+abbbbbbbbbbcccccbbba
+abbbbbbbccccccccbbba
+abbbccccccccccccbbba
+abbbbbcccccccbcbbbba
+abbbbbbbbbbbbbbbbdba
+abdbbbbbbbbbbbbbbbba
abbccccchggggcccibba
abbcccccggggiiiiiiba
abbcciiiiiiiiiijiiba
diff --git a/maps/submaps/surface_submaps/forest.dm b/maps/submaps/surface_submaps/forest.dm
index a0d79f787a2..49d5e7b2e17 100644
--- a/maps/submaps/surface_submaps/forest.dm
+++ b/maps/submaps/surface_submaps/forest.dm
@@ -16,6 +16,10 @@
#include "Snowrock1.dmm"
#include "Boombase.dmm"
#include "Epod.dmm"
+#include "Blackshuttledown.dmm"
+#include "Lab1.dmm"
+#include "Rocky4.dmm"
+#include "DJOutpost1.dmm"
#endif
@@ -106,3 +110,34 @@
desc = "A vacant Emergency pod in the middle of nowhere."
mappath = 'maps/submaps/surface_submaps/Epod.dmm'
cost = 5
+
+/datum/map_template/surface/BSD
+ name = "Black Shuttle Down"
+ desc = "You REALLY shouldn't be near this."
+ mappath = 'maps/submaps/surface_submaps/Blackshuttledown.dmm'
+ cost = 30
+
+/datum/map_template/surface/Cragzone1
+ name = "Cragzone1"
+ desc = "Rocks and more rocks."
+ mappath = 'maps/submaps/surface_submaps/Cragzone1.dmm'
+ cost = 5
+ allow_duplicates = TRUE
+
+/datum/map_template/surface/Lab1
+ name = "Lab1"
+ desc = "An isolated small robotics lab."
+ mappath = 'maps/submaps/surface_submaps/Lab1.dmm'
+ cost = 5
+
+/datum/map_template/surface/Rocky4
+ name = "Rocky4"
+ desc = "An interesting geographic formation."
+ mappath = 'maps/submaps/surface_submaps/Rocky4.dmm'
+ cost = 5
+
+/datum/map_template/surface/DJOutpost1
+ name = "DJOutpost1"
+ desc = "Home of Sif Free Radio, the best - and only - radio station for miles around."
+ mappath = 'maps/submaps/surface_submaps/DJOutpost1.dmm'
+ cost = 5
\ No newline at end of file
diff --git a/maps/submaps/surface_submaps/forest_areas.dm b/maps/submaps/surface_submaps/forest_areas.dm
index 5dff7e9d23c..2a7972b8d7b 100644
--- a/maps/submaps/surface_submaps/forest_areas.dm
+++ b/maps/submaps/surface_submaps/forest_areas.dm
@@ -44,3 +44,17 @@
/area/submap/Epod1
name = "Epod1"
+/area/submap/Blackshuttledown
+ name = "BSD"
+
+/area/submap/Cragzone1
+ name = "Craggy1"
+
+/area/submap/Lab1
+ name = "Lab1"
+
+/area/submap/Rocky4
+ name = "Rocky4"
+
+/area/submap/DJOutpost1
+ name = "DJOutpost1"
\ No newline at end of file
diff --git a/polaris.dme b/polaris.dme
index 4b5d3f72d76..20c4844f0c7 100644
--- a/polaris.dme
+++ b/polaris.dme
@@ -1990,6 +1990,7 @@
#include "code\modules\power\fusion\fusion_circuits.dm"
#include "code\modules\power\fusion\fusion_particle_catcher.dm"
#include "code\modules\power\fusion\fusion_reactions.dm"
+#include "code\modules\power\fusion\fusion_reagents.dm"
#include "code\modules\power\fusion\core\_core.dm"
#include "code\modules\power\fusion\core\core_control.dm"
#include "code\modules\power\fusion\core\core_field.dm"