diff --git a/_maps/RandomRuins/StationRuins/Box/Engine/engine_teg.dmm b/_maps/RandomRuins/StationRuins/Box/Engine/engine_teg.dmm
index 6a134fca70..37bc2a7dde 100644
--- a/_maps/RandomRuins/StationRuins/Box/Engine/engine_teg.dmm
+++ b/_maps/RandomRuins/StationRuins/Box/Engine/engine_teg.dmm
@@ -1545,21 +1545,6 @@
},
/turf/open/floor/plasteel,
/area/engine/engineering)
-"RK" = (
-/obj/machinery/portable_atmospherics/canister/toxins,
-/obj/effect/turf_decal/delivery,
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/window/reinforced{
- dir = 8
- },
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
"RQ" = (
/obj/machinery/atmospherics/components/binary/pump{
dir = 1
@@ -2237,7 +2222,7 @@ yf
"}
(12,1,1) = {"
cS
-RK
+QS
uy
PK
iZ
diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm
index 65521d1f24..d993d10831 100644
--- a/_maps/map_files/BoxStation/BoxStation.dmm
+++ b/_maps/map_files/BoxStation/BoxStation.dmm
@@ -173,6 +173,32 @@
"aay" = (
/turf/open/floor/plating,
/area/security/prison)
+"aaz" = (
+/obj/machinery/disposal/bin,
+/obj/structure/sign/plaques/deempisi{
+ pixel_x = -28;
+ pixel_y = -4
+ },
+/obj/structure/disposalpipe/trunk{
+ dir = 4
+ },
+/obj/machinery/button/door{
+ id = "barShutters";
+ name = "bar shutters";
+ pixel_x = 4;
+ pixel_y = 28
+ },
+/obj/effect/turf_decal/tile/bar,
+/obj/effect/turf_decal/tile/bar{
+ dir = 1
+ },
+/obj/machinery/light_switch{
+ name = "Bar Lights";
+ pixel_x = -6;
+ pixel_y = 28
+ },
+/turf/open/floor/plasteel,
+/area/crew_quarters/bar)
"aaA" = (
/obj/machinery/seed_extractor,
/turf/open/floor/plasteel,
@@ -11918,8 +11944,8 @@
/turf/open/floor/plasteel,
/area/storage/primary)
"aDr" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 4
},
/turf/open/floor/circuit,
/area/ai_monitored/nuke_storage)
@@ -11944,8 +11970,8 @@
/obj/structure/cable{
icon_state = "1-2"
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 5
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 8
},
/turf/open/floor/circuit,
/area/ai_monitored/nuke_storage)
@@ -12442,6 +12468,7 @@
/obj/structure/cable{
icon_state = "1-2"
},
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/circuit,
/area/ai_monitored/nuke_storage)
"aEP" = (
@@ -12902,6 +12929,7 @@
"aGa" = (
/obj/machinery/light,
/obj/effect/turf_decal/tile/neutral,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel/dark,
/area/ai_monitored/nuke_storage)
"aGb" = (
@@ -12932,6 +12960,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel/dark,
/area/ai_monitored/nuke_storage)
"aGd" = (
@@ -13603,6 +13632,7 @@
/area/storage/primary)
"aHF" = (
/obj/structure/sign/warning/securearea,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/closed/wall/r_wall,
/area/ai_monitored/nuke_storage)
"aHG" = (
@@ -16497,27 +16527,6 @@
},
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
-"aPw" = (
-/obj/machinery/disposal/bin,
-/obj/structure/sign/plaques/deempisi{
- pixel_x = -28;
- pixel_y = -4
- },
-/obj/structure/disposalpipe/trunk{
- dir = 4
- },
-/obj/machinery/button/door{
- id = "barShutters";
- name = "bar shutters";
- pixel_x = 4;
- pixel_y = 28
- },
-/obj/effect/turf_decal/tile/bar,
-/obj/effect/turf_decal/tile/bar{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/bar)
"aPx" = (
/obj/structure/chair/comfy/beige{
dir = 1
@@ -27589,6 +27598,7 @@
/area/hallway/primary/central)
"bqF" = (
/obj/machinery/vending/cigarette/beach,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel/dark,
/area/hallway/primary/central)
"bqG" = (
@@ -28249,10 +28259,6 @@
"bsc" = (
/turf/open/floor/plasteel,
/area/engine/gravity_generator)
-"bsf" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/turf/open/floor/plasteel/dark,
-/area/hallway/primary/central)
"bsg" = (
/obj/structure/table,
/obj/item/hand_labeler,
@@ -52552,6 +52558,12 @@
/obj/structure/sign/poster/official/cohiba_robusto_ad,
/turf/closed/wall,
/area/lawoffice)
+"cIw" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/hallway/primary/central)
"cMC" = (
/obj/effect/turf_decal/stripes/line{
dir = 5
@@ -55407,6 +55419,10 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/dorms)
+"luR" = (
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
+/turf/open/floor/plating,
+/area/maintenance/starboard/fore)
"lva" = (
/obj/effect/turf_decal/stripes/corner{
dir = 1
@@ -55590,6 +55606,12 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/starboard)
+"mvZ" = (
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/hallway/primary/central)
"myh" = (
/obj/structure/piano,
/obj/structure/window/reinforced,
@@ -55655,6 +55677,13 @@
dir = 1
},
/area/hallway/primary/starboard)
+"mOi" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 4;
+ pixel_y = 0
+ },
+/turf/open/floor/plasteel/dark,
+/area/hallway/primary/central)
"mOB" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -55763,6 +55792,10 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/locker)
+"mVY" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/circuit,
+/area/ai_monitored/nuke_storage)
"naI" = (
/turf/open/space,
/area/space/station_ruins)
@@ -55858,6 +55891,17 @@
},
/turf/open/floor/plating,
/area/construction)
+"nyZ" = (
+/obj/structure/sign/warning/securearea,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/closed/wall/r_wall,
+/area/ai_monitored/nuke_storage)
+"nFC" = (
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/hallway/primary/central)
"nGf" = (
/obj/machinery/hydroponics/constructable,
/obj/machinery/light{
@@ -55939,10 +55983,6 @@
},
/turf/open/floor/plasteel,
/area/hydroponics)
-"nXE" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/turf/open/floor/plasteel/dark,
-/area/hallway/primary/central)
"nYe" = (
/obj/structure/safe,
/obj/item/clothing/head/bearpelt,
@@ -56925,6 +56965,11 @@
/obj/item/gun/energy/laser/practice,
/turf/open/floor/plasteel/white,
/area/science/circuit)
+"saN" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,
+/turf/open/floor/plasteel/dark,
+/area/maintenance/fore)
"saU" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/closed/wall/r_wall,
@@ -80067,7 +80112,7 @@ aqQ
aqQ
awa
axq
-ayD
+saN
azI
rjQ
aBU
@@ -87299,7 +87344,7 @@ aBa
bqD
bsa
vCn
-bsa
+mOi
bsa
nbT
byS
@@ -87550,14 +87595,14 @@ xUL
aBb
gpD
aDr
-aEM
+mVY
aGa
aHF
bqF
-bsa
-nXE
buQ
buQ
+nFC
+buQ
bxI
bwa
bAg
@@ -88066,11 +88111,11 @@ xEB
aDt
aEO
aGc
-aHF
+nyZ
aKG
-bsf
dml
dml
+mvZ
dml
bxK
bwh
@@ -88327,7 +88372,7 @@ aBa
bqG
bsa
eih
-bsa
+cIw
bsa
nbT
bwb
@@ -95500,7 +95545,7 @@ aLU
aKQ
aNu
aJC
-aPw
+aaz
egt
aQc
aSZ
@@ -104481,7 +104526,7 @@ hHQ
feE
hHQ
kGJ
-avI
+luR
asA
apE
dPk
diff --git a/code/__DEFINES/movespeed_modification.dm b/code/__DEFINES/movespeed_modification.dm
index 5d35da5382..76c326cec0 100644
--- a/code/__DEFINES/movespeed_modification.dm
+++ b/code/__DEFINES/movespeed_modification.dm
@@ -17,6 +17,9 @@
//ids
#define MOVESPEED_ID_MOB_WALK_RUN_CONFIG_SPEED "MOB_WALK_RUN"
+#define MOVESPEED_ID_MOB_GRAB_STATE "MOB_GRAB_STATE"
+#define MOVESPEED_ID_MOB_EQUIPMENT "MOB_EQUIPMENT"
+#define MOVESPEED_ID_MOB_GRAVITY "MOB_GRAVITY"
#define MOVESPEED_ID_CONFIG_SPEEDMOD "MOB_CONFIG_MODIFIER"
#define MOVESPEED_ID_SLIME_REAGENTMOD "SLIME_REAGENT_MODIFIER"
@@ -28,6 +31,7 @@
#define MOVESPEED_ID_TARANTULA_WEB "TARANTULA_WEB"
#define MOVESPEED_ID_LIVING_TURF_SPEEDMOD "LIVING_TURF_SPEEDMOD"
+#define MOVESPEED_ID_LIVING_LIMBLESS "LIVING_LIMBLESS"
#define MOVESPEED_ID_CARBON_SOFTCRIT "CARBON_SOFTCRIT"
#define MOVESPEED_ID_CARBON_OLDSPEED "CARBON_DEPRECATED_SPEED"
@@ -59,15 +63,19 @@
#define MOVESPEED_ID_HUMAN_CARRYING "HUMAN_CARRY"
#define MOVESPEED_ID_SHRINK_RAY "SHRUNKEN_SPEED_MODIFIER"
-#define MOVESPEED_ID_TASED_STATUS "TASED"
-
#define MOVESPEED_ID_SLAUGHTER "SLAUGHTER"
#define MOVESPEED_ID_CYBER_THRUSTER "CYBER_IMPLANT_THRUSTER"
#define MOVESPEED_ID_JETPACK "JETPACK"
-#define MOVESPEED_ID_SHOVE "SHOVE"
-
#define MOVESPEED_ID_MKULTRA "MKULTRA"
-#define MOVESPEED_ID_ELECTROSTAFF "ELECTROSTAFF"
\ No newline at end of file
+#define MOVESPEED_ID_TASED_STATUS "TASED"
+#define MOVESPEED_ID_ELECTROSTAFF "ELECTROSTAFF"
+
+#define MOVESPEED_ID_SHOVE "SHOVE"
+#define MOVESPEED_ID_FAT "FAT"
+#define MOVESPEED_ID_COLD "COLD"
+#define MOVESPEED_ID_HUNGRY "HUNGRY"
+#define MOVESPEED_ID_DAMAGE_SLOWDOWN "DAMAGE"
+#define MOVESPEED_ID_DAMAGE_SLOWDOWN_FLYING "FLYING"
\ No newline at end of file
diff --git a/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm b/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm
index 49d78907d3..0c41fb3e52 100644
--- a/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm
+++ b/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm
@@ -298,19 +298,15 @@
subcategory = CAT_AMMO
/datum/crafting_recipe/ashen_arrow
- name = "Bonfire-Hardened Arrow"
+ name = "Fire Hardened Arrow"
result = /obj/item/ammo_casing/caseless/arrow/ashen
- tools = list(/obj/structure/bonfire)
+ tools = list(TOOL_WELDER)
time = 30
always_availible = FALSE
reqs = list(/obj/item/ammo_casing/caseless/arrow = 1)
category = CAT_WEAPONRY
subcategory = CAT_AMMO
-/datum/crafting_recipe/ashen_arrow/welder
- name = "Welder-Hardened Arrow"
- tools = list(TOOL_WELDER)
-
/datum/crafting_recipe/smartdart
name = "Medical smartdart"
result = /obj/item/reagent_containers/syringe/dart
diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm
index b7ec8f38dc..a9830e58dc 100644
--- a/code/datums/datumvars.dm
+++ b/code/datums/datumvars.dm
@@ -26,10 +26,10 @@
/datum/proc/vv_get_dropdown()
. = list()
. += "---"
- .["Call Proc"] = "?_src_=vars;[HrefToken()];proc_call=[REF(src)]"
- .["Mark Object"] = "?_src_=vars;[HrefToken()];mark_object=[REF(src)]"
- .["Delete"] = "?_src_=vars;[HrefToken()];delete=[REF(src)]"
- .["Show VV To Player"] = "?_src_=vars;[HrefToken(TRUE)];expose=[REF(src)]"
+ .["Call Proc"] = "?_src_=vars;[HrefToken()];proc_call=\ref[src]"
+ .["Mark Object"] = "?_src_=vars;[HrefToken()];mark_object=\ref[src]"
+ .["Delete"] = "?_src_=vars;[HrefToken()];delete=\ref[src]"
+ .["Show VV To Player"] = "?_src_=vars;[HrefToken(TRUE)];expose=\ref[src]"
/datum/proc/on_reagent_change(changetype)
@@ -54,7 +54,7 @@
return
var/title = ""
- var/refid = REF(D)
+ var/refid = "\ref[D]"
var/icon/sprite
var/hash
@@ -62,8 +62,6 @@
if (!islist)
type = D.type
-
-
if(istype(D, /atom))
var/atom/AT = D
if(AT.icon && AT.icon_state)
@@ -410,7 +408,7 @@
/client/proc/vv_update_display(datum/D, span, content)
- src << output("[span]:[content]", "variables[REF(D)].browser:replace_span")
+ src << output("[span]:[content]", "variables\ref[D].browser:replace_span")
#define VV_HTML_ENCODE(thing) ( sanitize ? html_encode(thing) : thing )
@@ -423,9 +421,9 @@
name = DA[name] //name is really the index until this line
else
value = DA[name]
- header = "
(E) (C) (-) "
+ header = "(E) (C) (-) "
else
- header = "(E) (C) (M) "
+ header = "(E) (C) (M) "
else
header = ""
@@ -440,7 +438,7 @@
#ifdef VARSICON
var/icon/I = new/icon(value)
var/rnd = rand(1,10000)
- var/rname = "tmp[REF(I)][rnd].png"
+ var/rname = "tmp\ref[I][rnd].png"
usr << browse_rsc(I, rname)
item = "[VV_HTML_ENCODE(name)] = ([value])
"
#else
@@ -453,9 +451,9 @@
else if (istype(value, /datum))
var/datum/D = value
if ("[D]" != "[D.type]") //if the thing as a name var, lets use it.
- item = "[VV_HTML_ENCODE(name)] [REF(value)] = [D] [D.type]"
+ item = "[VV_HTML_ENCODE(name)] [REF(value)] = [D] [D.type]"
else
- item = "[VV_HTML_ENCODE(name)] [REF(value)] = [D.type]"
+ item = "[VV_HTML_ENCODE(name)] [REF(value)] = [D.type]"
else if (islist(value))
var/list/L = value
@@ -473,9 +471,9 @@
items += debug_variable(key, val, level + 1, sanitize = sanitize)
- item = "[VV_HTML_ENCODE(name)] = /list ([L.len])"
+ item = "[VV_HTML_ENCODE(name)] = /list ([L.len])"
else
- item = "[VV_HTML_ENCODE(name)] = /list ([L.len])"
+ item = "[VV_HTML_ENCODE(name)] = /list ([L.len])"
else if (name in GLOB.bitfields)
var/list/flags = list()
@@ -587,7 +585,7 @@
var/prompt = alert("Do you want to grant [C] access to view this VV window? (they will not be able to edit or change anything nor open nested vv windows unless they themselves are an admin)", "Confirm", "Yes", "No")
if (prompt != "Yes" || !usr.client)
return
- message_admins("[key_name_admin(usr)] Showed [key_name_admin(C)] a VV window")
+ message_admins("[key_name_admin(usr)] Showed [key_name_admin(C)] a VV window")
log_admin("Admin [key_name(usr)] Showed [key_name(C)] a VV window of a [thing]")
to_chat(C, "[usr.client.holder.fakekey ? "an Administrator" : "[usr.client.key]"] has granted you access to view a View Variables window")
C.debug_variables(thing)
diff --git a/code/datums/martial/cqc.dm b/code/datums/martial/cqc.dm
index 96f0caf82c..0871cf7eaa 100644
--- a/code/datums/martial/cqc.dm
+++ b/code/datums/martial/cqc.dm
@@ -119,7 +119,7 @@
D.grabbedby(A, 1)
if(old_grab_state == GRAB_PASSIVE)
D.drop_all_held_items()
- A.grab_state = GRAB_AGGRESSIVE //Instant agressive grab if on grab intent
+ A.setGrabState(GRAB_AGGRESSIVE) //Instant agressive grab if on grab intent
log_combat(A, D, "grabbed", addition="aggressively")
D.visible_message("[A] violently grabs [D]!", \
"[A] violently grabs you!")
@@ -185,7 +185,7 @@
D.SetSleeping(400)
restraining = FALSE
if(A.grab_state < GRAB_NECK)
- A.grab_state = GRAB_NECK
+ A.setGrabState(GRAB_NECK)
else
restraining = FALSE
return FALSE
diff --git a/code/datums/martial/psychotic_brawl.dm b/code/datums/martial/psychotic_brawl.dm
index 7609157ae1..be8659949d 100644
--- a/code/datums/martial/psychotic_brawl.dm
+++ b/code/datums/martial/psychotic_brawl.dm
@@ -34,10 +34,10 @@
log_combat(A, D, "grabbed", addition="aggressively")
D.visible_message("[A] violently grabs [D]!", \
"[A] violently grabs you!")
- A.grab_state = GRAB_AGGRESSIVE //Instant aggressive grab
+ A.setGrabState(GRAB_AGGRESSIVE) //Instant aggressive grab
else
log_combat(A, D, "grabbed", addition="passively")
- A.grab_state = GRAB_PASSIVE
+ A.setGrabState(GRAB_PASSIVE)
if(4)
A.do_attack_animation(D, ATTACK_EFFECT_PUNCH)
atk_verb = "headbutts"
diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm
index 9aab8b7c47..464c362a44 100644
--- a/code/datums/martial/sleeping_carp.dm
+++ b/code/datums/martial/sleeping_carp.dm
@@ -115,7 +115,7 @@
D.grabbedby(A, 1)
if(old_grab_state == GRAB_PASSIVE)
D.drop_all_held_items()
- A.grab_state = GRAB_AGGRESSIVE //Instant agressive grab if on grab intent
+ A.setGrabState(GRAB_AGGRESSIVE) //Instant agressive grab if on grab intent
log_combat(A, D, "grabbed", addition="aggressively")
D.visible_message("[A] violently grabs [D]!", \
"[A] violently grabs you!")
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index 99b8165306..00dc0d98d6 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -514,39 +514,6 @@ GLOBAL_LIST_EMPTY(teleportlocs)
/client/proc/ResetAmbiencePlayed()
played = FALSE
-/atom/proc/has_gravity(turf/T)
- if(!T || !isturf(T))
- T = get_turf(src)
-
- if(!T)
- return 0
-
- var/list/forced_gravity = list()
- SEND_SIGNAL(src, COMSIG_ATOM_HAS_GRAVITY, T, forced_gravity)
- if(!forced_gravity.len)
- SEND_SIGNAL(T, COMSIG_TURF_HAS_GRAVITY, src, forced_gravity)
- if(forced_gravity.len)
- var/max_grav
- for(var/i in forced_gravity)
- max_grav = max(max_grav, i)
- if(max_grav)
- return max_grav
-
- if(isspaceturf(T)) // Turf never has gravity
- return 0
-
- var/area/A = get_area(T)
- if(A.has_gravity) // Areas which always has gravity
- return A.has_gravity
- else
- // There's a gravity generator on our z level
- if(GLOB.gravity_generators["[T.z]"])
- var/max_grav = 0
- for(var/obj/machinery/gravity_generator/main/G in GLOB.gravity_generators["[T.z]"])
- max_grav = max(G.setting,max_grav)
- return max_grav
- return SSmapping.level_trait(T.z, ZTRAIT_GRAVITY)
-
/area/proc/setup(a_name)
name = a_name
power_equip = FALSE
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index b542381c0f..d8d7ce3d91 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -918,3 +918,49 @@ Proc for attack log creation, because really why not
if(!(material_flags & MATERIAL_NO_EFFECTS))
custom_material.on_applied(src, materials[custom_material] * multiplier * material_modifier, material_flags)
custom_materials[custom_material] += materials[x] * multiplier
+
+/**
+ * Returns true if this atom has gravity for the passed in turf
+ *
+ * Sends signals COMSIG_ATOM_HAS_GRAVITY and COMSIG_TURF_HAS_GRAVITY, both can force gravity with
+ * the forced gravity var
+ *
+ * Gravity situations:
+ * * No gravity if you're not in a turf
+ * * No gravity if this atom is in is a space turf
+ * * Gravity if the area it's in always has gravity
+ * * Gravity if there's a gravity generator on the z level
+ * * Gravity if the Z level has an SSMappingTrait for ZTRAIT_GRAVITY
+ * * otherwise no gravity
+ */
+/atom/proc/has_gravity(turf/T)
+ if(!T || !isturf(T))
+ T = get_turf(src)
+
+ if(!T)
+ return 0
+
+ var/list/forced_gravity = list()
+ SEND_SIGNAL(src, COMSIG_ATOM_HAS_GRAVITY, T, forced_gravity)
+ if(!forced_gravity.len)
+ SEND_SIGNAL(T, COMSIG_TURF_HAS_GRAVITY, src, forced_gravity)
+ if(forced_gravity.len)
+ var/max_grav
+ for(var/i in forced_gravity)
+ max_grav = max(max_grav, i)
+ return max_grav
+
+ if(isspaceturf(T)) // Turf never has gravity
+ return 0
+
+ var/area/A = get_area(T)
+ if(A.has_gravity) // Areas which always has gravity
+ return A.has_gravity
+ else
+ // There's a gravity generator on our z level
+ if(GLOB.gravity_generators["[T.z]"])
+ var/max_grav = 0
+ for(var/obj/machinery/gravity_generator/main/G in GLOB.gravity_generators["[T.z]"])
+ max_grav = max(G.setting,max_grav)
+ return max_grav
+ return SSmapping.level_trait(T.z, ZTRAIT_GRAVITY)
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index 95b6d0c214..9f1eb534a9 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -131,7 +131,7 @@
return FALSE
// Are we trying to pull something we are already pulling? Then enter grab cycle and end.
if(AM == pulling)
- grab_state = state
+ setGrabState(state)
if(istype(AM,/mob/living))
var/mob/living/AMob = AM
AMob.grabbedby(src)
@@ -142,7 +142,7 @@
AM.pulledby.stop_pulling() //an object can't be pulled by two mobs at once.
pulling = AM
AM.pulledby = src
- grab_state = state
+ setGrabState(state)
if(ismob(AM))
var/mob/M = AM
log_combat(src, M, "grabbed", addition="passive grab")
@@ -155,7 +155,7 @@
pulling.pulledby = null
var/mob/living/ex_pulled = pulling
pulling = null
- grab_state = 0
+ setGrabState(0)
if(isliving(ex_pulled))
var/mob/living/L = ex_pulled
L.update_mobility()// mob gets up if it was lyng down in a chokehold
@@ -563,6 +563,11 @@
return FALSE
return TRUE
+/// Updates the grab state of the movable
+/// This exists to act as a hook for behaviour
+/atom/movable/proc/setGrabState(newstate)
+ grab_state = newstate
+
/obj/item/proc/do_pickup_animation(atom/target)
set waitfor = FALSE
if(!istype(loc, /turf))
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index fd1d2fc43d..fd6ae1bb43 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -377,6 +377,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
qdel(src)
item_flags &= ~IN_INVENTORY
SEND_SIGNAL(src, COMSIG_ITEM_DROPPED,user)
+ user.update_equipment_speed_mods()
// called just as an item is picked up (loc is not yet changed)
/obj/item/proc/pickup(mob/user)
@@ -422,6 +423,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
if(item_action_slot_check(slot, user, A)) //some items only give their actions buttons when in a specific slot.
A.Grant(user)
item_flags |= IN_INVENTORY
+ user.update_equipment_speed_mods()
//sometimes we only want to grant the item's action if it's equipped in a specific slot.
/obj/item/proc/item_action_slot_check(slot, mob/user, datum/action/A)
diff --git a/code/modules/food_and_drinks/food/snacks_frozen.dm b/code/modules/food_and_drinks/food/snacks_frozen.dm
index 5cef5b6fb6..0bcfe340aa 100644
--- a/code/modules/food_and_drinks/food/snacks_frozen.dm
+++ b/code/modules/food_and_drinks/food/snacks_frozen.dm
@@ -140,7 +140,7 @@
/obj/item/reagent_containers/food/snacks/snowcones/blue
name = "bluecherry snowcone"
desc = "Bluecherry syrup drizzled over a snowball in a paper cup, how rare!"
- icon_state = "blue_sc"
+ icon_state = "red_sc"
list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/bluecherryjelly = 5)
tastes = list("ice" = 1, "water" = 1, "blue" = 5, "cherries" = 5)
foodtype = FRUIT
@@ -148,7 +148,7 @@
/obj/item/reagent_containers/food/snacks/snowcones/red
name = "cherry snowcone"
desc = "Cherry syrup drizzled over a snowball in a paper cup."
- icon_state = "red_sc"
+ icon_state = "blue_sc"
list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/cherryjelly = 5)
tastes = list("ice" = 1, "water" = 1, "red" = 5, "cherries" = 5)
foodtype = FRUIT
@@ -223,7 +223,7 @@
tastes = list("ice" = 1, "water" = 1, "cola" = 5)
/obj/item/reagent_containers/food/snacks/snowcones/spacemountainwind
- name = "Space Mountain Wind snowcone"
+ name = "\improper Space Mountain Wind snowcone"
desc = "Space Mountain Wind drizzled over a snowball in a paper cup."
icon_state = "kiwi_sc"
list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/spacemountainwind = 5)
diff --git a/code/modules/food_and_drinks/food/snacks_pastry.dm b/code/modules/food_and_drinks/food/snacks_pastry.dm
index de1f00ae5d..ecd9074950 100644
--- a/code/modules/food_and_drinks/food/snacks_pastry.dm
+++ b/code/modules/food_and_drinks/food/snacks_pastry.dm
@@ -201,10 +201,10 @@
/obj/item/reagent_containers/food/snacks/donut/jelly/choco
name = "chocolate jelly donut"
desc = "Goes great with a glass of warm milk."
- icon_state = "jelly_choc"
+ icon_state = "jelly_choco"
bonus_reagents = list(/datum/reagent/consumable/hot_coco = 3, /datum/reagent/consumable/sprinkles = 1, /datum/reagent/consumable/nutriment/vitamin = 1) //the coco reagent is just bitter.
tastes = list("jelly" = 1, "donut" = 4, "bitterness" = 1)
- decorated_icon = "jelly_choc_sprinkles"
+ decorated_icon = "jelly_choco_sprinkles"
filling_color = "#4F230D"
/obj/item/reagent_containers/food/snacks/donut/jelly/blumpkin
diff --git a/code/modules/mob/living/carbon/carbon_movement.dm b/code/modules/mob/living/carbon/carbon_movement.dm
index 26ac12b97a..fa060d8b34 100644
--- a/code/modules/mob/living/carbon/carbon_movement.dm
+++ b/code/modules/mob/living/carbon/carbon_movement.dm
@@ -1,15 +1,3 @@
-/mob/living/carbon/movement_delay()
- . = ..()
- . += grab_state * 3 //can't go fast while grabbing something.
-
- if(!get_leg_ignore()) //ignore the fact we lack legs
- var/leg_amount = get_num_legs()
- . += 6 - 3*leg_amount //the fewer the legs, the slower the mob
- if(!leg_amount)
- . += 6 - 3*get_num_arms() //crawling is harder with fewer arms
- if(legcuffed)
- . += legcuffed.slowdown
-
/mob/living/carbon/slip(knockdown_amount, obj/O, lube)
if(movement_type & FLYING && !(lube & FLYING_DOESNT_HELP))
return FALSE
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index bd7cbb48f9..feb19ceaae 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -948,6 +948,22 @@
if(is_type_in_typecache(active_item, GLOB.shove_disarming_types))
visible_message("[src.name] regains their grip on \the [active_item]!", "You regain your grip on \the [active_item]", null, COMBAT_MESSAGE_RANGE)
+/mob/living/carbon/human/updatehealth()
+ . = ..()
+
+ if(HAS_TRAIT(src, TRAIT_IGNORESLOWDOWN))
+ remove_movespeed_modifier(MOVESPEED_ID_DAMAGE_SLOWDOWN)
+ remove_movespeed_modifier(MOVESPEED_ID_DAMAGE_SLOWDOWN_FLYING)
+ return
+ var/stambufferinfluence = (bufferedstam*(100/stambuffer))*0.2 //CIT CHANGE - makes stamina buffer influence movedelay
+ var/health_deficiency = ((100 + stambufferinfluence) - health + (getStaminaLoss()*0.75))//CIT CHANGE - reduces the impact of staminaloss and makes stamina buffer influence it
+ if(health_deficiency >= 40)
+ add_movespeed_modifier(MOVESPEED_ID_DAMAGE_SLOWDOWN, override = TRUE, multiplicative_slowdown = ((health_deficiency-39) / 75), blacklisted_movetypes = FLOATING|FLYING)
+ add_movespeed_modifier(MOVESPEED_ID_DAMAGE_SLOWDOWN_FLYING, override = TRUE, multiplicative_slowdown = ((health_deficiency-39) / 25), movetypes = FLOATING)
+ else
+ remove_movespeed_modifier(MOVESPEED_ID_DAMAGE_SLOWDOWN)
+ remove_movespeed_modifier(MOVESPEED_ID_DAMAGE_SLOWDOWN_FLYING)
+
/mob/living/carbon/human/do_after_coefficent()
. = ..()
. *= physiology.do_after_speed
diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm
index f37673a5a3..608ad76128 100644
--- a/code/modules/mob/living/carbon/human/human_movement.dm
+++ b/code/modules/mob/living/carbon/human/human_movement.dm
@@ -9,8 +9,8 @@
/mob/living/carbon/human/movement_delay()
. = ..()
- if(dna && dna.species)
- . += dna.species.movement_delay(src)
+ if (m_intent == MOVE_INTENT_WALK && HAS_TRAIT(src, TRAIT_SPEEDY_STEP))
+ . -= 1.5
/mob/living/carbon/human/slip(knockdown_amount, obj/O, lube)
if(HAS_TRAIT(src, TRAIT_NOSLIPALL))
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index ec0eda846c..122a06b17b 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -145,6 +145,12 @@
return not_handled //For future deeper overrides
+/mob/living/carbon/human/equipped_speed_mods()
+ . = ..()
+ for(var/sloties in get_all_slots())
+ var/obj/item/thing = sloties
+ . += thing?.slowdown
+
/mob/living/carbon/human/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE)
var/index = get_held_index_of_item(I)
. = ..() //See mob.dm for an explanation on this and some rage about people copypasting instead of calling ..() like they should.
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index c8e5f54ed3..92a19b9bd7 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -1296,12 +1296,14 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
if(H.overeatduration < 100)
to_chat(H, "You feel fit again!")
REMOVE_TRAIT(H, TRAIT_FAT, OBESITY)
+ H.remove_movespeed_modifier(MOVESPEED_ID_FAT)
H.update_inv_w_uniform()
H.update_inv_wear_suit()
else
if(H.overeatduration >= 100)
to_chat(H, "You suddenly feel blubbery!")
ADD_TRAIT(H, TRAIT_FAT, OBESITY)
+ H.add_movespeed_modifier(MOVESPEED_ID_FAT, multiplicative_slowdown = 1.5)
H.update_inv_w_uniform()
H.update_inv_wear_suit()
@@ -1352,6 +1354,15 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
to_chat(H, "You no longer feel vigorous.")
H.metabolism_efficiency = 1
+ //Hunger slowdown for if mood isn't enabled
+ if(CONFIG_GET(flag/disable_human_mood))
+ if(!HAS_TRAIT(H, TRAIT_NOHUNGER))
+ var/hungry = (500 - H.nutrition) / 5 //So overeat would be 100 and default level would be 80
+ if(hungry >= 70)
+ H.add_movespeed_modifier(MOVESPEED_ID_HUNGRY, override = TRUE, multiplicative_slowdown = (hungry / 50))
+ else
+ H.remove_movespeed_modifier(MOVESPEED_ID_HUNGRY)
+
switch(H.nutrition)
if(NUTRITION_LEVEL_FULL to INFINITY)
H.throw_alert("nutrition", /obj/screen/alert/fat)
@@ -1401,59 +1412,6 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
H.hair_style = "Bald"
H.update_hair()
-////////////////
-// MOVE SPEED //
-////////////////
-
-/datum/species/proc/movement_delay(mob/living/carbon/human/H)
- . = 0 //We start at 0.
- var/flight = 0 //Check for flight and flying items
- var/gravity = 0
- if(H.movement_type & FLYING)
- flight = 1
-
- gravity = H.has_gravity()
-
- if (H.m_intent == MOVE_INTENT_WALK && HAS_TRAIT(H, TRAIT_SPEEDY_STEP))
- . -= 1.5
-
- if(!HAS_TRAIT(H, TRAIT_IGNORESLOWDOWN) && gravity)
- if(H.wear_suit)
- . += H.wear_suit.slowdown
- if(H.shoes)
- . += H.shoes.slowdown
- if(H.back)
- . += H.back.slowdown
- for(var/obj/item/I in H.held_items)
- if(I.item_flags & SLOWS_WHILE_IN_HAND)
- . += I.slowdown
- var/stambufferinfluence = (H.bufferedstam*(100/H.stambuffer))*0.2 //CIT CHANGE - makes stamina buffer influence movedelay
- var/health_deficiency = ((100 + stambufferinfluence) - H.health + (H.getStaminaLoss()*0.75))//CIT CHANGE - reduces the impact of staminaloss on movement speed and makes stamina buffer influence movedelay
- if(health_deficiency >= 40)
- if(flight)
- . += ((health_deficiency-39) / 75) // CIT CHANGE - adds -39 to health deficiency penalty to make the transition to low health movement a little less jarring
- else
- . += ((health_deficiency-39) / 25) // CIT CHANGE - ditto
- if(CONFIG_GET(flag/disable_human_mood))
- var/hungry = (500 - H.nutrition) / 5 //So overeat would be 100 and default level would be 80
- if((hungry >= 70) && !flight) //Being hungry will still allow you to use a flightsuit/wings.
- . += hungry / 50
-
- //Moving in high gravity is very slow (Flying too)
- if(gravity > STANDARD_GRAVITY)
- var/grav_force = min(gravity - STANDARD_GRAVITY,3)
- . += 1 + grav_force
-
- if(HAS_TRAIT(H, TRAIT_FAT))
- . += (1.5 - flight)
- if(H.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT && !HAS_TRAIT(H, TRAIT_RESISTCOLD))
- . += (BODYTEMP_COLD_DAMAGE_LIMIT - H.bodytemperature) / COLD_SLOWDOWN_FACTOR
- return .
-
-//////////////////
-// ATTACK PROCS //
-//////////////////
-
//////////////////
// ATTACK PROCS //
//////////////////
@@ -2070,6 +2028,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
SEND_SIGNAL(H, COMSIG_CLEAR_MOOD_EVENT, "cold")
SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "hot", /datum/mood_event/hot)
+ H.remove_movespeed_modifier(MOVESPEED_ID_COLD)
+
var/burn_damage
var/firemodifier = H.fire_stacks / 50
if (H.on_fire)
@@ -2085,6 +2045,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
else if(H.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT && !HAS_TRAIT(H, TRAIT_RESISTCOLD))
SEND_SIGNAL(H, COMSIG_CLEAR_MOOD_EVENT, "hot")
SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "cold", /datum/mood_event/cold)
+ //Sorry for the nasty oneline but I don't want to assign a variable on something run pretty frequently
+ H.add_movespeed_modifier(MOVESPEED_ID_COLD, override = TRUE, multiplicative_slowdown = ((BODYTEMP_COLD_DAMAGE_LIMIT - H.bodytemperature) / COLD_SLOWDOWN_FACTOR))
switch(H.bodytemperature)
if(200 to BODYTEMP_COLD_DAMAGE_LIMIT)
H.apply_damage(COLD_DAMAGE_LEVEL_1*coldmod*H.physiology.cold_mod, BURN)
@@ -2094,6 +2056,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
H.apply_damage(COLD_DAMAGE_LEVEL_3*coldmod*H.physiology.cold_mod, BURN)
else
+ H.remove_movespeed_modifier(MOVESPEED_ID_COLD)
SEND_SIGNAL(H, COMSIG_CLEAR_MOOD_EVENT, "cold")
SEND_SIGNAL(H, COMSIG_CLEAR_MOOD_EVENT, "hot")
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index abe1c3ee76..a2a69cb49a 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -727,6 +727,7 @@
return name
/mob/living/update_gravity(has_gravity,override = 0)
+ . = ..()
if(!SSticker.HasRoundStarted())
return
if(has_gravity)
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index 9c67498935..af8dc6dca9 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -250,7 +250,7 @@
return 0
if(user.voremode && user.grab_state == GRAB_AGGRESSIVE)
return 0
- user.grab_state++
+ user.setGrabState(user.grab_state + 1)
switch(user.grab_state)
if(GRAB_AGGRESSIVE)
var/add_log = ""
diff --git a/code/modules/mob/living/living_mobility.dm b/code/modules/mob/living/living_mobility.dm
index 4b2afd0448..8829e3a7f2 100644
--- a/code/modules/mob/living/living_mobility.dm
+++ b/code/modules/mob/living/living_mobility.dm
@@ -152,4 +152,17 @@
if(CHECK_MOBILITY(src, MOBILITY_MOVE) && !intentionalresting && canstand_involuntary && iscarbon(src) && client?.prefs?.autostand)//CIT CHANGE - adds autostanding as a preference
addtimer(CALLBACK(src, .proc/resist_a_rest, TRUE), 0) //CIT CHANGE - ditto
+ // Movespeed mods based on arms/legs quantity
+ if(!get_leg_ignore())
+ var/limbless_slowdown = 0
+ // These checks for <2 should be swapped out for something else if we ever end up with a species with more than 2
+ if(has_legs < 2)
+ limbless_slowdown += 6 - (has_legs * 3)
+ if(!has_legs && has_arms < 2)
+ limbless_slowdown += 6 - (has_arms * 3)
+ if(limbless_slowdown)
+ add_movespeed_modifier(MOVESPEED_ID_LIVING_LIMBLESS, update=TRUE, priority=100, override=TRUE, multiplicative_slowdown=limbless_slowdown, movetypes=GROUND)
+ else
+ remove_movespeed_modifier(MOVESPEED_ID_LIVING_LIMBLESS, update=TRUE)
+
return mobility_flags
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
index 5d54f92d47..56d112237e 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
@@ -275,7 +275,7 @@
H.dna.add_mutation(DWARFISM)
/obj/effect/mob_spawn/human/corpse/damaged/legioninfested/Initialize()
- var/type = pickweight(list("Miner" = 66, "Ashwalker" = 10, "Golem" = 10,"Clown" = 10, pick(list("Shadow", "YeOlde","Operative", "Cultist", "Lavaknight")) = 4)) //CIT CHANGE: Lavaknights
+ var/type = pickweight(list("Miner" = 45, "Ashwalker" = 10, "Golem" = 10,"Clown" = 10, pick(list("Shadow", "YeOlde","Operative", "Cultist", "Lavaknight")) = 4, "Assistant" = 20, "Beelegion" = 1))
switch(type)
if("Miner")
mob_species = pickweight(list(/datum/species/human = 70, /datum/species/lizard = 26, /datum/species/fly = 2, /datum/species/plasmaman = 2))
@@ -374,13 +374,47 @@
l_pocket = /obj/item/melee/cultblade/dagger
glasses = /obj/item/clothing/glasses/hud/health/night/cultblind
backpack_contents = list(/obj/item/reagent_containers/glass/beaker/unholywater = 1, /obj/item/cult_shift = 1, /obj/item/flashlight/flare/culttorch = 1, /obj/item/stack/sheet/runed_metal = 15)
- if("Lavaknight") //START OF CIT CHANGE
+ if("Lavaknight")
uniform = /obj/item/clothing/under/assistantformal
mask = /obj/item/clothing/mask/breath
shoes = /obj/item/clothing/shoes/sneakers/black
r_pocket = /obj/item/melee/transforming/energy/sword/cx/broken
suit = /obj/item/clothing/suit/space/hardsuit/lavaknight
suit_store = /obj/item/tank/internals/oxygen
- id = /obj/item/card/id/knight //END OF CIT CHANGE
+ id = /obj/item/card/id/knight
id_job = "Knight"
+ if("Assistant")
+ uniform = /obj/item/clothing/under/color/grey
+ belt = /obj/item/tank/internals/emergency_oxygen
+ mask = /obj/item/clothing/mask/gas
+ ears = /obj/item/radio/headset
+ gloves = /obj/item/clothing/gloves/color/fyellow
+ id = /obj/item/card/id/silver/reaper //looks cool and has a fancy name but only a 1% chance
+ back = /obj/item/storage/backpack
+ backpack_contents = list(/obj/item/stack/cable_coil = 12, /obj/item/assembly/flash = 1, /obj/item/storage/fancy/donut_box = 1, /obj/item/storage/fancy/cigarettes/cigpack_shadyjims = 1, /obj/item/lighter = 1)
+ if(prob(99))
+ id = /obj/item/card/id
+ id_job = "Assisant"
+ if(prob(95))
+ head = /obj/item/clothing/head/hardhat/red
+ if(prob(5))
+ gloves = /obj/item/clothing/gloves/color/yellow
+ if(prob(10))
+ back = /obj/item/twohanded/spear
+ backpack_contents = null
+ if(prob(90))
+ r_pocket = /obj/item/kitchen/knife
+ if(prob(60))
+ l_pocket = /obj/item/soap/homemade
+ if("Beelegion")
+ uniform = /obj/item/clothing/under/color/yellow
+ suit = /obj/item/clothing/suit/hooded/bee_costume
+ shoes = /obj/item/clothing/shoes/sneakers/yellow
+ gloves = /obj/item/clothing/gloves/color/yellow
+ ears = /obj/item/radio/headset
+ belt = /obj/item/storage/belt/fannypack/yellow
+ id_job = "Assisant"
+ id = /obj/item/card/id
+ l_pocket = /obj/item/reagent_containers/food/drinks/soda_cans/buzz_fuzz
+ mask = /obj/item/clothing/mask/rat/bee
. = ..()
diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm
index 990e61974e..8594d53bd1 100644
--- a/code/modules/mob/living/simple_animal/slime/slime.dm
+++ b/code/modules/mob/living/simple_animal/slime/slime.dm
@@ -70,7 +70,8 @@
var/colour = "grey"
var/coretype = /obj/item/slime_extract/grey
- var/list/slime_mutation[4]
+ var/list/slime_mutation
+ var/static/list/color_mutation_cache = list()
var/static/list/slime_colours = list("rainbow", "grey", "purple", "metal", "orange",
"blue", "dark blue", "dark purple", "yellow", "silver", "pink", "red",
@@ -84,6 +85,7 @@
/mob/living/simple_animal/slime/Initialize(mapload, new_colour="grey", new_is_adult=FALSE)
+ initialize_mutations()
var/datum/action/innate/slime/feed/F = new
F.Grant(src)
@@ -108,10 +110,16 @@
AC.Remove(src)
return ..()
+/mob/living/simple_animal/slime/proc/initialize_mutations()
+ var/list/cached = color_mutation_cache[colour]
+ if(!cached)
+ cached = color_mutation_cache[colour] = mutation_table(colour)
+ slime_mutation = cached
+
/mob/living/simple_animal/slime/proc/set_colour(new_colour)
colour = new_colour
update_name()
- slime_mutation = mutation_table(colour)
+ initialize_mutations()
var/sanitizedcolour = replacetext(colour, " ", "")
coretype = text2path("/obj/item/slime_extract/[sanitizedcolour]")
regenerate_icons()
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index ded7a5e222..e6cdf81e38 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -5,6 +5,8 @@
GLOB.all_clockwork_mobs -= src
GLOB.mob_directory -= tag
focus = null
+ LAssailant = null
+ movespeed_modification = null
for (var/alert in alerts)
clear_alert(alert, TRUE)
if(observers && observers.len)
@@ -955,3 +957,25 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0)
/mob/proc/getLAssailant()
return LAssailant?.resolve()
+
+/// Updates the grab state of the mob and updates movespeed
+/mob/setGrabState(newstate)
+ . = ..()
+ if(grab_state == GRAB_PASSIVE)
+ remove_movespeed_modifier(MOVESPEED_ID_MOB_GRAB_STATE, update=TRUE)
+ else
+ add_movespeed_modifier(MOVESPEED_ID_MOB_GRAB_STATE, update=TRUE, priority=100, override=TRUE, multiplicative_slowdown=grab_state*3, blacklisted_movetypes=FLOATING)
+
+/mob/proc/update_equipment_speed_mods()
+ var/speedies = equipped_speed_mods()
+ if(!speedies)
+ remove_movespeed_modifier(MOVESPEED_ID_MOB_EQUIPMENT, update=TRUE)
+ else
+ add_movespeed_modifier(MOVESPEED_ID_MOB_EQUIPMENT, update=TRUE, priority=100, override=TRUE, multiplicative_slowdown=speedies, blacklisted_movetypes=FLOATING)
+
+/// Gets the combined speed modification of all worn items
+/// Except base mob type doesnt really wear items
+/mob/proc/equipped_speed_mods()
+ for(var/obj/item/I in held_items)
+ if(I.item_flags & SLOWS_WHILE_IN_HAND)
+ . += I.slowdown
diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm
index 071ef1f49e..bac8053c9a 100644
--- a/code/modules/mob/mob_movement.dm
+++ b/code/modules/mob/mob_movement.dm
@@ -249,8 +249,12 @@
/mob/proc/slip(s_amount, w_amount, obj/O, lube)
return
-/mob/proc/update_gravity()
- return
+/mob/proc/update_gravity(has_gravity, override=FALSE)
+ var/speed_change = max(0, has_gravity - STANDARD_GRAVITY)
+ if(!speed_change)
+ remove_movespeed_modifier(MOVESPEED_ID_MOB_GRAVITY, update=TRUE)
+ else
+ add_movespeed_modifier(MOVESPEED_ID_MOB_GRAVITY, update=TRUE, priority=100, override=TRUE, multiplicative_slowdown=speed_change, blacklisted_movetypes=FLOATING)
//bodypart selection - Cyberboss
//8 toggles through head - eyes - mouth
diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm
index c9cfdde797..f1de696558 100644
--- a/code/modules/reagents/reagent_containers.dm
+++ b/code/modules/reagents/reagent_containers.dm
@@ -153,11 +153,10 @@
log_reagent("SPLASH - [src] object SplashReagents() onto [target] at [T] ([AREACOORD(T)])[throwerstring] - [reagents.log_list()]")
visible_message("[src] spills its contents all over [target].")
reagents.reaction(target, TOUCH)
+ reagents.clear_reagents()
if(QDELETED(src))
return
- reagents.clear_reagents()
-
//melts plastic beakers
/obj/item/reagent_containers/microwave_act(obj/machinery/microwave/M)
reagents.expose_temperature(1000)
diff --git a/html/changelogs/AutoChangeLog-pr-11193.yml b/html/changelogs/AutoChangeLog-pr-11193.yml
new file mode 100644
index 0000000000..413f6a5972
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11193.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "Two new legion drop. Assistant and Bee-Activist"
diff --git a/html/changelogs/AutoChangeLog-pr-11336.yml b/html/changelogs/AutoChangeLog-pr-11336.yml
new file mode 100644
index 0000000000..e4bf0bc62a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11336.yml
@@ -0,0 +1,4 @@
+author: "Putnam3145"
+delete-after: True
+changes:
+ - rscdel: "MKUltra no longer explodes into lovegas when it fermi explodes, instead causing a regular ol' fireball."
diff --git a/html/changelogs/AutoChangeLog-pr-11338.yml b/html/changelogs/AutoChangeLog-pr-11338.yml
new file mode 100644
index 0000000000..2597d91e11
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11338.yml
@@ -0,0 +1,4 @@
+author: "Crystal9156"
+delete-after: True
+changes:
+ - bugfix: "Fixes Chocolate Jelly Donut icon"
diff --git a/html/changelogs/AutoChangeLog-pr-11339.yml b/html/changelogs/AutoChangeLog-pr-11339.yml
new file mode 100644
index 0000000000..d719d6c98b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11339.yml
@@ -0,0 +1,4 @@
+author: "MrJWhit"
+delete-after: True
+changes:
+ - tweak: "Evens both sides of the gas containers TEG with reinforced windows"
diff --git a/html/changelogs/AutoChangeLog-pr-11340.yml b/html/changelogs/AutoChangeLog-pr-11340.yml
new file mode 100644
index 0000000000..064356eb4e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11340.yml
@@ -0,0 +1,5 @@
+author: "actioninja, ninjanomnom"
+delete-after: True
+changes:
+ - tweak: "Being fat is no longer lessened by flying."
+ - bugfix: "The slowdown from grabbing someone no longer applies when you're floating."
diff --git a/html/changelogs/AutoChangeLog-pr-11358.yml b/html/changelogs/AutoChangeLog-pr-11358.yml
new file mode 100644
index 0000000000..ec14dc1972
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11358.yml
@@ -0,0 +1,5 @@
+author: "bunny232"
+delete-after: True
+changes:
+ - rscadd: "Box bar now has a lightswitch."
+ - bugfix: "fixes several piping issues around box station"
diff --git a/html/changelogs/AutoChangeLog-pr-11359.yml b/html/changelogs/AutoChangeLog-pr-11359.yml
new file mode 100644
index 0000000000..d73ac47a70
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11359.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - imageadd: "Corrects snowcones names and a pixle. Corrects Space Wind snowcone as well"
diff --git a/html/changelogs/AutoChangeLog-pr-11367.yml b/html/changelogs/AutoChangeLog-pr-11367.yml
new file mode 100644
index 0000000000..0e3a840e3e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11367.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - bugfix: "Arrow crafting has been fixed... Again..."
diff --git a/icons/obj/food/snowcones.dmi b/icons/obj/food/snowcones.dmi
index 8f5b4f8992..b2b85abb7c 100644
Binary files a/icons/obj/food/snowcones.dmi and b/icons/obj/food/snowcones.dmi differ
diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
index a03d5eca81..eb93d273a7 100644
--- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
@@ -349,14 +349,9 @@
E.data["creatorID"] = B.data["ckey"]
E.creatorID = B.data["ckey"]
-/datum/chemical_reaction/fermi/enthrall/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH)
- var/turf/T = get_turf(my_atom)
- var/datum/reagents/R = new/datum/reagents(1000)
- var/datum/effect_system/smoke_spread/chem/s = new()
- R.add_reagent(/datum/reagent/fermi/enthrallExplo, volume)
- s.set_up(R, volume/2, T)
- s.start()
- my_atom.reagents.clear_reagents()
+/datum/chemical_reaction/fermi/enthrall/FermiExplode(datum/reagents/R0, var/atom/my_atom, volume, temp, pH)
+ R0.clear_reagents()
+ ..()
/datum/chemical_reaction/fermi/hatmium // done
name = "Hat growth serum"