Merge branch 'master' of https://github.com/tgstation/tgstation into upstream-23-10-2025

This commit is contained in:
Roxy
2025-10-23 17:38:23 -04:00
453 changed files with 20635 additions and 15897 deletions
@@ -18,9 +18,7 @@
if(iscarbon(M))
var/mob/living/carbon/C = M
if(!IS_CHANGELING(C))
var/obj/item/organ/ears/ears = C.get_organ_slot(ORGAN_SLOT_EARS)
if(ears)
ears.adjustEarDamage(0, 30)
C.sound_damage(deafen = 30 SECONDS)
C.adjust_confusion(25 SECONDS)
C.set_jitter_if_lower(100 SECONDS)
else
@@ -19,12 +19,11 @@
cult_team = null
return ..()
/obj/structure/destructible/cult/Initialize(mapload)
/obj/structure/destructible/cult/on_craft_completion(list/components, datum/crafting_recipe/current_recipe, atom/crafter)
. = ..()
RegisterSignal(src, COMSIG_ATOM_CONSTRUCTED, PROC_REF(on_constructed))
/obj/structure/destructible/cult/proc/on_constructed(datum/source, mob/builder)
SIGNAL_HANDLER
if(!ismob(crafter))
return
var/mob/living/builder = crafter
var/datum/antagonist/cult/cultist = builder.mind?.has_antag_datum(/datum/antagonist/cult, TRUE)
cult_team = cultist?.get_team()
@@ -264,8 +264,7 @@
hearer.adjust_timed_status_effect(15 SECONDS, /datum/status_effect/speech/slurring/heretic)
hearer.emote("scream")
hearer.add_mood_event("gates_of_mansus", /datum/mood_event/gates_of_mansus)
var/obj/item/organ/ears/regret = hearer.get_organ_slot(ORGAN_SLOT_EARS)
regret?.adjustEarDamage(10,20)
hearer.sound_damage(10, 40 SECONDS)
return "[owner.p_Their()] lungs emit [span_hypnophrase(breath_noise)]"
/// It's full of worms
@@ -28,7 +28,7 @@
/// The range of the paintings effect
var/range = 7
/obj/structure/sign/painting/eldritch/Initialize(mapload, dir, building)
/obj/structure/sign/painting/eldritch/Initialize(mapload)
. = ..()
if(ispath(applied_status_effect))
var/static/list/connections = list(COMSIG_ATOM_ENTERED = PROC_REF(apply_status_effect))
@@ -177,7 +177,7 @@
/obj/item/food/grown/harebell,
)
/obj/structure/sign/painting/eldritch/vines/Initialize(mapload, dir, building)
/obj/structure/sign/painting/eldritch/vines/Initialize(mapload)
. = ..()
new /datum/spacevine_controller(get_turf(src), mutations, 0, 10)
@@ -584,6 +584,18 @@
RegisterSignal(human_user, COMSIG_MOB_APPLY_DAMAGE_MODIFIERS, PROC_REF(on_apply_modifiers))
signal_registered += COMSIG_MOB_APPLY_DAMAGE_MODIFIERS
// adjust ignores damage modifiers so we listen to them separately
var/list/damage_adjust_signals = list(
COMSIG_LIVING_ADJUST_BRUTE_DAMAGE,
COMSIG_LIVING_ADJUST_BURN_DAMAGE,
COMSIG_LIVING_ADJUST_OXY_DAMAGE,
COMSIG_LIVING_ADJUST_TOX_DAMAGE,
COMSIG_LIVING_ADJUST_STAMINA_DAMAGE
)
RegisterSignals(human_user, damage_adjust_signals, PROC_REF(adjust_damage))
signal_registered += damage_adjust_signals
RegisterSignal(human_user, COMSIG_LIVING_DEATH, PROC_REF(on_death))
signal_registered += COMSIG_LIVING_DEATH
@@ -606,7 +618,8 @@
wearer.remove_movespeed_mod_immunities(REF(src), /datum/movespeed_modifier/equipment_speedmod)
var/obj/item/organ/brain/our_brain = wearer.get_organ_slot(ORGAN_SLOT_BRAIN)
REMOVE_TRAIT(our_brain, TRAIT_BRAIN_DAMAGE_NODEATH, REF(src))
if(our_brain)
REMOVE_TRAIT(our_brain, TRAIT_BRAIN_DAMAGE_NODEATH, REF(src))
braindead = FALSE
if(health_hud in user.hud_used.infodisplay)
on_hud_remove(user)
@@ -616,6 +629,14 @@
if(braindead)
return
damage_mods += 0
handle_damage(user, damage)
/obj/item/clothing/suit/hooded/cultrobes/eldritch/moon/proc/adjust_damage(mob/living/user, type, amount, forced)
SIGNAL_HANDLER
handle_damage(user, amount)
return COMPONENT_IGNORE_CHANGE
/obj/item/clothing/suit/hooded/cultrobes/eldritch/moon/proc/handle_damage(mob/living/user, damage)
user.adjustOrganLoss(ORGAN_SLOT_BRAIN, damage * damage_modifier)
check_braindeath(user)
@@ -44,16 +44,14 @@
/// The duration of these effects are based on sanity, mainly for flavor but also to make it a weaker alpha strike
var/maximum_duration = 15 SECONDS
var/mind_gate_duration = ((SANITY_MAXIMUM - cast_on.mob_mood.sanity) / (SANITY_MAXIMUM - SANITY_INSANE)) * maximum_duration
var/mind_gate_duration = ((SANITY_MAXIMUM - cast_on.mob_mood.sanity) / (SANITY_MAXIMUM - SANITY_INSANE)) * maximum_duration + 1 SECONDS
to_chat(cast_on, span_warning("Your eyes cry out in pain, your ears bleed and your lips seal! THE MOON SMILES UPON YOU!"))
cast_on.adjust_temp_blindness(mind_gate_duration + 1 SECONDS)
cast_on.set_eye_blur_if_lower(mind_gate_duration + 2 SECONDS)
cast_on.adjust_temp_blindness(mind_gate_duration)
cast_on.set_eye_blur_if_lower(mind_gate_duration + 1 SECONDS)
var/obj/item/organ/ears/ears = cast_on.get_organ_slot(ORGAN_SLOT_EARS)
//adjustEarDamage takes deafness duration parameter in one unit per two seconds, instead of the normal time, so we divide by two seconds
ears?.adjustEarDamage(0, (mind_gate_duration + 1 SECONDS) / (2 SECONDS))
cast_on.sound_damage(0, mind_gate_duration)
cast_on.adjust_silence(mind_gate_duration + 1 SECONDS)
cast_on.adjust_silence(mind_gate_duration)
cast_on.add_mood_event("moon_smile", /datum/mood_event/moon_smile)
// Only knocksdown if the target has a low enough sanity
@@ -415,6 +415,8 @@
/datum/status_effect/heretic_passive/moon/on_apply()
. = ..()
var/obj/item/organ/brain/our_brain = owner.get_organ_slot(ORGAN_SLOT_BRAIN)
if(!our_brain)
return
ADD_TRAIT(our_brain, TRAIT_BRAIN_TRAUMA_IMMUNITY, REF(src))
owner.AddElement(/datum/element/relay_attackers)
RegisterSignal(owner, COMSIG_ATOM_WAS_ATTACKED, PROC_REF(on_attacked))
@@ -450,6 +452,8 @@
/datum/status_effect/heretic_passive/moon/on_remove()
var/obj/item/organ/brain/our_brain = owner.get_organ_slot(ORGAN_SLOT_BRAIN)
if(!our_brain)
return ..()
REMOVE_TRAIT(our_brain, TRAIT_BRAIN_TRAUMA_IMMUNITY, REF(src))
REMOVE_TRAIT(owner, TRAIT_SLEEPIMMUNE, REF(src))
UnregisterSignal(owner, COMSIG_ATOM_WAS_ATTACKED)
@@ -158,7 +158,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module/malf))
Obtaining control of the weapon will be easier if Head of Staff office APCs are already under your control."
cost = 130
one_purchase = TRUE
minimum_apcs = 15 // So you cant speedrun delta
minimum_apcs = 10 // So you cant speedrun delta
power_type = /datum/action/innate/ai/nuke_station
unlock_text = span_notice("You slowly, carefully, establish a connection with the on-station self-destruct. You can now activate it at any time.")
///List of areas that grant discounts. "heads_quarters" will match any head of staff office.
@@ -143,8 +143,6 @@
/// Looks across the station for items that are pirate specific exports
/obj/machinery/loot_locator/proc/find_random_loot()
if(!GLOB.exports_list.len)
setupExports()
var/list/possible_loot = list()
for(var/datum/export/pirate/possible_export in GLOB.exports_list)
possible_loot += possible_export
@@ -404,6 +402,7 @@
deltimer(sending_timer)
/datum/export/pirate
abstract_type = /datum/export/pirate
sales_market = EXPORT_MARKET_PIRACY
/// Attempts to find the thing on station
@@ -423,8 +422,7 @@
if(head_mobs.len)
return pick(head_mobs)
/datum/export/pirate/ransom/get_cost(atom/movable/exported_item)
var/mob/living/carbon/human/ransomee = exported_item
/datum/export/pirate/ransom/get_base_cost(mob/living/carbon/human/ransomee)
if(ransomee.stat != CONSCIOUS || !ransomee.mind || HAS_TRAIT(ransomee.mind, TRAIT_HAS_BEEN_KIDNAPPED)) //mint condition only
return 0
else if(FACTION_PIRATE in ransomee.faction) //can't ransom your fellow pirates to CentCom!
@@ -474,18 +472,20 @@
/datum/export/pirate/cash
cost = 1
k_hit_percentile = 0.1 / MAX_STACK_SIZE
unit_name = "bill"
export_types = list(/obj/item/stack/spacecash)
/datum/export/pirate/cash/get_cost(obj/exported_item)
var/obj/item/stack/spacecash/cash = exported_item
return cash.value * cash.amount
/datum/export/pirate/cash/get_amount(obj/item/stack/spacecash/cash)
return cash.amount
/datum/export/pirate/cash/get_base_cost(obj/item/stack/spacecash/cash)
return cash.value
/datum/export/pirate/holochip
cost = 1
unit_name = "holochip"
export_types = list(/obj/item/holochip)
/datum/export/pirate/holochip/get_cost(atom/movable/exported_item)
var/obj/item/holochip/chip = exported_item
/datum/export/pirate/holochip/get_base_cost(obj/item/holochip/chip)
return chip.credits