diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm
index 00799f40548..37b70848923 100644
--- a/code/__DEFINES/traits/declarations.dm
+++ b/code/__DEFINES/traits/declarations.dm
@@ -33,6 +33,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_EMOTE_MUTE "emote_mute"
#define TRAIT_IGNORESLOWDOWN "ignoreslow"
#define TRAIT_IGNOREDAMAGESLOWDOWN "ignoredamageslowdown"
+/// "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"
/// This mob heals from carp rifts.
#define TRAIT_HEALS_FROM_CARP_RIFTS "heals_from_carp_rifts"
/// This mob heals from cult pylons.
diff --git a/code/__DEFINES/traits/sources.dm b/code/__DEFINES/traits/sources.dm
index 8da9ad842fb..66f3b814765 100644
--- a/code/__DEFINES/traits/sources.dm
+++ b/code/__DEFINES/traits/sources.dm
@@ -4,7 +4,7 @@
/// The item is magically cursed
#define CURSED_ITEM_TRAIT(item_type) "cursed_item_[item_type]"
/// Gives a unique trait source for any given datum
-#define UNIQUE_TRAIT_SOURCE(target) "unique_source_[UID(target)]"
+#define UNIQUE_TRAIT_SOURCE(target) "unique_source_[UID_of(target)]"
/// Trait applied by element
#define ELEMENT_TRAIT(source) "element_trait_[source]"
/// A trait given by a specific status effect (not sure why we need both but whatever!)
@@ -22,6 +22,10 @@
/// cannot be removed without admin intervention
#define ROUNDSTART_TRAIT "roundstart"
+#define CINEMATIC_TRAIT "cinematic"
+
+#define CHASM_TRAIT "chasm_trait"
+
// unique trait sources
#define CULT_EYES "cult_eyes"
#define CLOCK_HANDS "clock_hands"
@@ -29,6 +33,7 @@
#define CHANGELING_TRAIT "changeling"
#define VAMPIRE_TRAIT "vampire"
#define NINJA_TRAIT "space-ninja"
+#define REVENANT_TRAIT "revenant"
/// (B)admins only.
#define ADMIN_TRAIT "admin"
@@ -63,6 +68,13 @@
/// A trait gained from a mob's leap action, like the leaper
#define LEAPING_TRAIT "leaping"
+#define INCORPOREAL_TRAIT "incorporeal"
+
+/// 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"
+
/// Trait given by your current speed
#define SPEED_TRAIT "speed_trait"
diff --git a/code/__HELPERS/unique_ids.dm b/code/__HELPERS/unique_ids.dm
index 946292fceff..5e75f7827e3 100644
--- a/code/__HELPERS/unique_ids.dm
+++ b/code/__HELPERS/unique_ids.dm
@@ -35,6 +35,13 @@ GLOBAL_LIST_EMPTY(uid_log)
GLOB.uid_log[type]++
return unique_datum_id
+
+/proc/UID_of(datum/target)
+ if(!isdatum(target))
+ CRASH("Non-datum passed as argument.")
+ return target.UID()
+
+
/**
* Locates a datum based off of the UID
*
diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm
index b2ffece2691..7d50ed1f503 100644
--- a/code/_globalvars/traits.dm
+++ b/code/_globalvars/traits.dm
@@ -46,6 +46,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_LASEREYES" = TRAIT_LASEREYES,
"TRAIT_MUTE" = TRAIT_MUTE,
"TRAIT_NEGATES_GRAVITY" = TRAIT_NEGATES_GRAVITY,
+ "TRAIT_NO_TRANSFORM" = TRAIT_NO_TRANSFORM,
"TRAIT_PACIFISM" = TRAIT_PACIFISM,
"TRAIT_PULL_BLOCKED" = TRAIT_PULL_BLOCKED,
"TRAIT_RESTRAINED" = TRAIT_RESTRAINED,
diff --git a/code/controllers/subsystem/npcpool.dm b/code/controllers/subsystem/npcpool.dm
index 83b7fd773e8..520fcd05207 100644
--- a/code/controllers/subsystem/npcpool.dm
+++ b/code/controllers/subsystem/npcpool.dm
@@ -26,7 +26,7 @@ SUBSYSTEM_DEF(npcpool)
GLOB.simple_animals[AI_ON] -= SA
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/datums/cinematics/cinematic_datum.dm b/code/datums/cinematics/cinematic_datum.dm
index 8fb1ee23054..4067817df7c 100644
--- a/code/datums/cinematics/cinematic_datum.dm
+++ b/code/datums/cinematics/cinematic_datum.dm
@@ -36,7 +36,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/locked = list()
/// Whether the cinematic is a global cinematic or not
var/is_global = FALSE
@@ -60,7 +60,7 @@
/datum/cinematic/Destroy()
QDEL_NULL(screen)
- QDEL_NULL(special_callback)
+ special_callback = null
watching.Cut()
locked.Cut()
return ..()
@@ -126,11 +126,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_TRAIT))
lock_mob(watching_mob)
// Only show the actual cinematic to cliented mobs.
@@ -187,7 +183,7 @@
*/
/datum/cinematic/proc/lock_mob(mob/to_lock)
locked += to_lock
- to_lock.notransform = TRUE
+ ADD_TRAIT(to_lock, TRAIT_NO_TRANSFORM, CINEMATIC_TRAIT)
/**
@@ -197,7 +193,7 @@
var/mob/locked_mob = mob_ref
if(isnull(locked_mob))
return
- locked_mob.notransform = FALSE
+ REMOVE_TRAIT(locked_mob, TRAIT_NO_TRANSFORM, CINEMATIC_TRAIT)
UnregisterSignal(locked_mob, COMSIG_MOB_CLIENT_LOGIN)
@@ -212,7 +208,7 @@
UnregisterSignal(no_longer_watching, COMSIG_PARENT_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
diff --git a/code/datums/diseases/viruses/transformation.dm b/code/datums/diseases/viruses/transformation.dm
index 2f59da8190f..95330453b3b 100644
--- a/code/datums/diseases/viruses/transformation.dm
+++ b/code/datums/diseases/viruses/transformation.dm
@@ -51,10 +51,10 @@
affected_mob.death(1)
return
- if(affected_mob.notransform)
+ if(HAS_TRAIT(affected_mob, TRAIT_NO_TRANSFORM))
return
- affected_mob.notransform = 1
+ ADD_TRAIT(affected_mob, TRAIT_NO_TRANSFORM, PERMANENT_TRANSFORMATION_TRAIT)
affected_mob.canmove = FALSE
affected_mob.icon = null
affected_mob.cut_overlays()
diff --git a/code/datums/spells/bloodcrawl.dm b/code/datums/spells/bloodcrawl.dm
index 1238774cfaa..699dfd02a29 100644
--- a/code/datums/spells/bloodcrawl.dm
+++ b/code/datums/spells/bloodcrawl.dm
@@ -192,7 +192,7 @@
/obj/effect/proc_holder/spell/bloodcrawl/proc/post_phase_in(mob/living/user, obj/effect/dummy/slaughter/holder)
- user.notransform = FALSE
+ REMOVE_TRAIT(user, TRAIT_NO_TRANSFORM, UNIQUE_TRAIT_SOURCE(src))
/obj/effect/proc_holder/spell/bloodcrawl/proc/phaseout(obj/effect/decal/cleanable/enter_point, mob/living/carbon/user)
@@ -200,7 +200,7 @@
if(istype(user) && !block_hands(user))
return FALSE
- user.notransform = TRUE
+ ADD_TRAIT(user, TRAIT_NO_TRANSFORM, UNIQUE_TRAIT_SOURCE(src))
INVOKE_ASYNC(src, PROC_REF(async_phase), enter_point, user)
return TRUE
@@ -244,8 +244,9 @@
/obj/effect/proc_holder/spell/bloodcrawl/proc/phasein(atom/enter_point, mob/living/user)
-
- if(user.notransform)
+ if(HAS_TRAIT_NOT_FROM(user, TRAIT_NO_TRANSFORM, UNIQUE_TRAIT_SOURCE(src)))
+ return FALSE
+ if(HAS_TRAIT_FROM(user, TRAIT_NO_TRANSFORM, UNIQUE_TRAIT_SOURCE(src)))
to_chat(user, span_warning("Finish eating first!"))
return FALSE
rise_message(enter_point)
diff --git a/code/datums/spells/devil.dm b/code/datums/spells/devil.dm
index 590080a8c09..e8a94f8328f 100644
--- a/code/datums/spells/devil.dm
+++ b/code/datums/spells/devil.dm
@@ -125,7 +125,7 @@
if(continuing)
to_chat(user,"You are now phasing in.")
if(do_mob(user,user,150))
- user.infernalphasein()
+ user.infernalphasein(src)
else
to_chat(user,"You can only re-appear near a potential signer or on a shuttle.")
revert_cast()
@@ -134,8 +134,8 @@
user.fakefire()
to_chat(user,"You begin to phase back into sinful flames.")
if(do_mob(user,user,150))
- user.notransform = TRUE
- user.infernalphaseout()
+ ADD_TRAIT(user, TRAIT_NO_TRANSFORM, UNIQUE_TRAIT_SOURCE(src))
+ user.infernalphaseout(src)
else
to_chat(user,"You must remain still while exiting.")
user.ExtinguishMob()
@@ -144,7 +144,7 @@
revert_cast()
-/mob/living/proc/infernalphaseout()
+/mob/living/proc/infernalphaseout(obj/effect/proc_holder/spell/infernal_jaunt/spell)
dust_animation()
visible_message("[src] disappears in a flashfire!")
playsound(get_turf(src), 'sound/misc/enter_blood.ogg', 100, 1, -1)
@@ -152,14 +152,14 @@
ExtinguishMob()
forceMove(s_holder)
holder = s_holder
- notransform = FALSE
+ REMOVE_TRAIT(src, TRAIT_NO_TRANSFORM, UNIQUE_TRAIT_SOURCE(spell))
fakefireextinguish()
-/mob/living/proc/infernalphasein()
- if(notransform)
+/mob/living/proc/infernalphasein(obj/effect/proc_holder/spell/infernal_jaunt/spell)
+ if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM))
to_chat(src,"You're too busy to jaunt in.")
- return 0
+ return FALSE
fakefire()
forceMove(get_turf(src))
visible_message("[src] appears in a firey blaze!")
diff --git a/code/datums/spells/ethereal_jaunt.dm b/code/datums/spells/ethereal_jaunt.dm
index 908e3577f29..9c184c1f47c 100644
--- a/code/datums/spells/ethereal_jaunt.dm
+++ b/code/datums/spells/ethereal_jaunt.dm
@@ -32,14 +32,14 @@
/obj/effect/proc_holder/spell/ethereal_jaunt/proc/do_jaunt(mob/living/target)
playsound(get_turf(target), sound_in, 50, TRUE, -1)
- target.notransform = TRUE
+ ADD_TRAIT(target, TRAIT_NO_TRANSFORM, UNIQUE_TRAIT_SOURCE(src))
var/turf/mobloc = get_turf(target)
var/obj/effect/dummy/spell_jaunt/holder = new jaunt_type_path(mobloc)
new jaunt_out_type(mobloc, target.dir)
target.ExtinguishMob()
target.forceMove(holder)
target.reset_perspective(holder)
- target.notransform = FALSE //mob is safely inside holder now, no need for protection.
+ REMOVE_TRAIT(target, TRAIT_NO_TRANSFORM, UNIQUE_TRAIT_SOURCE(src))
if(jaunt_water_effect)
jaunt_steam(mobloc)
diff --git a/code/datums/spells/rod_form.dm b/code/datums/spells/rod_form.dm
index 5b170b90a8f..3864c01bfa6 100644
--- a/code/datums/spells/rod_form.dm
+++ b/code/datums/spells/rod_form.dm
@@ -28,10 +28,11 @@
var/turf/start = get_turf(M)
var/obj/effect/immovablerod/wizard/W = new(start, get_ranged_target_turf(M, M.dir, (15 + spell_level * 3)), rod_delay)
W.wizard = M
+ W.spell = src
W.max_distance += spell_level * 3 //You travel farther when you upgrade the spell
W.start_turf = start
M.forceMove(W)
- M.notransform = TRUE
+ ADD_TRAIT(M, TRAIT_NO_TRANSFORM, UNIQUE_TRAIT_SOURCE(src))
M.status_flags |= GODMODE
@@ -42,10 +43,11 @@
var/max_distance = 13
var/mob/living/wizard
var/turf/start_turf
+ var/obj/effect/proc_holder/spell/spell
notify = FALSE
-/obj/effect/immovablerod/wizard/Move()
+/obj/effect/immovablerod/wizard/Move(atom/newloc, direct = NONE, movetime)
if(get_dist(start_turf, get_turf(src)) >= max_distance)
qdel(src)
..()
@@ -54,7 +56,10 @@
/obj/effect/immovablerod/wizard/Destroy()
if(wizard)
wizard.status_flags &= ~GODMODE
- wizard.notransform = FALSE
+ REMOVE_TRAIT(wizard, TRAIT_NO_TRANSFORM, UNIQUE_TRAIT_SOURCE(spell))
wizard.forceMove(get_turf(src))
+ wizard = null
+ spell = null
+ start_turf = null
return ..()
diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm
index 840b77c8d20..22d9b454a87 100644
--- a/code/game/gamemodes/cult/runes.dm
+++ b/code/game/gamemodes/cult/runes.dm
@@ -200,10 +200,10 @@ structure_check() searches for nearby cultist structures required for the invoca
new /obj/effect/temp_visual/dir_setting/cult/phase/out(location, user.dir)
new /obj/effect/temp_visual/dir_setting/cult/phase(target, user.dir)
// So that the mob only appears after the effect is finished
- user.notransform = TRUE
+ ADD_TRAIT(user, TRAIT_NO_TRANSFORM, UNIQUE_TRAIT_SOURCE(src))
user.invisibility = INVISIBILITY_MAXIMUM
- sleep(12)
- user.notransform = FALSE
+ sleep(1.2 SECONDS)
+ REMOVE_TRAIT(user, TRAIT_NO_TRANSFORM, UNIQUE_TRAIT_SOURCE(src))
user.invisibility = 0
/obj/effect/rune/proc/do_invoke_glow()
diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm
index 82c7d6e8b2d..a665f3db892 100644
--- a/code/game/gamemodes/miniantags/revenant/revenant.dm
+++ b/code/game/gamemodes/miniantags/revenant/revenant.dm
@@ -77,7 +77,7 @@
to_chat(src, "You are once more concealed.")
if(unstun_time && world.time >= unstun_time)
unstun_time = 0
- notransform = 0
+ REMOVE_TRAIT(src, TRAIT_NO_TRANSFORM, REVENANT_TRAIT)
to_chat(src, "You can move again!")
update_icon(UPDATE_ICON_STATE)
@@ -217,7 +217,7 @@
return FALSE
to_chat(src, "NO! No... it's too late, you can feel your essence breaking apart...")
- notransform = 1
+ ADD_TRAIT(src, TRAIT_NO_TRANSFORM, REVENANT_TRAIT)
revealed = 1
invisibility = 0
playsound(src, 'sound/effects/screech.ogg', 100, 1)
@@ -297,7 +297,7 @@
return
if(time <= 0)
return
- notransform = 1
+ ADD_TRAIT(src, TRAIT_NO_TRANSFORM, REVENANT_TRAIT)
if(!unstun_time)
to_chat(src, "You cannot move!")
unstun_time = world.time + time
@@ -308,7 +308,7 @@
/mob/living/simple_animal/revenant/update_icon_state()
if(revealed)
- if(notransform)
+ if(HAS_TRAIT_FROM(src, TRAIT_NO_TRANSFORM, REVENANT_TRAIT))
if(draining)
icon_state = icon_drain
else
diff --git a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm
index 4d830affed4..c30977e3b83 100644
--- a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm
+++ b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm
@@ -183,7 +183,7 @@ GLOBAL_LIST_INIT(possibleShadowlingNames, list("U'ruan", "Y`shej", "Nex", "Hel-u
return
if("Yes")
- user.notransform = TRUE
+ ADD_TRAIT(user, TRAIT_NO_TRANSFORM, PERMANENT_TRANSFORMATION_TRAIT)
user.visible_message("[user] gently rises into the air, red light glowing in its eyes.", \
"You rise into the air and get ready for your transformation.")
diff --git a/code/game/objects/items/weapons/anomaly_extract.dm b/code/game/objects/items/weapons/anomaly_extract.dm
index 1ad55fc89e6..ee174ba9cd2 100644
--- a/code/game/objects/items/weapons/anomaly_extract.dm
+++ b/code/game/objects/items/weapons/anomaly_extract.dm
@@ -100,9 +100,8 @@
/obj/effect/proc_holder/spell/slime_degradation/proc/slime_transform(mob/living/carbon/human/user)
- for(var/obj/item/I in user)
- if(!istype(I, /obj/item/implant))
- user.drop_item_ground(I, force = TRUE)
+ for(var/obj/item/check as anything in user.get_equipped_items(include_pockets = TRUE, include_hands = TRUE))
+ user.drop_item_ground(check, force = TRUE)
user.underwear = "Nude"
user.undershirt = "Nude"
@@ -116,7 +115,7 @@
span_notice("You hear something squishing..."))
original_body = user
- user.notransform = TRUE
+ ADD_TRAIT(original_body, TRAIT_NO_TRANSFORM, UNIQUE_TRAIT_SOURCE(src))
slimeme.status_flags |= GODMODE
user.status_flags |= GODMODE
slimeme.canmove = FALSE
@@ -148,7 +147,6 @@
cooldown_handler.start_recharge()
playsound(get_turf(usr), sound, 50, TRUE)
user.density = FALSE
- original_body.notransform = TRUE
original_body.dir = SOUTH
original_body.forceMove(get_turf(user))
original_body.canmove = FALSE
@@ -170,7 +168,7 @@
stack_trace("Spell or original_body was qdeled during the [src] work.")
return
- original_body.notransform = FALSE
+ REMOVE_TRAIT(original_body, TRAIT_NO_TRANSFORM, UNIQUE_TRAIT_SOURCE(src))
original_body.status_flags &= ~GODMODE
original_body.canmove = TRUE
is_transformed = FALSE
diff --git a/code/game/turfs/simulated/floor/chasm.dm b/code/game/turfs/simulated/floor/chasm.dm
index 42ec1d3c2bb..1ae87d1228f 100644
--- a/code/game/turfs/simulated/floor/chasm.dm
+++ b/code/game/turfs/simulated/floor/chasm.dm
@@ -236,7 +236,7 @@
into the enveloping dark."))
if(isliving(AM))
var/mob/living/L = AM
- L.notransform = TRUE
+ ADD_TRAIT(L, TRAIT_NO_TRANSFORM, CHASM_TRAIT)
L.Stun(400 SECONDS)
L.resting = TRUE
var/oldtransform = AM.transform
@@ -283,11 +283,10 @@
visible_message(span_boldwarning("[src] spits out [AM]!"))
AM.throw_at(get_edge_target_turf(src, pick(GLOB.alldirs)), rand(1, 10), rand(1, 10))
-
var/mob/living/fallen_mob = AM
if(fallen_mob.stat != DEAD)
fallen_mob.death(TRUE)
- fallen_mob.notransform = FALSE
+ REMOVE_TRAIT(fallen_mob, TRAIT_NO_TRANSFORM, CHASM_TRAIT)
fallen_mob.apply_damage(1000)
else
@@ -317,7 +316,7 @@
if(isliving(gone))
UnregisterSignal(gone, COMSIG_LIVING_REVIVE)
-#define CHASM_TRAIT "chasm trait"
+
/**
* Called if something comes back to life inside the pit. Expected sources are badmins and changelings.
* Ethereals should take enough damage to be smashed and not revive.
@@ -341,7 +340,6 @@
escapee.Sleeping(20 SECONDS)
UnregisterSignal(escapee, COMSIG_LIVING_REVIVE)
-#undef CHASM_TRAIT
/turf/simulated/floor/chasm/straight_down/lava_land_surface/normal_air
oxygen = MOLES_O2STANDARD
diff --git a/code/modules/antagonists/vampire/vampire_powers/bestia_powers.dm b/code/modules/antagonists/vampire/vampire_powers/bestia_powers.dm
index 2a955cf4437..b8d37372100 100644
--- a/code/modules/antagonists/vampire/vampire_powers/bestia_powers.dm
+++ b/code/modules/antagonists/vampire/vampire_powers/bestia_powers.dm
@@ -1004,7 +1004,7 @@
vampire.stop_sucking()
original_body = user
vampire_animal.status_flags |= GODMODE
- user.notransform = TRUE
+ ADD_TRAIT(user, TRAIT_NO_TRANSFORM, UNIQUE_TRAIT_SOURCE(src))
user.status_flags |= GODMODE
vampire_animal.canmove = FALSE
user.forceMove(vampire_animal)
@@ -1066,7 +1066,7 @@
stack_trace("Spell or original_body was qdeled during the [src] work.")
return
- original_body.notransform = FALSE
+ REMOVE_TRAIT(original_body, TRAIT_NO_TRANSFORM, UNIQUE_TRAIT_SOURCE(src))
original_body.status_flags &= ~GODMODE
original_body.update_canmove()
is_transformed = FALSE
diff --git a/code/modules/awaymissions/zvis.dm b/code/modules/awaymissions/zvis.dm
index cb6caf83efd..a388715ca35 100644
--- a/code/modules/awaymissions/zvis.dm
+++ b/code/modules/awaymissions/zvis.dm
@@ -302,7 +302,7 @@
var/ox = thing.x - x
var/oy = thing.y - y
if(istype(M) && M.client)
- M.notransform = 1
+ ADD_TRAIT(M, TRAIT_NO_TRANSFORM, UNIQUE_TRAIT_SOURCE(src))
// cover up client-side map loading
M.screen_loc = "CENTER"
M.client.screen += M
@@ -321,7 +321,8 @@
M.screen_loc = initial(M.screen_loc)
thing.forceMove(get_turf(other.loc))
if(istype(M) && M.client)
- M.notransform = 0
+ REMOVE_TRAIT(M, TRAIT_NO_TRANSFORM, UNIQUE_TRAIT_SOURCE(src))
+
/obj/effect/view_portal/visual/attack_ghost(mob/user)
user.forceMove(get_turf(other.loc))
diff --git a/code/modules/client/client_defines.dm b/code/modules/client/client_defines.dm
index 323a6882665..006b5c242aa 100644
--- a/code/modules/client/client_defines.dm
+++ b/code/modules/client/client_defines.dm
@@ -19,7 +19,6 @@
var/datum/preferences/prefs = null
var/move_delay = 1
var/current_move_delay = 0
- var/moving = null
var/area = null
var/time_joined_as_mouse = null //when the client last spawned as a mouse
diff --git a/code/modules/mining/lavaland/loot/colossus_loot.dm b/code/modules/mining/lavaland/loot/colossus_loot.dm
index ff700d68a2f..42408bd598b 100644
--- a/code/modules/mining/lavaland/loot/colossus_loot.dm
+++ b/code/modules/mining/lavaland/loot/colossus_loot.dm
@@ -372,7 +372,7 @@
/obj/structure/closet/stasis/Entered(atom/A)
if(isliving(A) && holder_animal)
var/mob/living/L = A
- L.notransform = 1
+ ADD_TRAIT(L, TRAIT_NO_TRANSFORM, UNIQUE_TRAIT_SOURCE(src))
L.mutations |= MUTE
L.status_flags |= GODMODE
L.mind.transfer_to(holder_animal)
@@ -385,7 +385,7 @@
for(var/mob/living/L in src)
L.mutations -=MUTE
L.status_flags &= ~GODMODE
- L.notransform = 0
+ REMOVE_TRAIT(L, TRAIT_NO_TRANSFORM, UNIQUE_TRAIT_SOURCE(src))
if(holder_animal && !QDELETED(holder_animal))
holder_animal.mind.transfer_to(L)
L.mind.RemoveSpell(/obj/effect/proc_holder/spell/exit_possession)
diff --git a/code/modules/mining/lavaland/loot/tendril_loot.dm b/code/modules/mining/lavaland/loot/tendril_loot.dm
index 24056a89a3a..f6fcf191dae 100644
--- a/code/modules/mining/lavaland/loot/tendril_loot.dm
+++ b/code/modules/mining/lavaland/loot/tendril_loot.dm
@@ -444,7 +444,7 @@
effect.desc = "It's shaped an awful lot like [user.name]."
effect.setDir(user.dir)
user.forceMove(effect)
- user.notransform = TRUE
+ ADD_TRAIT(user, TRAIT_NO_TRANSFORM, UNIQUE_TRAIT_SOURCE(src))
user.status_flags |= GODMODE
addtimer(CALLBACK(src, PROC_REF(reappear), user, effect), 10 SECONDS)
@@ -460,7 +460,7 @@
return
user.status_flags &= ~GODMODE
- user.notransform = FALSE
+ REMOVE_TRAIT(user, TRAIT_NO_TRANSFORM, UNIQUE_TRAIT_SOURCE(src))
user.forceMove(effect_turf)
user.visible_message(span_danger("[user] pops back into reality!"))
effect.can_destroy = TRUE
diff --git a/code/modules/mob/living/carbon/alien/death.dm b/code/modules/mob/living/carbon/alien/death.dm
index e5610a983a1..ca3f7402611 100644
--- a/code/modules/mob/living/carbon/alien/death.dm
+++ b/code/modules/mob/living/carbon/alien/death.dm
@@ -3,7 +3,7 @@
return FALSE
death(1)
var/atom/movable/overlay/animation = null
- notransform = 1
+ ADD_TRAIT(src, TRAIT_NO_TRANSFORM, PERMANENT_TRANSFORMATION_TRAIT)
canmove = FALSE
icon = null
invisibility = INVISIBILITY_ABSTRACT
@@ -26,7 +26,7 @@
/mob/living/carbon/alien/dust()
if(!death(TRUE) && stat != DEAD)
return FALSE
- notransform = 1
+ ADD_TRAIT(src, TRAIT_NO_TRANSFORM, PERMANENT_TRANSFORMATION_TRAIT)
canmove = FALSE
icon = null
invisibility = INVISIBILITY_ABSTRACT
diff --git a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm
index 1cb6ca9686d..6d088348435 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm
@@ -60,8 +60,7 @@
/mob/living/carbon/alien/humanoid/regenerate_icons()
- ..()
- if(notransform)
+ if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM))
return
//update_inv_head()
diff --git a/code/modules/mob/living/carbon/brain/death.dm b/code/modules/mob/living/carbon/brain/death.dm
index dbef53fce91..f5287eaeb2e 100644
--- a/code/modules/mob/living/carbon/brain/death.dm
+++ b/code/modules/mob/living/carbon/brain/death.dm
@@ -12,7 +12,7 @@
// can we muster a parent call here?
if(!death(TRUE) && stat != DEAD)
return FALSE
- notransform = 1
+ ADD_TRAIT(src, TRAIT_NO_TRANSFORM, PERMANENT_TRANSFORMATION_TRAIT)
canmove = FALSE
icon = null
invisibility = INVISIBILITY_ABSTRACT
diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm
index 6d6ff24e375..df963ca81c3 100644
--- a/code/modules/mob/living/carbon/human/death.dm
+++ b/code/modules/mob/living/carbon/human/death.dm
@@ -2,7 +2,7 @@
if(!death(TRUE) && stat != DEAD)
return FALSE
var/atom/movable/overlay/animation = null
- notransform = 1
+ ADD_TRAIT(src, TRAIT_NO_TRANSFORM, PERMANENT_TRANSFORMATION_TRAIT)
canmove = FALSE
icon = null
invisibility = INVISIBILITY_ABSTRACT
@@ -50,7 +50,7 @@
/mob/living/carbon/human/dust()
if(!death(TRUE) && stat != DEAD)
return FALSE
- notransform = 1
+ ADD_TRAIT(src, TRAIT_NO_TRANSFORM, PERMANENT_TRANSFORMATION_TRAIT)
canmove = FALSE
icon = null
invisibility = INVISIBILITY_ABSTRACT
@@ -75,7 +75,7 @@
if(!death(TRUE) && stat != DEAD)
return FALSE
var/atom/movable/overlay/animation = null
- notransform = 1
+ ADD_TRAIT(src, TRAIT_NO_TRANSFORM, PERMANENT_TRANSFORMATION_TRAIT)
canmove = FALSE
icon = null
invisibility = INVISIBILITY_ABSTRACT
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 08823d8de3e..0e002025427 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -1,6 +1,7 @@
/mob/living/carbon/human/Life(seconds, times_fired)
set invisibility = 0
- if(notransform)
+
+ if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM))
return
. = ..()
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 22e53d3ff3a..79dd4bf509c 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -517,7 +517,7 @@ GLOBAL_LIST_EMPTY(damage_icon_parts)
/* --------------------------------------- */
//For legacy support.
/mob/living/carbon/human/regenerate_icons()
- if(notransform)
+ if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM))
return
cut_overlays()
update_mutantrace(update_hair = FALSE)
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index 8881324527b..ad47f68f44e 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -1,7 +1,7 @@
/mob/living/carbon/Life(seconds, times_fired)
set invisibility = 0
- if(notransform)
+ if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM))
return
if(damageoverlaytemp)
diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm
index 2ca6e7acde9..6321370929d 100644
--- a/code/modules/mob/living/death.dm
+++ b/code/modules/mob/living/death.dm
@@ -4,7 +4,7 @@
if(!death(TRUE) && stat != DEAD)
return FALSE
// hide and freeze for the GC
- notransform = 1
+ ADD_TRAIT(src, TRAIT_NO_TRANSFORM, PERMANENT_TRANSFORMATION_TRAIT)
canmove = FALSE
icon = null
invisibility = INVISIBILITY_ABSTRACT
@@ -22,7 +22,7 @@
return FALSE
new /obj/effect/decal/cleanable/ash(loc)
// hide and freeze them while they get GC'd
- notransform = 1
+ ADD_TRAIT(src, TRAIT_NO_TRANSFORM, PERMANENT_TRANSFORMATION_TRAIT)
canmove = FALSE
icon = null
invisibility = INVISIBILITY_ABSTRACT
@@ -33,7 +33,7 @@
if(!death(TRUE) && stat != DEAD)
return FALSE
// hide and freeze them while they get GC'd
- notransform = 1
+ ADD_TRAIT(src, TRAIT_NO_TRANSFORM, PERMANENT_TRANSFORMATION_TRAIT)
canmove = FALSE
icon = null
invisibility = INVISIBILITY_ABSTRACT
diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm
index 7e1ed4a8dc9..7f941f681c1 100644
--- a/code/modules/mob/living/life.dm
+++ b/code/modules/mob/living/life.dm
@@ -14,8 +14,9 @@
add_misc_logs(src, "Z-TRACKING: [src] of type [src.type] has a Z-registration despite not having a client.")
update_z(null)
- if(notransform)
+ if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM))
return FALSE
+
if(!loc)
return FALSE
diff --git a/code/modules/mob/living/silicon/death.dm b/code/modules/mob/living/silicon/death.dm
index 6e6094f09fb..125e2dae72d 100644
--- a/code/modules/mob/living/silicon/death.dm
+++ b/code/modules/mob/living/silicon/death.dm
@@ -1,7 +1,7 @@
/mob/living/silicon/gib()
death(1)
var/atom/movable/overlay/animation = null
- notransform = 1
+ ADD_TRAIT(src, TRAIT_NO_TRANSFORM, PERMANENT_TRANSFORMATION_TRAIT)
canmove = FALSE
icon = null
invisibility = INVISIBILITY_ABSTRACT
@@ -25,7 +25,7 @@
/mob/living/silicon/dust()
if(!death(TRUE) && stat != DEAD)
return FALSE
- notransform = 1
+ ADD_TRAIT(src, TRAIT_NO_TRANSFORM, PERMANENT_TRANSFORMATION_TRAIT)
canmove = FALSE
icon = null
invisibility = INVISIBILITY_ABSTRACT
diff --git a/code/modules/mob/living/silicon/robot/death.dm b/code/modules/mob/living/silicon/robot/death.dm
index e0c05f62ec9..0e2593701ba 100644
--- a/code/modules/mob/living/silicon/robot/death.dm
+++ b/code/modules/mob/living/silicon/robot/death.dm
@@ -3,7 +3,7 @@
return FALSE
//robots don't die when gibbed. instead they drop their MMI'd brain
var/atom/movable/overlay/animation = null
- notransform = 1
+ ADD_TRAIT(src, TRAIT_NO_TRANSFORM, PERMANENT_TRANSFORMATION_TRAIT)
canmove = FALSE
icon = null
invisibility = INVISIBILITY_ABSTRACT
@@ -32,7 +32,7 @@
/mob/living/silicon/robot/dust()
if(!death(TRUE) && stat != DEAD)
return FALSE
- notransform = 1
+ ADD_TRAIT(src, TRAIT_NO_TRANSFORM, PERMANENT_TRANSFORMATION_TRAIT)
canmove = FALSE
icon = null
invisibility = INVISIBILITY_ABSTRACT
diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm
index 4d9ad26a7e7..656bfcdb507 100644
--- a/code/modules/mob/living/silicon/robot/life.dm
+++ b/code/modules/mob/living/silicon/robot/life.dm
@@ -1,6 +1,7 @@
/mob/living/silicon/robot/Life(seconds, times_fired)
set invisibility = 0
- if(notransform)
+
+ if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM))
return
. = ..()
diff --git a/code/modules/mob/living/simple_animal/slime/life.dm b/code/modules/mob/living/simple_animal/slime/life.dm
index daf434607a0..a383f7fb27a 100644
--- a/code/modules/mob/living/simple_animal/slime/life.dm
+++ b/code/modules/mob/living/simple_animal/slime/life.dm
@@ -9,8 +9,10 @@
/mob/living/simple_animal/slime/Life()
set invisibility = 0
- if(notransform)
+
+ if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM))
return
+
if(..())
if(buckled)
handle_feeding()
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 5c6f1703188..4e90a3d2324 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -805,13 +805,17 @@
// facing verbs
/mob/proc/canface()
- if(!canmove) return 0
- if(client.moving) return 0
- if(stat==2) return 0
- if(anchored) return 0
- if(notransform) return 0
- if(restrained()) return 0
- return 1
+ if(!canmove)
+ return FALSE
+ if(stat == DEAD)
+ return FALSE
+ if(anchored)
+ return FALSE
+ if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM))
+ return FALSE
+ if(restrained())
+ return FALSE
+ return TRUE
/mob/proc/fall(var/forced)
drop_l_hand()
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index ceb324559bb..bb6d1343ed3 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -59,7 +59,6 @@
var/currently_grab_pulled = null /// only set while the move is ongoing, to prevent shuffling between pullees
var/memory = ""
var/next_move = null
- var/notransform = null //Carbon
var/hand = null // 0 - right hand is active, 1 - left hand is active
var/real_name = null
var/flavor_text = ""
diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm
index 2f7a1e3dc57..e8c1ceda6db 100644
--- a/code/modules/mob/mob_movement.dm
+++ b/code/modules/mob/mob_movement.dm
@@ -33,8 +33,8 @@
if(!n || !direct) // why did we never check this before?
return FALSE
- if(mob.notransform)
- return 0 //This is sota the goto stop mobs from moving var
+ if(HAS_TRAIT(mob, TRAIT_NO_TRANSFORM))
+ return FALSE //This is sota the goto stop mobs from moving var
if(mob.control_object)
return Move_object(direct)
@@ -49,9 +49,6 @@
if(SEND_SIGNAL(mob, COMSIG_MOB_CLIENT_PRE_LIVING_MOVE, n, direct) & COMSIG_MOB_CLIENT_BLOCK_PRE_LIVING_MOVE)
return FALSE
- if(moving)
- return 0
-
var/mob/living/L = mob //Already checked for isliving earlier
if(L.incorporeal_move)//Move though walls
move_delay = world.time + 0.5 // cap to 20fps
@@ -234,10 +231,10 @@
if(INCORPOREAL_REVENANT) //Incorporeal move, but blocked by holy-watered tiles
var/turf/simulated/floor/stepTurf = get_step(L, direct)
if(stepTurf.flags & NOJAUNT)
- to_chat(L, "Святые силы блокируют ваш путь.")
- L.notransform = 1
+ to_chat(L, span_warning("Святые силы блокируют ваш путь."))
+ ADD_TRAIT(L, TRAIT_NO_TRANSFORM, INCORPOREAL_TRAIT)
spawn(2)
- L.notransform = 0
+ REMOVE_TRAIT(L, TRAIT_NO_TRANSFORM, INCORPOREAL_TRAIT)
else
L.forceMove(get_step(L, direct))
L.dir = direct
diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm
index ecd258aeaa0..5843cb94f52 100644
--- a/code/modules/mob/transform_procs.dm
+++ b/code/modules/mob/transform_procs.dm
@@ -19,11 +19,11 @@
return ..()
/mob/living/carbon/AIize()
- if(notransform)
+ if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM))
return
for(var/obj/item/check as anything in get_equipped_items(include_pockets = TRUE, include_hands = TRUE))
drop_item_ground(check, force = TRUE)
- notransform = TRUE
+ ADD_TRAIT(src, TRAIT_NO_TRANSFORM, PERMANENT_TRANSFORMATION_TRAIT)
canmove = FALSE
icon = null
invisibility = INVISIBILITY_ABSTRACT
@@ -65,12 +65,12 @@
* AI: A reference to the AI we want to connect to.
*/
/mob/living/carbon/human/proc/Robotize(cell_type = null, connect_to_default_AI = TRUE, mob/living/silicon/ai/AI = null)
- if(notransform)
+ if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM))
return
for(var/obj/item/check as anything in get_equipped_items(include_pockets = TRUE, include_hands = TRUE))
drop_item_ground(check, force = TRUE)
- notransform = TRUE
+ ADD_TRAIT(src, TRAIT_NO_TRANSFORM, PERMANENT_TRANSFORMATION_TRAIT)
canmove = FALSE
icon = null
invisibility = INVISIBILITY_ABSTRACT
@@ -130,11 +130,11 @@
return O
/mob/living/carbon/human/proc/corgize()
- if(notransform)
+ if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM))
return
for(var/obj/item/check as anything in get_equipped_items(include_pockets = TRUE, include_hands = TRUE))
drop_item_ground(check, force = TRUE)
- notransform = TRUE
+ ADD_TRAIT(src, TRAIT_NO_TRANSFORM, PERMANENT_TRANSFORMATION_TRAIT)
canmove = FALSE
icon = null
invisibility = INVISIBILITY_ABSTRACT
@@ -153,12 +153,12 @@
var/list/mobtypes = typesof(/mob/living/simple_animal)
var/mobpath = input("Which type of mob should [src] turn into?", "Choose a type") in mobtypes
- if(notransform)
+ if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM))
return
for(var/obj/item/check as anything in get_equipped_items(include_pockets = TRUE, include_hands = TRUE))
drop_item_ground(check, force = TRUE)
- notransform = TRUE
+ ADD_TRAIT(src, TRAIT_NO_TRANSFORM, PERMANENT_TRANSFORMATION_TRAIT)
canmove = FALSE
icon = null
invisibility = INVISIBILITY_ABSTRACT
@@ -191,11 +191,11 @@
qdel(src)
/mob/living/carbon/human/proc/paize(name, bespai)
- if(notransform)
+ if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM))
return
for(var/obj/item/check as anything in get_equipped_items(include_pockets = TRUE, include_hands = TRUE))
drop_item_ground(check, force = TRUE)
- notransform = TRUE
+ ADD_TRAIT(src, TRAIT_NO_TRANSFORM, PERMANENT_TRANSFORMATION_TRAIT)
canmove = FALSE
icon = null
invisibility = INVISIBILITY_ABSTRACT
@@ -219,7 +219,7 @@
INVOKE_ASYNC(GLOBAL_PROC, /proc/qdel, src)
/mob/proc/gorillize(gorilla_type = "Normal", message = TRUE)
- if(notransform)
+ if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM))
return
if(stat == DEAD)
@@ -228,7 +228,7 @@
for(var/obj/item/check as anything in get_equipped_items(include_pockets = TRUE, include_hands = TRUE))
drop_item_ground(check, force = TRUE)
- notransform = TRUE
+ ADD_TRAIT(src, TRAIT_NO_TRANSFORM, PERMANENT_TRANSFORMATION_TRAIT)
icon = null
invisibility = INVISIBILITY_MAXIMUM
diff --git a/code/modules/projectiles/guns/projectile/launchers.dm b/code/modules/projectiles/guns/projectile/launchers.dm
index ca7257430c0..daf249c26da 100644
--- a/code/modules/projectiles/guns/projectile/launchers.dm
+++ b/code/modules/projectiles/guns/projectile/launchers.dm
@@ -150,13 +150,13 @@
/obj/item/gun/projectile/revolver/rocketlauncher/suicide_act(mob/user)
user.visible_message("[user] aims [src] at the ground! It looks like [user.p_theyre()] performing a sick rocket jump!")
if(can_shoot(user))
- user.notransform = TRUE
+ ADD_TRAIT(user, TRAIT_NO_TRANSFORM, UNIQUE_TRAIT_SOURCE(src))
playsound(src, 'sound/weapons/rocketlaunch.ogg', 80, 1, 5)
animate(user, pixel_z = 300, time = 3 SECONDS, easing = LINEAR_EASING)
sleep(7 SECONDS)
animate(user, pixel_z = 0, time = 0.5 SECONDS, easing = LINEAR_EASING)
sleep(0.5 SECONDS)
- user.notransform = FALSE
+ REMOVE_TRAIT(user, TRAIT_NO_TRANSFORM, UNIQUE_TRAIT_SOURCE(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/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm
index 2556e7b658d..2109a925cfc 100644
--- a/code/modules/projectiles/projectile/magic.dm
+++ b/code/modules/projectiles/projectile/magic.dm
@@ -157,8 +157,8 @@
wabbajack(change)
/proc/wabbajack(mob/living/M)
- if(istype(M) && M.stat != DEAD && !M.notransform)
- M.notransform = TRUE
+ if(istype(M) && M.stat != DEAD && !HAS_TRAIT(M, TRAIT_NO_TRANSFORM))
+ ADD_TRAIT(M, TRAIT_NO_TRANSFORM, PERMANENT_TRANSFORMATION_TRAIT)
M.canmove = FALSE
M.icon = null
M.cut_overlays()
diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm
index 432d545effe..2973a98766a 100644
--- a/code/modules/research/xenobiology/xenobiology.dm
+++ b/code/modules/research/xenobiology/xenobiology.dm
@@ -784,7 +784,7 @@
var/mob/living/M = A
if(M in immune)
continue
- M.notransform = 1
+ ADD_TRAIT(M, TRAIT_NO_TRANSFORM, UNIQUE_TRAIT_SOURCE(src))
M.set_anchored(TRUE)
if(istype(M, /mob/living/simple_animal/hostile))
var/mob/living/simple_animal/hostile/H = M
@@ -812,7 +812,7 @@
return
/obj/effect/timestop/proc/unfreeze_mob(mob/living/M)
- M.notransform = 0
+ REMOVE_TRAIT(M, TRAIT_NO_TRANSFORM, UNIQUE_TRAIT_SOURCE(src))
M.set_anchored(FALSE)
if(istype(M, /mob/living/simple_animal/hostile))
var/mob/living/simple_animal/hostile/H = M
diff --git a/code/modules/ruins/lavalandruin_code/puzzle.dm b/code/modules/ruins/lavalandruin_code/puzzle.dm
index 39434f98075..8af8b9e17c8 100644
--- a/code/modules/ruins/lavalandruin_code/puzzle.dm
+++ b/code/modules/ruins/lavalandruin_code/puzzle.dm
@@ -287,7 +287,7 @@
/obj/effect/sliding_puzzle/prison/dispense_reward()
prisoner.forceMove(get_turf(src))
- prisoner.notransform = FALSE
+ REMOVE_TRAIT(prisoner, TRAIT_NO_TRANSFORM, UNIQUE_TRAIT_SOURCE(src))
prisoner = null
//Some armor so it's harder to kill someone by mistake.
@@ -327,7 +327,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, UNIQUE_TRAIT_SOURCE(cube))
prisoner.forceMove(cube)
to_chat(prisoner,"You're trapped by the prison cube! You will remain trapped until someone solves it.")