Merge branch 'master' of github.com:tgstation/tgstation into upstream-2026-06-23

This commit is contained in:
Roxy
2026-06-23 15:51:55 -04:00
1007 changed files with 40287 additions and 33507 deletions
+1 -1
View File
@@ -49,7 +49,7 @@
if(!isopenturf(target.loc))
return TRUE
var/can_breathe_vacuum = HAS_TRAIT(target, TRAIT_NO_BREATHLESS_DAMAGE)
var/can_breathe_vacuum = HAS_TRAIT(target, TRAIT_NO_BREATHLESS_DAMAGE) || HAS_TRAIT(target, TRAIT_NOBREATH)
var/min_oxy = can_breathe_vacuum ? 0 : atmos_requirements["min_oxy"]
var/min_plasma = can_breathe_vacuum ? 0 : atmos_requirements["min_plas"]
+2 -2
View File
@@ -49,7 +49,7 @@
var/mob/living/living_mob = target
var/gave_alert = FALSE
if(living_mob.bodytemperature < min_body_temp)
if(living_mob.bodytemperature < min_body_temp && !HAS_TRAIT(living_mob, TRAIT_RESISTCOLD))
living_mob.adjust_fire_loss(cold_damage * seconds_per_tick, forced = TRUE)
if(!living_mob.has_status_effect(/datum/status_effect/inebriated))
switch(cold_damage)
@@ -61,7 +61,7 @@
living_mob.throw_alert(ALERT_TEMPERATURE, /atom/movable/screen/alert/cold, 3)
gave_alert = TRUE
else if(living_mob.bodytemperature > max_body_temp)
else if(living_mob.bodytemperature > max_body_temp && !HAS_TRAIT(living_mob, TRAIT_RESISTHEAT))
living_mob.adjust_fire_loss(heat_damage * seconds_per_tick, forced = TRUE)
switch(heat_damage)
if(1 to 5)
-53
View File
@@ -1,53 +0,0 @@
/**
* # Cult halo element
*
* Applies and removes the cult halo
*/
/datum/element/cult_halo
/datum/element/cult_halo/Attach(datum/target, initial_delay = 20 SECONDS)
. = ..()
if (!isliving(target))
return ELEMENT_INCOMPATIBLE
// Register signals for mob transformation to prevent premature halo removal
RegisterSignals(target, list(COMSIG_CHANGELING_TRANSFORM, COMSIG_MONKEY_HUMANIZE, COMSIG_HUMAN_MONKEYIZE), PROC_REF(set_halo))
addtimer(CALLBACK(src, PROC_REF(set_halo), target), initial_delay)
/**
* Halo setter proc
*
* Adds the cult halo overlays, and adds the halo trait to the mob.
*/
/datum/element/cult_halo/proc/set_halo(mob/living/target)
SIGNAL_HANDLER
if(!IS_CULTIST(target))
target.RemoveElement(/datum/element/cult_halo)
return
ADD_TRAIT(target, TRAIT_CULT_HALO, CULT_TRAIT)
var/mutable_appearance/new_halo_overlay = mutable_appearance('icons/mob/effects/halo.dmi', "halo[rand(1, 6)]", -HALO_LAYER)
if (ishuman(target))
var/mob/living/carbon/human/human_parent = target
new /obj/effect/temp_visual/cult/sparks(get_turf(human_parent), human_parent.dir)
human_parent.overlays_standing[HALO_LAYER] = new_halo_overlay
human_parent.apply_overlay(HALO_LAYER)
else
target.add_overlay(new_halo_overlay)
/**
* Detach proc
*
* Removes the halo overlays, and trait from the mob
*/
/datum/element/cult_halo/Detach(mob/living/target, ...)
REMOVE_TRAIT(target, TRAIT_CULT_HALO, CULT_TRAIT)
if (ishuman(target))
var/mob/living/carbon/human/human_parent = target
human_parent.remove_overlay(HALO_LAYER)
human_parent.update_body()
else
target.cut_overlay(HALO_LAYER)
UnregisterSignal(target, list(COMSIG_CHANGELING_TRANSFORM, COMSIG_HUMAN_MONKEYIZE, COMSIG_MONKEY_HUMANIZE))
return ..()
+1 -1
View File
@@ -63,4 +63,4 @@
ADD_TRAIT(target, TRAIT_DRIED, ELEMENT_TRAIT(type))
var/datum/mind/user_mind = drying_user?.resolve()
if(drying_user && istype(target, /obj/item/food))
ADD_TRAIT(target, TRAIT_FOOD_CHEF_MADE, REF(user_mind))
ADD_TRAIT(target, TRAIT_HANDMADE, REF(user_mind))
+1 -1
View File
@@ -66,7 +66,7 @@
LAZYADD(microwaved_food.intrinsic_food_materials, original_food.intrinsic_food_materials)
if(microwaver && microwaver.mind)
ADD_TRAIT(result, TRAIT_FOOD_CHEF_MADE, REF(microwaver.mind))
ADD_TRAIT(result, TRAIT_HANDMADE, REF(microwaver.mind))
//make space and tranfer reagents if it has any, also let any bad result handle removing or converting the transferred reagents on its own terms
if(result.reagents && source.reagents)
+2 -2
View File
@@ -39,11 +39,11 @@
if(!isnull(move_resist))
source.move_resist = move_resist
if(!isnull(pull_force))
source.pull_force = pull_force
source.set_pull_force(pull_force)
/datum/element/change_force_on_death/proc/on_revive(mob/living/source)
SIGNAL_HANDLER
source.move_force = initial(source.move_force)
source.move_resist = initial(source.move_resist)
source.pull_force = initial(source.pull_force)
source.set_pull_force(initial(source.pull_force))
+18 -1
View File
@@ -17,10 +17,11 @@
if(source.slot_flags & slot)
RegisterSignal(user, COMSIG_MOB_SAY, PROC_REF(muzzle_talk))
RegisterSignal(user, COMSIG_MOB_PRE_EMOTED, PROC_REF(emote_override))
RegisterSignal(user, COMSIG_MOB_BEFORE_SPELL_CAST, PROC_REF(try_spellcast))
/datum/element/muffles_speech/proc/dropped(obj/item/source, mob/user)
SIGNAL_HANDLER
UnregisterSignal(user, list(COMSIG_MOB_PRE_EMOTED, COMSIG_MOB_SAY))
UnregisterSignal(user, list(COMSIG_MOB_PRE_EMOTED, COMSIG_MOB_SAY, COMSIG_MOB_BEFORE_SPELL_CAST))
/datum/element/muffles_speech/proc/emote_override(mob/living/source, key, params, type_override, intentional, datum/emote/emote)
SIGNAL_HANDLER
@@ -52,3 +53,19 @@
words[ind] = yell_suffix ? uppertext(new_word) : new_word
spoken_message = "[jointext(words, " ")][yell_suffix]"
speech_args[SPEECH_MESSAGE] = spoken_message
/datum/element/muffles_speech/proc/try_spellcast(mob/living/source, datum/action/cooldown/spell/spell, ...)
SIGNAL_HANDLER
if(spell.invocation_type != INVOCATION_WHISPER && spell.invocation_type != INVOCATION_SHOUT)
return NONE
INVOKE_ASYNC(src, PROC_REF(fail_spellcast), source, spell)
return SPELL_CANCEL_CAST
/datum/element/muffles_speech/proc/fail_spellcast(mob/living/source, datum/action/cooldown/spell/spell)
spell.invocation(source)
to_chat(source, span_warning("Your mouth covering is making it difficult to say the correct words to cast [spell]..."))
if(source.click_intercept == spell)
spell.unset_click_ability(source, refund_cooldown = TRUE)
spell.StartCooldown(2 SECONDS)
@@ -66,6 +66,6 @@
RegisterSignal(target, COMSIG_FOOD_GET_EXTRA_COMPLEXITY, PROC_REF(add_complexity), TRUE)
ADD_TRAIT(target, TRAIT_QUALITY_FOOD_INGREDIENT, REF(src))
/datum/element/quality_food_ingredient/proc/add_complexity(datum/source, list/extra_complexity)
/datum/element/quality_food_ingredient/proc/add_complexity(datum/source, list/complexity)
SIGNAL_HANDLER
extra_complexity[1] += complexity_increase
complexity[1] += complexity_increase
@@ -82,6 +82,8 @@
structure.add_fingerprint(user)
stack.add_fingerprint(user)
// Save refernce to the materials for the case when we place last tile in the stack
var/list/saved_mats_per_unit = stack.mats_per_unit
if (!stack.use_tool(structure, user, recipe.make_delay, recipe.stack_amount, extra_checks = CALLBACK(src, PROC_REF(check_recipe), structure, user, recipe)))
return
@@ -103,7 +105,7 @@
qdel(structure)
if (is_material_recipe)
wall.set_custom_materials(stack.mats_per_unit, recipe.stack_amount)
wall.set_custom_materials(saved_mats_per_unit, recipe.stack_amount)
/// Checks if the user can do the wall recipe.
/datum/element/uses_girder_wall_recipes/proc/check_recipe(obj/structure/structure, mob/living/user, datum/girder_wall_recipe/recipe)
+1 -1
View File
@@ -18,7 +18,7 @@
return
if(isliving(moved))
var/mob/living/living_moved = moved
if (living_moved.incapacitated || (living_moved.body_position == LYING_DOWN && !HAS_TRAIT(living_moved, TRAIT_FLOPPING)))
if (living_moved.buckled || living_moved.incapacitated || (living_moved.body_position == LYING_DOWN && !HAS_TRAIT(living_moved, TRAIT_FLOPPING)))
return
waddling_animation(moved)