diff --git a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm
index 864981494ac..5a880549b8a 100644
--- a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm
@@ -2017,7 +2017,7 @@
/obj/machinery/vending/sustenance{
desc = "A vending machine normally reserved for work camps.";
name = "\improper sustenance vendor";
- product_slogans = "Enjoy your meal.;Enough calories to support any worker."
+ slogan_list = list("Enjoy your meal.","Enough calories to support any worker.")
},
/turf/simulated/floor/plasteel{
icon_state = "floorgrime"
diff --git a/_maps/map_files/RandomRuins/SpaceRuins/abandonedzoo.dmm b/_maps/map_files/RandomRuins/SpaceRuins/abandonedzoo.dmm
index 62a22425926..43aa3cd98c7 100644
--- a/_maps/map_files/RandomRuins/SpaceRuins/abandonedzoo.dmm
+++ b/_maps/map_files/RandomRuins/SpaceRuins/abandonedzoo.dmm
@@ -832,6 +832,10 @@
/obj/item/shard,
/turf/space,
/area/space/nearstation)
+"Hv" = (
+/obj/item/gps/ruin,
+/turf/simulated/wall/r_wall,
+/area/ruin/unpowered)
(1,1,1) = {"
aa
@@ -973,7 +977,7 @@ aa
at
at
aF
-at
+Hv
aU
ay
ay
diff --git a/_maps/map_files/RandomRuins/SpaceRuins/listeningpost.dmm b/_maps/map_files/RandomRuins/SpaceRuins/listeningpost.dmm
index 22d4c0798aa..17d49d666bc 100644
--- a/_maps/map_files/RandomRuins/SpaceRuins/listeningpost.dmm
+++ b/_maps/map_files/RandomRuins/SpaceRuins/listeningpost.dmm
@@ -269,6 +269,10 @@
icon_state = "freezerfloor"
},
/area/ruin/powered)
+"Y" = (
+/obj/item/gps/ruin,
+/turf/simulated/wall/r_wall,
+/area/ruin/powered)
(1,1,1) = {"
a
@@ -960,7 +964,7 @@ b
f
f
p
-f
+Y
f
f
j
diff --git a/_maps/map_files/RandomRuins/SpaceRuins/mechtransport.dmm b/_maps/map_files/RandomRuins/SpaceRuins/mechtransport.dmm
index 2a5c0eae533..b4e36942d6a 100644
--- a/_maps/map_files/RandomRuins/SpaceRuins/mechtransport.dmm
+++ b/_maps/map_files/RandomRuins/SpaceRuins/mechtransport.dmm
@@ -240,6 +240,13 @@
/obj/structure/shuttle/engine/propulsion,
/turf/simulated/shuttle/plating,
/area/ruin/powered)
+"U" = (
+/obj/item/gps/ruin,
+/turf/simulated/shuttle/wall{
+ tag = "icon-swall12";
+ icon_state = "swall12"
+ },
+/area/ruin/powered)
(1,1,1) = {"
a
@@ -313,7 +320,7 @@ a
c
g
l
-q
+U
r
u
t
diff --git a/_maps/map_files/cyberiad/z2.dmm b/_maps/map_files/cyberiad/z2.dmm
index 3e98b178dab..a4baee09320 100644
--- a/_maps/map_files/cyberiad/z2.dmm
+++ b/_maps/map_files/cyberiad/z2.dmm
@@ -5011,6 +5011,20 @@
name = "grass"
},
/area/centcom/control)
+"nc" = (
+/obj/machinery/door/airlock/centcom{
+ name = "Gamma Armory";
+ opacity = 1;
+ req_access_txt = "114"
+ },
+/obj/machinery/door/poddoor/impassable{
+ id_tag = "CCGAMMA";
+ name = "Gamma Security"
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/centcom/gamma)
"nd" = (
/obj/structure/flora/ausbushes/lavendergrass,
/turf/unsimulated/floor{
@@ -5386,7 +5400,7 @@
},
/area/syndicate_mothership)
"nQ" = (
-/obj/machinery/door/poddoor{
+/obj/machinery/door/poddoor/impassable{
id_tag = "GRAVPULTS";
name = "Gravity Catapults"
},
@@ -5396,7 +5410,7 @@
},
/area/centcom/specops)
"nR" = (
-/obj/machinery/door/poddoor{
+/obj/machinery/door/poddoor/impassable{
id_tag = "GRAVPULTS";
name = "Gravity Catapults"
},
@@ -5413,7 +5427,7 @@
},
/area/syndicate_mothership)
"nT" = (
-/obj/machinery/door/poddoor{
+/obj/machinery/door/poddoor/impassable{
id_tag = "ASSAULT";
name = "Assault Armor"
},
@@ -5859,7 +5873,7 @@
},
/area/centcom/gamma)
"oR" = (
-/obj/machinery/door/poddoor{
+/obj/machinery/door/poddoor/impassable{
id_tag = "SPECOPS";
name = "Ready Room"
},
@@ -5984,7 +5998,7 @@
opacity = 1;
req_access_txt = "114"
},
-/obj/machinery/door/poddoor{
+/obj/machinery/door/poddoor/impassable{
id_tag = "specopsoffice";
name = "Super Privacy Shutters"
},
@@ -6123,7 +6137,7 @@
/turf/simulated/floor/mech_bay_recharge_floor,
/area/shuttle/gamma/space)
"pv" = (
-/obj/machinery/door/poddoor{
+/obj/machinery/door/poddoor/impassable{
id_tag = "CCTELE";
name = "Specops Teleporter"
},
@@ -6370,7 +6384,7 @@
/area/centcom/specops)
"pX" = (
/obj/machinery/door_control{
- desc = "A remote control switch to block view of the singularity.";
+ desc = "A remote control switch to connect the ready room to the rest of Centcom.";
icon_state = "doorctrl0";
id = "SPECOPS";
name = "Ready Room";
@@ -29647,7 +29661,7 @@ fm
fm
md
md
-oO
+nc
fm
pv
sX
diff --git a/_maps/map_files/cyberiad/z6.dmm b/_maps/map_files/cyberiad/z6.dmm
index 09453cfe542..6cbb87b6f80 100644
--- a/_maps/map_files/cyberiad/z6.dmm
+++ b/_maps/map_files/cyberiad/z6.dmm
@@ -761,7 +761,7 @@
/area/derelict/bridge)
"bK" = (
/obj/machinery/vending/cigarette/free{
- product_slogans = "Just remember! No capitalist.;Best enjoyed with Vodka!.;Smoke!;Nine out of ten USSP scientists agree, smoking reduces stress!;There's no cigarette like a Russian cigarette!;Cigarettes! Now with 100% less capitalism."
+ slogan_list = list("Just remember! No capitalist.","Best enjoyed with Vodka!.","Smoke!","Nine out of ten USSP scientists agree, smoking reduces stress!","There's no cigarette like a Russian cigarette!","Cigarettes! Now with 100% less capitalism.")
},
/turf/simulated/floor/plasteel{
dir = 9;
@@ -1441,7 +1441,7 @@
pixel_y = 32
},
/obj/machinery/vending/cigarette/free{
- product_slogans = "Just remember! No capitalist.;Best enjoyed with Vodka!.;Smoke!;Nine out of ten USSP scientists agree, smoking reduces stress!;There's no cigarette like a Russian cigarette!;Cigarettes! Now with 100% less capitalism."
+ slogan_list = list("Just remember! No capitalist.","Best enjoyed with Vodka!.","Smoke!","Nine out of ten USSP scientists agree, smoking reduces stress!","There's no cigarette like a Russian cigarette!","Cigarettes! Now with 100% less capitalism.")
},
/obj/effect/decal/cleanable/dirt,
/turf/simulated/floor/plasteel{
@@ -4163,7 +4163,7 @@
name = "suspicious button"
},
/obj/machinery/vending/cigarette/free{
- product_slogans = "Just remember! No capitalist.;Best enjoyed with Vodka!.;Smoke!;Nine out of ten USSP scientists agree, smoking reduces stress!;There's no cigarette like a Russian cigarette!;Cigarettes! Now with 100% less capitalism."
+ slogan_list = list("Just remember! No capitalist.","Best enjoyed with Vodka!.","Smoke!","Nine out of ten USSP scientists agree, smoking reduces stress!","There's no cigarette like a Russian cigarette!","Cigarettes! Now with 100% less capitalism.")
},
/turf/simulated/floor/wood{
broken = 1;
@@ -5186,7 +5186,7 @@
"kW" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/vending/cigarette/free{
- product_slogans = "Just remember! No capitalist.;Best enjoyed with Vodka!.;Smoke!;Nine out of ten USSP scientists agree, smoking reduces stress!;There's no cigarette like a Russian cigarette!;Cigarettes! Now with 100% less capitalism."
+ slogan_list = list("Just remember! No capitalist.","Best enjoyed with Vodka!.","Smoke!","Nine out of ten USSP scientists agree, smoking reduces stress!","There's no cigarette like a Russian cigarette!","Cigarettes! Now with 100% less capitalism.")
},
/turf/simulated/floor/plasteel{
dir = 5;
@@ -6363,7 +6363,7 @@
icon_state = "sink";
pixel_x = 12
},
-/turf/simulated/floor/mineral/plasma,
+/turf/simulated/floor/mineral/silver,
/area/syndicate_depot/core)
"of" = (
/obj/structure/closet/secure_closet/syndicate/depot,
@@ -6448,26 +6448,9 @@
icon_state = "wood"
},
/area/derelict/crew_quarters)
-"oo" = (
-/obj/effect/spawner/random_spawners/syndicate/layout/door/secret,
-/turf/simulated/floor/plasteel{
- icon_state = "dark"
- },
-/area/syndicate_depot/core)
"op" = (
/turf/simulated/floor/mineral/silver,
/area/syndicate_depot/core)
-"oq" = (
-/obj/machinery/door/airlock/plasma{
- welded = 1
- },
-/turf/simulated/floor/plasteel{
- icon_state = "dark"
- },
-/area/syndicate_depot/core)
-"or" = (
-/turf/simulated/floor/mineral/plasma,
-/area/syndicate_depot/core)
"os" = (
/obj/structure/table,
/obj/effect/spawner/random_spawners/syndicate/loot/stetchkin,
@@ -6543,7 +6526,7 @@
/area/syndicate_depot/core)
"oB" = (
/obj/effect/spawner/random_spawners/syndicate/mob,
-/turf/simulated/floor/mineral/plasma,
+/turf/simulated/floor/mineral/silver,
/area/syndicate_depot/core)
"oC" = (
/obj/effect/landmark{
@@ -6706,27 +6689,14 @@
icon_state = "dark"
},
/area/syndicate_depot/core)
-"oZ" = (
-/obj/structure/mirror{
- pixel_x = -32
- },
-/turf/simulated/floor/mineral/plasma,
-/area/syndicate_depot/core)
"pa" = (
/obj/structure/toilet{
dir = 8
},
/turf/simulated/floor/mineral/silver,
/area/syndicate_depot/core)
-"pb" = (
-/obj/machinery/portable_atmospherics/canister/toxins,
-/turf/simulated/floor/plasteel{
- icon_state = "dark"
- },
-/area/syndicate_depot/core)
"pc" = (
/obj/machinery/light,
-/obj/effect/spawner/random_spawners/syndicate/loot/level3,
/turf/simulated/floor/plasteel{
icon_state = "dark"
},
@@ -9114,7 +9084,7 @@
})
"tY" = (
/obj/machinery/vending/cigarette/free{
- product_slogans = "Just remember! No capitalist.;Best enjoyed with Vodka!.;Smoke!;Nine out of ten USSP scientists agree, smoking reduces stress!;There's no cigarette like a Russian cigarette!;Cigarettes! Now with 100% less capitalism."
+ slogan_list = list("Just remember! No capitalist.","Best enjoyed with Vodka!.","Smoke!","Nine out of ten USSP scientists agree, smoking reduces stress!","There's no cigarette like a Russian cigarette!","Cigarettes! Now with 100% less capitalism.")
},
/turf/simulated/floor/plasteel{
icon_state = "bar"
@@ -10678,7 +10648,7 @@
/area/derelict/arrival)
"xe" = (
/obj/machinery/vending/cigarette/free{
- product_slogans = "Just remember! No capitalist.;Best enjoyed with Vodka!.;Smoke!;Nine out of ten USSP scientists agree, smoking reduces stress!;There's no cigarette like a Russian cigarette!;Cigarettes! Now with 100% less capitalism."
+ slogan_list = list("Just remember! No capitalist.","Best enjoyed with Vodka!.","Smoke!","Nine out of ten USSP scientists agree, smoking reduces stress!","There's no cigarette like a Russian cigarette!","Cigarettes! Now with 100% less capitalism.")
},
/turf/simulated/floor/plasteel{
dir = 2;
@@ -11582,10 +11552,10 @@
},
/area/space/nearstation)
"zR" = (
-/obj/machinery/portable_atmospherics/canister/toxins,
/obj/machinery/light/small{
dir = 1
},
+/obj/effect/decal/cleanable/blood,
/turf/simulated/floor/plasteel{
icon_state = "dark"
},
@@ -57707,7 +57677,7 @@ of
ot
mA
mA
-pb
+nX
pi
mA
py
@@ -59251,7 +59221,7 @@ oE
oR
oE
oz
-pb
+mA
mA
mA
mm
@@ -61558,7 +61528,7 @@ mm
mB
mm
mm
-oo
+mm
mm
lV
mA
@@ -61816,7 +61786,7 @@ mA
zP
mm
zR
-oo
+mm
oL
ns
mA
@@ -62072,7 +62042,7 @@ mA
mA
mt
mm
-oq
+mm
mm
mm
mm
@@ -62332,7 +62302,7 @@ mm
op
oB
oM
-oZ
+oM
ob
mA
pu
@@ -62586,7 +62556,7 @@ zP
mA
mA
ob
-or
+op
nJ
oe
pa
diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm
index 2b9e2c56b4d..8021fa4452d 100644
--- a/code/__DEFINES/role_preferences.dm
+++ b/code/__DEFINES/role_preferences.dm
@@ -48,7 +48,7 @@
//Missing assignment means it's not a gamemode specific role, IT'S NOT A BUG OR ERROR.
//The gamemode specific ones are just so the gamemodes can query whether a player is old enough
//(in game days played) to play that role
-var/global/list/special_roles = list(
+GLOBAL_LIST_INIT(special_roles, list(
ROLE_ABDUCTOR = /datum/game_mode/abduction, // Abductor
ROLE_BLOB = /datum/game_mode/blob, // Blob
ROLE_CHANGELING = /datum/game_mode/changeling, // Changeling
@@ -72,10 +72,10 @@ var/global/list/special_roles = list(
ROLE_VAMPIRE = /datum/game_mode/vampire, // Vampire
ROLE_RAIDER = /datum/game_mode/heist, // Vox raider
ROLE_ALIEN, // Xenomorph
- ROLE_WIZARD = /datum/game_mode/wizard, // Wizard
+ ROLE_WIZARD = /datum/game_mode/wizard // Wizard
// UNUSED/BROKEN ANTAGS
// ROLE_HOG_GOD = /datum/game_mode/hand_of_god,
// ROLE_HOG_CULTIST = /datum/game_mode/hand_of_god,
// ROLE_MONKEY = /datum/game_mode/monkey, Sooner or later these are going to get ported
-// ROLE_GANG = /datum/game_mode/gang,
-)
+// ROLE_GANG = /datum/game_mode/gang
+))
diff --git a/code/__HELPERS/names.dm b/code/__HELPERS/names.dm
index d702c073b86..29e0f9b52b9 100644
--- a/code/__HELPERS/names.dm
+++ b/code/__HELPERS/names.dm
@@ -19,10 +19,10 @@ GLOBAL_VAR(command_name)
/proc/command_name()
return GLOB.using_map.dock_name
-var/religion_name = null
+GLOBAL_VAR(religion_name)
/proc/religion_name()
- if(religion_name)
- return religion_name
+ if(GLOB.religion_name)
+ return GLOB.religion_name
var/name = ""
diff --git a/code/_globalvars/lists/reagents.dm b/code/_globalvars/lists/reagents.dm
index 20620d60800..abd878ff936 100644
--- a/code/_globalvars/lists/reagents.dm
+++ b/code/_globalvars/lists/reagents.dm
@@ -64,3 +64,5 @@ GLOBAL_LIST_INIT(safe_chem_list, list("antihol", "charcoal", "epinephrine", "ins
"omnizine", "stimulants", "synaptizine", "potass_iodide", "oculine", "mannitol", "styptic_powder",
"spaceacillin", "salglu_solution", "sal_acid", "cryoxadone", "blood", "synthflesh", "hydrocodone",
"mitocholide", "rezadone"))
+
+GLOBAL_LIST_INIT(safe_chem_applicator_list, list("silver_sulfadiazine", "styptic_powder", "synthflesh"))
diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm
index 6bfd72413de..20e50bb3054 100644
--- a/code/_onclick/click.dm
+++ b/code/_onclick/click.dm
@@ -261,12 +261,12 @@
if(incapacitated())
return
var/face_dir = get_cardinal_dir(src, A)
- if(forced_look == face_dir)
+ if(!face_dir || forced_look == face_dir || A == src)
forced_look = null
- to_chat(src, "You are no longer facing any direction.")
+ to_chat(src, "Cancelled direction lock.")
return
forced_look = face_dir
- to_chat(src, "You are now facing [dir2text(forced_look)].")
+ to_chat(src, "You are now facing [dir2text(forced_look)]. To cancel this, shift-middleclick yourself.")
/*
Middle shift-control-click
@@ -274,12 +274,12 @@
*/
/mob/proc/MiddleShiftControlClickOn(atom/A)
var/face_uid = A.UID()
- if(forced_look == face_uid)
+ if(forced_look == face_uid || A == src)
forced_look = null
- to_chat(src, "You are no longer facing [A].")
+ to_chat(src, "Cancelled direction lock.")
return
forced_look = face_uid
- to_chat(src, "You are now facing [A].")
+ to_chat(src, "You are now facing [A]. To cancel this, shift-middleclick yourself.")
// In case of use break glass
/*
diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index d2a91da4020..e27002cf118 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -58,7 +58,7 @@
else
return 1
var/obj/item/organ/external/O = M.get_organ(user.zone_selected)
- if((is_sharp(src) || (isscrewdriver(src) && O.is_robotic())) && user.a_intent == INTENT_HELP)
+ if((is_sharp(src) || (isscrewdriver(src) && O?.is_robotic())) && user.a_intent == INTENT_HELP)
if(!attempt_initiate_surgery(src, M, user))
return FALSE
else
diff --git a/code/controllers/master.dm b/code/controllers/master.dm
index f64e566e097..a6026823ec9 100644
--- a/code/controllers/master.dm
+++ b/code/controllers/master.dm
@@ -146,7 +146,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
msg = "The [BadBoy.name] subsystem was the last to fire for 2 controller restarts. It will be recovered now and disabled if it happens again."
FireHim = TRUE
if(3)
- msg = "The [BadBoy.name] subsystem seems to be destabilizing the MC and will be offlined."
+ msg = "The [BadBoy.name] subsystem seems to be destabilizing the MC and will be offlined. The following implications are now in effect: [BadBoy.offline_implications]"
BadBoy.flags |= SS_NO_FIRE
if(msg)
to_chat(GLOB.admins, "[msg]")
diff --git a/code/controllers/subsystem.dm b/code/controllers/subsystem.dm
index f257f2b4895..4a125003389 100644
--- a/code/controllers/subsystem.dm
+++ b/code/controllers/subsystem.dm
@@ -35,6 +35,8 @@
var/static/list/failure_strikes //How many times we suspect a subsystem type has crashed the MC, 3 strikes and you're out!
+ var/offline_implications = "None" // What are the implications of this SS being offlined?
+
//Do not override
///datum/controller/subsystem/New()
diff --git a/code/controllers/subsystem/acid.dm b/code/controllers/subsystem/acid.dm
index 40063b00a87..119d82113d7 100644
--- a/code/controllers/subsystem/acid.dm
+++ b/code/controllers/subsystem/acid.dm
@@ -3,6 +3,7 @@ SUBSYSTEM_DEF(acid)
priority = FIRE_PRIORITY_ACID
flags = SS_NO_INIT|SS_BACKGROUND
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
+ offline_implications = "Objects will no longer react to acid. No immediate action is needed."
var/list/currentrun = list()
var/list/processing = list()
diff --git a/code/controllers/subsystem/afk.dm b/code/controllers/subsystem/afk.dm
index 6ab1d67a816..9122e6a16c6 100644
--- a/code/controllers/subsystem/afk.dm
+++ b/code/controllers/subsystem/afk.dm
@@ -5,6 +5,7 @@ SUBSYSTEM_DEF(afk)
name = "AFK Watcher"
wait = 300
flags = SS_BACKGROUND
+ offline_implications = "Players will no longer be marked as AFK. No immediate action is needed."
var/list/afk_players = list() // Associative list. ckey as key and AFK state as value
@@ -17,27 +18,27 @@ SUBSYSTEM_DEF(afk)
for(var/mob/living/carbon/human/H in GLOB.living_mob_list)
if(!H.ckey) // Useless non ckey creatures
continue
-
- var/turf/T
+
+ var/turf/T
// Only players and players with the AFK watch enabled
// No dead, unconcious, restrained, people without jobs, people on other Z levels than the station or antags
if(!H.client || !H.client.prefs.afk_watch || !H.mind || \
H.stat || H.restrained() || !H.job || H.mind.special_role || \
!is_station_level((T = get_turf(H)).z)) // Assign the turf as last. Small optimization
- if(afk_players[H.ckey])
+ if(afk_players[H.ckey])
toRemove += H.ckey
continue
-
+
var/mins_afk = round(H.client.inactivity / 600)
if(mins_afk < config.warn_afk_minimum)
if(afk_players[H.ckey])
toRemove += H.ckey
continue
-
+
if(!afk_players[H.ckey])
afk_players[H.ckey] = AFK_WARNED
warn(H, "You are AFK for [mins_afk] minutes. You will be cryod after [config.auto_cryo_afk] total minutes and fully despawned after [config.auto_despawn_afk] total minutes. Please move or click in game if you want to avoid being despawned.")
- else
+ else
var/area/A = T.loc // Turfs loc is the area
if(afk_players[H.ckey] == AFK_WARNED)
if(mins_afk >= config.auto_cryo_afk && A.can_get_auto_cryod)
@@ -50,14 +51,14 @@ SUBSYSTEM_DEF(afk)
afk_players[H.ckey] = AFK_CRYOD
msg_admins(H, mins_afk, T, "put into cryostorage")
warn(H, "You are AFK for [mins_afk] minutes and have been moved to cryostorage. After being AFK for [config.auto_despawn_afk] total minutes you will be fully despawned. Please eject yourself (right click, eject) out of the cryostorage if you want to avoid being despawned.")
-
+
else if(mins_afk >= config.auto_despawn_afk)
var/obj/machinery/cryopod/P = H.loc
msg_admins(H, mins_afk, T, "forcefully despawned")
warn(H, "You are have been despawned after being AFK for [mins_afk] minutes.")
toRemove += H.ckey
P.despawn_occupant()
-
+
removeFromWatchList(toRemove)
/datum/controller/subsystem/afk/proc/warn(mob/living/carbon/human/H, text)
diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm
index 6f2a451ef76..80ce66d13ec 100644
--- a/code/controllers/subsystem/air.dm
+++ b/code/controllers/subsystem/air.dm
@@ -14,6 +14,7 @@ SUBSYSTEM_DEF(air)
wait = 5
flags = SS_BACKGROUND
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
+ offline_implications = "Turfs will no longer process atmos, and all atmospheric machines (including cryotubes) will no longer function. Shuttle call recommended."
var/cost_turfs = 0
var/cost_groups = 0
var/cost_highpressure = 0
diff --git a/code/controllers/subsystem/alarm.dm b/code/controllers/subsystem/alarm.dm
index bac32a449de..289adf6de40 100644
--- a/code/controllers/subsystem/alarm.dm
+++ b/code/controllers/subsystem/alarm.dm
@@ -1,6 +1,7 @@
SUBSYSTEM_DEF(alarms)
name = "Alarms"
init_order = INIT_ORDER_ALARMS // 2
+ offline_implications = "Alarms (Power, camera, fire, etc) will no longer be checked. No immediate action is needed."
var/datum/alarm_handler/atmosphere/atmosphere_alarm = new()
var/datum/alarm_handler/burglar/burglar_alarm = new()
var/datum/alarm_handler/camera/camera_alarm = new()
diff --git a/code/controllers/subsystem/chat.dm b/code/controllers/subsystem/chat.dm
index dbe38634e6a..4eb468a0952 100644
--- a/code/controllers/subsystem/chat.dm
+++ b/code/controllers/subsystem/chat.dm
@@ -4,6 +4,7 @@ SUBSYSTEM_DEF(chat)
wait = 1
priority = FIRE_PRIORITY_CHAT
init_order = INIT_ORDER_CHAT
+ offline_implications = "Chat messages will no longer be cleanly queued. No immediate action is needed."
var/list/payload = list()
diff --git a/code/controllers/subsystem/events.dm b/code/controllers/subsystem/events.dm
index 3612faa4a7e..ad77904bac7 100644
--- a/code/controllers/subsystem/events.dm
+++ b/code/controllers/subsystem/events.dm
@@ -2,6 +2,7 @@ SUBSYSTEM_DEF(events)
name = "Events"
init_order = INIT_ORDER_EVENTS
runlevels = RUNLEVEL_GAME
+ offline_implications = "Random events will no longer happen. No immediate action is needed."
// Report events at the end of the rouund
var/report_at_round_end = 0
diff --git a/code/controllers/subsystem/fires.dm b/code/controllers/subsystem/fires.dm
index aafc5ed48d5..dc419fffeb5 100644
--- a/code/controllers/subsystem/fires.dm
+++ b/code/controllers/subsystem/fires.dm
@@ -3,6 +3,7 @@ SUBSYSTEM_DEF(fires)
priority = FIRE_PRIOTITY_BURNING
flags = SS_NO_INIT|SS_BACKGROUND
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
+ offline_implications = "Objects will no longer react to fires. No immediate action is needed."
var/list/currentrun = list()
var/list/processing = list()
diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm
index 4bc3965e6cf..cbf17d05fbf 100644
--- a/code/controllers/subsystem/garbage.dm
+++ b/code/controllers/subsystem/garbage.dm
@@ -5,6 +5,7 @@ SUBSYSTEM_DEF(garbage)
flags = SS_POST_FIRE_TIMING|SS_BACKGROUND|SS_NO_INIT
runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY
init_order = INIT_ORDER_GARBAGE
+ offline_implications = "Garbage collection is no longer functional, and objects will not be qdel'd. Immediate server restart recommended."
var/list/collection_timeout = list(0, 2 MINUTES, 10 SECONDS) // deciseconds to wait before moving something up in the queue to the next level
diff --git a/code/controllers/subsystem/icon_smooth.dm b/code/controllers/subsystem/icon_smooth.dm
index 531b6af2e78..289505a153c 100644
--- a/code/controllers/subsystem/icon_smooth.dm
+++ b/code/controllers/subsystem/icon_smooth.dm
@@ -4,6 +4,7 @@ SUBSYSTEM_DEF(icon_smooth)
wait = 1
priority = FIRE_PRIOTITY_SMOOTHING
flags = SS_TICKER
+ offline_implications = "Objects will no longer smooth together properly. No immediate action is needed."
var/list/smooth_queue = list()
diff --git a/code/controllers/subsystem/idlenpcpool.dm b/code/controllers/subsystem/idlenpcpool.dm
index 42df941e10f..d61b90f1239 100644
--- a/code/controllers/subsystem/idlenpcpool.dm
+++ b/code/controllers/subsystem/idlenpcpool.dm
@@ -4,6 +4,7 @@ SUBSYSTEM_DEF(idlenpcpool)
priority = FIRE_PRIORITY_IDLE_NPC
wait = 60
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
+ offline_implications = "Idle simple animals will no longer process. Shuttle call recommended."
var/list/currentrun = list()
var/static/list/idle_mobs_by_zlevel[][]
@@ -39,4 +40,4 @@ SUBSYSTEM_DEF(idlenpcpool)
if(SA.stat != DEAD)
SA.consider_wakeup()
if(MC_TICK_CHECK)
- return
+ return
diff --git a/code/controllers/subsystem/input.dm b/code/controllers/subsystem/input.dm
index f379deec72b..9dd6fce1554 100644
--- a/code/controllers/subsystem/input.dm
+++ b/code/controllers/subsystem/input.dm
@@ -5,6 +5,7 @@ SUBSYSTEM_DEF(input)
flags = SS_TICKER
priority = FIRE_PRIORITY_INPUT
runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY
+ offline_implications = "Player input will no longer be recognised. Immediate server restart recommended."
var/list/macro_sets
var/list/movement_keys
@@ -24,7 +25,7 @@ SUBSYSTEM_DEF(input)
// This is for when macro sets are eventualy datumized
/datum/controller/subsystem/input/proc/setup_default_macro_sets()
var/list/static/default_macro_sets
-
+
if(default_macro_sets)
macro_sets = default_macro_sets
return
diff --git a/code/controllers/subsystem/jobs.dm b/code/controllers/subsystem/jobs.dm
index 6f7894ca428..1d6fd410f9b 100644
--- a/code/controllers/subsystem/jobs.dm
+++ b/code/controllers/subsystem/jobs.dm
@@ -3,6 +3,7 @@ SUBSYSTEM_DEF(jobs)
init_order = INIT_ORDER_JOBS // 12
wait = 3000 // 5 minutes (Deciseconds)
runlevels = RUNLEVEL_GAME
+ offline_implications = "Job playtime hours will no longer be logged. No immediate action is needed."
//List of all jobs
var/list/occupations = list()
diff --git a/code/controllers/subsystem/lighting.dm b/code/controllers/subsystem/lighting.dm
index 7441d855f22..3fc92a3346a 100644
--- a/code/controllers/subsystem/lighting.dm
+++ b/code/controllers/subsystem/lighting.dm
@@ -7,6 +7,7 @@ SUBSYSTEM_DEF(lighting)
wait = 2
init_order = INIT_ORDER_LIGHTING
flags = SS_TICKER
+ offline_implications = "Lighting will no longer update. Shuttle call recommended."
/datum/controller/subsystem/lighting/stat_entry()
..("L:[GLOB.lighting_update_lights.len]|C:[GLOB.lighting_update_corners.len]|O:[GLOB.lighting_update_objects.len]")
diff --git a/code/controllers/subsystem/machinery.dm b/code/controllers/subsystem/machinery.dm
index 9a73c1dbabb..7e78e2b9df1 100644
--- a/code/controllers/subsystem/machinery.dm
+++ b/code/controllers/subsystem/machinery.dm
@@ -6,6 +6,7 @@ SUBSYSTEM_DEF(machines)
name = "Machines"
init_order = INIT_ORDER_MACHINES
flags = SS_KEEP_TIMING
+ offline_implications = "Machinery will no longer process. Shuttle call recommended."
var/list/processing = list()
var/list/currentrun = list()
diff --git a/code/controllers/subsystem/mobs.dm b/code/controllers/subsystem/mobs.dm
index c21b8f0760a..8345822ca80 100644
--- a/code/controllers/subsystem/mobs.dm
+++ b/code/controllers/subsystem/mobs.dm
@@ -3,6 +3,7 @@ SUBSYSTEM_DEF(mobs)
priority = FIRE_PRIORITY_MOBS
flags = SS_KEEP_TIMING
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
+ offline_implications = "Mobs will no longer process. Immediate server restart recommended."
var/list/currentrun = list()
var/static/list/clients_by_zlevel[][]
diff --git a/code/controllers/subsystem/nano_mob_hunter.dm b/code/controllers/subsystem/nano_mob_hunter.dm
index a634f091013..9094bf9fe2b 100644
--- a/code/controllers/subsystem/nano_mob_hunter.dm
+++ b/code/controllers/subsystem/nano_mob_hunter.dm
@@ -2,6 +2,7 @@ SUBSYSTEM_DEF(mob_hunt)
name = "Nano-Mob Hunter GO Server"
init_order = INIT_ORDER_NANOMOB
priority = FIRE_PRIORITY_NANOMOB // Low priority, no need for MC_TICK_CHECK due to extremely low performance impact.
+ offline_implications = "Nano-Mob Hunter will no longer spawn mobs. No immediate action is needed."
var/max_normal_spawns = 15 //change this to adjust the number of normal spawns that can exist at one time. trapped spawns (from traitors) don't count towards this
var/list/normal_spawns = list()
var/max_trap_spawns = 15 //change this to adjust the number of trap spawns that can exist at one time. traps spawned beyond this point clear the oldest traps
diff --git a/code/controllers/subsystem/nanoui.dm b/code/controllers/subsystem/nanoui.dm
index c8cbbc62013..ef1b6ee03fe 100644
--- a/code/controllers/subsystem/nanoui.dm
+++ b/code/controllers/subsystem/nanoui.dm
@@ -4,6 +4,7 @@ SUBSYSTEM_DEF(nanoui)
flags = SS_NO_INIT
priority = FIRE_PRIORITY_NANOUI
runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT
+ offline_implications = "All NanoUIs will no longer process. Shuttle call recommended."
var/list/currentrun = list()
var/list/open_uis = list() // A list of open UIs, grouped by src_object and ui_key.
diff --git a/code/controllers/subsystem/nightshift.dm b/code/controllers/subsystem/nightshift.dm
index e13f49fd1c2..deffcb6bddf 100644
--- a/code/controllers/subsystem/nightshift.dm
+++ b/code/controllers/subsystem/nightshift.dm
@@ -4,6 +4,7 @@ SUBSYSTEM_DEF(nightshift)
priority = FIRE_PRIORITY_NIGHTSHIFT
wait = 600
flags = SS_NO_TICK_CHECK
+ offline_implications = "The game will no longer shift between day and night lighting. No immediate action is needed."
var/nightshift_active = FALSE
var/nightshift_start_time = 702000 //7:30 PM, station time
diff --git a/code/controllers/subsystem/npcpool.dm b/code/controllers/subsystem/npcpool.dm
index 5eaca5d19c4..79541c199a4 100644
--- a/code/controllers/subsystem/npcpool.dm
+++ b/code/controllers/subsystem/npcpool.dm
@@ -3,6 +3,7 @@ SUBSYSTEM_DEF(npcpool)
flags = SS_POST_FIRE_TIMING|SS_NO_INIT|SS_BACKGROUND
priority = FIRE_PRIORITY_NPC
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
+ offline_implications = "Simple animals will no longer process. Shuttle call recommended."
var/list/currentrun = list()
diff --git a/code/controllers/subsystem/overlays.dm b/code/controllers/subsystem/overlays.dm
index c35f1adee65..95b9e925b5d 100644
--- a/code/controllers/subsystem/overlays.dm
+++ b/code/controllers/subsystem/overlays.dm
@@ -4,6 +4,7 @@ SUBSYSTEM_DEF(overlays)
wait = 1
priority = FIRE_PRIORITY_OVERLAYS
init_order = INIT_ORDER_OVERLAY
+ offline_implications = "Overlays may look strange. No immediate action is needed."
var/list/queue
var/list/stats
diff --git a/code/controllers/subsystem/parallax.dm b/code/controllers/subsystem/parallax.dm
index 039b6d2b008..9135f62b03f 100644
--- a/code/controllers/subsystem/parallax.dm
+++ b/code/controllers/subsystem/parallax.dm
@@ -4,6 +4,7 @@ SUBSYSTEM_DEF(parallax)
flags = SS_POST_FIRE_TIMING | SS_BACKGROUND
priority = FIRE_PRIORITY_PARALLAX
runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT
+ offline_implications = "Space parallax will no longer move around. No immediate action is needed."
var/list/currentrun
var/planet_x_offset = 128
var/planet_y_offset = 128
diff --git a/code/controllers/subsystem/shuttles.dm b/code/controllers/subsystem/shuttles.dm
index 14a9b507977..247d71d05b8 100644
--- a/code/controllers/subsystem/shuttles.dm
+++ b/code/controllers/subsystem/shuttles.dm
@@ -6,6 +6,7 @@ SUBSYSTEM_DEF(shuttle)
init_order = INIT_ORDER_SHUTTLE
flags = SS_KEEP_TIMING|SS_NO_TICK_CHECK
runlevels = RUNLEVEL_SETUP | RUNLEVEL_GAME
+ offline_implications = "Shuttles will no longer function and cargo will not generate points. Immediate server restart recommended."
var/list/mobile = list()
var/list/stationary = list()
var/list/transit = list()
diff --git a/code/controllers/subsystem/spacedrift.dm b/code/controllers/subsystem/spacedrift.dm
index fcc62a2fa50..d9c46f9c9d7 100644
--- a/code/controllers/subsystem/spacedrift.dm
+++ b/code/controllers/subsystem/spacedrift.dm
@@ -4,6 +4,7 @@ SUBSYSTEM_DEF(spacedrift)
wait = 5
flags = SS_NO_INIT|SS_KEEP_TIMING
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
+ offline_implications = "Mobs will no longer respect a lack of gravity. No immediate action is needed."
var/list/currentrun = list()
var/list/processing = list()
diff --git a/code/controllers/subsystem/sun.dm b/code/controllers/subsystem/sun.dm
index b9843c57b68..3f8e15df05a 100644
--- a/code/controllers/subsystem/sun.dm
+++ b/code/controllers/subsystem/sun.dm
@@ -3,6 +3,7 @@ SUBSYSTEM_DEF(sun)
wait = 600
flags = SS_NO_TICK_CHECK
init_order = INIT_ORDER_SUN
+ offline_implications = "Solar panels will no longer rotate. No immediate action is needed."
var/angle
var/dx
var/dy
diff --git a/code/controllers/subsystem/throwing.dm b/code/controllers/subsystem/throwing.dm
index 74dbf4c4d93..04ddf40f442 100644
--- a/code/controllers/subsystem/throwing.dm
+++ b/code/controllers/subsystem/throwing.dm
@@ -7,6 +7,7 @@ SUBSYSTEM_DEF(throwing)
wait = 1
flags = SS_NO_INIT|SS_KEEP_TIMING|SS_TICKER
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
+ offline_implications = "Thrown objects may not react properly. Shuttle call recommended."
var/list/currentrun
var/list/processing = list()
diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm
index b092271fc96..825eab93a31 100644
--- a/code/controllers/subsystem/ticker.dm
+++ b/code/controllers/subsystem/ticker.dm
@@ -5,6 +5,7 @@ SUBSYSTEM_DEF(ticker)
priority = FIRE_PRIORITY_TICKER
flags = SS_KEEP_TIMING
runlevels = RUNLEVEL_LOBBY | RUNLEVEL_SETUP | RUNLEVEL_GAME
+ offline_implications = "The game is no longer aware of when the round ends. Immediate server restart recommended."
var/round_start_time = 0
var/const/restart_timeout = 600
@@ -513,6 +514,11 @@ SUBSYSTEM_DEF(ticker)
//Ask the event manager to print round end information
SSevents.RoundEnd()
+ //make big obvious note in game logs that round ended
+ log_game("///////////////////////////////////////////////////////")
+ log_game("///////////////////// ROUND ENDED /////////////////////")
+ log_game("///////////////////////////////////////////////////////")
+
// Add AntagHUD to everyone, see who was really evil the whole time!
for(var/datum/atom_hud/antag/H in GLOB.huds)
for(var/m in GLOB.player_list)
diff --git a/code/controllers/subsystem/timer.dm b/code/controllers/subsystem/timer.dm
index 1caa3d7819a..7bb6a496274 100644
--- a/code/controllers/subsystem/timer.dm
+++ b/code/controllers/subsystem/timer.dm
@@ -9,6 +9,7 @@ SUBSYSTEM_DEF(timer)
init_order = INIT_ORDER_TIMER
flags = SS_TICKER|SS_NO_INIT
+ offline_implications = "The game will no longer process timers. Immediate server restart recommended."
var/list/second_queue = list() //awe, yes, you've had first queue, but what about second queue?
var/list/hashes = list()
diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm
index 28456c9b5c5..b0110258da7 100644
--- a/code/controllers/subsystem/vote.dm
+++ b/code/controllers/subsystem/vote.dm
@@ -3,6 +3,7 @@ SUBSYSTEM_DEF(vote)
wait = 10
flags = SS_KEEP_TIMING|SS_NO_INIT
runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT
+ offline_implications = "Votes (Endround shuttle) will no longer function. Shuttle call recommended."
var/initiator = null
var/started_time = null
diff --git a/code/controllers/subsystem/weather.dm b/code/controllers/subsystem/weather.dm
index ac2f0c59313..7b08bd3ca48 100644
--- a/code/controllers/subsystem/weather.dm
+++ b/code/controllers/subsystem/weather.dm
@@ -9,6 +9,7 @@ SUBSYSTEM_DEF(weather)
flags = SS_BACKGROUND
wait = 10
runlevels = RUNLEVEL_GAME
+ offline_implications = "Ash storms will no longer trigger. No immediate action is needed."
var/list/processing = list()
var/list/eligible_zlevels = list()
var/list/next_hit_by_zlevel = list() //Used by barometers to know when the next storm is coming
diff --git a/code/datums/diseases/advance/symptoms/sensory.dm b/code/datums/diseases/advance/symptoms/sensory.dm
index cf39d91a866..5759ab32de6 100644
--- a/code/datums/diseases/advance/symptoms/sensory.dm
+++ b/code/datums/diseases/advance/symptoms/sensory.dm
@@ -62,4 +62,4 @@ Bonus
M.reagents.add_reagent("oculine", 20)
else
if(prob(SYMPTOM_ACTIVATION_PROB * 5))
- to_chat(M, "[pick("Your eyes feel great.","You feel like your eyes can focus more clearly.", "You don't feel the need to blink.","Your ears feel great.","Your healing feels more acute.")]")
+ to_chat(M, "[pick("Your eyes feel great.","You feel like your eyes can focus more clearly.", "You don't feel the need to blink.","Your ears feel great.","Your hearing feels more acute.")]")
diff --git a/code/datums/gas_mixture.dm b/code/datums/gas_mixture.dm
index 35cc970aa67..63b70b512ee 100644
--- a/code/datums/gas_mixture.dm
+++ b/code/datums/gas_mixture.dm
@@ -645,7 +645,7 @@ What are the archived variables for?
((nitrogen < (1-MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.nitrogen) || (nitrogen > (1+MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.nitrogen)))
return 0
if((abs(carbon_dioxide-sample.carbon_dioxide) > MINIMUM_AIR_TO_SUSPEND) && \
- ((carbon_dioxide < (1-MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.carbon_dioxide) || (oxygen > (1+MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.carbon_dioxide)))
+ ((carbon_dioxide < (1-MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.carbon_dioxide) || (carbon_dioxide > (1+MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.carbon_dioxide)))
return 0
if((abs(toxins-sample.toxins) > MINIMUM_AIR_TO_SUSPEND) && \
((toxins < (1-MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.toxins) || (toxins > (1+MINIMUM_AIR_RATIO_TO_SUSPEND)*sample.toxins)))
diff --git a/code/datums/status_effects/status_effect.dm b/code/datums/status_effects/status_effect.dm
index 896f4f999a9..74abf104465 100644
--- a/code/datums/status_effects/status_effect.dm
+++ b/code/datums/status_effects/status_effect.dm
@@ -41,6 +41,9 @@
LAZYREMOVE(owner.status_effects, src)
on_remove()
owner = null
+ if(linked_alert)
+ linked_alert.attached_effect = null
+ linked_alert = null
return ..()
/datum/status_effect/process()
@@ -85,6 +88,13 @@
desc = "You don't feel any different..."
var/datum/status_effect/attached_effect
+/obj/screen/alert/status_effect/Destroy()
+ if(attached_effect)
+ attached_effect.linked_alert = null
+ attached_effect = null
+ return ..()
+
+
//////////////////
// HELPER PROCS //
//////////////////
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index 6b49962bbac..ac77d3d4553 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -1,6 +1,7 @@
/atom/movable
layer = 3
appearance_flags = TILE_BOUND
+ glide_size = 8 // Default, adjusted when mobs move based on their movement delays
var/last_move = null
var/anchored = 0
var/move_resist = MOVE_RESIST_DEFAULT
@@ -131,13 +132,14 @@
/atom/movable/proc/setLoc(var/T, var/teleported=0)
loc = T
-/atom/movable/Move(atom/newloc, direct = 0)
+/atom/movable/Move(atom/newloc, direct = 0, movetime)
if(!loc || !newloc) return 0
var/atom/oldloc = loc
if(loc != newloc)
+ glide_for(movetime)
if(!(direct & (direct - 1))) //Cardinal move
- . = ..()
+ . = ..(newloc, direct) // don't pass up movetime
else //Diagonal move, split it into cardinal moves
moving_diagonally = FIRST_DIAG_STEP
var/first_step_dir
@@ -203,7 +205,7 @@
src.move_speed = world.time - src.l_move_time
src.l_move_time = world.time
- if(. && has_buckled_mobs() && !handle_buckled_mob_movement(loc, direct)) //movement failed due to buckled mob
+ if(. && has_buckled_mobs() && !handle_buckled_mob_movement(loc, direct, movetime)) //movement failed due to buckled mob
. = 0
// Called after a successful Move(). By this point, we've already moved
@@ -216,6 +218,15 @@
update_parallax_contents()
return TRUE
+// Change glide size for the duration of one movement
+/atom/movable/proc/glide_for(movetime)
+ if(movetime)
+ glide_size = world.icon_size/max(DS2TICKS(movetime), 1)
+ spawn(movetime)
+ glide_size = initial(glide_size)
+ else
+ glide_size = initial(glide_size)
+
// Previously known as HasEntered()
// This is automatically called when something enters your square
/atom/movable/Crossed(atom/movable/AM, oldloc)
@@ -428,10 +439,10 @@
/atom/movable/proc/water_act(volume, temperature, source, method = REAGENT_TOUCH) //amount of water acting : temperature of water in kelvin : object that called it (for shennagins)
return TRUE
-/atom/movable/proc/handle_buckled_mob_movement(newloc,direct)
+/atom/movable/proc/handle_buckled_mob_movement(newloc,direct,movetime)
for(var/m in buckled_mobs)
var/mob/living/buckled_mob = m
- if(!buckled_mob.Move(newloc, direct))
+ if(!buckled_mob.Move(newloc, direct, movetime))
forceMove(buckled_mob.loc)
last_move = buckled_mob.last_move
inertia_dir = last_move
diff --git a/code/game/gamemodes/changeling/powers/hivemind.dm b/code/game/gamemodes/changeling/powers/hivemind.dm
index af375cad368..98336608da4 100644
--- a/code/game/gamemodes/changeling/powers/hivemind.dm
+++ b/code/game/gamemodes/changeling/powers/hivemind.dm
@@ -23,7 +23,7 @@
return
// HIVE MIND UPLOAD/DOWNLOAD DNA
-var/list/datum/dna/hivemind_bank = list()
+GLOBAL_LIST_EMPTY(hivemind_bank)
/datum/action/changeling/hivemind_upload
name = "Hive Channel DNA"
@@ -36,7 +36,7 @@ var/list/datum/dna/hivemind_bank = list()
var/datum/changeling/changeling = user.mind.changeling
var/list/names = list()
for(var/datum/dna/DNA in (changeling.absorbed_dna+changeling.protected_dna))
- if(!(DNA in hivemind_bank))
+ if(!(DNA in GLOB.hivemind_bank))
names += DNA.real_name
if(names.len <= 0)
@@ -51,7 +51,7 @@ var/list/datum/dna/hivemind_bank = list()
if(!chosen_dna)
return
- hivemind_bank += chosen_dna
+ GLOB.hivemind_bank += chosen_dna
to_chat(user, "We channel the DNA of [chosen_name] to the air.")
feedback_add_details("changeling_powers","HU")
return 1
@@ -75,7 +75,7 @@ var/list/datum/dna/hivemind_bank = list()
/datum/action/changeling/hivemind_download/sting_action(var/mob/user)
var/datum/changeling/changeling = user.mind.changeling
var/list/names = list()
- for(var/datum/dna/DNA in hivemind_bank)
+ for(var/datum/dna/DNA in GLOB.hivemind_bank)
if(!(DNA in changeling.absorbed_dna))
names[DNA.real_name] = DNA
diff --git a/code/game/gamemodes/devil/devil.dm b/code/game/gamemodes/devil/devil.dm
index ab5f5796d2e..06933891ba6 100644
--- a/code/game/gamemodes/devil/devil.dm
+++ b/code/game/gamemodes/devil/devil.dm
@@ -1,4 +1,4 @@
-var/global/list/whiteness = list (
+GLOBAL_LIST_INIT(whiteness, list(
/obj/item/clothing/under/color/white = 2,
/obj/item/clothing/under/rank/bartender = 1,
/obj/item/clothing/under/rank/chef = 1,
@@ -21,7 +21,7 @@ var/global/list/whiteness = list (
/obj/item/clothing/under/noble_clothes = 1,
/obj/item/clothing/under/sl_suit = 1,
/obj/item/clothing/under/burial = 1
-)
+))
@@ -32,9 +32,9 @@ var/global/list/whiteness = list (
var/mob/living/carbon/human/H = attacker
if(H.w_uniform && istype(H.w_uniform, /obj/item/clothing/under))
var/obj/item/clothing/under/U = H.w_uniform
- if(whiteness[U.type])
+ if(GLOB.whiteness[U.type])
src.visible_message("[src] seems to have been harmed by the purity of [attacker]'s clothes.", "Unsullied white clothing is disrupting your form.")
- return whiteness[U.type] + 1
+ return GLOB.whiteness[U.type] + 1
if(BANE_TOOLBOX)
if(istype(weapon,/obj/item/storage/toolbox))
src.visible_message("The [weapon] seems unusually robust this time.", "The [weapon] is your unmaking!")
diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
index 65424bf9008..f425a34654d 100644
--- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
+++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
@@ -421,13 +421,13 @@
return FALSE
/obj/structure/lattice/catwalk/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- . = ..()
var/turf/here = get_turf(src)
for(var/A in here.contents)
var/obj/structure/cable/C = A
if(istype(C))
to_chat(S, "Disrupting the power grid would bring no benefit to us. Aborting.")
return FALSE
+ return ..()
/obj/item/deactivated_swarmer/IntegrateAmount()
return 50
diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer_event.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer_event.dm
index d0be68819ae..fbceda6bd94 100644
--- a/code/game/gamemodes/miniantags/bot_swarm/swarmer_event.dm
+++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer_event.dm
@@ -13,9 +13,9 @@
/datum/event/spawn_swarmer/start()
if(find_swarmer())
return 0
- if(!the_gateway)
+ if(!GLOB.the_gateway)
return 0
- new /obj/effect/mob_spawn/swarmer(get_turf(the_gateway))
+ new /obj/effect/mob_spawn/swarmer(get_turf(GLOB.the_gateway))
/datum/event/spawn_swarmer/proc/find_swarmer()
diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm
index 259afa12c9e..2d1b091a10d 100644
--- a/code/game/jobs/job/medical.dm
+++ b/code/game/jobs/job/medical.dm
@@ -30,7 +30,7 @@
l_ear = /obj/item/radio/headset/heads/cmo
id = /obj/item/card/id/cmo
suit_store = /obj/item/flashlight/pen
- l_hand = /obj/item/storage/firstaid/adv
+ l_hand = /obj/item/storage/firstaid/doctor
pda = /obj/item/pda/heads/cmo
backpack_contents = list(
/obj/item/melee/classic_baton/telescopic = 1
@@ -68,7 +68,7 @@
l_ear = /obj/item/radio/headset/headset_med
id = /obj/item/card/id/medical
suit_store = /obj/item/flashlight/pen
- l_hand = /obj/item/storage/firstaid/adv
+ l_hand = /obj/item/storage/firstaid/doctor
pda = /obj/item/pda/medical
backpack = /obj/item/storage/backpack/medic
@@ -315,4 +315,3 @@
satchel = /obj/item/storage/backpack/satchel_med
dufflebag = /obj/item/storage/backpack/duffel/medical
box = /obj/item/storage/box/engineer
-
diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm
index 64e69e89765..a32656598df 100644
--- a/code/game/jobs/job/security.dm
+++ b/code/game/jobs/job/security.dm
@@ -217,7 +217,7 @@
glasses = /obj/item/clothing/glasses/hud/health/sunglasses
id = /obj/item/card/id/security
suit_store = /obj/item/flashlight/pen
- l_hand = /obj/item/storage/firstaid/adv
+ l_hand = /obj/item/storage/firstaid/doctor
pda = /obj/item/pda/medical
implants = list(/obj/item/implant/mindshield)
backpack = /obj/item/storage/backpack/medic
diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm
index c95735507a5..1649397a68f 100644
--- a/code/game/machinery/computer/camera.dm
+++ b/code/game/machinery/computer/camera.dm
@@ -302,7 +302,7 @@
T = get_step(T, direct)
console.jump_on_click(src, T)
return
- return ..(n,direct)
+ return ..()
// Other computer monitors.
/obj/machinery/computer/security/telescreen
diff --git a/code/game/machinery/defib_mount.dm b/code/game/machinery/defib_mount.dm
index d669b340436..9ee32716e53 100644
--- a/code/game/machinery/defib_mount.dm
+++ b/code/game/machinery/defib_mount.dm
@@ -15,6 +15,9 @@
var/obj/item/defibrillator/defib //this mount's defibrillator
var/clamps_locked = FALSE //if true, and a defib is loaded, it can't be removed without unlocking the clamps
+/obj/machinery/defibrillator_mount/attack_ai()
+ return
+
/obj/machinery/defibrillator_mount/get_cell()
if(defib)
return defib.get_cell()
diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm
index 1d97056912f..94a3219c159 100644
--- a/code/game/machinery/deployable.dm
+++ b/code/game/machinery/deployable.dm
@@ -30,6 +30,8 @@
new stacktype(get_turf(src), drop_amount)
/obj/structure/barricade/welder_act(mob/user, obj/item/I)
+ if(bar_material != METAL)
+ return
if(obj_integrity >= max_integrity)
to_chat(user, "[src] does not need repairs.")
return
@@ -71,6 +73,7 @@
bar_material = WOOD
stacktype = /obj/item/stack/sheet/wood
+
/obj/structure/barricade/wooden/attackby(obj/item/I, mob/user)
if(istype(I,/obj/item/stack/sheet/wood))
var/obj/item/stack/sheet/wood/W = I
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 191d5e81079..f69094715b0 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -289,8 +289,8 @@ About the new airlock wires panel:
// shock user with probability prb (if all connections & power are working)
// returns 1 if shocked, 0 otherwise
// The preceding comment was borrowed from the grille's shock script
-/obj/machinery/door/airlock/shock(mob/user, prb)
- if(!arePowerSystemsOn())
+/obj/machinery/door/airlock/shock(mob/living/user, prb)
+ if(!istype(user) || !arePowerSystemsOn())
return FALSE
if(shockCooldown > world.time)
return FALSE //Already shocked someone recently?
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index fbbe0201d31..2d6fac3bb81 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -204,7 +204,7 @@
. = TRUE
if(operating)
return
- if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ if(!I.use_tool(src, user, 0, volume = 0))
return
try_to_crowbar(user, I)
diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm
index 6f4a84a7535..c0dce817189 100644
--- a/code/game/machinery/doors/poddoor.dm
+++ b/code/game/machinery/doors/poddoor.dm
@@ -59,9 +59,18 @@
/obj/machinery/door/poddoor/try_to_activate_door(mob/user)
return
-/obj/machinery/door/poddoor/try_to_crowbar(obj/item/I, mob/user)
+/obj/machinery/door/poddoor/try_to_crowbar(mob/user, obj/item/I)
+ if(!density)
+ return
if(!hasPower())
- open()
+ to_chat(user, "You start forcing [src] open...")
+ if(do_after(user, 50 * I.toolspeed, target = src))
+ if(!hasPower())
+ open()
+ else
+ to_chat(user, "[src] resists your efforts to force it!")
+ else
+ to_chat(user, "[src] resists your efforts to force it!")
// Whoever wrote the old code for multi-tile spesspod doors needs to burn in hell. - Unknown
// Wise words. - Bxil
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index 8d8cabed341..0a55acfcb81 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -558,8 +558,8 @@ Class Procs:
return threatcount
-/obj/machinery/proc/shock(mob/user, prb)
- if(inoperable())
+/obj/machinery/proc/shock(mob/living/user, prb)
+ if(!istype(user) || inoperable())
return FALSE
if(!prob(prb))
return FALSE
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index 201c6891187..1487256c712 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -52,14 +52,11 @@
var/list/hidden_records = list()
var/list/coin_records = list()
- // // Variables used to initialize advertising
- var/product_slogans = "" //String of slogans separated by semicolons, optional
- var/product_ads = "" //String of small ad messages in the vending screen - random chance
- var/list/ads_list = list()
+ var/list/ads_list = list() //Small ad messages in the vending screen - random chance, TODO: implementation
// Stuff relating vocalizations
- var/list/slogan_list = list()
+ var/list/slogan_list = list() //List of slogans the vendor will say, optional
var/vend_reply //Thank you for shopping!
var/shut_up = 0 //Stop spouting those godawful pitches!
///can we access the hidden inventory?
@@ -95,17 +92,12 @@
build_inventory(products, product_records)
build_inventory(contraband, hidden_records)
build_inventory(premium, coin_records)
- if(product_slogans)
- slogan_list += splittext(product_slogans, ";")
-
+ if(LAZYLEN(slogan_list))
// So not all machines speak at the exact same time.
// The first time this machine says something will be at slogantime + this random value,
- // so if slogantime is 10 minutes, it will say it at somewhere between 10 and 20 minutes after the machine is crated.
+ // so if slogantime is 10 minutes, it will say it at somewhere between 10 and 20 minutes after the machine is created.
last_slogan = world.time + rand(0, slogan_delay)
- if(product_ads)
- ads_list += splittext(product_ads, ";")
-
power_change()
/obj/machinery/vending/Destroy()
@@ -720,7 +712,7 @@
src.seconds_electrified--
//Pitch to the people! Really sell it!
- if(((last_slogan + src.slogan_delay) <= world.time) && (slogan_list.len > 0) && (!shut_up) && prob(5))
+ if(((last_slogan + src.slogan_delay) <= world.time) && (LAZYLEN(slogan_list)) && (!shut_up) && prob(5))
var/slogan = pick(src.slogan_list)
speak(slogan)
last_slogan = world.time
@@ -833,7 +825,7 @@
products = list( /obj/item/assembly/prox_sensor = 5,/obj/item/assembly/igniter = 3,/obj/item/assembly/signaler = 4,
/obj/item/wirecutters = 1, /obj/item/cartridge/signal = 4)
contraband = list(/obj/item/flashlight = 5,/obj/item/assembly/timer = 2, /obj/item/assembly/voice = 2, /obj/item/assembly/health = 2)
- product_ads = "Only the finest!;Have some tools.;The most robust equipment.;The finest gear in space!"
+ ads_list = list("Only the finest!","Have some tools.","The most robust equipment.","The finest gear in space!")
refill_canister = /obj/item/vending_refill/assist
/obj/machinery/vending/assist/Initialize(mapload)
@@ -875,8 +867,8 @@
/obj/item/reagent_containers/food/drinks/ice = 9)
contraband = list(/obj/item/reagent_containers/food/drinks/tea = 10)
vend_delay = 15
- product_slogans = "I hope nobody asks me for a bloody cup o' tea...;Alcohol is humanity's friend. Would you abandon a friend?;Quite delighted to serve you!;Is nobody thirsty on this station?"
- product_ads = "Drink up!;Booze is good for you!;Alcohol is humanity's best friend.;Quite delighted to serve you!;Care for a nice, cold beer?;Nothing cures you like booze!;Have a sip!;Have a drink!;Have a beer!;Beer is good for you!;Only the finest alcohol!;Best quality booze since 2053!;Award-winning wine!;Maximum alcohol!;Man loves beer.;A toast for progress!"
+ slogan_list = list("I hope nobody asks me for a bloody cup o' tea...","Alcohol is humanity's friend. Would you abandon a friend?","Quite delighted to serve you!","Is nobody thirsty on this station?")
+ ads_list = list("Drink up!","Booze is good for you!","Alcohol is humanity's best friend.","Quite delighted to serve you!","Care for a nice, cold beer?","Nothing cures you like booze!","Have a sip!","Have a drink!","Have a beer!","Beer is good for you!","Only the finest alcohol!","Best quality booze since 2053!","Award-winning wine!","Maximum alcohol!","Man loves beer.","A toast for progress!")
refill_canister = /obj/item/vending_refill/boozeomat
/obj/machinery/vending/boozeomat/syndicate_access
@@ -895,7 +887,7 @@
/obj/machinery/vending/coffee
name = "\improper Hot Drinks machine"
desc = "A vending machine which dispenses hot drinks."
- product_ads = "Have a drink!;Drink up!;It's good for you!;Would you like a hot joe?;I'd kill for some coffee!;The best beans in the galaxy.;Only the finest brew for you.;Mmmm. Nothing like a coffee.;I like coffee, don't you?;Coffee helps you work!;Try some tea.;We hope you like the best!;Try our new chocolate!;Admin conspiracies"
+ ads_list = list("Have a drink!","Drink up!","It's good for you!","Would you like a hot joe?","I'd kill for some coffee!","The best beans in the galaxy.","Only the finest brew for you.","Mmmm. Nothing like a coffee.","I like coffee, don't you?","Coffee helps you work!","Try some tea.","We hope you like the best!","Try our new chocolate!","Admin conspiracies")
icon_state = "coffee"
icon_vend = "coffee-vend"
item_slot = TRUE
@@ -962,8 +954,8 @@
/obj/machinery/vending/snack
name = "\improper Getmore Chocolate Corp"
desc = "A snack machine courtesy of the Getmore Chocolate Corporation, based out of Mars."
- product_slogans = "Try our new nougat bar!;Twice the calories for half the price!"
- product_ads = "The healthiest!;Award-winning chocolate bars!;Mmm! So good!;Oh my god it's so juicy!;Have a snack.;Snacks are good for you!;Have some more Getmore!;Best quality snacks straight from mars.;We love chocolate!;Try our new jerky!"
+ slogan_list = list("Try our new nougat bar!","Twice the calories for half the price!")
+ ads_list = list("The healthiest!","Award-winning chocolate bars!","Mmm! So good!","Oh my god it's so juicy!","Have a snack.","Snacks are good for you!","Have some more Getmore!","Best quality snacks straight from mars.","We love chocolate!","Try our new jerky!")
icon_state = "snack"
products = list(/obj/item/reagent_containers/food/snacks/candy/candybar = 6,/obj/item/reagent_containers/food/drinks/dry_ramen = 6,/obj/item/reagent_containers/food/snacks/chips =6,
/obj/item/reagent_containers/food/snacks/sosjerky = 6,/obj/item/reagent_containers/food/snacks/no_raisin = 6,/obj/item/reagent_containers/food/snacks/pistachios =6,
@@ -989,7 +981,7 @@
/obj/machinery/vending/chinese
name = "\improper Mr. Chang"
desc = "A self-serving Chinese food machine, for all your Chinese food needs."
- product_slogans = "Taste 5000 years of culture!;Mr. Chang, approved for safe consumption in over 10 sectors!;Chinese food is great for a date night, or a lonely night!;You can't go wrong with Mr. Chang's authentic Chinese food!"
+ slogan_list = list("Taste 5000 years of culture!","Mr. Chang, approved for safe consumption in over 10 sectors!","Chinese food is great for a date night, or a lonely night!","You can't go wrong with Mr. Chang's authentic Chinese food!")
icon_state = "chang"
products = list(/obj/item/reagent_containers/food/snacks/chinese/chowmein = 6, /obj/item/reagent_containers/food/snacks/chinese/tao = 6, /obj/item/reagent_containers/food/snacks/chinese/sweetsourchickenball = 6, /obj/item/reagent_containers/food/snacks/chinese/newdles = 6,
/obj/item/reagent_containers/food/snacks/chinese/rice = 6)
@@ -1013,8 +1005,8 @@
name = "\improper Robust Softdrinks"
desc = "A soft drink vendor provided by Robust Industries, LLC."
icon_state = "Cola_Machine"
- product_slogans = "Robust Softdrinks: More robust than a toolbox to the head!"
- product_ads = "Refreshing!;Hope you're thirsty!;Over 1 million drinks sold!;Thirsty? Why not cola?;Please, have a drink!;Drink up!;The best drinks in space."
+ slogan_list = list("Robust Softdrinks: More robust than a toolbox to the head!")
+ ads_list = list("Refreshing!","Hope you're thirsty!","Over 1 million drinks sold!","Thirsty? Why not cola?","Please, have a drink!","Drink up!","The best drinks in space.")
products = list(/obj/item/reagent_containers/food/drinks/cans/cola = 10,/obj/item/reagent_containers/food/drinks/cans/space_mountain_wind = 10,
/obj/item/reagent_containers/food/drinks/cans/dr_gibb = 10,/obj/item/reagent_containers/food/drinks/cans/starkist = 10,
/obj/item/reagent_containers/food/drinks/cans/space_up = 10,/obj/item/reagent_containers/food/drinks/cans/grape_juice = 10)
@@ -1040,7 +1032,7 @@
/obj/machinery/vending/cart
name = "\improper PTech"
desc = "Cartridges for PDA's."
- product_slogans = "Carts to go!"
+ slogan_list = list("Carts to go!")
icon_state = "cart"
icon_deny = "cart-deny"
products = list(/obj/item/pda =10,/obj/item/cartridge/mob_hunt_game = 25,/obj/item/cartridge/medical = 10,/obj/item/cartridge/chemistry = 10,
@@ -1069,8 +1061,8 @@
desc = "An overwhelming amount of ancient patriotism washes over you just by looking at the machine."
icon_state = "liberationstation"
req_access_txt = "1"
- product_slogans = "Liberation Station: Your one-stop shop for all things second amendment!;Be a patriot today, pick up a gun!;Quality weapons for cheap prices!;Better dead than red!"
- product_ads = "Float like an astronaut, sting like a bullet!;Express your second amendment today!;Guns don't kill people, but you can!;Who needs responsibilities when you have guns?"
+ slogan_list = list("Liberation Station: Your one-stop shop for all things second amendment!","Be a patriot today, pick up a gun!","Quality weapons for cheap prices!","Better dead than red!")
+ ads_list = list("Float like an astronaut, sting like a bullet!","Express your second amendment today!","Guns don't kill people, but you can!","Who needs responsibilities when you have guns?")
vend_reply = "Remember the name: Liberation Station!"
products = list(/obj/item/gun/projectile/automatic/pistol/deagle/gold = 2,/obj/item/gun/projectile/automatic/pistol/deagle/camo = 2,
/obj/item/gun/projectile/automatic/pistol/m1911 = 2,/obj/item/gun/projectile/automatic/proto = 2,
@@ -1086,8 +1078,8 @@
name = "\improper Syndicate Donksoft Toy Vendor"
desc = "An ages 8 and up approved vendor that dispenses toys. If you were to find the right wires, you can unlock the adult mode setting!"
icon_state = "syndi"
- product_slogans = "Get your cool toys today!;Trigger a valid hunter today!;Quality toy weapons for cheap prices!;Give them to HoPs for all access!;Give them to HoS to get permabrigged!"
- product_ads = "Feel robust with your toys!;Express your inner child today!;Toy weapons don't kill people, but valid hunters do!;Who needs responsibilities when you have toy weapons?;Make your next murder FUN!"
+ slogan_list = list("Get your cool toys today!","Trigger a valid hunter today!","Quality toy weapons for cheap prices!","Give them to HoPs for all access!","Give them to HoS to get permabrigged!")
+ ads_list = list("Feel robust with your toys!","Express your inner child today!","Toy weapons don't kill people, but valid hunters do!","Who needs responsibilities when you have toy weapons?","Make your next murder FUN!")
vend_reply = "Come back for more!"
products = list(/obj/item/gun/projectile/automatic/toy = 10,
/obj/item/gun/projectile/automatic/toy/pistol= 10,
@@ -1112,8 +1104,8 @@
/obj/machinery/vending/cigarette
name = "cigarette machine"
desc = "If you want to get cancer, might as well do it in style."
- product_slogans = "Space cigs taste good like a cigarette should.;I'd rather toolbox than switch.;Smoke!;Don't believe the reports - smoke today!"
- product_ads = "Probably not bad for you!;Don't believe the scientists!;It's good for you!;Don't quit, buy more!;Smoke!;Nicotine heaven.;Best cigarettes since 2150.;Award-winning cigs."
+ slogan_list = list("Space cigs taste good like a cigarette should.","I'd rather toolbox than switch.","Smoke!","Don't believe the reports - smoke today!")
+ ads_list = list("Probably not bad for you!","Don't believe the scientists!","It's good for you!","Don't quit, buy more!","Smoke!","Nicotine heaven.","Best cigarettes since 2150.","Award-winning cigs.")
vend_delay = 34
icon_state = "cigs"
products = list(/obj/item/storage/fancy/cigarettes/cigpack_robust = 12, /obj/item/storage/fancy/cigarettes/cigpack_uplift = 6, /obj/item/storage/fancy/cigarettes/cigpack_random = 6, /obj/item/reagent_containers/food/pill/patch/nicotine = 10, /obj/item/storage/box/matches = 10,/obj/item/lighter/random = 4,/obj/item/storage/fancy/rollingpapers = 5)
@@ -1141,8 +1133,8 @@
/obj/machinery/vending/cigarette/beach //Used in the lavaland_biodome_beach.dmm ruin
name = "\improper ShadyCigs Ultra"
desc = "Now with extra premium products!"
- product_ads = "Probably not bad for you!;Dope will get you through times of no money better than money will get you through times of no dope!;It's good for you!"
- product_slogans = "Turn on, tune in, drop out!;Better living through chemistry!;Toke!;Don't forget to keep a smile on your lips and a song in your heart!"
+ ads_list = list("Probably not bad for you!","Dope will get you through times of no money better than money will get you through times of no dope!","It's good for you!")
+ slogan_list = list("Turn on, tune in, drop out!","Better living through chemistry!","Toke!","Don't forget to keep a smile on your lips and a song in your heart!")
products = list(/obj/item/storage/fancy/cigarettes = 5,
/obj/item/storage/fancy/cigarettes/cigpack_uplift = 3,
/obj/item/storage/fancy/cigarettes/cigpack_robust = 3,
@@ -1170,9 +1162,9 @@
desc = "Medical drug dispenser."
icon_state = "med"
icon_deny = "med-deny"
- product_ads = "Go save some lives!;The best stuff for your medbay.;Only the finest tools.;Natural chemicals!;This stuff saves lives.;Don't you want some?;Ping!"
+ ads_list = list("Go save some lives!","The best stuff for your medbay.","Only the finest tools.","Natural chemicals!","This stuff saves lives.","Don't you want some?","Ping!")
req_access_txt = "5"
- products = list(/obj/item/reagent_containers/syringe = 12, /obj/item/reagent_containers/food/pill/patch/styptic = 10, /obj/item/reagent_containers/food/pill/patch/silver_sulf = 10,
+ products = list(/obj/item/reagent_containers/syringe = 12, /obj/item/reagent_containers/food/pill/patch/styptic = 4, /obj/item/reagent_containers/food/pill/patch/silver_sulf = 4, /obj/item/reagent_containers/applicator/brute = 3, /obj/item/reagent_containers/applicator/burn = 3,
/obj/item/reagent_containers/glass/bottle/charcoal = 4, /obj/item/reagent_containers/glass/bottle/epinephrine = 4, /obj/item/reagent_containers/glass/bottle/diphenhydramine = 4,
/obj/item/reagent_containers/glass/bottle/salicylic = 4, /obj/item/reagent_containers/glass/bottle/potassium_iodide =3, /obj/item/reagent_containers/glass/bottle/saline = 5,
/obj/item/reagent_containers/glass/bottle/morphine = 4, /obj/item/reagent_containers/glass/bottle/ether = 4, /obj/item/reagent_containers/glass/bottle/atropine = 3,
@@ -1209,7 +1201,7 @@
/obj/machinery/vending/wallmed
name = "\improper NanoMed"
desc = "Wall-mounted Medical Equipment dispenser."
- product_ads = "Go save some lives!;The best stuff for your medbay.;Only the finest tools.;Natural chemicals!;This stuff saves lives.;Don't you want some?"
+ ads_list = list("Go save some lives!","The best stuff for your medbay.","Only the finest tools.","Natural chemicals!","This stuff saves lives.","Don't you want some?")
icon_state = "wallmed"
icon_deny = "wallmed-deny"
density = FALSE //It is wall-mounted, and thus, not dense. --Superxpdude
@@ -1233,7 +1225,7 @@
desc = "EVIL wall-mounted Medical Equipment dispenser."
icon_state = "syndimed"
icon_deny = "syndimed-deny"
- product_ads = "Go end some lives!;The best stuff for your ship.;Only the finest tools.;Natural chemicals!;This stuff saves lives.;Don't you want some?;Ping!"
+ ads_list = list("Go end some lives!","The best stuff for your ship.","Only the finest tools.","Natural chemicals!","This stuff saves lives.","Don't you want some?","Ping!")
req_access_txt = "150"
products = list(/obj/item/stack/medical/bruise_pack = 2,/obj/item/stack/medical/ointment = 2,/obj/item/reagent_containers/hypospray/autoinjector = 4,/obj/item/healthanalyzer = 1)
contraband = list(/obj/item/reagent_containers/syringe/charcoal = 4,/obj/item/reagent_containers/syringe/antiviral = 4,/obj/item/reagent_containers/food/pill/tox = 1)
@@ -1241,7 +1233,7 @@
/obj/machinery/vending/security
name = "\improper SecTech"
desc = "A security equipment vendor."
- product_ads = "Crack capitalist skulls!;Beat some heads in!;Don't forget - harm is good!;Your weapons are right here.;Handcuffs!;Freeze, scumbag!;Don't tase me bro!;Tase them, bro.;Why not have a donut?"
+ ads_list = list("Crack capitalist skulls!","Beat some heads in!","Don't forget - harm is good!","Your weapons are right here.","Handcuffs!","Freeze, scumbag!","Don't tase me bro!","Tase them, bro.","Why not have a donut?")
icon_state = "sec"
icon_deny = "sec-deny"
req_access_txt = "1"
@@ -1263,8 +1255,8 @@
/obj/machinery/vending/hydronutrients
name = "\improper NutriMax"
desc = "A plant nutrients vendor"
- product_slogans = "Aren't you glad you don't have to fertilize the natural way?;Now with 50% less stink!;Plants are people too!"
- product_ads = "We like plants!;Don't you want some?;The greenest thumbs ever.;We like big plants.;Soft soil..."
+ slogan_list = list("Aren't you glad you don't have to fertilize the natural way?","Now with 50% less stink!","Plants are people too!")
+ ads_list = list("We like plants!","Don't you want some?","The greenest thumbs ever.","We like big plants.","Soft soil...")
icon_state = "nutri"
icon_deny = "nutri-deny"
products = list(/obj/item/reagent_containers/glass/bottle/nutrient/ez = 30,/obj/item/reagent_containers/glass/bottle/nutrient/l4z = 20,/obj/item/reagent_containers/glass/bottle/nutrient/rh = 10,/obj/item/reagent_containers/spray/pestspray = 20,
@@ -1284,8 +1276,8 @@
/obj/machinery/vending/hydroseeds
name = "\improper MegaSeed Servitor"
desc = "When you need seeds fast!"
- product_slogans = "THIS'S WHERE TH' SEEDS LIVE! GIT YOU SOME!;Hands down the best seed selection on the station!;Also certain mushroom varieties available, more for experts! Get certified today!"
- product_ads = "We like plants!;Grow some crops!;Grow, baby, growww!;Aw h'yeah son!"
+ slogan_list = list("THIS'S WHERE TH' SEEDS LIVE! GIT YOU SOME!","Hands down the best seed selection on the station!","Also certain mushroom varieties available, more for experts! Get certified today!")
+ ads_list = list("We like plants!","Grow some crops!","Grow, baby, growww!","Aw h'yeah son!")
icon_state = "seeds"
products = list(/obj/item/seeds/aloe =3,
/obj/item/seeds/ambrosia = 3,
@@ -1354,10 +1346,10 @@
name = "\improper MagiVend"
desc = "A magic vending machine."
icon_state = "MagiVend"
- product_slogans = "Sling spells the proper way with MagiVend!;Be your own Houdini! Use MagiVend!"
+ slogan_list = list("Sling spells the proper way with MagiVend!","Be your own Houdini! Use MagiVend!")
vend_delay = 15
vend_reply = "Have an enchanted evening!"
- product_ads = "FJKLFJSD;AJKFLBJAKL;1234 LOONIES LOL!;>MFW;Kill them fuckers!;GET DAT FUKKEN DISK;HONK!;EI NATH;Destroy the station!;Admin conspiracies since forever!;Space-time bending hardware!"
+ ads_list = list("FJKLFJSD","AJKFLBJAKL","1234 LOONIES LOL!",">MFW","Kill them fuckers!","GET DAT FUKKEN DISK","HONK!","EI NATH","Destroy the station!","Admin conspiracies since forever!","Space-time bending hardware!")
products = list(/obj/item/clothing/head/wizard = 1,
/obj/item/clothing/suit/wizrobe = 1,
/obj/item/clothing/head/wizard/red = 1,
@@ -1381,7 +1373,7 @@
desc = "A vending machine for costumes."
icon_state = "theater"
icon_deny = "theater-deny"
- product_slogans = "Dress for success!;Suited and booted!;It's show time!;Why leave style up to fate? Use AutoDrobe!"
+ slogan_list = list("Dress for success!","Suited and booted!","It's show time!","Why leave style up to fate? Use AutoDrobe!")
vend_delay = 15
vend_reply = "Thank you for using AutoDrobe!"
products = list(/obj/item/clothing/suit/chickensuit = 1,
@@ -1523,7 +1515,7 @@
/obj/machinery/vending/dinnerware
name = "\improper Plasteel Chef's Dinnerware Vendor"
desc = "A kitchen and restaurant equipment vendor."
- product_ads = "Mm, food stuffs!;Food and food accessories.;Get your plates!;You like forks?;I like forks.;Woo, utensils.;You don't really need these..."
+ ads_list = list("Mm, food stuffs!","Food and food accessories.","Get your plates!","You like forks?","I like forks.","Woo, utensils.","You don't really need these...")
icon_state = "dinnerware"
products = list(/obj/item/storage/bag/tray = 8,/obj/item/kitchen/utensil/fork = 6,
/obj/item/kitchen/knife = 3,/obj/item/kitchen/rollingpin = 2,
@@ -1555,7 +1547,7 @@
name = "\improper BODA"
desc = "Old sweet water vending machine."
icon_state = "sovietsoda"
- product_ads = "For Tsar and Country.;Have you fulfilled your nutrition quota today?;Very nice!;We are simple people, for this is all we eat.;If there is a person, there is a problem. If there is no person, then there is no problem."
+ ads_list = list("For Tsar and Country.","Have you fulfilled your nutrition quota today?","Very nice!","We are simple people, for this is all we eat.","If there is a person, there is a problem. If there is no person, then there is no problem.")
products = list(/obj/item/reagent_containers/food/drinks/drinkingglass/soda = 30)
contraband = list(/obj/item/reagent_containers/food/drinks/drinkingglass/cola = 20)
resistance_flags = FIRE_PROOF
@@ -1650,8 +1642,8 @@
/obj/machinery/vending/sustenance
name = "\improper Sustenance Vendor"
desc = "A vending machine which vends food, as required by section 47-C of the NT's Prisoner Ethical Treatment Agreement."
- product_slogans = "Enjoy your meal.;Enough calories to support strenuous labor."
- product_ads = "The healthiest!;Award-winning chocolate bars!;Mmm! So good!;Oh my god it's so juicy!;Have a snack.;Snacks are good for you!;Have some more Getmore!;Best quality snacks straight from mars.;We love chocolate!;Try our new jerky!"
+ slogan_list = list("Enjoy your meal.","Enough calories to support strenuous labor.")
+ ads_list = list("The healthiest!","Award-winning chocolate bars!","Mmm! So good!","Oh my god it's so juicy!","Have a snack.","Snacks are good for you!","Have some more Getmore!","Best quality snacks straight from mars.","We love chocolate!","Try our new jerky!")
icon_state = "sustenance"
products = list(/obj/item/reagent_containers/food/snacks/tofu = 24,
/obj/item/reagent_containers/food/drinks/ice = 12,
@@ -1675,7 +1667,7 @@
name = "\improper Hatlord 9000"
desc = "It doesn't seem the slightest bit unusual. This frustrates you immensely."
icon_state = "hats"
- product_ads = "Warning, not all hats are dog/monkey compatible. Apply forcefully with care.;Apply directly to the forehead.;Who doesn't love spending cash on hats?!;From the people that brought you collectable hat crates, Hatlord!"
+ ads_list = list("Warning, not all hats are dog/monkey compatible. Apply forcefully with care.","Apply directly to the forehead.","Who doesn't love spending cash on hats?!","From the people that brought you collectable hat crates, Hatlord!")
products = list(/obj/item/clothing/head/bowlerhat = 10,
/obj/item/clothing/head/beaverhat = 10,
/obj/item/clothing/head/boaterhat = 10,
@@ -1699,7 +1691,7 @@
name = "\improper Suitlord 9000"
desc = "You wonder for a moment why all of your shirts and pants come conjoined. This hurts your head and you stop thinking about it."
icon_state = "suits"
- product_ads = "Pre-Ironed, Pre-Washed, Pre-Wor-*BZZT*;Blood of your enemies washes right out!;Who are YOU wearing?;Look dapper! Look like an idiot!;Dont carry your size? How about you shave off some pounds you fat lazy- *BZZT*"
+ ads_list = list("Pre-Ironed, Pre-Washed, Pre-Wor-*BZZT*","Blood of your enemies washes right out!","Who are YOU wearing?","Look dapper! Look like an idiot!","Dont carry your size? How about you shave off some pounds you fat lazy- *BZZT*")
products = list(/obj/item/clothing/under/color/black = 10,/obj/item/clothing/under/color/blue = 10,/obj/item/clothing/under/color/green = 10,/obj/item/clothing/under/color/grey = 10,/obj/item/clothing/under/color/pink = 10,/obj/item/clothing/under/color/red = 10,
/obj/item/clothing/under/color/white = 10, /obj/item/clothing/under/color/yellow = 10,/obj/item/clothing/under/color/lightblue = 10,/obj/item/clothing/under/color/aqua = 10,/obj/item/clothing/under/color/purple = 10,/obj/item/clothing/under/color/lightgreen = 10,
/obj/item/clothing/under/color/lightblue = 10,/obj/item/clothing/under/color/lightbrown = 10,/obj/item/clothing/under/color/brown = 10,/obj/item/clothing/under/color/yellowgreen = 10,/obj/item/clothing/under/color/darkblue = 10,/obj/item/clothing/under/color/lightred = 10, /obj/item/clothing/under/color/darkred = 10)
@@ -1720,7 +1712,7 @@
name = "\improper Shoelord 9000"
desc = "Wow, hatlord looked fancy, suitlord looked streamlined, and this is just normal. The guy who designed these must be an idiot."
icon_state = "shoes"
- product_ads = "Put your foot down!;One size fits all!;IM WALKING ON SUNSHINE!;No hobbits allowed.;NO PLEASE WILLY, DONT HURT ME- *BZZT*"
+ ads_list = list("Put your foot down!","One size fits all!","IM WALKING ON SUNSHINE!","No hobbits allowed.","NO PLEASE WILLY, DONT HURT ME- *BZZT*")
products = list(/obj/item/clothing/shoes/black = 10,/obj/item/clothing/shoes/brown = 10,/obj/item/clothing/shoes/blue = 10,/obj/item/clothing/shoes/green = 10,/obj/item/clothing/shoes/yellow = 10,/obj/item/clothing/shoes/purple = 10,/obj/item/clothing/shoes/red = 10,/obj/item/clothing/shoes/white = 10,/obj/item/clothing/shoes/sandal=10)
contraband = list(/obj/item/clothing/shoes/orange = 5)
premium = list(/obj/item/clothing/shoes/rainbow = 1)
@@ -1738,8 +1730,8 @@
/obj/machinery/vending/syndicigs
name = "\improper Suspicious Cigarette Machine"
desc = "Smoke 'em if you've got 'em."
- product_slogans = "Space cigs taste good like a cigarette should.;I'd rather toolbox than switch.;Smoke!;Don't believe the reports - smoke today!"
- product_ads = "Probably not bad for you!;Don't believe the scientists!;It's good for you!;Don't quit, buy more!;Smoke!;Nicotine heaven.;Best cigarettes since 2150.;Award-winning cigs."
+ slogan_list = list("Space cigs taste good like a cigarette should.","I'd rather toolbox than switch.","Smoke!","Don't believe the reports - smoke today!")
+ ads_list = list("Probably not bad for you!","Don't believe the scientists!","It's good for you!","Don't quit, buy more!","Smoke!","Nicotine heaven.","Best cigarettes since 2150.","Award-winning cigs.")
vend_delay = 34
icon_state = "cigs"
products = list(/obj/item/storage/fancy/cigarettes/syndicate = 10,/obj/item/lighter/random = 5)
@@ -1747,8 +1739,8 @@
/obj/machinery/vending/syndisnack
name = "\improper Getmore Chocolate Corp"
desc = "A modified snack machine courtesy of the Getmore Chocolate Corporation, based out of Mars"
- product_slogans = "Try our new nougat bar!;Twice the calories for half the price!"
- product_ads = "The healthiest!;Award-winning chocolate bars!;Mmm! So good!;Oh my god it's so juicy!;Have a snack.;Snacks are good for you!;Have some more Getmore!;Best quality snacks straight from mars.;We love chocolate!;Try our new jerky!"
+ slogan_list = list("Try our new nougat bar!","Twice the calories for half the price!")
+ ads_list = list("The healthiest!","Award-winning chocolate bars!","Mmm! So good!","Oh my god it's so juicy!","Have a snack.","Snacks are good for you!","Have some more Getmore!","Best quality snacks straight from mars.","We love chocolate!","Try our new jerky!")
icon_state = "snack"
products = list(/obj/item/reagent_containers/food/snacks/chips =6,/obj/item/reagent_containers/food/snacks/sosjerky = 6,
/obj/item/reagent_containers/food/snacks/syndicake = 6, /obj/item/reagent_containers/food/snacks/cheesiehonkers = 6)
@@ -1758,7 +1750,7 @@
name = "\improper ClothesMate" //renamed to make the slogan rhyme
desc = "A vending machine for clothing."
icon_state = "clothes"
- product_slogans = "Dress for success!;Prepare to look swagalicious!;Look at all this free swag!;Why leave style up to fate? Use the ClothesMate!"
+ slogan_list = list("Dress for success!","Prepare to look swagalicious!","Look at all this free swag!","Why leave style up to fate? Use the ClothesMate!")
vend_delay = 15
vend_reply = "Thank you for using the ClothesMate!"
products = list(/obj/item/clothing/head/that = 2,
@@ -1859,8 +1851,8 @@
/obj/machinery/vending/artvend
name = "\improper ArtVend"
desc = "A vending machine for art supplies."
- product_slogans = "Stop by for all your artistic needs!;Color the floors with crayons, not blood!;Don't be a starving artist, use ArtVend. ;Don't fart, do art!"
- product_ads = "Just like Kindergarten!;Now with 1000% more vibrant colors!;Screwing with the janitor was never so easy!;Creativity is at the heart of every spessman."
+ slogan_list = list("Stop by for all your artistic needs!","Color the floors with crayons, not blood!","Don't be a starving artist, use ArtVend. ","Don't fart, do art!")
+ ads_list = list("Just like Kindergarten!","Now with 1000% more vibrant colors!","Screwing with the janitor was never so easy!","Creativity is at the heart of every spessman.")
vend_delay = 15
icon_state = "artvend"
products = list(/obj/item/stack/cable_coil/random = 10,/obj/item/camera = 4,/obj/item/camera_film = 6,
@@ -1874,8 +1866,8 @@
/obj/machinery/vending/crittercare
name = "\improper CritterCare"
desc = "A vending machine for pet supplies."
- product_slogans = "Stop by for all your animal's needs!;Cuddly pets deserve a stylish collar!;Pets in space, what could be more adorable?;Freshest fish eggs in the system!;Rocks are the perfect pet, buy one today!"
- product_ads = "House-training costs extra!;Now with 1000% more cat hair!;Allergies are a sign of weakness!;Dogs are man's best friend. Remember that Vulpkanin!; Heat lamps for Unathi!; Vox-y want a cracker?"
+ slogan_list = list("Stop by for all your animal's needs!","Cuddly pets deserve a stylish collar!","Pets in space, what could be more adorable?","Freshest fish eggs in the system!","Rocks are the perfect pet, buy one today!")
+ ads_list = list("House-training costs extra!","Now with 1000% more cat hair!","Allergies are a sign of weakness!","Dogs are man's best friend. Remember that Vulpkanin!"," Heat lamps for Unathi!"," Vox-y want a cracker?")
vend_delay = 15
icon_state = "crittercare"
products = list(/obj/item/clothing/accessory/petcollar = 5, /obj/item/storage/firstaid/aquatic_kit/full =5, /obj/item/fish_eggs/goldfish = 5,
@@ -1909,7 +1901,7 @@
desc = "All the parts you need to build your own custom pc."
icon_state = "modularpc"
icon_deny = "modularpc-deny"
- product_ads = "Get your gamer gear!;The best GPUs for all of your space-crypto needs!;The most robust cooling!;The finest RGB in space!"
+ ads_list = list("Get your gamer gear!","The best GPUs for all of your space-crypto needs!","The most robust cooling!","The finest RGB in space!")
vend_reply = "Game on!"
products = list(/obj/item/modular_computer/laptop = 4,
/obj/item/modular_computer/tablet = 4,
diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm
index 7e626584780..1e7ad8397ee 100644
--- a/code/game/objects/effects/decals/Cleanable/humans.dm
+++ b/code/game/objects/effects/decals/Cleanable/humans.dm
@@ -112,7 +112,8 @@ GLOBAL_LIST_EMPTY(splatter_cache)
/obj/effect/decal/cleanable/trail_holder //not a child of blood on purpose
name = "blood"
- icon_state = "ltrails_1"
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "nothing"
desc = "Your instincts say you shouldn't be following these."
gender = PLURAL
density = FALSE
diff --git a/code/game/objects/effects/spawners/random_spawners.dm b/code/game/objects/effects/spawners/random_spawners.dm
index b32688dbb83..9eb8e9de1a2 100644
--- a/code/game/objects/effects/spawners/random_spawners.dm
+++ b/code/game/objects/effects/spawners/random_spawners.dm
@@ -289,7 +289,6 @@
/obj/item/clothing/glasses/thermal = 1,
/obj/item/chameleon = 1,
/obj/item/reagent_containers/hypospray/autoinjector/stimulants = 1,
- /obj/item/storage/box/syndie_kit/atmosn2ogrenades = 1,
/obj/item/grenade/plastic/x4 = 1)
@@ -304,11 +303,6 @@
/turf/simulated/wall/mineral/plastitanium/nodiagonal = 2,
/obj/structure/falsewall/plastitanium = 2)
-/obj/effect/spawner/random_spawners/syndicate/layout/door/secret
- name = "50pc falsewall 50pc wall"
- result = list(/turf/simulated/wall/mineral/plastitanium/nodiagonal = 1,
- /obj/structure/falsewall/plastitanium = 1)
-
/obj/effect/spawner/random_spawners/syndicate/layout/door/vault
name = "80pc vaultdoor 20pc wall"
result = list(/obj/machinery/door/airlock/hatch/syndicate/vault = 4,
diff --git a/code/game/objects/items/devices/enginepicker.dm b/code/game/objects/items/devices/enginepicker.dm
index fe6bb7e8717..a2fa30a243b 100644
--- a/code/game/objects/items/devices/enginepicker.dm
+++ b/code/game/objects/items/devices/enginepicker.dm
@@ -14,8 +14,12 @@
var/list/list_enginebeacons = list()
var/isactive = FALSE
+/obj/item/enginepicker/Destroy()
+ list_enginebeacons.Cut()
+ return ..()
+
/obj/item/enginepicker/attack_self(mob/living/carbon/user)
- if(usr.stat || !usr.canmove || usr.restrained())
+ if(user.incapacitated())
return
if(!isactive)
diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm
index 5cbd562a002..b8602e671c3 100644
--- a/code/game/objects/items/devices/flash.dm
+++ b/code/game/objects/items/devices/flash.dm
@@ -98,7 +98,7 @@
to_chat(M, "[user] blinds you with the flash!")
if(M.weakeyes)
M.Stun(2)
- M.visible_message("[M] gasps and shields [M.p_their()] eyes!", "You gasp and shields your eyes!")
+ M.visible_message("[M] gasps and shields [M.p_their()] eyes!", "You gasp and shield your eyes!")
else
visible_message("[user] fails to blind [M] with the flash!")
to_chat(user, "You fail to blind [M] with the flash!")
diff --git a/code/game/objects/items/devices/radio/beacon.dm b/code/game/objects/items/devices/radio/beacon.dm
index 517f9f595c5..aa123930323 100644
--- a/code/game/objects/items/devices/radio/beacon.dm
+++ b/code/game/objects/items/devices/radio/beacon.dm
@@ -69,8 +69,8 @@
to_chat(user, "Locked In")
new /obj/machinery/power/singularity_beacon/syndicate( user.loc )
playsound(src, 'sound/effects/pop.ogg', 100, 1, 1)
+ user.drop_item()
qdel(src)
- return
/obj/item/radio/beacon/syndicate/bomb
name = "suspicious beacon"
@@ -82,16 +82,21 @@
to_chat(user, "Locked In")
new /obj/machinery/syndicatebomb( user.loc )
playsound(src, 'sound/effects/pop.ogg', 100, 1, 1)
+ user.drop_item()
qdel(src)
- return
/obj/item/radio/beacon/engine
desc = "A label on it reads: Warning: This device is used for transportation of high-density objects used for high-yield power generation. Stay away!."
anchored = 1 //Let's not move these around. Some folk might get the idea to use these for assassinations
var/list/enginetype = list()
-/obj/item/radio/beacon/engine/Initialize()
+/obj/item/radio/beacon/engine/Initialize(mapload)
LAZYADD(GLOB.engine_beacon_list, src)
+ return ..()
+
+/obj/item/radio/beacon/engine/Destroy()
+ GLOB.engine_beacon_list -= src
+ return ..()
/obj/item/radio/beacon/engine/tesling
name = "Engine Beacon for Tesla and Singularity"
diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm
index b8fd23e78cb..54d42176f52 100644
--- a/code/game/objects/items/stacks/sheets/mineral.dm
+++ b/code/game/objects/items/stacks/sheets/mineral.dm
@@ -298,13 +298,13 @@ GLOBAL_LIST_INIT(sandbag_recipes, list ( \
materials = list(MAT_TITANIUM=MINERAL_MATERIAL_AMOUNT)
point_value = 20
-var/global/list/datum/stack_recipe/titanium_recipes = list (
+GLOBAL_LIST_INIT(titanium_recipes, list(
new/datum/stack_recipe("titanium tile", /obj/item/stack/tile/mineral/titanium, 1, 4, 20),
new/datum/stack_recipe("surgical tray", /obj/structure/table/tray, 2, one_per_turf = 1, on_floor = 1),
- )
+ ))
/obj/item/stack/sheet/mineral/titanium/New(loc, amount=null)
- recipes = titanium_recipes
+ recipes = GLOB.titanium_recipes
..()
/obj/item/stack/sheet/mineral/titanium/fifty
@@ -328,12 +328,12 @@ var/global/list/datum/stack_recipe/titanium_recipes = list (
materials = list(MAT_TITANIUM=2000, MAT_PLASMA=2000)
point_value = 45
-var/global/list/datum/stack_recipe/plastitanium_recipes = list (
+GLOBAL_LIST_INIT(plastitanium_recipes, list(
new/datum/stack_recipe("plas-titanium tile", /obj/item/stack/tile/mineral/plastitanium, 1, 4, 20),
- )
+ ))
/obj/item/stack/sheet/mineral/plastitanium/New(loc, amount=null)
- recipes = plastitanium_recipes
+ recipes = GLOB.plastitanium_recipes
..()
/obj/item/stack/sheet/mineral/enruranium
diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm
index e188279eb8c..1f73e5c7062 100644
--- a/code/game/objects/items/weapons/handcuffs.dm
+++ b/code/game/objects/items/weapons/handcuffs.dm
@@ -37,6 +37,9 @@
cuff(C, user)
/obj/item/restraints/handcuffs/proc/cuff(mob/living/carbon/C, mob/user, remove_src = TRUE)
+ if(!istype(C)) // Shouldn't be able to cuff anything but carbons.
+ return
+
if(ishuman(C))
var/mob/living/carbon/human/H = C
if(!(H.has_left_hand() || H.has_right_hand()))
diff --git a/code/game/objects/items/weapons/implants/implant_storage.dm b/code/game/objects/items/weapons/implants/implant_storage.dm
index 18b08bba283..b530fd860fa 100644
--- a/code/game/objects/items/weapons/implants/implant_storage.dm
+++ b/code/game/objects/items/weapons/implants/implant_storage.dm
@@ -20,6 +20,10 @@
..()
storage = new /obj/item/storage/hidden/implant(src)
+/obj/item/implant/storage/emp_act(severity)
+ ..()
+ storage.emp_act(severity)
+
/obj/item/implant/storage/activate()
storage.MouseDrop(imp_in)
diff --git a/code/game/objects/items/weapons/misc.dm b/code/game/objects/items/weapons/misc.dm
index 0732c0fdd1d..40d68cc8fc6 100644
--- a/code/game/objects/items/weapons/misc.dm
+++ b/code/game/objects/items/weapons/misc.dm
@@ -77,6 +77,10 @@
item_state = "gift"
w_class = WEIGHT_CLASS_BULKY
+/obj/item/gift/emp_act(severity)
+ ..()
+ gift.emp_act(severity)
+
/obj/item/kidanglobe
name = "Kidan homeworld globe"
icon = 'icons/obj/decorations.dmi'
diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm
index 755b0076c3c..403088e2b71 100644
--- a/code/game/objects/items/weapons/storage/belt.dm
+++ b/code/game/objects/items/weapons/storage/belt.dm
@@ -134,7 +134,8 @@
/obj/item/rad_laser,
/obj/item/sensor_device,
/obj/item/wrench/medical,
- /obj/item/handheld_defibrillator
+ /obj/item/handheld_defibrillator,
+ /obj/item/reagent_containers/applicator
)
/obj/item/storage/belt/medical/surgery
diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm
index a9da4a69241..4ff769a7d3f 100644
--- a/code/game/objects/items/weapons/storage/firstaid.dm
+++ b/code/game/objects/items/weapons/storage/firstaid.dm
@@ -14,7 +14,7 @@
icon_state = "firstaid"
throw_speed = 2
throw_range = 8
- var/empty = 0
+ var/empty = FALSE
req_one_access =list(ACCESS_MEDICAL, ACCESS_ROBOTICS) //Access and treatment are utilized for medbots.
var/treatment_brute = "salglu_solution"
var/treatment_oxy = "salbutamol"
@@ -33,39 +33,51 @@
item_state = "firstaid-ointment"
med_bot_skin = "ointment"
- New()
- ..()
- if(empty) return
-
- icon_state = pick("ointment","firefirstaid")
-
- new /obj/item/reagent_containers/food/pill/patch/silver_sulf( src )
- new /obj/item/reagent_containers/food/pill/patch/silver_sulf( src )
- new /obj/item/reagent_containers/food/pill/patch/silver_sulf( src )
- new /obj/item/reagent_containers/food/pill/patch/silver_sulf( src )
- new /obj/item/healthanalyzer( src )
- new /obj/item/reagent_containers/hypospray/autoinjector( src )
- new /obj/item/reagent_containers/food/pill/salicylic( src )
+/obj/item/storage/firstaid/fire/New()
+ ..()
+ if(empty)
return
+ icon_state = pick("ointment", "firefirstaid")
+ new /obj/item/reagent_containers/applicator/burn(src)
+ new /obj/item/reagent_containers/food/pill/patch/silver_sulf/small(src)
+ new /obj/item/healthanalyzer(src)
+ new /obj/item/reagent_containers/hypospray/autoinjector(src)
+ new /obj/item/reagent_containers/food/pill/salicylic(src)
/obj/item/storage/firstaid/fire/empty
- empty = 1
+ empty = TRUE
/obj/item/storage/firstaid/regular
desc = "A general medical kit that contains medical patches for both brute damage and burn damage. Also contains an epinephrine syringe for emergency use and a health analyzer"
icon_state = "firstaid"
- New()
- ..()
- if(empty) return
- new /obj/item/reagent_containers/food/pill/patch/styptic( src )
- new /obj/item/reagent_containers/food/pill/patch/styptic( src )
- new /obj/item/reagent_containers/food/pill/salicylic( src )
- new /obj/item/reagent_containers/food/pill/patch/silver_sulf( src )
- new /obj/item/reagent_containers/food/pill/patch/silver_sulf( src )
- new /obj/item/healthanalyzer( src )
- new /obj/item/reagent_containers/hypospray/autoinjector( src )
+/obj/item/storage/firstaid/regular/New()
+ ..()
+ if(empty)
return
+ new /obj/item/reagent_containers/food/pill/patch/styptic(src)
+ new /obj/item/reagent_containers/food/pill/patch/styptic(src)
+ new /obj/item/reagent_containers/food/pill/salicylic(src)
+ new /obj/item/reagent_containers/food/pill/patch/silver_sulf(src)
+ new /obj/item/reagent_containers/food/pill/patch/silver_sulf(src)
+ new /obj/item/healthanalyzer(src)
+ new /obj/item/reagent_containers/hypospray/autoinjector(src)
+
+/obj/item/storage/firstaid/doctor
+ desc = "A general medical kit that contains medical patches for both brute damage and burn damage. Also contains an epinephrine syringe for emergency use and a health analyzer"
+ icon_state = "firstaid"
+
+/obj/item/storage/firstaid/doctor/New()
+ ..()
+ if(empty)
+ return
+ new /obj/item/reagent_containers/applicator/brute(src)
+ new /obj/item/reagent_containers/applicator/burn(src)
+ new /obj/item/reagent_containers/food/pill/patch/styptic(src)
+ new /obj/item/reagent_containers/food/pill/patch/silver_sulf(src)
+ new /obj/item/reagent_containers/food/pill/salicylic(src)
+ new /obj/item/healthanalyzer/advanced(src)
+ new /obj/item/reagent_containers/hypospray/autoinjector(src)
/obj/item/storage/firstaid/toxin
name = "toxin first aid kit"
@@ -74,23 +86,21 @@
item_state = "firstaid-toxin"
med_bot_skin = "tox"
- New()
- ..()
- if(empty) return
-
- icon_state = pick("antitoxin","antitoxfirstaid","antitoxfirstaid2","antitoxfirstaid3")
-
- new /obj/item/reagent_containers/syringe/charcoal( src )
- new /obj/item/reagent_containers/syringe/charcoal( src )
- new /obj/item/reagent_containers/syringe/charcoal( src )
- new /obj/item/reagent_containers/food/pill/charcoal( src )
- new /obj/item/reagent_containers/food/pill/charcoal( src )
- new /obj/item/reagent_containers/food/pill/charcoal( src )
- new /obj/item/healthanalyzer( src )
+/obj/item/storage/firstaid/toxin/New()
+ ..()
+ if(empty)
return
+ icon_state = pick("antitoxin", "antitoxfirstaid", "antitoxfirstaid2", "antitoxfirstaid3")
+ new /obj/item/reagent_containers/syringe/charcoal(src)
+ new /obj/item/reagent_containers/syringe/charcoal(src)
+ new /obj/item/reagent_containers/syringe/charcoal(src)
+ new /obj/item/reagent_containers/food/pill/charcoal(src)
+ new /obj/item/reagent_containers/food/pill/charcoal(src)
+ new /obj/item/reagent_containers/food/pill/charcoal(src)
+ new /obj/item/healthanalyzer(src)
/obj/item/storage/firstaid/toxin/empty
- empty = 1
+ empty = TRUE
/obj/item/storage/firstaid/o2
name = "oxygen deprivation first aid kit"
@@ -99,18 +109,18 @@
item_state = "firstaid-o2"
med_bot_skin = "o2"
- New()
- ..()
- if(empty) return
- new /obj/item/reagent_containers/food/pill/salbutamol( src )
- new /obj/item/reagent_containers/food/pill/salbutamol( src )
- new /obj/item/reagent_containers/food/pill/salbutamol( src )
- new /obj/item/reagent_containers/food/pill/salbutamol( src )
- new /obj/item/healthanalyzer( src )
+/obj/item/storage/firstaid/o2/New()
+ ..()
+ if(empty)
return
+ new /obj/item/reagent_containers/food/pill/salbutamol(src)
+ new /obj/item/reagent_containers/food/pill/salbutamol(src)
+ new /obj/item/reagent_containers/food/pill/salbutamol(src)
+ new /obj/item/reagent_containers/food/pill/salbutamol(src)
+ new /obj/item/healthanalyzer(src)
/obj/item/storage/firstaid/o2/empty
- empty = 1
+ empty = TRUE
/obj/item/storage/firstaid/brute
name = "brute trauma treatment kit"
@@ -119,23 +129,19 @@
item_state = "firstaid-brute"
med_bot_skin = "brute"
- New()
- ..()
- if(empty) return
-
- icon_state = pick("brute","brute2")
-
- new /obj/item/reagent_containers/food/pill/patch/styptic(src)
- new /obj/item/reagent_containers/food/pill/patch/styptic(src)
- new /obj/item/reagent_containers/food/pill/patch/styptic(src)
- new /obj/item/reagent_containers/food/pill/patch/styptic(src)
- new /obj/item/healthanalyzer(src)
- new /obj/item/reagent_containers/hypospray/autoinjector(src)
- new /obj/item/stack/medical/bruise_pack(src)
+/obj/item/storage/firstaid/brute/New()
+ ..()
+ if(empty)
return
+ icon_state = pick("brute", "brute2")
+ new /obj/item/reagent_containers/applicator/brute(src)
+ new /obj/item/reagent_containers/food/pill/patch/styptic/small(src)
+ new /obj/item/healthanalyzer(src)
+ new /obj/item/reagent_containers/hypospray/autoinjector(src)
+ new /obj/item/stack/medical/bruise_pack(src)
/obj/item/storage/firstaid/brute/empty
- empty = 1
+ empty = TRUE
/obj/item/storage/firstaid/adv
name = "advanced first-aid kit"
@@ -157,7 +163,7 @@
new /obj/item/healthanalyzer(src)
/obj/item/storage/firstaid/adv/empty
- empty = 1
+ empty = TRUE
/obj/item/storage/firstaid/machine
name = "machine repair kit"
@@ -178,7 +184,7 @@
new /obj/item/robotanalyzer(src)
/obj/item/storage/firstaid/machine/empty
- empty = 1
+ empty = TRUE
/obj/item/storage/firstaid/tactical
@@ -196,18 +202,15 @@
/obj/item/storage/firstaid/tactical/New()
..()
- if(empty) return
+ if(empty)
+ return
new /obj/item/reagent_containers/hypospray/combat(src)
- new /obj/item/reagent_containers/food/pill/patch/synthflesh(src) // Because you ain't got no time to look at what damage dey taking yo
- new /obj/item/reagent_containers/food/pill/patch/synthflesh(src)
- new /obj/item/reagent_containers/food/pill/patch/synthflesh(src)
- new /obj/item/reagent_containers/food/pill/patch/synthflesh(src)
+ new /obj/item/reagent_containers/applicator/dual(src) // Because you ain't got no time to look at what damage dey taking yo
new /obj/item/defibrillator/compact/combat/loaded(src)
new /obj/item/clothing/glasses/hud/health/night(src)
- return
/obj/item/storage/firstaid/tactical/empty
- empty =1
+ empty = TRUE
/obj/item/storage/firstaid/surgery
name = "field surgery kit"
@@ -347,15 +350,15 @@
desc = "Contains pills used to counter toxins."
wrapper_color = COLOR_GREEN
- New()
- ..()
- new /obj/item/reagent_containers/food/pill/charcoal( src )
- new /obj/item/reagent_containers/food/pill/charcoal( src )
- new /obj/item/reagent_containers/food/pill/charcoal( src )
- new /obj/item/reagent_containers/food/pill/charcoal( src )
- new /obj/item/reagent_containers/food/pill/charcoal( src )
- new /obj/item/reagent_containers/food/pill/charcoal( src )
- new /obj/item/reagent_containers/food/pill/charcoal( src )
+/obj/item/storage/pill_bottle/charcoal/New()
+ ..()
+ new /obj/item/reagent_containers/food/pill/charcoal(src)
+ new /obj/item/reagent_containers/food/pill/charcoal(src)
+ new /obj/item/reagent_containers/food/pill/charcoal(src)
+ new /obj/item/reagent_containers/food/pill/charcoal(src)
+ new /obj/item/reagent_containers/food/pill/charcoal(src)
+ new /obj/item/reagent_containers/food/pill/charcoal(src)
+ new /obj/item/reagent_containers/food/pill/charcoal(src)
/obj/item/storage/pill_bottle/painkillers
name = "Pill Bottle (Salicylic Acid)"
diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm
index 1ff2b2f2c56..0aa7d976082 100644
--- a/code/game/objects/items/weapons/storage/storage.dm
+++ b/code/game/objects/items/weapons/storage/storage.dm
@@ -481,10 +481,10 @@
return ..()
/obj/item/storage/emp_act(severity)
- if(!istype(loc, /mob/living))
- for(var/obj/O in contents)
- O.emp_act(severity)
..()
+ for(var/i in contents)
+ var/atom/A = i
+ A.emp_act(severity)
/obj/item/storage/hear_talk(mob/living/M as mob, list/message_pieces)
..()
diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm
index 57c9a5301f6..ed857c18ded 100644
--- a/code/game/objects/items/weapons/twohanded.dm
+++ b/code/game/objects/items/weapons/twohanded.dm
@@ -179,6 +179,7 @@
slot_flags = SLOT_BACK
force_unwielded = 5
force_wielded = 24
+ toolspeed = 0.25
attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut")
hitsound = 'sound/weapons/bladeslice.ogg'
usesound = 'sound/items/crowbar.ogg'
@@ -542,6 +543,7 @@
w_class = WEIGHT_CLASS_BULKY // can't fit in backpacks
force_unwielded = 15 //still pretty robust
force_wielded = 40 //you'll gouge their eye out! Or a limb...maybe even their entire body!
+ hitsound = null // Handled in the snowflaked attack proc
wieldsound = 'sound/weapons/chainsawstart.ogg'
hitsound = null
armour_penetration = 35
diff --git a/code/game/objects/structures/depot.dm b/code/game/objects/structures/depot.dm
index e970ac911dc..11eb03c94c5 100644
--- a/code/game/objects/structures/depot.dm
+++ b/code/game/objects/structures/depot.dm
@@ -79,7 +79,6 @@
var/beepsound = 'sound/items/timer.ogg'
var/deliberate = FALSE
var/max_cycles = 10
- var/max_fire_range = 9
var/area/syndicate_depot/core/depotarea
/obj/effect/overload/New()
@@ -101,10 +100,6 @@
if(!deliberate)
playsound(loc, beepsound, 50, 0)
cycles++
- var/fire_range = min(cycles, max_fire_range)
-
- for(var/turf/simulated/turf in range(fire_range, T))
- new /obj/effect/hotspot(turf)
return
if(!istype(depotarea))
diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm
index e425c3458c3..2d886f44bfd 100644
--- a/code/game/turfs/simulated/floor.dm
+++ b/code/game/turfs/simulated/floor.dm
@@ -187,7 +187,7 @@ GLOBAL_LIST_INIT(icons_to_ignore_at_floor_init, list("damaged1","damaged2","dama
if(T.turf_type == type)
return
var/obj/item/thing = user.get_inactive_hand()
- if(!prying_tool_list.Find(thing.tool_behaviour))
+ if(!thing || !prying_tool_list.Find(thing.tool_behaviour))
return
var/turf/simulated/floor/plating/P = pry_tile(thing, user, TRUE)
if(!istype(P))
diff --git a/code/modules/admin/admin_ranks.dm b/code/modules/admin/admin_ranks.dm
index 1986bd8f787..fdf3d0dc8d0 100644
--- a/code/modules/admin/admin_ranks.dm
+++ b/code/modules/admin/admin_ranks.dm
@@ -51,7 +51,7 @@ GLOBAL_PROTECT(admin_ranks) // this shit is being protected for obvious reasons
#ifdef TESTING
var/msg = "Permission Sets Built:\n"
- for(var/rank in admin_ranks)
+ for(var/rank in GLOB.admin_ranks)
msg += "\t[rank] - [GLOB.admin_ranks[rank]]\n"
testing(msg)
#endif
@@ -142,12 +142,12 @@ GLOBAL_PROTECT(admin_ranks) // this shit is being protected for obvious reasons
#ifdef TESTING
-/client/verb/changerank(newrank in admin_ranks)
+/client/verb/changerank(newrank in GLOB.admin_ranks)
if(holder)
holder.rank = newrank
- holder.rights = admin_ranks[newrank]
+ holder.rights = GLOB.admin_ranks[newrank]
else
- holder = new /datum/admins(newrank,admin_ranks[newrank],ckey)
+ holder = new /datum/admins(newrank,GLOB.admin_ranks[newrank],ckey)
remove_admin_verbs()
holder.associate(src)
diff --git a/code/modules/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm
index fc268c3ba35..d7e298e8c96 100644
--- a/code/modules/awaymissions/gateway.dm
+++ b/code/modules/awaymissions/gateway.dm
@@ -1,4 +1,4 @@
-var/obj/machinery/gateway/centerstation/the_gateway = null
+GLOBAL_DATUM_INIT(the_gateway, /obj/machinery/gateway/centerstation, null)
/obj/machinery/gateway
name = "gateway"
desc = "A mysterious gateway built by unknown hands, it allows for faster than light travel to far-flung locations."
@@ -41,8 +41,8 @@ var/obj/machinery/gateway/centerstation/the_gateway = null
/obj/machinery/gateway/centerstation/New()
..()
- if(!the_gateway)
- the_gateway = src
+ if(!GLOB.the_gateway)
+ GLOB.the_gateway = src
/obj/machinery/gateway/centerstation/Initialize()
..()
@@ -54,8 +54,8 @@ var/obj/machinery/gateway/centerstation/the_gateway = null
return
/obj/machinery/gateway/centerstation/Destroy()
- if(the_gateway == src)
- the_gateway = null
+ if(GLOB.the_gateway == src)
+ GLOB.the_gateway = null
return ..()
/obj/machinery/gateway/centerstation/update_icon()
diff --git a/code/modules/awaymissions/mission_code/ruins/gps.dm b/code/modules/awaymissions/mission_code/ruins/gps.dm
new file mode 100644
index 00000000000..fa26eea5d0d
--- /dev/null
+++ b/code/modules/awaymissions/mission_code/ruins/gps.dm
@@ -0,0 +1,13 @@
+//local gps units to let the ruins be found easier.
+
+/obj/item/gps/ruin
+ name = "navigation console"
+ desc = "A console for navigation in local space, gives off a weak signal that can be picked up if sufficiently close."
+ icon = 'icons/obj/terminals.dmi'
+ icon_state = "gps_console"
+ anchored = TRUE
+ local = TRUE
+ gpstag = "Unknown Signal"
+
+/obj/item/gps/ruin/attack_hand(mob/user)
+ attack_self(user)
diff --git a/code/modules/client/client defines.dm b/code/modules/client/client defines.dm
index 85615be1ee5..a063fafd736 100644
--- a/code/modules/client/client defines.dm
+++ b/code/modules/client/client defines.dm
@@ -28,13 +28,6 @@
var/adminhelped = 0
- // var/gc_destroyed //Time when this object was destroyed. [Inherits from datum]
-
-#ifdef TESTING
- var/running_find_references
- var/last_find_references = 0
-#endif
-
///////////////
//SOUND STUFF//
///////////////
diff --git a/code/modules/client/preference/loadout/loadout_general.dm b/code/modules/client/preference/loadout/loadout_general.dm
index 50105813fd6..8c08063ad7e 100644
--- a/code/modules/client/preference/loadout/loadout_general.dm
+++ b/code/modules/client/preference/loadout/loadout_general.dm
@@ -29,7 +29,7 @@
/datum/gear/sechud
display_name = "a classic security HUD"
path = /obj/item/clothing/glasses/hud/security
- allowed_roles = list("Head of Security", "Warden", "Security Officer", "Security Pod Pilot", "Internal Affairs Agent")
+ allowed_roles = list("Head of Security", "Warden", "Security Officer", "Security Pod Pilot", "Internal Affairs Agent","Magistrate")
/datum/gear/matches
display_name = "a box of matches"
@@ -42,7 +42,7 @@
/datum/gear/doublecards
display_name = "a double deck of standard cards"
path = /obj/item/deck/doublecards
-
+
/datum/gear/tarot
display_name = "a deck of tarot cards"
path = /obj/item/deck/tarot
diff --git a/code/modules/client/preference/preferences.dm b/code/modules/client/preference/preferences.dm
index b8a022c02af..2576f791e57 100644
--- a/code/modules/client/preference/preferences.dm
+++ b/code/modules/client/preference/preferences.dm
@@ -489,7 +489,7 @@ GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts
dat += "You are banned from special roles."
be_special = list()
else
- for(var/i in special_roles)
+ for(var/i in GLOB.special_roles)
if(jobban_isbanned(user, i))
dat += "Be [capitalize(i)]: \[BANNED]
"
else if(!player_old_enough_antag(user.client, i))
@@ -2023,7 +2023,7 @@ GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts
if("be_special")
var/r = href_list["role"]
- if(r in special_roles)
+ if(r in GLOB.special_roles)
be_special ^= r
if("name")
diff --git a/code/modules/client/preference/preferences_mysql.dm b/code/modules/client/preference/preferences_mysql.dm
index a994e875372..70eaf6fbea4 100644
--- a/code/modules/client/preference/preferences_mysql.dm
+++ b/code/modules/client/preference/preferences_mysql.dm
@@ -84,7 +84,7 @@
// Might as well scrub out any malformed be_special list entries while we're here
for(var/role in be_special)
- if(!(role in special_roles))
+ if(!(role in GLOB.special_roles))
log_runtime(EXCEPTION("[C.key] had a malformed role entry: '[role]'. Removing!"), src)
be_special -= role
diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm
index 0255109620a..456372006c6 100644
--- a/code/modules/clothing/head/soft_caps.dm
+++ b/code/modules/clothing/head/soft_caps.dm
@@ -104,7 +104,7 @@
/obj/item/clothing/head/soft/sec
name = "security cap"
- desc = "It's baseball hat in tasteful red colour."
+ desc = "It's a baseball hat in tasteful red colour."
icon_state = "secsoft"
item_color = "sec"
armor = list("melee" = 30, "bullet" = 25, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 50)
@@ -113,7 +113,7 @@
/obj/item/clothing/head/soft/sec/corp
name = "corporate security cap"
- desc = "It's baseball hat in corpotate colours."
+ desc = "It's a baseball hat in corporate colours."
icon_state = "corpsoft"
item_color = "corp"
diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm
index bcb71edf356..d926730942e 100644
--- a/code/modules/clothing/suits/jobs.dm
+++ b/code/modules/clothing/suits/jobs.dm
@@ -7,7 +7,7 @@
desc = "A hazard vest used in the recovery of bodies."
icon_state = "paramedic-vest"
item_state = "paramedic-vest"
- allowed = list(/obj/item/stack/medical, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/syringe, \
+ allowed = list(/obj/item/stack/medical, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/applicator, /obj/item/reagent_containers/syringe,
/obj/item/healthanalyzer, /obj/item/flashlight, /obj/item/radio, /obj/item/tank/emergency_oxygen,/obj/item/rad_laser)
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 10, fire = 50, acid = 50)
@@ -21,7 +21,7 @@
desc = "A vest often worn by doctors caring for inmates."
icon_state = "brigphysician-vest"
item_state = "brigphysician-vest"
- allowed = list(/obj/item/stack/medical, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/syringe, \
+ allowed = list(/obj/item/stack/medical, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/applicator, /obj/item/reagent_containers/syringe,
/obj/item/healthanalyzer, /obj/item/flashlight, \
/obj/item/radio, /obj/item/tank/emergency_oxygen,/obj/item/rad_laser)
armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0, fire = 50, acid = 50)
@@ -341,7 +341,7 @@
icon_state = "fr_jacket_open"
item_state = "fr_jacket_open"
blood_overlay_type = "armor"
- allowed = list(/obj/item/stack/medical, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/syringe, \
+ allowed = list(/obj/item/stack/medical, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/applicator, /obj/item/reagent_containers/syringe,
/obj/item/healthanalyzer, /obj/item/flashlight, /obj/item/radio, /obj/item/tank/emergency_oxygen,/obj/item/rad_laser)
ignore_suitadjust = 0
suit_adjusted = 1
@@ -381,5 +381,5 @@
desc = "A tweed mantle, worn by the Research Director. Smells like science."
icon_state = "rdmantle"
item_state = "rdmantle"
- allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/food/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/rad_laser)
+ allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/applicator, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/food/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/rad_laser)
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 50, rad = 0, fire = 50, acid = 50)
diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm
index 03df1bd74d8..5281a32676e 100644
--- a/code/modules/clothing/suits/labcoat.dm
+++ b/code/modules/clothing/suits/labcoat.dm
@@ -7,7 +7,7 @@
suit_adjusted = 1
blood_overlay_type = "coat"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
- allowed = list(/obj/item/analyzer,/obj/item/stack/medical,/obj/item/dnainjector,/obj/item/reagent_containers/dropper,/obj/item/reagent_containers/syringe,/obj/item/reagent_containers/hypospray,/obj/item/healthanalyzer,/obj/item/flashlight/pen,/obj/item/reagent_containers/glass/bottle,/obj/item/reagent_containers/glass/beaker,/obj/item/reagent_containers/food/pill,/obj/item/storage/pill_bottle,/obj/item/paper,/obj/item/rad_laser)
+ allowed = list(/obj/item/analyzer,/obj/item/stack/medical,/obj/item/dnainjector,/obj/item/reagent_containers/dropper,/obj/item/reagent_containers/syringe,/obj/item/reagent_containers/hypospray,/obj/item/reagent_containers/applicator,/obj/item/healthanalyzer,/obj/item/flashlight/pen,/obj/item/reagent_containers/glass/bottle,/obj/item/reagent_containers/glass/beaker,/obj/item/reagent_containers/food/pill,/obj/item/storage/pill_bottle,/obj/item/paper,/obj/item/rad_laser)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 50, "acid" = 50)
species_exception = list(/datum/species/golem)
sprite_sheets = list(
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index cd137f6e12b..72f403dfbf3 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -394,7 +394,7 @@
name = "medical winter coat"
icon_state = "wintercoat_med"
item_state = "coatmedical"
- allowed = list(/obj/item/analyzer, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer,/obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic)
+ allowed = list(/obj/item/analyzer, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/applicator,/obj/item/healthanalyzer,/obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 0, "acid" = 45)
hoodtype = /obj/item/clothing/head/hooded/winterhood/medical
@@ -405,7 +405,7 @@
name = "science winter coat"
icon_state = "wintercoat_sci"
item_state = "coatscience"
- allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer,/obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic)
+ allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/applicator,/obj/item/healthanalyzer,/obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic)
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 10, bio = 0, rad = 0, fire = 0, acid = 0)
hoodtype = /obj/item/clothing/head/hooded/winterhood/science
@@ -958,7 +958,8 @@
if(linked_staff.faith >= 100) //if the linked staff is fully recharged, do nothing
return
- if(!(linked_staff in range(3, get_turf(src)))) //staff won't charge at range (to prevent it from being handed off / stolen and used)
+ // Do not allow the staff to recharge if it's more than 3 tiles away from the robe. If get_dist returns 0, the robe and the staff in the same tile.
+ if(!(get_dist(H, linked_staff) <= 3))
if(prob(10)) //10% chance per process should avoid being too spammy, can tweak if it ends up still being too frequent.
to_chat(H, "Your staff is unable to charge at this range. Get closer!")
return
diff --git a/code/modules/clothing/suits/storage.dm b/code/modules/clothing/suits/storage.dm
index 0c77183b578..9a675742b5e 100644
--- a/code/modules/clothing/suits/storage.dm
+++ b/code/modules/clothing/suits/storage.dm
@@ -25,8 +25,8 @@
return pockets.attackby(W, user, params)
/obj/item/clothing/suit/storage/emp_act(severity)
- pockets.emp_act(severity)
..()
+ pockets.emp_act(severity)
/obj/item/clothing/suit/storage/hear_talk(mob/M, list/message_pieces)
pockets.hear_talk(M, message_pieces)
diff --git a/code/modules/clothing/under/accessories/storage.dm b/code/modules/clothing/under/accessories/storage.dm
index 16eb1cd476a..727aba06b37 100644
--- a/code/modules/clothing/under/accessories/storage.dm
+++ b/code/modules/clothing/under/accessories/storage.dm
@@ -37,8 +37,8 @@
return hold.attackby(W, user, params)
/obj/item/clothing/accessory/storage/emp_act(severity)
- hold.emp_act(severity)
..()
+ hold.emp_act(severity)
/obj/item/clothing/accessory/storage/hear_talk(mob/M, list/message_pieces, verb)
hold.hear_talk(M, message_pieces, verb)
diff --git a/code/modules/hydroponics/grown/apple.dm b/code/modules/hydroponics/grown/apple.dm
index 1344a8c39b0..7510c3cdfb6 100644
--- a/code/modules/hydroponics/grown/apple.dm
+++ b/code/modules/hydroponics/grown/apple.dm
@@ -24,7 +24,7 @@
filling_color = "#FF4500"
bitesize = 100 // Always eat the apple in one bite
tastes = list("apple" = 1)
- distill_reagent = "hcider"
+ distill_reagent = "cider"
// Posioned Apple
/obj/item/seeds/apple/poisoned
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index c4cd95eeb83..3efcc7a9ce9 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -9,12 +9,18 @@
qdel(item)
QDEL_LIST(internal_organs)
QDEL_LIST(stomach_contents)
+ QDEL_LIST(processing_patches)
var/mob/living/simple_animal/borer/B = has_brain_worms()
if(B)
B.leave_host()
qdel(B)
return ..()
+/mob/living/carbon/handle_atom_del(atom/A)
+ if(A in processing_patches)
+ processing_patches -= A
+ return ..()
+
/mob/living/carbon/blob_act(obj/structure/blob/B)
if(stat == DEAD)
return
@@ -920,9 +926,10 @@ GLOBAL_LIST_INIT(ventcrawl_machinery, list(/obj/machinery/atmospherics/unary/ven
return initial(pixel_y)
/mob/living/carbon/emp_act(severity)
- for(var/obj/item/organ/internal/O in internal_organs)
- O.emp_act(severity)
..()
+ for(var/X in internal_organs)
+ var/obj/item/organ/internal/O = X
+ O.emp_act(severity)
/mob/living/carbon/Stat()
..()
@@ -1073,8 +1080,9 @@ so that different stomachs can handle things in different ways VB*/
if(can_taste_container)
taste(toEat.reagents)
var/fraction = min(this_bite/toEat.reagents.total_volume, 1)
- toEat.reagents.reaction(src, toEat.apply_type, fraction)
- toEat.reagents.trans_to(src, this_bite*toEat.transfer_efficiency)
+ if(fraction)
+ toEat.reagents.reaction(src, toEat.apply_type, fraction)
+ toEat.reagents.trans_to(src, this_bite*toEat.transfer_efficiency)
/mob/living/carbon/get_access()
. = ..()
diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm
index 884ee802518..97ecf4dd08b 100644
--- a/code/modules/mob/living/carbon/carbon_defines.dm
+++ b/code/modules/mob/living/carbon/carbon_defines.dm
@@ -2,6 +2,7 @@
gender = MALE
pressure_resistance = 15
var/list/stomach_contents = list()
+ var/list/processing_patches = list()
var/list/internal_organs = list()
var/list/internal_organs_slot = list() //Same as above, but stores "slot ID" - "organ" pairs for easy access.
var/antibodies = 0
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index 1bb1a8cf536..c1f6acdefe5 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -400,7 +400,9 @@
var/turf/newloc = G.affecting.loc
if(isturf(oldloc) && isturf(newloc))
SpinAnimation(5,1)
+ glide_for(6) // This and the glide_for below are purely arbitrary. Pick something that looks aesthetically pleasing.
forceMove(newloc)
+ G.glide_for(6)
G.affecting.forceMove(oldloc)
message = "[src] flips over [G.affecting]!"
else
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index ad1d249439d..d698a68c6d5 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -206,12 +206,6 @@ emp_act
if(martial_art && prob(martial_art.block_chance) && martial_art.can_use(src) && in_throw_mode && !incapacitated(FALSE, TRUE))
return TRUE
-/mob/living/carbon/human/emp_act(severity)
- for(var/obj/O in src)
- if(!O) continue
- O.emp_act(severity)
- ..()
-
/mob/living/carbon/human/acid_act(acidpwr, acid_volume, bodyzone_hit) //todo: update this to utilize check_obscured_slots() //and make sure it's check_obscured_slots(TRUE) to stop aciding through visors etc
var/list/damaged = list()
var/list/inventory_items_to_kill = list()
diff --git a/code/modules/mob/living/carbon/human/species/_species.dm b/code/modules/mob/living/carbon/human/species/_species.dm
index bb3d2609010..67dd9b55312 100644
--- a/code/modules/mob/living/carbon/human/species/_species.dm
+++ b/code/modules/mob/living/carbon/human/species/_species.dm
@@ -84,6 +84,7 @@
var/single_gib_type = /obj/effect/decal/cleanable/blood/gibs
var/remains_type = /obj/effect/decal/remains/human //What sort of remains is left behind when the species dusts
var/base_color //Used when setting species.
+ var/list/inherent_factions
//Used in icon caching.
var/race_key = 0
@@ -285,11 +286,19 @@
H.hud_used.update_locked_slots()
H.ventcrawler = ventcrawler
+ if(inherent_factions)
+ for(var/i in inherent_factions)
+ H.faction += i //Using +=/-= for this in case you also gain the faction from a different source.
+
/datum/species/proc/on_species_loss(mob/living/carbon/human/H)
if(H.butcher_results) //clear it out so we don't butcher a actual human.
H.butcher_results = null
H.ventcrawler = initial(H.ventcrawler)
+ if(inherent_factions)
+ for(var/i in inherent_factions)
+ H.faction -= i
+
/datum/species/proc/updatespeciescolor(mob/living/carbon/human/H) //Handles changing icobase for species that have multiple skin colors.
return
diff --git a/code/modules/mob/living/carbon/human/species/diona.dm b/code/modules/mob/living/carbon/human/species/diona.dm
index 22edf961270..a8639a1a948 100644
--- a/code/modules/mob/living/carbon/human/species/diona.dm
+++ b/code/modules/mob/living/carbon/human/species/diona.dm
@@ -108,13 +108,4 @@
/datum/species/diona/pod //Same name and everything; we want the same limitations on them; we just want their regeneration to kick in at all times and them to have special factions
pod = TRUE
-
-/datum/species/diona/pod/on_species_gain(mob/living/carbon/C, datum/species/old_species)
- . = ..()
- C.faction |= "plants"
- C.faction |= "vines"
-
-/datum/species/diona/pod/on_species_loss(mob/living/carbon/C)
- . = ..()
- C.faction -= "plants"
- C.faction -= "vines"
+ inherent_factions = list("plants", "vines")
diff --git a/code/modules/mob/living/carbon/human/species/shadow.dm b/code/modules/mob/living/carbon/human/species/shadow.dm
index 7d1d4c26a61..63f062b8bc8 100644
--- a/code/modules/mob/living/carbon/human/species/shadow.dm
+++ b/code/modules/mob/living/carbon/human/species/shadow.dm
@@ -5,6 +5,7 @@
icobase = 'icons/mob/human_races/r_shadow.dmi'
deform = 'icons/mob/human_races/r_shadow.dmi'
dangerous_existence = TRUE
+ inherent_factions = list("faithless")
unarmed_type = /datum/unarmed_attack/claws
@@ -49,14 +50,12 @@
if(grant_vision_toggle)
vision_toggle = new
vision_toggle.Grant(H)
- H.faction |= "faithless"
/datum/species/shadow/on_species_loss(mob/living/carbon/human/H)
..()
if(grant_vision_toggle && vision_toggle)
H.vision_type = null
vision_toggle.Remove(H)
- H.faction -= "faithless"
/datum/species/shadow/handle_life(mob/living/carbon/human/H)
var/light_amount = 0
diff --git a/code/modules/mob/living/carbon/human/species/slime.dm b/code/modules/mob/living/carbon/human/species/slime.dm
index 3a3f4c3d3ac..0a708db223f 100644
--- a/code/modules/mob/living/carbon/human/species/slime.dm
+++ b/code/modules/mob/living/carbon/human/species/slime.dm
@@ -13,6 +13,7 @@
icobase = 'icons/mob/human_races/r_slime.dmi'
deform = 'icons/mob/human_races/r_slime.dmi'
remains_type = /obj/effect/decal/remains/slime
+ inherent_factions = list("slime")
// More sensitive to the cold
cold_level_1 = 280
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index 832260d3090..87832154876 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -13,6 +13,7 @@
for(var/obj/item/organ/internal/O in internal_organs)
O.on_life()
+ handle_patches()
handle_changeling()
handle_wetness(times_fired)
@@ -438,3 +439,22 @@
overlay_fullscreen("brute", /obj/screen/fullscreen/brute, severity)
else
clear_fullscreen("brute")
+
+/mob/living/carbon/proc/handle_patches()
+ if(LAZYLEN(processing_patches))
+ var/multiple_patch_multiplier = processing_patches.len > 1 ? (processing_patches.len * 1.5) : 1
+ var/applied_amount = 0.35 * multiple_patch_multiplier
+
+ for(var/patch in processing_patches)
+ var/obj/item/reagent_containers/food/pill/patch/P = patch
+
+ if(P.reagents && P.reagents.total_volume)
+ var/fractional_applied_amount = applied_amount / P.reagents.total_volume
+ P.reagents.reaction(src, REAGENT_TOUCH, fractional_applied_amount, P.needs_to_apply_reagents)
+ P.needs_to_apply_reagents = FALSE
+ P.reagents.trans_to(src, applied_amount * 0.5)
+ P.reagents.remove_any(applied_amount * 0.5)
+ else
+ if(!P.reagents || P.reagents.total_volume <= 0)
+ processing_patches -= P
+ qdel(P)
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 22a48f9d9ee..8371cacaebe 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -406,6 +406,8 @@
QDEL_LIST(C.reagents.addiction_list)
C.reagents.addiction_threshold_accumulated.Cut()
+ QDEL_LIST(C.processing_patches)
+
// rejuvenate: Called by `revive` to get the mob into a revivable state
// the admin "rejuvenate" command calls `revive`, not this proc.
/mob/living/proc/rejuvenate()
@@ -511,7 +513,7 @@
return
-/mob/living/Move(atom/newloc, direct)
+/mob/living/Move(atom/newloc, direct, movetime)
if(buckled && buckled.loc != newloc) //not updating position
if(!buckled.anchored)
return buckled.Move(newloc, direct)
@@ -544,7 +546,7 @@
var/mob/living/M = pulling
if(M.lying && !M.buckled && (prob(M.getBruteLoss() * 200 / M.maxHealth)))
M.makeTrail(T)
- pulling.Move(T, get_dir(pulling, T)) // the pullee tries to reach our previous position
+ pulling.Move(T, get_dir(pulling, T), movetime) // the pullee tries to reach our previous position
if(pulling && get_dist(src, pulling) > 1) // the pullee couldn't keep up
stop_pulling()
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index 6e4f13d735f..604fd47de16 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -73,10 +73,9 @@
return shock_damage
/mob/living/emp_act(severity)
- var/list/L = src.get_contents()
- for(var/obj/O in L)
- O.emp_act(severity)
..()
+ for(var/obj/O in contents)
+ O.emp_act(severity)
/obj/item/proc/get_volume_by_throwforce_and_or_w_class()
if(throwforce && w_class)
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index ddc96a7948f..85c4ceac427 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -571,13 +571,13 @@ GLOBAL_LIST_INIT(ai_verbs_default, list(
return FALSE
/mob/living/silicon/ai/emp_act(severity)
+ ..()
if(prob(30))
switch(pick(1,2))
if(1)
view_core()
if(2)
ai_call_shuttle()
- ..()
/mob/living/silicon/ai/ex_act(severity)
..()
diff --git a/code/modules/mob/living/silicon/robot/syndicate.dm b/code/modules/mob/living/silicon/robot/syndicate.dm
index 2b5fd9bb702..f5ac3e5532b 100644
--- a/code/modules/mob/living/silicon/robot/syndicate.dm
+++ b/code/modules/mob/living/silicon/robot/syndicate.dm
@@ -137,9 +137,9 @@
..()
/mob/living/silicon/robot/syndicate/saboteur/emp_act()
+ ..()
if(cham_proj)
cham_proj.disrupt(src)
- ..()
/mob/living/silicon/robot/syndicate/saboteur/bullet_act()
if(cham_proj)
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index 65267911d7f..6457afc87d4 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -76,17 +76,17 @@
return FALSE //So borgs they don't die trying to fix wiring
/mob/living/silicon/emp_act(severity)
+ ..()
switch(severity)
if(1)
- src.take_organ_damage(20)
+ take_organ_damage(20)
Stun(8)
if(2)
- src.take_organ_damage(10)
+ take_organ_damage(10)
Stun(3)
flash_eyes(affect_silicon = 1)
to_chat(src, "*BZZZT*")
to_chat(src, "Warning: Electromagnetic pulse detected.")
- ..()
/mob/living/silicon/proc/damage_mob(var/brute = 0, var/fire = 0, var/tox = 0)
diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm
index ede055dac43..07210674303 100644
--- a/code/modules/mob/living/simple_animal/bot/bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/bot.dm
@@ -495,7 +495,7 @@ Pass a positive integer as an argument to override a bot's default speed.
if(!path)
return 0
if(path.len > 1)
- step_towards(src, path[1])
+ Move(path[1], get_dir(src, path[1]), BOT_STEP_DELAY)
if(get_turf(src) == path[1]) //Successful move
increment_path()
tries = 0
diff --git a/code/modules/mob/living/simple_animal/hostile/headcrab.dm b/code/modules/mob/living/simple_animal/hostile/headcrab.dm
index ece990c7743..8d2ba52709f 100644
--- a/code/modules/mob/living/simple_animal/hostile/headcrab.dm
+++ b/code/modules/mob/living/simple_animal/hostile/headcrab.dm
@@ -25,23 +25,23 @@
var/list/human_overlays = list()
/mob/living/simple_animal/hostile/headcrab/Life(seconds, times_fired)
- if(!is_zombie && isturf(src.loc) && stat != DEAD)
- for(var/mob/living/carbon/human/H in oview(src, 1)) //Only for corpse right next to/on same tile
- if(H.stat == DEAD || (!H.check_death_method() && H.health <= HEALTH_THRESHOLD_DEAD))
- Zombify(H)
- break
- var/cycles = 4
- if(cycles >= 4)
- for(var/mob/living/simple_animal/K in oview(src, 1)) //Only for corpse right next to/on same tile
- if(K.stat == DEAD || (!K.check_death_method() && K.health <= HEALTH_THRESHOLD_DEAD))
- visible_message("[src] consumes [target] whole!")
- if(health < maxHealth)
- health += 10
- qdel(K)
- break
- cycles = 0
- cycles++
- ..()
+ if(..())
+ if(!is_zombie && isturf(src.loc))
+ for(var/mob/living/carbon/human/H in oview(src, 1)) //Only for corpse right next to/on same tile
+ if(H.stat == DEAD || (!H.check_death_method() && H.health <= HEALTH_THRESHOLD_DEAD))
+ Zombify(H)
+ break
+ var/cycles = 4
+ if(cycles >= 4)
+ for(var/mob/living/simple_animal/K in oview(src, 1)) //Only for corpse right next to/on same tile
+ if(K.stat == DEAD || (!K.check_death_method() && K.health <= HEALTH_THRESHOLD_DEAD))
+ visible_message("[src] consumes [target] whole!")
+ if(health < maxHealth)
+ health += 10
+ qdel(K)
+ break
+ cycles = 0
+ cycles++
/mob/living/simple_animal/hostile/headcrab/OpenFire(atom/A)
if(check_friendly_fire)
diff --git a/code/modules/mob/living/simple_animal/slime/life.dm b/code/modules/mob/living/simple_animal/slime/life.dm
index d03e7ada419..4e1aee2c822 100644
--- a/code/modules/mob/living/simple_animal/slime/life.dm
+++ b/code/modules/mob/living/simple_animal/slime/life.dm
@@ -314,7 +314,7 @@
for(var/mob/living/L in view(7,src))
- if(isslime(L) || L.stat == DEAD) // Ignore other slimes and dead mobs
+ if(L.stat == DEAD) // Ignore dead mobs
continue
if(L in Friends) // No eating friends!
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index d08ef11db0f..8e97a88b4ac 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -964,8 +964,8 @@ GLOBAL_LIST_INIT(slot_equipment_priority, list( \
for(var/obj/effect/proc_holder/spell/S in mind.spell_list)
add_spell_to_statpanel(S)
-
- if(is_admin(src))
+ // Allow admins + PR reviewers to VIEW the panel. Doesnt mean they can click things.
+ if(is_admin(src) || check_rights(R_VIEWRUNTIMES, FALSE))
if(statpanel("MC")) //looking at that panel
var/turf/T = get_turf(client.eye)
stat("Location:", COORD(T))
diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm
index 69996ce1729..471ddc42557 100644
--- a/code/modules/mob/mob_movement.dm
+++ b/code/modules/mob/mob_movement.dm
@@ -143,8 +143,10 @@
move_delay = world.time
mob.last_movement = world.time
+ delay = TICKS2DS(-round(-(DS2TICKS(delay)))) //Rounded to the next tick in equivalent ds
+
if(locate(/obj/item/grab, mob))
- move_delay = max(move_delay, world.time + 7)
+ delay += 7
var/list/L = mob.ret_grab()
if(istype(L, /list))
if(L.len == 2)
@@ -153,14 +155,14 @@
if(M)
if((get_dist(mob, M) <= 1 || M.loc == mob.loc))
var/turf/prev_loc = mob.loc
- . = ..()
+ . = mob.SelfMove(n, direct, delay)
if(M && isturf(M.loc)) // Mob may get deleted during parent call
var/diag = get_dir(mob, M)
if((diag - 1) & diag)
else
diag = null
if((get_dist(mob, M) > 1 || diag))
- step(M, get_dir(M.loc, prev_loc))
+ M.Move(prev_loc, get_dir(M.loc, prev_loc), delay)
else
for(var/mob/M in L)
M.other_mobs = 1
@@ -168,12 +170,10 @@
M.animate_movement = 3
for(var/mob/M in L)
spawn(0)
- step(M, direct)
- return
+ M.Move(get_step(M,direct), direct, delay)
spawn(1)
M.other_mobs = null
M.animate_movement = 2
- return
else if(mob.confused)
var/newdir = 0
@@ -186,11 +186,8 @@
if(newdir)
direct = newdir
n = get_step(mob, direct)
-
- delay = TICKS2DS(-round(-(DS2TICKS(delay)))) //Rounded to the next tick in equivalent ds
- mob.glide_size = world.icon_size/max(DS2TICKS(delay),1) //Down to whatever decimal
- . = ..()
+ . = mob.SelfMove(n, direct, delay)
mob.setDir(direct)
if((direct & (direct - 1)) && mob.loc == n) //moved diagonally successfully
@@ -214,8 +211,8 @@
O.on_mob_move(direct, mob)
-
-
+/mob/proc/SelfMove(turf/n, direct, movetime)
+ return Move(n, direct, movetime)
///Process_Grab()
///Called by client/Move()
diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm
index de894e80106..eefb4d299a4 100644
--- a/code/modules/paperwork/folders.dm
+++ b/code/modules/paperwork/folders.dm
@@ -7,6 +7,12 @@
pressure_resistance = 2
resistance_flags = FLAMMABLE
+/obj/item/folder/emp_act(severity)
+ ..()
+ for(var/i in contents)
+ var/atom/A = i
+ A.emp_act(severity)
+
/obj/item/folder/blue
desc = "A blue folder."
icon_state = "folder_blue"
diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm
index f91d7e66734..7a013f3083c 100644
--- a/code/modules/projectiles/guns/magic/wand.dm
+++ b/code/modules/projectiles/guns/magic/wand.dm
@@ -41,7 +41,7 @@
to_chat(user, "You know better than to violate the security of The Den, best wait until you leave to use [src].")
return
else
- no_den_usage = 0
+ no_den_usage = FALSE
zap_self(user)
else
..()
@@ -118,7 +118,7 @@
ammo_type = /obj/item/ammo_casing/magic/teleport
icon_state = "telewand"
max_charges = 10 //10, 5, 5, 4
- no_den_usage = 1
+ no_den_usage = TRUE
fire_sound = 'sound/magic/wand_teleport.ogg'
/obj/item/gun/magic/wand/teleport/zap_self(mob/living/user)
@@ -140,6 +140,7 @@
fire_sound = 'sound/magic/staff_door.ogg'
icon_state = "doorwand"
max_charges = 20 //20, 10, 10, 7
+ no_den_usage = TRUE
/obj/item/gun/magic/wand/door/zap_self(mob/living/user)
to_chat(user, "You feel vaguely more open with your feelings.")
diff --git a/code/modules/projectiles/guns/throw/crossbow.dm b/code/modules/projectiles/guns/throw/crossbow.dm
index ca626534320..dc03a76fb48 100644
--- a/code/modules/projectiles/guns/throw/crossbow.dm
+++ b/code/modules/projectiles/guns/throw/crossbow.dm
@@ -94,25 +94,29 @@
user.visible_message("[usr] draws back the string of [src]!","[src] clunks as you draw the string to its maximum tension!!")
update_icon()
-/obj/item/gun/throw/crossbow/attackby(obj/item/W as obj, mob/user as mob, params)
- if(istype(W, /obj/item/stock_parts/cell))
- if(!cell)
- user.drop_item()
- W.loc = src
- cell = W
- to_chat(user, "You jam [cell] into [src] and wire it to the firing coil.")
- process_chamber()
- else
- to_chat(user, "[src] already has a cell installed.")
- else if(istype(W, /obj/item/screwdriver))
- if(cell)
- cell.loc = get_turf(src)
- to_chat(user, "You jimmy [cell] out of [src] with [W].")
- cell = null
- else
- to_chat(user, "[src] doesn't have a cell installed.")
- else
- ..()
+/obj/item/gun/throw/crossbow/attackby(obj/item/I, mob/user, params)
+ if(!istype(I, /obj/item/stock_parts/cell))
+ return ..()
+
+ if(cell)
+ to_chat(user, "[src] already has a cell installed.")
+ return
+
+ user.drop_item()
+ I.forceMove(src)
+ cell = I
+ to_chat(user, "You jam [cell] into [src] and wire it to the firing coil.")
+ process_chamber()
+
+/obj/item/gun/throw/crossbow/screwdriver_act(mob/user, obj/item/I)
+ . = ..()
+ if(!cell)
+ to_chat(user, "[src] doesn't have a cell installed.")
+ return
+
+ cell.forceMove(get_turf(src))
+ to_chat(user, "You jimmy [cell] out of [src] with [I].")
+ cell = null
/obj/item/gun/throw/crossbow/verb/set_tension()
set name = "Adjust Tension"
diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm
index ddd78b2018f..d18c9c1832b 100644
--- a/code/modules/reagents/chemistry/holder.dm
+++ b/code/modules/reagents/chemistry/holder.dm
@@ -8,13 +8,19 @@
var/maximum_volume = 100
var/atom/my_atom = null
var/chem_temp = T20C
+ var/temperature_min = 0
+ var/temperature_max = 10000
var/list/datum/reagent/addiction_list = new/list()
var/list/addiction_threshold_accumulated = new/list()
var/flags
var/list/reagents_generated_per_cycle = new/list()
-/datum/reagents/New(maximum = 100)
+/datum/reagents/New(maximum = 100, temperature_minimum, temperature_maximum)
maximum_volume = maximum
+ if(temperature_minimum)
+ temperature_min = temperature_minimum
+ if(temperature_maximum)
+ temperature_max = temperature_maximum
if(!(flags & REAGENT_NOREACT))
START_PROCESSING(SSobj, src)
//I dislike having these here but map-objects are initialised before world/New() is called. >_>
@@ -179,7 +185,7 @@
return amount
/datum/reagents/proc/set_reagent_temp(new_temp = T0C, react = TRUE)
- chem_temp = new_temp
+ chem_temp = Clamp(new_temp, temperature_min, temperature_max)
if(react)
temperature_react()
handle_reactions()
@@ -197,7 +203,7 @@
else if(exposed_temperature < chem_temp)
chem_temp -= change
- chem_temp = max(min(chem_temp, 10000), 0) //Cap for the moment.
+ chem_temp = max(min(chem_temp, temperature_max), temperature_min) //Cap for the moment.
temperature_react()
handle_reactions()
@@ -569,7 +575,7 @@
can_process = 1
return can_process
-/datum/reagents/proc/reaction(atom/A, method = REAGENT_TOUCH, volume_modifier = 1)
+/datum/reagents/proc/reaction(atom/A, method = REAGENT_TOUCH, volume_modifier = 1, show_message = TRUE)
var/react_type
if(isliving(A))
react_type = "LIVING"
@@ -614,7 +620,7 @@
var/check = reaction_check(A, R)
if(!check)
continue
- R.reaction_mob(A, method, R.volume * volume_modifier)
+ R.reaction_mob(A, method, R.volume * volume_modifier, show_message)
if("TURF")
R.reaction_turf(A, R.volume * volume_modifier)
if("OBJ")
@@ -632,7 +638,7 @@
if(total_volume + amount > maximum_volume) amount = (maximum_volume - total_volume) //Doesnt fit in. Make it disappear. Shouldnt happen. Will happen.
if(amount <= 0)
return 0
- chem_temp = (chem_temp * total_volume + reagtemp * amount) / (total_volume + amount) //equalize with new chems
+ chem_temp = Clamp((chem_temp * total_volume + reagtemp * amount) / (total_volume + amount), temperature_min, temperature_max) //equalize with new chems
for(var/A in reagent_list)
@@ -870,8 +876,8 @@
// Convenience proc to create a reagents holder for an atom
// Max vol is maximum volume of holder
-/atom/proc/create_reagents(max_vol)
- reagents = new/datum/reagents(max_vol)
+/atom/proc/create_reagents(max_vol, temperature_minimum, temperature_maximum)
+ reagents = new /datum/reagents(max_vol, temperature_minimum, temperature_maximum)
reagents.my_atom = src
/proc/get_random_reagent_id() // Returns a random reagent ID minus blacklisted reagents
diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm
index 435a253bed5..cf7ff936b6d 100644
--- a/code/modules/reagents/chemistry/machinery/chem_master.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_master.dm
@@ -347,8 +347,8 @@
if(count > 20)
count = 20 //Pevent people from creating huge stacks of patches easily. Maybe move the number to defines?
var/amount_per_patch = reagents.total_volume/count
- if(amount_per_patch > 40)
- amount_per_patch = 40
+ if(amount_per_patch > 30)
+ amount_per_patch = 30
var/name = clean_input("Name:", "Name your patch!", "[reagents.get_master_reagent_name()] ([amount_per_patch]u)")
if(!name)
return
diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm
index 4271b26ba17..8cdb69062ff 100644
--- a/code/modules/reagents/chemistry/reagents.dm
+++ b/code/modules/reagents/chemistry/reagents.dm
@@ -43,7 +43,7 @@
/datum/reagent/proc/reaction_temperature(exposed_temperature, exposed_volume) //By default we do nothing.
return
-/datum/reagent/proc/reaction_mob(mob/living/M, method = REAGENT_TOUCH, volume) //Some reagents transfer on touch, others don't; dependent on if they penetrate the skin or not.
+/datum/reagent/proc/reaction_mob(mob/living/M, method = REAGENT_TOUCH, volume, show_message = TRUE) //Some reagents transfer on touch, others don't; dependent on if they penetrate the skin or not.
if(holder) //for catching rare runtimes
if(method == REAGENT_TOUCH && penetrates_skin)
var/block = M.get_permeability_protection()
diff --git a/code/modules/reagents/chemistry/reagents/medicine.dm b/code/modules/reagents/chemistry/reagents/medicine.dm
index c9e7ac0c1dc..262acae5f82 100644
--- a/code/modules/reagents/chemistry/reagents/medicine.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine.dm
@@ -9,7 +9,7 @@
var/total_depletion_rate = (metabolization_rate / M.metabolism_efficiency) * M.digestion_ratio // Cache it
handle_addiction(M, total_depletion_rate)
-
+ sate_addiction(M)
holder.remove_reagent(id, total_depletion_rate) //medicine reagents stay longer if you have a better metabolism
return STATUS_UPDATE_NONE
@@ -178,7 +178,7 @@
id = "silver_sulfadiazine"
description = "This antibacterial compound is used to treat burn victims."
reagent_state = LIQUID
- color = "#F0C814"
+ color = "#F0DC00"
metabolization_rate = 3
harmless = FALSE //toxic if ingested, and I am NOT going to account for the difference
taste_description = "burn cream"
@@ -205,7 +205,7 @@
id = "styptic_powder"
description = "Styptic (aluminum sulfate) powder helps control bleeding and heal physical wounds."
reagent_state = LIQUID
- color = "#C8A5DC"
+ color = "#FF9696"
metabolization_rate = 3
harmless = FALSE
taste_description = "wound cream"
@@ -221,7 +221,7 @@
M.adjustBruteLoss(-volume)
if(show_message)
to_chat(M, "The styptic powder stings like hell as it closes some of your wounds!")
- M.emote("scream")
+ M.emote("scream")
if(method == REAGENT_INGEST)
M.adjustToxLoss(0.5*volume)
if(show_message)
diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm
index db65f761e2e..a091f65a34c 100644
--- a/code/modules/reagents/reagent_containers.dm
+++ b/code/modules/reagents/reagent_containers.dm
@@ -11,6 +11,8 @@
var/spawned_disease = null
var/disease_amount = 20
var/has_lid = FALSE // Used for containers where we want to put lids on and off
+ var/temperature_min = 0 // To limit the temperature of a reagent container can atain when exposed to heat/cold
+ var/temperature_max = 10000
/obj/item/reagent_containers/verb/set_APTFT() //set amount_per_transfer_from_this
set name = "Set transfer amount"
@@ -30,7 +32,7 @@
..()
if(!possible_transfer_amounts)
verbs -= /obj/item/reagent_containers/verb/set_APTFT
- create_reagents(volume)
+ create_reagents(volume, temperature_min, temperature_max)
if(spawned_disease)
var/datum/disease/F = new spawned_disease(0)
var/list/data = list("viruses" = list(F), "blood_color" = "#A10808")
diff --git a/code/modules/reagents/reagent_containers/applicator.dm b/code/modules/reagents/reagent_containers/applicator.dm
new file mode 100644
index 00000000000..73c3c3759b1
--- /dev/null
+++ b/code/modules/reagents/reagent_containers/applicator.dm
@@ -0,0 +1,106 @@
+/obj/item/reagent_containers/applicator
+ name = "auto-mender"
+ desc = "A small electronic device designed to topically apply healing chemicals."
+ icon = 'icons/goonstation/objects/objects.dmi'
+ icon_state = "mender"
+ item_state = "mender"
+ volume = 200
+ resistance_flags = ACID_PROOF
+ container_type = REFILLABLE | AMOUNT_VISIBLE
+ temperature_min = 270
+ temperature_max = 350
+ var/ignore_flags = FALSE
+ var/emagged = FALSE
+ var/applied_amount = 8 // How much it applies
+ var/applying = FALSE // So it can't be spammed.
+ var/measured_health = 0 // Used for measuring health; we don't want this to stop applying once the person's health isn't changing.
+
+/obj/item/reagent_containers/applicator/emag_act(mob/user)
+ if(!emagged)
+ emagged = TRUE
+ ignore_flags = TRUE
+ to_chat(user, "You short out the safeties on [src].")
+
+/obj/item/reagent_containers/applicator/on_reagent_change()
+ if(!emagged)
+ var/found_forbidden_reagent = FALSE
+ for(var/datum/reagent/R in reagents.reagent_list)
+ if(!GLOB.safe_chem_applicator_list.Find(R.id))
+ reagents.del_reagent(R.id)
+ found_forbidden_reagent = TRUE
+ if(found_forbidden_reagent)
+ if(ismob(loc))
+ to_chat(loc, "[src] identifies and removes a harmful substance.")
+ else
+ visible_message("[src] identifies and removes a harmful substance.")
+ update_icon()
+
+/obj/item/reagent_containers/applicator/update_icon()
+ cut_overlays()
+
+ if(reagents.total_volume)
+ var/mutable_appearance/filling = mutable_appearance('icons/goonstation/objects/objects.dmi', "mender-fluid")
+ filling.color = mix_color_from_reagents(reagents.reagent_list)
+ add_overlay(filling)
+
+/obj/item/reagent_containers/applicator/attack(mob/living/M, mob/user)
+ if(!reagents.total_volume)
+ to_chat(user, "[src] is empty!")
+ return
+ if(applying)
+ to_chat(user, "You're already applying [src].")
+ return
+ if(!iscarbon(M))
+ return
+
+ if(ignore_flags || M.can_inject(user, TRUE))
+ if(M == user)
+ M.visible_message("[user] begins mending [user.p_them()]self with [src].", "You begin mending yourself with [src].")
+ else
+ user.visible_message("[user] begins mending [M] with [src].", "You begin mending [M] with [src].")
+ if(M.reagents)
+ applying = TRUE
+ icon_state = "mender-active"
+ apply_to(M, user, 0.2) // We apply a very weak application up front, then loop.
+ while(do_after(user, 10, target = M))
+ measured_health = M.health
+ apply_to(M, user, 1, FALSE)
+ if((measured_health == M.health) || !reagents.total_volume)
+ to_chat(user, "[M] is finished healing and [src] powers down automatically.")
+ break
+ applying = FALSE
+ icon_state = "mender"
+ user.changeNext_move(CLICK_CD_MELEE)
+
+
+/obj/item/reagent_containers/applicator/proc/apply_to(mob/living/carbon/M, mob/user, multiplier = 1, show_message = TRUE)
+ var/total_applied_amount = applied_amount * multiplier
+
+ if(reagents && reagents.total_volume)
+ var/list/injected = list()
+ for(var/datum/reagent/R in reagents.reagent_list)
+ injected += R.name
+
+ var/contained = english_list(injected)
+ // allow normal logging only if reagents are not harmless and automender is emagged
+ add_attack_logs(user, M, "Automends with [src] containing ([contained])", (emagged && !(reagents.harmless_helper())) ? null : ATKLOG_ALMOSTALL)
+
+ var/fractional_applied_amount = total_applied_amount / reagents.total_volume
+
+ reagents.reaction(M, REAGENT_TOUCH, fractional_applied_amount, show_message)
+ reagents.trans_to(M, total_applied_amount * 0.5)
+ reagents.remove_any(total_applied_amount * 0.5)
+
+ playsound(get_turf(src), pick('sound/goonstation/items/mender.ogg', 'sound/goonstation/items/mender2.ogg'), 50, 1)
+
+/obj/item/reagent_containers/applicator/brute
+ name = "brute auto-mender"
+ list_reagents = list("styptic_powder" = 200)
+
+/obj/item/reagent_containers/applicator/burn
+ name = "burn auto-mender"
+ list_reagents = list("silver_sulfadiazine" = 200)
+
+/obj/item/reagent_containers/applicator/dual
+ name = "dual auto-mender"
+ list_reagents = list("synthflesh" = 200)
diff --git a/code/modules/reagents/reagent_containers/patch.dm b/code/modules/reagents/reagent_containers/patch.dm
index b020015e929..582e157004c 100644
--- a/code/modules/reagents/reagent_containers/patch.dm
+++ b/code/modules/reagents/reagent_containers/patch.dm
@@ -5,10 +5,24 @@
icon_state = "bandaid"
item_state = "bandaid"
possible_transfer_amounts = null
- volume = 40
+ volume = 30
apply_type = REAGENT_TOUCH
apply_method = "apply"
transfer_efficiency = 0.5 //patches aren't as effective at getting chemicals into the bloodstream.
+ temperature_min = 270
+ temperature_max = 350
+ var/needs_to_apply_reagents = TRUE
+
+/obj/item/reagent_containers/food/pill/patch/attack(mob/living/carbon/M, mob/user, def_zone)
+ if(!istype(M))
+ return FALSE
+ bitesize = 0
+ if(M.eat(src, user))
+ user.drop_item()
+ forceMove(M)
+ M.processing_patches += src
+ return TRUE
+ return FALSE
/obj/item/reagent_containers/food/pill/patch/afterattack(obj/target, mob/user , proximity)
return // thanks inheritance again
@@ -18,29 +32,37 @@
desc = "Helps with brute injuries."
icon_state = "bandaid_brute"
instant_application = 1
- list_reagents = list("styptic_powder" = 40)
+ list_reagents = list("styptic_powder" = 30)
+
+/obj/item/reagent_containers/food/pill/patch/styptic/small
+ name = "healing mini-patch"
+ list_reagents = list("styptic_powder" = 15)
/obj/item/reagent_containers/food/pill/patch/silver_sulf
name = "burn patch"
desc = "Helps with burn injuries."
icon_state = "bandaid_burn"
instant_application = 1
- list_reagents = list("silver_sulfadiazine" = 40)
+ list_reagents = list("silver_sulfadiazine" = 30)
+
+/obj/item/reagent_containers/food/pill/patch/silver_sulf/small
+ name = "burn mini-patch"
+ list_reagents = list("silver_sulfadiazine" = 15)
/obj/item/reagent_containers/food/pill/patch/synthflesh
name = "synthflesh patch"
desc = "Helps with brute and burn injuries."
icon_state = "bandaid_med"
instant_application = 1
- list_reagents = list("synthflesh" = 20)
+ list_reagents = list("synthflesh" = 10)
/obj/item/reagent_containers/food/pill/patch/nicotine
name = "nicotine patch"
desc = "Helps temporarily curb the cravings of nicotine dependency."
- list_reagents = list("nicotine" = 20)
+ list_reagents = list("nicotine" = 10)
/obj/item/reagent_containers/food/pill/patch/jestosterone
name = "jestosterone patch"
desc = "Helps with brute injuries if the affected person is a clown, otherwise inflicts various annoying effects."
icon_state = "bandaid_clown"
- list_reagents = list("jestosterone" = 30)
+ list_reagents = list("jestosterone" = 20)
diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm
index 0fdca68811c..403df48be69 100755
--- a/code/modules/recycling/sortingmachinery.dm
+++ b/code/modules/recycling/sortingmachinery.dm
@@ -95,6 +95,12 @@
CHECK_TICK
..()
+/obj/item/smallDelivery/emp_act(severity)
+ ..()
+ for(var/i in contents)
+ var/atom/A = i
+ A.emp_act(severity)
+
/obj/item/smallDelivery/attack_self(mob/user as mob)
if(wrapped && wrapped.loc) //sometimes items can disappear. For example, bombs. --rastaf0
wrapped.loc = user.loc
diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm
index 2e7c668a83f..d907e46247e 100644
--- a/code/modules/research/designs/autolathe_designs.dm
+++ b/code/modules/research/designs/autolathe_designs.dm
@@ -607,6 +607,14 @@
build_path = /obj/item/reagent_containers/hypospray/safety
category = list("initial", "Medical")
+/datum/design/automender
+ name = "Auto-mender"
+ id = "automender"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 1000, MAT_GLASS = 1000)
+ build_path = /obj/item/reagent_containers/applicator
+ category = list("initial", "Medical")
+
/datum/design/prox_sensor
name = "Proximity Sensor"
id = "prox_sensor"
@@ -914,4 +922,3 @@
materials = list(MAT_METAL = 40000)
build_path = /obj/item/golem_shell
category = list("Imported")
-
diff --git a/code/modules/ruins/lavalandruin_code/syndicate_base.dm b/code/modules/ruins/lavalandruin_code/syndicate_base.dm
index 532e50831e5..d053e139f61 100644
--- a/code/modules/ruins/lavalandruin_code/syndicate_base.dm
+++ b/code/modules/ruins/lavalandruin_code/syndicate_base.dm
@@ -17,7 +17,7 @@
/obj/item/grenade/chem_grenade/cryo = 5,
/obj/item/grenade/chem_grenade/adv_release = 5,
/obj/item/reagent_containers/food/drinks/bottle/holywater = 1)
- product_slogans = "It's not pyromania if you're getting paid!;You smell that? Plasma, son. Nothing else in the world smells like that.;I love the smell of Plasma in the morning."
+ slogan_list = list("It's not pyromania if you're getting paid!","You smell that? Plasma, son. Nothing else in the world smells like that.","I love the smell of Plasma in the morning.")
resistance_flags = FIRE_PROOF
// Spawners
diff --git a/code/modules/shuttle/ert.dm b/code/modules/shuttle/ert.dm
index 1f664a69c8f..356ca9687dc 100644
--- a/code/modules/shuttle/ert.dm
+++ b/code/modules/shuttle/ert.dm
@@ -6,6 +6,14 @@
resistance_flags = INDESTRUCTIBLE
flags = NODECONSTRUCT
+/obj/machinery/computer/shuttle/ert/Topic(href, href_list)
+ if(href_list["move"])
+ var/authorized_roles = list(SPECIAL_ROLE_ERT, SPECIAL_ROLE_DEATHSQUAD)
+ if(!((usr.mind.assigned_role in authorized_roles) || is_admin(usr)))
+ message_admins("Potential ERT shuttle hijack, ERT shuttle moved by unauthorized user: [key_name_admin(usr)]")
+ ..()
+
+
/obj/machinery/computer/camera_advanced/shuttle_docker/ert
name = "specops navigation computer"
desc = "Used to designate a precise transit location for the specops shuttle."
diff --git a/code/modules/telesci/gps.dm b/code/modules/telesci/gps.dm
index 94920587b54..9b7ba72209b 100644
--- a/code/modules/telesci/gps.dm
+++ b/code/modules/telesci/gps.dm
@@ -1,6 +1,6 @@
GLOBAL_LIST_EMPTY(GPS_list)
/obj/item/gps
- name = "global positioning system"
+ name = "default gps"
desc = "Helping lost spacemen find their way through the planets since 2016."
icon = 'icons/obj/telescience.dmi'
icon_state = "gps-c"
@@ -16,7 +16,8 @@ GLOBAL_LIST_EMPTY(GPS_list)
/obj/item/gps/New()
..()
GLOB.GPS_list.Add(src)
- name = "global positioning system ([gpstag])"
+ if(name == "default gps") //use default naming scheme
+ name = "global positioning system ([gpstag])"
overlays += "working"
/obj/item/gps/Destroy()
diff --git a/code/modules/vehicle/ambulance.dm b/code/modules/vehicle/ambulance.dm
index 450a6c88372..37c9d97e5c6 100644
--- a/code/modules/vehicle/ambulance.dm
+++ b/code/modules/vehicle/ambulance.dm
@@ -92,7 +92,7 @@
bed = null
. = ..()
if(bed && get_dist(oldloc, loc) <= 2)
- bed.Move(oldloc)
+ bed.Move(oldloc, get_dir(bed, oldloc), (last_move_diagonal? 2 : 1) * (vehicle_move_delay + config.human_delay))
bed.dir = Dir
if(bed.has_buckled_mobs())
for(var/m in bed.buckled_mobs)
diff --git a/code/modules/vehicle/janicart.dm b/code/modules/vehicle/janicart.dm
index 12ed9f727eb..d7ba87b818c 100644
--- a/code/modules/vehicle/janicart.dm
+++ b/code/modules/vehicle/janicart.dm
@@ -44,7 +44,7 @@
origin_tech = "materials=3;engineering=4"
/obj/vehicle/janicart/Move(atom/OldLoc, Dir)
- ..()
+ . = ..()
if(floorbuffer)
var/turf/tile = loc
if(isturf(tile))
diff --git a/code/modules/vehicle/vehicle.dm b/code/modules/vehicle/vehicle.dm
index 79021affa25..cdbb8580da6 100644
--- a/code/modules/vehicle/vehicle.dm
+++ b/code/modules/vehicle/vehicle.dm
@@ -153,7 +153,8 @@
unbuckle_mob(user)
return
- if(world.time < last_vehicle_move + ((last_move_diagonal? 2 : 1) * (vehicle_move_delay + config.human_delay)))
+ var/delay = (last_move_diagonal? 2 : 1) * (vehicle_move_delay + config.human_delay)
+ if(world.time < last_vehicle_move + delay)
return
last_vehicle_move = world.time
@@ -161,7 +162,7 @@
var/turf/next = get_step(src, direction)
if(!Process_Spacemove(direction) || !isturf(loc))
return
- step(src, direction)
+ Move(get_step(src, direction), direction, delay)
if((direction & (direction - 1)) && (loc == next)) //moved diagonally
last_move_diagonal = TRUE
@@ -185,7 +186,7 @@
to_chat(user, "You'll need the keys in one of your hands to drive [src].")
-/obj/vehicle/Move(NewLoc, Dir = 0, step_x = 0, step_y = 0)
+/obj/vehicle/Move(NewLoc, Dir = 0, movetime)
. = ..()
handle_vehicle_layer()
handle_vehicle_offsets()
diff --git a/goon/code/datums/browserOutput.dm b/goon/code/datums/browserOutput.dm
index 8caccf84766..74c9d844728 100644
--- a/goon/code/datums/browserOutput.dm
+++ b/goon/code/datums/browserOutput.dm
@@ -305,7 +305,14 @@ var/to_chat_src
target << output(output_message, "browseroutput:output")
/proc/to_chat(target, message, flag)
- if(Master.current_runlevel == RUNLEVEL_INIT || !SSchat?.initialized)
+ /*
+ If any of the following conditions are met, do NOT use SSchat. These conditions include:
+ - Is the MC still initializing?
+ - Has SSchat initialized?
+ - Has SSchat been offlined due to MC crashes?
+ If any of these are met, use the old chat system, otherwise people wont see messages
+ */
+ if(Master.current_runlevel == RUNLEVEL_INIT || !SSchat?.initialized || SSchat?.flags & SS_NO_FIRE)
to_chat_immediate(target, message, flag)
return
SSchat.queue(target, message, flag)
diff --git a/icons/goonstation/objects/objects.dmi b/icons/goonstation/objects/objects.dmi
index 8dadb400668..2707ce8b9b8 100644
Binary files a/icons/goonstation/objects/objects.dmi and b/icons/goonstation/objects/objects.dmi differ
diff --git a/icons/mob/species/tajaran/suit.dmi b/icons/mob/species/tajaran/suit.dmi
index 6d43df756c7..2f7d8f34907 100644
Binary files a/icons/mob/species/tajaran/suit.dmi and b/icons/mob/species/tajaran/suit.dmi differ
diff --git a/icons/obj/terminals.dmi b/icons/obj/terminals.dmi
index 45baaf3f7ba..c47cd86e6d3 100644
Binary files a/icons/obj/terminals.dmi and b/icons/obj/terminals.dmi differ
diff --git a/nano/templates/chem_master.tmpl b/nano/templates/chem_master.tmpl
index 1d040d52af7..e91a43d357b 100644
--- a/nano/templates/chem_master.tmpl
+++ b/nano/templates/chem_master.tmpl
@@ -56,7 +56,7 @@