Adds "monster tamer".

This commit is contained in:
Screemonster
2018-02-19 14:03:34 +00:00
parent 3512c8d6bd
commit 635bbb7a73
4 changed files with 98 additions and 101 deletions

View File

@@ -1,5 +1,5 @@
/mob/living/carbon/human/proc/begin_reconstitute_form() //Scree's race ability.in exchange for: No cloning.
set name = "Begin Reconstitute Form"
set name = "Reconstitute Form"
set category = "Abilities"
if(world.time < last_special)
@@ -9,41 +9,18 @@
var/confirm = alert(usr, "Are you sure you want to completely reconstruct your form? This process can take up to twenty 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
chimera_regenerate()
if(C.reviving == 1) //If they're already unable to
C << "You are already reconstructing, or your body is currently recovering from the intense process of your previous reconstitution."
return
/mob/living/carbon/human/proc/chimera_regenerate()
var/mob/living/carbon/human/C = src
var/nutrition_used = C.nutrition/2
if(C.stat == DEAD) //Uh oh, you died!
if(C.hasnutriment()) //Let's hope you have nutriment in you.... If not
var/time = (240+960/(1 + nutrition_used/75))
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.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.does_not_breathe = 1 //effectively makes them spaceworthy while regenning
if(C.reviving == 1) //If they're already unable to
C << "You are already reconstructing, or your body is currently recovering from the intense process of your previous reconstitution."
return
for(var/obj/item/organ/E in C.bad_external_organs)
var/obj/item/organ/external/affected = E
for(var/datum/wound/W in affected.wounds) // Fix internal bleeds at the start of the rejuv process.
if(istype(W, /datum/wound/internal_bleeding))
affected.wounds -= W
affected.update_damages()
spawn(time SECONDS)
if(C) //Runtime prevention.
C << "<span class='notice'>Consciousness begins to stir as your new body awakens, ready to hatch..</span>"
C.verbs += /mob/living/carbon/human/proc/hatch
return
else
return //Something went wrong.
else //Dead until nutrition injected.
C << "Your body is too damaged to regenerate without additional nutrients to feed what few living cells remain."
return
else if(C.stat != DEAD) //If they're alive at the time of reviving.
if(C.stat == DEAD) //Uh oh, you died!
if(C.hasnutriment()) //Let's hope you have nutriment in you.... If not
var/time = (240+960/(1 + nutrition_used/75))
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.reviving = 1
@@ -51,77 +28,49 @@
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.does_not_breathe = 1 //effectively makes them spaceworthy while regenning
for(var/obj/item/organ/E in C.bad_external_organs)
var/obj/item/organ/external/affected = E
for(var/datum/wound/W in affected.wounds) // Fix internal bleeds at the start of the rejuv process.
if(istype(W, /datum/wound/internal_bleeding))
affected.wounds -= W
affected.update_damages()
spawn(time SECONDS)
if(C.stat != DEAD) //If they're still alive after regenning.
if(C) //Runtime prevention.
C << "<span class='notice'>Consciousness begins to stir as your new body awakens, ready to hatch..</span>"
C.verbs += /mob/living/carbon/human/proc/hatch
return
else if(C.stat == DEAD)
if(C.hasnutriment()) //Let's hope you have nutriment in you.... If not
C << "<span class='notice'>Consciousness begins to stir as your new body awakens, ready to hatch..</span>"
C.verbs += /mob/living/carbon/human/proc/hatch
else //Dead until nutrition injected.
C << "Your body was unable to regenerate, what few living cells remain require additional nutrients to complete the process."
C.reviving = 0 // so they can try again when they're given a kickstart
return
else
return //Something went wrong
else
return //Something went wrong
return //Something went wrong.
else //Dead until nutrition injected.
C << "Your body is too damaged to regenerate without additional nutrients to feed what few living cells remain."
return
/mob/living/carbon/human/proc/purge_impurities() //a lesser regeneration that just purges toxin/infections without healing. Does NOT clear reagents.
set name = "Purge Impurities"
set category = "Abilities"
if(world.time < last_special)
return
last_special = world.time + 50 //To prevent button spam.
var/mob/living/carbon/human/C = src
if(C.reviving == 1) //If they're already unable to
C << "Your body is currently still recovering from the last time you healed."
return
C.reviving = 1 // apply cooldown, this also locks out their main regen.
C << "<span class='notice'>You start to purge your body of poisons and intruders...</span>"
var/grossness = min(100, toxloss*5)
for(var/i = 0, i<10,i++) // tick some tox down. This'll clear 20 toxloss in total.
if(C)
C.adjustToxLoss(-2)
sleep(10)
for(var/obj/item/organ/external/E in C.organs) //half the germ_level of everything. If they're anything short of outright necrotic they'll be fine.
var/obj/item/organ/external/G = E
if(G.germ_level)
grossness += G.germ_level/10
G.germ_level = min(0, (G.germ_level/2) - 100)
for(var/obj/item/organ/internal/I in C.internal_organs)
var/obj/item/organ/internal/G = I
if(G.germ_level)
grossness += G.germ_level/5
G.germ_level = min(0, (G.germ_level/2) - 100)
//and now comes the fun part because they're gross
for (var/i = 0, i< grossness/10,i++)
if (prob(min(100, grossness)))
C << "<span class='warning'>You feel nauseous...</span>"
sleep(30)
if(prob(min(100, grossness/2))) // relatively small chance unless they really let themselves go to shit
C << "<span class='warning'>You double over, gagging!</span>"
C.Stun(3)
C.vomit()
sleep(50)
C << "<span class='notice'>You have finished purging your body of impurities.</span>"
spawn(300 SECONDS) //5 minute wait until you can purge or regenerate again.
C.reviving = 0
else if(C.stat != DEAD) //If they're alive at the time of reviving.
var/time = (240+960/(1 + nutrition_used/75))
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.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.does_not_breathe = 1 //effectively makes them spaceworthy while regenning
spawn(time SECONDS)
if(C.stat != DEAD) //If they're still alive after regenning.
C << "<span class='notice'>Consciousness begins to stir as your new body awakens, ready to hatch..</span>"
C.verbs += /mob/living/carbon/human/proc/hatch
return
else if(C.stat == DEAD)
if(C.hasnutriment()) //Let's hope you have nutriment in you.... If not
C << "<span class='notice'>Consciousness begins to stir as your new body awakens, ready to hatch..</span>"
C.verbs += /mob/living/carbon/human/proc/hatch
else //Dead until nutrition injected.
C << "Your body was unable to regenerate, what few living cells remain require additional nutrients to complete the process."
C.reviving = 0 // so they can try again when they're given a kickstart
return
else
return //Something went wrong
else
return //Something went wrong
/mob/living/carbon/human/proc/hasnutriment()
if (src.bloodstr.has_reagent("nutriment", 30) || src.bloodstr.has_reagent("protein", 15)) //protein needs half as much. For reference, a steak contains 9u protein.

View File

@@ -24,7 +24,6 @@
inherent_verbs = list(
/mob/living/carbon/human/proc/begin_reconstitute_form,
/mob/living/carbon/human/proc/sonar_ping,
/mob/living/carbon/human/proc/purge_impurities,
/mob/living/carbon/human/proc/succubus_drain,
/mob/living/carbon/human/proc/succubus_drain_finalize,
/mob/living/carbon/human/proc/succubus_drain_lethal,
@@ -48,7 +47,7 @@
//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.
flags = NO_SCAN | NO_INFECT //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"
@@ -145,10 +144,10 @@
H << "<span class='danger'> Every movement, every flick, every sight and sound has your full attention, your hunting instincts on high alert... In fact, [M] looks extremely appetizing...</span>"
if(H.stat == CONSCIOUS)
H.emote("twitch")
if(!H.handling_hal)
spawn(0)
H.handle_feral()
else // nobody around
if(!H.handling_hal)
spawn(0)
H.handle_feral()
if(prob(2)) //periodic nagmessages
if(H.nutrition <= 100) //If hungry, nag them to go and find someone or something to eat.

View File

@@ -28,3 +28,29 @@
M.make_dizzy(24) // Intentionally higher than normal to compensate for it's previous effects.
if(dose * strength >= strength * 2.5) // Slurring takes longer. Again, intentional.
M.slurring = max(M.slurring, 30)
/datum/reagent/ethanol/monstertamer
name = "Monster Tamer"
id = "monstertamer"
description = "A questionably-delicious blend of a carnivore's favorite food and a potent neural depressant."
taste_description = "the gross yet satisfying combination of chewing on a raw steak while downing a shot of whiskey"
strength = 50
color = "#d3785d"
metabolism = REM * 2.5 // about right for mixing nutriment and ethanol.
glass_name = "Monster Tamer"
glass_desc = "This looks like a vaguely-alcoholic slurry of meat. Gross."
/datum/reagent/ethanol/monstertamer/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed)
..()
if(M.species.gets_food_nutrition) //it's still food!
M.nutrition += (nutriment_factor * removed)/2 // For hunger and fatness
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.feral > 0 && H.nutrition > 100 && H.traumatic_shock < min(60, H.nutrition/10) && H.jitteriness < 100) // same check as feral triggers to stop them immediately re-feralling
H.feral -= removed * 3 // should calm them down quick, provided they're actually in a state to STAY calm.
if (H.feral <=0) //check if they're unferalled
H.feral = 0
H << "<span class='info'>Your mind starts to clear, soothed into a state of clarity as your senses return.</span>"
log_and_message_admins("is no longer feral.", H)

View File

@@ -47,6 +47,22 @@
s.start()
holder.clear_reagents()
/datum/chemical_reaction/xenolazarus
name = "Discount Lazarus Injector"
id = "discountlazarusinjector"
result = null
required_reagents = list("monstertamer" = 5, "clonexadone" = 5)
/datum/chemical_reaction/xenolazarus/on_reaction(var/datum/reagents/holder, var/created_volume) //literally all this does is mash the regenerate button
if(ishuman(holder.my_atom))
var/mob/living/carbon/human/H = holder.my_atom
if(H.stat == DEAD && (/mob/living/carbon/human/proc/begin_reconstitute_form in H.verbs)) //no magical regen for non-regenners, and can't force the reaction on live ones
if(H.hasnutriment() && !H.reviving) // make sure it actually has the conditions to revive
H.visible_message("<span class='info'>[H] shudders briefly, then relaxes, faint movements stirring within.</span>")
H.chimera_regenerate()
else
H.visible_message("<span class='info'>[H] twitches for a moment, but remains still.</span>")
///////////////////////////////////////////////////////////////////////////////////
/// Vore Drugs
@@ -97,6 +113,13 @@
required_reagents = list("antifreeze" = 1, "gargleblaster" = 1, "syndicatebomb" =1)
result_amount = 3
/datum/chemical_reaction/drinks/monstertamer
name = "Monster Tamer"
id = "monstertamer"
result = "monstertamer"
required_reagents = list("whiskey" = 1, "protein" = 1)
result_amount = 2
///////////////////////////////
//SLIME CORES BELOW HERE///////
///////////////////////////////