Transformation Deduplication (#19034)

* transformation deduplication

deduplicates a bunch of tf verbs

* whoops

* double whoops

* small fix

* more deduplication

* fair point

* whoops

* some more deduplication
This commit is contained in:
MeepleMuncher
2026-01-17 19:39:57 +02:00
committed by GitHub
parent 2a6ecb04c8
commit d81dc2a075
8 changed files with 50 additions and 373 deletions
@@ -478,50 +478,10 @@
if(new_mob && isliving(new_mob))
species.lleill_energy -= energy_cost
for(var/obj/belly/B as anything in new_mob.vore_organs)
new_mob.vore_organs -= B
qdel(B)
new_mob.vore_organs = list()
new_mob.name = M.name
new_mob.real_name = M.real_name
add_verb(new_mob, /mob/living/proc/revert_beast_form)
add_verb(new_mob, /mob/living/proc/set_size)
add_verb(new_mob, /mob/living/simple_mob/proc/ColorMate)
for(var/lang in M.languages)
new_mob.languages |= lang
M.copy_vore_prefs_to_mob(new_mob)
new_mob.vore_selected = M.vore_selected
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(ishuman(new_mob))
var/mob/living/carbon/human/N = new_mob
N.gender = H.gender
N.identifying_gender = H.identifying_gender
else
new_mob.gender = H.gender
else
new_mob.gender = M.gender
if(ishuman(new_mob))
var/mob/living/carbon/human/N = new_mob
N.identifying_gender = M.gender
for(var/obj/belly/B as anything in M.vore_organs)
B.loc = new_mob
B.forceMove(new_mob)
B.owner = new_mob
M.vore_organs -= B
new_mob.vore_organs += B
new_mob.ckey = M.ckey
if(M.ai_holder && new_mob.ai_holder)
var/datum/ai_holder/old_AI = M.ai_holder
old_AI.set_stance(STANCE_SLEEP)
var/datum/ai_holder/new_AI = new_mob.ai_holder
new_AI.hostile = old_AI.hostile
new_AI.retaliate = old_AI.retaliate
M.loc = new_mob
M.forceMove(new_mob)
new_mob.tf_mob_holder = M
transfer_mob_identity(new_mob)
new_mob.visible_message(span_infoplain(span_bold("\The [src]") + " has transformed into \the [chosen_beast]!"))
species.update_lleill_hud(src)
@@ -563,12 +523,7 @@
ourmob.forceMove(beast_loc)
ourmob.vore_selected = vore_selected
vore_selected = null
for(var/obj/belly/B as anything in vore_organs)
B.loc = ourmob
B.forceMove(ourmob)
B.owner = ourmob
vore_organs -= B
ourmob.vore_organs += B
ourmob.mob_belly_transfer(src)
ourmob.Life(1)
@@ -682,51 +637,8 @@
if(new_mob && isliving(new_mob))
species.lleill_energy -= energy_cost
for(var/obj/belly/B as anything in new_mob.vore_organs)
new_mob.vore_organs -= B
qdel(B)
new_mob.vore_organs = list()
new_mob.name = M.name
new_mob.real_name = M.real_name
add_verb(new_mob, /mob/living/proc/revert_beast_form)
add_verb(new_mob, /mob/living/proc/set_size)
add_verb(new_mob, /mob/living/simple_mob/proc/ColorMate)
new_mob.hasthermals = 0
new_mob.health = M.health
new_mob.maxHealth = M.health
for(var/lang in M.languages)
new_mob.languages |= lang
M.copy_vore_prefs_to_mob(new_mob)
new_mob.vore_selected = M.vore_selected
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(ishuman(new_mob))
var/mob/living/carbon/human/N = new_mob
N.gender = H.gender
N.identifying_gender = H.identifying_gender
else
new_mob.gender = H.gender
else
new_mob.gender = M.gender
if(ishuman(new_mob))
var/mob/living/carbon/human/N = new_mob
N.identifying_gender = M.gender
for(var/obj/belly/B as anything in M.vore_organs)
B.loc = new_mob
B.forceMove(new_mob)
B.owner = new_mob
M.vore_organs -= B
new_mob.vore_organs += B
new_mob.ckey = M.ckey
if(M.ai_holder && new_mob.ai_holder)
var/datum/ai_holder/old_AI = M.ai_holder
old_AI.set_stance(STANCE_SLEEP)
var/datum/ai_holder/new_AI = new_mob.ai_holder
new_AI.hostile = old_AI.hostile
new_AI.retaliate = old_AI.retaliate
M.loc = new_mob
M.forceMove(new_mob)
new_mob.tf_mob_holder = M
transfer_mob_identity(new_mob)
new_mob.visible_message(span_infoplain(span_bold("\The [src]") + " has transformed into \the [chosen_beast]!"))
@@ -403,27 +403,7 @@
if(!istype(M))
return
if(M.tf_mob_holder)
var/mob/living/ourmob = M.tf_mob_holder
if(ourmob.ai_holder)
var/datum/ai_holder/our_AI = ourmob.ai_holder
our_AI.set_stance(STANCE_IDLE)
M.tf_mob_holder = null
ourmob.ckey = M.ckey
var/turf/get_dat_turf = get_turf(target)
ourmob.loc = get_dat_turf
ourmob.forceMove(get_dat_turf)
ourmob.vore_selected = M.vore_selected
M.vore_selected = null
ourmob.mob_belly_transfer(M)
ourmob.Life(1)
if(ishuman(M))
for(var/obj/item/W in M)
if(istype(W, /obj/item/implant/backup) || istype(W, /obj/item/nif))
continue
M.drop_from_inventory(W)
qdel(target)
M.revert_mob_tf()
return
else
if(M.stat == DEAD) //We can let it undo the TF, because the person will be dead, but otherwise things get weird.
+1 -6
View File
@@ -79,12 +79,7 @@
tf_mob_holder.forceMove(get_dat_turf)
QDEL_LIST_NULL(tf_mob_holder.vore_organs)
tf_mob_holder.vore_organs = list()
for(var/obj/belly/B as anything in vore_organs)
B.loc = tf_mob_holder
B.forceMove(tf_mob_holder)
B.owner = tf_mob_holder
tf_mob_holder.vore_organs |= B
vore_organs -= B
tf_mob_holder.mob_belly_transfer(src)
if(tf_mob_holder)
tf_mob_holder = null
QDEL_NULL_LIST(hud_list)
@@ -229,27 +229,7 @@
if(!M.allow_spontaneous_tf && !tf_admin_pref_override)
return
if(M.tf_mob_holder)
var/mob/living/ourmob = M.tf_mob_holder
if(ourmob.ai_holder)
var/datum/ai_holder/our_AI = ourmob.ai_holder
our_AI.set_stance(STANCE_IDLE)
M.tf_mob_holder = null
ourmob.ckey = M.ckey
var/turf/get_dat_turf = get_turf(target)
ourmob.loc = get_dat_turf
ourmob.forceMove(get_dat_turf)
ourmob.vore_selected = M.vore_selected
M.vore_selected = null
ourmob.mob_belly_transfer(M)
ourmob.Life(1)
if(ishuman(M))
for(var/obj/item/W in M)
if(istype(W, /obj/item/implant/backup) || istype(W, /obj/item/nif))
continue
M.drop_from_inventory(W)
qdel(target)
M.revert_mob_tf()
return
else
if(M.stat == DEAD) //We can let it undo the TF, because the person will be dead, but otherwise things get weird.
@@ -473,49 +453,9 @@
new_mob.faction = M.faction
if(new_mob && isliving(new_mob))
for(var/obj/belly/B as anything in new_mob.vore_organs)
new_mob.vore_organs -= B
qdel(B)
new_mob.vore_organs = list()
new_mob.name = M.name
new_mob.real_name = M.real_name
new_mob.verbs |= /mob/living/proc/revert_beast_form
new_mob.verbs |= /mob/living/proc/set_size
for(var/lang in M.languages)
new_mob.languages |= lang
M.copy_vore_prefs_to_mob(new_mob)
new_mob.vore_selected = M.vore_selected
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(ishuman(new_mob))
var/mob/living/carbon/human/N = new_mob
N.gender = H.gender
N.identifying_gender = H.identifying_gender
else
new_mob.gender = H.gender
else
new_mob.gender = M.gender
if(ishuman(new_mob))
var/mob/living/carbon/human/N = new_mob
N.identifying_gender = M.gender
for(var/obj/belly/B as anything in M.vore_organs)
B.loc = new_mob
B.forceMove(new_mob)
B.owner = new_mob
M.vore_organs -= B
new_mob.vore_organs += B
new_mob.ckey = M.ckey
if(M.ai_holder && new_mob.ai_holder)
var/datum/ai_holder/old_AI = M.ai_holder
old_AI.set_stance(STANCE_SLEEP)
var/datum/ai_holder/new_AI = new_mob.ai_holder
new_AI.hostile = old_AI.hostile
new_AI.retaliate = old_AI.retaliate
M.loc = new_mob
M.forceMove(new_mob)
new_mob.tf_mob_holder = M
transfer_mob_identity(new_mob)
new_mob.visible_message("<b>\The [src]</b> has transformed into \the [chosen_beast]!")
/mob/living/proc/spawn_polymorph_mob(var/chosen_beast)
+1 -23
View File
@@ -226,29 +226,7 @@
if(!istype(M))
return
if(M.tf_mob_holder)
var/mob/living/ourmob = M.tf_mob_holder
if(ourmob.ai_holder)
var/datum/ai_holder/our_AI = ourmob.ai_holder
our_AI.set_stance(STANCE_IDLE)
M.tf_mob_holder = null
ourmob.ckey = M.ckey
var/turf/get_dat_turf = get_turf(target)
ourmob.loc = get_dat_turf
ourmob.forceMove(get_dat_turf)
ourmob.vore_selected = M.vore_selected
M.vore_selected = null
ourmob.mob_belly_transfer(M)
M.soulgem.transfer_self(ourmob) // Soulcatcher
ourmob.Life(1)
if(ishuman(M))
for(var/obj/item/W in M)
if(istype(W, /obj/item/implant/backup) || istype(W, /obj/item/nif))
continue
M.drop_from_inventory(W)
qdel(target)
M.revert_mob_tf()
return
else
if(M.stat == DEAD) //We can let it undo the TF, because the person will be dead, but otherwise things get weird.
+1 -6
View File
@@ -861,12 +861,7 @@
M.tf_mob_holder.forceMove(M.loc)
QDEL_LIST_NULL(M.tf_mob_holder.vore_organs)
M.tf_mob_holder.vore_organs = list()
for(var/obj/belly/B as anything in M.vore_organs)
B.loc = M.tf_mob_holder
B.forceMove(M.tf_mob_holder)
B.owner = M.tf_mob_holder
M.tf_mob_holder.vore_organs |= B
M.vore_organs -= B
M.tf_mob_holder.mob_belly_transfer(M)
if(M.tf_mob_holder)
M.tf_mob_holder = null
+39 -92
View File
@@ -1,13 +1,13 @@
// Procs for living mobs based around mob transformation. Initially made for the mouseray, they are now used in various other places and the main procs are now called from here.
/mob/living/proc/tf_into(var/A, var/allow_emotes = FALSE, var/object_name)
if(!object_name)
object_name = name
if(isliving(A))
var/mob/living/M = A
M.mob_tf(src)
transform_into_mob(M, FALSE)
return
if(isitem(A))
if(!object_name)
object_name = name
var/obj/item/I = A
I.inhabit_item(src, object_name, src, allow_emotes)
var/mob/living/possessed_voice = I.possessed_voice
@@ -15,55 +15,6 @@
I.unacidable = !digestable
forceMove(possessed_voice)
/mob/living/proc/mob_tf(var/mob/living/M)
if(!istype(M))
return
if(src && isliving(src))
faction = M.faction
if(istype(src, /mob/living/simple_mob))
var/mob/living/simple_mob/S = src
if(!S.voremob_loaded)
S.init_vore(TRUE)
new /obj/effect/effect/teleport_greyscale(M.loc)
for(var/obj/belly/B as anything in src.vore_organs)
src.vore_organs -= B
qdel(B)
src.vore_organs = list()
src.name = M.name
src.real_name = M.real_name
for(var/lang in M.languages)
src.languages |= lang
M.copy_vore_prefs_to_mob(src)
src.vore_selected = M.vore_selected
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(ishuman(src))
var/mob/living/carbon/human/N = src
N.gender = H.gender
N.identifying_gender = H.identifying_gender
else
src.gender = H.gender
else
src.gender = M.gender
if(ishuman(src))
var/mob/living/carbon/human/N = src
N.identifying_gender = M.gender
mob_belly_transfer(M)
M.soulgem.transfer_self(src) // Soulcatcher
nutrition = M.nutrition
src.ckey = M.ckey
if(M.ai_holder && src.ai_holder)
var/datum/ai_holder/old_AI = M.ai_holder
old_AI.set_stance(STANCE_SLEEP)
var/datum/ai_holder/new_AI = src.ai_holder
new_AI.hostile = old_AI.hostile
new_AI.retaliate = old_AI.retaliate
M.loc = src
M.forceMove(src)
src.tf_mob_holder = M
/mob/living/proc/mob_belly_transfer(var/mob/living/M)
for(var/obj/belly/B as anything in M.vore_organs)
B.loc = src
@@ -72,6 +23,36 @@
M.vore_organs -= B
src.vore_organs += B
/mob/living/proc/transfer_mob_identity(var/mob/living/new_mob)
for(var/obj/belly/B as anything in new_mob.vore_organs)
new_mob.vore_organs -= B
qdel(B)
new_mob.vore_organs = list()
new_mob.name = src.name
new_mob.real_name = src.real_name
for(var/lang in src.languages)
new_mob.languages |= lang
src.copy_vore_prefs_to_mob(new_mob)
new_mob.vore_selected = src.vore_selected
if(ishuman(src))
var/mob/living/carbon/human/H = src
if(ishuman(new_mob))
var/mob/living/carbon/human/N = new_mob
N.gender = H.gender
N.identifying_gender = H.identifying_gender
else
new_mob.gender = H.gender
else
new_mob.gender = src.gender
if(ishuman(new_mob))
var/mob/living/carbon/human/N = new_mob
N.identifying_gender = src.gender
new_mob.mob_belly_transfer(src)
new_mob.nutrition = src.nutrition
src.soulgem?.transfer_self(new_mob)
/mob/living
var/mob/living/tf_mob_holder = null
@@ -123,12 +104,7 @@
if(!tf_form_ckey)
ourmob.vore_selected = vore_selected
vore_selected = null
for(var/obj/belly/B as anything in vore_organs)
B.loc = ourmob
B.forceMove(ourmob)
B.owner = ourmob
vore_organs -= B
ourmob.vore_organs += B
ourmob.mob_belly_transfer(src)
ourmob.Life(1)
@@ -198,7 +174,10 @@
if(new_mob.ckey)
new_mob.tf_form_ckey = new_mob.ckey
else
new_mob = new new_form(get_turf(src))
if(isliving(new_form))
new_mob = new_form
else
new_mob = new new_form(get_turf(src))
if(new_mob && isliving(new_mob))
new_mob.faction = src.faction
@@ -208,39 +187,7 @@
S.init_vore(TRUE)
new /obj/effect/effect/teleport_greyscale(src.loc)
if(!new_mob.ckey)
for(var/obj/belly/B as anything in new_mob.vore_organs)
new_mob.vore_organs -= B
qdel(B)
new_mob.vore_organs = list()
new_mob.name = src.name
new_mob.real_name = src.real_name
for(var/lang in src.languages)
new_mob.languages |= lang
src.copy_vore_prefs_to_mob(new_mob)
new_mob.vore_selected = src.vore_selected
if(ishuman(src))
var/mob/living/carbon/human/H = src
if(ishuman(new_mob))
var/mob/living/carbon/human/N = new_mob
N.gender = H.gender
N.identifying_gender = H.identifying_gender
else
new_mob.gender = H.gender
else
new_mob.gender = src.gender
if(ishuman(new_mob))
var/mob/living/carbon/human/N = new_mob
N.identifying_gender = src.gender
for(var/obj/belly/B as anything in src.vore_organs)
B.loc = new_mob
B.forceMove(new_mob)
B.owner = new_mob
src.vore_organs -= B
new_mob.vore_organs += B
new_mob.nutrition = src.nutrition
src.soulgem?.transfer_self(new_mob)
transfer_mob_identity(new_mob)
new_mob.ckey = src.ckey
if(new_mob.tf_form_ckey)
+2 -72
View File
@@ -94,40 +94,7 @@
return
M.drop_both_hands()
if(M.tf_mob_holder && M.tf_mob_holder.loc == M)
new /obj/effect/effect/teleport_greyscale(M.loc)
var/mob/living/ourmob = M.tf_mob_holder
if(ourmob.ai_holder)
var/datum/ai_holder/our_AI = ourmob.ai_holder
our_AI.set_stance(STANCE_IDLE)
M.tf_mob_holder = null
var/turf/get_dat_turf = get_turf(target)
ourmob.loc = get_dat_turf
ourmob.forceMove(get_dat_turf)
if(!M.tf_form_ckey)
ourmob.vore_selected = M.vore_selected
M.vore_selected = null
ourmob.mob_belly_transfer(M)
ourmob.nutrition = M.nutrition
M.soulgem.transfer_self(ourmob)
ourmob.ckey = M.ckey
ourmob.Life(1)
if(ishuman(M))
for(var/obj/item/W in M)
if(istype(W, /obj/item/implant/backup) || istype(W, /obj/item/nif))
continue
M.drop_from_inventory(W)
if(M.tf_form == ourmob)
if(M.tf_form_ckey)
M.ckey = M.tf_form_ckey
else
M.mind = null
ourmob.tf_form = M
M.forceMove(ourmob)
else
qdel(target)
M.revert_mob_tf()
return
else
if(M.stat == DEAD) //We can let it undo the TF, because the person will be dead, but otherwise things get weird.
@@ -193,44 +160,7 @@
firer.visible_message(span_warning("\The [src] buzzes impolitely."))
return
if(M.tf_mob_holder)
var/mob/living/ourmob = M.tf_mob_holder
if(ourmob.ai_holder)
var/datum/ai_holder/our_AI = ourmob.ai_holder
our_AI.set_stance(STANCE_IDLE)
M.tf_mob_holder = null
var/turf/get_dat_turf = get_turf(target)
ourmob.loc = get_dat_turf
ourmob.forceMove(get_dat_turf)
if(!M.tf_form_ckey)
ourmob.vore_selected = M.vore_selected
M.vore_selected = null
for(var/obj/belly/B as anything in M.vore_organs)
B.loc = ourmob
B.forceMove(ourmob)
B.owner = ourmob
M.vore_organs -= B
ourmob.vore_organs += B
ourmob.nutrition = M.nutrition
M.soulgem.transfer_self(ourmob)
ourmob.ckey = M.ckey
ourmob.Life(1)
if(ishuman(M))
for(var/obj/item/W in M)
if(istype(W, /obj/item/implant/backup) || istype(W, /obj/item/nif))
continue
M.drop_from_inventory(W)
if(M.tf_form == ourmob)
if(M.tf_form_ckey)
M.ckey = M.tf_form_ckey
else
M.mind = null
ourmob.tf_form = M
M.forceMove(ourmob)
else
qdel(target)
M.revert_mob_tf()
firer.visible_message(span_notice("\The [shot_from] boops pleasantly."))
return
else