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.
This commit is contained in:
killer653
2017-04-15 19:48:17 -04:00
parent a6d1047f48
commit 006cc6de65
4 changed files with 319 additions and 79 deletions
+18 -15
View File
@@ -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.
+1 -1
View File
@@ -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)
+292 -61
View File
@@ -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 << "<span class='notice'>Your body tingles all over...</span>"
owner << "<span class='notice'>You tingle as you make noticeable changes to your captive's body.</span>"
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 << "<span class='notice'>You lose sensation of your body, feeling only the warmth of everything around you... </span>"
owner << "<span class='notice'>Your body shifts as you make dramatic changes to your captive's body.</span>"
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 << "<span class='notice'>You lose sensation of your body, feeling only the warmth around you as you're encased in an egg. </span>"
owner << "<span class='notice'>You shift as you make dramatic changes to your captive's body as you encase them in an egg.</span>"
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 << "<span class='notice'>You lose sensation of your body, feeling only the warmth around you as are you as you're encased in an egg. </span>"
owner << "<span class='notice'>You shift as you make dramatic changes to your captive's body as you encase them in an egg.</span>"
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 << "<span class='notice'>You lose sensation of your body, feeling only the warmth around you as you're encased in an egg. </span>"
owner << "<span class='notice'>You shift as you make dramatic changes to your captive's body as you encase them in an egg.</span>"
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 << "<span class='notice'>You lose sensation of your body, feeling only the warmth around you as are you as you're encased in an egg. </span>"
owner << "<span class='notice'>You shift as you make dramatic changes to your captive's body as you encase them in an egg.</span>"
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)
+8 -2
View File
@@ -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;"