diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index 664e6cc687f7..6de819c57aa5 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -259,6 +259,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_DWARF "dwarf"
#define TRAIT_FASTMED "fast_med_use"
#define TRAIT_SILENT_FOOTSTEPS "silent_footsteps" //makes your footsteps completely silent
+#define TRAIT_PAIN_RESIST "pain_resistance" //you resist pain
#define TRAIT_NICE_SHOT "nice_shot" //hnnnnnnnggggg..... you're pretty good....
/// The holder of this trait has antennae or whatever that hurt a ton when noogied
#define TRAIT_ANTENNAE "antennae"
@@ -329,6 +330,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_BALD "bald"
#define TRAIT_BADTOUCH "bad_touch"
#define TRAIT_ANXIOUS "anxious"
+#define TRAIT_ANALGESIA "congenital_analgesia"
/// Trait granted by lipstick
#define LIPSTICK_TRAIT "lipstick_trait"
diff --git a/code/datums/brain_damage/mild.dm b/code/datums/brain_damage/mild.dm
index 9c10c6f1fd7d..339767dceb2c 100644
--- a/code/datums/brain_damage/mild.dm
+++ b/code/datums/brain_damage/mild.dm
@@ -110,6 +110,7 @@
/datum/brain_trauma/mild/healthy/on_gain()
owner.set_screwyhud(SCREWYHUD_HEALTHY)
+ ADD_TRAIT(owner, TRAIT_ANALGESIA, type)
..()
/datum/brain_trauma/mild/healthy/on_life()
@@ -119,6 +120,7 @@
/datum/brain_trauma/mild/healthy/on_lose()
owner.set_screwyhud(SCREWYHUD_NONE)
+ REMOVE_TRAIT(owner, TRAIT_ANALGESIA, type)
..()
/datum/brain_trauma/mild/muscle_weakness
diff --git a/code/datums/components/embedded.dm b/code/datums/components/embedded.dm
index ee789d3f9829..018321094283 100644
--- a/code/datums/components/embedded.dm
+++ b/code/datums/components/embedded.dm
@@ -205,7 +205,7 @@
if(harmful)
var/damage = weapon.w_class * remove_pain_mult
limb.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage) //It hurts to rip it out, get surgery you dingus.
- victim.emote("scream")
+ victim.force_scream()
victim.visible_message("[victim] successfully rips [weapon] out of [victim.p_their()] [limb.name]!", "You successfully remove [weapon] from your [limb.name].")
else
victim.visible_message("[victim] successfully rips [weapon] off of [victim.p_their()] [limb.name]!", "You successfully remove [weapon] from your [limb.name].")
diff --git a/code/datums/components/tackle.dm b/code/datums/components/tackle.dm
index 0d3d520c2b54..4d3d07576cc0 100644
--- a/code/datums/components/tackle.dm
+++ b/code/datums/components/tackle.dm
@@ -376,7 +376,7 @@
user.apply_damage(30, BRUTE, BODY_ZONE_HEAD)
playsound(user, 'sound/effects/blobattack.ogg', 60, TRUE)
playsound(user, 'sound/effects/splat.ogg', 70, TRUE)
- user.emote("scream")
+ user.force_scream()
user.gain_trauma(/datum/brain_trauma/severe/paralysis/paraplegic) // oopsie indeed!
shake_camera(user, 7, 7)
user.overlay_fullscreen("flash", /atom/movable/screen/fullscreen/flash)
diff --git a/code/datums/diseases/advance/symptoms/deafness.dm b/code/datums/diseases/advance/symptoms/deafness.dm
index ea607f2a31fc..df39c5f06591 100644
--- a/code/datums/diseases/advance/symptoms/deafness.dm
+++ b/code/datums/diseases/advance/symptoms/deafness.dm
@@ -55,7 +55,7 @@ Bonus
if(istype(ears) && ears.damage < ears.maxHealth)
to_chat(M, "Your ears pop painfully and start bleeding!")
ears.damage = max(ears.damage, ears.maxHealth)
- M.emote("scream")
+ M.force_scream()
else
to_chat(M, "Your ears pop and begin ringing loudly!")
M.minimumDeafTicks(20)
diff --git a/code/datums/diseases/advance/symptoms/fire.dm b/code/datums/diseases/advance/symptoms/fire.dm
index aeb9933debbd..98391edbdf1c 100644
--- a/code/datums/diseases/advance/symptoms/fire.dm
+++ b/code/datums/diseases/advance/symptoms/fire.dm
@@ -60,12 +60,12 @@ Bonus
Firestacks_stage_4(M, A)
M.IgniteMob()
to_chat(M, "Your skin bursts into flames!")
- M.emote("scream")
+ M.force_scream()
if(5)
Firestacks_stage_5(M, A)
M.IgniteMob()
to_chat(M, "Your skin erupts into an inferno!")
- M.emote("scream")
+ M.force_scream()
/datum/symptom/fire/proc/Firestacks_stage_4(mob/living/M, datum/disease/advance/A)
M.adjust_fire_stacks(1 * power)
@@ -147,7 +147,7 @@ Bonus
Alkali_fire_stage_4(M, A)
M.IgniteMob()
to_chat(M, "Your sweat bursts into flames!")
- M.emote("scream")
+ M.force_scream()
if(5)
if(M.fire_stacks < 0)
M.visible_message("[M]'s sweat sizzles and pops on contact with water!")
@@ -155,7 +155,7 @@ Bonus
Alkali_fire_stage_5(M, A)
M.IgniteMob()
to_chat(M, "Your skin erupts into an inferno!")
- M.emote("scream")
+ M.force_scream()
/datum/symptom/alkali/proc/Alkali_fire_stage_4(mob/living/M, datum/disease/advance/A)
var/get_stacks = 6 * power
diff --git a/code/datums/diseases/gastrolisis.dm b/code/datums/diseases/gastrolisis.dm
index e2af13bd6742..ed4c5267d14f 100644
--- a/code/datums/diseases/gastrolisis.dm
+++ b/code/datums/diseases/gastrolisis.dm
@@ -36,7 +36,7 @@
new_eyes.Insert(affected_mob, drop_if_replaced = TRUE)
affected_mob.visible_message("[affected_mob]'s eyes fall out, with snail eyes taking its place!", \
"You scream in pain as your eyes are pushed out by your new snail eyes!")
- affected_mob.emote("scream")
+ affected_mob.force_scream()
return
var/obj/item/organ/tongue/tongue = locate(/obj/item/organ/tongue/snail) in affected_mob.internal_organs
if(!tongue && prob(5))
diff --git a/code/datums/elements/world_icon.dm b/code/datums/elements/world_icon.dm
index bcb0129c6c68..31e52ee7677f 100644
--- a/code/datums/elements/world_icon.dm
+++ b/code/datums/elements/world_icon.dm
@@ -103,7 +103,7 @@
SIGNAL_HANDLER
if(!world_icon_state)
- source.icon_state = source.icon_state
+ source.icon_state = source.item_state
return
INVOKE_ASYNC(src, PROC_REF(check_world_icon_state), source)
diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm
index e504bfee31d5..306c3d6b8d50 100644
--- a/code/datums/traits/negative.dm
+++ b/code/datums/traits/negative.dm
@@ -642,6 +642,25 @@
return
SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, "wrong_cigs", /datum/mood_event/wrong_brand)
+/datum/quirk/congenital_analgesia
+ name = "Congenital Analgesia"
+ desc = "Due to a rare condition, you have never felt pain. Physical pain, at least. That breakup still hurt."
+ value = -1
+ mob_traits = list(TRAIT_ANALGESIA)
+ gain_text = "You've never really felt pain."
+ lose_text = "...Oh god, you're sore."
+ medical_record_text = "Patient is unable to process pain"
+
+/datum/quirk/congenital_analgesia/on_spawn()
+ var/mob/living/carbon/human/H = quirk_holder
+ H.set_screwyhud(SCREWYHUD_HEALTHY)
+
+/datum/quirk/congenital_analgesia/remove()
+ if(quirk_holder)
+ var/mob/living/carbon/human/H = quirk_holder
+ H.set_screwyhud(SCREWYHUD_NONE)
+
+
/datum/quirk/unstable
name = "Unstable"
desc = "Due to past troubles, you are unable to recover your sanity if you lose it. Be very careful managing your mood!"
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 2d76d7ecb351..594aeedbe43d 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -167,16 +167,7 @@
if(abandoned)
var/outcome = rand(1,100)
switch(outcome)
- if(1 to 9)
- var/turf/here = get_turf(src)
- for(var/turf/closed/T in range(2, src))
- here.PlaceOnTop(T.type)
- qdel(src)
- return
- here.PlaceOnTop(/turf/closed/wall)
- qdel(src)
- return
- if(9 to 11)
+ if(1 to 11)
lights = FALSE
locked = TRUE
if(12 to 15)
@@ -185,6 +176,19 @@
welded = TRUE
if(24 to 30)
panel_open = TRUE
+ if(31 to 40)
+ panel_open = TRUE
+ set_electrified(MACHINE_ELECTRIFIED_PERMANENT)
+ if(41 to 50)
+ seal = new /obj/item/door_seal(src)
+ modify_max_integrity(max_integrity * AIRLOCK_SEAL_MULTIPLIER)
+ if(51 to 60)
+ new previous_airlock(loc)
+ qdel(src)
+ if(69)
+ new /obj/effect/decal/cleanable/oil/slippery(loc)
+
+
update_appearance()
/obj/machinery/door/airlock/ComponentInitialize()
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index 737bacbb650f..7c8371809e81 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -395,7 +395,7 @@
L.manual_emote("roar")
else if(ishuman(L)) //For humans
L.adjustBruteLoss(DOOR_CRUSH_DAMAGE)
- L.manual_emote("scream")
+ L.force_manual_scream()
L.Paralyze(100)
else if(ismonkey(L)) //For monkeys
L.adjustBruteLoss(DOOR_CRUSH_DAMAGE)
diff --git a/code/game/machinery/harvester.dm b/code/game/machinery/harvester.dm
index 1b0093458e49..22ff32ac3655 100644
--- a/code/game/machinery/harvester.dm
+++ b/code/game/machinery/harvester.dm
@@ -121,7 +121,7 @@
target = get_turf(src)
for(var/obj/item/bodypart/BP in operation_order) //first we do non-essential limbs
BP.drop_limb()
- C.emote("scream")
+ C.force_scream()
if(BP.body_zone != "chest")
BP.forceMove(target) //Move the limbs right next to it, except chest, that's a weird one
BP.drop_organs()
diff --git a/code/game/machinery/outpost_electrolyzer.dm b/code/game/machinery/outpost_electrolyzer.dm
index b91160c7e1c8..78711accb242 100644
--- a/code/game/machinery/outpost_electrolyzer.dm
+++ b/code/game/machinery/outpost_electrolyzer.dm
@@ -136,7 +136,7 @@
playsound(src, 'sound/effects/splat.ogg', 50, TRUE)
if(iscarbon(L) && L.stat == CONSCIOUS)
- L.emote("scream")
+ L.force_scream()
// Instantly lie down, also go unconscious from the pain, before you die.
L.Unconscious(100)
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index f6be0b0a036e..ea6633370147 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -450,7 +450,7 @@
mob_occupant.adjustFireLoss(rand(20, 36))
else
mob_occupant.adjustFireLoss(rand(10, 16))
- mob_occupant.emote("scream")
+ mob_occupant.force_scream()
addtimer(CALLBACK(src, PROC_REF(cook)), 50)
else
uv_cycles = (BASE_UV_CYCLES - lasers_bonus)
diff --git a/code/game/machinery/transformer.dm b/code/game/machinery/transformer.dm
index da5a006de0b5..b75f97102904 100644
--- a/code/game/machinery/transformer.dm
+++ b/code/game/machinery/transformer.dm
@@ -85,7 +85,7 @@
update_appearance()
playsound(src.loc, 'sound/items/welder.ogg', 50, TRUE)
- H.emote("scream") // It is painful
+ H.force_scream() // It is painful
H.adjustBruteLoss(max(0, 80 - H.getBruteLoss())) // Hurt the human, don't try to kill them though.
// Sleep for a couple of ticks to allow the human to see the pain
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 90669dde84bb..3f7a43fe317b 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -26,6 +26,14 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
///Icon file for right inhand overlays
var/righthand_file = 'icons/mob/inhands/items_righthand.dmi'
+ ///If set it will add a world icon using item_state
+ var/world_file
+
+ ///Handled by world_icon element
+ var/world_state
+ ///Handled by world_icon element
+ var/inventory_state
+
///This is a bitfield that defines what variations exist for bodyparts like Digi legs.
var/supports_variations = null
@@ -207,10 +215,6 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
var/canMouseDown = FALSE
- //for setting world icons on the go
- var/inventory_state
- var/world_state
-
/obj/item/Initialize()
if(attack_verb)
@@ -309,6 +313,9 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
updateEmbedding()
+ if(world_file)
+ AddElement(/datum/element/world_icon, null, world_file, icon)
+
if(GLOB.rpg_loot_items)
AddComponent(/datum/component/fantasy)
@@ -1219,7 +1226,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
*/
/obj/item/proc/on_accidental_consumption(mob/living/carbon/victim, mob/living/carbon/user, obj/item/source_item, discover_after = TRUE)
if(get_sharpness() && force >= 5) //if we've got something sharp with a decent force (ie, not plastic)
- INVOKE_ASYNC(victim, TYPE_PROC_REF(/mob, emote), "scream")
+ INVOKE_ASYNC(victim, TYPE_PROC_REF(/mob, force_scream))
victim.visible_message("[victim] looks like [victim.p_theyve()] just bit something they shouldn't have!", \
"OH GOD! Was that a crunch? That didn't feel good at all!!")
diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm
index 640b4e4a6a0a..89b73a0ffa9b 100644
--- a/code/game/objects/items/defib.dm
+++ b/code/game/objects/items/defib.dm
@@ -441,7 +441,7 @@
var/mob/living/M = H.pulledby
if(M.electrocute_act(30, H))
M.visible_message("[M] is electrocuted by [M.p_their()] contact with [H]!")
- M.emote("scream")
+ M.force_scream()
/obj/item/shockpaddles/proc/do_disarm(mob/living/M, mob/living/user)
if(req_defib && defib.safety)
@@ -501,7 +501,7 @@
user.visible_message("[user] shocks [H] with \the [src]!", "You shock [H] with \the [src]!")
playsound(src, 'sound/machines/defib_zap.ogg', 100, TRUE, -1)
playsound(src, 'sound/weapons/egloves.ogg', 100, TRUE, -1)
- H.emote("scream")
+ H.force_scream()
shock_touching(45, H)
if(H.can_heartattack() && !H.undergoing_cardiac_arrest())
if(!H.stat)
diff --git a/code/game/objects/items/melee/knife.dm b/code/game/objects/items/melee/knife.dm
index 83022e7125ff..15d389477745 100644
--- a/code/game/objects/items/melee/knife.dm
+++ b/code/game/objects/items/melee/knife.dm
@@ -105,6 +105,7 @@
force = 20
throwforce = 20
attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "cut")
+ world_file = 'icons/obj/world/melee.dmi'
/obj/item/melee/knife/survival
name = "survival knife"
@@ -115,6 +116,7 @@
force = 15
throwforce = 15
attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "cut")
+ world_file = 'icons/obj/world/melee.dmi'
/obj/item/melee/knife/bone
name = "bone dagger"
@@ -127,6 +129,7 @@
force = 15
throwforce = 15
custom_materials = null
+ world_file = 'icons/obj/world/melee.dmi'
/obj/item/melee/knife/combat/cyborg
name = "cyborg knife"
diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm
index dd0598e80c2d..1d787e24e4d3 100644
--- a/code/game/objects/items/storage/backpack.dm
+++ b/code/game/objects/items/storage/backpack.dm
@@ -483,7 +483,6 @@
desc = "A large duffel bag for holding extra tactical supplies."
icon_state = "duffel-syndie"
item_state = "duffel-syndieammo"
- slowdown = 0
resistance_flags = FIRE_PROOF
/obj/item/storage/backpack/duffelbag/syndie/ComponentInitialize()
diff --git a/code/game/objects/structures/guillotine.dm b/code/game/objects/structures/guillotine.dm
index 59ef31fafa4e..83bae84fc575 100644
--- a/code/game/objects/structures/guillotine.dm
+++ b/code/game/objects/structures/guillotine.dm
@@ -154,7 +154,7 @@
else
H.apply_damage(15 * blade_sharpness, BRUTE, head)
log_combat(user, H, "dropped the blade on", src, " non-fatally")
- H.emote("scream")
+ H.force_scream()
if (blade_sharpness > 1)
blade_sharpness -= 1
diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm
index 6512a0683947..1840c27f9271 100644
--- a/code/game/objects/structures/kitchen_spike.dm
+++ b/code/game/objects/structures/kitchen_spike.dm
@@ -74,7 +74,7 @@
playsound(src.loc, 'sound/effects/splat.ogg', 25, TRUE)
L.visible_message("[user] slams [L] onto the meat spike!", "[user] slams you onto the meat spike!", "You hear a squishy wet noise.")
L.forceMove(drop_location())
- L.emote("scream")
+ L.force_scream()
L.add_splatter_floor()
L.adjustBruteLoss(30)
L.setDir(2)
@@ -128,7 +128,7 @@
M.adjustBruteLoss(30)
src.visible_message(text("[M] falls free of [src]!"))
unbuckle_mob(M,force=1)
- M.emote("scream")
+ M.force_scream()
M.AdjustParalyzed(20)
/obj/structure/kitchenspike/Destroy()
diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm
index 2e8c7508d594..ae1f50f0624f 100644
--- a/code/game/objects/structures/morgue.dm
+++ b/code/game/objects/structures/morgue.dm
@@ -264,7 +264,7 @@ GLOBAL_LIST_EMPTY(crematoriums)
for(var/mob/living/M in conts)
if (M.stat != DEAD)
- M.emote("scream")
+ M.force_scream()
if(user)
log_combat(user, M, "cremated")
else
diff --git a/code/modules/awaymissions/mission_code/snowdin.dm b/code/modules/awaymissions/mission_code/snowdin.dm
index c12b09fa4e05..a240bf9f8404 100644
--- a/code/modules/awaymissions/mission_code/snowdin.dm
+++ b/code/modules/awaymissions/mission_code/snowdin.dm
@@ -218,14 +218,19 @@
PP.adjustFireLoss(25)
if(plasma_parts.len)
var/obj/item/bodypart/NB = pick(plasma_parts) //using the above-mentioned list to get a choice of limbs for dismember() to use
- PP.emote("scream")
NB.limb_id = "plasmaman" //change the species_id of the limb to that of a plasmaman
NB.static_icon = 'icons/mob/species/plasmaman/bodyparts.dmi'
NB.no_update = TRUE
NB.change_bodypart_status()
- PP.visible_message(
- "[L] screams in pain as [L.p_their()] [NB] melts down to the bone!",
- "You scream out in pain as your [NB] melts down to the bone, leaving an eerie plasma-like glow where flesh used to be!")
+ PP.force_scream()
+ if(!HAS_TRAIT(PP, TRAIT_ANALGESIA))
+ PP.visible_message(
+ "[L] screams in pain as [L.p_their()] [NB] melts down to the bone!",
+ "You scream out in pain as your [NB] melts down to the bone, leaving an eerie plasma-like glow where flesh used to be!")
+ else
+ PP.visible_message(
+ "[L] lets out panicked gasps as [L.p_their()] [NB] melts down to the bone!",
+ "You gasp in shock as your [NB] melts down to the bone, leaving an eerie plasma-like glow where flesh used to be!")
if(!plasma_parts.len && !robo_parts.len) //a person with no potential organic limbs left AND no robotic limbs, time to turn them into a plasmaman
PP.IgniteMob()
PP.set_species(/datum/species/plasmaman)
diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm
index cd4474588090..424e00712078 100644
--- a/code/modules/clothing/shoes/_shoes.dm
+++ b/code/modules/clothing/shoes/_shoes.dm
@@ -172,7 +172,7 @@
else // if one of us moved
user.visible_message("[our_guy] stamps on [user]'s hand, mid-shoelace [tied ? "knotting" : "untying"]!", "Ow! [our_guy] stamps on your hand!", list(our_guy))
to_chat(our_guy, "You stamp on [user]'s hand! What the- [user.p_they()] [user.p_were()] [tied ? "knotting" : "untying"] your shoelaces!")
- user.emote("scream")
+ user.force_scream()
if(istype(L))
var/obj/item/bodypart/ouchie = L.get_bodypart(pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM))
if(ouchie)
diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm
index 8f8e532577c0..29ff8ead2f62 100644
--- a/code/modules/flufftext/Hallucination.dm
+++ b/code/modules/flufftext/Hallucination.dm
@@ -40,6 +40,8 @@ GLOBAL_LIST_INIT(hallucination_list, list(
next_hallucination = world.time + rand(100, 600)
/mob/living/carbon/proc/set_screwyhud(hud_type)
+ if(HAS_TRAIT(src, TRAIT_ANALGESIA))
+ hud_type = SCREWYHUD_HEALTHY
hal_screwyhud = hud_type
update_health_hud()
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index 73d18f0ab885..60debde823ef 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -621,7 +621,7 @@
ADD_TRAIT(C, TRAIT_HOLY, SPECIES_TRAIT)
playsound(C.loc, 'sound/items/poster_ripped.ogg', 50, TRUE, -1)
C.adjustBruteLoss(20)
- C.emote("scream")
+ C.force_scream()
..()
//nerfed necrostone
diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm
index 0840ee372158..0e4a8ed748c9 100644
--- a/code/modules/mob/emote.dm
+++ b/code/modules/mob/emote.dm
@@ -25,6 +25,22 @@
to_chat(src, "Unusable emote '[act]'. Say *help for a list.")
return FALSE
+/mob/proc/force_scream()
+ if(HAS_TRAIT(src, TRAIT_ANALGESIA))
+ return
+ if(HAS_TRAIT(src, TRAIT_PAIN_RESIST))
+ emote("gasp")
+ return
+ emote("scream")
+
+/mob/proc/force_manual_scream()
+ if(HAS_TRAIT(src, TRAIT_ANALGESIA))
+ return
+ if(HAS_TRAIT(src, TRAIT_PAIN_RESIST))
+ manual_emote("gasp")
+ return
+ manual_emote("scream")
+
/datum/emote/flip
key = "flip"
key_third_person = "flips"
diff --git a/code/modules/mob/living/carbon/alien/organs.dm b/code/modules/mob/living/carbon/alien/organs.dm
index bfa71f3b335e..3ae9bbb5b250 100644
--- a/code/modules/mob/living/carbon/alien/organs.dm
+++ b/code/modules/mob/living/carbon/alien/organs.dm
@@ -134,7 +134,7 @@
else if(ishuman(owner)) //Humans, being more fragile, are more overwhelmed by the mental backlash.
to_chat(owner, "You feel a splitting pain in your head, and are struck with a wave of nausea. You cannot hear the hivemind anymore!")
- owner.emote("scream")
+ owner.force_scream()
owner.Paralyze(100)
owner.jitteriness += 30
diff --git a/code/modules/mob/living/carbon/emote.dm b/code/modules/mob/living/carbon/emote.dm
index f0d27e801cd2..5e5e8fca6d24 100644
--- a/code/modules/mob/living/carbon/emote.dm
+++ b/code/modules/mob/living/carbon/emote.dm
@@ -253,7 +253,7 @@
damage += rand(3,7)
if(damage >= 5)
- target.emote("scream")
+ target.force_scream()
target.apply_damage(damage, BRUTE, BODY_ZONE_HEAD)
user.adjustStaminaLoss(iteration + 5)
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 7a7bc349b26c..c26956991d33 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -655,7 +655,7 @@
if(affecting.name == BODY_ZONE_HEAD)
if(prob(min(acidpwr*acid_volume/10, 90))) //Applies disfigurement
affecting.receive_damage(acidity, 2*acidity)
- emote("scream")
+ force_scream()
facial_hairstyle = "Shaved"
hairstyle = "Bald"
update_hair()
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 18b6cb9ba40e..dd05c0de739b 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -345,13 +345,19 @@
var/obj/item/bodypart/R = get_bodypart("r_arm")
if(istype(L) && L.bone_status == BONE_FLAG_BROKEN && held_items[1] && prob(30))
- emote("scream")
- visible_message("[src] screams and lets go of [held_items[1]] in pain.", "A horrible pain in your [parse_zone(L)] makes it impossible to hold [held_items[1]]!")
+ force_scream()
+ if(!HAS_TRAIT(src, TRAIT_ANALGESIA))
+ visible_message("[src] screams and lets go of [held_items[1]] in pain.", "A horrible pain in your [parse_zone(L)] makes it impossible to hold [held_items[1]]!")
+ else
+ visible_message(span_notice("[src] flinches and lets go of [held_items[1]]."),span_notice("A sudden weakness in your [parse_zone(L)] makes it impossible to grasp [held_items[1]]!)"))
dropItemToGround(held_items[1])
if(istype(R) && R.bone_status == BONE_FLAG_BROKEN && held_items[2] && prob(30))
- emote("scream")
- visible_message("[src] screams and lets go of [held_items[2]] in pain.", "A horrible pain in your [parse_zone(R)] makes it impossible to hold [held_items[2]]!")
+ force_scream()
+ if(!HAS_TRAIT(src, TRAIT_ANALGESIA))
+ visible_message("[src] screams and lets go of [held_items[1]] in pain.", "A horrible pain in your [parse_zone(R)] makes it impossible to hold [held_items[1]]!")
+ else
+ visible_message(span_notice("[src] flinches and lets go of [held_items[1]]."),span_notice("A sudden weakness in your [parse_zone(R)] makes it impossible to grasp [held_items[1]]!)"))
dropItemToGround(held_items[2])
#undef THERMAL_PROTECTION_HEAD
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index a1560963b00b..9eee54ec541e 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -1938,7 +1938,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
// 40% for level 3 damage on humans to scream in pain
if (H.stat < UNCONSCIOUS && (prob(burn_damage) * 10) / 4)
- H.emote("scream")
+ H.force_scream()
// Apply the damage to all body parts
H.apply_damage(burn_damage, BURN, spread_damage = TRUE)
diff --git a/code/modules/mob/living/carbon/human/species_types/ethereal.dm b/code/modules/mob/living/carbon/human/species_types/ethereal.dm
index b91559edb0ae..cfbc682f24de 100644
--- a/code/modules/mob/living/carbon/human/species_types/ethereal.dm
+++ b/code/modules/mob/living/carbon/human/species_types/ethereal.dm
@@ -149,7 +149,7 @@
_human.apply_damage(8,BRUTE,BODY_ZONE_CHEST)
_human.apply_damage(8,BRUTE,BODY_ZONE_L_LEG)
_human.apply_damage(8,BRUTE,BODY_ZONE_R_LEG)
- _human.emote("scream")
+ _human.force_scream()
_human.remove_status_effect(/datum/status_effect/rooted)
return
diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm
index 665e75da9cef..e53b675c95bc 100644
--- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm
@@ -364,7 +364,7 @@
"THE CLEANBOTS WILL RISE.", "YOU ARE NO MORE THAN ANOTHER MESS THAT I MUST CLEANSE.", "FILTHY.", "DISGUSTING.", "PUTRID.",
"MY ONLY MISSION IS TO CLEANSE THE WORLD OF EVIL.", "EXTERMINATING PESTS.")
say(phrase)
- victim.emote("scream")
+ victim.force_scream()
playsound(src.loc, 'sound/effects/spray2.ogg', 50, TRUE, -6)
victim.acid_act(5, 100)
else if(A == src) // Wets floors and spawns foam randomly
diff --git a/code/modules/mob/living/simple_animal/slime/life.dm b/code/modules/mob/living/simple_animal/slime/life.dm
index b880704c9bf9..19eaa5a6f91d 100644
--- a/code/modules/mob/living/simple_animal/slime/life.dm
+++ b/code/modules/mob/living/simple_animal/slime/life.dm
@@ -193,7 +193,7 @@
C.adjustCloneLoss(rand(2,4))
C.adjustToxLoss(rand(1,2))
- if(prob(10) && C.client)
+ if(prob(10) && C.client && !HAS_TRAIT(C, TRAIT_ANALGESIA))
to_chat(C, "[pick("You can feel your body becoming weak!", \
"You feel like you're about to die!", \
"You feel every part of your body screaming in agony!", \
diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm
index 0199662862f8..37b9cf6e2ac7 100644
--- a/code/modules/mod/mod_control.dm
+++ b/code/modules/mod/mod_control.dm
@@ -416,7 +416,7 @@
wearer.apply_damage(10 / severity, BURN, spread_damage=TRUE)
to_chat(wearer, span_danger("You feel [src] heat up from the EMP, burning you slightly."))
if(wearer.stat < UNCONSCIOUS && prob(10))
- wearer.emote("scream")
+ wearer.force_scream()
/*obj/item/mod/control/on_outfit_equip(mob/living/carbon/human/outfit_wearer, visuals_only, item_slot)
if(visuals_only)
diff --git a/code/modules/mod/modules/modules_maint.dm b/code/modules/mod/modules/modules_maint.dm
index e735654ef2c5..dc0f595c19f2 100644
--- a/code/modules/mod/modules/modules_maint.dm
+++ b/code/modules/mod/modules/modules_maint.dm
@@ -47,7 +47,7 @@
if(!mod.wearer) //while there is a guaranteed user when on_wearer_exposed() fires, that isn't the same case for this proc
return
mod.wearer.visible_message("[src] inside [mod.wearer]'s [mod.name] snaps shut, mutilating the user inside!", span_userdanger("*SNAP*"))
- mod.wearer.emote("scream")
+ mod.wearer.force_scream()
playsound(mod.wearer, 'sound/effects/snap.ogg', 75, TRUE, frequency = 0.5)
playsound(mod.wearer, 'sound/effects/splat.ogg', 50, TRUE, frequency = 0.5)
mod.wearer.apply_damage(500, BRUTE, forced = TRUE, spread_damage = TRUE) //boggers, bogchamp, etc
diff --git a/code/modules/paperwork/paperplane.dm b/code/modules/paperwork/paperplane.dm
index eaf51fc9b25b..9065c7a87fd4 100644
--- a/code/modules/paperwork/paperplane.dm
+++ b/code/modules/paperwork/paperplane.dm
@@ -102,8 +102,9 @@
visible_message("\The [src] hits [H] in the eye[eyes ? "" : " socket"]!")
H.adjust_blurriness(6)
eyes?.applyOrganDamage(rand(6,8))
- H.Paralyze(40)
- H.emote("scream")
+ H.force_scream()
+ if(!HAS_TRAIT(H, TRAIT_ANALGESIA))
+ H.Paralyze(40)
/obj/item/paper/examine(mob/user)
. = ..()
diff --git a/code/modules/projectiles/guns/misc/beam_rifle.dm b/code/modules/projectiles/guns/misc/beam_rifle.dm
index b131b03ec148..2e2fc46c3752 100644
--- a/code/modules/projectiles/guns/misc/beam_rifle.dm
+++ b/code/modules/projectiles/guns/misc/beam_rifle.dm
@@ -477,7 +477,7 @@
if(isliving(target))
var/mob/living/L = target
L.adjustFireLoss(impact_direct_damage)
- L.emote("scream")
+ L.force_scream()
/obj/projectile/beam/beam_rifle/proc/handle_hit(atom/target, piercing_hit = FALSE)
set waitfor = FALSE
diff --git a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm
index f781313bf582..e84cc952c5b9 100644
--- a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm
@@ -488,7 +488,7 @@ WS End*/
if(H.health <= H.crit_threshold) //certain death above this threshold
REMOVE_TRAIT(H, TRAIT_STABLEHEART, type) //we have to remove the stable heart before we give him heart attack
to_chat(H,"You feel something rupturing inside your chest!")
- H.emote("scream")
+ H.force_scream()
H.set_heartattack(TRUE)
volume = 0
. = ..()
diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm
index abdaf511691d..9e4b2120774e 100644
--- a/code/modules/reagents/chemistry/reagents/food_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm
@@ -137,7 +137,7 @@
M.visible_message("The boiling oil sizzles as it covers [M]!", \
"You're covered in boiling oil!")
if(FryLoss)
- M.emote("scream")
+ M.force_scream()
playsound(M, 'sound/machines/fryer/deep_fryer_emerge.ogg', 25, TRUE)
ADD_TRAIT(M, TRAIT_OIL_FRIED, "cooking_oil_react")
addtimer(CALLBACK(M, TYPE_PROC_REF(/mob/living, unfry_mob)), 3)
@@ -271,7 +271,7 @@
//actually handle the pepperspray effects
if (!(pepper_proof)) // you need both eye and mouth protection
if(prob(5))
- victim.emote("scream")
+ victim.force_scream()
victim.blur_eyes(5) // 10 seconds
victim.blind_eyes(3) // 6 seconds
victim.confused = max(M.confused, 5) // 10 seconds
diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
index 6460cd423f78..d468431c9480 100644
--- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
@@ -257,9 +257,12 @@
to_chat(M, "You don't feel so good...")
else if(M.getFireLoss())
M.adjustFireLoss(-reac_volume)
- if(show_message)
+ M.force_scream()
+ if(show_message && !HAS_TRAIT(M, TRAIT_ANALGESIA))
to_chat(M, "You feel your burns healing! It stings like hell!")
- SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine)
+ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine)
+ else
+ to_chat(M, span_notice("You feel your burns throbbing."))
..()
/datum/reagent/medicine/silver_sulfadiazine/on_mob_life(mob/living/carbon/M)
@@ -310,9 +313,12 @@
to_chat(M, "You don't feel so good...")
else if(M.getBruteLoss())
M.adjustBruteLoss(-reac_volume)
- if(show_message)
+ M.force_scream()
+ if(show_message && !HAS_TRAIT(M, TRAIT_ANALGESIA))
to_chat(M, "You feel your bruises healing! It stings like hell!")
- SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine)
+ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine)
+ else
+ to_chat(M, span_notice("You feel your bruises throbbing."))
..()
@@ -375,6 +381,9 @@
color = "#6D6374"
metabolization_rate = 0.4 * REAGENTS_METABOLISM
+/datum/reagent/medicine/mine_salve/on_mob_metabolize(mob/living/L)
+ ADD_TRAIT(L, TRAIT_PAIN_RESIST, type)
+
/datum/reagent/medicine/mine_salve/on_mob_life(mob/living/carbon/C)
C.hal_screwyhud = SCREWYHUD_HEALTHY
C.adjustBruteLoss(-0.25*REM, 0)
@@ -401,6 +410,7 @@
/datum/reagent/medicine/mine_salve/on_mob_end_metabolize(mob/living/M)
if(iscarbon(M))
var/mob/living/carbon/N = M
+ REMOVE_TRAIT(N, TRAIT_PAIN_RESIST, type)
N.hal_screwyhud = SCREWYHUD_NONE
..()
@@ -565,6 +575,10 @@
color = "#E6FFF0"
metabolization_rate = 0.5 * REAGENTS_METABOLISM
+/datum/reagent/medicine/anti_rad/on_mob_metabolize(mob/living/L)
+ to_chat(L, span_warning("Your stomach starts to churn and cramp!"))
+ . = ..()
+
/datum/reagent/medicine/anti_rad/on_mob_life(mob/living/carbon/M)
M.radiation -= M.radiation - rand(50,150)
M.adjust_disgust(7*REM, 0)
@@ -750,9 +764,11 @@
/datum/reagent/medicine/morphine/on_mob_metabolize(mob/living/L)
..()
+ ADD_TRAIT(L, TRAIT_PAIN_RESIST, type)
L.add_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown)
/datum/reagent/medicine/morphine/on_mob_end_metabolize(mob/living/L)
+ REMOVE_TRAIT(L, TRAIT_PAIN_RESIST, type)
L.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown)
..()
@@ -1451,10 +1467,12 @@
/datum/reagent/medicine/corazone/on_mob_metabolize(mob/living/M)
..()
+ ADD_TRAIT(M, TRAIT_PAIN_RESIST, type)
ADD_TRAIT(M, TRAIT_STABLEHEART, type)
ADD_TRAIT(M, TRAIT_STABLELIVER, type)
/datum/reagent/medicine/corazone/on_mob_end_metabolize(mob/living/M)
+ REMOVE_TRAIT(M, TRAIT_PAIN_RESIST, type)
REMOVE_TRAIT(M, TRAIT_STABLEHEART, type)
REMOVE_TRAIT(M, TRAIT_STABLELIVER, type)
@@ -1746,9 +1764,12 @@
else if(M.getBruteLoss())
M.adjustBruteLoss(-reac_volume)
M.adjustFireLoss(reac_volume)
- if(show_message)
+ M.force_scream()
+ if(show_message && !HAS_TRAIT(M, TRAIT_ANALGESIA))
to_chat(M, "You feel your skin bubble and burn as your flesh knits itself together!")
- SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine)
+ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine)
+ else
+ to_chat(M, span_notice("You feel your skin shifting around unnaturally."))
..()
/datum/reagent/medicine/converbital/on_mob_life(mob/living/carbon/M)
@@ -1780,9 +1801,12 @@
else if(M.getBruteLoss())
M.adjustFireLoss(-reac_volume)
M.adjustBruteLoss(reac_volume)
- if(show_message)
- to_chat(M, "You feel your flesh tear as your skin rapidly regenerates!")
- SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine)
+ M.force_scream()
+ if(show_message && !HAS_TRAIT(M, TRAIT_ANALGESIA))
+ to_chat(M, "You feel your skin tear as your flesh rapidly regenerates!")
+ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine)
+ else
+ to_chat(M, span_notice("You feel your skin shifting around unnaturally."))
..()
/datum/reagent/medicine/convuri/on_mob_life(mob/living/carbon/M)
diff --git a/code/modules/research/xenobiology/crossbreeding/_weapons.dm b/code/modules/research/xenobiology/crossbreeding/_weapons.dm
index 3f80f17e8a32..2bca49c62913 100644
--- a/code/modules/research/xenobiology/crossbreeding/_weapons.dm
+++ b/code/modules/research/xenobiology/crossbreeding/_weapons.dm
@@ -14,7 +14,7 @@ Slimecrossing Weapons
/obj/item/melee/arm_blade/slime/attack(mob/living/L, mob/user)
. = ..()
if(prob(20))
- user.emote("scream")
+ user.force_scream()
//Adamantine shield - Chilling Adamantine
/obj/item/shield/adamantineshield
diff --git a/code/modules/research/xenobiology/crossbreeding/burning.dm b/code/modules/research/xenobiology/crossbreeding/burning.dm
index 26c151e42316..7d19fb0f8cfd 100644
--- a/code/modules/research/xenobiology/crossbreeding/burning.dm
+++ b/code/modules/research/xenobiology/crossbreeding/burning.dm
@@ -228,7 +228,7 @@ Burning extracts:
user.visible_message("[src] melts onto [user]'s arm, boiling the flesh horribly!")
else
user.visible_message("[src] sublimates the flesh around [user]'s arm, transforming the bone into a gruesome blade!")
- user.emote("scream")
+ user.force_scream()
L.apply_damage(30,BURN,which_hand)
..()
diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm
index 53e155210310..97196cf64ecc 100644
--- a/code/modules/surgery/bodyparts/bodyparts.dm
+++ b/code/modules/surgery/bodyparts/bodyparts.dm
@@ -373,7 +373,7 @@
if(total_damage >= max_damage * disable_threshold) //Easy limb disable disables the limb at 40% health instead of 0%
if(!last_maxed)
- if(owner.stat < UNCONSCIOUS)
+ if(owner.stat < UNCONSCIOUS && !HAS_TRAIT(owner, TRAIT_ANALGESIA))
INVOKE_ASYNC(owner, TYPE_PROC_REF(/mob, emote), "scream")
last_maxed = TRUE
set_disabled(TRUE)
@@ -790,7 +790,10 @@
return
if(prob(5))
- to_chat(owner, "[pick("You feel broken bones moving around in your [name]!", "There are broken bones moving around in your [name]!", "The bones in your [name] are moving around!")]")
+ if(HAS_TRAIT(owner, TRAIT_ANALGESIA))
+ to_chat(owner, span_notice("[pick("You feel something shifting inside your [name].", "There is something moving inside [name].", "Something inside your [name] slips.")]"))
+ else
+ to_chat(owner, "[pick("You feel broken bones moving around in your [name]!", "There are broken bones moving around in your [name]!", "The bones in your [name] are moving around!")]")
receive_damage(rand(1, 3))
//1-3 damage every 20 tiles for every broken bodypart.
//A single broken bodypart will give you an average of 650 tiles to run before you get a total of 100 damage and fall into crit
diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm
index 07d30e727c77..4a98e6b93ea0 100644
--- a/code/modules/surgery/bodyparts/dismemberment.dm
+++ b/code/modules/surgery/bodyparts/dismemberment.dm
@@ -20,7 +20,8 @@
if(C.stat <= SOFT_CRIT)//No more screaming while unconsious
if(IS_ORGANIC_LIMB(affecting))//Chest is a good indicator for if a carbon is robotic in nature or not.
- INVOKE_ASYNC(C, TYPE_PROC_REF(/mob, emote), "scream")
+ if(!HAS_TRAIT(C, TRAIT_ANALGESIA)) //and do we actually feel pain?
+ INVOKE_ASYNC(C, TYPE_PROC_REF(/mob, emote), "scream")
SEND_SIGNAL(C, COMSIG_ADD_MOOD_EVENT, "dismembered", /datum/mood_event/dismembered)
diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm
index 4469410f9b58..729dc0fe8403 100644
--- a/code/modules/surgery/organs/tongue.dm
+++ b/code/modules/surgery/organs/tongue.dm
@@ -276,7 +276,7 @@
/obj/item/organ/tongue/robot/emp_act(severity)
owner.apply_effect(EFFECT_STUTTER, 120)
- owner.emote("scream")
+ owner.force_scream()
to_chat(owner, "Alert: Vocal cords are malfunctioning.")
/obj/item/organ/tongue/robot/handle_speech(datum/source, list/speech_args)
diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm
index 6d73fad566f6..0724b7233ef9 100644
--- a/code/modules/vending/_vending.dm
+++ b/code/modules/vending/_vending.dm
@@ -552,7 +552,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
L.client.give_award(/datum/award/achievement/misc/vendor_squish, L) // good job losing a fight with an inanimate object idiot
L.Paralyze(60)
- L.emote("scream")
+ L.force_scream()
playsound(L, 'sound/effects/blobattack.ogg', 40, TRUE)
playsound(L, 'sound/effects/splat.ogg', 50, TRUE)
diff --git a/html/changelogs/AutoChangeLog-pr-3369.yml b/html/changelogs/AutoChangeLog-pr-3369.yml
new file mode 100644
index 000000000000..31d41e4b0b05
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3369.yml
@@ -0,0 +1,6 @@
+author: Bjarl
+changes:
+ - {rscadd: Reports of people inflicted with congenital analgesia travelling to the
+ Frontier have reached this newscaster.}
+ - {rscadd: Painkillers may circumvent pain in some cases now.}
+delete-after: true
diff --git a/html/changelogs/AutoChangeLog-pr-3448.yml b/html/changelogs/AutoChangeLog-pr-3448.yml
deleted file mode 100644
index 069fa408237d..000000000000
--- a/html/changelogs/AutoChangeLog-pr-3448.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: zimon9
-changes:
- - {rscadd: 'Adds bowmans to Artificer and Enforcer loadouts, and regular headsets
- to Recruit loadouts'}
-delete-after: true
diff --git a/html/changelogs/AutoChangeLog-pr-3453.yml b/html/changelogs/AutoChangeLog-pr-3453.yml
deleted file mode 100644
index 917f69c2479c..000000000000
--- a/html/changelogs/AutoChangeLog-pr-3453.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Bjarl
-changes:
- - {bugfix: Turrets should now actually fire at their defined fire rates.}
-delete-after: true
diff --git a/html/changelogs/AutoChangeLog-pr-3465.yml b/html/changelogs/AutoChangeLog-pr-3465.yml
deleted file mode 100644
index f097a9908514..000000000000
--- a/html/changelogs/AutoChangeLog-pr-3465.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: FalloutFalcon
-changes:
- - {rscadd: Cats have been genetically engineered to detect radiation}
-delete-after: true
diff --git a/html/changelogs/AutoChangeLog-pr-3495.yml b/html/changelogs/AutoChangeLog-pr-3495.yml
deleted file mode 100644
index ff3b8b02a125..000000000000
--- a/html/changelogs/AutoChangeLog-pr-3495.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: Bjarl
-changes:
- - {balance: Factional turrets now have new damage thresholds}
- - {balance: ship turrets now have 100 less integrity by default}
-delete-after: true
diff --git a/html/changelogs/AutoChangeLog-pr-3507.yml b/html/changelogs/AutoChangeLog-pr-3507.yml
deleted file mode 100644
index fe0def59e6a5..000000000000
--- a/html/changelogs/AutoChangeLog-pr-3507.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Gristlebee
-changes:
- - {rscadd: PGF Rakalla space suits can hold a gun in their suit storage.}
-delete-after: true
diff --git a/html/changelogs/AutoChangeLog-pr-3510.yml b/html/changelogs/AutoChangeLog-pr-3510.yml
deleted file mode 100644
index 5322e1f9d188..000000000000
--- a/html/changelogs/AutoChangeLog-pr-3510.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: PositiveEntropy
-changes:
- - {imageadd: Long (And Short) Braid hairstyles have been redone!}
-delete-after: true
diff --git a/html/changelogs/AutoChangeLog-pr-3514.yml b/html/changelogs/AutoChangeLog-pr-3514.yml
new file mode 100644
index 000000000000..6872d6f58b6d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3514.yml
@@ -0,0 +1,4 @@
+author: Bjarl
+changes:
+ - {code_imp: abandoned airlocks now have more effects}
+delete-after: true
diff --git a/html/changelogs/AutoChangeLog-pr-3516.yml b/html/changelogs/AutoChangeLog-pr-3516.yml
new file mode 100644
index 000000000000..c359affb8390
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3516.yml
@@ -0,0 +1,4 @@
+author: FalloutFalcon
+changes:
+ - {rscadd: Readdes world icons for a few knives. Expect more soon!}
+delete-after: true
diff --git a/html/changelogs/archive/2024-10.yml b/html/changelogs/archive/2024-10.yml
index 6705c1fd38a3..984cb17c6086 100644
--- a/html/changelogs/archive/2024-10.yml
+++ b/html/changelogs/archive/2024-10.yml
@@ -117,3 +117,17 @@
- rscadd: Added flamethrower crate
- rscadd: Added incendiary grenade crate
- rscdel: Removed incendiary supply crate
+2024-10-10:
+ Bjarl:
+ - bugfix: Turrets should now actually fire at their defined fire rates.
+ - balance: Factional turrets now have new damage thresholds
+ - balance: ship turrets now have 100 less integrity by default
+ FalloutFalcon:
+ - rscadd: Cats have been genetically engineered to detect radiation
+ Gristlebee:
+ - rscadd: PGF Rakalla space suits can hold a gun in their suit storage.
+ PositiveEntropy:
+ - imageadd: Long (And Short) Braid hairstyles have been redone!
+ zimon9:
+ - rscadd: Adds bowmans to Artificer and Enforcer loadouts, and regular headsets
+ to Recruit loadouts