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." - ] + ] }