From 88f259980bac7825416524f5036ab02893c077c2 Mon Sep 17 00:00:00 2001 From: itseasytosee <55666666+itseasytosee@users.noreply.github.com> Date: Fri, 21 Jul 2023 00:58:05 -0500 Subject: [PATCH] The Leaning Update (and Density Refractor) (#76704) ## About The Pull Request WHAT HAS CHANGED MECHANICALLY You can now lean up against walls. https://github.com/tgstation/tgstation/assets/55666666/bf81b7b5-6cab-4fc3-9887-075351511505 To lean against a wall, simply face opposite to it and drag your sprite onto it. Doing so makes you non-dense, just like if you were laying down. This means people can walk through you, but you are still susceptible to melee and ranged attacks. Leaning up against a wall also mitigates your FOV loss by 30 degrees, as you can have a better look at your surrounding when you put more of your surroundings infront of you. Because it seemed thematic to lean up against the wall while smoking and then flick a cigarette away, cigarettes will now say they where "flicked" instead of thrown when you toss them, I also took the time to add a bit of variation into the throw text. A few bugs where you could become non dense and then run straight through people has been patched. NOT PLAYER FACING So basically I've implemented a system that keeps effects that manage a mob's density consistent with eachother. An example of some of the situations that could occur Effect A would render a spaceman undense and turn the player dense again once it was concluded Effect B would render a spaceman undense and then after a timer revert the spaceman to whatever state the spaceman was in before effect B started. Thus if you enabled effect A and then Effect B, setting your previous state of denseness to undense, and then concluded effect A, when Effect B would finish it would put you back into the state of density you were in when you started. This would render the spaceman permanently undense. To solve this, the system has been updated so that all instances of density adjustment to mobs are handled by traits from unique sources (with the exception undensity gained by laying down due to its prevalence.) All effects that handle density will no longer step on each others toes and can now be rain simultaneously without fear. ## Why It's Good For The Game Leaning is cool. Bugs are bad. ## Changelog :cl: itseasytosee add: You can now lean against walls! Simply turn your back to the wall and clickdrag yourself onto it. fix: There should no longer be any instances of spacemen being able to run straight through eachother as if they weren't even there. spellcheck: Added more variance to item throwing text. refactor: Mob density has been refactored /:cl: --- code/__DEFINES/traits.dm | 16 +++++++ code/_globalvars/traits.dm | 2 + code/datums/actions/mobs/lava_swoop.dm | 4 +- code/datums/components/riding/riding_mob.dm | 4 +- code/datums/components/shrink.dm | 9 +++- code/game/objects/items.dm | 2 + code/game/objects/items/cigs_lighters.dm | 1 + code/game/turfs/closed/walls.dm | 46 +++++++++++++++++++ code/modules/mob/living/basic/basic.dm | 4 +- code/modules/mob/living/carbon/carbon.dm | 11 ++++- .../mob/living/carbon/carbon_defines.dm | 2 + code/modules/mob/living/init_signals.dm | 6 +++ code/modules/mob/living/living.dm | 12 +++-- code/modules/mob/living/living_fov.dm | 2 + .../simple_animal/hostile/jungle/leaper.dm | 8 ++-- .../simple_animal/hostile/jungle/mook.dm | 8 ++-- .../hostile/megafauna/hierophant.dm | 4 +- .../mob/living/simple_animal/hostile/mimic.dm | 4 +- .../hostile/mining_mobs/elites/pandora.dm | 4 +- .../mob/living/simple_animal/simple_animal.dm | 4 +- code/modules/pai/shell.dm | 4 +- 21 files changed, 125 insertions(+), 32 deletions(-) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index c98ebe822f7..d7d134e00ac 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -140,6 +140,10 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_PULL_BLOCKED "pullblocked" /// Abstract condition that prevents movement if being pulled and might be resisted against. Handcuffs and straight jackets, basically. #define TRAIT_RESTRAINED "restrained" +/// Apply this to make a mob not dense, and remove it when you want it to no longer make them undense, other sorces of undesity will still apply. Always define a unique source when adding a new instance of this! +#define TRAIT_UNDENSE "undense" +/// Expands our FOV by 30 degrees if restricted +#define TRAIT_EXPANDED_FOV "expanded_fov" /// Doesn't miss attacks #define TRAIT_PERFECT_ATTACKER "perfect_attacker" ///Recolored by item/greentext @@ -916,6 +920,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define SUIT_TRAIT "suit" /// Trait associated to lying down (having a [lying_angle] of a different value than zero). #define LYING_DOWN_TRAIT "lying-down" +/// A trait gained by leaning against a wall +#define LEANING_TRAIT "leaning" /// Trait associated to lacking electrical power. #define POWER_LACK_TRAIT "power-lack" /// Trait associated to lacking motor movement @@ -987,7 +993,15 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define SPECIES_FLIGHT_TRAIT "species-flight" #define FROSTMINER_ENRAGE_TRAIT "frostminer-enrage" #define NO_GRAVITY_TRAIT "no-gravity" +/// A trait gained from a mob's leap action, like the leaper #define LEAPING_TRAIT "leaping" +/// A trait gained from a mob's vanish action, like the herophant +#define VANISHING_TRAIT "vanishing" +/// A trait gained from a mob's swoop action, like the ash drake +#define SWOOPING_TRAIT "swooping" +/// A trait gained from a mob's mimic ability, like the mimic +#define MIMIC_TRAIT "mimic" +#define SHRUNKEN_TRAIT "shrunken" #define LEAPER_BUBBLE_TRAIT "leaper-bubble" #define DNA_VAULT_TRAIT "dna_vault" /// sticky nodrop sounds like a bad soundcloud rapper's name @@ -1046,6 +1060,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define CHOKING_TRAIT "choking_trait" /// Trait given by hallucinations #define HALLUCINATION_TRAIT "hallucination_trait" +/// Trait given by simple/basic mob death +#define BASIC_MOB_DEATH_TRAIT "basic_mob_death" /** diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm index 27e4221f363..d2dbd56e887 100644 --- a/code/_globalvars/traits.dm +++ b/code/_globalvars/traits.dm @@ -203,6 +203,8 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_PREVENT_IMPLANT_AUTO_EXPLOSION" = TRAIT_PREVENT_IMPLANT_AUTO_EXPLOSION, "TRAIT_UNOBSERVANT" = TRAIT_UNOBSERVANT, "TRAIT_MORBID" = TRAIT_MORBID, + "TRAIT_UNDENSE" = TRAIT_UNDENSE, + "TRAIT_EXPANDED_FOV" = TRAIT_EXPANDED_FOV, ), /obj/item/bodypart = list( "TRAIT_PARALYSIS" = TRAIT_PARALYSIS, diff --git a/code/datums/actions/mobs/lava_swoop.dm b/code/datums/actions/mobs/lava_swoop.dm index 618dcc10ff0..0c4eb959919 100644 --- a/code/datums/actions/mobs/lava_swoop.dm +++ b/code/datums/actions/mobs/lava_swoop.dm @@ -38,7 +38,7 @@ return // stop swooped target movement swooping = TRUE - owner.set_density(FALSE) + ADD_TRAIT(owner, TRAIT_UNDENSE, SWOOPING_TRAIT) owner.visible_message(span_boldwarning("[owner] swoops up high!")) var/negative @@ -115,7 +115,7 @@ for(var/mob/M in range(7, owner)) shake_camera(M, 15, 1) - owner.set_density(TRUE) + REMOVE_TRAIT(owner, TRAIT_UNDENSE, SWOOPING_TRAIT) SLEEP_CHECK_DEATH(1, owner) swooping = FALSE if(!lava_success) diff --git a/code/datums/components/riding/riding_mob.dm b/code/datums/components/riding/riding_mob.dm index 95e0ba8c772..4ce7bcb3bef 100644 --- a/code/datums/components/riding/riding_mob.dm +++ b/code/datums/components/riding/riding_mob.dm @@ -186,7 +186,7 @@ human_parent.buckle_lying = 0 // the riding mob is made nondense so they don't bump into any dense atoms the carrier is pulling, // since pulled movables are moved before buckled movables - riding_mob.set_density(FALSE) + ADD_TRAIT(riding_mob, TRAIT_UNDENSE, VEHICLE_TRAIT) else if(ride_check_flags & CARRIER_NEEDS_ARM) // fireman human_parent.buckle_lying = 90 @@ -210,7 +210,7 @@ unequip_buckle_inhands(parent) var/mob/living/carbon/human/H = parent H.remove_movespeed_modifier(/datum/movespeed_modifier/human_carry) - former_rider.set_density(!former_rider.body_position) + REMOVE_TRAIT(H, TRAIT_UNDENSE, VEHICLE_TRAIT) return ..() /// If the carrier shoves the person they're carrying, force the carried mob off diff --git a/code/datums/components/shrink.dm b/code/datums/components/shrink.dm index 9c1c5f76dcd..67cd3d39e23 100644 --- a/code/datums/components/shrink.dm +++ b/code/datums/components/shrink.dm @@ -10,10 +10,11 @@ parent_atom.transform = parent_atom.transform.Scale(0.5,0.5) olddens = parent_atom.density oldopac = parent_atom.opacity - parent_atom.set_density(FALSE) + parent_atom.set_opacity(FALSE) if(isliving(parent_atom)) var/mob/living/L = parent_atom + ADD_TRAIT(L, TRAIT_UNDENSE, SHRUNKEN_TRAIT) L.add_movespeed_modifier(/datum/movespeed_modifier/shrink_ray) if(iscarbon(L)) var/mob/living/carbon/C = L @@ -23,6 +24,8 @@ if(ishuman(C)) var/mob/living/carbon/human/H = C H.physiology.damage_resistance -= 100//carbons take double damage while shrunk + else + parent_atom.set_density(FALSE) // this is handled by the UNDENSE trait on mobs parent_atom.visible_message(span_warning("[parent_atom] shrinks down to a tiny size!"), span_userdanger("Everything grows bigger!")) QDEL_IN(src, shrink_time) @@ -30,12 +33,14 @@ /datum/component/shrink/Destroy() var/atom/parent_atom = parent parent_atom.transform = parent_atom.transform.Scale(2,2) - parent_atom.set_density(olddens) parent_atom.set_opacity(oldopac) if(isliving(parent_atom)) var/mob/living/L = parent_atom L.remove_movespeed_modifier(/datum/movespeed_modifier/shrink_ray) + REMOVE_TRAIT(L, TRAIT_UNDENSE, SHRUNKEN_TRAIT) if(ishuman(L)) var/mob/living/carbon/human/H = L H.physiology.damage_resistance += 100 + else + parent_atom.set_density(olddens) // this is handled by the UNDENSE trait on mobs return ..() diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 76dedcd323c..e3a9c697041 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -216,6 +216,8 @@ var/offensive_notes /// Used in obj/item/examine to determines whether or not to detail an item's statistics even if it does not meet the force requirements var/override_notes = FALSE + /// Used if we want to have a custom verb text for throwing. "John Spaceman flicks the ciggerate" for example. + var/throw_verb /obj/item/Initialize(mapload) diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm index 96012df7ea4..ccd449ce828 100644 --- a/code/game/objects/items/cigs_lighters.dm +++ b/code/game/objects/items/cigs_lighters.dm @@ -135,6 +135,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM body_parts_covered = null grind_results = list() heat = 1000 + throw_verb = "flick" /// Whether this cigarette has been lit. var/lit = FALSE /// Whether this cigarette should start lit. diff --git a/code/game/turfs/closed/walls.dm b/code/game/turfs/closed/walls.dm index abe5cc1bc9a..d2b744e9eaf 100644 --- a/code/game/turfs/closed/walls.dm +++ b/code/game/turfs/closed/walls.dm @@ -1,4 +1,5 @@ #define MAX_DENT_DECALS 15 +#define LEANING_OFFSET 11 /turf/closed/wall name = "wall" @@ -33,6 +34,50 @@ var/list/dent_decals +/turf/closed/wall/MouseDrop_T(mob/living/carbon/carbon_mob, mob/user) + ..() + if(carbon_mob != user) + return + if(carbon_mob.is_leaning == TRUE) + return + if(carbon_mob.pulledby) + return + if(!carbon_mob.density) + return + carbon_mob.is_leaning = TRUE + var/turf/checked_turf = get_step(carbon_mob, turn(carbon_mob.dir, 180)) + if(checked_turf == src) + carbon_mob.start_leaning(src) + +/mob/living/carbon/proc/start_leaning(obj/wall) + + switch(dir) + if(SOUTH) + pixel_y += LEANING_OFFSET + if(NORTH) + pixel_y += -LEANING_OFFSET + if(WEST) + pixel_x += LEANING_OFFSET + if(EAST) + pixel_x += -LEANING_OFFSET + + ADD_TRAIT(src, TRAIT_UNDENSE, LEANING_TRAIT) + ADD_TRAIT(src, TRAIT_EXPANDED_FOV, LEANING_TRAIT) + visible_message(span_notice("[src] leans against \the [wall]!"), \ + span_notice("You lean against \the [wall]!")) + RegisterSignals(src, list(COMSIG_MOB_CLIENT_PRE_MOVE, COMSIG_HUMAN_DISARM_HIT, COMSIG_LIVING_GET_PULLED, COMSIG_MOVABLE_TELEPORTING, COMSIG_ATOM_DIR_CHANGE), PROC_REF(stop_leaning)) + update_fov() + +/mob/living/carbon/proc/stop_leaning() + SIGNAL_HANDLER + UnregisterSignal(src, list(COMSIG_MOB_CLIENT_PRE_MOVE, COMSIG_HUMAN_DISARM_HIT, COMSIG_LIVING_GET_PULLED, COMSIG_MOVABLE_TELEPORTING, COMSIG_ATOM_DIR_CHANGE)) + is_leaning = FALSE + pixel_y = base_pixel_y + body_position_pixel_x_offset + pixel_x = base_pixel_y + body_position_pixel_y_offset + REMOVE_TRAIT(src, TRAIT_UNDENSE, LEANING_TRAIT) + REMOVE_TRAIT(src, TRAIT_EXPANDED_FOV, LEANING_TRAIT) + update_fov() + /turf/closed/wall/Initialize(mapload) . = ..() if(!can_engrave) @@ -319,3 +364,4 @@ girder_type = /obj/structure/foamedmetal #undef MAX_DENT_DECALS +#undef LEANING_OFFSET diff --git a/code/modules/mob/living/basic/basic.dm b/code/modules/mob/living/basic/basic.dm index 8d2633816f4..363983c5cd1 100644 --- a/code/modules/mob/living/basic/basic.dm +++ b/code/modules/mob/living/basic/basic.dm @@ -150,7 +150,7 @@ if(basic_mob_flags & FLIP_ON_DEATH) transform = transform.Turn(180) if(!(basic_mob_flags & REMAIN_DENSE_WHILE_DEAD)) - set_density(FALSE) + ADD_TRAIT(src, TRAIT_UNDENSE, BASIC_MOB_DEATH_TRAIT) /mob/living/basic/revive(full_heal_flags = NONE, excess_healing = 0, force_grab_ghost = FALSE) . = ..() @@ -164,7 +164,7 @@ if(basic_mob_flags & FLIP_ON_DEATH) transform = transform.Turn(180) if(!(basic_mob_flags & REMAIN_DENSE_WHILE_DEAD)) - set_density(initial(density)) + REMOVE_TRAIT(src, TRAIT_UNDENSE, BASIC_MOB_DEATH_TRAIT) /mob/living/basic/update_sight() lighting_color_cutoffs = list(lighting_cutoff_red, lighting_cutoff_green, lighting_cutoff_blue) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index fb2fa8951f9..81a6029d0f0 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -152,6 +152,9 @@ return FALSE var/atom/movable/thrown_thing var/obj/item/held_item = get_active_held_item() + var/verb_text = pick("throw", "toss", "hurl", "chuck", "fling") + if(prob(0.5)) + verb_text = "yeet" var/neckgrab_throw = FALSE // we can't check for if it's a neckgrab throw when totaling up power_throw since we've already stopped pulling them by then, so get it early if(!held_item) if(pulling && isliving(pulling) && grab_state >= GRAB_AGGRESSIVE) @@ -182,8 +185,12 @@ power_throw++ if(neckgrab_throw) power_throw++ - visible_message(span_danger("[src] throws [thrown_thing][power_throw ? " really hard!" : "."]"), \ - span_danger("You throw [thrown_thing][power_throw ? " really hard!" : "."]")) + if(isitem(thrown_thing)) + var/obj/item/thrown_item = thrown_thing + if(thrown_item.throw_verb) + verb_text = thrown_item.throw_verb + visible_message(span_danger("[src] [plural_s(verb_text)] [thrown_thing][power_throw ? " really hard!" : "."]"), \ + span_danger("You [verb_text] [thrown_thing][power_throw ? " really hard!" : "."]")) log_message("has thrown [thrown_thing] [power_throw > 0 ? "really hard" : ""]", LOG_ATTACK) var/extra_throw_range = HAS_TRAIT(src, TRAIT_THROWINGARM) ? 2 : 0 newtonian_move(get_dir(target, src)) diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index fc9a849806e..45d729bdc1c 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -119,4 +119,6 @@ /// A bitfield of "bodytypes", updated by /obj/item/bodypart/proc/synchronize_bodytypes() var/bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC + var/is_leaning = FALSE + COOLDOWN_DECLARE(bleeding_message_cd) diff --git a/code/modules/mob/living/init_signals.dm b/code/modules/mob/living/init_signals.dm index aeb29714218..be431ccf31f 100644 --- a/code/modules/mob/living/init_signals.dm +++ b/code/modules/mob/living/init_signals.dm @@ -52,6 +52,7 @@ RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_SKITTISH), PROC_REF(on_skittish_trait_gain)) RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_SKITTISH), PROC_REF(on_skittish_trait_loss)) + RegisterSignals(src, list(SIGNAL_ADDTRAIT(TRAIT_UNDENSE), SIGNAL_REMOVETRAIT(TRAIT_UNDENSE)), PROC_REF(undense_changed)) RegisterSignals(src, list(SIGNAL_ADDTRAIT(TRAIT_NEGATES_GRAVITY), SIGNAL_REMOVETRAIT(TRAIT_NEGATES_GRAVITY)), PROC_REF(on_negate_gravity)) RegisterSignals(src, list(SIGNAL_ADDTRAIT(TRAIT_IGNORING_GRAVITY), SIGNAL_REMOVETRAIT(TRAIT_IGNORING_GRAVITY)), PROC_REF(on_ignore_gravity)) RegisterSignals(src, list(SIGNAL_ADDTRAIT(TRAIT_FORCED_GRAVITY), SIGNAL_REMOVETRAIT(TRAIT_FORCED_GRAVITY)), PROC_REF(on_force_gravity)) @@ -257,3 +258,8 @@ /mob/living/proc/on_loc_force_gravity(datum/source) SIGNAL_HANDLER refresh_gravity() + +/// Called when [TRAIT_UNDENSE] is gained or lost +/mob/living/proc/undense_changed(datum/source) + SIGNAL_HANDLER + update_density() diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 5c8ae989727..b00515e67a0 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -627,8 +627,7 @@ /mob/living/proc/on_lying_down(new_lying_angle) if(layer == initial(layer)) //to avoid things like hiding larvas. layer = LYING_MOB_LAYER //so mob lying always appear behind standing mobs - add_traits(list(TRAIT_UI_BLOCKED, TRAIT_PULL_BLOCKED), LYING_DOWN_TRAIT) - set_density(FALSE) // We lose density and stop bumping passable dense things. + add_traits(list(TRAIT_UI_BLOCKED, TRAIT_PULL_BLOCKED, TRAIT_UNDENSE), LYING_DOWN_TRAIT) if(HAS_TRAIT(src, TRAIT_FLOORED) && !(dir & (NORTH|SOUTH))) setDir(pick(NORTH, SOUTH)) // We are and look helpless. body_position_pixel_y_offset = PIXEL_Y_OFFSET_LYING @@ -638,11 +637,16 @@ /mob/living/proc/on_standing_up() if(layer == LYING_MOB_LAYER) layer = initial(layer) - set_density(initial(density)) // We were prone before, so we become dense and things can bump into us again. - remove_traits(list(TRAIT_UI_BLOCKED, TRAIT_PULL_BLOCKED), LYING_DOWN_TRAIT) + remove_traits(list(TRAIT_UI_BLOCKED, TRAIT_PULL_BLOCKED, TRAIT_UNDENSE), LYING_DOWN_TRAIT) // Make sure it doesn't go out of the southern bounds of the tile when standing. body_position_pixel_y_offset = (current_size-1) * world.icon_size/2 +/mob/living/proc/update_density() + if(HAS_TRAIT(src, TRAIT_UNDENSE)) + set_density(FALSE) + else + set_density(TRUE) + //Recursive function to find everything a mob is holding. Really shitty proc tbh. /mob/living/get_contents() var/list/ret = list() diff --git a/code/modules/mob/living/living_fov.dm b/code/modules/mob/living/living_fov.dm index 0c5acb7b40e..279e8bebe32 100644 --- a/code/modules/mob/living/living_fov.dm +++ b/code/modules/mob/living/living_fov.dm @@ -57,6 +57,8 @@ if(fov_type > highest_fov) highest_fov = fov_type fov_view = highest_fov + if(HAS_TRAIT(src, TRAIT_EXPANDED_FOV)) + fov_view += 30 update_fov_client() /// Updates the FOV for the client. diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm index 73b7f6aa626..7e7e0b34510 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm @@ -215,7 +215,7 @@ if(z != target.z) return hopping = TRUE - set_density(FALSE) + ADD_TRAIT(src, TRAIT_UNDENSE, LEAPING_TRAIT) pass_flags |= PASSMOB notransform = TRUE var/turf/new_turf = locate((target.x + rand(-3,3)),(target.y + rand(-3,3)),target.z) @@ -228,7 +228,7 @@ throw_at(new_turf, max(3,get_dist(src,new_turf)), 1, src, FALSE, callback = CALLBACK(src, PROC_REF(FinishHop))) /mob/living/simple_animal/hostile/jungle/leaper/proc/FinishHop() - set_density(TRUE) + REMOVE_TRAIT(src, TRAIT_UNDENSE, LEAPING_TRAIT) notransform = FALSE pass_flags &= ~PASSMOB hopping = FALSE @@ -245,12 +245,12 @@ addtimer(CALLBACK(src, PROC_REF(BellyFlopHop), new_turf), 30) /mob/living/simple_animal/hostile/jungle/leaper/proc/BellyFlopHop(turf/T) - set_density(FALSE) + ADD_TRAIT(src, TRAIT_UNDENSE, LEAPING_TRAIT) throw_at(T, get_dist(src,T),1,src, FALSE, callback = CALLBACK(src, PROC_REF(Crush))) /mob/living/simple_animal/hostile/jungle/leaper/proc/Crush() hopping = FALSE - set_density(TRUE) + REMOVE_TRAIT(src, TRAIT_UNDENSE, LEAPING_TRAIT) notransform = FALSE playsound(src, 'sound/effects/meteorimpact.ogg', 200, TRUE) for(var/mob/living/L in orange(1, src)) diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm b/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm index 2e65ba82456..444635f2dc3 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm @@ -107,7 +107,7 @@ /mob/living/simple_animal/hostile/jungle/mook/proc/LeapAttack() if(target && !stat && attack_state == MOOK_ATTACK_WARMUP) attack_state = MOOK_ATTACK_ACTIVE - set_density(FALSE) + ADD_TRAIT(src, TRAIT_UNDENSE, LEAPING_TRAIT) melee_damage_lower = 30 melee_damage_upper = 30 update_icons() @@ -123,7 +123,7 @@ /mob/living/simple_animal/hostile/jungle/mook/proc/AttackRecovery() if(attack_state == MOOK_ATTACK_ACTIVE && !stat) attack_state = MOOK_ATTACK_RECOVERY - set_density(TRUE) + REMOVE_TRAIT(src, TRAIT_UNDENSE, LEAPING_TRAIT) face_atom(target) if(!struck_target_leap) update_icons() @@ -156,7 +156,7 @@ if(CanAttack(L)) L.attack_animal(src) struck_target_leap = TRUE - set_density(TRUE) + REMOVE_TRAIT(src, TRAIT_UNDENSE, LEAPING_TRAIT) update_icons() var/mook_under_us = FALSE for(var/A in get_turf(src)) @@ -169,7 +169,7 @@ if(!struck_target_leap && CanAttack(ML))//Check if some joker is attempting to use rest to evade us struck_target_leap = TRUE ML.attack_animal(src) - set_density(TRUE) + REMOVE_TRAIT(src, TRAIT_UNDENSE, LEAPING_TRAIT) struck_target_leap = TRUE update_icons() continue diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm index 2597d6c6b44..7564bbd8c51 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -356,13 +356,13 @@ Difficulty: Hard animate(src, alpha = 0, time = 2, easing = EASE_OUT) //fade out SLEEP_CHECK_DEATH(1, src) visible_message(span_hierophant_warning("[src] fades out!")) - set_density(FALSE) + ADD_TRAIT(src, TRAIT_UNDENSE, VANISHING_TRAIT) SLEEP_CHECK_DEATH(2, src) forceMove(T) SLEEP_CHECK_DEATH(1, src) animate(src, alpha = 255, time = 2, easing = EASE_IN) //fade IN SLEEP_CHECK_DEATH(1, src) - set_density(TRUE) + REMOVE_TRAIT(src, TRAIT_UNDENSE, VANISHING_TRAIT) visible_message(span_hierophant_warning("[src] fades in!")) SLEEP_CHECK_DEATH(1, src) //at this point the blasts we made detonate blinking = FALSE diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index 1cbbd9ec45a..f8277895ffc 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -336,14 +336,14 @@ GLOBAL_LIST_INIT(animatable_blacklist, list(/obj/structure/table, /obj/structure if(locked) return if(!opened) - set_density(FALSE) + ADD_TRAIT(src, TRAIT_UNDENSE, MIMIC_TRAIT) opened = TRUE icon_state = "crateopen" playsound(src, open_sound, 50, TRUE) for(var/atom/movable/AM in src) AM.forceMove(loc) else - set_density(TRUE) + REMOVE_TRAIT(src, TRAIT_UNDENSE, MIMIC_TRAIT) opened = FALSE icon_state = "crate" playsound(src, close_sound, 50, TRUE) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm index a5733d29823..2d6cdb39da0 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm @@ -147,13 +147,13 @@ new /obj/effect/temp_visual/hierophant/blast/damaging/pandora(t, src) animate(src, alpha = 0, time = 2, easing = EASE_OUT) //fade out visible_message(span_hierophant_warning("[src] fades out!")) - set_density(FALSE) + ADD_TRAIT(src, TRAIT_UNDENSE, VANISHING_TRAIT) addtimer(CALLBACK(src, PROC_REF(pandora_teleport_3), T), 2) /mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/pandora_teleport_3(turf/T) forceMove(T) animate(src, alpha = 255, time = 2, easing = EASE_IN) //fade IN - set_density(TRUE) + REMOVE_TRAIT(src, TRAIT_UNDENSE, VANISHING_TRAIT) visible_message(span_hierophant_warning("[src] fades in!")) /mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/aoe_squares(target) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 5ab67387eba..e1238ccdf80 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -464,7 +464,7 @@ icon_state = icon_dead if(flip_on_death) transform = transform.Turn(180) - set_density(FALSE) + ADD_TRAIT(src, TRAIT_UNDENSE, BASIC_MOB_DEATH_TRAIT) ..() /mob/living/simple_animal/proc/CanAttack(atom/the_target) @@ -492,7 +492,7 @@ if(!.) return icon_state = icon_living - set_density(initial(density)) + REMOVE_TRAIT(src, TRAIT_UNDENSE, BASIC_MOB_DEATH_TRAIT) /mob/living/simple_animal/proc/make_babies() // <3 <3 <3 if(gender != FEMALE || stat || next_scan_time > world.time || !childtype || !animal_species || !SSticker.IsRoundInProgress()) diff --git a/code/modules/pai/shell.dm b/code/modules/pai/shell.dm index 4e8fe4f7343..ed61607bd4d 100644 --- a/code/modules/pai/shell.dm +++ b/code/modules/pai/shell.dm @@ -90,7 +90,7 @@ new /obj/effect/temp_visual/guardian/phase/out(loc) forceMove(card) add_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED), PAI_FOLDED) - set_density(FALSE) + ADD_TRAIT(src, TRAIT_UNDENSE, PAI_FOLDED) set_light_on(FALSE) holoform = FALSE set_resting(resting) @@ -121,7 +121,7 @@ addtimer(VARSET_CALLBACK(src, holochassis_ready, TRUE), HOLOCHASSIS_COOLDOWN) REMOVE_TRAIT(src, TRAIT_IMMOBILIZED, PAI_FOLDED) REMOVE_TRAIT(src, TRAIT_HANDS_BLOCKED, PAI_FOLDED) - set_density(TRUE) + REMOVE_TRAIT(src, TRAIT_UNDENSE, PAI_FOLDED) if(istype(card.loc, /obj/item/modular_computer)) var/obj/item/modular_computer/pc = card.loc pc.inserted_pai = null