From 006cc6de658b8d6affd50c5440a66073e6e691eb Mon Sep 17 00:00:00 2001 From: killer653 Date: Sat, 15 Apr 2017 19:48:17 -0400 Subject: [PATCH] Adds more transformation types for specific Changes "Species Transformation" to "Replica Transformation" for clarity, as people were using it and expecting them to change species, not be a perfect 1:1 replica of the person doing the TF. Adds "Change_species_and_taur" mode, which does exactly as it says without making the person appear as a 1:1 replica as the pred TFing them Adds "Change_hair_and_eyes" tf mode, which allows the changing of the prey's hair and eye color without having to completely TF them or change their gender. Fixes a bug that infinitely drained the pred's nutrition when they used a TF mode. Slightly increases amount of nutrition the prey gets from the pred. --- code/__defines/belly_modes_vr.dm | 33 +- code/modules/vore/eating/belly_vr.dm | 2 +- code/modules/vore/eating/bellymodes_vr.dm | 353 ++++++++++++++++++---- code/modules/vore/eating/vorepanel_vr.dm | 10 +- 4 files changed, 319 insertions(+), 79 deletions(-) diff --git a/code/__defines/belly_modes_vr.dm b/code/__defines/belly_modes_vr.dm index 8555b4d91f5..9e0a66fb6f2 100644 --- a/code/__defines/belly_modes_vr.dm +++ b/code/__defines/belly_modes_vr.dm @@ -1,19 +1,22 @@ // Belly Mode Constants -#define DM_HOLD "Hold" -#define DM_DIGEST "Digest" -#define DM_HEAL "Heal" -#define DM_ABSORB "Absorb" -#define DM_TRANSFORM_MALE "Transform (Male)" -#define DM_TRANSFORM_FEMALE "Transform (Female)" -#define DM_TRANSFORM_KEEP_GENDER "Transform (Keep Gender)" -#define DM_TRANSFORM_CHANGE_SPECIES "Transform (Change Species)" -#define DM_TRANSFORM_CHANGE_SPECIES_EGG "Transform (Change Species) (EGG)" -#define DM_TRANSFORM_KEEP_GENDER_EGG "Transform (Keep Gender) (EGG)" -#define DM_TRANSFORM_MALE_EGG "Transform (Male) (EGG)" -#define DM_TRANSFORM_FEMALE_EGG "Transform (Female) (EGG)" -#define DM_EGG "Encase In Egg" -#define DM_DRAIN "Drain" -#define DM_UNABSORB "Unabsorb" +#define DM_HOLD "Hold" +#define DM_DIGEST "Digest" +#define DM_HEAL "Heal" +#define DM_ABSORB "Absorb" +#define DM_TRANSFORM_HAIR_AND_EYES "Transform (Hair and eyes)" +#define DM_TRANSFORM_MALE "Transform (Male)" +#define DM_TRANSFORM_FEMALE "Transform (Female)" +#define DM_TRANSFORM_KEEP_GENDER "Transform (Keep Gender)" +#define DM_TRANSFORM_REPLICA "Transform (Replica Of Self)" +#define DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR "Transform (Change Species and Taur)" +#define DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG "Transform (Change Species and Taur) (EGG)" +#define DM_TRANSFORM_REPLICA_EGG "Transform (Replica Of Self) (EGG)" +#define DM_TRANSFORM_KEEP_GENDER_EGG "Transform (Keep Gender) (EGG)" +#define DM_TRANSFORM_MALE_EGG "Transform (Male) (EGG)" +#define DM_TRANSFORM_FEMALE_EGG "Transform (Female) (EGG)" +#define DM_EGG "Encase In Egg" +#define DM_DRAIN "Drain" +#define DM_UNABSORB "Unabsorb" // Stance for hostile mobs to be in while devouring someone. diff --git a/code/modules/vore/eating/belly_vr.dm b/code/modules/vore/eating/belly_vr.dm index 0bc8e25e6b2..902f6183c84 100644 --- a/code/modules/vore/eating/belly_vr.dm +++ b/code/modules/vore/eating/belly_vr.dm @@ -31,7 +31,7 @@ var/tmp/digest_mode = DM_HOLD // Whether or not to digest. Default to not digest. var/tmp/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_HEAL,DM_ABSORB,DM_DRAIN,DM_UNABSORB) // Possible digest modes - var/tmp/list/transform_modes = list(DM_TRANSFORM_MALE,DM_TRANSFORM_FEMALE,DM_TRANSFORM_KEEP_GENDER,DM_TRANSFORM_CHANGE_SPECIES,DM_TRANSFORM_CHANGE_SPECIES_EGG,DM_TRANSFORM_KEEP_GENDER_EGG,DM_TRANSFORM_MALE_EGG,DM_TRANSFORM_FEMALE_EGG, DM_EGG) + var/tmp/list/transform_modes = list(DM_TRANSFORM_MALE,DM_TRANSFORM_FEMALE,DM_TRANSFORM_KEEP_GENDER,DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR,DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG,DM_TRANSFORM_REPLICA,DM_TRANSFORM_REPLICA_EGG,DM_TRANSFORM_KEEP_GENDER_EGG,DM_TRANSFORM_MALE_EGG,DM_TRANSFORM_FEMALE_EGG, DM_EGG) var/tmp/mob/living/owner // The mob whose belly this is. var/tmp/list/internal_contents = list() // People/Things you've eaten into this belly! var/tmp/is_full // Flag for if digested remeans are present. (for disposal messages) diff --git a/code/modules/vore/eating/bellymodes_vr.dm b/code/modules/vore/eating/bellymodes_vr.dm index 273f00e75be..877af5577cf 100644 --- a/code/modules/vore/eating/bellymodes_vr.dm +++ b/code/modules/vore/eating/bellymodes_vr.dm @@ -144,6 +144,37 @@ M.nutrition += 1 return +///////////////////////////// DM_TRANSFORM_HAIR_AND_EYES ///////////////////////////// + if(digest_mode == DM_TRANSFORM_HAIR_AND_EYES && ishuman(owner)) + for (var/mob/living/carbon/human/P in internal_contents) + if(P.stat) + continue + + var/mob/living/carbon/human/O = owner + + var/TFchance = 1 //This used to be RNG, resulting people waiting ages. This way does it instantly. + if(TFchance == 1) + if(P.r_hair != O.r_hair || P.g_hair != O.g_hair || P.b_hair != O.b_hair || P.r_skin != O.r_skin || P.g_skin != O.g_skin || P.b_skin != O.b_skin || P.r_facial != O.r_facial || P.g_facial != O.g_facial || P.b_facial != O.b_facial) + P.r_hair = O.r_hair + P.r_facial = O.r_facial + P.g_hair = O.g_hair + P.g_facial = O.g_facial + P.b_hair = O.b_hair + P.b_facial = O.b_facial + P.r_skin = O.r_skin + P.g_skin = O.g_skin + P.b_skin = O.b_skin + P.h_style = O.h_style + P << "Your body tingles all over..." + owner << "You tingle as you make noticeable changes to your captive's body." + P.update_hair() + P.update_body() + P.updateicon() + + if(O.nutrition > 400 && P.nutrition < 400) + O.nutrition -= 2 + P.nutrition += 1.5 + return ///////////////////////////// DM_TRANSFORM_MALE ///////////////////////////// if(digest_mode == DM_TRANSFORM_MALE && ishuman(owner)) for (var/mob/living/carbon/human/P in internal_contents) @@ -188,10 +219,9 @@ P.update_body() P.updateicon() - if(O.nutrition > 0) + if(O.nutrition > 400 && P.nutrition < 400) O.nutrition -= 2 - if(P.nutrition < 400) - P.nutrition += 1 + P.nutrition += 1.5 return @@ -236,10 +266,9 @@ P.update_body() P.updateicon() - if(O.nutrition > 0) + if(O.nutrition > 400 && P.nutrition < 400) O.nutrition -= 2 - if(P.nutrition < 400) - P.nutrition += 1 + P.nutrition += 1.5 return ///////////////////////////// DM_TRANSFORM_KEEP_GENDER ///////////////////////////// @@ -279,14 +308,47 @@ P.update_body() P.updateicon() - if(O.nutrition > 0) + if(O.nutrition > 400 && P.nutrition < 400) O.nutrition -= 2 - if(P.nutrition < 400) - P.nutrition += 1 + P.nutrition += 1.5 return -///////////////////////////// DM_TRANSFORM_CHANGE_SPECIES ///////////////////////////// - if(digest_mode == DM_TRANSFORM_CHANGE_SPECIES && ishuman(owner)) +///////////////////////////// DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR ///////////////////////////// + if(digest_mode == DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR && ishuman(owner)) + for (var/mob/living/carbon/human/P in internal_contents) + if(P.stat) + continue + + var/mob/living/carbon/human/O = owner + + var/TFchance = 1 //This used to be RNG, resulting people waiting ages. This way does it instantly. + if(TFchance == 1) + if(P.species != O.species || P.tail_style != O.tail_style || P.custom_species != O.custom_species || P.ear_style != O.ear_style) + P.tail_style = O.tail_style + P.ear_style = O.ear_style + P.species = O.species + P.custom_species = O.custom_species + for(var/obj/item/organ/I in P.internal_organs) //This prevents organ rejection + I.species = O.species + for(var/obj/item/organ/external/chest/A in O.organs) + for(var/obj/item/organ/external/Z in P.organs) //This makes their limb sprites look correct. + Z.species = O.species + //Z.h_col = A.h_col //We're not making them a replica of the other person. Sprite changes, but they stay the same color. + //Z.s_col = A.s_col + P << "You lose sensation of your body, feeling only the warmth of everything around you... " + owner << "Your body shifts as you make dramatic changes to your captive's body." + P.fixblood() + P.update_body() + P.update_tail_showing() + P.updateicon() + + if(O.nutrition > 400 && P.nutrition < 400) + O.nutrition -= 2 + P.nutrition += 1.5 + return + +///////////////////////////// DM_TRANSFORM_REPLICA ///////////////////////////// + if(digest_mode == DM_TRANSFORM_REPLICA && ishuman(owner)) for (var/mob/living/carbon/human/P in internal_contents) if(P.stat) continue @@ -353,15 +415,13 @@ P.update_tail_showing() P.updateicon() - if(O.nutrition > 0) + if(O.nutrition > 400 && P.nutrition < 400) O.nutrition -= 2 - if(P.nutrition < 400) - P.nutrition += 1 + P.nutrition += 1.5 return - -///////////////////////////// DM_TRANSFORM_CHANGE_SPECIES_EGG ///////////////////////////// - if(digest_mode == DM_TRANSFORM_CHANGE_SPECIES_EGG && ishuman(owner)) +///////////////////////////// DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG ///////////////////////////// + if(digest_mode == DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG && ishuman(owner)) for (var/mob/living/carbon/human/P in internal_contents) if(P.stat) continue @@ -371,26 +431,10 @@ if (O.custom_species) var/defined_species = O.custom_species - P.r_hair = O.r_hair - P.r_facial = O.r_facial - P.g_hair = O.g_hair - P.g_facial = O.g_facial - P.b_hair = O.b_hair - P.b_facial = O.b_facial - P.r_skin = O.r_skin - P.g_skin = O.g_skin - P.b_skin = O.b_skin - P.tail_style = O.tail_style - P.r_tail = O.r_tail - P.g_tail = O.g_tail - P.b_tail = O.b_tail - P.ear_style = O.ear_style - P.h_style = O.h_style //Since some things are required, like the cobra hood. - P.species = O.species - P.custom_species = O.custom_species - P.r_eyes = O.r_eyes - P.g_eyes = O.g_eyes - P.b_eyes = O.b_eyes + P.tail_style = O.tail_style + P.ear_style = O.ear_style + P.species = O.species + P.custom_species = O.custom_species for(var/obj/item/organ/I in P.internal_organs) //This prevents organ rejection I.species = O.species @@ -398,8 +442,6 @@ for(var/obj/item/organ/external/chest/A in O.organs) for(var/obj/item/organ/external/Z in P.organs) //This makes their limb sprites look correct. Z.species = O.species - Z.h_col = A.h_col - Z.s_col = A.s_col P << "You lose sensation of your body, feeling only the warmth around you as you're encased in an egg. " owner << "You shift as you make dramatic changes to your captive's body as you encase them in an egg." P.fixblood() @@ -477,33 +519,14 @@ J.desc = "This egg has a very unique look to it." internal_contents -= P else - P.r_hair = O.r_hair - P.r_facial = O.r_facial - P.g_hair = O.g_hair - P.g_facial = O.g_facial - P.b_hair = O.b_hair - P.b_facial = O.b_facial - P.r_skin = O.r_skin - P.g_skin = O.g_skin - P.b_skin = O.b_skin - P.tail_style = O.tail_style - P.r_tail = O.r_tail - P.g_tail = O.g_tail - P.b_tail = O.b_tail - P.ear_style = O.ear_style - P.h_style = O.h_style - P.species = O.species - P.custom_species = O.custom_species - P.r_eyes = O.r_eyes - P.g_eyes = O.g_eyes - P.b_eyes = O.b_eyes + P.tail_style = O.tail_style + P.ear_style = O.ear_style + P.species = O.species for(var/obj/item/organ/I in P.internal_organs) //This prevents organ rejection I.species = O.species for(var/obj/item/organ/external/chest/A in O.organs) for(var/obj/item/organ/external/Z in P.organs) //This makes their limb sprites look correct. Z.species = O.species - Z.h_col = A.h_col - Z.s_col = A.s_col P << "You lose sensation of your body, feeling only the warmth around you as are you as you're encased in an egg. " owner << "You shift as you make dramatic changes to your captive's body as you encase them in an egg." P.fixblood() @@ -744,6 +767,214 @@ internal_contents -= P return +///////////////////////////// DM_TRANSFORM_REPLICA_EGG ///////////////////////////// + if(digest_mode == DM_TRANSFORM_REPLICA_EGG && ishuman(owner)) + for (var/mob/living/carbon/human/P in internal_contents) + if(P.stat) + continue + if(P.absorbed) //If they're absorbed, don't egg them + return + var/mob/living/carbon/human/O = owner + + if (O.custom_species) + var/defined_species = O.custom_species + P.r_hair = O.r_hair + P.r_facial = O.r_facial + P.g_hair = O.g_hair + P.g_facial = O.g_facial + P.b_hair = O.b_hair + P.b_facial = O.b_facial + P.r_skin = O.r_skin + P.g_skin = O.g_skin + P.b_skin = O.b_skin + P.tail_style = O.tail_style + P.r_tail = O.r_tail + P.g_tail = O.g_tail + P.b_tail = O.b_tail + P.ear_style = O.ear_style + P.h_style = O.h_style //Since some things are required, like the cobra hood. + P.species = O.species + P.custom_species = O.custom_species + P.r_eyes = O.r_eyes + P.g_eyes = O.g_eyes + P.b_eyes = O.b_eyes + + for(var/obj/item/organ/I in P.internal_organs) //This prevents organ rejection + I.species = O.species + + for(var/obj/item/organ/external/chest/A in O.organs) + for(var/obj/item/organ/external/Z in P.organs) //This makes their limb sprites look correct. + Z.species = O.species + Z.h_col = A.h_col + Z.s_col = A.s_col + P << "You lose sensation of your body, feeling only the warmth around you as you're encased in an egg. " + owner << "You shift as you make dramatic changes to your captive's body as you encase them in an egg." + P.fixblood() + P.update_hair() + P.update_body() + P.update_tail_showing() + P.update_eyes() + P.updateicon() + switch(O.egg_type) + if("Unathi") + var/obj/structure/closet/secure_closet/egg/unathi/J = new /obj/structure/closet/secure_closet/egg/unathi(O.loc) + P.forceMove(J) + J.name = "[defined_species] egg" + J.desc = "This egg has a very unique look to it." + for(var/mob/living/M in internal_contents) + internal_contents -= P + if("Tajaran") + var/obj/structure/closet/secure_closet/egg/tajaran/J = new /obj/structure/closet/secure_closet/egg/tajaran(O.loc) + P.forceMove(J) + J.name = "[defined_species] egg" + J.desc = "This egg has a very unique look to it." + internal_contents -= P + if("Akula") + var/obj/structure/closet/secure_closet/egg/shark/J = new /obj/structure/closet/secure_closet/egg/shark(O.loc) + P.forceMove(J) + J.name = "[defined_species] egg" + J.desc = "This egg has a very unique look to it." + internal_contents -= P + if("Skrell") + var/obj/structure/closet/secure_closet/egg/skrell/J = new /obj/structure/closet/secure_closet/egg/skrell(O.loc) + P.forceMove(J) + J.name = "[defined_species] egg" + J.desc = "This egg has a very unique look to it." + internal_contents -= P + if("Sergal") + var/obj/structure/closet/secure_closet/egg/sergal/J = new /obj/structure/closet/secure_closet/egg/sergal(O.loc) + P.forceMove(J) + J.name = "[defined_species] egg" + J.desc = "This egg has a very unique look to it." + internal_contents -= P + if("Human") + var/obj/structure/closet/secure_closet/egg/human/J = new /obj/structure/closet/secure_closet/egg/human(O.loc) + P.forceMove(J) + J.name = "[defined_species] egg" + J.desc = "This egg has a very unique look to it." + internal_contents -= P + if("Slime") + var/obj/structure/closet/secure_closet/egg/slime/J = new /obj/structure/closet/secure_closet/egg/slime(O.loc) + P.forceMove(J) + J.name = "[defined_species] egg" + J.desc = "This egg has a very unique look to it." + internal_contents -= P + if("Egg") + var/obj/structure/closet/secure_closet/egg/J = new /obj/structure/closet/secure_closet/egg(O.loc) + P.forceMove(J) + J.name = "[defined_species] egg" + J.desc = "This egg has a very unique look to it." + internal_contents -= P + if("Xenochimera") + var/obj/structure/closet/secure_closet/egg/scree/J = new /obj/structure/closet/secure_closet/egg/scree(O.loc) + P.forceMove(J) + J.name = "[defined_species] egg" + J.desc = "This egg has a very unique look to it." + internal_contents -= P + if("Xenomorph") + var/obj/structure/closet/secure_closet/egg/xenomorph/J = new /obj/structure/closet/secure_closet/egg/xenomorph(O.loc) + P.forceMove(J) + J.name = "[defined_species] egg" + J.desc = "This egg has a very unique look to it." + internal_contents -= P + else + var/obj/structure/closet/secure_closet/egg/J = new /obj/structure/closet/secure_closet/egg(O.loc) + P.forceMove(J) + J.name = "[defined_species] egg" + J.desc = "This egg has a very unique look to it." + internal_contents -= P + else + P.r_hair = O.r_hair + P.r_facial = O.r_facial + P.g_hair = O.g_hair + P.g_facial = O.g_facial + P.b_hair = O.b_hair + P.b_facial = O.b_facial + P.r_skin = O.r_skin + P.g_skin = O.g_skin + P.b_skin = O.b_skin + P.tail_style = O.tail_style + P.r_tail = O.r_tail + P.g_tail = O.g_tail + P.b_tail = O.b_tail + P.ear_style = O.ear_style + P.h_style = O.h_style + P.species = O.species + P.custom_species = O.custom_species + P.r_eyes = O.r_eyes + P.g_eyes = O.g_eyes + P.b_eyes = O.b_eyes + for(var/obj/item/organ/I in P.internal_organs) //This prevents organ rejection + I.species = O.species + for(var/obj/item/organ/external/chest/A in O.organs) + for(var/obj/item/organ/external/Z in P.organs) //This makes their limb sprites look correct. + Z.species = O.species + Z.h_col = A.h_col + Z.s_col = A.s_col + P << "You lose sensation of your body, feeling only the warmth around you as are you as you're encased in an egg. " + owner << "You shift as you make dramatic changes to your captive's body as you encase them in an egg." + P.fixblood() + P.update_hair() + P.update_body() + P.update_tail_showing() + P.update_eyes() + P.updateicon() + switch(O.egg_type) + if("Unathi") + var/obj/structure/closet/secure_closet/egg/unathi/J = new /obj/structure/closet/secure_closet/egg/unathi(O.loc) + P.forceMove(J) + J.name = "Unathi egg" + internal_contents -= P + if("Tajaran") + var/obj/structure/closet/secure_closet/egg/tajaran/J = new /obj/structure/closet/secure_closet/egg/tajaran(O.loc) + P.forceMove(J) + J.name = "Tajaran egg" + internal_contents -= P + if("Akula") + var/obj/structure/closet/secure_closet/egg/shark/J = new /obj/structure/closet/secure_closet/egg/shark(O.loc) + P.forceMove(J) + J.name = "Akula egg" + internal_contents -= P + if("Skrell") + var/obj/structure/closet/secure_closet/egg/skrell/J = new /obj/structure/closet/secure_closet/egg/skrell(O.loc) + P.forceMove(J) + J.name = "Skrell egg" + internal_contents -= P + if("Sergal") + var/obj/structure/closet/secure_closet/egg/sergal/J = new /obj/structure/closet/secure_closet/egg/sergal(O.loc) + P.forceMove(J) + J.name = "Segal egg" + internal_contents -= P + if("Human") + var/obj/structure/closet/secure_closet/egg/human/J = new /obj/structure/closet/secure_closet/egg/human(O.loc) + P.forceMove(J) + J.name = "Human egg" + internal_contents -= P + if("Slime") + var/obj/structure/closet/secure_closet/egg/slime/J = new /obj/structure/closet/secure_closet/egg/slime(O.loc) + P.forceMove(J) + J.name = "Slime egg" + internal_contents -= P + if("Egg") + var/obj/structure/closet/secure_closet/egg/J = new /obj/structure/closet/secure_closet/egg(O.loc) + P.forceMove(J) + J.name = "Egg" + internal_contents -= P + if("Xenochimera") + var/obj/structure/closet/secure_closet/egg/scree/J = new /obj/structure/closet/secure_closet/egg/scree(O.loc) + P.forceMove(J) + internal_contents -= P + if("Xenomorph") + var/obj/structure/closet/secure_closet/egg/xenomorph/J = new /obj/structure/closet/secure_closet/egg/xenomorph(O.loc) + P.forceMove(J) + internal_contents -= P + else + var/obj/structure/closet/secure_closet/egg/J = new /obj/structure/closet/secure_closet/egg(O.loc) + P.forceMove(J) + J.name = "Odd egg" //Something went wrong. Since the default is "egg", they shouldn't see this. + internal_contents -= P + return + ///////////////////////////// DM_TRANSFORM_MALE_EGG ///////////////////////////// if(digest_mode == DM_TRANSFORM_MALE_EGG && ishuman(owner)) for (var/mob/living/carbon/human/P in internal_contents) diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm index fa918a85ed5..e186b8ec841 100644 --- a/code/modules/vore/eating/vorepanel_vr.dm +++ b/code/modules/vore/eating/vorepanel_vr.dm @@ -102,13 +102,19 @@ spanstyle = "color:purple;" if(DM_TRANSFORM_MALE) spanstyle = "color:purple;" + if(DM_TRANSFORM_HAIR_AND_EYES) + spanstyle = "color:purple;" if(DM_TRANSFORM_FEMALE) spanstyle = "color:purple;" if(DM_TRANSFORM_KEEP_GENDER) spanstyle = "color:purple;" - if(DM_TRANSFORM_CHANGE_SPECIES) + if(DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR) spanstyle = "color:purple;" - if(DM_TRANSFORM_CHANGE_SPECIES_EGG) + if(DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG) + spanstyle = "color:purple;" + if(DM_TRANSFORM_REPLICA) + spanstyle = "color:purple;" + if(DM_TRANSFORM_REPLICA_EGG) spanstyle = "color:purple;" if(DM_TRANSFORM_KEEP_GENDER_EGG) spanstyle = "color:purple;"