diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 3d567571fd2..fa29b69bb02 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -192,6 +192,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Makes the owner appear as dead to most forms of medical examination #define TRAIT_FAKEDEATH "fakedeath" #define TRAIT_DISFIGURED "disfigured" +/// "Magic" trait that blocks the mob from moving or interacting with anything. Used for transient stuff like mob transformations or incorporality in special cases. +/// Will block movement, `Life()` (!!!), and other stuff based on the mob. +#define TRAIT_NO_TRANSFORM "block_transformations" /// Tracks whether we're gonna be a baby alien's mummy. #define TRAIT_XENO_HOST "xeno_host" /// This mob is immune to stun causing status effects and stamcrit. diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 879cc045f1d..0dbc6380233 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -69,7 +69,7 @@ return next_click = world.time + 1 - if(check_click_intercept(params,A) || notransform) + if(check_click_intercept(params,A) || HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return var/list/modifiers = params2list(params) diff --git a/code/controllers/subsystem/npcpool.dm b/code/controllers/subsystem/npcpool.dm index 34cad5d7f86..6fbfdadf682 100644 --- a/code/controllers/subsystem/npcpool.dm +++ b/code/controllers/subsystem/npcpool.dm @@ -29,7 +29,7 @@ SUBSYSTEM_DEF(npcpool) stack_trace("Found a null in simple_animals active list [SA.type]!") continue - if(!SA.ckey && !SA.notransform) + if(!SA.ckey && !HAS_TRAIT(SA, TRAIT_NO_TRANSFORM)) if(SA.stat != DEAD) SA.handle_automated_movement() if(SA.stat != DEAD) diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 1e5a9b085ee..252e69595f3 100644 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -1,4 +1,5 @@ #define ROUND_START_MUSIC_LIST "strings/round_start_sounds.txt" +#define SS_TICKER_TRAIT "SS_Ticker" SUBSYSTEM_DEF(ticker) name = "Ticker" @@ -462,19 +463,18 @@ SUBSYSTEM_DEF(ticker) var/mob/living = player.transfer_character() if(living) qdel(player) - living.notransform = TRUE + ADD_TRAIT(living, TRAIT_NO_TRANSFORM, SS_TICKER_TRAIT) if(living.client) var/atom/movable/screen/splash/S = new(null, living.client, TRUE) S.Fade(TRUE) living.client.init_verbs() livings += living if(livings.len) - addtimer(CALLBACK(src, PROC_REF(release_characters), livings), 30, TIMER_CLIENT_TIME) + addtimer(CALLBACK(src, PROC_REF(release_characters), livings), 3 SECONDS, TIMER_CLIENT_TIME) /datum/controller/subsystem/ticker/proc/release_characters(list/livings) - for(var/I in livings) - var/mob/living/L = I - L.notransform = FALSE + for(var/mob/living/living_mob as anything in livings) + REMOVE_TRAIT(living_mob, TRAIT_NO_TRANSFORM, SS_TICKER_TRAIT) /datum/controller/subsystem/ticker/proc/check_queue() if(!queued_players.len) @@ -738,3 +738,4 @@ SUBSYSTEM_DEF(ticker) return "[global.config.directory]/reboot_themes/[pick(possible_themes)]" #undef ROUND_START_MUSIC_LIST +#undef SS_TICKER_TRAIT diff --git a/code/datums/cinematics/_cinematic.dm b/code/datums/cinematics/_cinematic.dm index 36b15998bf1..a0344434ec4 100644 --- a/code/datums/cinematics/_cinematic.dm +++ b/code/datums/cinematics/_cinematic.dm @@ -1,3 +1,5 @@ +#define CINEMATIC_SOURCE "cinematic" + /** * Plays a cinematic, duh. Can be to a select few people, or everyone. * @@ -30,7 +32,7 @@ /datum/cinematic /// A list of all clients watching the cinematic var/list/client/watching = list() - /// A list of all mobs who have notransform set while watching the cinematic + /// A list of all mobs who have TRAIT_NO_TRANSFORM set while watching the cinematic var/list/datum/weakref/locked = list() /// Whether the cinematic is a global cinematic or not var/is_global = FALSE @@ -106,11 +108,7 @@ /datum/cinematic/proc/show_to(mob/watching_mob, client/watching_client) SIGNAL_HANDLER - // We could technically rip people out of notransform who shouldn't be, - // so we'll only lock down all viewing mobs who don't have it already set. - // This does potentially mean some mobs could lose their notrasnform and - // not be locked down by cinematics, but that should be very unlikely. - if(!watching_mob.notransform) + if(!HAS_TRAIT_FROM(watching_mob, TRAIT_NO_TRANSFORM, CINEMATIC_SOURCE)) lock_mob(watching_mob) // Only show the actual cinematic to cliented mobs. @@ -152,14 +150,14 @@ /// Locks a mob, preventing them from moving, being hurt, or acting /datum/cinematic/proc/lock_mob(mob/to_lock) locked += WEAKREF(to_lock) - to_lock.notransform = TRUE + ADD_TRAIT(to_lock, TRAIT_NO_TRANSFORM, CINEMATIC_SOURCE) /// Unlocks a previously locked weakref /datum/cinematic/proc/unlock_mob(datum/weakref/mob_ref) var/mob/locked_mob = mob_ref.resolve() if(isnull(locked_mob)) return - locked_mob.notransform = FALSE + REMOVE_TRAIT(locked_mob, TRAIT_NO_TRANSFORM, CINEMATIC_SOURCE) UnregisterSignal(locked_mob, COMSIG_MOB_CLIENT_LOGIN) /// Removes the passed client from our watching list. @@ -171,8 +169,10 @@ UnregisterSignal(no_longer_watching, COMSIG_QDELETING) // We'll clear the cinematic if they have a mob which has one, - // but we won't remove notransform. Wait for the cinematic end to do that. + // but we won't remove TRAIT_NO_TRANSFORM. Wait for the cinematic end to do that. no_longer_watching.mob?.clear_fullscreen("cinematic") no_longer_watching.screen -= screen watching -= no_longer_watching + +#undef CINEMATIC_SOURCE diff --git a/code/datums/components/chasm.dm b/code/datums/components/chasm.dm index 9b59420b715..12dff2b6aa9 100644 --- a/code/datums/components/chasm.dm +++ b/code/datums/components/chasm.dm @@ -157,7 +157,7 @@ dropped_thing.visible_message(span_boldwarning("[dropped_thing] falls into [parent]!"), span_userdanger("[oblivion_message]")) if (isliving(dropped_thing)) var/mob/living/falling_mob = dropped_thing - falling_mob.notransform = TRUE + ADD_TRAIT(falling_mob, TRAIT_NO_TRANSFORM, REF(src)) falling_mob.Paralyze(20 SECONDS) var/oldtransform = dropped_thing.transform @@ -198,7 +198,7 @@ else if(isliving(dropped_thing)) var/mob/living/fallen_mob = dropped_thing - fallen_mob.notransform = FALSE + REMOVE_TRAIT(fallen_mob, TRAIT_NO_TRANSFORM, REF(src)) if (fallen_mob.stat != DEAD) fallen_mob.investigate_log("has died from falling into a chasm.", INVESTIGATE_DEATHS) fallen_mob.death(TRUE) diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm index 15f56f8ec2f..a3449e366df 100644 --- a/code/datums/diseases/transformation.dm +++ b/code/datums/diseases/transformation.dm @@ -58,9 +58,9 @@ to_chat(affected_mob, pick(stage5)) if(QDELETED(affected_mob)) return - if(affected_mob.notransform) + if(HAS_TRAIT_FROM(affected_mob, TRAIT_NO_TRANSFORM, REF(src))) return - affected_mob.notransform = 1 + ADD_TRAIT(affected_mob, TRAIT_NO_TRANSFORM, REF(src)) for(var/obj/item/W in affected_mob.get_equipped_items(include_pockets = TRUE)) affected_mob.dropItemToGround(W) for(var/obj/item/I in affected_mob.held_items) diff --git a/code/datums/mutations/void_magnet.dm b/code/datums/mutations/void_magnet.dm index 56b22d664a8..d6636b0b630 100644 --- a/code/datums/mutations/void_magnet.dm +++ b/code/datums/mutations/void_magnet.dm @@ -60,7 +60,7 @@ /datum/action/cooldown/spell/void/cursed/proc/on_life(mob/living/source, seconds_per_tick, times_fired) SIGNAL_HANDLER - if(!isliving(source) || IS_IN_STASIS(source) || source.stat == DEAD || source.notransform) + if(!isliving(source) || IS_IN_STASIS(source) || source.stat == DEAD || HAS_TRAIT(source, TRAIT_NO_TRANSFORM)) return if(!is_valid_target(source)) diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index f55f2147f0b..f0f8cccbc9f 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -545,29 +545,30 @@ /obj/item/borg/upgrade/expand/action(mob/living/silicon/robot/robot, user = usr) . = ..() - if(.) + if(!. || HAS_TRAIT(robot, TRAIT_NO_TRANSFORM)) + return FALSE - if(robot.hasExpanded) - to_chat(usr, span_warning("This unit already has an expand module installed!")) - return FALSE + if(robot.hasExpanded) + to_chat(usr, span_warning("This unit already has an expand module installed!")) + return FALSE - robot.notransform = TRUE - var/prev_lockcharge = robot.lockcharge - robot.SetLockdown(TRUE) - robot.set_anchored(TRUE) - var/datum/effect_system/fluid_spread/smoke/smoke = new - smoke.set_up(1, holder = robot, location = robot.loc) - smoke.start() - sleep(0.2 SECONDS) - for(var/i in 1 to 4) - playsound(robot, pick('sound/items/drill_use.ogg', 'sound/items/jaws_cut.ogg', 'sound/items/jaws_pry.ogg', 'sound/items/welder.ogg', 'sound/items/ratchet.ogg'), 80, TRUE, -1) - sleep(1.2 SECONDS) - if(!prev_lockcharge) - robot.SetLockdown(FALSE) - robot.set_anchored(FALSE) - robot.notransform = FALSE - robot.hasExpanded = TRUE - robot.update_transform(2) + ADD_TRAIT(robot, TRAIT_NO_TRANSFORM, REF(src)) + var/prev_lockcharge = robot.lockcharge + robot.SetLockdown(TRUE) + robot.set_anchored(TRUE) + var/datum/effect_system/fluid_spread/smoke/smoke = new + smoke.set_up(1, holder = robot, location = robot.loc) + smoke.start() + sleep(0.2 SECONDS) + for(var/i in 1 to 4) + playsound(robot, pick('sound/items/drill_use.ogg', 'sound/items/jaws_cut.ogg', 'sound/items/jaws_pry.ogg', 'sound/items/welder.ogg', 'sound/items/ratchet.ogg'), 80, TRUE, -1) + sleep(1.2 SECONDS) + if(!prev_lockcharge) + robot.SetLockdown(FALSE) + robot.set_anchored(FALSE) + REMOVE_TRAIT(robot, TRAIT_NO_TRANSFORM, REF(src)) + robot.hasExpanded = TRUE + robot.update_transform(2) /obj/item/borg/upgrade/expand/deactivate(mob/living/silicon/robot/R, user = usr) . = ..() diff --git a/code/modules/antagonists/changeling/powers/lesserform.dm b/code/modules/antagonists/changeling/powers/lesserform.dm index f4aab1c8968..854234af965 100644 --- a/code/modules/antagonists/changeling/powers/lesserform.dm +++ b/code/modules/antagonists/changeling/powers/lesserform.dm @@ -20,7 +20,7 @@ //Transform into a monkey. /datum/action/changeling/lesserform/sting_action(mob/living/carbon/human/user) - if(!user || user.notransform) + if(!user || HAS_TRAIT(user, TRAIT_NO_TRANSFORM)) return FALSE ..() return ismonkey(user) ? unmonkey(user) : become_monkey(user) diff --git a/code/modules/antagonists/heretic/heretic_knowledge.dm b/code/modules/antagonists/heretic/heretic_knowledge.dm index da376b20a42..b51c2a5dcb8 100644 --- a/code/modules/antagonists/heretic/heretic_knowledge.dm +++ b/code/modules/antagonists/heretic/heretic_knowledge.dm @@ -511,7 +511,7 @@ // Fade in the summon while the ghost poll is ongoing. // Also don't let them mess with the summon while waiting summoned.alpha = 0 - summoned.notransform = TRUE + ADD_TRAIT(summoned, TRAIT_NO_TRANSFORM, REF(src)) summoned.move_resist = MOVE_FORCE_OVERPOWERING animate(summoned, 10 SECONDS, alpha = 155) @@ -526,7 +526,7 @@ var/mob/dead/observer/picked_candidate = pick(candidates) // Ok let's make them an interactable mob now, since we got a ghost summoned.alpha = 255 - summoned.notransform = FALSE + REMOVE_TRAIT(summoned, TRAIT_NO_TRANSFORM, REF(src)) summoned.move_resist = initial(summoned.move_resist) summoned.ghostize(FALSE) diff --git a/code/modules/antagonists/heretic/magic/space_crawl.dm b/code/modules/antagonists/heretic/magic/space_crawl.dm index 4c69bdf4fcd..69a15d812bb 100644 --- a/code/modules/antagonists/heretic/magic/space_crawl.dm +++ b/code/modules/antagonists/heretic/magic/space_crawl.dm @@ -60,10 +60,10 @@ */ /datum/action/cooldown/spell/jaunt/space_crawl/proc/try_enter_jaunt(turf/our_turf, mob/living/jaunter) // Begin the jaunt - jaunter.notransform = TRUE + ADD_TRAIT(jaunter, TRAIT_NO_TRANSFORM, REF(src)) var/obj/effect/dummy/phased_mob/holder = enter_jaunt(jaunter, our_turf) - if(!holder) - jaunter.notransform = FALSE + if(isnull(holder)) + REMOVE_TRAIT(jaunter, TRAIT_NO_TRANSFORM, REF(src)) return FALSE RegisterSignal(holder, COMSIG_MOVABLE_MOVED, PROC_REF(update_status_on_signal)) @@ -82,14 +82,14 @@ new /obj/effect/temp_visual/space_explosion(our_turf) jaunter.extinguish_mob() - jaunter.notransform = FALSE + REMOVE_TRAIT(jaunter, TRAIT_NO_TRANSFORM, REF(src)) return TRUE /** * Attempts to Exit the passed space or misc turf. */ /datum/action/cooldown/spell/jaunt/space_crawl/proc/try_exit_jaunt(turf/our_turf, mob/living/jaunter) - if(jaunter.notransform) + if(HAS_TRAIT_FROM(jaunter, TRAIT_NO_TRANSFORM, REF(src))) to_chat(jaunter, span_warning("You cannot exit yet!!")) return FALSE diff --git a/code/modules/antagonists/revenant/revenant_abilities.dm b/code/modules/antagonists/revenant/revenant_abilities.dm index db953c0a44b..0de2be1d17c 100644 --- a/code/modules/antagonists/revenant/revenant_abilities.dm +++ b/code/modules/antagonists/revenant/revenant_abilities.dm @@ -22,7 +22,7 @@ Harvest(A) /mob/living/simple_animal/revenant/ranged_secondary_attack(atom/target, modifiers) - if(revealed || notransform || inhibited || !Adjacent(target) || !incorporeal_move_check(target)) + if(revealed || inhibited || HAS_TRAIT(src, TRAIT_NO_TRANSFORM) || !Adjacent(target) || !incorporeal_move_check(target)) return var/list/icon_dimensions = get_icon_dimensions(target.icon) diff --git a/code/modules/mapfluff/ruins/lavalandruin_code/puzzle.dm b/code/modules/mapfluff/ruins/lavalandruin_code/puzzle.dm index 461e9ee8c19..0e5437b9fd4 100644 --- a/code/modules/mapfluff/ruins/lavalandruin_code/puzzle.dm +++ b/code/modules/mapfluff/ruins/lavalandruin_code/puzzle.dm @@ -295,7 +295,7 @@ /obj/effect/sliding_puzzle/prison/dispense_reward() prisoner.forceMove(get_turf(src)) - prisoner.notransform = FALSE + REMOVE_TRAIT(prisoner, TRAIT_NO_TRANSFORM, element_type) prisoner = null //Some armor so it's harder to kill someone by mistake. @@ -344,7 +344,7 @@ return FALSE //First grab the prisoner and move them temporarily into the generator so they won't get thrown around. - prisoner.notransform = TRUE + ADD_TRAIT(prisoner, TRAIT_NO_TRANSFORM, cube.element_type) prisoner.forceMove(cube) to_chat(prisoner,span_userdanger("You're trapped by the prison cube! You will remain trapped until someone solves it.")) diff --git a/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm b/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm index 5b7c8816b1d..323fee05428 100644 --- a/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm +++ b/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm @@ -457,14 +457,14 @@ GLOBAL_VAR_INIT(hhMysteryRoomNumber, rand(1, 999999)) entered_light.end_processing() . = ..() if(ismob(arrived)) - var/mob/M = arrived - M.notransform = TRUE + var/mob/target = arrived + ADD_TRAIT(target, TRAIT_NO_TRANSFORM, REF(src)) /obj/item/abstracthotelstorage/Exited(atom/movable/gone, direction) . = ..() if(ismob(gone)) - var/mob/M = gone - M.notransform = FALSE + var/mob/target = gone + REMOVE_TRAIT(target, TRAIT_NO_TRANSFORM, REF(src)) if(istype(gone, /obj/machinery/light)) var/obj/machinery/light/exited_light = gone exited_light.begin_processing() diff --git a/code/modules/mining/lavaland/tendril_loot.dm b/code/modules/mining/lavaland/tendril_loot.dm index 8b9ae78af13..d3d4b4b672f 100644 --- a/code/modules/mining/lavaland/tendril_loot.dm +++ b/code/modules/mining/lavaland/tendril_loot.dm @@ -421,7 +421,7 @@ return user.status_flags &= ~GODMODE - user.notransform = FALSE + REMOVE_TRAIT(user, TRAIT_NO_TRANSFORM, REF(src)) user.forceMove(get_turf(src)) user.visible_message(span_danger("[user] pops back into reality!")) @@ -432,7 +432,7 @@ setDir(user.dir) user.forceMove(src) - user.notransform = TRUE + ADD_TRAIT(user, TRAIT_NO_TRANSFORM, REF(src)) user.status_flags |= GODMODE user_ref = WEAKREF(user) @@ -446,8 +446,8 @@ return /obj/effect/immortality_talisman/relaymove(mob/living/user, direction) - // Won't really come into play since our mob has notransform and cannot move, - // but regardless block all relayed moves, becuase no, you cannot move in the void. + // Won't really come into play since our mob has TRAIT_NO_TRANSFORM and cannot move, + // but regardless block all relayed moves, because no, you cannot move in the void. return /obj/effect/immortality_talisman/singularity_pull() diff --git a/code/modules/mob/dead/dead.dm b/code/modules/mob/dead/dead.dm index b68edb67e26..8d7db7f8e85 100644 --- a/code/modules/mob/dead/dead.dm +++ b/code/modules/mob/dead/dead.dm @@ -46,11 +46,13 @@ INITIALIZE_IMMEDIATE(/mob/dead) . += "Players Ready: [SSticker.totalPlayersReady]" . += "Admins Ready: [SSticker.total_admins_ready] / [length(GLOB.admins)]" +#define SERVER_HOPPER_TRAIT "server_hopper" + /mob/dead/proc/server_hop() set category = "OOC" set name = "Server Hop" set desc= "Jump to the other server" - if(notransform) + if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) // in case the round is ending and a cinematic is already playing we don't wanna clash with that (yes i know) return var/list/our_id = CONFIG_GET(string/cross_comms_name) var/list/csa = CONFIG_GET(keyed_list/cross_server) - our_id @@ -76,9 +78,9 @@ INITIALIZE_IMMEDIATE(/mob/dead) to_chat(C, span_notice("Sending you to [pick].")) new /atom/movable/screen/splash(null, null, C) - notransform = TRUE + ADD_TRAIT(src, TRAIT_NO_TRANSFORM, SERVER_HOPPER_TRAIT) sleep(2.9 SECONDS) //let the animation play - notransform = FALSE + REMOVE_TRAIT(src, TRAIT_NO_TRANSFORM, SERVER_HOPPER_TRAIT) if(!C) return @@ -87,6 +89,8 @@ INITIALIZE_IMMEDIATE(/mob/dead) C << link("[addr]") +#undef SERVER_HOPPER_TRAIT + /mob/dead/proc/update_z(new_z) // 1+ to register, null to unregister if (registered_z != new_z) if (registered_z) diff --git a/code/modules/mob/living/brain/life.dm b/code/modules/mob/living/brain/life.dm index 54888f26533..9bebeac70ec 100644 --- a/code/modules/mob/living/brain/life.dm +++ b/code/modules/mob/living/brain/life.dm @@ -1,8 +1,6 @@ /mob/living/brain/Life(seconds_per_tick = SSMOBS_DT, times_fired) - if (notransform) - return - if(!loc) + if(isnull(loc) || HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return if(!isnull(container)) diff --git a/code/modules/mob/living/carbon/alien/larva/life.dm b/code/modules/mob/living/carbon/alien/larva/life.dm index 325e2b10742..2e2674e14e7 100644 --- a/code/modules/mob/living/carbon/alien/larva/life.dm +++ b/code/modules/mob/living/carbon/alien/larva/life.dm @@ -1,7 +1,7 @@ /mob/living/carbon/alien/larva/Life(seconds_per_tick = SSMOBS_DT, times_fired) - if (notransform) + if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return if(!..() || IS_IN_STASIS(src) || (amount_grown >= max_grown)) return // We're dead, in stasis, or already grown. diff --git a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm index e99aa7a00aa..ebced66d766 100644 --- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm +++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm @@ -111,8 +111,7 @@ var/mob/living/carbon/alien/larva/new_xeno = new(xeno_loc) new_xeno.key = ghost.key SEND_SOUND(new_xeno, sound('sound/voice/hiss5.ogg',0,0,0,100)) //To get the player's attention - new_xeno.add_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED), type) //so we don't move during the bursting animation - new_xeno.notransform = 1 + new_xeno.add_traits(list(TRAIT_HANDS_BLOCKED, TRAIT_IMMOBILIZED, TRAIT_NO_TRANSFORM), type) //so we don't move during the bursting animation new_xeno.invisibility = INVISIBILITY_MAXIMUM sleep(0.6 SECONDS) @@ -121,10 +120,8 @@ qdel(new_xeno) CRASH("AttemptGrow failed due to the early qdeletion of source or owner.") - if(new_xeno) - REMOVE_TRAIT(new_xeno, TRAIT_IMMOBILIZED, type) - REMOVE_TRAIT(new_xeno, TRAIT_HANDS_BLOCKED, type) - new_xeno.notransform = 0 + if(!isnull(new_xeno)) + new_xeno.remove_traits(list(TRAIT_HANDS_BLOCKED, TRAIT_IMMOBILIZED, TRAIT_NO_TRANSFORM), type) new_xeno.invisibility = 0 if(gib_on_success) diff --git a/code/modules/mob/living/carbon/carbon_update_icons.dm b/code/modules/mob/living/carbon/carbon_update_icons.dm index 297f605913c..cdd6900c22b 100644 --- a/code/modules/mob/living/carbon/carbon_update_icons.dm +++ b/code/modules/mob/living/carbon/carbon_update_icons.dm @@ -272,8 +272,8 @@ #undef NEXT_PARENT_COMMAND /mob/living/carbon/regenerate_icons() - if(notransform) - return 1 + if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) + return icon_render_keys = list() //Clear this bad larry out update_held_items() update_worn_handcuffs() diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 8c7c8fd61f7..c468d9b750c 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -19,7 +19,7 @@ #define THERMAL_PROTECTION_HAND_RIGHT 0.025 /mob/living/carbon/human/Life(seconds_per_tick = SSMOBS_DT, times_fired) - if(notransform) + if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return . = ..() diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index eb502ff9bcf..30c374033fc 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -268,12 +268,12 @@ if(!isslimeperson(H)) return CHECK_DNA_AND_SPECIES(H) - H.visible_message("[owner] gains a look of \ - concentration while standing perfectly still.", - "You focus intently on moving your body while \ - standing perfectly still...") + H.visible_message( + span_notice("[owner] gains a look of concentration while standing perfectly still."), + span_notice("You focus intently on moving your body while standing perfectly still..."), + ) - H.notransform = TRUE + ADD_TRAIT(src, TRAIT_NO_TRANSFORM, REF(src)) if(do_after(owner, delay = 6 SECONDS, target = owner, timed_action_flags = IGNORE_HELD_ITEM)) if(H.blood_volume >= BLOOD_VOLUME_SLIME_SPLIT) @@ -283,7 +283,7 @@ else to_chat(H, span_warning("...but fail to stand perfectly still!")) - H.notransform = FALSE + REMOVE_TRAIT(src, TRAIT_NO_TRANSFORM, REF(src)) /datum/action/innate/split_body/proc/make_dupe() var/mob/living/carbon/human/H = owner @@ -302,7 +302,7 @@ spare.Move(get_step(H.loc, pick(NORTH,SOUTH,EAST,WEST))) H.blood_volume *= 0.45 - H.notransform = 0 + REMOVE_TRAIT(H, TRAIT_NO_TRANSFORM, REF(src)) var/datum/species/jelly/slime/origin_datum = H.dna.species origin_datum.bodies |= spare @@ -312,10 +312,10 @@ H.transfer_quirk_datums(spare) H.mind.transfer_to(spare) - spare.visible_message("[H] distorts as a new body \ - \"steps out\" of [H.p_them()].", - "...and after a moment of disorentation, \ - you're besides yourself!") + spare.visible_message( + span_warning("[H] distorts as a new body \"steps out\" of [H.p_them()]."), + span_notice("...and after a moment of disorentation, you're besides yourself!"), + ) /datum/action/innate/swap_body diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index b296af1f522..eb1591b7197 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -1,5 +1,5 @@ /mob/living/carbon/Life(seconds_per_tick = SSMOBS_DT, times_fired) - if(notransform) + if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return if(damageoverlaytemp) diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index cea0d00fc21..aacdc60b56a 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -34,9 +34,7 @@ log_game("Z-TRACKING: [src] of type [src.type] has a Z-registration despite not having a client.") update_z(null) - if (notransform) - return - if(!loc) + if(isnull(loc) || HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return if(!IS_IN_STASIS(src)) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 5cb45e8b089..f5928e354b9 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1315,14 +1315,13 @@ * Returns a mob (what our mob turned into) or null (if we failed). */ /mob/living/proc/wabbajack(what_to_randomize, change_flags = WABBAJACK) - if(stat == DEAD || notransform || (GODMODE & status_flags)) + if(stat == DEAD || (GODMODE & status_flags) || HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return if(SEND_SIGNAL(src, COMSIG_LIVING_PRE_WABBAJACKED, what_to_randomize) & STOP_WABBAJACK) return - notransform = TRUE - add_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED), MAGIC_TRAIT) + add_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED, TRAIT_NO_TRANSFORM), MAGIC_TRAIT) icon = null cut_overlays() invisibility = INVISIBILITY_ABSTRACT diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index 0f3dde4b359..ae56f65b0cd 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -1,5 +1,5 @@ /mob/living/silicon/robot/Life(seconds_per_tick = SSMOBS_DT, times_fired) - if (src.notransform) + if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return ..() diff --git a/code/modules/mob/living/silicon/robot/robot_model.dm b/code/modules/mob/living/silicon/robot/robot_model.dm index 3d6366c9863..5c0f29e8871 100644 --- a/code/modules/mob/living/silicon/robot/robot_model.dm +++ b/code/modules/mob/living/silicon/robot/robot_model.dm @@ -231,6 +231,9 @@ return new_model /obj/item/robot_model/proc/be_transformed_to(obj/item/robot_model/old_model, forced = FALSE) + if(HAS_TRAIT(robot, TRAIT_NO_TRANSFORM)) + robot.balloon_alert(robot, "can't transform right now!") + return FALSE if(islist(borg_skins) && !forced) var/mob/living/silicon/robot/cyborg = loc var/list/reskin_icons = list() @@ -273,7 +276,7 @@ var/mob/living/silicon/robot/cyborg = loc sleep(0.1 SECONDS) flick("[cyborg_base_icon]_transform", cyborg) - cyborg.notransform = TRUE + ADD_TRAIT(cyborg, TRAIT_NO_TRANSFORM, REF(src)) if(locked_transform) cyborg.ai_lockdown = TRUE cyborg.SetLockdown(TRUE) @@ -287,7 +290,7 @@ cyborg.ai_lockdown = FALSE cyborg.setDir(SOUTH) cyborg.set_anchored(FALSE) - cyborg.notransform = FALSE + REMOVE_TRAIT(cyborg, TRAIT_NO_TRANSFORM, REF(src)) cyborg.updatehealth() cyborg.update_icons() cyborg.notify_ai(AI_NOTIFICATION_NEW_MODEL) 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 aa7ddc11c72..5ef5987942e 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm @@ -216,9 +216,8 @@ if(z != target.z) return hopping = TRUE - ADD_TRAIT(src, TRAIT_UNDENSE, LEAPING_TRAIT) + add_traits(list(TRAIT_UNDENSE, TRAIT_NO_TRANSFORM), LEAPING_TRAIT) pass_flags |= PASSMOB - notransform = TRUE var/turf/new_turf = locate((target.x + rand(-3,3)),(target.y + rand(-3,3)),target.z) if(player_hop) new_turf = get_turf(target) @@ -229,8 +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() - REMOVE_TRAIT(src, TRAIT_UNDENSE, LEAPING_TRAIT) - notransform = FALSE + remove_traits(list(TRAIT_UNDENSE, TRAIT_NO_TRANSFORM), LEAPING_TRAIT) pass_flags &= ~PASSMOB hopping = FALSE playsound(src.loc, 'sound/effects/meteorimpact.ogg', 100, TRUE) @@ -241,9 +239,9 @@ /mob/living/simple_animal/hostile/jungle/leaper/proc/BellyFlop() var/turf/new_turf = get_turf(target) hopping = TRUE - notransform = TRUE + ADD_TRAIT(src, TRAIT_NO_TRANSFORM, LEAPING_TRAIT) new /obj/effect/temp_visual/leaper_crush(new_turf) - addtimer(CALLBACK(src, PROC_REF(BellyFlopHop), new_turf), 30) + addtimer(CALLBACK(src, PROC_REF(BellyFlopHop), new_turf), 3 SECONDS) /mob/living/simple_animal/hostile/jungle/leaper/proc/BellyFlopHop(turf/T) ADD_TRAIT(src, TRAIT_UNDENSE, LEAPING_TRAIT) @@ -251,8 +249,7 @@ /mob/living/simple_animal/hostile/jungle/leaper/proc/Crush() hopping = FALSE - REMOVE_TRAIT(src, TRAIT_UNDENSE, LEAPING_TRAIT) - notransform = FALSE + remove_traits(list(TRAIT_UNDENSE, TRAIT_NO_TRANSFORM), LEAPING_TRAIT) playsound(src, 'sound/effects/meteorimpact.ogg', 200, TRUE) for(var/mob/living/L in orange(1, src)) L.adjustBruteLoss(35) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index 3c3f0e601c1..8a92ca680f7 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -588,8 +588,7 @@ . = ..() if(isliving(arrived) && holder_animal) var/mob/living/possessor = arrived - possessor.notransform = TRUE - ADD_TRAIT(possessor, TRAIT_MUTE, STASIS_MUTE) + possessor.add_traits(list(TRAIT_UNDENSE, TRAIT_NO_TRANSFORM), STASIS_MUTE) possessor.status_flags |= GODMODE possessor.mind.transfer_to(holder_animal) var/datum/action/exit_possession/escape = new(holder_animal) @@ -598,9 +597,8 @@ /obj/structure/closet/stasis/dump_contents(kill = TRUE) for(var/mob/living/possessor in src) - REMOVE_TRAIT(possessor, TRAIT_MUTE, STASIS_MUTE) + possessor.remove_traits(list(TRAIT_UNDENSE, TRAIT_NO_TRANSFORM), STASIS_MUTE) possessor.status_flags &= ~GODMODE - possessor.notransform = FALSE if(kill || !isanimal_or_basicmob(loc)) possessor.investigate_log("has died from [src].", INVESTIGATE_DEATHS) possessor.death(FALSE) diff --git a/code/modules/mob/living/simple_animal/revenant.dm b/code/modules/mob/living/simple_animal/revenant.dm index 25a283a7364..82c2be6920a 100644 --- a/code/modules/mob/living/simple_animal/revenant.dm +++ b/code/modules/mob/living/simple_animal/revenant.dm @@ -3,6 +3,9 @@ //Can hear deadchat, but are NOT normal ghosts and do NOT have x-ray vision //Admin-spawn or random event +/// Source for a trait we get when we're stunned +#define REVENANT_STUNNED_TRAIT "revenant_got_stunned" + /mob/living/simple_animal/revenant name = "revenant" desc = "A malevolent spirit." @@ -139,7 +142,7 @@ to_chat(src, span_revenboldnotice("You are once more concealed.")) if(unstun_time && world.time >= unstun_time) unstun_time = 0 - notransform = FALSE + REMOVE_TRAIT(src, TRAIT_NO_TRANSFORM, REVENANT_STUNNED_TRAIT) to_chat(src, span_revenboldnotice("You can move again!")) if(essence_regenerating && !inhibited && essence < essence_regen_cap) //While inhibited, essence will not regenerate essence = min(essence + (essence_regen_amount * seconds_per_tick), essence_regen_cap) @@ -239,7 +242,7 @@ return stasis = TRUE to_chat(src, span_revendanger("NO! No... it's too late, you can feel your essence [pick("breaking apart", "drifting away")]...")) - notransform = TRUE + ADD_TRAIT(src, TRAIT_NO_TRANSFORM, REVENANT_STUNNED_TRAIT) revealed = TRUE invisibility = 0 playsound(src, 'sound/effects/screech.ogg', 100, TRUE) @@ -282,7 +285,7 @@ return if(time <= 0) return - notransform = TRUE + ADD_TRAIT(src, TRAIT_NO_TRANSFORM, REVENANT_STUNNED_TRAIT) if(!unstun_time) to_chat(src, span_revendanger("You cannot move!")) unstun_time = world.time + time @@ -294,7 +297,7 @@ /mob/living/simple_animal/revenant/proc/update_spooky_icon() if(revealed) - if(notransform) + if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) if(draining) icon_state = icon_drain else @@ -351,7 +354,7 @@ /mob/living/simple_animal/revenant/proc/death_reset() revealed = FALSE unreveal_time = 0 - notransform = 0 + REMOVE_TRAIT(src, TRAIT_NO_TRANSFORM, REVENANT_STUNNED_TRAIT) unstun_time = 0 inhibited = FALSE draining = FALSE @@ -541,3 +544,4 @@ /datum/objective/revenant_fluff/check_completion() return TRUE +#undef REVENANT_STUNNED_TRAIT diff --git a/code/modules/mob/living/simple_animal/slime/life.dm b/code/modules/mob/living/simple_animal/slime/life.dm index 27827bbd88b..a103a55b996 100644 --- a/code/modules/mob/living/simple_animal/slime/life.dm +++ b/code/modules/mob/living/simple_animal/slime/life.dm @@ -1,5 +1,5 @@ /mob/living/simple_animal/slime/Life(seconds_per_tick = SSMOBS_DT, times_fired) - if (notransform) + if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return . = ..() if(!.) diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index ddf2bb72b78..12905700318 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -84,14 +84,6 @@ /// Tick time the mob can next move var/next_move = null - /** - * Magic var that stops you moving and interacting with anything - * - * Set when you're being turned into something else and also used in a bunch of places - * it probably shouldn't really be - */ - var/notransform = null //Carbon - /// What is the mobs real name (name is overridden for disguises etc) var/real_name = null diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index fbdf00398ff..6ec446c8f3f 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -74,8 +74,8 @@ return FALSE if(!mob?.loc) return FALSE - if(mob.notransform) - return FALSE //This is sota the goto stop mobs from moving var + if(HAS_TRAIT(mob, TRAIT_NO_TRANSFORM)) + return FALSE //This is sorta the goto stop mobs from moving trait if(mob.control_object) return Move_object(direct) if(!isliving(mob)) diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index f02624449ba..cefd88c72ef 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -1,7 +1,11 @@ #define TRANSFORMATION_DURATION 22 +/// Will be removed once the transformation is complete. +#define TEMPORARY_TRANSFORMATION_TRAIT "temporary_transformation" +/// Considered "permanent" since we'll be deleting the old mob and the client will be inserted into a new one (without this trait) +#define PERMANENT_TRANSFORMATION_TRAIT "permanent_transformation" /mob/living/carbon/proc/monkeyize(instant = FALSE) - if (notransform || transformation_timer) + if (transformation_timer || HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return if(ismonkey(src)) @@ -12,7 +16,7 @@ return //Make mob invisible and spawn animation - notransform = TRUE + ADD_TRAIT(src, TRAIT_NO_TRANSFORM, TEMPORARY_TRANSFORMATION_TRAIT) Paralyze(TRANSFORMATION_DURATION, ignore_canstun = TRUE) icon = null cut_overlays() @@ -23,8 +27,8 @@ /mob/living/carbon/proc/finish_monkeyize() transformation_timer = null - to_chat(src, "You are now a monkey.") - notransform = FALSE + to_chat(src, span_boldnotice("You are now a monkey.")) + REMOVE_TRAIT(src, TRAIT_NO_TRANSFORM, TEMPORARY_TRANSFORMATION_TRAIT) icon = initial(icon) invisibility = 0 set_species(/datum/species/monkey) @@ -39,7 +43,7 @@ //Could probably be merged with monkeyize but other transformations got their own procs, too /mob/living/carbon/proc/humanize(species = /datum/species/human, instant = FALSE) - if (notransform || transformation_timer) + if (transformation_timer || HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return if(!ismonkey(src)) @@ -50,7 +54,7 @@ return //Make mob invisible and spawn animation - notransform = TRUE + ADD_TRAIT(src, TRAIT_NO_TRANSFORM, TEMPORARY_TRANSFORMATION_TRAIT) Paralyze(TRANSFORMATION_DURATION, ignore_canstun = TRUE) icon = null cut_overlays() @@ -61,8 +65,8 @@ /mob/living/carbon/proc/finish_humanize(species = /datum/species/human) transformation_timer = null - to_chat(src, "You are now a human.") - notransform = FALSE + to_chat(src, span_boldnotice("You are now a human.")) + REMOVE_TRAIT(src, TRAIT_NO_TRANSFORM, TEMPORARY_TRANSFORMATION_TRAIT) icon = initial(icon) invisibility = 0 set_species(species) @@ -107,9 +111,9 @@ qdel(src) /mob/living/carbon/AIize(client/preference_source, transfer_after = TRUE) - if (notransform) + if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return - notransform = TRUE + ADD_TRAIT(src, TRAIT_NO_TRANSFORM, PERMANENT_TRANSFORMATION_TRAIT) Paralyze(1, ignore_canstun = TRUE) for(var/obj/item/W in src) dropItemToGround(W) @@ -119,7 +123,7 @@ return ..() /mob/living/carbon/human/AIize(client/preference_source, transfer_after = TRUE) - if (notransform) + if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return for(var/t in bodyparts) qdel(t) @@ -127,9 +131,9 @@ return ..() /mob/proc/Robotize(delete_items = 0, transfer_after = TRUE) - if(notransform) + if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return - notransform = TRUE + ADD_TRAIT(src, TRAIT_NO_TRANSFORM, PERMANENT_TRANSFORMATION_TRAIT) var/mob/living/silicon/robot/new_borg = new /mob/living/silicon/robot(loc) new_borg.gender = gender @@ -162,9 +166,9 @@ qdel(src) /mob/living/Robotize(delete_items = 0, transfer_after = TRUE) - if(notransform) + if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return - notransform = TRUE + ADD_TRAIT(src, TRAIT_NO_TRANSFORM, TEMPORARY_TRANSFORMATION_TRAIT) Paralyze(1, ignore_canstun = TRUE) for(var/obj/item/W in src) @@ -176,7 +180,7 @@ icon = null invisibility = INVISIBILITY_MAXIMUM - notransform = FALSE + REMOVE_TRAIT(src, TRAIT_NO_TRANSFORM, TEMPORARY_TRANSFORMATION_TRAIT) return ..() /mob/living/silicon/robot/proc/replace_banned_cyborg() @@ -191,9 +195,9 @@ //human -> alien /mob/living/carbon/human/proc/Alienize() - if (notransform) + if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return - notransform = TRUE + ADD_TRAIT(src, TRAIT_NO_TRANSFORM, PERMANENT_TRANSFORMATION_TRAIT) add_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED), TRAIT_GENERIC) for(var/obj/item/W in src) dropItemToGround(W) @@ -216,14 +220,14 @@ new_xeno.set_combat_mode(TRUE) new_xeno.key = key - to_chat(new_xeno, "You are now an alien.") - . = new_xeno + to_chat(new_xeno, span_boldnotice("You are now an alien.")) qdel(src) + return new_xeno /mob/living/carbon/human/proc/slimeize(reproduce as num) - if (notransform) + if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return - notransform = TRUE + ADD_TRAIT(src, TRAIT_NO_TRANSFORM, PERMANENT_TRANSFORMATION_TRAIT) add_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED), TRAIT_GENERIC) for(var/obj/item/W in src) dropItemToGround(W) @@ -248,9 +252,9 @@ new_slime.set_combat_mode(TRUE) new_slime.key = key - to_chat(new_slime, "You are now a slime. Skreee!") - . = new_slime + to_chat(new_slime, span_boldnotice("You are now a slime. Skreee!")) qdel(src) + return new_slime /mob/proc/become_overmind(starting_points = OVERMIND_STARTING_POINTS) var/mob/camera/blob/B = new /mob/camera/blob(get_turf(src), starting_points) @@ -260,9 +264,9 @@ /mob/living/carbon/human/proc/corgize() - if (notransform) + if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return - notransform = TRUE + ADD_TRAIT(src, TRAIT_NO_TRANSFORM, PERMANENT_TRANSFORMATION_TRAIT) Paralyze(1, ignore_canstun = TRUE) for(var/obj/item/W in src) dropItemToGround(W) @@ -276,14 +280,14 @@ new_corgi.set_combat_mode(TRUE) new_corgi.key = key - to_chat(new_corgi, "You are now a Corgi. Yap Yap!") - . = new_corgi + to_chat(new_corgi, span_boldnotice("You are now a Corgi. Yap Yap!")) qdel(src) + return new_corgi /mob/living/carbon/proc/gorillize() - if(notransform) + if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return - notransform = TRUE + ADD_TRAIT(src, TRAIT_NO_TRANSFORM, PERMANENT_TRANSFORMATION_TRAIT) Paralyze(1, ignore_canstun = TRUE) SSblackbox.record_feedback("amount", "gorillas_created", 1) @@ -302,9 +306,9 @@ mind.transfer_to(new_gorilla) else new_gorilla.key = key - to_chat(new_gorilla, "You are now a gorilla. Ooga ooga!") - . = new_gorilla + to_chat(new_gorilla, span_boldnotice("You are now a gorilla. Ooga ooga!")) qdel(src) + return new_gorilla /mob/living/carbon/human/Animalize() @@ -316,9 +320,9 @@ to_chat(usr, span_danger("Sorry but this mob type is currently unavailable.")) return - if(notransform) + if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return - notransform = TRUE + ADD_TRAIT(src, TRAIT_NO_TRANSFORM, PERMANENT_TRANSFORMATION_TRAIT) Paralyze(1, ignore_canstun = TRUE) for(var/obj/item/W in src) @@ -337,8 +341,8 @@ new_mob.set_combat_mode(TRUE) to_chat(new_mob, span_boldnotice("You suddenly feel more... animalistic.")) - . = new_mob qdel(src) + return new_mob /mob/proc/Animalize() @@ -398,4 +402,6 @@ //Not in here? Must be untested! return FALSE +#undef PERMANENT_TRANSFORMATION_TRAIT +#undef TEMPORARY_TRANSFORMATION_TRAIT #undef TRANSFORMATION_DURATION diff --git a/code/modules/projectiles/guns/ballistic/launchers.dm b/code/modules/projectiles/guns/ballistic/launchers.dm index 48d386ee0ad..2963afbaa51 100644 --- a/code/modules/projectiles/guns/ballistic/launchers.dm +++ b/code/modules/projectiles/guns/ballistic/launchers.dm @@ -89,13 +89,13 @@ user.visible_message(span_warning("[user] aims [src] at the ground! It looks like [user.p_theyre()] performing a sick rocket jump!"), \ span_userdanger("You aim [src] at the ground to perform a bisnasty rocket jump...")) if(can_shoot()) - user.notransform = TRUE + ADD_TRAIT(user, TRAIT_NO_TRANSFORM, REF(src)) playsound(src, 'sound/vehicles/rocketlaunch.ogg', 80, TRUE, 5) animate(user, pixel_z = 300, time = 30, easing = LINEAR_EASING) sleep(7 SECONDS) animate(user, pixel_z = 0, time = 5, easing = LINEAR_EASING) sleep(0.5 SECONDS) - user.notransform = FALSE + REMOVE_TRAIT(user, TRAIT_NO_TRANSFORM, REF(src)) process_fire(user, user, TRUE) if(!QDELETED(user)) //if they weren't gibbed by the explosion, take care of them for good. user.gib() diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index 192b7acafd6..d0977f56875 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -787,7 +787,7 @@ if(sunset_mobs.mind && !istype(get_area(sunset_mobs), /area/shuttle/escape/brig)) sunset_mobs.mind.force_escaped = TRUE // Ghostize them and put them in nullspace stasis (for stat & possession checks) - sunset_mobs.notransform = TRUE + ADD_TRAIT(sunset_mobs, TRAIT_NO_TRANSFORM, REF(src)) sunset_mobs.ghostize(FALSE) sunset_mobs.moveToNullspace() diff --git a/code/modules/spells/spell_types/jaunt/bloodcrawl.dm b/code/modules/spells/spell_types/jaunt/bloodcrawl.dm index 8b82595a1f0..836bfd98dca 100644 --- a/code/modules/spells/spell_types/jaunt/bloodcrawl.dm +++ b/code/modules/spells/spell_types/jaunt/bloodcrawl.dm @@ -83,10 +83,10 @@ var/turf/jaunt_turf = get_turf(blood) // Begin the jaunt - jaunter.notransform = TRUE + ADD_TRAIT(jaunter, TRAIT_NO_TRANSFORM, REF(src)) var/obj/effect/dummy/phased_mob/holder = enter_jaunt(jaunter, jaunt_turf) if(!holder) - jaunter.notransform = FALSE + REMOVE_TRAIT(jaunter, TRAIT_NO_TRANSFORM, REF(src)) return FALSE RegisterSignal(holder, COMSIG_MOVABLE_MOVED, PROC_REF(update_status_on_signal)) @@ -104,7 +104,7 @@ playsound(jaunt_turf, 'sound/magic/enter_blood.ogg', 50, TRUE, -1) jaunter.extinguish_mob() - jaunter.notransform = FALSE + REMOVE_TRAIT(jaunter, TRAIT_NO_TRANSFORM, REF(src)) return TRUE /** @@ -113,7 +113,7 @@ */ /datum/action/cooldown/spell/jaunt/bloodcrawl/proc/try_exit_jaunt(obj/effect/decal/cleanable/blood, mob/living/jaunter, forced = FALSE) if(!forced) - if(jaunter.notransform) + if(HAS_TRAIT(jaunter, TRAIT_NO_TRANSFORM)) to_chat(jaunter, span_warning("You cannot exit yet!!")) return FALSE @@ -196,9 +196,9 @@ blind_message = span_notice("You hear a splash."), ) - jaunter.notransform = TRUE + ADD_TRAIT(jaunter, TRAIT_NO_TRANSFORM, REF(src)) consume_victim(victim, jaunter) - jaunter.notransform = FALSE + REMOVE_TRAIT(jaunter, TRAIT_NO_TRANSFORM, REF(src)) return TRUE diff --git a/code/modules/spells/spell_types/jaunt/ethereal_jaunt.dm b/code/modules/spells/spell_types/jaunt/ethereal_jaunt.dm index b4414c99796..43e1f9036ee 100644 --- a/code/modules/spells/spell_types/jaunt/ethereal_jaunt.dm +++ b/code/modules/spells/spell_types/jaunt/ethereal_jaunt.dm @@ -49,9 +49,9 @@ /datum/action/cooldown/spell/jaunt/ethereal_jaunt/proc/do_jaunt(mob/living/cast_on) // Makes sure they don't die or get jostled or something during the jaunt entry // Honestly probably not necessary anymore, but better safe than sorry - cast_on.notransform = TRUE + ADD_TRAIT(cast_on, TRAIT_NO_TRANSFORM, REF(src)) var/obj/effect/dummy/phased_mob/holder = enter_jaunt(cast_on) - cast_on.notransform = FALSE + REMOVE_TRAIT(cast_on, TRAIT_NO_TRANSFORM, REF(src)) if(!holder) CRASH("[type] attempted do_jaunt but failed to create a jaunt holder via enter_jaunt.") @@ -167,9 +167,10 @@ /datum/action/cooldown/spell/jaunt/ethereal_jaunt/proc/end_jaunt(mob/living/cast_on, obj/effect/dummy/phased_mob/spell_jaunt/holder, turf/final_point) if(QDELETED(cast_on) || QDELETED(holder) || QDELETED(src)) return - cast_on.notransform = TRUE + + ADD_TRAIT(cast_on, TRAIT_NO_TRANSFORM, REF(src)) exit_jaunt(cast_on) - cast_on.notransform = FALSE + REMOVE_TRAIT(cast_on, TRAIT_NO_TRANSFORM, REF(src)) REMOVE_TRAIT(cast_on, TRAIT_IMMOBILIZED, REF(src)) diff --git a/code/modules/spells/spell_types/self/rod_form.dm b/code/modules/spells/spell_types/self/rod_form.dm index fd9a52be412..5336036cd2c 100644 --- a/code/modules/spells/spell_types/self/rod_form.dm +++ b/code/modules/spells/spell_types/self/rod_form.dm @@ -138,9 +138,8 @@ our_wizard = WEAKREF(wizard) wizard.forceMove(src) - wizard.notransform = TRUE wizard.status_flags |= GODMODE - ADD_TRAIT(wizard, TRAIT_MAGICALLY_PHASED, REF(src)) + wizard.add_traits(list(TRAIT_MAGICALLY_PHASED, TRAIT_NO_TRANSFORM), REF(src)) /** * Eject our current wizard, removing them from the rod @@ -152,9 +151,8 @@ return wizard.status_flags &= ~GODMODE - wizard.notransform = FALSE + wizard.remove_traits(list(TRAIT_MAGICALLY_PHASED, TRAIT_NO_TRANSFORM), REF(src)) wizard.forceMove(get_turf(src)) our_wizard = null - REMOVE_TRAIT(wizard, TRAIT_MAGICALLY_PHASED, REF(src)) #undef BASE_WIZ_ROD_RANGE diff --git a/code/modules/spells/spell_types/shapeshift/_shape_status.dm b/code/modules/spells/spell_types/shapeshift/_shape_status.dm index b0e8941600b..10d42760c91 100644 --- a/code/modules/spells/spell_types/shapeshift/_shape_status.dm +++ b/code/modules/spells/spell_types/shapeshift/_shape_status.dm @@ -32,7 +32,7 @@ /datum/status_effect/shapechange_mob/on_apply() caster_mob.mind?.transfer_to(owner) caster_mob.forceMove(owner) - caster_mob.notransform = TRUE + ADD_TRAIT(caster_mob, TRAIT_NO_TRANSFORM, REF(src)) caster_mob.apply_status_effect(/datum/status_effect/grouped/stasis, STASIS_SHAPECHANGE_EFFECT) RegisterSignal(owner, COMSIG_LIVING_PRE_WABBAJACKED, PROC_REF(on_wabbajacked)) @@ -77,7 +77,7 @@ UnregisterSignal(caster_mob, list(COMSIG_QDELETING, COMSIG_LIVING_DEATH)) caster_mob.forceMove(owner.loc) - caster_mob.notransform = FALSE + REMOVE_TRAIT(caster_mob, TRAIT_NO_TRANSFORM, REF(src)) caster_mob.remove_status_effect(/datum/status_effect/grouped/stasis, STASIS_SHAPECHANGE_EFFECT) owner.mind?.transfer_to(caster_mob)