diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm index f684a04a43..ce4cd77746 100644 --- a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm @@ -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 << "Consciousness begins to stir as your new body awakens, ready to hatch.." - 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 << "Consciousness begins to stir as your new body awakens, ready to hatch.." 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 << "Consciousness begins to stir as your new body awakens, ready to hatch.." - 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 << "You start to purge your body of poisons and intruders..." - - 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 << "You feel nauseous..." - sleep(30) - if(prob(min(100, grossness/2))) // relatively small chance unless they really let themselves go to shit - C << "You double over, gagging!" - C.Stun(3) - C.vomit() - sleep(50) - - C << "You have finished purging your body of impurities." - - 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 << "Consciousness begins to stir as your new body awakens, ready to hatch.." + 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 << "Consciousness begins to stir as your new body awakens, ready to hatch.." + 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. diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm index f5cb361465..28cad6ee09 100644 --- a/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm @@ -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 << " Every movement, every flick, every sight and sound has your full attention, your hunting instincts on high alert... In fact, [M] looks extremely appetizing..." 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. diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks_vr.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks_vr.dm index b530b9834e..b904067813 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks_vr.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks_vr.dm @@ -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 << "Your mind starts to clear, soothed into a state of clarity as your senses return." + log_and_message_admins("is no longer feral.", H) diff --git a/code/modules/reagents/Chemistry-Recipes_vr.dm b/code/modules/reagents/Chemistry-Recipes_vr.dm index 806d0e6cd0..7288a2fc5a 100644 --- a/code/modules/reagents/Chemistry-Recipes_vr.dm +++ b/code/modules/reagents/Chemistry-Recipes_vr.dm @@ -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("[H] shudders briefly, then relaxes, faint movements stirring within.") + H.chimera_regenerate() + else + H.visible_message("[H] twitches for a moment, but remains still.") + /////////////////////////////////////////////////////////////////////////////////// /// 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/////// ///////////////////////////////