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

This commit is contained in:
Roxy
2025-11-12 16:44:13 -05:00
379 changed files with 37535 additions and 33147 deletions
@@ -72,7 +72,7 @@
use_delay = (world.time + abductor_pad_cooldown)
if(GLOB.cameranet.checkTurfVis(remote_eye.loc))
if(SScameras.is_visible_by_cameras(remote_eye.loc))
P.PadToLoc(remote_eye.loc)
/datum/action/innate/teleport_out
@@ -116,7 +116,7 @@
use_delay = (world.time + teleport_self_cooldown)
if(GLOB.cameranet.checkTurfVis(remote_eye.loc))
if(SScameras.is_visible_by_cameras(remote_eye.loc))
P.MobToLoc(remote_eye.loc,C)
/datum/action/innate/vest_mode_swap
@@ -51,7 +51,7 @@
/// Makes the user harder to see in the dark (and makes the user see in the dark easier)
/datum/status_effect/darkness_adapted
id = "darkness_adapted"
tick_interval = 0.5 SECONDS
tick_interval = 0.6 SECONDS
alert_type = null
/// Threshold before the dark color is applied
var/dark_color_threshold = 70
@@ -50,7 +50,7 @@
user.balloon_alert(user, "throat is sore!")
return FALSE
//BUBBER EDIT: NO PULSE IF YOU'RE ON COOLDOWN
empulse(get_turf(user), 2, 5, 1)
empulse(get_turf(user), 2, 5, 1, emp_source = src)
for(var/obj/machinery/light/L in range(5, usr))
L.on = TRUE
L.break_light_tube()
+1 -1
View File
@@ -183,7 +183,7 @@
owner.whisper(invocation, language = /datum/language/common, forced = "cult invocation")
owner.visible_message(span_warning("[owner]'s hand flashes a bright blue!"), \
span_cult_italic("You speak the cursed words, emitting an EMP blast from your hand."))
empulse(owner, 2, 5)
empulse(owner, 2, 5, emp_source = src)
charges--
SSblackbox.record_feedback("tally", "cult_spell_invoke", 1, "[name]")
if(charges <= 0)
+1 -1
View File
@@ -1170,7 +1170,7 @@ GLOBAL_VAR_INIT(narsie_summon_count, 0)
for(var/mob/living/target in range(src, 3))
target.Paralyze(30)
empulse(T, 0.42*(intensity), 1)
empulse(T, 0.42*(intensity), 1, emp_source = src)
var/list/images = list()
for(var/mob/living/M in GLOB.alive_mob_list)
@@ -231,7 +231,7 @@
return ..()
/datum/heretic_knowledge/limited_amount/recipe_snowflake_check(mob/living/user, list/atoms, list/selected_atoms, turf/loc)
var/datum/antagonist/heretic/our_heretic = IS_HERETIC(user)
var/datum/antagonist/heretic/our_heretic = GET_HERETIC(user)
if(our_heretic && our_heretic.unlimited_blades)
if(length(result_atoms & typesof(/obj/item/melee/sickly_blade)))
return TRUE
@@ -54,7 +54,7 @@
return .
/obj/item/melee/sickly_blade/attack_self(mob/user)
var/datum/antagonist/heretic/heretic_datum = IS_HERETIC(user)
var/datum/antagonist/heretic/heretic_datum = GET_HERETIC(user)
if(heretic_datum?.unlimited_blades)
return
if(HAS_TRAIT(user, TRAIT_ELDRITCH_ARENA_PARTICIPANT))
@@ -81,7 +81,7 @@
/// Attempts to teleport the passed mob to somewhere safe on the station, if they can use the blade.
/obj/item/melee/sickly_blade/proc/seek_safety(mob/user)
var/turf/safe_turf = find_safe_turf(zlevels = z, extended_safety_checks = TRUE)
var/turf/safe_turf = find_safe_turf(z, extended_safety_checks = TRUE)
if(check_usability(user))
if(do_teleport(user, safe_turf, channel = TELEPORT_CHANNEL_MAGIC))
to_chat(user, span_warning("As you shatter [src], you feel a gust of energy flow through your body. [after_use_message]"))
@@ -168,7 +168,7 @@
. = ..()
if(!infused || target == user || !isliving(target))
return
var/datum/antagonist/heretic/heretic_datum = IS_HERETIC(user)
var/datum/antagonist/heretic/heretic_datum = GET_HERETIC(user)
var/mob/living/living_target = target
if(!heretic_datum)
return
@@ -54,7 +54,7 @@
REMOVE_TRAIT(src, TRAIT_NODROP, CLOTHING_TRAIT)
for(var/mob/living/carbon/human/human_in_range in view(local_user))
if(IS_HERETIC_OR_MONSTER(human_in_range) || human_in_range.is_blind())
if(IS_HERETIC_OR_MONSTER(human_in_range) || human_in_range.stat > SOFT_CRIT || human_in_range.is_blind())
continue
if(human_in_range.can_block_magic(MAGIC_RESISTANCE|MAGIC_RESISTANCE_MIND))
@@ -32,7 +32,7 @@
"Use your labyrinth book to shake off pursuers. It creates impassible walls to anyone but you.",
)
start = /datum/heretic_knowledge/limited_amount/starting/base_knock
start = /datum/heretic_knowledge/limited_amount/starting/base_lock
knowledge_tier1 = /datum/heretic_knowledge/key_ring
guaranteed_side_tier1 = /datum/heretic_knowledge/painting
knowledge_tier2 = /datum/heretic_knowledge/limited_amount/concierge_rite
@@ -44,7 +44,7 @@
knowledge_tier4 = /datum/heretic_knowledge/spell/caretaker_refuge
ascension = /datum/heretic_knowledge/ultimate/lock_final
/datum/heretic_knowledge/limited_amount/starting/base_knock
/datum/heretic_knowledge/limited_amount/starting/base_lock
name = "A Steward's Secret"
desc = "Opens up the Path of Lock to you. \
Allows you to transmute a knife and a crowbar into a Key Blade. \
@@ -62,26 +62,28 @@
mark_type = /datum/status_effect/eldritch/lock
eldritch_passive = /datum/status_effect/heretic_passive/lock
/datum/heretic_knowledge/limited_amount/starting/base_knock/on_gain(mob/user, datum/antagonist/heretic/our_heretic)
/datum/heretic_knowledge/limited_amount/starting/base_lock/on_gain(mob/user, datum/antagonist/heretic/our_heretic)
. = ..()
RegisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK_SECONDARY, PROC_REF(on_secondary_mansus_grasp))
var/datum/action/cooldown/spell/touch/mansus_grasp/grasp_spell = locate() in user.actions
grasp_spell?.invocation_type = INVOCATION_NONE
grasp_spell?.sound = null
/datum/heretic_knowledge/limited_amount/starting/base_knock/on_lose(mob/user, datum/antagonist/heretic/our_heretic)
/datum/heretic_knowledge/limited_amount/starting/base_lock/on_lose(mob/user, datum/antagonist/heretic/our_heretic)
. = ..()
UnregisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK_SECONDARY)
/datum/heretic_knowledge/limited_amount/starting/base_knock/on_mansus_grasp(mob/living/source, mob/living/target)
/datum/heretic_knowledge/limited_amount/starting/base_lock/on_mansus_grasp(mob/living/source, mob/living/target)
. = ..()
var/obj/item/clothing/under/suit = target.get_item_by_slot(ITEM_SLOT_ICLOTHING)
if(!suit.can_adjust)
return
if(istype(suit) && suit.adjusted == NORMAL_STYLE)
suit.toggle_jumpsuit_adjust()
suit.update_appearance()
/datum/heretic_knowledge/limited_amount/starting/base_knock/proc/on_secondary_mansus_grasp(mob/living/source, atom/target)
/datum/heretic_knowledge/limited_amount/starting/base_lock/proc/on_secondary_mansus_grasp(mob/living/source, atom/target)
SIGNAL_HANDLER
if(ismecha(target))
@@ -69,7 +69,7 @@
/datum/heretic_knowledge/limited_amount/starting/base_moon/on_gain(mob/user, datum/antagonist/heretic/our_heretic)
. = ..()
ADD_TRAIT(user, TRAIT_EMPATH, REF(src))
user.AddComponentFrom(REF(src), /datum/component/empathy, seen_it = TRUE, visible_info = ALL, self_empath = FALSE, sense_dead = FALSE, sense_whisper = TRUE, smite_target = FALSE)
/datum/heretic_knowledge/limited_amount/starting/base_moon/on_mansus_grasp(mob/living/source, mob/living/target)
. = ..()
@@ -157,7 +157,7 @@
id = "fire_blasted"
alert_type = null
duration = 5 SECONDS
tick_interval = 0.5 SECONDS
tick_interval = 0.6 SECONDS
/// How much fire / stam to do per tick (stamina damage is doubled this)
var/tick_damage = 1
/// How long does the animation of the appearance last? If 0 or negative, we make no overlay
@@ -704,8 +704,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module/malf))
var/turf/T = turfs[n]
if(!isfloorturf(T))
success = FALSE
var/datum/camerachunk/C = GLOB.cameranet.getCameraChunk(T.x, T.y, T.z)
if(!C.visibleTurfs[T])
if(!SScameras.is_visible_by_cameras(T))
alert_msg = "You don't have camera vision of this location!"
success = FALSE
for(var/atom/movable/AM in T.contents)
@@ -830,7 +829,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module/malf))
/datum/action/innate/ai/reactivate_cameras/Activate()
var/fixed_cameras = 0
for(var/obj/machinery/camera/C as anything in GLOB.cameranet.cameras)
for(var/obj/machinery/camera/C as anything in SScameras.cameras)
if(!uses)
break
if(!C.camera_enabled || C.view_range != initial(C.view_range))
@@ -862,13 +861,12 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module/malf))
AI.update_sight()
var/upgraded_cameras = 0
for(var/obj/machinery/camera/camera as anything in GLOB.cameranet.cameras)
for(var/obj/machinery/camera/camera as anything in SScameras.cameras)
var/upgraded = FALSE
if(!camera.isXRay())
camera.upgradeXRay(TRUE) //if this is removed you can get rid of camera_assembly/var/malf_xray_firmware_active and clean up isxray()
//Update what it can see.
GLOB.cameranet.updateVisibility(camera, 0)
upgraded = TRUE
if(!camera.isEmpProof())
@@ -146,6 +146,9 @@
var/should_attack = try_kidnap(hewmon)
// Marks the victim with nodeath
hewmon.apply_status_effect(/datum/status_effect/void_chomped)
if(!should_attack)
return FALSE
@@ -16,16 +16,17 @@
use_user_hud_icon = TRUE
overlay_state = "paralysis"
/datum/status_effect/void_eatered
id = "void_eatered"
duration = 10 SECONDS
/datum/status_effect/void_chomped
id = "void_chomped"
duration = 15 SECONDS
status_type = STATUS_EFFECT_REFRESH
remove_on_fullheal = TRUE
alert_type = null
/datum/status_effect/void_eatered/on_apply()
/datum/status_effect/void_chomped/on_apply()
. = ..()
ADD_TRAIT(owner, TRAIT_NODEATH, TRAIT_STATUS_EFFECT(id))
/datum/status_effect/void_eatered/on_remove()
/datum/status_effect/void_chomped/on_remove()
. = ..()
REMOVE_TRAIT(owner, TRAIT_NODEATH, TRAIT_STATUS_EFFECT(id))
@@ -304,7 +304,7 @@
uniform = /obj/item/clothing/under/costume/roman
shoes = /obj/item/clothing/shoes/roman
back = /obj/item/spear
r_hand = /obj/item/claymore
belt = /obj/item/storage/belt/sheath/gladius
l_hand = /obj/item/shield/roman
/datum/outfit/roman/pre_equip(mob/living/carbon/human/H, visuals_only)
@@ -62,7 +62,7 @@
return ..()
/datum/action/cooldown/spell/conjure_item/clown_pockets/post_created(atom/cast_on, atom/created)
cast_on.visible_message(span_notice("[cast_on] pulls out [created]!"))
cast_on.visible_message(span_notice("[cast_on] pulls out [created]!"), span_notice("You pull out [created]!"))
/datum/action/cooldown/spell/conjure_item/clown_pockets/can_cast_spell(feedback = TRUE)
. = ..()
@@ -76,7 +76,8 @@
/// Prints a funny message, exists so I can override it to print a different message
/datum/action/cooldown/spell/conjure_item/clown_pockets/proc/cast_message(mob/cast_on)
cast_on.visible_message(span_notice("[cast_on] reaches far deeper into [cast_on.p_their()] pockets than you think \
should be possible and starts rummaging around for something."))
should be possible and starts rummaging around for something."), span_notice("You reach further down into your \
pockets than you ever have before and feel around for something."))
/// Longer cooldown variant which is attached to the enchanted clown suit
/datum/action/cooldown/spell/conjure_item/clown_pockets/enchantment
@@ -84,7 +85,8 @@
cooldown_time = 60 SECONDS
/datum/action/cooldown/spell/conjure_item/clown_pockets/enchantment/cast_message(mob/cast_on)
cast_on.visible_message(span_notice("[cast_on] starts rummaging around in [cast_on.p_their()] comically large pants."))
cast_on.visible_message(span_notice("[cast_on] starts rummaging around in [cast_on.p_their()] comically large pants."), span_notice("You \
start rummaging around in your comically large pants."))
/// Enchanted clown suit
/obj/item/clothing/under/rank/civilian/clown/magic
@@ -123,7 +123,7 @@
/datum/grand_side_effect/emp/trigger(potency, turf/ritual_location, mob/invoker)
var/heavy = LERP(0, 3, potency/GRAND_RITUAL_FINALE_COUNT)
var/light = LERP(3, 6, potency/GRAND_RITUAL_FINALE_COUNT)
empulse(ritual_location, heavy, light)
empulse(ritual_location, heavy, light, emp_source = src)
/// Swap locations of nearby mobs arbitrarily and confuse them
/datum/grand_side_effect/translocate