mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-14 12:13:06 +00:00
Adds "monster tamer".
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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///////
|
||||
///////////////////////////////
|
||||
|
||||
Reference in New Issue
Block a user