diff --git a/code/modules/mob/living/carbon/human/species/lleill/lleill_abilities.dm b/code/modules/mob/living/carbon/human/species/lleill/lleill_abilities.dm index 873268af6c..319d7a02c0 100644 --- a/code/modules/mob/living/carbon/human/species/lleill/lleill_abilities.dm +++ b/code/modules/mob/living/carbon/human/species/lleill/lleill_abilities.dm @@ -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]!")) diff --git a/code/modules/mob/living/carbon/human/species/lleill/lleill_items.dm b/code/modules/mob/living/carbon/human/species/lleill/lleill_items.dm index fd0111be9f..6cd7d7a15d 100644 --- a/code/modules/mob/living/carbon/human/species/lleill/lleill_items.dm +++ b/code/modules/mob/living/carbon/human/species/lleill/lleill_items.dm @@ -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. diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index adac6f9e03..f58d76a553 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -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) diff --git a/code/modules/mob/living/simple_mob/subtypes/glamour/ddraig.dm b/code/modules/mob/living/simple_mob/subtypes/glamour/ddraig.dm index 2c93ba51fe..806242282b 100644 --- a/code/modules/mob/living/simple_mob/subtypes/glamour/ddraig.dm +++ b/code/modules/mob/living/simple_mob/subtypes/glamour/ddraig.dm @@ -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("\The [src] has transformed into \the [chosen_beast]!") /mob/living/proc/spawn_polymorph_mob(var/chosen_beast) diff --git a/code/modules/reagents/reagents/medicine_vr.dm b/code/modules/reagents/reagents/medicine_vr.dm index 6450bb7482..14cc28d155 100644 --- a/code/modules/reagents/reagents/medicine_vr.dm +++ b/code/modules/reagents/reagents/medicine_vr.dm @@ -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. diff --git a/code/modules/vore/eating/belly_obj.dm b/code/modules/vore/eating/belly_obj.dm index c0f6d9d984..91ddbbc62d 100644 --- a/code/modules/vore/eating/belly_obj.dm +++ b/code/modules/vore/eating/belly_obj.dm @@ -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 diff --git a/code/modules/vore/mob_tf.dm b/code/modules/vore/mob_tf.dm index 6737cd5305..4a279a0850 100644 --- a/code/modules/vore/mob_tf.dm +++ b/code/modules/vore/mob_tf.dm @@ -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) diff --git a/code/modules/vore/mouseray.dm b/code/modules/vore/mouseray.dm index 6bd4e83791..25234243ef 100644 --- a/code/modules/vore/mouseray.dm +++ b/code/modules/vore/mouseray.dm @@ -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