Merge pull request #350 from Cameron653/master

Adds in Xenochimeras (Scree Whitelisted race)
This commit is contained in:
Spades
2016-06-22 16:55:21 -04:00
committed by GitHub
13 changed files with 261 additions and 9 deletions

View File

@@ -83,6 +83,13 @@
icon_closed = "egg_unique"
icon_opened = "egg_unique_open"
/obj/structure/closet/secure_closet/egg/scree
name = "Chimera egg"
desc = "...You don't know what type of creature layed this egg."
icon_state = "egg_scree"
icon_closed = "egg_scree"
icon_opened = "egg_scree_open"
//In case anyone stumbles upon this, MAJOR thanks to Vorrakul and Nightwing. Without them, this wouldn't be a reality.
//Also, huge thanks for Ace for helping me through with this and getting me to work at my full potential instead of tapping out early, along with coding advice.
//Additionally, huge thanks to the entire Virgo community for giving suggestions about egg TF, the sprites, descriptions, etc etc. Cheers to everyone. Also, you should totally eat Cadence. ~CK

View File

@@ -6,4 +6,7 @@
..(new_loc, "Akula")
/mob/living/carbon/human/nevrean/New(var/new_loc)
..(new_loc, "Nevrean")
..(new_loc, "Nevrean")
/mob/living/carbon/human/xenochimera/New(var/new_loc)
..(new_loc, "Xenochimera")

View File

@@ -10,4 +10,8 @@
//This is used for egg TF. It decides what type of egg the person will lay when they TF.
//Default to the normal and bland "egg" just in case a race isn't defined.
var/egg_type = "egg"
var/egg_type = "egg"
//This is so that if a race is using the chimera revive they can't use it more than once.
//Shouldn't really be seen in play too often, but it's case an admin event happens and they give a non chimera the chimera revive. Only one person can use the chimera revive at a time per race.
var/reviving = 0

View File

@@ -0,0 +1,130 @@
/mob/living/carbon/human/proc/begin_reconstitute_form() //Scree's race ability.in exchange for: No cloning.
set name = "Begin Reconstitute Form"
set category = "Abilities"
if(world.time < last_special)
return
last_special = world.time + 50 //To prevent button spam.
var/confirm = alert(usr, "Are you sure you want to completely reconstruct your form? This process can take up to thirty minutes, depending on how hungry you are, and you will be unable to move.", "Confirm Regeneration", "Yes", "No")
if(confirm == "Yes")
var/mob/living/carbon/human/C = src
var/nutrition_used = C.nutrition/2
if(C.species.reviving == 1) //If they're already unable to
C << "We are already reconstructing, or our body is currently recovering from the intense process of our previous reconstitution."
return
if(C.stat == DEAD) //Uh oh, you died!
if(C.reagents.has_reagent("nutriment")) //Let's hope you have nutriment in you.... If not
var/time = (500+1/((nutrition_used/100+1)/1300))
C.weakened = 10000 //Since it takes 1 tick to lose one weaken. Due to prior rounding errors, you'd sometimes unweaken before regenning. This fixes that.
C.species.reviving = 1
C.canmove = 0 //Make them unable to move. In case they somehow get up before the delay.
C << "You begin to reconstruct your form. You will not be able to move during this time. It should take aproximately [round(time)] seconds."
C.in_stasis = 1
spawn(time SECONDS)
if(C) //Runtime prevention.
C << "<span class='notice'>We have reconstituted our form and are ready to hatch..</span>"
C.verbs += /mob/living/carbon/human/proc/hatch
return
else
return //Something went wrong.
else //Dead until nutrition injected.
C << "You're dead and have no liquid nutriment to use for the regeneration process."
return
else if(C.stat != DEAD) //If they're alive at the time of reviving.
var/time = (500+1/((nutrition_used/100+1)/1300))
C.weakened = 10000 //Since it takes 1 tick to lose one weaken. Due to prior rounding errors, you'd sometimes unweaken before regenning. This fixes that.
C.species.reviving = 1
C.canmove = 0 //Make them unable to move. In case they somehow get up before the delay.
C << "You begin to reconstruct your form. You will not be able to move during this time. It should take aproximately [round(time)] seconds."
C.in_stasis = 1
spawn(time SECONDS)
if(C.stat != DEAD) //If they're still alive after regenning.
C << "<span class='notice'>We have reconstituted our form and are ready to hatch..</span>"
C.verbs += /mob/living/carbon/human/proc/hatch
return
else if(C.stat == DEAD)
if(C.reagents.has_reagent("nutriment")) //Let's hope you have nutriment in you.... If not
C << "<span class='notice'>We have reconstituted our form and are ready to hatch..</span>"
C.verbs += /mob/living/carbon/human/proc/hatch
else //Dead until nutrition injected.
C << "You're dead and have no liquid nutriment to use for the regeneration process."
return
else
return //Something went wrong
else
return //Something went wrong
/mob/living/carbon/human/proc/hatch()
set name = "Hatch"
set category = "Abilities"
if(world.time < last_special)
return
last_special = world.time + 50 //To prevent button spam.
var/confirm = alert(usr, "Are you sure you want to reconstruct your form this moment? This will happen immediately and alert an.", "Confirm Regeneration", "Yes", "No")
if(confirm == "Yes")
var/mob/living/carbon/human/C = src
if(C.stat == DEAD) //Uh oh, you died!
if(C.reagents.has_reagent("nutriment")) //Let's hope you have nutriment in you.... If not
if(C) //Runtime prevention.
C.nutrition -= C.nutrition/2 //Cut their nutrition in half.
var/old_nutrition = C.nutrition //Since the game is being annoying.
C << "<span class='notice'>We have reconstituted our form.</span>"
viewers(C) << "<span class='danger'><p><font size=4> [C] suddenly bursts into a gorey mess, a copy of theirself laying in the viscera and blood. What the fuck?!</font> </span>" //Bloody hell...
var/T = get_turf(src)
new /obj/effect/gibspawner/human/scree(T)
var/braindamage = C.brainloss/2 //If you have 100 brainloss, it gives you 50.
C.in_stasis = 0
C.revive() // I did have special snowflake code, but this is easier.
C.weakened = 2 //Not going to let you get up immediately. 2 ticks before you get up. Overrides the above 10000 weaken.
C.nutrition = old_nutrition
C.brainloss = (braindamage+10) //Gives them half their prior brain damage plus ten more.
C.update_canmove()
for(var/obj/item/W in C)
C.drop_from_inventory(W)
spawn(3600 SECONDS) //1 hour wait until you can revive.
C.species.reviving = 0
C.verbs -= /mob/living/carbon/human/proc/hatch
return
else
return //Ruuntime prevention
else
return //Something went wrong.
else if(C.stat != DEAD) //If they're alive at the time of reviving.
C.nutrition -= C.nutrition/2 //Cut their nutrition in half.
var/old_nutrition = C.nutrition //Since the game is being annoying.
C << "<span class='notice'>We have reconstituted our form.</span>"
viewers(C) << "<span class='danger'><p><font size=4> [C] suddenly bursts into a gorey mess, a copy of theirself laying in the viscera and blood. What the fuck?!</font> </span>" //Bloody hell...
var/T = get_turf(src)
new /obj/effect/gibspawner/human/scree(T)
var/braindamage = C.brainloss/2 //If you have 100 brainloss, it gives you 50.
C.revive() // I did have special snowflake code, but this is easier.
C.weakened = 2 //Not going to let you get up immediately. 2 ticks before you get up. Overrides the above 10000 weaken.
C.nutrition = old_nutrition
C.brainloss = (braindamage) //Gives them half their prior brain damage plus ten more.
C.update_canmove()
for(var/obj/item/W in C)
C.drop_from_inventory(W)
spawn(3600 SECONDS) //1 hour wait until you can revive again.
C.species.reviving = 0
C.in_stasis = 0
C.verbs -= /mob/living/carbon/human/proc/hatch
return
else
return //Runtime prevention.
/obj/effect/gibspawner/human/scree
fleshcolor = "#14AD8B" //Scree blood.
bloodcolor = "#14AD8B"

View File

@@ -0,0 +1,88 @@
///////////////File for all snowflake/special races/////////////////////////////
/////Anything that is spectacularly special should be put in here///////////////
////////////////////////////////////////////////////////////////////////////////
/datum/species/xenochimera //Scree's race.
name = "Xenochimera"
name_plural = "Xenochimeras"
icobase = 'icons/mob/human_races/r_xenochimera.dmi'
deform = 'icons/mob/human_races/r_def_xenochimera.dmi'
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/punch, /datum/unarmed_attack/bite)
num_alternate_languages = 2
secondary_langs = list("Sol Common")
//color_mult = 1 //It seemed to work fine in testing, but I've been informed it's unneeded.
tail = "tail" //Scree's tail. Can be disabled in the vore tab by choosing "hide species specific tail sprite"
icobase_tail = 1
egg_type = "Scree" //Scree egg.
inherent_verbs = list(/mob/living/carbon/human/proc/begin_reconstitute_form)
min_age = 17
max_age = 80
blurb = "Some amalgamation of different species from across the universe,with extremely unstable DNA, making them unfit for regular cloners. \
Widely known for their voracious nature and violent tendencies when left unfed for long periods of time. \
Most, if not all chimeras possess the ability to undergo some type of regeneration process, at the cost of energy."
//primitive_form = "Farwa"
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED //Whitelisted as restricted is broken.
flags = NO_SCAN //Dying as a chimera is, quite literally, a death sentence. Well, if it wasn't for their revive, that is.
appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR
flesh_color = "#AFA59E"
base_color = "#333333"
blood_color = "#14AD8B"
/datum/species/chimera/handle_environment_special(var/mob/living/carbon/human/H)
if(H.stat) // If they're dead or unconcious they won't think about being all feral.
return
if(H.absorbed == 1) //If they get nomphed and absorbed.
return
if(H.nutrition > 50 && H.species.has_fine_manipulation == 0) //If they went feral then ate something.
H.species.has_fine_manipulation = 1
H << "<span class='primary'>You feel as if you're no longer feral, the feeling of intense hunger having now passed. You're sated. For the time being, at least.</span>"
return
else if(H.nutrition >= 300)
return
else if(H.nutrition < 300 && H.nutrition > 200)
if(prob(0.5)) //A bit of an issue, not too bad.
H << "<span class='info'>You feel extremely hungry. It might be a good idea to find some some food...</span>"
return
else if(H.nutrition <= 200 && H.nutrition > 100)
if(prob(0.5)) //Getting closer, should probably eat some food about now...
H << "<span class='warning'>You feel like you're going to starve and give into your hunger soon... It might would be for the best to find some [pick("food","prey")] to eat...</span>"
return
else if(H.nutrition <= 100 && H.nutrition > 50)
if(prob(1)) //Getting real close here! Eat something!
H << "<span class='danger'> You feel a sharp jabbing pain in your abdomen. You feel as if you're beginning to become feral, with food being the only thing on your mind. </span>"
return
else if(H.nutrition <= 50 && H.species.has_fine_manipulation == 1) //Should've eaten sooner!
H << "<span class='danger'><big>You suddenly feel a sharp stabbing pain in your stomach. You feel as if you've became completely feral, food the only thing on your mind.</big></span>"
if(H.stat == CONSCIOUS)
H.emote("twitch")
H.species.has_fine_manipulation = 0 //Unable to use objects.
for(var/mob/living/M in viewers(H))
if(M != H)
if(prob(0.5))//1 in 200 chance to tell them that person looks like food. This is so irregular so it doesn't pop up 24/7 during ERP.
H << "<span class='danger'> You feel a stabbing pain in your gut, causing you to twitch in pain.. It would be extremely wise to find some type of food... In fact, [M] looks extremely appetizing...</span>"
if(H.stat == CONSCIOUS)
H.emote("twitch")
return
else if(M == H && H.nutrition <= 50) //Hungry and nobody is in view.
if(prob(1)) //Constantly nag them to go and find someone or something to eat.
H << "<span class='danger'> You feel a sharp jab in your stomach from hunger, causing you to twitch in pain. You need to find something to eat immediately.</span>"
if(H.stat == CONSCIOUS)
H.emote("twitch")
return
return

View File

@@ -270,15 +270,25 @@
/datum/species/unathi
egg_type = "Unathi"
spawn_flags = SPECIES_CAN_JOIN //Species_can_join is the only spawn flag all the races get, so that none of them will be whitelist only if whitelist is enabled.
/datum/species/tajaran
egg_type = "Tajaran"
spawn_flags = SPECIES_CAN_JOIN
/datum/species/skrell
egg_type = "Skrell"
spawn_flags = SPECIES_CAN_JOIN
/datum/species/diona
spawn_flags = SPECIES_CAN_JOIN
/datum/species/teshari
spawn_flags = SPECIES_CAN_JOIN
/datum/species/shapeshifter/promethean
egg_type = "Slime"
spawn_flags = SPECIES_CAN_JOIN
/datum/species/human
egg_type = "Human"
egg_type = "Human"

View File

@@ -38,6 +38,11 @@
gender = MALE
species_allowed = list("Human","Skrell","Unathi","Tajara", "Teshari", "Nevrean", "Akula", "Sergal", "Flatland Zorren", "Highlander Zorren", "Vulpkanin") //Lets all the races be bald if they want.
una_hood
name = "Cobra Hood"
icon = 'icons/mob/human_face_vr.dmi'
icon_state = "soghun_hood"
// Vulpa stuffs
vulp_hair_none

View File

@@ -65,14 +65,10 @@
M.adjustBruteLoss(2)
M.adjustFireLoss(3)
var/offset
if (M.weight > 137)
offset = 1 + ((M.weight - 137) / 137)
if (M.weight < 137)
offset = (137 - M.weight) / 137
var/offset = (1 + ((M.weight - 137) / 137)) // 130 pounds = .95 140 pounds = 1.02
var/difference = owner.size_multiplier / M.size_multiplier
if(offset) // If any different than default weight, multiply the % of offset.
owner.nutrition += offset*(10/difference)
owner.nutrition += offset*(10/difference) // 9.5 nutrition per digestion tick if they're 130 pounds and it's same size. 10.2 per digestion tick if they're 140 and it's same size. Etc etc.
else
owner.nutrition += (10/difference)
@@ -403,6 +399,13 @@
J.name = "[defined_species] egg"
J.desc = "This egg has a very unique look to it."
internal_contents -= P
if("Scree")
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
else
var/obj/structure/closet/secure_closet/egg/J = new /obj/structure/closet/secure_closet/egg(O.loc)
P.forceMove(J)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

View File

@@ -1484,6 +1484,8 @@
#include "code\modules\mob\living\carbon\human\species\station\prometheans_vr.dm"
#include "code\modules\mob\living\carbon\human\species\station\seromi.dm"
#include "code\modules\mob\living\carbon\human\species\station\station.dm"
#include "code\modules\mob\living\carbon\human\species\station\station_special_abilities_vr.dm"
#include "code\modules\mob\living\carbon\human\species\station\station_special_vr.dm"
#include "code\modules\mob\living\carbon\human\species\station\station_vr.dm"
#include "code\modules\mob\living\carbon\metroid\death.dm"
#include "code\modules\mob\living\carbon\metroid\emote.dm"