From 1503dee51e1fc157b49d3d0d47f131053f53cf4e Mon Sep 17 00:00:00 2001 From: uraniummeltdown Date: Mon, 25 Sep 2017 19:15:22 +0400 Subject: [PATCH] ling regen stasis time from 80s to 40s, armblade door open time from 15s to 10s, lings always keep regen stasis even when readapting, added mannitol and antihol to panacea, fleshmend chem cost from 25 to 20 and it no longer restores blood and spamming it in a short time gives less effective healing, spawn->addtimer in fakedeath.dm, lings can generate chems when dead up to half the max (37.5), added chameleon skin power for 2 evo points --- code/game/gamemodes/changeling/changeling.dm | 15 ++++-- .../gamemodes/changeling/changeling_power.dm | 1 + .../gamemodes/changeling/evolution_menu.dm | 2 +- .../gamemodes/changeling/powers/absorb.dm | 2 - .../changeling/powers/chameleon_skin.dm | 27 ++++++++++ .../gamemodes/changeling/powers/fakedeath.dm | 21 ++++---- .../gamemodes/changeling/powers/fleshmend.dm | 51 +++++++++++++++---- .../gamemodes/changeling/powers/mutations.dm | 2 +- .../gamemodes/changeling/powers/panacea.dm | 4 +- .../gamemodes/changeling/powers/revive.dm | 1 + code/modules/mob/living/carbon/human/life.dm | 2 +- code/modules/mob/living/carbon/life.dm | 2 +- paradise.dme | 1 + 13 files changed, 101 insertions(+), 30 deletions(-) create mode 100644 code/game/gamemodes/changeling/powers/chameleon_skin.dm diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index 059306cd080..a9c5882094d 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -1,3 +1,7 @@ +#define LING_FAKEDEATH_TIME 400 //40 seconds +#define LING_DEAD_GENETICDAMAGE_HEAL_CAP 50 //The lowest value of geneticdamage handle_changeling() can take it to while dead. +#define LING_ABSORB_RECENT_SPEECH 8 //The amount of recent spoken lines to gain on absorbing a mob + var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon","Zeta","Eta","Theta","Iota","Kappa","Lambda","Mu","Nu","Xi","Omicron","Pi","Rho","Sigma","Tau","Upsilon","Phi","Chi","Psi","Omega") /datum/game_mode @@ -253,9 +257,14 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" else changelingID = "[honorific] [rand(1,999)]" -/datum/changeling/proc/regenerate() - chem_charges = min(max(0, chem_charges + chem_recharge_rate - chem_recharge_slowdown), chem_storage) - geneticdamage = max(0, geneticdamage-1) +/datum/changeling/proc/regenerate(mob/living/carbon/the_ling) + if(istype(the_ling)) + if(the_ling.stat == DEAD) + chem_charges = min(max(0, chem_charges + chem_recharge_rate - chem_recharge_slowdown), (chem_storage*0.5)) + geneticdamage = max(LING_DEAD_GENETICDAMAGE_HEAL_CAP,geneticdamage-1) + else //not dead? no chem/geneticdamage caps. + chem_charges = min(max(0, chem_charges + chem_recharge_rate - chem_recharge_slowdown), chem_storage) + geneticdamage = max(0, geneticdamage-1) /datum/changeling/proc/GetDNA(dna_owner) for(var/datum/dna/DNA in (absorbed_dna + protected_dna)) diff --git a/code/game/gamemodes/changeling/changeling_power.dm b/code/game/gamemodes/changeling/changeling_power.dm index 6d03a864692..c01f335ba08 100644 --- a/code/game/gamemodes/changeling/changeling_power.dm +++ b/code/game/gamemodes/changeling/changeling_power.dm @@ -15,6 +15,7 @@ var/req_stat = CONSCIOUS // CONSCIOUS, UNCONSCIOUS or DEAD var/genetic_damage = 0 // genetic damage caused by using the sting. Nothing to do with cloneloss. var/max_genetic_damage = 100 // hard counter for spamming abilities. Not used/balanced much yet. + var/always_keep = 0 // important for abilities like regenerate that screw you if you lose them. /obj/effect/proc_holder/changeling/proc/on_purchase(var/mob/user) return diff --git a/code/game/gamemodes/changeling/evolution_menu.dm b/code/game/gamemodes/changeling/evolution_menu.dm index 4a6b3a2bd2c..d690f095236 100644 --- a/code/game/gamemodes/changeling/evolution_menu.dm +++ b/code/game/gamemodes/changeling/evolution_menu.dm @@ -407,7 +407,7 @@ var/list/sting_paths mind.changeling.changeling_speak = 0 mind.changeling.reset() for(var/obj/effect/proc_holder/changeling/p in mind.changeling.purchasedpowers) - if(p.dna_cost == 0 && keep_free_powers) + if((p.dna_cost == 0 && keep_free_powers) || p.always_keep) continue mind.changeling.purchasedpowers -= p p.on_refund(src) diff --git a/code/game/gamemodes/changeling/powers/absorb.dm b/code/game/gamemodes/changeling/powers/absorb.dm index 06402a584b7..50b17dfa6ea 100644 --- a/code/game/gamemodes/changeling/powers/absorb.dm +++ b/code/game/gamemodes/changeling/powers/absorb.dm @@ -1,5 +1,3 @@ -#define LING_ABSORB_RECENT_SPEECH 8 //The amount of recent spoken lines to gain on absorbing a mob - /obj/effect/proc_holder/changeling/absorbDNA name = "Absorb DNA" desc = "Absorb the DNA of our victim." diff --git a/code/game/gamemodes/changeling/powers/chameleon_skin.dm b/code/game/gamemodes/changeling/powers/chameleon_skin.dm new file mode 100644 index 00000000000..07340cf3e84 --- /dev/null +++ b/code/game/gamemodes/changeling/powers/chameleon_skin.dm @@ -0,0 +1,27 @@ +/obj/effect/proc_holder/changeling/chameleon_skin + name = "Chameleon Skin" + desc = "Our skin pigmentation rapidly changes to suit our current environment." + helptext = "Allows us to become invisible after a few seconds of standing still. Can be toggled on and off." + dna_cost = 2 + chemical_cost = 25 + req_human = 1 + +/obj/effect/proc_holder/changeling/chameleon_skin/sting_action(mob/user) + var/mob/living/carbon/human/H = user //SHOULD always be human, because req_human = 1 + if(!istype(H)) // req_human could be done in can_sting stuff. + return + if(H.dna.GetSEState(CHAMELEONBLOCK)) + H.dna.SetSEState(CHAMELEONBLOCK, 0) + genemutcheck(H, CHAMELEONBLOCK, null, MUTCHK_FORCED) + else + H.dna.SetSEState(CHAMELEONBLOCK, 1) + genemutcheck(H, CHAMELEONBLOCK, null, MUTCHK_FORCED) + + feedback_add_details("changeling_powers","CS") + return TRUE + +/obj/effect/proc_holder/changeling/chameleon_skin/on_refund(mob/user) + var/mob/living/carbon/C = user + if(C.dna.GetSEState(CHAMELEONBLOCK)) + C.dna.SetSEState(CHAMELEONBLOCK, 0) + genemutcheck(C, CHAMELEONBLOCK, null, MUTCHK_FORCED) diff --git a/code/game/gamemodes/changeling/powers/fakedeath.dm b/code/game/gamemodes/changeling/powers/fakedeath.dm index 7cd29c55021..156e8ffb896 100644 --- a/code/game/gamemodes/changeling/powers/fakedeath.dm +++ b/code/game/gamemodes/changeling/powers/fakedeath.dm @@ -7,30 +7,31 @@ req_stat = DEAD max_genetic_damage = 100 - //Fake our own death and fully heal. You will appear to be dead but regenerate fully after a short delay. /obj/effect/proc_holder/changeling/fakedeath/sting_action(var/mob/living/user) to_chat(user, "We begin our stasis, preparing energy to arise once more.") - if(user.stat != DEAD) user.emote("deathgasp") user.timeofdeath = world.time - user.status_flags |= FAKEDEATH //play dead user.update_canmove() - spawn(800) - if(user && user.mind && user.mind.changeling && user.mind.changeling.purchasedpowers) - to_chat(user, "We are ready to regenerate.") - user.mind.changeling.purchasedpowers += new /obj/effect/proc_holder/changeling/revive(null) - + addtimer(src, "ready_to_regenerate", LING_FAKEDEATH_TIME, FALSE, user) feedback_add_details("changeling_powers","FD") return 1 +/obj/effect/proc_holder/changeling/fakedeath/proc/ready_to_regenerate(mob/user) + if(user && user.mind && user.mind.changeling && user.mind.changeling.purchasedpowers) + to_chat(user, "We are ready to regenerate.") + user.mind.changeling.purchasedpowers += new /obj/effect/proc_holder/changeling/revive(null) + /obj/effect/proc_holder/changeling/fakedeath/can_sting(var/mob/user) if(user.status_flags & FAKEDEATH) + to_chat(user, "We are already regenerating.") return - if(!user.stat && alert("Are we sure we wish to fake our death?",,"Yes","No") == "No")//Confirmation for living changelings if they want to fake their death - return + if(!user.stat)//Confirmation for living changelings if they want to fake their death + switch(alert("Are we sure we wish to fake our death?",,"Yes","No")) + if("No") + return return ..() diff --git a/code/game/gamemodes/changeling/powers/fleshmend.dm b/code/game/gamemodes/changeling/powers/fleshmend.dm index e6ccafcffa0..379fa015c83 100644 --- a/code/game/gamemodes/changeling/powers/fleshmend.dm +++ b/code/game/gamemodes/changeling/powers/fleshmend.dm @@ -2,22 +2,53 @@ name = "Fleshmend" desc = "Our flesh rapidly regenerates, healing our wounds." helptext = "Heals a moderate amount of damage over a short period of time. Can be used while unconscious." - chemical_cost = 25 + chemical_cost = 20 dna_cost = 2 req_stat = UNCONSCIOUS + var/recent_uses = 1 //The factor of which the healing should be divided by + var/healing_ticks = 10 + // The ideal total healing amount, + // divided by healing_ticks to get heal/tick + var/total_healing = 100 + +/obj/effect/proc_holder/changeling/fleshmend/New() + ..() + processing_objects.Add(src) + +/obj/effect/proc_holder/changeling/fleshmend/Destroy() + processing_objects.Remove(src) + return ..() + +/obj/effect/proc_holder/changeling/fleshmend/process() + if(recent_uses > 1) + recent_uses = max(1, recent_uses - (1 / healing_ticks)) //Starts healing you every second for 10 seconds. Can be used whilst unconscious. /obj/effect/proc_holder/changeling/fleshmend/sting_action(var/mob/living/user) to_chat(user, "We begin to heal rapidly.") + if(recent_uses > 1) + to_chat(user, "Our healing's effectiveness is reduced \ + by quick repeated use!") + + recent_uses++ + addtimer(src, "fleshmend", 0, FALSE, user) + feedback_add_details("changeling_powers","RR") + return TRUE + +/obj/effect/proc_holder/changeling/fleshmend/proc/fleshmend(mob/living/user) + + // The healing itself - doesn't heal toxin damage + // (that's anatomic panacea) and the effectiveness decreases with + // each use in a short timespan if(ishuman(user)) var/mob/living/carbon/human/H = user - H.restore_blood() H.shock_stage = 0 - spawn(0) - for(var/i = 0, i<10,i++) - user.heal_overall_damage(10, 10) - user.adjustOxyLoss(-10) - sleep(10) - - feedback_add_details("changeling_powers","RR") - return 1 \ No newline at end of file + for(var/i in 1 to healing_ticks) + if(user) + var/healpertick = -(total_healing / healing_ticks) + user.heal_overall_damage((-healpertick/recent_uses), (-healpertick/recent_uses)) + user.adjustOxyLoss(healpertick/recent_uses) + user.updatehealth() + else + break + sleep(10) diff --git a/code/game/gamemodes/changeling/powers/mutations.dm b/code/game/gamemodes/changeling/powers/mutations.dm index 943b15a6172..18fcd4ebcce 100644 --- a/code/game/gamemodes/changeling/powers/mutations.dm +++ b/code/game/gamemodes/changeling/powers/mutations.dm @@ -167,7 +167,7 @@ user.visible_message("[user] jams [src] into the airlock and starts prying it open!", "We start forcing the airlock open.", \ "You hear a metal screeching sound.") playsound(A, 'sound/machines/airlock_alien_prying.ogg', 150, 1) - if(!do_after(user, 150, target = A)) + if(!do_after(user, 100, target = A)) return //user.say("Heeeeeeeeeerrre's Johnny!") diff --git a/code/game/gamemodes/changeling/powers/panacea.dm b/code/game/gamemodes/changeling/powers/panacea.dm index 5274854c682..8f4fe0ac394 100644 --- a/code/game/gamemodes/changeling/powers/panacea.dm +++ b/code/game/gamemodes/changeling/powers/panacea.dm @@ -1,6 +1,6 @@ /obj/effect/proc_holder/changeling/panacea name = "Anatomic Panacea" - desc = "Expels impurifications from our form; curing diseases, removing toxins and radiation, and resetting our genetic code completely." + desc = "Expels impurifications from our form; curing diseases, removing parasites, sobering us, purging toxins and radiation, and resetting our genetic code completely." helptext = "Can be used while unconscious." chemical_cost = 20 dna_cost = 1 @@ -30,6 +30,8 @@ user.reagents.add_reagent("mutadone", 10) user.reagents.add_reagent("potass_iodide", 10) user.reagents.add_reagent("charcoal", 20) + user.reagents.add_reagent("antihol", 10) + user.reagents.add_reagent("mannitol", 25) for(var/thing in user.viruses) var/datum/disease/D = thing diff --git a/code/game/gamemodes/changeling/powers/revive.dm b/code/game/gamemodes/changeling/powers/revive.dm index b6f3062c66a..23efc38b403 100644 --- a/code/game/gamemodes/changeling/powers/revive.dm +++ b/code/game/gamemodes/changeling/powers/revive.dm @@ -2,6 +2,7 @@ name = "Regenerate" desc = "We regenerate, healing all damage from our form." req_stat = DEAD + always_keep = 1 //Revive from regenerative stasis /obj/effect/proc_holder/changeling/revive/sting_action(var/mob/living/carbon/user) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index c5b02796648..403b30a039d 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -932,7 +932,7 @@ /mob/living/carbon/human/handle_changeling() if(mind) if(mind.changeling) - mind.changeling.regenerate() + mind.changeling.regenerate(src) if(hud_used) hud_used.lingchemdisplay.invisibility = 0 hud_used.lingchemdisplay.maptext = "
[round(mind.changeling.chem_charges)]
" diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 21f087eeeee..5e09625a776 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -12,8 +12,8 @@ handle_blood() for(var/obj/item/organ/internal/O in internal_organs) O.on_life() - handle_changeling() + handle_changeling() handle_wetness() // Increase germ_level regularly diff --git a/paradise.dme b/paradise.dme index fb3c89d71b0..ca07f96d54f 100644 --- a/paradise.dme +++ b/paradise.dme @@ -408,6 +408,7 @@ #include "code\game\gamemodes\changeling\traitor_chan.dm" #include "code\game\gamemodes\changeling\powers\absorb.dm" #include "code\game\gamemodes\changeling\powers\augmented_eyesight.dm" +#include "code\game\gamemodes\changeling\powers\chameleon_skin.dm" #include "code\game\gamemodes\changeling\powers\digitalcamo.dm" #include "code\game\gamemodes\changeling\powers\epinephrine.dm" #include "code\game\gamemodes\changeling\powers\fakedeath.dm"