diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index 7ca42d8ac3f..0dc4031e7a3 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -10,7 +10,6 @@ required_enemies = 1 recommended_enemies = 4 - uplink_welcome = "Syndicate Uplink Console:" uplink_uses = 10 @@ -211,11 +210,17 @@ var/list/absorbed_dna = list() var/changeling_fakedeath = 0 var/chem_charges = 20.00 + var/chem_recharge_multiplier = 1 + var/chem_storage = 50 var/sting_range = 1 var/changelingID = "none" var/mob/living/host = null var/geneticdamage = 0.0 var/isabsorbing = 0 + var/geneticpoints = 5 + var/purchasedpowers = list() + + /datum/changeling/New() ..() diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm index 3b8bfeb1809..e1caca4a333 100644 --- a/code/game/gamemodes/changeling/changeling_powers.dm +++ b/code/game/gamemodes/changeling/changeling_powers.dm @@ -2,14 +2,21 @@ if(!changeling) changeling = new changeling.host = src - src.verbs += /client/proc/changeling_lesser_transform - src.verbs += /client/proc/changeling_fakedeath + src.verbs += /datum/changeling/proc/EvolutionMenu + for(var/obj/effect/proc_holder/power/P in changeling.purchasedpowers) + if(P.isVerb) + if(P.allowduringlesserform) + if(!(P in src.verbs)) + src.verbs += P.verbpath + +/* src.verbs += /client/proc/changeling_fakedeath + src.verbs += /client/proc/changeling_lesser_transform src.verbs += /client/proc/changeling_blind_sting src.verbs += /client/proc/changeling_deaf_sting src.verbs += /client/proc/changeling_silence_sting src.verbs += /client/proc/changeling_unfat_sting - +*/ changeling.changeling_level = 1 return @@ -17,6 +24,14 @@ if(!changeling) changeling = new changeling.host = src + src.verbs += /datum/changeling/proc/EvolutionMenu + + for(var/obj/effect/proc_holder/power/P in changeling.purchasedpowers) + if(P.isVerb) + if(!(P in src.verbs)) + src.verbs += P.verbpath + +/* src.verbs += /client/proc/changeling_absorb_dna src.verbs += /client/proc/changeling_transform src.verbs += /client/proc/changeling_lesser_form @@ -30,6 +45,7 @@ src.verbs += /client/proc/changeling_unfat_sting src.verbs += /client/proc/changeling_boost_range +*/ changeling.changeling_level = 2 if (!changeling.absorbed_dna) changeling.absorbed_dna = list() @@ -43,6 +59,11 @@ return /mob/proc/remove_changeling_powers() + + for(var/obj/effect/proc_holder/power/P in changeling.purchasedpowers) + if(P.isVerb) + src.verbs -= P.verbpath +/* src.verbs -= /client/proc/changeling_absorb_dna src.verbs -= /client/proc/changeling_transform src.verbs -= /client/proc/changeling_lesser_form @@ -55,7 +76,7 @@ src.verbs -= /client/proc/changeling_boost_range src.verbs -= /client/proc/changeling_transformation_sting src.verbs -= /client/proc/changeling_unfat_sting - +*/ /client/proc/changeling_absorb_dna() set category = "Changeling" set name = "Absorb DNA" @@ -127,12 +148,35 @@ usr.changeling.absorbed_dna[T.real_name] = T.dna if(usr.nutrition < 400) usr.nutrition = min((usr.nutrition + T.nutrition), 400) usr.changeling.chem_charges += 10 + usr.changeling.geneticpoints += 2 if(T.changeling) if(T.changeling.absorbed_dna) usr.changeling.absorbed_dna |= T.changeling.absorbed_dna //steal all their loot + T.changeling.absorbed_dna = list() T.changeling.absorbed_dna[T.real_name] = T.dna + + if(T.changeling.purchasedpowers) + for(var/obj/effect/proc_holder/power/Tp in T.changeling.purchasedpowers) + if(Tp in usr.changeling.purchasedpowers) + continue + else + usr.changeling.purchasedpowers += Tp + + if(!Tp.isVerb) + call(Tp.verbpath)() + + else + if(usr.changeling.changeling_level == 1) + usr.make_lesser_changeling() + else + usr.make_changeling() + + + + usr.changeling.chem_charges += T.changeling.chem_charges + usr.changeling.geneticpoints += T.changeling.geneticpoints T.changeling.chem_charges = 0 usr.changeling.isabsorbing = 0 @@ -261,7 +305,7 @@ usr.mind.transfer_to(O) O.make_lesser_changeling() - + O.verbs += /client/proc/changeling_lesser_transform del(usr) return @@ -711,4 +755,159 @@ spawn(5) usr.verbs += /client/proc/changeling_unfat_sting - return \ No newline at end of file + return + +/client/proc/changeling_unstun() + set category = "Changeling" + set name = "Epinephrine Sacs (25)" + set desc = "Removes all stuns" + + if(!usr.changeling) + usr << "\red You're not a changeling, something's wrong!" + return + + if(usr.changeling.chem_charges < 25) + usr << "\red We don't have enough stored chemicals to do that!" + return + + usr.changeling.chem_charges -= 25 + + var/mob/living/carbon/human/C = usr + + if(C) + C.stat = 0 + C.SetParalysis(0) + C.SetStunned(0) + C.SetWeakened(0) + C.lying = 0 + C.canmove = 1 + + usr.verbs -= /client/proc/changeling_unstun + + spawn(5) + usr.verbs += /client/proc/changeling_unstun + + + +/client/proc/changeling_fastchemical() + + usr.changeling.chem_recharge_multiplier = usr.changeling.chem_recharge_multiplier*2 + +/client/proc/changeling_engorgedglands() + + usr.changeling.chem_storage = usr.changeling.chem_storage+25 + +/client/proc/changeling_digitalcamo() + set category = "Changeling" + set name = "Toggle Digital Camoflague (10)" + set desc = "The AI can no longer track us, but we will look different if examined. Has a constant cost while active." + + if(!usr.changeling) + usr << "\red You're not a changeling, something's wrong!" + return + + if(usr.changeling.chem_charges < 10) + usr << "\red We don't have enough stored chemicals to do that!" + return + + usr.changeling.chem_charges -= 10 + + var/mob/living/carbon/human/C = usr + + if(C) + C << "[C.digitalcamo ? "We return to normal." : "We distort our form."]" + C.digitalcamo = !C.digitalcamo + spawn(0) + while(C && C.digitalcamo) + C.changeling.chem_charges -= 1/4 + sleep(10) + + + usr.verbs -= /client/proc/changeling_digitalcamo + + spawn(5) + usr.verbs += /client/proc/changeling_digitalcamo + + +/client/proc/changeling_DEATHsting() + set category = "Changeling" + set name = "Death Sting (40)" + set desc = "Causes spasms onto death." + + if(!usr.changeling) + usr << "\red You're not a changeling, something's wrong!" + return + + var/list/victims = list() + for(var/mob/living/carbon/C in oview(usr.changeling.sting_range)) + victims += C + var/mob/T = input(usr, "Who do you wish to sting?") as null | anything in victims + + if(T && T in view(usr.changeling.sting_range)) + + if(usr.stat) + usr << "\red Not when we are incapacitated." + return + + if(usr.changeling.chem_charges < 40) + usr << "\red We don't have enough stored chemicals to do that!" + return + + usr.changeling.chem_charges -= 40 + usr.changeling.sting_range = 1 + + usr << "\blue We stealthily sting [T]." + + if(!T.changeling) + T << "You feel a small prick and your chest becomes tight." + + T.silent = (10) + T.Paralyse(10) + T.make_jittery(1000) + + if (T.reagents) + T.reagents.add_reagent("lexorin", 40) + + else + T << "You feel a small prick." + + usr.verbs -= /client/proc/changeling_DEATHsting + + spawn(5) + usr.verbs += /client/proc/changeling_DEATHsting + + return + + + +/client/proc/changeling_rapidregen() + set category = "Changeling" + set name = "Rapid Regeneration (30)" + set desc = "Begins rapidly regenerating. Does not effect stuns or chemicals." + + if(!usr.changeling) + usr << "\red You're not a changeling, something's wrong!" + return + + if(usr.changeling.chem_charges < 30) + usr << "\red We don't have enough stored chemicals to do that!" + return + + usr.changeling.chem_charges -= 30 + + var/mob/living/carbon/human/C = usr + + spawn(0) + for(var/i = 0, i<10,i++) + if(C) + C.adjustBruteLoss(-10) + C.adjustToxLoss(-10) + C.adjustOxyLoss(-10) + C.adjustFireLoss(-10) + sleep(10) + + + usr.verbs -= /client/proc/changeling_rapidregen + + spawn(5) + usr.verbs += /client/proc/changeling_rapidregen diff --git a/code/game/gamemodes/changeling/modularchangling.dm b/code/game/gamemodes/changeling/modularchangling.dm new file mode 100644 index 00000000000..e8cce72daeb --- /dev/null +++ b/code/game/gamemodes/changeling/modularchangling.dm @@ -0,0 +1,513 @@ + +var/list/powers = typesof(/obj/effect/proc_holder/power) //needed for the badmin verb for now +var/list/obj/effect/proc_holder/power/powerinstances = list() + +/obj/effect/proc_holder/power + name = "Power" + desc = "Placeholder" + density = 0 + opacity = 0 + + var/helptext = "" + + var/allowduringlesserform = 0 + var/isVerb = 1 // Is it an active power, or passive? + var/verbpath = null // Path to a verb that contains the effects. + var/genomecost = 500000 // Cost for the changling to evolve this power. + +/obj/effect/proc_holder/power/absorb_dna + name = "Absorb DNA" + desc = "Permits us to syphon the DNA from a human. They become one with us, and we become stronger." + genomecost = 0 + + verbpath = /client/proc/changeling_absorb_dna + + + +/obj/effect/proc_holder/power/transform + name = "Transform" + desc = "We take on the apperance and voice of one we have absorbed." + genomecost = 0 + + verbpath = /client/proc/changeling_transform + + + +/obj/effect/proc_holder/power/lesser_form + name = "Lesser Form" + desc = "We debase ourselves and become lesser. We become a monkey." + genomecost = 1 + + verbpath = /client/proc/changeling_lesser_form + + + +/obj/effect/proc_holder/power/changeling_greater_form + name = "Greater Form" + desc = "We become the pinnicle of evolution. We will show the humans what happens when they leave their isle of ignorance." + genomecost = 250 + + // doesn't happen lol. Yet! + +/obj/effect/proc_holder/power/fakedeath + name = "Fake Death" + desc = "We fake our death while we heal." + genomecost = 0 + allowduringlesserform = 1 + + verbpath = /client/proc/changeling_fakedeath + + + +/obj/effect/proc_holder/power/deaf_sting + name = "Deaf Sting" + desc = "We silently sting a human, completely silencing them for a short time." + genomecost = 1 + allowduringlesserform = 1 + + verbpath = /client/proc/changeling_deaf_sting + + + +/obj/effect/proc_holder/power/blind_sting + name = "Blind Sting" + desc = "We silently sting a human, completely deafening them for a short time." + genomecost = 2 + allowduringlesserform = 1 + + verbpath = /client/proc/changeling_blind_sting + + + +/obj/effect/proc_holder/power/paralysis_sting + name = "Paralysis Sting" + desc = "We silently sting a human, paralyzing them for a short time. We must be wary, they can still whisper." + genomecost = 5 + + + verbpath = /client/proc/changeling_paralysis_sting + + + +/obj/effect/proc_holder/power/silence_sting + name = "Silence Sting" + desc = "We silently sting a human, completely silencing them for a short time." + genomecost = 2 + allowduringlesserform = 1 + + verbpath = /client/proc/changeling_silence_sting + + + +/obj/effect/proc_holder/power/transformation_sting + name = "Transformation Sting" + desc = "We silently sting a human, injecting a retrovirus that forces them to transform into another." + genomecost = 2 + + verbpath = /client/proc/changeling_transformation_sting + + + +/obj/effect/proc_holder/power/unfat_sting + name = "Unfat Sting" + desc = "We silently sting a human, forcing them to rapidly metobolize their fat." + genomecost = 1 + + + verbpath = /client/proc/changeling_unfat_sting + +/obj/effect/proc_holder/power/boost_range + name = "Boost Range" + desc = "We evolve the ability to shoot our stingers at humans, with some preperation." + genomecost = 2 + allowduringlesserform = 1 + + verbpath = /client/proc/changeling_boost_range + + + +/obj/effect/proc_holder/power/Epinephrine + name = "Epinephrine sacs" + desc = "We evolve additional sacs of adrenaline throughout our body." + helptext = "Gives the ability to instantly recover from stuns. High chemical cost." + genomecost = 4 + + verbpath = /client/proc/changeling_unstun + + +/obj/effect/proc_holder/power/ChemicalSynth + name = "Rapid Chemical Synthesis" + desc = "We evolve new pathways for producing our necessary chemicals, permitting us to naturally create them faster." + helptext = "Doubles the rate at which we naturally recharge chemicals." + genomecost = 4 + isVerb = 0 + + verbpath = /client/proc/changeling_fastchemical + + + +/obj/effect/proc_holder/power/EngorgedGlands + name = "Engorged Chemical Glands" + desc = "Our chemical glands swell, permitting us to store more chemicals inside of them." + helptext = "Allows us to store an extra 25 units of chemicals." + genomecost = 4 + isVerb = 0 + + + verbpath = /client/proc/changeling_engorgedglands + + + +/obj/effect/proc_holder/power/DigitalCamoflague + name = "Digital Camoflauge" + desc = "We evolve the ability to distort our form and proprtions, defeating common altgorthms used to detect lifeforms on cameras." + helptext = "We cannot be tracked by camera while using this skill. However, humans looking at us will find us.. uncanny. We must constantly expend chemicals to maintain our form like this." + genomecost = 4 + allowduringlesserform = 1 + + verbpath = /client/proc/changeling_digitalcamo + + + +/obj/effect/proc_holder/power/DeathSting + name = "Death Sting" + desc = "We silently sting a human, filling him with potent chemicals. His rapid death is all but assured." + genomecost = 10 + + verbpath = /client/proc/changeling_DEATHsting + + + +/obj/effect/proc_holder/power/rapidregeneration + name = "Rapid Regeneration" + desc = "We evolve the ability to rapidly regenerate, negating the need for stasis." + helptext = "Heals a moderate amount of damage every tick." + genomecost = 8 + + verbpath = /client/proc/changeling_rapidregen + + + + + + + + +// Modularchangling, totally stolen from the new player panel. YAYY +/datum/changeling/proc/EvolutionMenu()//The new one + set category = "Changeling" + set desc = "Level up!" + if (!usr.changeling) + return + + src = usr.changeling + + if(!powerinstances.len) + for(var/P in powers) + var/obj/effect/proc_holder/power/nP = new P + if (nP.desc == "Placeholder") + del(nP) + continue + powerinstances += nP + + var/dat = "
|
+ Changling Evolution Menu + Hover over a power to see more information + Current genomes left to evolve with: [usr.changeling.geneticpoints] + + |
+
| + Search: + | +
|
+
+
+ Evolve [P] - Cost: [ownsthis ? "Purchased" : P.genomecost]
+
+ + |
+