diff --git a/code/__DEFINES/movement.dm b/code/__DEFINES/movement.dm
index d8e125a91bb..5a6ae3944bf 100644
--- a/code/__DEFINES/movement.dm
+++ b/code/__DEFINES/movement.dm
@@ -57,6 +57,7 @@ GLOBAL_VAR_INIT(glide_size_multiplier, 1.0)
* currently_z_moving defines. Higher numbers mean higher priority.
* This one is for falling down open space from stuff such as deleted tile, pit grate...
*/
+#define CURERENTLY_Z_CLIMBING_DOWN 0.5
#define CURRENTLY_Z_FALLING 1
/// currently_z_moving is set to this in zMove() if 0.
#define CURRENTLY_Z_MOVING_GENERIC 2
diff --git a/code/__DEFINES/traits/definitions.dm b/code/__DEFINES/traits/definitions.dm
index f88d9425b2b..e6971fbf11b 100644
--- a/code/__DEFINES/traits/definitions.dm
+++ b/code/__DEFINES/traits/definitions.dm
@@ -28,6 +28,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_NO_FLOATING_ANIM "no-floating-animation"
///generic atom traits
+///Chasms will be safe to cross while they've this trait.
+#define TRAIT_CHASM_STOPPED "chasm_stopped"
/// If this movable is currently considered to be treading in a turf with the immerse element.
#define TRAIT_IMMERSED "immersed"
///The effects of the immerse element will be halted while this trait is present.
diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm
index 417f81478e3..3958fb57828 100644
--- a/code/__HELPERS/game.dm
+++ b/code/__HELPERS/game.dm
@@ -379,7 +379,7 @@
if (!istype(turf_area, specific_area))
continue
- if (!is_blocked_turf(found_turf))
+ if (!found_turf.is_blocked_turf())
possible_loc.Add(found_turf)
// Need at least one free location.
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index 5715113167b..924d05bf8bb 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -305,14 +305,6 @@ Turf and target are separate in case you want to teleport some distance from a t
assembled += A
return assembled
-/proc/is_blocked_turf(turf/T, exclude_mobs)
- if(T.density)
- return 1
- for(var/atom/A as anything in T)
- if(A.density && (!exclude_mobs || !ismob(A)))
- return 1
- return 0
-
/proc/is_anchored_dense_turf(turf/T) //like the older version of the above, fails only if also anchored
if(T.density)
return 1
@@ -330,7 +322,7 @@ Turf and target are separate in case you want to teleport some distance from a t
var/base_dir = get_dir(ref, get_step_towards(ref,trg))
var/turf/temp = get_step_towards(ref,trg)
- if(is_blocked_turf(temp))
+ if(temp.is_blocked_turf())
var/dir_alt1 = turn(base_dir, 90)
var/dir_alt2 = turn(base_dir, -90)
var/turf/turf_last1 = temp
@@ -339,10 +331,10 @@ Turf and target are separate in case you want to teleport some distance from a t
var/breakpoint = 0
while(!free_tile && breakpoint < 10)
- if(!is_blocked_turf(turf_last1))
+ if(!turf_last1.is_blocked_turf())
free_tile = turf_last1
break
- if(!is_blocked_turf(turf_last2))
+ if(!turf_last2.is_blocked_turf())
free_tile = turf_last2
break
turf_last1 = get_step(turf_last1,dir_alt1)
diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm
index decc8a28fab..d7d6224e124 100644
--- a/code/_globalvars/traits.dm
+++ b/code/_globalvars/traits.dm
@@ -215,6 +215,8 @@ GLOBAL_LIST_INIT(traits_by_type, list(
),
/turf = list(
"TRAIT_AI_AVOID_TURF" = TRAIT_AI_AVOID_TURF,
+ "TRAIT_CHASM_STOPPED" = TRAIT_CHASM_STOPPED,
+ "TRAIT_IMMERSE_STOPPED" = TRAIT_IMMERSE_STOPPED,
"TRAIT_TURF_IGNORE_SLOWDOWN" = TRAIT_TURF_IGNORE_SLOWDOWN,
)
))
diff --git a/code/controllers/subsystem/migration.dm b/code/controllers/subsystem/migration.dm
index 18f3c3ba828..0a309f1b6e3 100644
--- a/code/controllers/subsystem/migration.dm
+++ b/code/controllers/subsystem/migration.dm
@@ -264,7 +264,7 @@ SUBSYSTEM_DEF(migrants)
continue
if(islava(turf))
continue
- if(is_blocked_turf(turf))
+ if(turf.is_blocked_turf())
continue
turfs += turf
turfs = shuffle(turfs)
diff --git a/code/datums/ai/behaviours/run_from_target.dm b/code/datums/ai/behaviours/run_from_target.dm
index 0daf180eb3e..6293ae48c55 100644
--- a/code/datums/ai/behaviours/run_from_target.dm
+++ b/code/datums/ai/behaviours/run_from_target.dm
@@ -91,13 +91,13 @@
var/turf/return_turf
for(var/i in 1 to run_distance)
var/turf/test_destination = get_ranged_target_turf_direct(source, target, range = i, offset = angle)
- if(isopenspace(test_destination) || is_blocked_turf(test_destination, exclude_mobs = !source.density))
+ if(isopenspace(test_destination) || test_destination.is_blocked_turf(exclude_mobs = !source.density))
var/origin = return_turf || get_turf(source)
var/obj/structure/stairs/found_stairs = locate() in origin
if(!found_stairs)
break
- var/stairs_destination = found_stairs.get_transit_destination(get_dir(origin, test_destination))
- if(isopenspace(stairs_destination) || is_blocked_turf(stairs_destination, exclude_mobs = !source.density))
+ var/turf/stairs_destination = found_stairs.get_transit_destination(get_dir(origin, test_destination))
+ if(isopenspace(stairs_destination) || stairs_destination.is_blocked_turf(exclude_mobs = !source.density))
break
return stairs_destination
return_turf = test_destination
diff --git a/code/datums/brain_damage/mild.dm b/code/datums/brain_damage/mild.dm
index 21cb44b5fba..6c37b6ede47 100644
--- a/code/datums/brain_damage/mild.dm
+++ b/code/datums/brain_damage/mild.dm
@@ -34,8 +34,8 @@
owner.derpspeech = min(owner.derpspeech + 5, 25)
if(prob(3))
owner.emote("drool")
- else if(owner.stat == CONSCIOUS && prob(3))
- owner.say(pick_list_replacements(BRAIN_DAMAGE_FILE, "brain_damage"), forced = "brain damage")
+ // else if(owner.stat == CONSCIOUS && prob(3))
+ // owner.say(pick_list_replacements(BRAIN_DAMAGE_FILE, "brain_damage"), forced = "brain damage")
..()
/datum/brain_trauma/mild/dumbness/on_lose()
diff --git a/code/datums/elements/immerse.dm b/code/datums/elements/immerse.dm
index 184ff4e6eee..8e14a0be273 100644
--- a/code/datums/elements/immerse.dm
+++ b/code/datums/elements/immerse.dm
@@ -228,6 +228,7 @@ GLOBAL_LIST_INIT(immerse_ignored_movable, typecacheof(list(
try_unimmerse(movable, buckled)
LAZYREMOVE(attached_turf_contents[source], movable)
UnregisterSignal(movable, list(COMSIG_LIVING_SET_BUCKLED, COMSIG_QDELETING, COMSIG_LIVING_UPDATE_OFFSETS, COMSIG_ATOM_SPIN_ANIMATION, COMSIG_LIVING_POST_UPDATE_TRANSFORM))
+ REMOVE_TRAIT(movable, TRAIT_IMMERSED, ELEMENT_TRAIT(src)) // redundant but just in case
REMOVE_TRAIT(movable, TRAIT_ENTERED_IMMERSE, ELEMENT_TRAIT(src))
/// Generate a mask filter mutable to use as render_source for the alpha filter based on provided width, height and immersion state
diff --git a/code/datums/wounds/arteries.dm b/code/datums/wounds/arteries.dm
index 53f718d3794..478b564a3ce 100644
--- a/code/datums/wounds/arteries.dm
+++ b/code/datums/wounds/arteries.dm
@@ -16,6 +16,7 @@
min_damage_dividend = 0
strong_intent_bonus = TRUE
aimed_intent_bonus = TRUE
+ crit_message = "Blood sprays from %VICTIM's %BODYPART!"
var/artery_type_override
/datum/wound/artery/get_crit_prob(bclass, dam, damage_dividend, mob/living/user, obj/item/bodypart/affected, zone_precise, list/modifiers)
diff --git a/code/game/atom/atoms_movable.dm b/code/game/atom/atoms_movable.dm
index 6e8ebba7773..6c4017265e8 100644
--- a/code/game/atom/atoms_movable.dm
+++ b/code/game/atom/atoms_movable.dm
@@ -436,6 +436,8 @@
if(z_move_flags & ZMOVE_FEEDBACK)
to_chat(rider || src, span_warning("There's nowhere to go in that direction!"))
return FALSE
+ if(HAS_TRAIT(src, TRAIT_I_AM_INVISIBLE_ON_A_BOAT)) // VANDERLIN CHANGE
+ return FALSE
if(SEND_SIGNAL(src, COMSIG_CAN_Z_MOVE, start, destination) & COMPONENT_CANT_Z_MOVE)
return FALSE
if(z_move_flags & ZMOVE_FALL_CHECKS && (throwing || (movement_type & MOVETYPES_NOT_TOUCHING_GROUND)))
diff --git a/code/game/machinery/trams_and_elevators/industrial_lift.dm b/code/game/machinery/trams_and_elevators/industrial_lift.dm
index 7cb313d515f..9275be48582 100644
--- a/code/game/machinery/trams_and_elevators/industrial_lift.dm
+++ b/code/game/machinery/trams_and_elevators/industrial_lift.dm
@@ -75,6 +75,7 @@ GLOBAL_LIST_INIT(all_radial_directions, list(
var/list/moving_lifts = list()
///are we fake? if so we remove the z_fall block and such
var/fake = FALSE
+ var/static/list/turf_traits = list(TRAIT_IMMERSE_STOPPED, TRAIT_CHASM_STOPPED)
/obj/structure/industrial_lift/Initialize(mapload)
. = ..()
@@ -83,9 +84,9 @@ GLOBAL_LIST_INIT(all_radial_directions, list(
set_movement_registrations()
if(fake)
alpha = 0
- obj_flags = CAN_BE_HIT
+ obj_flags &= ~BLOCK_Z_OUT_DOWN
else
- AddElement(/datum/element/give_turf_traits, string_list(list(TRAIT_IMMERSE_STOPPED)))
+ AddElement(/datum/element/give_turf_traits, string_list(turf_traits))
//since lift_master datums find all connected platforms when an industrial lift first creates it and then
//sets those platforms' lift_master_datum to itself, this check will only evaluate to true once per tram platform
@@ -664,6 +665,16 @@ GLOBAL_LIST_INIT(all_radial_directions, list(
return FALSE
return TRUE
+/obj/structure/industrial_lift/proc/show_lift()
+ obj_flags |= BLOCK_Z_OUT_DOWN
+ AddElement(/datum/element/give_turf_traits, string_list(turf_traits))
+ alpha = 255
+
+/obj/structure/industrial_lift/proc/hide_lift()
+ obj_flags &= ~BLOCK_Z_OUT_DOWN
+ RemoveElement(/datum/element/give_turf_traits, string_list(turf_traits))
+ alpha = 0
+
/obj/structure/industrial_lift/attack_hand(mob/user, list/modifiers)
. = ..()
if(.)
diff --git a/code/game/machinery/trams_and_elevators/lift_master.dm b/code/game/machinery/trams_and_elevators/lift_master.dm
index 838f08fa4a0..b9d0a7bd743 100644
--- a/code/game/machinery/trams_and_elevators/lift_master.dm
+++ b/code/game/machinery/trams_and_elevators/lift_master.dm
@@ -575,10 +575,7 @@ GLOBAL_LIST_EMPTY(active_lifts_by_type)
platform.horizontal_speed = 0.1
base_horizontal_speed = 0.1
horizontal_speed = 0.1
- if(!platform.fake)
- platform.obj_flags &= ~BLOCK_Z_OUT_DOWN
- platform.RemoveElement(/datum/element/give_turf_traits, string_list(list(TRAIT_IMMERSE_STOPPED)))
- platform.alpha = 0
+
for(var/atom/movable/movable in platform.lift_load)
if(ismob(movable))
platform.RemoveItemFromLift(movable)
@@ -589,13 +586,14 @@ GLOBAL_LIST_EMPTY(active_lifts_by_type)
movable.density = FALSE
movable.alpha = 0
+ if(!platform.fake)
+ platform.hide_lift()
+
for(var/obj/structure/industrial_lift/tram/moving_platform in platform.moving_lifts)
if(moving_platform.fake)
continue
moving_platform.horizontal_speed = 0.1
- moving_platform.obj_flags &= ~BLOCK_Z_OUT_DOWN
- moving_platform.RemoveElement(/datum/element/give_turf_traits, string_list(list(TRAIT_IMMERSE_STOPPED)))
- moving_platform.alpha = 0
+ moving_platform.hide_lift()
/datum/lift_master/tram/proc/show_tram()
ignore_pathing_obstacles = FALSE
@@ -604,22 +602,19 @@ GLOBAL_LIST_EMPTY(active_lifts_by_type)
base_horizontal_speed = 4
horizontal_speed = 4
if(!platform.fake)
- platform.obj_flags |= BLOCK_Z_OUT_DOWN
- platform.AddElement(/datum/element/give_turf_traits, string_list(list(TRAIT_IMMERSE_STOPPED)))
- platform.alpha = 255
- for(var/atom/movable/movable in objects_pre_alpha)
- movable.alpha = objects_pre_alpha[movable]
- REMOVE_TRAIT(movable, TRAIT_I_AM_INVISIBLE_ON_A_BOAT, REF(src))
- objects_pre_alpha -= movable
- movable.density = initial(movable.density)
+ platform.show_lift()
for(var/obj/structure/industrial_lift/tram/moving_platform in platform.moving_lifts)
if(moving_platform.fake)
continue
moving_platform.horizontal_speed = 4
- moving_platform.obj_flags |= BLOCK_Z_OUT_DOWN
- moving_platform.AddElement(/datum/element/give_turf_traits, string_list(list(TRAIT_IMMERSE_STOPPED)))
- moving_platform.alpha = 255
+ moving_platform.show_lift()
+
+ for(var/atom/movable/movable in objects_pre_alpha)
+ movable.alpha = objects_pre_alpha[movable]
+ REMOVE_TRAIT(movable, TRAIT_I_AM_INVISIBLE_ON_A_BOAT, REF(src))
+ objects_pre_alpha -= movable
+ movable.density = initial(movable.density)
/datum/lift_master/tram/proc/try_process_order(fence = FALSE)
var/total_coin_value = 0
diff --git a/code/game/objects/items/harpoon_gun.dm b/code/game/objects/items/harpoon_gun.dm
index 42f2431a4fd..f323756ed0a 100644
--- a/code/game/objects/items/harpoon_gun.dm
+++ b/code/game/objects/items/harpoon_gun.dm
@@ -90,7 +90,7 @@
var/list/turf_list = (getline(user, attacked_atom) - get_turf(src))
for(var/turf/singular_turf as anything in turf_list)
- if(!is_blocked_turf(singular_turf))
+ if(!singular_turf.is_blocked_turf())
continue
attacked_atom = singular_turf
break
diff --git a/code/game/objects/items/scrolls.dm b/code/game/objects/items/scrolls.dm
index 6927643a975..e2be0e9b9aa 100644
--- a/code/game/objects/items/scrolls.dm
+++ b/code/game/objects/items/scrolls.dm
@@ -60,7 +60,7 @@
smoke.start()
var/list/L = list()
for(var/turf/T in get_area_turfs(thearea.type))
- if(!is_blocked_turf(T))
+ if(!T.is_blocked_turf())
L += T
if(!L.len)
diff --git a/code/game/objects/lighting/rogue_fires.dm b/code/game/objects/lighting/rogue_fires.dm
index 6f50d5597e9..30c94e5b9fe 100644
--- a/code/game/objects/lighting/rogue_fires.dm
+++ b/code/game/objects/lighting/rogue_fires.dm
@@ -387,7 +387,7 @@
/obj/machinery/light/fueled/chand/Initialize()
. = ..()
- AddElement(/datum/element/give_turf_traits, string_list(list(TRAIT_IMMERSE_STOPPED)))
+ AddElement(/datum/element/give_turf_traits, string_list(list(TRAIT_IMMERSE_STOPPED, TRAIT_CHASM_STOPPED)))
/obj/machinery/light/fueled/chand/attack_hand(mob/user)
if(isliving(user) && on)
diff --git a/code/game/objects/minecart_system/minecart.dm b/code/game/objects/minecart_system/minecart.dm
index 8bc4fb3fc2d..b8c91ec5128 100644
--- a/code/game/objects/minecart_system/minecart.dm
+++ b/code/game/objects/minecart_system/minecart.dm
@@ -245,7 +245,6 @@
return
obj_flags |= BLOCK_Z_OUT_DOWN
- AddElement(/datum/element/give_turf_traits, string_list(list(TRAIT_IMMERSE_STOPPED)))
var/movedir = bumped_atom.dir
var/turf/next_turf = get_step(src, movedir)
if(!can_travel_on_turf(next_turf, movedir))
@@ -278,6 +277,7 @@
if(momentum <= 0)
return
+ AddElement(/datum/element/give_turf_traits, string_list(list(TRAIT_IMMERSE_STOPPED, TRAIT_CHASM_STOPPED)))
setDir(movedir)
var/datum/move_loop/loop = SSmove_manager.move(src, dir, delay = calculate_delay(), subsystem = SSminecarts, flags = MOVEMENT_LOOP_START_FAST|MOVEMENT_LOOP_IGNORE_PRIORITY, move_loop_type = /datum/move_loop/minecart)
RegisterSignal(loop, COMSIG_MOVELOOP_PREPROCESS_CHECK, PROC_REF(check_rail))
@@ -290,7 +290,7 @@
stack_trace("Mine cart moving on 0 momentum!")
SSmove_manager.stop_looping(src, SSminecarts)
obj_flags &= ~BLOCK_Z_OUT_DOWN
- RemoveElement(/datum/element/give_turf_traits, string_list(list(TRAIT_IMMERSE_STOPPED)))
+ RemoveElement(/datum/element/give_turf_traits, string_list(list(TRAIT_IMMERSE_STOPPED, TRAIT_CHASM_STOPPED)))
momentum = 0
return MOVELOOP_SKIP_STEP
// Forced to not move
@@ -345,7 +345,7 @@
// Can't go straight and cant turn = STOP
SSmove_manager.stop_looping(src, SSminecarts)
obj_flags &= ~BLOCK_Z_OUT_DOWN
- RemoveElement(/datum/element/give_turf_traits, string_list(list(TRAIT_IMMERSE_STOPPED)))
+ RemoveElement(/datum/element/give_turf_traits, string_list(list(TRAIT_IMMERSE_STOPPED, TRAIT_CHASM_STOPPED)))
if(momentum >= 12)
visible_message(span_warning("[src] comes to a violent halt!"))
throw_contents()
@@ -367,7 +367,7 @@
visible_message(span_notice("[src] comes to a stop."))
SSmove_manager.stop_looping(src, SSminecarts)
obj_flags &= ~BLOCK_Z_OUT_DOWN
- RemoveElement(/datum/element/give_turf_traits, string_list(list(TRAIT_IMMERSE_STOPPED)))
+ RemoveElement(/datum/element/give_turf_traits, string_list(list(TRAIT_IMMERSE_STOPPED, TRAIT_CHASM_STOPPED)))
momentum = 0
return
check_powered()
@@ -377,7 +377,7 @@
if(momentum <= 0)
SSmove_manager.stop_looping(src, SSminecarts)
obj_flags &= ~BLOCK_Z_OUT_DOWN
- RemoveElement(/datum/element/give_turf_traits, string_list(list(TRAIT_IMMERSE_STOPPED)))
+ RemoveElement(/datum/element/give_turf_traits, string_list(list(TRAIT_IMMERSE_STOPPED, TRAIT_CHASM_STOPPED)))
momentum = 0
visible_message(span_notice("[src] comes to a slow stop."))
return
diff --git a/code/game/objects/structures/bridge.dm b/code/game/objects/structures/bridge.dm
index 70006e9783c..34a2df3d600 100644
--- a/code/game/objects/structures/bridge.dm
+++ b/code/game/objects/structures/bridge.dm
@@ -18,7 +18,7 @@
AddElement(/datum/element/footstep_override, footstep = FOOTSTEP_OLDWOOD, barefootstep = FOOTSTEP_OLDWOOD)
var/static/list/loc_connections = list(COMSIG_ATOM_EXIT = PROC_REF(on_exit))
AddElement(/datum/element/connect_loc, loc_connections)
- AddElement(/datum/element/give_turf_traits, string_list(list(TRAIT_IMMERSE_STOPPED)))
+ AddElement(/datum/element/give_turf_traits, string_list(list(TRAIT_IMMERSE_STOPPED, TRAIT_CHASM_STOPPED)))
// Shift sprite down when going east/west so that people properly walk on the bridge
if(dir == EAST || dir == WEST)
pixel_y = base_pixel_y - 7
@@ -86,7 +86,7 @@
if(obj_broken)
obj_broken = FALSE // Not obj_broken anymore
obj_flags = initial(obj_flags) // so we set back initial flags
- AddElement(/datum/element/give_turf_traits, string_list(list(TRAIT_IMMERSE_STOPPED)))
+ AddElement(/datum/element/give_turf_traits, string_list(list(TRAIT_IMMERSE_STOPPED, TRAIT_CHASM_STOPPED)))
update_appearance(UPDATE_ICON_STATE)
/// Stakes at the end of a makeshift bridge
diff --git a/code/game/objects/structures/fluff.dm b/code/game/objects/structures/fluff.dm
index aae69ccbce4..2499108d60a 100644
--- a/code/game/objects/structures/fluff.dm
+++ b/code/game/objects/structures/fluff.dm
@@ -287,7 +287,7 @@
attacked_sound = list('sound/combat/hits/onmetal/grille (1).ogg', 'sound/combat/hits/onmetal/grille (2).ogg', 'sound/combat/hits/onmetal/grille (3).ogg')
redstone_structure = TRUE
var/togg = FALSE
- var/static/list/turf_traits = list(TRAIT_IMMERSE_STOPPED)
+ var/static/list/turf_traits = list(TRAIT_IMMERSE_STOPPED, TRAIT_CHASM_STOPPED)
/obj/structure/bars/grille/Initialize()
AddElement(/datum/element/footstep_override, footstep = FOOTSTEP_CATWALK)
@@ -332,7 +332,7 @@
/obj/structure/plank/Initialize()
. = ..()
- AddElement(/datum/element/give_turf_traits, string_list(list(TRAIT_IMMERSE_STOPPED)))
+ AddElement(/datum/element/give_turf_traits, string_list(list(TRAIT_IMMERSE_STOPPED, TRAIT_CHASM_STOPPED)))
/obj/structure/bars/pipe
name = "bronze pipe"
@@ -351,7 +351,7 @@
/obj/structure/bars/pipe/Initialize()
. = ..()
AddElement(/datum/element/footstep_override, footstep = FOOTSTEP_CATWALK)
- AddElement(/datum/element/give_turf_traits, string_list(list(TRAIT_IMMERSE_STOPPED)))
+ AddElement(/datum/element/give_turf_traits, string_list(list(TRAIT_IMMERSE_STOPPED, TRAIT_CHASM_STOPPED)))
/obj/structure/bars/pipe/left
name = "bronze pipe"
diff --git a/code/game/objects/structures/newtree.dm b/code/game/objects/structures/newtree.dm
index e04ea617adc..e6efbf21765 100644
--- a/code/game/objects/structures/newtree.dm
+++ b/code/game/objects/structures/newtree.dm
@@ -23,7 +23,7 @@
/obj/structure/flora/newtree/Initialize()
. = ..()
GenerateTree()
- AddElement(/datum/element/give_turf_traits, string_list(list(TRAIT_IMMERSE_STOPPED)))
+ AddElement(/datum/element/give_turf_traits, string_list(list(TRAIT_IMMERSE_STOPPED, TRAIT_CHASM_STOPPED)))
/obj/structure/flora/newtree/Destroy()
SStreesetup.initialize_me -= src
@@ -393,7 +393,7 @@
100,\
extrarange = SHORT_RANGE_SOUND_EXTRARANGE,\
)
- AddElement(/datum/element/give_turf_traits, string_list(list(TRAIT_IMMERSE_STOPPED)))
+ AddElement(/datum/element/give_turf_traits, string_list(list(TRAIT_IMMERSE_STOPPED, TRAIT_CHASM_STOPPED)))
update_appearance(UPDATE_OVERLAYS)
/obj/structure/flora/newbranch/update_overlays()
diff --git a/code/game/objects/structures/putrid/actions/mob_actions/burrow_through.dm b/code/game/objects/structures/putrid/actions/mob_actions/burrow_through.dm
index 202795b8096..2d0e96c5022 100644
--- a/code/game/objects/structures/putrid/actions/mob_actions/burrow_through.dm
+++ b/code/game/objects/structures/putrid/actions/mob_actions/burrow_through.dm
@@ -30,7 +30,7 @@
return FALSE
// Check if target is a wall
- if(!is_blocked_turf(target_turf))
+ if(!target_turf.is_blocked_turf())
owner.balloon_alert(owner, "must target a wall")
return FALSE
@@ -51,7 +51,7 @@
if(!current_turf)
break
- if(is_blocked_turf(current_turf))
+ if(current_turf.is_blocked_turf())
wall_turfs += current_turf
current_turf = get_step(current_turf, wall_dir)
else
@@ -143,7 +143,7 @@
if(!adjacent_turf)
return 0
- if(is_blocked_turf(adjacent_turf))
+ if(adjacent_turf.is_blocked_turf())
// Check if we can actually burrow through
var/turf/check_turf = adjacent_turf
// Count wall depth
@@ -151,7 +151,7 @@
if(!check_turf)
break
- if(is_blocked_turf(check_turf))
+ if(check_turf.is_blocked_turf())
check_turf = get_step(check_turf, dir_to_target)
else
// Found exit, this is valid
diff --git a/code/game/objects/structures/redstone.dm b/code/game/objects/structures/redstone.dm
index 83b54f19d82..9d5e55d051e 100644
--- a/code/game/objects/structures/redstone.dm
+++ b/code/game/objects/structures/redstone.dm
@@ -404,7 +404,7 @@ GLOBAL_LIST_EMPTY(redstone_objs)
var/togg = FALSE
var/base_state = "floorhatch"
resistance_flags = INDESTRUCTIBLE
- var/static/list/turf_traits = list(TRAIT_IMMERSE_STOPPED)
+ var/static/list/turf_traits = list(TRAIT_IMMERSE_STOPPED, TRAIT_CHASM_STOPPED)
/obj/structure/floordoor/Initialize()
AddElement(/datum/element/footstep_override, footstep = FOOTSTEP_OLDWOOD)
diff --git a/code/game/objects/structures/stairs.dm b/code/game/objects/structures/stairs.dm
index fd0be41ed1b..405c3a40e06 100644
--- a/code/game/objects/structures/stairs.dm
+++ b/code/game/objects/structures/stairs.dm
@@ -40,7 +40,7 @@
)
AddElement(/datum/element/connect_loc, exit_connections)
- AddElement(/datum/element/give_turf_traits, string_list(list(TRAIT_IMMERSE_STOPPED)))
+ AddElement(/datum/element/give_turf_traits, string_list(list(TRAIT_IMMERSE_STOPPED, TRAIT_CHASM_STOPPED)))
/obj/structure/stairs/Destroy()
if(directly_above)
@@ -187,12 +187,12 @@
/// What happens when a mob tumbles down the stairs
/obj/structure/stairs/proc/on_fall(mob/living/falling)
- falling.AdjustParalyzed(1 SECONDS)
- falling.OffBalance(1 SECONDS)
- falling.AdjustKnockdown(2.5 SECONDS)
+ falling.AdjustParalyzed(0.5 SECONDS)
+ falling.OffBalance(0.5 SECONDS)
+ falling.AdjustKnockdown(1.25 SECONDS)
falling.spin(1 SECONDS, 0.25 SECONDS)
falling.apply_damage(rand(4, 8), BRUTE, spread_damage = TRUE)
- SSmove_manager.move_towards(falling, get_ranged_target_turf(src, REVERSE_DIR(dir), 2), delay = 0.4 SECONDS, timeout = 1 SECONDS)
+ SSmove_manager.move_towards(falling, get_ranged_target_turf(src, REVERSE_DIR(dir), 2), delay = 0.2 SECONDS, timeout = 0.5 SECONDS)
/obj/structure/stairs/proc/isTerminator() //If this is the last stair in a chain and should move mobs up
if(terminator_mode != STAIR_TERMINATOR_AUTOMATIC)
diff --git a/code/game/rotational_objects/fluid_objects/pipe_system.dm b/code/game/rotational_objects/fluid_objects/pipe_system.dm
index 61b3582cc35..2810c49dff5 100644
--- a/code/game/rotational_objects/fluid_objects/pipe_system.dm
+++ b/code/game/rotational_objects/fluid_objects/pipe_system.dm
@@ -25,7 +25,7 @@
/obj/structure/water_pipe/Initialize()
. = ..()
AddElement(/datum/element/footstep_override, footstep = FOOTSTEP_CATWALK)
- AddElement(/datum/element/give_turf_traits, string_list(list(TRAIT_IMMERSE_STOPPED)))
+ AddElement(/datum/element/give_turf_traits, string_list(list(TRAIT_IMMERSE_STOPPED, TRAIT_CHASM_STOPPED)))
for(var/direction in GLOB.cardinals_multiz)
var/turf/cardinal_turf = get_step_multiz(src, direction)
for(var/obj/structure/water_pipe/pipe in cardinal_turf)
diff --git a/code/game/turfs/closed/_closed.dm b/code/game/turfs/closed/_closed.dm
index 608c35dc59d..1dec8669ec7 100644
--- a/code/game/turfs/closed/_closed.dm
+++ b/code/game/turfs/closed/_closed.dm
@@ -162,17 +162,25 @@
if(!user.can_z_move(UP, start = get_turf(user), z_move_flags = Z_MOVE_CLIMBING_FLAGS))
return
var/turf/target = GET_TURF_ABOVE(src)
- if(!target || !istype(target, /turf/open))
+ // EXPERIMENTAL: Allow climbing up through railings to replicate old behavior. Revisit when refactoring CanPass.
+ if(target.is_blocked_turf(exclude_mobs = TRUE, ignore_atoms = list(/obj/structure/fluff/railing), type_list = TRUE))
+ target = GET_TURF_ABOVE(user)
+ if(target.zPassOut(DOWN) || target.is_blocked_turf(exclude_mobs = TRUE, ignore_atoms = list(/obj/structure/fluff/railing), type_list = TRUE))
to_chat(user, span_warning("I can't climb here."))
return
- for(var/obj/structure/F in target)
- if(F && (F.density && !F.climbable))
- to_chat(user, span_warning("I can't climb here."))
- return
- INVOKE_ASYNC(src, PROC_REF(start_traveling), user, UP)
-/turf/closed/proc/start_traveling(mob/living/user, direction)
- var/turf/target = get_step_multiz(src, direction)
+ // if(!target || !istype(target, /turf/open))
+ // to_chat(user, span_warning("I can't climb here."))
+ // return
+ // for(var/obj/structure/F in target)
+ // if(F && (F.density && !F.climbable))
+ // to_chat(user, span_warning("I can't climb here."))
+ // return
+ INVOKE_ASYNC(src, PROC_REF(start_traveling), user, target)
+
+/turf/closed/proc/start_traveling(mob/living/user, target)
+ if(!target)
+ return
var/climbsound = 'sound/foley/climb.ogg'
var/myskill = GET_MOB_SKILL_VALUE_OLD(user, /datum/attribute/skill/misc/climbing)
if(locate(/obj/structure/table) in user.loc)
diff --git a/code/game/turfs/open/dungeon_trap.dm b/code/game/turfs/open/dungeon_trap.dm
index c068d4219ad..db25cfbd069 100644
--- a/code/game/turfs/open/dungeon_trap.dm
+++ b/code/game/turfs/open/dungeon_trap.dm
@@ -8,23 +8,36 @@
smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER
smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_TURF_CHASM
smoothing_list = SMOOTH_GROUP_TURF_CHASM
+ density = TRUE //This will prevent hostile mobs from pathing into chasms, while the canpass override will still let it function like an open turf
bullet_bounce_sound = null //abandon all hope ye who enter
- path_weight = 500
dynamic_lighting = 1
+/// Lets people walk into chasms.
+/turf/open/dungeon_trap/CanAllowThrough(atom/movable/mover, border_dir)
+ . = ..()
+ return TRUE
+
/turf/open/dungeon_trap/can_cross_safely(atom/movable/traveler)
- return HAS_TRAIT(traveler, TRAIT_MOVE_FLYING) || !traveler.can_z_move(DOWN, src, z_move_flags = ZMOVE_FALL_FLAGS)
+ return HAS_TRAIT(src, TRAIT_CHASM_STOPPED) || (traveler.movement_type & MOVETYPES_NOT_TOUCHING_GROUND)
+
+///Makes movables fall when forceMove()'d to this turf.
+/turf/open/dungeon_trap/Entered(atom/movable/movable)
+ . = ..()
+ if(!movable.currently_z_moving)
+ handle_falling_movement(movable, 1)
/turf/open/dungeon_trap/zImpact(atom/movable/falling, levels, turf/prev_turf, flags)
- if(!isobj(falling) && !ismob(falling))
- return ..()
- if(!length(GLOB.dungeon_entries) || !length(GLOB.dungeon_exits))
- return ..()
. = handle_falling_movement(falling, levels) // I hate this
if(!.)
return ..()
/turf/open/dungeon_trap/proc/handle_falling_movement(atom/movable/falling, levels)
+ if(HAS_TRAIT(src, TRAIT_CHASM_STOPPED))
+ return
+ if(!isobj(falling) && !ismob(falling))
+ return
+ if(!length(GLOB.dungeon_entries) || !length(GLOB.dungeon_exits))
+ return
var/turf/target = get_dungeon_tile()
if(!target)
return FALSE
diff --git a/code/game/turfs/open/openspace.dm b/code/game/turfs/open/openspace.dm
index fdf8b780f94..bcc86cd3206 100644
--- a/code/game/turfs/open/openspace.dm
+++ b/code/game/turfs/open/openspace.dm
@@ -144,6 +144,7 @@
if(user.m_intent != MOVE_INTENT_SNEAK)
playsound(user, 'sound/foley/climb.ogg', 100, TRUE)
if(do_after(user, 3 SECONDS, src))
+ user.set_currently_z_moving(CURERENTLY_Z_CLIMBING_DOWN) // EXPERIMENTAL: Climbing down onto openspace should make you fall
user.zMove(target = target, z_move_flags = Z_MOVE_CLIMBING_FLAGS)
if(user.m_intent != MOVE_INTENT_SNEAK)
playsound(user, 'sound/foley/climb.ogg', 100, TRUE)
diff --git a/code/game/turfs/open/water.dm b/code/game/turfs/open/water.dm
index 12b2b616f52..313ba1cd90d 100644
--- a/code/game/turfs/open/water.dm
+++ b/code/game/turfs/open/water.dm
@@ -495,7 +495,7 @@
movable.set_currently_z_moving(CURRENTLY_Z_FALLING_FROM_MOVE)
///Makes movables fall when forceMove()'d to this turf.
-/turf/open/openspace/Entered(atom/movable/movable)
+/turf/open/water/Entered(atom/movable/movable)
. = ..()
if(!HAS_TRAIT(src, TRAIT_IMMERSE_STOPPED))
return
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index 2814f6c1bde..19dd8cc7e5c 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -243,7 +243,7 @@
// If the thing is dense AND we're including mobs or the thing isn't a mob AND if there's a source atom and
// it cannot pass through the thing on the turf, we consider the turf blocked.
if(movable_content.density && (!exclude_mobs || !ismob(movable_content)))
- if(source_atom && movable_content.CanPass(source_atom, get_dir(src, source_atom)))
+ if(source_atom && movable_content.CanPass(source_atom, src))
continue
return TRUE
return FALSE
@@ -299,8 +299,8 @@
var/list/falling_mov_names = list()
for(var/atom/movable/falling_mov as anything in falling_movables)
falling_mov_names += falling_mov.name
- for(var/i in contents)
- var/atom/thing = i
+
+ for(var/atom/thing as anything in contents)
flags |= thing.intercept_zImpact(falling_movables, levels)
if(flags & FALL_STOP_INTERCEPTING)
break
@@ -308,8 +308,10 @@
if(prev_turf && !(flags & FALL_NO_MESSAGE))
for(var/mov_name in falling_mov_names)
prev_turf.visible_message(span_danger("\The [mov_name] falls through [prev_turf]!"))
+
if(!(flags & FALL_INTERCEPTED) && zFall(falling, levels + 1))
return FALSE
+
for(var/atom/movable/falling_mov as anything in falling_movables)
if(!(flags & FALL_RETAIN_PULL))
falling_mov.stop_pulling()
@@ -317,6 +319,7 @@
falling_mov.onZImpact(src, levels)
if(falling_mov.pulledby && (falling_mov.z != falling_mov.pulledby.z || get_dist(falling_mov, falling_mov.pulledby) > 1))
falling_mov.pulledby.stop_pulling()
+
return TRUE
//There's a lot of QDELETED() calls here if someone can figure out how to optimize this but not runtime when something gets deleted by a Bump/CanPass/Cross call, lemme know or go ahead and fix this mess - kevinz000
diff --git a/code/modules/antagonists/villain/neu_vampires/coven_action.dm b/code/modules/antagonists/villain/neu_vampires/coven_action.dm
index 263ca042839..da5147a174d 100644
--- a/code/modules/antagonists/villain/neu_vampires/coven_action.dm
+++ b/code/modules/antagonists/villain/neu_vampires/coven_action.dm
@@ -51,7 +51,7 @@
SIGNAL_REMOVETRAIT(TRAIT_PACIFISM),
)
- RegisterSignal(owner, relevant_signals, PROC_REF(update_mob_buttons))
+ RegisterSignals(owner, relevant_signals, PROC_REF(update_mob_buttons))
/datum/action/coven/proc/update_mob_buttons()
owner.update_action_buttons()
diff --git a/code/modules/antagonists/villain/neu_vampires/covens/coven_powers/obfuscate.dm b/code/modules/antagonists/villain/neu_vampires/covens/coven_powers/obfuscate.dm
index 4646d82dcbb..a9c29a3cdde 100644
--- a/code/modules/antagonists/villain/neu_vampires/covens/coven_powers/obfuscate.dm
+++ b/code/modules/antagonists/villain/neu_vampires/covens/coven_powers/obfuscate.dm
@@ -61,7 +61,7 @@
/datum/coven_power/obfuscate/cloak_of_shadows/activate()
. = ..()
- RegisterSignal(owner, aggressive_signals, PROC_REF(on_combat_signal), override = TRUE)
+ RegisterSignals(owner, aggressive_signals, PROC_REF(on_combat_signal), override = TRUE)
RegisterSignal(owner, COMSIG_MOVABLE_MOVED, PROC_REF(handle_move))
owner.alpha = 10
diff --git a/code/modules/antagonists/villain/werewolf/werewolf_transformation.dm b/code/modules/antagonists/villain/werewolf/werewolf_transformation.dm
index 2ec45579d28..39f52b58e90 100644
--- a/code/modules/antagonists/villain/werewolf/werewolf_transformation.dm
+++ b/code/modules/antagonists/villain/werewolf/werewolf_transformation.dm
@@ -63,6 +63,7 @@
if(!try_transform_checks()) return
var/mob/living/carbon/human/human_user = owner.current
+ human_user.buckled?.unbuckle_mob(human_user, TRUE)
if(human_user.cmode)
human_user.toggle_cmode()
@@ -147,8 +148,8 @@
to_chat(caster_mob, span_userdanger("The beast within returns to slumber."))
playsound(caster_mob, pick('sound/combat/gib (1).ogg','sound/combat/gib (2).ogg'), 200, FALSE, 3)
- caster_mob.Knockdown(30)
- caster_mob.Stun(30)
+ caster_mob.Knockdown(1.5 SECONDS)
+ caster_mob.Stun(1.5 SECONDS)
caster_mob.rage_datum.remove_secondary()
caster_mob.rage_datum.rage_change_on_life += transformed_rage_decay
caster_mob.apply_status_effect(/datum/status_effect/debuff/barbfalter/werewolf_untransform)
diff --git a/code/modules/crafting/alchemy/essence_machines/essence_gauntlet/spells/chill.dm b/code/modules/crafting/alchemy/essence_machines/essence_gauntlet/spells/chill.dm
index 378ba2a0354..ec8dfedbf3a 100644
--- a/code/modules/crafting/alchemy/essence_machines/essence_gauntlet/spells/chill.dm
+++ b/code/modules/crafting/alchemy/essence_machines/essence_gauntlet/spells/chill.dm
@@ -32,7 +32,7 @@
/obj/structure/ice_zone/Initialize()
. = ..()
- AddElement(/datum/element/give_turf_traits, string_list(list(TRAIT_IMMERSE_STOPPED)))
+ AddElement(/datum/element/give_turf_traits, string_list(list(TRAIT_IMMERSE_STOPPED, TRAIT_CHASM_STOPPED)))
propagate_temp_change(-30, 8, 0.9, 2) // Cooling effect
/obj/structure/ice_zone/Crossed(atom/movable/AM)
diff --git a/code/modules/crafting/alchemy/essence_machines/essence_gauntlet/spells/ice_bridge.dm b/code/modules/crafting/alchemy/essence_machines/essence_gauntlet/spells/ice_bridge.dm
index ba3b8bcc740..30ccf9b278b 100644
--- a/code/modules/crafting/alchemy/essence_machines/essence_gauntlet/spells/ice_bridge.dm
+++ b/code/modules/crafting/alchemy/essence_machines/essence_gauntlet/spells/ice_bridge.dm
@@ -38,7 +38,7 @@
/obj/structure/ice_bridge/Initialize()
. = ..()
- AddElement(/datum/element/give_turf_traits, string_list(list(TRAIT_IMMERSE_STOPPED)))
+ AddElement(/datum/element/give_turf_traits, string_list(list(TRAIT_IMMERSE_STOPPED, TRAIT_CHASM_STOPPED)))
propagate_temp_change(-20, 8, 0.5, 2) // Cooling effect
/obj/structure/ice_bridge/Destroy()
diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm
index 722a83a307f..b0fe380eaf8 100644
--- a/code/modules/food_and_drinks/food/snacks.dm
+++ b/code/modules/food_and_drinks/food/snacks.dm
@@ -253,9 +253,10 @@ All foods are distributed among various categories. Use common sense.
temp_modifier = max(0.2, 1.0 - ((20 -turf_temp) / 3) * 0.2)
// Minimum 0.2x speed (cold slows but doesn't completely stop rot)
- var/obj/structure/fake_machine/vendor = locate(/obj/structure/fake_machine/vendor) in get_turf(src)
+ var/turf/location = get_turf(src)
+ var/obj/structure/fake_machine/vendor = locate(/obj/structure/fake_machine/vendor) in location
if(!istype(loc, /obj/item/storage/backpack/backpack/artibackpack))
- var/obj/structure/table/located = locate(/obj/structure/table) in loc
+ var/obj/structure/table/located = locate(/obj/structure/table) in location
if(located || vendor || chest)
warming -= 4 * temp_modifier
else
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 2a55a75600e..d7f50ea2bc8 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -658,7 +658,7 @@
if(T)
T.add_vomit_floor(src, VOMIT_TOXIC)//toxic barf looks different
T = get_step(T, dir)
- if (is_blocked_turf(T))
+ if (T.is_blocked_turf())
break
return TRUE
diff --git a/code/modules/mob/living/carbon/carbon_shock.dm b/code/modules/mob/living/carbon/carbon_shock.dm
index c78ab540c9b..a6764a13051 100644
--- a/code/modules/mob/living/carbon/carbon_shock.dm
+++ b/code/modules/mob/living/carbon/carbon_shock.dm
@@ -183,6 +183,7 @@
if((shock_stage >= SHOCK_STAGE_3) && (previous_shock_stage < SHOCK_STAGE_3))
custom_pain("[pick("The pain is excruciating", "Please, just end the pain", "My whole body is going numb")]!", 40, nopainloss = TRUE)
+ add_stress(/datum/stress_event/painmax)
if((shock_stage >= SHOCK_STAGE_4) && (previous_shock_stage < SHOCK_STAGE_4))
emote("becomes limp.")
@@ -208,13 +209,11 @@
if((shock_stage >= SHOCK_STAGE_6) && (previous_shock_stage >= SHOCK_STAGE_6))
if(DT_PROB(1, delta_time))
if(!IsUnconscious())
- custom_pain("[pick("I black out", "I feel like i could die at any moment now", "I'm about to lose consciousness")]!", shock_stage, nopainloss = TRUE)
+ custom_pain("[pick("I black out", "I feel like I could die at any moment now", "I'm about to lose consciousness")]!", shock_stage, nopainloss = TRUE)
if(!HAS_TRAIT(src, TRAIT_NOPAINSTUN))
Unconscious(1 SECONDS)
if((shock_stage >= SHOCK_STAGE_7) && (previous_shock_stage < SHOCK_STAGE_7))
- if(body_position != LYING_DOWN)
- emote("can no longer stand, collapsing!")
emote("gargle")
if(!HAS_TRAIT(src, TRAIT_NOPAINSTUN))
Paralyze(5 SECONDS)
diff --git a/code/modules/spells/spell_types/undirected/bardic/buff_picker.dm b/code/modules/spells/spell_types/undirected/bardic/buff_picker.dm
index aa3285cf0c6..ae36e739968 100644
--- a/code/modules/spells/spell_types/undirected/bardic/buff_picker.dm
+++ b/code/modules/spells/spell_types/undirected/bardic/buff_picker.dm
@@ -8,17 +8,6 @@
selected_instrument_buffs = list()
return selected_instrument_buffs
-/mob/living/carbon/human/proc/get_max_instrument_buff_slots()
- var/music_level = floor(GET_MOB_SKILL_VALUE_OLD(src, /datum/attribute/skill/misc/music))
- switch(music_level)
- if(1 to 3)
- return 1
- if(4 to 5)
- return 2
- if(6 to INFINITY)
- return 3
- return 1
-
/datum/buff_picker_ui
var/mob/living/carbon/human/owner
@@ -41,7 +30,7 @@
/datum/buff_picker_ui/ui_data(mob/user)
var/list/data = list()
- data["buff_slots_max"] = owner.get_max_instrument_buff_slots()
+ data["buff_slots_max"] = 1
var/music_level = floor(GET_MOB_SKILL_VALUE_OLD(owner, /datum/attribute/skill/misc/music))
var/list/available_buffs = list()
@@ -104,7 +93,7 @@
if(path_str in selected)
selected.Remove(path_str)
else
- if(selected.len >= owner.get_max_instrument_buff_slots())
+ if(selected.len >= 1)
return TRUE
selected += path_str
return TRUE
diff --git a/code/modules/spells/spell_types/undirected/bardic/songbook.dm b/code/modules/spells/spell_types/undirected/bardic/songbook.dm
index d5b9a5c1bea..f8454e766ae 100644
--- a/code/modules/spells/spell_types/undirected/bardic/songbook.dm
+++ b/code/modules/spells/spell_types/undirected/bardic/songbook.dm
@@ -81,7 +81,7 @@ GLOBAL_LIST_INIT(learnable_songs, list(
data["has_bardic_training"] = TRUE
var/music_level = floor(GET_MOB_SKILL_VALUE_OLD(owner, /datum/attribute/skill/misc/music))
- data["buff_slots_max"] = owner.get_max_instrument_buff_slots()
+ data["buff_slots_max"] = 1
var/list/available_buffs = list()
var/list/buff_options = list(
@@ -194,7 +194,7 @@ GLOBAL_LIST_INIT(learnable_songs, list(
if(path_str in selected)
selected.Remove(path_str)
else
- if(selected.len >= owner.get_max_instrument_buff_slots())
+ if(selected.len >= 1)
return TRUE // At cap, silently reject
selected += path_str
return TRUE
diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm
index 352b4e9fd97..d1a30eb7475 100644
--- a/code/modules/surgery/bodyparts/_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/_bodyparts.dm
@@ -849,6 +849,10 @@
multiplier *= 0.75
if(multiplier <= 0)
return 0
+ if(ishuman(owner))
+ var/mob/living/carbon/human/human_owner = owner
+ if(human_owner.dna?.species)
+ multiplier *= human_owner.dna?.species.pain_mod
var/constant_pain = 0
constant_pain += SHOCK_MOD_BRUTE * brute_dam
constant_pain += SHOCK_MOD_BURN * burn_dam
diff --git a/code/modules/surgery/bodyparts/bodypart_examine.dm b/code/modules/surgery/bodyparts/bodypart_examine.dm
index f4caae96fa3..f4146567d70 100644
--- a/code/modules/surgery/bodyparts/bodypart_examine.dm
+++ b/code/modules/surgery/bodyparts/bodypart_examine.dm
@@ -235,9 +235,9 @@
for(var/obj/item/organ/possible_artery in shuffle(getorganslotlist(ORGAN_SLOT_ARTERY)))
if(possible_artery.is_bruised())
if(get_incision())
- status += "[possible_artery.name]'s been cut."
+ status += span_userdanger(uppertext("[possible_artery.name]"))
else
- status += "spreading bruises underneath the [parse_zone(possible_artery.zone)]."
+ status += span_bloody("bruised [parse_zone(possible_artery.zone)]")
if(skeletonized)
status += "SKELETON"
diff --git a/code/modules/surgery/organs/external/wings/functional_wings.dm b/code/modules/surgery/organs/external/wings/functional_wings.dm
index f0f34cc231a..511980363ac 100644
--- a/code/modules/surgery/organs/external/wings/functional_wings.dm
+++ b/code/modules/surgery/organs/external/wings/functional_wings.dm
@@ -124,22 +124,24 @@
human.update_body_parts()
human.physiology.stun_mod *= 0.5
- remove_signals(human)
passtable_off(human, SPECIES_FLIGHT_TRAIT)
deltimer(flight_timer)
QDEL_NULL(shadow)
+ // /datum/element/movetype_handler will zFall owner when removing TRAIT_MOVE_FLOATING
+ // In order to prevent fall damage, remove signals after TRAIT_MOVE_FLOATING is removed.
if(!drop_flyer)
var/turf/old_turf = get_turf(human)
- old_turf.zFall(human)
+ REMOVE_TRAIT(human, TRAIT_MOVE_FLOATING, SPECIES_FLIGHT_TRAIT)
+ remove_signals(human)
if(old_turf != get_turf(human))
flight_animation(human)
else
- to_chat(human, span_notice("My wings give out, and I suddenly stop flying!"))
+ to_chat(human, span_userdanger("My wings give out, and I suddenly stop flying!"))
+ remove_signals(human)
+ REMOVE_TRAIT(human, TRAIT_MOVE_FLOATING, SPECIES_FLIGHT_TRAIT)
- // /datum/element/movetype_handler will zFall owner when removing TRAIT_MOVE_FLOATING
- REMOVE_TRAIT(human, TRAIT_MOVE_FLOATING, SPECIES_FLIGHT_TRAIT)
playsound(human, 'sound/mobs/wingflap.ogg', 75, FALSE)
fly?.build_all_button_icons(update_flags = UPDATE_BUTTON_BACKGROUND)
@@ -158,13 +160,15 @@
RegisterSignal(carbon_owner, COMSIG_MOVABLE_MOVED, PROC_REF(check_movement))
RegisterSignal(carbon_owner, COMSIG_LIVING_SET_BODY_POSITION, PROC_REF(check_laying))
RegisterSignal(carbon_owner, SIGNAL_ADDTRAIT(TRAIT_IMMOBILIZED), PROC_REF(fall))
+ RegisterSignal(carbon_owner, COMSIG_LIVING_Z_IMPACT, PROC_REF(z_impact_react))
/obj/item/organ/wings/flight/proc/remove_signals(mob/living/carbon/carbon_owner)
UnregisterSignal(carbon_owner, list(
COMSIG_MOB_APPLY_DAMAGE,
COMSIG_MOVABLE_MOVED,
COMSIG_LIVING_SET_BODY_POSITION,
- SIGNAL_ADDTRAIT(TRAIT_IMMOBILIZED)
+ SIGNAL_ADDTRAIT(TRAIT_IMMOBILIZED),
+ COMSIG_LIVING_Z_IMPACT
))
/obj/item/organ/wings/flight/proc/check_damage(datum/source, damage, damagetype, def_zone)
@@ -220,6 +224,10 @@
return
stop_flying(source, TRUE)
+/obj/item/organ/wings/flight/proc/z_impact_react(datum/source, levels, turf/fell_on)
+ SIGNAL_HANDLER
+ return ZIMPACT_CANCEL_DAMAGE
+
/obj/item/organ/wings/flight/harpy
name = "harpy wings"
accessory_type = /datum/sprite_accessory/wings/large/harpyswept
diff --git a/strings/traumas.json b/strings/traumas.json
index 6d52af57925..8cc04698ac8 100644
--- a/strings/traumas.json
+++ b/strings/traumas.json
@@ -1,111 +1,176 @@
{
- "brain_damage": [
- ],
-
- "mutations": [
- "telikesis",
- "halk",
- "eppilapse",
- "kamelien",
- "eksrey",
- "glowey skin",
- "fungal tb",
- "stun gloves"
- ],
-
- "george": [
- "joerge",
- "george",
- "gorge",
- "gdoruge"
- ],
-
- "mellens": [
- "mellens",
- "melons",
- "mwrlins"
- ],
-
- "random_gibberish": [
- "g",
- "squid",
- "r",
- "carbon dioxide"
- ],
-
- "y_replacements": [
- "y",
- "i",
- "e"
- ],
-
- "servers": [
- "bager",
- "sybl",
- "mrs sybil",
- "mr basil",
- "mr terry",
- "berry"
- ],
-
- "create_verbs": [
- "spawn",
- "MAke me",
- "creat",
- "tc trade me"
- ],
-
- "create_nouns": [
- "zenomorfs",
- "ayleins",
- "treaitors",
- "sheadow lings",
- "abdoocters",
- "revinent",
- "deval",
- "deth squads",
- "bleb"
- ],
-
- "bug": [
- "",
- "IS TIS A BUG??",
- "SI IST A BUGG/",
- "BUG!!!"
- ],
-
- "semicolon": [
- "",
- ";",
- ".h"
- ],
-
- "god_foe": [
- "MORTALS",
- "HERETICS",
- "INSECTS",
+ "brain_damage": [
+ "@pick(semicolon)IM A PONY NEEEEEEIIIIIIIIIGH",
+ "without oxigen blob don't evoluate?",
+ "@pick(semicolon)CAPTAINS A COMDOM",
+ "can u give me @pick(mutations)?",
+ "THe saiyans screwed",
+ "Bi is THE BEST OF BOTH WORLDS>",
+ "@pick(semicolon)I WANNA PET TEH monkeyS",
+ "stop grifing me!!!!",
+ "SOTP IT#",
+ "shiggey diggey!!",
+ "@pick(semicolon)A PIRATE APPEAR",
+ "FUS RO DAH",
+ "fucking 4rries!",
+ "stat me",
+ ">my face",
+ "roll it easy!",
+ "waaaaaagh!!!",
+ "red wonz go fasta",
+ "FOR TEH EMPRAH",
+ "lol2cat",
+ "dem dwarfs man, dem dwarfs",
+ "SPESS MAHREENS",
+ "hwee did eet fhor khayosss",
+ "lifelike texture ;_;",
+ "luv can bloooom",
+ "PACKETS!!!",
+ "port ba@pick(y_replacements) med!!!!",
+ "REVIRT GON CHEM!!!!!!!!",
+ "youed call her a toeugh bithc",
+ "closd for merbegging",
+ "@pick(semicolon)pray can u @pick(create_verbs) @pick(create_nouns)???",
+ "GEY AWAY FROM ME U GREIFING PRICK!!!!",
+ "ur a fuckeing autist!",
+ "@pick(semicolon)HELP SHITECIRTY MURDERIN MEE!!!",
+ "hwat dose tha @pick(random_gibberish) mean?????",
+ "@pick(semicolon)CAL; TEH SHUTTLE!!!!!",
+ "wearnig siNGUARLTY is.... FINE haHAAA",
+ "@pick(semicolon)AI laW 22 Open door",
+ "@pick(semicolon)this SI mY stATIon......",
+ "who the HELL do u thenk u r?!!!!",
+ "geT THE FUCK OUTTTT",
+ "H U G B O X",
+ "@pick(semicolon)CRASHING THIS STTAYTION WITH NIO SURVIVROS",
+ "@pick(servers) is down!! @pick(bug)",
+ "PSHOOOM",
+ "REMOVE SINGULARITY",
+ "INSTLL TEG",
+ "TURBIN IS BEST ENGIENE",
+ "SOLIRS CAN POWER THE HOLE STATION ANEWAY @pick(bug)",
+ "parasteng was best",
+ "@pick(semicolon)Tajaran has warrrres, if you have coin",
+ "@pick(semicolon)I'VE GOT BALLS OF STEEL",
+ "NO I'M ONNA KILL YOU MOTHERFUCKER OLD STYLE",
+ "i will snatch erry motherfucker birthday",
+ "@pick(semicolon)the ai and borgs are mettacomming I think",
+ "u just did the world a little bit more sad place for someone",
+ "WHERES THE SLIP REWRITE WHERE THR FUCK ID IT?",
+ "@pick(semicolon)N-NYAAAAAA~",
+ "@pick(bug)",
+ "@pick(semicolon)wtf??????????? @pick(bug)",
+ "@pick(semicolon)i ran into the supermattre ten i dsappeard @pick(bug)",
+ "DON'T EVER TUCH ME",
+ "@pick(semicolon)GIVE ME FREE ROBUX PLEASE JUST ENOUGH FOR SHIRT AND PANTS",
+ "its gonna be like 9/11 all over again but insitaead is gonna be a bitc",
+ "@pick(semicolon)How do I set up the. SHow do I set u p the Singu. how I the scrungulartiy????"
+ ],
+
+ "mutations": [
+ "telikesis",
+ "halk",
+ "eppilapse",
+ "kamelien",
+ "eksrey",
+ "glowey skin",
+ "fungal tb",
+ "stun gloves"
+ ],
+
+ "george": [
+ "joerge",
+ "george",
+ "gorge",
+ "gdoruge"
+ ],
+
+ "mellens": [
+ "mellens",
+ "melons",
+ "mwrlins"
+ ],
+
+ "random_gibberish": [
+ "g",
+ "squid",
+ "r",
+ "carbon dioxide"
+ ],
+
+ "y_replacements": [
+ "y",
+ "i",
+ "e"
+ ],
+
+ "servers": [
+ "bager",
+ "sybl",
+ "mrs sybil",
+ "mr basil",
+ "mr terry",
+ "berry"
+ ],
+
+ "create_verbs": [
+ "spawn",
+ "MAke me",
+ "creat",
+ "tc trade me"
+ ],
+
+ "create_nouns": [
+ "zenomorfs",
+ "ayleins",
+ "treaitors",
+ "sheadow lings",
+ "abdoocters",
+ "revinent",
+ "deval",
+ "deth squads",
+ "bleb"
+ ],
+
+ "bug": [
+ "",
+ "IS TIS A BUG??",
+ "SI IST A BUGG/",
+ "BUG!!!"
+ ],
+
+ "semicolon": [
+ "",
+ ";",
+ ".h"
+ ],
+
+ "god_foe": [
+ "MORTALS",
+ "HERETICS",
+ "INSECTS",
"UNBELIEVERS",
"BLASPHEMERS",
"PARASITES",
"WEAKLINGS",
"PEASANTS"
- ],
+ ],
- "god_aggressive": [
- "BEGONE, @pick(god_foe)!",
- "DIE, @pick(god_foe)!",
- "BLEED, @pick(god_foe)!",
+ "god_aggressive": [
+ "BEGONE, @pick(god_foe)!",
+ "DIE, @pick(god_foe)!",
+ "BLEED, @pick(god_foe)!",
"BURN, @pick(god_foe)!",
"ALL WILL FALL BEFORE ME!",
"ENDLESS SUFFERING AWAITS YOU, @pick(god_foe).",
"DEATH TO @pick(god_foe)!"
- ],
+ ],
- "god_neutral": [
- "STOP",
+ "god_neutral": [
+ "STOP",
"HALT.",
- "BE SILENT.",
- "QUIET",
+ "BE SILENT.",
+ "QUIET",
"SEE THE TRUTH BEFORE YOU, MORTALS.",
"MORTALS, SAY YOUR NAME",
"BEGONE, MORTALS.",
@@ -115,19 +180,19 @@
"REST, MORTALS, TOMORROW IS A LONG DAY.",
"YOU MORTALS MAKE ME SICK.",
"HONK..."
- ],
+ ],
- "god_unstun": [
+ "god_unstun": [
"GET UP. I HAVE NO TIME TO LOSE.",
"GET UP, PRIEST.",
"GET UP."
- ],
+ ],
- "god_heal": [
+ "god_heal": [
"YOU WILL LIVE TO SEE ANOTHER DAY.",
"YOU SHALL SURVIVE THIS, MY PRIEST.",
"BE HEALED, PRIEST.",
"YOUR LIFE IS IMPORTANT. KEEP IT."
- ]
+ ]
}