diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm
index b053c5176c..0aaeba8e39 100644
--- a/_maps/map_files/PubbyStation/PubbyStation.dmm
+++ b/_maps/map_files/PubbyStation/PubbyStation.dmm
@@ -807,6 +807,11 @@
},
/turf/open/floor/plasteel/cafeteria,
/area/crew_quarters/fitness/pool)
+"abU" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/effect/landmark/xmastree,
+/turf/open/floor/plasteel/dark,
+/area/crew_quarters/bar)
"abV" = (
/obj/effect/turf_decal/stripes/corner,
/turf/open/floor/plasteel/white,
@@ -824,6 +829,13 @@
"abY" = (
/turf/open/floor/plasteel/white,
/area/ai_monitored/turret_protected/ai)
+"abZ" = (
+/obj/structure/flora/ausbushes/ywflowers,
+/obj/structure/flora/ausbushes/ppflowers,
+/obj/structure/flora/ausbushes/sparsegrass,
+/obj/effect/landmark/xmastree,
+/turf/open/floor/grass,
+/area/hydroponics/garden/monastery)
"acc" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
@@ -47489,12 +47501,6 @@
},
/turf/open/floor/plasteel/dark,
/area/chapel/main/monastery)
-"cgj" = (
-/obj/structure/flora/ausbushes/ywflowers,
-/obj/structure/flora/ausbushes/ppflowers,
-/obj/structure/flora/ausbushes/sparsegrass,
-/turf/open/floor/grass,
-/area/hydroponics/garden/monastery)
"cgk" = (
/obj/structure/flora/ausbushes/ywflowers,
/obj/structure/flora/ausbushes/sparsegrass,
@@ -79792,7 +79798,7 @@ cuE
cgK
cgJ
cgH
-cgj
+abZ
cvj
bWV
cfn
@@ -94890,7 +94896,7 @@ aYg
aZd
beB
bbq
-beB
+abU
bdx
beB
bft
@@ -110827,7 +110833,7 @@ bcQ
aaa
aaa
aaa
-abN
+bBW
aaa
aEj
aEj
@@ -111084,7 +111090,7 @@ bcQ
aaa
aaa
aaa
-aaa
+cFB
aaa
aEl
bnl
diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm
index dad2a38afd..7bb124fe0f 100644
--- a/code/__DEFINES/atmospherics.dm
+++ b/code/__DEFINES/atmospherics.dm
@@ -115,7 +115,7 @@
#define MAX_HIGH_PRESSURE_DAMAGE 16 // CITADEL CHANGES Max to 16, low to 8.
#define LOW_PRESSURE_DAMAGE 8 //The amount of damage someone takes when in a low pressure area (The pressure threshold is so low that it doesn't make sense to do any calculations, so it just applies this flat value).
-#define COLD_SLOWDOWN_FACTOR 20 //Humans are slowed by the difference between bodytemp and BODYTEMP_COLD_DAMAGE_LIMIT divided by this
+#define COLD_SLOWDOWN_FACTOR 35 //Humans are slowed by the difference between bodytemp and BODYTEMP_COLD_DAMAGE_LIMIT divided by this
//PIPES
//Atmos pipe limits
diff --git a/code/datums/diseases/advance/symptoms/flesh_eating.dm b/code/datums/diseases/advance/symptoms/flesh_eating.dm
index 44030b0417..b5b55c1e14 100644
--- a/code/datums/diseases/advance/symptoms/flesh_eating.dm
+++ b/code/datums/diseases/advance/symptoms/flesh_eating.dm
@@ -31,9 +31,8 @@ Bonus
var/bleed = FALSE
var/pain = FALSE
threshold_desc = list(
- "Resistance 9" = "Doubles the intensity of the immolation effect, but reduces the frequency of all of this symptom's effects.",
- "Stage Speed 8" = "Increases explosion radius and explosion damage to the host when the host is wet.",
- "Transmission 8" = "Additionally synthesizes chlorine trifluoride and napalm inside the host. More chemicals are synthesized if the resistance 9 threshold has been met."
+ "Resistance 7" = "Erodes the host's skin, causing them to bleed profusely.",
+ "Transmission 8" = "Eat's away at the host's musclemass, causing increased fatigue."
)
/datum/symptom/flesh_eating/Start(datum/disease/advance/A)
diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm
index 2fc853500d..c19f23ed2a 100644
--- a/code/datums/diseases/advance/symptoms/heal.dm
+++ b/code/datums/diseases/advance/symptoms/heal.dm
@@ -263,18 +263,18 @@
/datum/symptom/heal/coma/CanHeal(datum/disease/advance/A)
var/mob/living/M = A.affected_mob
+ if(M.getBruteLoss() + M.getFireLoss() >= 70 && !active_coma)
+ to_chat(M, "You feel yourself slip into a regenerative coma...")
+ active_coma = TRUE
+ addtimer(CALLBACK(src, .proc/coma, M), 60)
if(HAS_TRAIT(M, TRAIT_DEATHCOMA))
return power
- else if(M.IsUnconscious() || M.stat == UNCONSCIOUS)
- return power * 0.9
else if(M.stat == SOFT_CRIT)
return power * 0.5
else if(M.IsSleeping())
return power * 0.25
- else if(M.getBruteLoss() + M.getFireLoss() >= 70 && !active_coma)
- to_chat(M, "You feel yourself slip into a regenerative coma...")
- active_coma = TRUE
- addtimer(CALLBACK(src, .proc/coma, M), 60)
+ else if(M.IsUnconscious() || M.stat == UNCONSCIOUS)
+ return power * 0.9
/datum/symptom/heal/coma/proc/coma(mob/living/M)
if(deathgasp)
diff --git a/code/datums/elements/flavor_text.dm b/code/datums/elements/flavor_text.dm
index ae139104f0..6217665157 100644
--- a/code/datums/elements/flavor_text.dm
+++ b/code/datums/elements/flavor_text.dm
@@ -13,6 +13,8 @@ GLOBAL_LIST_EMPTY(mobs_with_editable_flavor_text) //et tu, hacky code
var/save_key
/// Do not attempt to render a preview on examine. If this is on, it will display as \[flavor_name\]
var/examine_no_preview = FALSE
+ /// Examine FULLY views. Overrides examine_no_preview
+ var/examine_full_view = FALSE
/datum/element/flavor_text/Attach(datum/target, text = "", _name = "Flavor Text", _addendum, _max_len = MAX_FLAVOR_LEN, _always_show = FALSE, _edit = TRUE, _save_key, _examine_no_preview = FALSE)
. = ..()
@@ -37,7 +39,7 @@ GLOBAL_LIST_EMPTY(mobs_with_editable_flavor_text) //et tu, hacky code
if(can_edit && ismob(target)) //but only mobs receive the proc/verb for the time being
var/mob/M = target
LAZYOR(GLOB.mobs_with_editable_flavor_text[M], src)
- M.verbs |= /mob/proc/manage_flavor_tests
+ add_verb(M, /mob/proc/manage_flavor_tests)
if(save_key && ishuman(target))
RegisterSignal(target, COMSIG_HUMAN_PREFS_COPIED_TO, .proc/update_prefs_flavor_text)
@@ -71,6 +73,9 @@ GLOBAL_LIST_EMPTY(mobs_with_editable_flavor_text) //et tu, hacky code
examine_list += "\[[flavor_name]\]"
return
var/msg = replacetext(text, "\n", " ")
+ if(examine_full_view)
+ examine_list += "[msg]"
+ return
if(length_char(msg) <= 40)
examine_list += "[msg]"
else
@@ -113,6 +118,21 @@ GLOBAL_LIST_EMPTY(mobs_with_editable_flavor_text) //et tu, hacky code
var/datum/element/flavor_text/F = choices[chosen]
F.set_flavor(src)
+/mob/proc/set_pose()
+ set name = "Set Pose"
+ set desc = "Sets your temporary flavor text"
+ set category = "IC"
+
+ var/list/L = GLOB.mobs_with_editable_flavor_text[src]
+ var/datum/element/flavor_text/carbon/temporary/T
+ for(var/i in L)
+ if(istype(i, /datum/element/flavor_text/carbon/temporary))
+ T = i
+ if(!T)
+ to_chat(src, "Your mob type does not support temporary flavor text.")
+ return
+ T.set_flavor(src)
+
/datum/element/flavor_text/proc/set_flavor(mob/user)
if(!(user in texts_by_atom))
return FALSE
@@ -135,7 +155,7 @@ GLOBAL_LIST_EMPTY(mobs_with_editable_flavor_text) //et tu, hacky code
var/static/list/i_dont_even_know_who_you_are = typecacheof(list(/datum/antagonist/abductor, /datum/antagonist/ert,
/datum/antagonist/nukeop, /datum/antagonist/wizard))
-/datum/element/flavor_text/carbon/Attach(datum/target, text = "", _name = "Flavor Text", _addendum, _max_len = MAX_FLAVOR_LEN, _always_show = FALSE, _edit = TRUE, _save_key = "flavor_text", _examine_no_preview = FALSE)
+/datum/element/flavor_text/carbon/Attach(datum/target, text = "", _name = "Flavor Text", _addendum, _max_len = MAX_FLAVOR_LEN, _always_show = FALSE, _edit = TRUE, _save_key, _examine_no_preview = FALSE)
if(!iscarbon(target))
return ELEMENT_INCOMPATIBLE
. = ..()
@@ -167,3 +187,19 @@ GLOBAL_LIST_EMPTY(mobs_with_editable_flavor_text) //et tu, hacky code
texts_by_atom[user] = ""
if(user.dna)
user.dna.features[save_key] = ""
+
+/datum/element/flavor_text/carbon/temporary
+ examine_full_view = TRUE
+ max_len = 1024
+
+/datum/element/flavor_text/carbon/temporary/Attach(datum/target, text, _name, _addendum, _max_len, _always_show, _edit, _save_key, _examine_no_preview)
+ . = ..()
+ if(. & ELEMENT_INCOMPATIBLE)
+ return
+ if(ismob(target))
+ add_verb(target, /mob/proc/set_pose)
+
+/datum/element/flavor_Text/carbon/temporary/Detach(datum/source, force)
+ . = ..()
+ if(ismob(source))
+ remove_verb(source, /mob/proc/set_pose)
diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm
index ef3979d822..f4a53d5c72 100644
--- a/code/datums/status_effects/buffs.dm
+++ b/code/datums/status_effects/buffs.dm
@@ -438,12 +438,19 @@
return
else
linked_alert.icon_state = "fleshmend"
- owner.adjustBruteLoss(-10, FALSE)
- owner.adjustFireLoss(-5, FALSE)
owner.adjustOxyLoss(-10)
if(!iscarbon(owner))
+ owner.adjustBruteLoss(-10, FALSE)
+ owner.adjustFireLoss(-5, FALSE)
return
var/mob/living/carbon/C = owner
+ var/list/damaged_parts = C.get_damaged_bodyparts(TRUE,TRUE, status = list(BODYPART_ORGANIC, BODYPART_HYBRID, BODYPART_NANITES))
+ if(damaged_parts.len)
+ for(var/obj/item/bodypart/part in damaged_parts)
+ part.heal_damage(10/damaged_parts.len, 5/damaged_parts.len, only_organic = FALSE, updating_health = FALSE)
+ C.updatehealth()
+ C.update_damage_overlays()
+
QDEL_LIST(C.all_scars)
/obj/screen/alert/status_effect/fleshmend
@@ -599,7 +606,7 @@
//Heal brain damage and toxyloss, alongside trauma
owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, -8)
- owner.adjustToxLoss(-6, forced = TRUE)
+ owner.adjustToxLoss(-6, forced = TRUE, toxins_type = TOX_OMNI)
M.cure_trauma_type(resilience = TRAUMA_RESILIENCE_BASIC)
//Purges 50 rads per tick
if(owner.radiation > 0)
diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm
index fe27cc2baf..3cbf4b3cd2 100644
--- a/code/datums/traits/negative.dm
+++ b/code/datums/traits/negative.dm
@@ -137,12 +137,18 @@ GLOBAL_LIST_EMPTY(family_heirlooms)
var/lums = T.get_lumcount()
if(lums <= 0.2)
if(quirk_holder.m_intent == MOVE_INTENT_RUN)
- to_chat(quirk_holder, "Easy, easy, take it slow... you're in the dark...")
- quirk_holder.toggle_move_intent()
+ addtimer(CALLBACK(src, .proc/recheck),2) //0.2 seconds of being in the dark
SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, "nyctophobia", /datum/mood_event/nyctophobia)
else
SEND_SIGNAL(quirk_holder, COMSIG_CLEAR_MOOD_EVENT, "nyctophobia")
+/datum/quirk/nyctophobia/proc/recheck()
+ var/turf/T = get_turf(quirk_holder)
+ var/lums = T.get_lumcount()
+ if(lums <= 0.2) //check again, did they remain in the dark for 0.2 seconds?
+ to_chat(quirk_holder, "Easy, easy, take it slow... you're in the dark...")
+ quirk_holder.toggle_move_intent()
+
/datum/quirk/lightless
name = "Light Sensitivity"
desc = "Bright lights irritate you. Your eyes start to water, your skin feels itchy against the photon radiation, and your hair gets dry and frizzy. Maybe it's a medical condition. If only Nanotrasen was more considerate of your needs..."
diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm
index 4c9ea06620..296b46bf85 100644
--- a/code/game/objects/items/handcuffs.dm
+++ b/code/game/objects/items/handcuffs.dm
@@ -377,10 +377,3 @@
hitsound = 'sound/weapons/taserhit.ogg'
w_class = WEIGHT_CLASS_SMALL
breakouttime = 60
-
-/obj/item/restraints/legcuffs/bola/energy/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
- if(iscarbon(hit_atom))
- var/obj/item/restraints/legcuffs/beartrap/B = new /obj/item/restraints/legcuffs/beartrap/energy/cyborg(get_turf(hit_atom))
- B.Crossed(hit_atom)
- qdel(src)
- ..()
diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm
index 9bc20565a6..3588b7be63 100644
--- a/code/game/objects/items/plushes.dm
+++ b/code/game/objects/items/plushes.dm
@@ -33,6 +33,8 @@
//--end of love :'(--
var/snowflake_id //if we set from a config snowflake plushie.
+ /// wrapper, do not use, read only
+ var/__ADMIN_SET_TO_ID
var/can_random_spawn = TRUE //if this is FALSE, don't spawn this for random plushies.
/obj/item/toy/plush/random_snowflake/Initialize(mapload, set_snowflake_id)
@@ -112,10 +114,21 @@
return ..()
+/obj/item/toy/plush/vv_get_var(var_name)
+ if(var_name == NAMEOF(src, __ADMIN_SET_TO_ID))
+ return debug_variable("__ADMIN: SET SNOWFLAKE ID", snowflake_id, 0, src)
+ return ..()
+
+/obj/item/toy/plush/vv_edit_var(var_name, var_value)
+ if(var_name == NAMEOF(src, __ADMIN_SET_TO_ID))
+ return set_snowflake_from_config(var_value)
+ return ..()
+
/obj/item/toy/plush/proc/set_snowflake_from_config(id)
var/list/configlist = CONFIG_GET(keyed_list/snowflake_plushies)
var/list/jsonlist = configlist[id]
- ASSERT(jsonlist)
+ if(!jsonlist)
+ return FALSE
jsonlist = json_decode(jsonlist)
if(jsonlist["inherit_from"])
var/path = text2path(jsonlist["inherit_from"])
@@ -151,6 +164,7 @@
var/datum/component/squeak/S = GetComponent(/datum/component/squeak)
S?.override_squeak_sounds = squeak_override
snowflake_id = id
+ return TRUE
/obj/item/toy/plush/handle_atom_del(atom/A)
if(A == grenade)
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index 46eb82342a..52082637a3 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -446,8 +446,11 @@
var/mob/living/L = O
if(!issilicon(L))
L.DefaultCombatKnockdown(40)
- O.forceMove(T)
- close()
+ if(istype(src, /obj/structure/closet/supplypod/extractionpod))
+ O.forceMove(src)
+ else
+ O.forceMove(T)
+ close()
else
O.forceMove(T)
return 1
diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm
index 3cdbe8badb..9c9639e57c 100644
--- a/code/game/turfs/space/space.dm
+++ b/code/game/turfs/space/space.dm
@@ -164,6 +164,8 @@
while (pulling != null)
var/next_pulling = pulling.pulling
+ if(next_pulling == pulling)
+ break // no loops
var/turf/T = get_step(puller.loc, turn(puller.dir, 180))
pulling.can_be_z_moved = FALSE
diff --git a/code/modules/admin/view_variables/topic.dm b/code/modules/admin/view_variables/topic.dm
index af412a6caa..d7e893ec03 100644
--- a/code/modules/admin/view_variables/topic.dm
+++ b/code/modules/admin/view_variables/topic.dm
@@ -98,7 +98,7 @@
L.adjustFireLoss(amount)
newamt = L.getFireLoss()
if("toxin")
- L.adjustToxLoss(amount, toxins_type = TOX_OMNI)
+ L.adjustToxLoss(amount, toxins_type = TOX_OMNI, forced = TRUE)
newamt = L.getToxLoss()
if("oxygen")
L.adjustOxyLoss(amount)
diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm
index 4117fc2b36..3e358cd795 100644
--- a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm
+++ b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm
@@ -120,9 +120,14 @@
if(bruteheal + fireheal + toxinheal > 0) // Just a check? Don't heal/spend, and return.
if(mult == 0)
return TRUE
+
// We have damage. Let's heal (one time)
- C.adjustBruteLoss(-bruteheal * mult, forced = TRUE)// Heal BRUTE / BURN in random portions throughout the body.
- C.adjustFireLoss(-fireheal * mult, forced = TRUE)
+ var/list/damaged_parts = C.get_damaged_bodyparts(TRUE,TRUE, status = list(BODYPART_ORGANIC, BODYPART_HYBRID, BODYPART_NANITES))
+ if(damaged_parts.len)
+ for(var/obj/item/bodypart/part in damaged_parts) // Heal BRUTE / BURN equally distibuted over all damaged bodyparts.
+ part.heal_damage((bruteheal * mult)/damaged_parts.len, (fireheal * mult)/damaged_parts.len, only_organic = FALSE, updating_health = FALSE)
+ C.updatehealth()
+ C.update_damage_overlays()
C.adjustToxLoss(-toxinheal * mult * 2, forced = TRUE) //Toxin healing because vamps arent immune
//C.heal_overall_damage(bruteheal * mult, fireheal * mult) // REMOVED: We need to FORCE this, because otherwise, vamps won't heal EVER. Swapped to above.
AddBloodVolume((bruteheal * -0.5 + fireheal * -1 + toxinheal * -0.2) / mult * costMult) // Costs blood to heal
@@ -276,7 +281,7 @@
/datum/antagonist/bloodsucker/proc/FinalDeath()
//Dont bother if we are already supposed to be dead
if(FinalDeath)
- return
+ return
FinalDeath = TRUE //We are now supposed to die. Lets not spam it.
if(!iscarbon(owner.current)) //Check for non carbons.
owner.current.gib()
diff --git a/code/modules/antagonists/eldritch_cult/eldritch_antag.dm b/code/modules/antagonists/eldritch_cult/eldritch_antag.dm
index 25602c8588..d54f008108 100644
--- a/code/modules/antagonists/eldritch_cult/eldritch_antag.dm
+++ b/code/modules/antagonists/eldritch_cult/eldritch_antag.dm
@@ -98,7 +98,7 @@
var/pck = pick("assasinate","protect")
switch(pck)
if("assasinate")
- var/datum/objective/assassinate/A = new
+ var/datum/objective/assassinate/once/A = new
A.owner = owner
var/list/owners = A.get_owners()
A.find_target(owners,protection)
diff --git a/code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm b/code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm
index f5c54dd7bf..9d65396c63 100644
--- a/code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm
+++ b/code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm
@@ -69,7 +69,7 @@
var/mob/living/living_user = user
living_user.adjustBruteLoss(-3, FALSE)
living_user.adjustFireLoss(-3, FALSE)
- living_user.adjustToxLoss(-3, FALSE)
+ living_user.adjustToxLoss(-3, FALSE, TRUE)
living_user.adjustOxyLoss(-1, FALSE)
living_user.adjustStaminaLoss(-6)
diff --git a/code/modules/cargo/supplypod.dm b/code/modules/cargo/supplypod.dm
index 6169c4d3f0..efac62c930 100644
--- a/code/modules/cargo/supplypod.dm
+++ b/code/modules/cargo/supplypod.dm
@@ -74,7 +74,6 @@
bluespace = TRUE
explosionSize = list(0,0,1,2)
landingDelay = 25 //Longer than others
- reverseOptionList = list("Mobs"=TRUE,"Objects"=FALSE,"Anchored"=FALSE,"Underfloor"=FALSE,"Wallmounted"=FALSE,"Floors"=FALSE,"Walls"=FALSE)
/obj/structure/closet/supplypod/centcompod
style = STYLE_CENTCOM
diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm
index 12829ed0e7..40ad6dddd1 100644
--- a/code/modules/clothing/spacesuits/hardsuit.dm
+++ b/code/modules/clothing/spacesuits/hardsuit.dm
@@ -873,9 +873,9 @@
/obj/item/clothing/head/helmet/space/hardsuit/lavaknight
name = "cydonian helmet"
desc = "A helmet designed with both form and function in mind, it protects the user against physical trauma and hazardous conditions while also having polychromic light strips."
- icon_state = "knight_cydonia"
+ icon_state = "hardsuit0-knight_cydonia"
item_state = "knight_yellow"
- hardsuit_type = null
+ hardsuit_type = "knight_cydonia"
max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
resistance_flags = FIRE_PROOF | LAVA_PROOF
heat_protection = HEAD
diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm
index dd46d7a5bb..2ffe85b6c4 100644
--- a/code/modules/clothing/spacesuits/miscellaneous.dm
+++ b/code/modules/clothing/spacesuits/miscellaneous.dm
@@ -256,7 +256,7 @@ Contains:
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/alert
armor = list("melee" = 70, "bullet" = 55, "laser" = 50, "energy" = 50, "bomb" = 65, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100, "wound" = 50)
resistance_flags = FIRE_PROOF | ACID_PROOF
- mutantrace_variation = STYLE_DIGITIGRADE|STYLE_SNEK_TAURIC
+ mutantrace_variation = STYLE_DIGITIGRADE|STYLE_SNEK_TAURIC|STYLE_PAW_TAURIC
//ERT Security
/obj/item/clothing/head/helmet/space/hardsuit/ert/alert/sec
diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm
index 9b816a9f90..64ab4791d3 100644
--- a/code/modules/jobs/job_types/_job.dm
+++ b/code/modules/jobs/job_types/_job.dm
@@ -133,12 +133,12 @@
return TRUE
/datum/job/proc/GetAntagRep()
- . = CONFIG_GET(keyed_list/antag_rep)[lowertext(title)]
+ . = CONFIG_GET(keyed_list/antag_rep)[ckey(title)]
if(. == null)
return antag_rep
/datum/job/proc/GetThreat()
- . = CONFIG_GET(keyed_list/job_threat)[lowertext(title)]
+ . = CONFIG_GET(keyed_list/job_threat)[ckey(title)]
if(. == null)
return threat
diff --git a/code/modules/mob/dead/observer/respawn.dm b/code/modules/mob/dead/observer/respawn.dm
index f966051ed3..94ebf42a2a 100644
--- a/code/modules/mob/dead/observer/respawn.dm
+++ b/code/modules/mob/dead/observer/respawn.dm
@@ -155,16 +155,18 @@
penalize = client.prefs.respawn_restrictions_active
client.prefs.respawn_restrictions_active = penalize
- to_chat(src, "You have been respawned to the lobby. \
+ message_admins("[key_name_admin(src)] was respawned to lobby [penalize? "with" : "without"] restrictions.")
+ log_game("[key_name(src)] was respawned to lobby [penalize? "with" : "without"] restrictions.")
+ var/mob/dead/new_player/N = transfer_to_lobby()
+
+ to_chat(N, "You have been respawned to the lobby. \
Remember to take heed of rules regarding round knowledge - notably, that ALL past lives are forgotten. \
Any character you join as has NO knowledge of round events unless specified otherwise by an admin.")
- message_admins("[key_name_admin(src)] was respawned to lobby [penalize? "with" : "without"] restrictions.")
- log_game("[key_name(src)] was respawned to lobby [penalize? "with" : "without"] restrictions.")
- transfer_to_lobby()
-
/**
* Actual proc that removes us and puts us back on lobby
+ *
+ * Returns the new mob.
*/
/mob/dead/observer/proc/transfer_to_lobby()
if(!client) // if no one's in us we can just be deleted
@@ -179,3 +181,4 @@
var/mob/dead/new_player/M = new /mob/dead/new_player
M.ckey = ckey
+ return M
diff --git a/code/modules/mob/living/carbon/death.dm b/code/modules/mob/living/carbon/death.dm
index c3e849efa6..ee2f945b65 100644
--- a/code/modules/mob/living/carbon/death.dm
+++ b/code/modules/mob/living/carbon/death.dm
@@ -5,7 +5,7 @@
silent = FALSE
losebreath = 0
- if(!gibbed)
+ if(!gibbed && !HAS_TRAIT(src, TRAIT_DEATHCOMA))
emote("deathgasp")
. = ..()
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 3aa26de5cf..03816555b3 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -43,7 +43,7 @@
AddComponent(/datum/component/mood)
AddComponent(/datum/component/combat_mode)
AddElement(/datum/element/flavor_text/carbon, _name = "Flavor Text", _save_key = "flavor_text")
- AddElement(/datum/element/flavor_text, "", "Temporary Flavor Text", "This should be used only for things pertaining to the current round!")
+ AddElement(/datum/element/flavor_text/carbon/temporary, "", "Set Pose (Temporary Flavor Text)", "This should be used only for things pertaining to the current round!", _save_key = null)
AddElement(/datum/element/flavor_text, _name = "OOC Notes", _addendum = "Put information on ERP/vore/lewd-related preferences here. THIS SHOULD NOT CONTAIN REGULAR FLAVORTEXT!!", _always_show = TRUE, _save_key = "ooc_notes", _examine_no_preview = TRUE)
/mob/living/carbon/human/Destroy()
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index 07d45f966a..d130b053e2 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -14,7 +14,7 @@
blocks_emissive = EMISSIVE_BLOCK_UNIQUE
block_parry_data = /datum/block_parry_data/unarmed/human
- default_block_parry_data = /datum/block_parry_data/unarmed/pugilist
+ default_block_parry_data = /datum/block_parry_data/unarmed/human
causes_dirt_buildup_on_floor = TRUE
//Hair colour and style
diff --git a/code/modules/mob/say_vr.dm b/code/modules/mob/say_vr.dm
index 471bd9939e..658d7e5874 100644
--- a/code/modules/mob/say_vr.dm
+++ b/code/modules/mob/say_vr.dm
@@ -86,15 +86,6 @@ proc/get_top_level_mob(var/mob/S)
else if(!params)
var/subtle_emote = stripped_multiline_input_or_reflect(user, "Choose an emote to display.", "Subtler" , null, MAX_MESSAGE_LEN)
if(subtle_emote && !check_invalid(user, subtle_emote))
- var/type = input("Is this a visible or hearable emote?") as null|anything in list("Visible", "Hearable")
- switch(type)
- if("Visible")
- emote_type = EMOTE_VISIBLE
- if("Hearable")
- emote_type = EMOTE_AUDIBLE
- else
- alert("Unable to use this emote, must be either hearable or visible.")
- return
message = subtle_emote
else
return FALSE
@@ -111,6 +102,80 @@ proc/get_top_level_mob(var/mob/S)
user.visible_message(message = message, self_message = message, vision_distance = 1, ignored_mobs = GLOB.dead_mob_list, omni = TRUE)
+///////////////// SUBTLE 3: DARE DICE
+
+/datum/emote/living/subtler_table
+ key = "subtler_table"
+ key_third_person = "subtler_table"
+ message = null
+ mob_type_blacklist_typecache = list(/mob/living/brain)
+
+/datum/emote/living/subtler_table/proc/check_invalid(mob/user, input)
+ if(stop_bad_mime.Find(input, 1, 1))
+ to_chat(user, "Invalid emote.")
+ return TRUE
+ return FALSE
+
+/datum/emote/living/subtler_table/run_emote(mob/user, params, type_override = null)
+ if(!locate(/obj/structure/table) in range(user, 1))
+ to_chat(user, "There are no tables around you.")
+ return FALSE
+ if(jobban_isbanned(user, "emote"))
+ to_chat(user, "You cannot send subtle emotes (banned).")
+ return FALSE
+ else if(user.client && user.client.prefs.muted & MUTE_IC)
+ to_chat(user, "You cannot send IC messages (muted).")
+ return FALSE
+ else if(!params)
+ var/subtle_emote = stripped_multiline_input_or_reflect(user, "Choose an emote to display.", "Subtler" , null, MAX_MESSAGE_LEN)
+ if(subtle_emote && !check_invalid(user, subtle_emote))
+ message = subtle_emote
+ else
+ return FALSE
+ else
+ message = params
+ if(type_override)
+ emote_type = type_override
+ . = TRUE
+ if(!can_run_emote(user))
+ return FALSE
+
+ user.log_message("[message] (TABLE-WRAPPING)", LOG_SUBTLER)
+ message = "[user] [user.say_emphasis(message)]"
+
+ var/list/show_to = list()
+ var/list/processing = list()
+ var/safety = 25
+ for(var/obj/structure/table/T in range(user, 1))
+ processing |= T
+ for(var/i in processing)
+ var/obj/structure/table/T = i
+ if(safety-- <= 0)
+ to_chat(user, "Table scan aborted early, some people might have not received the message (max 25)")
+ break
+ if(get_dist(T, user) > 7)
+ continue // nah
+ processing |= T
+ for(var/mob/living/M in range(T, 1)) // no ghosts/cameramobs
+ show_to |= M
+ var/obj/structure/table/other
+ other = locate() in get_step(T, NORTH)
+ if(other)
+ processing |= other
+ other = locate() in get_step(T, SOUTH)
+ if(other)
+ processing |= other
+ other = locate() in get_step(T, WEST)
+ if(other)
+ processing |= other
+ other = locate() in get_step(T, EAST)
+ if(other)
+ processing |= other
+
+ for(var/i in show_to)
+ var/mob/M = i
+ M.show_message(message)
+
///////////////// VERB CODE
/mob/living/verb/subtle()
set name = "Subtle"
@@ -128,3 +193,12 @@ proc/get_top_level_mob(var/mob/S)
to_chat(usr, "Speech is currently admin-disabled.")
return
usr.emote("subtler")
+
+///////////////// VERB CODE 3
+/mob/living/verb/subtler_table()
+ set name = "Subtler Around Table"
+ set category = "IC"
+ if(GLOB.say_disabled) //This is dumb but it's here because heehoo copypaste, who the FUCK uses this to identify lag?
+ to_chat(usr, "Speech is currently admin-disabled.")
+ return
+ usr.emote("subtler_table")
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index fd442bb7a6..fb9e6ff6c6 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -100,6 +100,10 @@
var/impact_light_intensity = 3
var/impact_light_range = 2
var/impact_light_color_override
+ // Normal lighting effects
+ var/fired_light_intensity = 1
+ var/fired_light_range = 0
+ var/fired_light_color = rgb(255, 255, 255)
//Homing
var/homing = FALSE
@@ -506,6 +510,7 @@
transform = M
trajectory_ignore_forcemove = TRUE
forceMove(starting)
+ set_light(fired_light_range, fired_light_intensity, fired_light_color)
trajectory_ignore_forcemove = FALSE
if(isnull(pixel_increment_amount))
pixel_increment_amount = SSprojectiles.global_pixel_increment_amount
diff --git a/code/modules/projectiles/projectile/bullets/ferromagnetic.dm b/code/modules/projectiles/projectile/bullets/ferromagnetic.dm
index 78deff601f..03482e2a9d 100644
--- a/code/modules/projectiles/projectile/bullets/ferromagnetic.dm
+++ b/code/modules/projectiles/projectile/bullets/ferromagnetic.dm
@@ -2,22 +2,22 @@
icon_state = "magjectile"
damage = 20
armour_penetration = 20
- light_range = 3
+ fired_light_range = 3
pixels_per_second = TILES_TO_PIXELS(16.667)
range = 35
- light_color = LIGHT_COLOR_RED
+ fired_light_color = LIGHT_COLOR_RED
/obj/item/projectile/bullet/magnetic/disabler
icon_state = "magjectile-nl" //nl stands for non-lethal
damage = 2
armour_penetration = 10
stamina = 20
- light_color = LIGHT_COLOR_BLUE
+ fired_light_color = LIGHT_COLOR_BLUE
/obj/item/projectile/bullet/magnetic/weak
damage = 15
armour_penetration = 10
- light_range = 2
+ fired_light_range = 2
range = 25
/obj/item/projectile/bullet/magnetic/weak/disabler
@@ -30,8 +30,8 @@
stamina = 10
movement_type = FLYING | UNSTOPPABLE
range = 6
- light_range = 1
- light_color = LIGHT_COLOR_RED
+ fired_light_range = 1
+ fired_light_color = LIGHT_COLOR_RED
/obj/item/projectile/bullet/incendiary/mag_inferno
icon_state = "magjectile-large"
@@ -40,8 +40,8 @@
movement_type = FLYING | UNSTOPPABLE
range = 20
pixels_per_second = TILES_TO_PIXELS(12.5)
- light_range = 4
- light_color = LIGHT_COLOR_RED
+ fired_light_range = 4
+ fired_light_color = LIGHT_COLOR_RED
/obj/item/projectile/bullet/incendiary/mag_inferno/on_hit(atom/target, blocked = FALSE)
..()
diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm
index 44b6e85f47..0b44c33926 100644
--- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm
@@ -171,11 +171,13 @@
/datum/reagent/drug/methamphetamine/on_mob_metabolize(mob/living/L)
..()
- L.ignore_slowdown(type)
+ ADD_TRAIT(L, TRAIT_IGNOREDAMAGESLOWDOWN, type)
+ L.update_movespeed()
ADD_TRAIT(L, TRAIT_TASED_RESISTANCE, type)
/datum/reagent/drug/methamphetamine/on_mob_end_metabolize(mob/living/L)
- L.unignore_slowdown(type)
+ REMOVE_TRAIT(L, TRAIT_IGNOREDAMAGESLOWDOWN, type)
+ L.update_movespeed()
REMOVE_TRAIT(L, TRAIT_TASED_RESISTANCE, type)
..()
diff --git a/html/changelogs/AutoChangeLog-pr-13838.yml b/html/changelogs/AutoChangeLog-pr-13838.yml
new file mode 100644
index 0000000000..deff5913b3
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13838.yml
@@ -0,0 +1,4 @@
+author: "silicons"
+delete-after: True
+changes:
+ - bugfix: "things in DEATHCOMA do not deathgasp on death"
diff --git a/html/changelogs/AutoChangeLog-pr-13846.yml b/html/changelogs/AutoChangeLog-pr-13846.yml
new file mode 100644
index 0000000000..68e013acf0
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13846.yml
@@ -0,0 +1,4 @@
+author: "DeltaFire15"
+delete-after: True
+changes:
+ - balance: "Fleshmend, Anatomic Panacea and bloodsucker healing now work for Synths / IPCs."
diff --git a/html/changelogs/AutoChangeLog-pr-13870.yml b/html/changelogs/AutoChangeLog-pr-13870.yml
new file mode 100644
index 0000000000..820c524224
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13870.yml
@@ -0,0 +1,4 @@
+author: "silicons"
+delete-after: True
+changes:
+ - bugfix: "Magrifle ammo no longer glows."
diff --git a/html/changelogs/AutoChangeLog-pr-13873.yml b/html/changelogs/AutoChangeLog-pr-13873.yml
new file mode 100644
index 0000000000..320a5b69a4
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13873.yml
@@ -0,0 +1,4 @@
+author: "BlueWildrose"
+delete-after: True
+changes:
+ - tweak: "Nyctophobia quirk now has some light lag compensation."
diff --git a/html/changelogs/AutoChangeLog-pr-13881.yml b/html/changelogs/AutoChangeLog-pr-13881.yml
new file mode 100644
index 0000000000..0ad2d3afc8
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13881.yml
@@ -0,0 +1,4 @@
+author: "BlueWildrose"
+delete-after: True
+changes:
+ - rscadd: "PubbyStation now has two Christmas Tree spawners."
diff --git a/html/changelogs/AutoChangeLog-pr-13882.yml b/html/changelogs/AutoChangeLog-pr-13882.yml
new file mode 100644
index 0000000000..fe545bdc23
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13882.yml
@@ -0,0 +1,4 @@
+author: "ERP mains"
+delete-after: True
+changes:
+ - rscadd: "Subtler Around Table is now a verb"
diff --git a/html/changelogs/AutoChangeLog-pr-13883.yml b/html/changelogs/AutoChangeLog-pr-13883.yml
new file mode 100644
index 0000000000..884adafffe
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13883.yml
@@ -0,0 +1,5 @@
+author: "silicons"
+delete-after: True
+changes:
+ - rscadd: "set-pose has been added"
+ - tweak: "temporary flavor text renamed to set pose, fully visible in examine"
diff --git a/html/changelogs/AutoChangeLog-pr-13887.yml b/html/changelogs/AutoChangeLog-pr-13887.yml
new file mode 100644
index 0000000000..83069a4e64
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13887.yml
@@ -0,0 +1,4 @@
+author: "HeroWithYay"
+delete-after: True
+changes:
+ - bugfix: "Changed description of Necrotizing Fasciitis symptom."
diff --git a/html/changelogs/AutoChangeLog-pr-13893.yml b/html/changelogs/AutoChangeLog-pr-13893.yml
new file mode 100644
index 0000000000..9eb7a3f79d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13893.yml
@@ -0,0 +1,4 @@
+author: "silicons"
+delete-after: True
+changes:
+ - tweak: "Meth and changeling adrenals no longer ignore all slowdowns, rather damage slowdowns."
diff --git a/html/changelogs/AutoChangeLog-pr-13894.yml b/html/changelogs/AutoChangeLog-pr-13894.yml
new file mode 100644
index 0000000000..31e1e66328
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13894.yml
@@ -0,0 +1,4 @@
+author: "silicons"
+delete-after: True
+changes:
+ - tweak: "temperature slowdown divisor nerfed to 35 from 20."
diff --git a/html/changelogs/AutoChangeLog-pr-13896.yml b/html/changelogs/AutoChangeLog-pr-13896.yml
new file mode 100644
index 0000000000..f733efa09d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13896.yml
@@ -0,0 +1,6 @@
+author: "Sonic121x"
+delete-after: True
+changes:
+ - rscadd: "alarm ert hardsuit sprite for naga and canine"
+ - tweak: "adjust the naga ert hardsuit to cover the hand"
+ - bugfix: "cydonia hardsuit helmet"
diff --git a/html/changelogs/AutoChangeLog-pr-13897.yml b/html/changelogs/AutoChangeLog-pr-13897.yml
new file mode 100644
index 0000000000..05637b0908
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13897.yml
@@ -0,0 +1,5 @@
+author: "keronshb"
+delete-after: True
+changes:
+ - bugfix: "Allows Energy Bola to be caught"
+ - balance: "This also allows them to be dropped/picked up."
diff --git a/html/changelogs/AutoChangeLog-pr-13898.yml b/html/changelogs/AutoChangeLog-pr-13898.yml
new file mode 100644
index 0000000000..cb4e0fd52d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13898.yml
@@ -0,0 +1,5 @@
+author: "Putnam3145"
+delete-after: True
+changes:
+ - balance: "Regen coma now puts into a coma even from crit or while unconscious."
+ - bugfix: "Regen coma now properly weakens while asleep."
diff --git a/icons/mob/clothing/head.dmi b/icons/mob/clothing/head.dmi
index 889888ef0a..62d6644311 100644
Binary files a/icons/mob/clothing/head.dmi and b/icons/mob/clothing/head.dmi differ
diff --git a/icons/mob/clothing/head_muzzled.dmi b/icons/mob/clothing/head_muzzled.dmi
index 62c1ebea0a..0c72221833 100644
Binary files a/icons/mob/clothing/head_muzzled.dmi and b/icons/mob/clothing/head_muzzled.dmi differ
diff --git a/icons/mob/clothing/taur_canine.dmi b/icons/mob/clothing/taur_canine.dmi
index 24cf51d2e5..6155a274f2 100644
Binary files a/icons/mob/clothing/taur_canine.dmi and b/icons/mob/clothing/taur_canine.dmi differ
diff --git a/icons/mob/clothing/taur_naga.dmi b/icons/mob/clothing/taur_naga.dmi
index d178ba4a1c..3525333fb3 100644
Binary files a/icons/mob/clothing/taur_naga.dmi and b/icons/mob/clothing/taur_naga.dmi differ