Begins work on new ling.
@@ -13,6 +13,7 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
|
|||||||
var/geneticdamage = 0
|
var/geneticdamage = 0
|
||||||
var/isabsorbing = 0
|
var/isabsorbing = 0
|
||||||
var/geneticpoints = 5
|
var/geneticpoints = 5
|
||||||
|
var/max_geneticpoints = 5
|
||||||
var/purchasedpowers = list()
|
var/purchasedpowers = list()
|
||||||
var/mimicing = ""
|
var/mimicing = ""
|
||||||
|
|
||||||
@@ -126,547 +127,6 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
|
|||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
//Used to switch species based on the changeling datum.
|
|
||||||
/mob/proc/changeling_change_species()
|
|
||||||
|
|
||||||
set category = "Changeling"
|
|
||||||
set name = "Change Species (5)"
|
|
||||||
|
|
||||||
var/mob/living/carbon/human/H = src
|
|
||||||
if(!istype(H))
|
|
||||||
src << "<span class='warning'>We may only use this power while in humanoid form.</span>"
|
|
||||||
return
|
|
||||||
|
|
||||||
var/datum/changeling/changeling = changeling_power(5,1,0)
|
|
||||||
if(!changeling) return
|
|
||||||
|
|
||||||
if(changeling.absorbed_species.len < 2)
|
|
||||||
src << "<span class='warning'>We do not know of any other species genomes to use.</span>"
|
|
||||||
return
|
|
||||||
|
|
||||||
var/S = input("Select the target species: ", "Target Species", null) as null|anything in changeling.absorbed_species
|
|
||||||
if(!S) return
|
|
||||||
|
|
||||||
domutcheck(src, null)
|
|
||||||
|
|
||||||
changeling.chem_charges -= 5
|
|
||||||
changeling.geneticdamage = 30
|
|
||||||
|
|
||||||
src.visible_message("<span class='warning'>[src] transforms!</span>")
|
|
||||||
|
|
||||||
src.verbs -= /mob/proc/changeling_change_species
|
|
||||||
H.set_species(S,1) //Until someone moves body colour into DNA, they're going to have to use the default.
|
|
||||||
|
|
||||||
spawn(10)
|
|
||||||
src.verbs += /mob/proc/changeling_change_species
|
|
||||||
src.regenerate_icons()
|
|
||||||
|
|
||||||
changeling_update_languages(changeling.absorbed_languages)
|
|
||||||
feedback_add_details("changeling_powers","TR")
|
|
||||||
|
|
||||||
return 1
|
|
||||||
|
|
||||||
//Absorbs the victim's DNA making them uncloneable. Requires a strong grip on the victim.
|
|
||||||
//Doesn't cost anything as it's the most basic ability.
|
|
||||||
/mob/proc/changeling_absorb_dna()
|
|
||||||
set category = "Changeling"
|
|
||||||
set name = "Absorb DNA"
|
|
||||||
|
|
||||||
var/datum/changeling/changeling = changeling_power(0,0,100)
|
|
||||||
if(!changeling) return
|
|
||||||
|
|
||||||
var/obj/item/weapon/grab/G = src.get_active_hand()
|
|
||||||
if(!istype(G))
|
|
||||||
src << "<span class='warning'>We must be grabbing a creature in our active hand to absorb them.</span>"
|
|
||||||
return
|
|
||||||
|
|
||||||
var/mob/living/carbon/human/T = G.affecting
|
|
||||||
if(!istype(T))
|
|
||||||
src << "<span class='warning'>[T] is not compatible with our biology.</span>"
|
|
||||||
return
|
|
||||||
|
|
||||||
if(T.species.flags & NO_SCAN)
|
|
||||||
src << "<span class='warning'>We do not know how to parse this creature's DNA!</span>"
|
|
||||||
return
|
|
||||||
|
|
||||||
if(HUSK in T.mutations)
|
|
||||||
src << "<span class='warning'>This creature's DNA is ruined beyond useability!</span>"
|
|
||||||
return
|
|
||||||
|
|
||||||
if(G.state != GRAB_KILL)
|
|
||||||
src << "<span class='warning'>We must have a tighter grip to absorb this creature.</span>"
|
|
||||||
return
|
|
||||||
|
|
||||||
if(changeling.isabsorbing)
|
|
||||||
src << "<span class='warning'>We are already absorbing!</span>"
|
|
||||||
return
|
|
||||||
|
|
||||||
changeling.isabsorbing = 1
|
|
||||||
for(var/stage = 1, stage<=3, stage++)
|
|
||||||
switch(stage)
|
|
||||||
if(1)
|
|
||||||
src << "<span class='notice'>This creature is compatible. We must hold still...</span>"
|
|
||||||
if(2)
|
|
||||||
src << "<span class='notice'>We extend a proboscis.</span>"
|
|
||||||
src.visible_message("<span class='warning'>[src] extends a proboscis!</span>")
|
|
||||||
if(3)
|
|
||||||
src << "<span class='notice'>We stab [T] with the proboscis.</span>"
|
|
||||||
src.visible_message("<span class='danger'>[src] stabs [T] with the proboscis!</span>")
|
|
||||||
T << "<span class='danger'>You feel a sharp stabbing pain!</span>"
|
|
||||||
var/obj/item/organ/external/affecting = T.get_organ(src.zone_sel.selecting)
|
|
||||||
if(affecting.take_damage(39,0,1,0,"large organic needle"))
|
|
||||||
T:UpdateDamageIcon()
|
|
||||||
|
|
||||||
feedback_add_details("changeling_powers","A[stage]")
|
|
||||||
if(!do_mob(src, T, 150))
|
|
||||||
src << "<span class='warning'>Our absorption of [T] has been interrupted!</span>"
|
|
||||||
changeling.isabsorbing = 0
|
|
||||||
return
|
|
||||||
|
|
||||||
src << "<span class='notice'>We have absorbed [T]!</span>"
|
|
||||||
src.visible_message("<span class='danger'>[src] sucks the fluids from [T]!</span>")
|
|
||||||
T << "<span class='danger'>You have been absorbed by the changeling!</span>"
|
|
||||||
|
|
||||||
T.dna.real_name = T.real_name //Set this again, just to be sure that it's properly set.
|
|
||||||
changeling.absorbed_dna |= T.dna
|
|
||||||
if(src.nutrition < 400) src.nutrition = min((src.nutrition + T.nutrition), 400)
|
|
||||||
changeling.chem_charges += 10
|
|
||||||
changeling.geneticpoints += 2
|
|
||||||
|
|
||||||
//Steal all of their languages!
|
|
||||||
for(var/language in T.languages)
|
|
||||||
if(!(language in changeling.absorbed_languages))
|
|
||||||
changeling.absorbed_languages += language
|
|
||||||
|
|
||||||
changeling_update_languages(changeling.absorbed_languages)
|
|
||||||
|
|
||||||
//Steal their species!
|
|
||||||
if(T.species && !(T.species.name in changeling.absorbed_species))
|
|
||||||
changeling.absorbed_species += T.species.name
|
|
||||||
|
|
||||||
if(T.mind && T.mind.changeling)
|
|
||||||
if(T.mind.changeling.absorbed_dna)
|
|
||||||
for(var/dna_data in T.mind.changeling.absorbed_dna) //steal all their loot
|
|
||||||
if(dna_data in changeling.absorbed_dna)
|
|
||||||
continue
|
|
||||||
changeling.absorbed_dna += dna_data
|
|
||||||
changeling.absorbedcount++
|
|
||||||
T.mind.changeling.absorbed_dna.len = 1
|
|
||||||
|
|
||||||
if(T.mind.changeling.purchasedpowers)
|
|
||||||
for(var/datum/power/changeling/Tp in T.mind.changeling.purchasedpowers)
|
|
||||||
if(Tp in changeling.purchasedpowers)
|
|
||||||
continue
|
|
||||||
else
|
|
||||||
changeling.purchasedpowers += Tp
|
|
||||||
|
|
||||||
if(!Tp.isVerb)
|
|
||||||
call(Tp.verbpath)()
|
|
||||||
else
|
|
||||||
src.make_changeling()
|
|
||||||
|
|
||||||
changeling.chem_charges += T.mind.changeling.chem_charges
|
|
||||||
changeling.geneticpoints += T.mind.changeling.geneticpoints
|
|
||||||
T.mind.changeling.chem_charges = 0
|
|
||||||
T.mind.changeling.geneticpoints = 0
|
|
||||||
T.mind.changeling.absorbedcount = 0
|
|
||||||
|
|
||||||
changeling.absorbedcount++
|
|
||||||
changeling.isabsorbing = 0
|
|
||||||
|
|
||||||
T.death(0)
|
|
||||||
T.Drain()
|
|
||||||
return 1
|
|
||||||
|
|
||||||
|
|
||||||
//Change our DNA to that of somebody we've absorbed.
|
|
||||||
/mob/proc/changeling_transform()
|
|
||||||
set category = "Changeling"
|
|
||||||
set name = "Transform (5)"
|
|
||||||
|
|
||||||
var/datum/changeling/changeling = changeling_power(5,1,0)
|
|
||||||
if(!changeling) return
|
|
||||||
|
|
||||||
var/list/names = list()
|
|
||||||
for(var/datum/dna/DNA in changeling.absorbed_dna)
|
|
||||||
names += "[DNA.real_name]"
|
|
||||||
|
|
||||||
var/S = input("Select the target DNA: ", "Target DNA", null) as null|anything in names
|
|
||||||
if(!S) return
|
|
||||||
|
|
||||||
var/datum/dna/chosen_dna = changeling.GetDNA(S)
|
|
||||||
if(!chosen_dna)
|
|
||||||
return
|
|
||||||
|
|
||||||
changeling.chem_charges -= 5
|
|
||||||
src.visible_message("<span class='warning'>[src] transforms!</span>")
|
|
||||||
changeling.geneticdamage = 30
|
|
||||||
src.dna = chosen_dna.Clone()
|
|
||||||
src.real_name = chosen_dna.real_name
|
|
||||||
src.flavor_text = ""
|
|
||||||
src.UpdateAppearance()
|
|
||||||
domutcheck(src, null)
|
|
||||||
|
|
||||||
src.verbs -= /mob/proc/changeling_transform
|
|
||||||
spawn(10) src.verbs += /mob/proc/changeling_transform
|
|
||||||
|
|
||||||
feedback_add_details("changeling_powers","TR")
|
|
||||||
return 1
|
|
||||||
|
|
||||||
|
|
||||||
//Transform into a monkey.
|
|
||||||
/mob/proc/changeling_lesser_form()
|
|
||||||
set category = "Changeling"
|
|
||||||
set name = "Lesser Form (1)"
|
|
||||||
|
|
||||||
var/datum/changeling/changeling = changeling_power(1,0,0)
|
|
||||||
if(!changeling) return
|
|
||||||
|
|
||||||
if(src.has_brain_worms())
|
|
||||||
src << "<span class='warning'>We cannot perform this ability at the present time!</span>"
|
|
||||||
return
|
|
||||||
|
|
||||||
var/mob/living/carbon/human/H = src
|
|
||||||
|
|
||||||
if(!istype(H) || !H.species.primitive_form)
|
|
||||||
src << "<span class='warning'>We cannot perform this ability in this form!</span>"
|
|
||||||
return
|
|
||||||
|
|
||||||
changeling.chem_charges--
|
|
||||||
H.remove_changeling_powers()
|
|
||||||
H.visible_message("<span class='warning'>[H] transforms!</span>")
|
|
||||||
changeling.geneticdamage = 30
|
|
||||||
H << "<span class='warning'>Our genes cry out!</span>"
|
|
||||||
var/list/implants = list() //Try to preserve implants.
|
|
||||||
for(var/obj/item/weapon/implant/W in H)
|
|
||||||
implants += W
|
|
||||||
H.monkeyize()
|
|
||||||
feedback_add_details("changeling_powers","LF")
|
|
||||||
return 1
|
|
||||||
|
|
||||||
//Transform into a human
|
|
||||||
/mob/proc/changeling_lesser_transform()
|
|
||||||
set category = "Changeling"
|
|
||||||
set name = "Transform (1)"
|
|
||||||
|
|
||||||
var/datum/changeling/changeling = changeling_power(1,1,0)
|
|
||||||
if(!changeling) return
|
|
||||||
|
|
||||||
var/list/names = list()
|
|
||||||
for(var/datum/dna/DNA in changeling.absorbed_dna)
|
|
||||||
names += "[DNA.real_name]"
|
|
||||||
|
|
||||||
var/S = input("Select the target DNA: ", "Target DNA", null) as null|anything in names
|
|
||||||
if(!S) return
|
|
||||||
|
|
||||||
var/datum/dna/chosen_dna = changeling.GetDNA(S)
|
|
||||||
if(!chosen_dna)
|
|
||||||
return
|
|
||||||
|
|
||||||
var/mob/living/carbon/C = src
|
|
||||||
|
|
||||||
changeling.chem_charges--
|
|
||||||
C.remove_changeling_powers()
|
|
||||||
C.visible_message("<span class='warning'>[C] transforms!</span>")
|
|
||||||
C.dna = chosen_dna.Clone()
|
|
||||||
|
|
||||||
var/list/implants = list()
|
|
||||||
for (var/obj/item/weapon/implant/I in C) //Still preserving implants
|
|
||||||
implants += I
|
|
||||||
|
|
||||||
C.transforming = 1
|
|
||||||
C.canmove = 0
|
|
||||||
C.icon = null
|
|
||||||
C.overlays.Cut()
|
|
||||||
C.invisibility = 101
|
|
||||||
var/atom/movable/overlay/animation = new /atom/movable/overlay( C.loc )
|
|
||||||
animation.icon_state = "blank"
|
|
||||||
animation.icon = 'icons/mob/mob.dmi'
|
|
||||||
animation.master = src
|
|
||||||
flick("monkey2h", animation)
|
|
||||||
sleep(48)
|
|
||||||
qdel(animation)
|
|
||||||
|
|
||||||
for(var/obj/item/W in src)
|
|
||||||
C.drop_from_inventory(W)
|
|
||||||
|
|
||||||
var/mob/living/carbon/human/O = new /mob/living/carbon/human( src )
|
|
||||||
if (C.dna.GetUIState(DNA_UI_GENDER))
|
|
||||||
O.gender = FEMALE
|
|
||||||
else
|
|
||||||
O.gender = MALE
|
|
||||||
O.dna = C.dna.Clone()
|
|
||||||
C.dna = null
|
|
||||||
O.real_name = chosen_dna.real_name
|
|
||||||
|
|
||||||
for(var/obj/T in C)
|
|
||||||
qdel(T)
|
|
||||||
|
|
||||||
O.loc = C.loc
|
|
||||||
|
|
||||||
O.UpdateAppearance()
|
|
||||||
domutcheck(O, null)
|
|
||||||
O.setToxLoss(C.getToxLoss())
|
|
||||||
O.adjustBruteLoss(C.getBruteLoss())
|
|
||||||
O.setOxyLoss(C.getOxyLoss())
|
|
||||||
O.adjustFireLoss(C.getFireLoss())
|
|
||||||
O.stat = C.stat
|
|
||||||
for (var/obj/item/weapon/implant/I in implants)
|
|
||||||
I.loc = O
|
|
||||||
I.implanted = O
|
|
||||||
|
|
||||||
C.mind.transfer_to(O)
|
|
||||||
O.make_changeling()
|
|
||||||
O.changeling_update_languages(changeling.absorbed_languages)
|
|
||||||
|
|
||||||
feedback_add_details("changeling_powers","LFT")
|
|
||||||
qdel(C)
|
|
||||||
return 1
|
|
||||||
|
|
||||||
|
|
||||||
//Fake our own death and fully heal. You will appear to be dead but regenerate fully after a short delay.
|
|
||||||
/mob/proc/changeling_fakedeath()
|
|
||||||
set category = "Changeling"
|
|
||||||
set name = "Regenerative Stasis (20)"
|
|
||||||
|
|
||||||
var/datum/changeling/changeling = changeling_power(20,1,100,DEAD)
|
|
||||||
if(!changeling) return
|
|
||||||
|
|
||||||
var/mob/living/carbon/C = src
|
|
||||||
if(!C.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
|
|
||||||
C << "<span class='notice'>We will attempt to regenerate our form.</span>"
|
|
||||||
|
|
||||||
C.status_flags |= FAKEDEATH //play dead
|
|
||||||
C.update_canmove()
|
|
||||||
C.remove_changeling_powers()
|
|
||||||
|
|
||||||
C.emote("gasp")
|
|
||||||
C.tod = worldtime2text()
|
|
||||||
|
|
||||||
spawn(rand(800,2000))
|
|
||||||
if(changeling_power(20,1,100,DEAD))
|
|
||||||
// charge the changeling chemical cost for stasis
|
|
||||||
changeling.chem_charges -= 20
|
|
||||||
|
|
||||||
// restore us to health
|
|
||||||
C.revive()
|
|
||||||
|
|
||||||
// remove our fake death flag
|
|
||||||
C.status_flags &= ~(FAKEDEATH)
|
|
||||||
|
|
||||||
// let us move again
|
|
||||||
C.update_canmove()
|
|
||||||
|
|
||||||
// re-add out changeling powers
|
|
||||||
C.make_changeling()
|
|
||||||
|
|
||||||
// sending display messages
|
|
||||||
C << "<span class='notice'>We have regenerated.</span>"
|
|
||||||
|
|
||||||
|
|
||||||
feedback_add_details("changeling_powers","FD")
|
|
||||||
return 1
|
|
||||||
|
|
||||||
|
|
||||||
//Boosts the range of your next sting attack by 1
|
|
||||||
/mob/proc/changeling_boost_range()
|
|
||||||
set category = "Changeling"
|
|
||||||
set name = "Ranged Sting (10)"
|
|
||||||
set desc="Your next sting ability can be used against targets 2 squares away."
|
|
||||||
|
|
||||||
var/datum/changeling/changeling = changeling_power(10,0,100)
|
|
||||||
if(!changeling) return 0
|
|
||||||
changeling.chem_charges -= 10
|
|
||||||
src << "<span class='notice'>Your throat adjusts to launch the sting.</span>"
|
|
||||||
changeling.sting_range = 2
|
|
||||||
src.verbs -= /mob/proc/changeling_boost_range
|
|
||||||
spawn(5) src.verbs += /mob/proc/changeling_boost_range
|
|
||||||
feedback_add_details("changeling_powers","RS")
|
|
||||||
return 1
|
|
||||||
|
|
||||||
|
|
||||||
//Recover from stuns.
|
|
||||||
/mob/proc/changeling_unstun()
|
|
||||||
set category = "Changeling"
|
|
||||||
set name = "Epinephrine Sacs (45)"
|
|
||||||
set desc = "Removes all stuns"
|
|
||||||
|
|
||||||
var/datum/changeling/changeling = changeling_power(45,0,100,UNCONSCIOUS)
|
|
||||||
if(!changeling) return 0
|
|
||||||
changeling.chem_charges -= 45
|
|
||||||
|
|
||||||
var/mob/living/carbon/human/C = src
|
|
||||||
C.stat = 0
|
|
||||||
C.SetParalysis(0)
|
|
||||||
C.SetStunned(0)
|
|
||||||
C.SetWeakened(0)
|
|
||||||
C.lying = 0
|
|
||||||
C.update_canmove()
|
|
||||||
|
|
||||||
src.verbs -= /mob/proc/changeling_unstun
|
|
||||||
spawn(5) src.verbs += /mob/proc/changeling_unstun
|
|
||||||
feedback_add_details("changeling_powers","UNS")
|
|
||||||
return 1
|
|
||||||
|
|
||||||
|
|
||||||
//Speeds up chemical regeneration
|
|
||||||
/mob/proc/changeling_fastchemical()
|
|
||||||
src.mind.changeling.chem_recharge_rate *= 2
|
|
||||||
return 1
|
|
||||||
|
|
||||||
//Increases macimum chemical storage
|
|
||||||
/mob/proc/changeling_engorgedglands()
|
|
||||||
src.mind.changeling.chem_storage += 25
|
|
||||||
return 1
|
|
||||||
|
|
||||||
|
|
||||||
//Prevents AIs tracking you but makes you easily detectable to the human-eye.
|
|
||||||
/mob/proc/changeling_digitalcamo()
|
|
||||||
set category = "Changeling"
|
|
||||||
set name = "Toggle Digital Camoflague"
|
|
||||||
set desc = "The AI can no longer track us, but we will look different if examined. Has a constant cost while active."
|
|
||||||
|
|
||||||
var/datum/changeling/changeling = changeling_power()
|
|
||||||
if(!changeling) return 0
|
|
||||||
|
|
||||||
var/mob/living/carbon/human/C = src
|
|
||||||
if(C.digitalcamo) C << "<span class='notice'>We return to normal.</span>"
|
|
||||||
else C << "<span class='notice'>We distort our form to prevent AI-tracking.</span>"
|
|
||||||
C.digitalcamo = !C.digitalcamo
|
|
||||||
|
|
||||||
spawn(0)
|
|
||||||
while(C && C.digitalcamo && C.mind && C.mind.changeling)
|
|
||||||
C.mind.changeling.chem_charges = max(C.mind.changeling.chem_charges - 1, 0)
|
|
||||||
sleep(40)
|
|
||||||
|
|
||||||
src.verbs -= /mob/proc/changeling_digitalcamo
|
|
||||||
spawn(5) src.verbs += /mob/proc/changeling_digitalcamo
|
|
||||||
feedback_add_details("changeling_powers","CAM")
|
|
||||||
return 1
|
|
||||||
|
|
||||||
|
|
||||||
//Starts healing you every second for 10 seconds. Can be used whilst unconscious.
|
|
||||||
/mob/proc/changeling_rapidregen()
|
|
||||||
set category = "Changeling"
|
|
||||||
set name = "Rapid Regeneration (30)"
|
|
||||||
set desc = "Begins rapidly regenerating. Does not effect stuns or chemicals."
|
|
||||||
|
|
||||||
var/datum/changeling/changeling = changeling_power(30,0,100,UNCONSCIOUS)
|
|
||||||
if(!changeling) return 0
|
|
||||||
src.mind.changeling.chem_charges -= 30
|
|
||||||
|
|
||||||
var/mob/living/carbon/human/C = src
|
|
||||||
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)
|
|
||||||
|
|
||||||
src.verbs -= /mob/proc/changeling_rapidregen
|
|
||||||
spawn(5) src.verbs += /mob/proc/changeling_rapidregen
|
|
||||||
feedback_add_details("changeling_powers","RR")
|
|
||||||
return 1
|
|
||||||
|
|
||||||
// HIVE MIND UPLOAD/DOWNLOAD DNA
|
|
||||||
|
|
||||||
var/list/datum/dna/hivemind_bank = list()
|
|
||||||
|
|
||||||
/mob/proc/changeling_hiveupload()
|
|
||||||
set category = "Changeling"
|
|
||||||
set name = "Hive Channel (10)"
|
|
||||||
set desc = "Allows you to channel DNA in the airwaves to allow other changelings to absorb it."
|
|
||||||
|
|
||||||
var/datum/changeling/changeling = changeling_power(10,1)
|
|
||||||
if(!changeling) return
|
|
||||||
|
|
||||||
var/list/names = list()
|
|
||||||
for(var/datum/dna/DNA in changeling.absorbed_dna)
|
|
||||||
if(!(DNA in hivemind_bank))
|
|
||||||
names += DNA.real_name
|
|
||||||
|
|
||||||
if(names.len <= 0)
|
|
||||||
src << "<span class='notice'>The airwaves already have all of our DNA.</span>"
|
|
||||||
return
|
|
||||||
|
|
||||||
var/S = input("Select a DNA to channel: ", "Channel DNA", null) as null|anything in names
|
|
||||||
if(!S) return
|
|
||||||
|
|
||||||
var/datum/dna/chosen_dna = changeling.GetDNA(S)
|
|
||||||
if(!chosen_dna)
|
|
||||||
return
|
|
||||||
|
|
||||||
changeling.chem_charges -= 10
|
|
||||||
hivemind_bank += chosen_dna
|
|
||||||
src << "<span class='notice'>We channel the DNA of [S] to the air.</span>"
|
|
||||||
feedback_add_details("changeling_powers","HU")
|
|
||||||
return 1
|
|
||||||
|
|
||||||
/mob/proc/changeling_hivedownload()
|
|
||||||
set category = "Changeling"
|
|
||||||
set name = "Hive Absorb (20)"
|
|
||||||
set desc = "Allows you to absorb DNA that is being channeled in the airwaves."
|
|
||||||
|
|
||||||
var/datum/changeling/changeling = changeling_power(20,1)
|
|
||||||
if(!changeling) return
|
|
||||||
|
|
||||||
var/list/names = list()
|
|
||||||
for(var/datum/dna/DNA in hivemind_bank)
|
|
||||||
if(!(DNA in changeling.absorbed_dna))
|
|
||||||
names[DNA.real_name] = DNA
|
|
||||||
|
|
||||||
if(names.len <= 0)
|
|
||||||
src << "<span class='notice'>There's no new DNA to absorb from the air.</span>"
|
|
||||||
return
|
|
||||||
|
|
||||||
var/S = input("Select a DNA absorb from the air: ", "Absorb DNA", null) as null|anything in names
|
|
||||||
if(!S) return
|
|
||||||
var/datum/dna/chosen_dna = names[S]
|
|
||||||
if(!chosen_dna)
|
|
||||||
return
|
|
||||||
|
|
||||||
changeling.chem_charges -= 20
|
|
||||||
changeling.absorbed_dna += chosen_dna
|
|
||||||
src << "<span class='notice'>We absorb the DNA of [S] from the air.</span>"
|
|
||||||
feedback_add_details("changeling_powers","HD")
|
|
||||||
return 1
|
|
||||||
|
|
||||||
// Fake Voice
|
|
||||||
|
|
||||||
/mob/proc/changeling_mimicvoice()
|
|
||||||
set category = "Changeling"
|
|
||||||
set name = "Mimic Voice"
|
|
||||||
set desc = "Shape our vocal glands to form a voice of someone we choose. We cannot regenerate chemicals when mimicing."
|
|
||||||
|
|
||||||
|
|
||||||
var/datum/changeling/changeling = changeling_power()
|
|
||||||
if(!changeling) return
|
|
||||||
|
|
||||||
if(changeling.mimicing)
|
|
||||||
changeling.mimicing = ""
|
|
||||||
src << "<span class='notice'>We return our vocal glands to their original location.</span>"
|
|
||||||
return
|
|
||||||
|
|
||||||
var/mimic_voice = sanitize(input(usr, "Enter a name to mimic.", "Mimic Voice", null), MAX_NAME_LEN)
|
|
||||||
if(!mimic_voice)
|
|
||||||
return
|
|
||||||
|
|
||||||
changeling.mimicing = mimic_voice
|
|
||||||
|
|
||||||
src << "<span class='notice'>We shape our glands to take the voice of <b>[mimic_voice]</b>, this will stop us from regenerating chemicals while active.</span>"
|
|
||||||
src << "<span class='notice'>Use this power again to return to our original voice and reproduce chemicals again.</span>"
|
|
||||||
|
|
||||||
feedback_add_details("changeling_powers","MV")
|
|
||||||
|
|
||||||
spawn(0)
|
|
||||||
while(src && src.mind && src.mind.changeling && src.mind.changeling.mimicing)
|
|
||||||
src.mind.changeling.chem_charges = max(src.mind.changeling.chem_charges - 1, 0)
|
|
||||||
sleep(40)
|
|
||||||
if(src && src.mind && src.mind.changeling)
|
|
||||||
src.mind.changeling.mimicing = ""
|
|
||||||
//////////
|
//////////
|
||||||
//STINGS// //They get a pretty header because there's just so fucking many of them ;_;
|
//STINGS// //They get a pretty header because there's just so fucking many of them ;_;
|
||||||
//////////
|
//////////
|
||||||
@@ -709,149 +169,7 @@ var/list/datum/dna/hivemind_bank = list()
|
|||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
/mob/proc/changeling_lsdsting()
|
|
||||||
set category = "Changeling"
|
|
||||||
set name = "Hallucination Sting (15)"
|
|
||||||
set desc = "Causes terror in the target."
|
|
||||||
|
|
||||||
var/mob/living/carbon/T = changeling_sting(15,/mob/proc/changeling_lsdsting)
|
|
||||||
if(!T) return 0
|
|
||||||
spawn(rand(300,600))
|
|
||||||
if(T) T.hallucination += 400
|
|
||||||
feedback_add_details("changeling_powers","HS")
|
|
||||||
return 1
|
|
||||||
|
|
||||||
/mob/proc/changeling_silence_sting()
|
|
||||||
set category = "Changeling"
|
|
||||||
set name = "Silence sting (10)"
|
|
||||||
set desc="Sting target"
|
|
||||||
|
|
||||||
var/mob/living/carbon/T = changeling_sting(10,/mob/proc/changeling_silence_sting)
|
|
||||||
if(!T) return 0
|
|
||||||
T.silent += 30
|
|
||||||
feedback_add_details("changeling_powers","SS")
|
|
||||||
return 1
|
|
||||||
|
|
||||||
/mob/proc/changeling_blind_sting()
|
|
||||||
set category = "Changeling"
|
|
||||||
set name = "Blind sting (20)"
|
|
||||||
set desc="Sting target"
|
|
||||||
|
|
||||||
var/mob/living/carbon/T = changeling_sting(20,/mob/proc/changeling_blind_sting)
|
|
||||||
if(!T) return 0
|
|
||||||
T << "<span class='danger'>Your eyes burn horrificly!</span>"
|
|
||||||
T.disabilities |= NEARSIGHTED
|
|
||||||
spawn(300) T.disabilities &= ~NEARSIGHTED
|
|
||||||
T.eye_blind = 10
|
|
||||||
T.eye_blurry = 20
|
|
||||||
feedback_add_details("changeling_powers","BS")
|
|
||||||
return 1
|
|
||||||
|
|
||||||
/mob/proc/changeling_deaf_sting()
|
|
||||||
set category = "Changeling"
|
|
||||||
set name = "Deaf sting (5)"
|
|
||||||
set desc="Sting target:"
|
|
||||||
|
|
||||||
var/mob/living/carbon/T = changeling_sting(5,/mob/proc/changeling_deaf_sting)
|
|
||||||
if(!T) return 0
|
|
||||||
T << "<span class='danger'>Your ears pop and begin ringing loudly!</span>"
|
|
||||||
T.sdisabilities |= DEAF
|
|
||||||
spawn(300) T.sdisabilities &= ~DEAF
|
|
||||||
feedback_add_details("changeling_powers","DS")
|
|
||||||
return 1
|
|
||||||
|
|
||||||
/mob/proc/changeling_paralysis_sting()
|
|
||||||
set category = "Changeling"
|
|
||||||
set name = "Paralysis sting (30)"
|
|
||||||
set desc="Sting target"
|
|
||||||
|
|
||||||
var/mob/living/carbon/T = changeling_sting(30,/mob/proc/changeling_paralysis_sting)
|
|
||||||
if(!T) return 0
|
|
||||||
T << "<span class='danger'>Your muscles begin to painfully tighten.</span>"
|
|
||||||
T.Weaken(20)
|
|
||||||
feedback_add_details("changeling_powers","PS")
|
|
||||||
return 1
|
|
||||||
|
|
||||||
/mob/proc/changeling_transformation_sting()
|
|
||||||
set category = "Changeling"
|
|
||||||
set name = "Transformation sting (40)"
|
|
||||||
set desc="Sting target"
|
|
||||||
|
|
||||||
var/datum/changeling/changeling = changeling_power(40)
|
|
||||||
if(!changeling) return 0
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
var/list/names = list()
|
|
||||||
for(var/datum/dna/DNA in changeling.absorbed_dna)
|
|
||||||
names += "[DNA.real_name]"
|
|
||||||
|
|
||||||
var/S = input("Select the target DNA: ", "Target DNA", null) as null|anything in names
|
|
||||||
if(!S) return
|
|
||||||
|
|
||||||
var/datum/dna/chosen_dna = changeling.GetDNA(S)
|
|
||||||
if(!chosen_dna)
|
|
||||||
return
|
|
||||||
|
|
||||||
var/mob/living/carbon/T = changeling_sting(40,/mob/proc/changeling_transformation_sting)
|
|
||||||
if(!T) return 0
|
|
||||||
if((HUSK in T.mutations) || (!ishuman(T) && !issmall(T)))
|
|
||||||
src << "<span class='warning'>Our sting appears ineffective against its DNA.</span>"
|
|
||||||
return 0
|
|
||||||
T.visible_message("<span class='warning'>[T] transforms!</span>")
|
|
||||||
T.dna = chosen_dna.Clone()
|
|
||||||
T.real_name = chosen_dna.real_name
|
|
||||||
T.UpdateAppearance()
|
|
||||||
domutcheck(T, null)
|
|
||||||
feedback_add_details("changeling_powers","TS")
|
|
||||||
return 1
|
|
||||||
|
|
||||||
/mob/proc/changeling_unfat_sting()
|
|
||||||
set category = "Changeling"
|
|
||||||
set name = "Unfat sting (5)"
|
|
||||||
set desc = "Sting target"
|
|
||||||
|
|
||||||
var/mob/living/carbon/T = changeling_sting(5,/mob/proc/changeling_unfat_sting)
|
|
||||||
if(!T) return 0
|
|
||||||
T << "<span class='danger'>you feel a small prick as stomach churns violently and you become to feel skinnier.</span>"
|
|
||||||
T.overeatduration = 0
|
|
||||||
T.nutrition -= 100
|
|
||||||
feedback_add_details("changeling_powers","US")
|
|
||||||
return 1
|
|
||||||
|
|
||||||
/mob/proc/changeling_DEATHsting()
|
|
||||||
set category = "Changeling"
|
|
||||||
set name = "Death Sting (40)"
|
|
||||||
set desc = "Causes spasms onto death."
|
|
||||||
|
|
||||||
var/mob/living/carbon/T = changeling_sting(40,/mob/proc/changeling_DEATHsting)
|
|
||||||
if(!T) return 0
|
|
||||||
T << "<span class='danger'>You feel a small prick and your chest becomes tight.</span>"
|
|
||||||
T.silent = 10
|
|
||||||
T.Paralyse(10)
|
|
||||||
T.make_jittery(1000)
|
|
||||||
if(T.reagents) T.reagents.add_reagent("lexorin", 40)
|
|
||||||
feedback_add_details("changeling_powers","DTHS")
|
|
||||||
return 1
|
|
||||||
|
|
||||||
/mob/proc/changeling_extract_dna_sting()
|
|
||||||
set category = "Changeling"
|
|
||||||
set name = "Extract DNA Sting (40)"
|
|
||||||
set desc="Stealthily sting a target to extract their DNA."
|
|
||||||
|
|
||||||
var/datum/changeling/changeling = null
|
|
||||||
if(src.mind && src.mind.changeling)
|
|
||||||
changeling = src.mind.changeling
|
|
||||||
if(!changeling)
|
|
||||||
return 0
|
|
||||||
|
|
||||||
var/mob/living/carbon/human/T = changeling_sting(40, /mob/proc/changeling_extract_dna_sting)
|
|
||||||
if(!T) return 0
|
|
||||||
|
|
||||||
T.dna.real_name = T.real_name
|
|
||||||
changeling.absorbed_dna |= T.dna
|
|
||||||
if(T.species && !(T.species.name in changeling.absorbed_species))
|
|
||||||
changeling.absorbed_species += T.species.name
|
|
||||||
|
|
||||||
feedback_add_details("changeling_powers","ED")
|
|
||||||
return 1
|
|
||||||
|
|||||||
62
code/game/gamemodes/changeling/generic_equip_procs.dm
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
//This is a generic proc that should be called by other ling armor procs to equip them.
|
||||||
|
/mob/proc/changeling_generic_armor(var/armor_type, var/helmet_type)
|
||||||
|
var/datum/changeling/changeling = changeling_power(20,1,100,CONSCIOUS)
|
||||||
|
if(!changeling)
|
||||||
|
return
|
||||||
|
|
||||||
|
if(!ishuman(src))
|
||||||
|
return 0
|
||||||
|
|
||||||
|
var/mob/living/carbon/human/M = src
|
||||||
|
|
||||||
|
//First, check if we're already wearing the armor, and if so, take it off.
|
||||||
|
if(istype(M.wear_suit, armor_type) || istype(M.head, helmet_type))
|
||||||
|
M.visible_message("<span class='warning'>[M] casts off their [M.wear_suit.name]!</span>",
|
||||||
|
"<span class='warning'>We cast off our [M.wear_suit.name]</span>",
|
||||||
|
"<span class='italics'>You hear the organic matter ripping and tearing!</span>")
|
||||||
|
qdel(M.wear_suit)
|
||||||
|
qdel(M.head)
|
||||||
|
M.update_inv_wear_suit()
|
||||||
|
M.update_inv_head()
|
||||||
|
M.update_hair()
|
||||||
|
return 1
|
||||||
|
|
||||||
|
if(M.head || M.wear_suit) //Make sure our slots aren't full
|
||||||
|
src << "<span class='warning'>We require nothing to be on our head, and we cannot wear any external suits.</span>"
|
||||||
|
return 0
|
||||||
|
|
||||||
|
var/obj/item/clothing/suit/A = new armor_type(src)
|
||||||
|
src.equip_to_slot_or_del(A, slot_wear_suit)
|
||||||
|
|
||||||
|
var/obj/item/clothing/suit/H = new helmet_type(src)
|
||||||
|
src.equip_to_slot_or_del(H, slot_head)
|
||||||
|
|
||||||
|
src.mind.changeling.chem_charges -= 20
|
||||||
|
playsound(src, 'sound/effects/blobattack.ogg', 30, 1)
|
||||||
|
M.update_inv_wear_suit()
|
||||||
|
M.update_inv_head()
|
||||||
|
M.update_hair()
|
||||||
|
return 1
|
||||||
|
|
||||||
|
//This is a generic proc that should be called by other ling weapon procs to equip them.
|
||||||
|
/mob/proc/changeling_generic_weapon(var/weapon_type, var/make_sound = 1)
|
||||||
|
var/datum/changeling/changeling = changeling_power(20,1,100,CONSCIOUS)
|
||||||
|
if(!changeling)
|
||||||
|
return
|
||||||
|
|
||||||
|
if(!ishuman(src))
|
||||||
|
return 0
|
||||||
|
|
||||||
|
var/mob/living/carbon/human/M = src
|
||||||
|
|
||||||
|
if(M.l_hand && M.r_hand) //Make sure our hands aren't full.
|
||||||
|
src << "<span class='warning'>Our hands are full. Drop something first.</span>"
|
||||||
|
return 0
|
||||||
|
|
||||||
|
var/obj/item/weapon/W = new weapon_type(src)
|
||||||
|
src.put_in_hands(W)
|
||||||
|
|
||||||
|
src.mind.changeling.chem_charges -= 20
|
||||||
|
if(make_sound)
|
||||||
|
playsound(src, 'sound/effects/blobattack.ogg', 30, 1)
|
||||||
|
return 1
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
// READ: Don't use the apostrophe in name or desc. Causes script errors.
|
// READ: Don't use the apostrophe in name or desc. Causes script errors.
|
||||||
|
|
||||||
|
//Ling power's evolution menu entry datum should be contained alongside the mob proc for the actual power, in their own file.
|
||||||
|
|
||||||
var/list/powers = typesof(/datum/power/changeling) - /datum/power/changeling //needed for the badmin verb for now
|
var/list/powers = typesof(/datum/power/changeling) - /datum/power/changeling //needed for the badmin verb for now
|
||||||
var/list/datum/power/changeling/powerinstances = list()
|
var/list/datum/power/changeling/powerinstances = list()
|
||||||
|
|
||||||
@@ -14,177 +16,6 @@ var/list/datum/power/changeling/powerinstances = list()
|
|||||||
var/allowduringlesserform = 0
|
var/allowduringlesserform = 0
|
||||||
var/genomecost = 500000 // Cost for the changling to evolve this power.
|
var/genomecost = 500000 // Cost for the changling to evolve this power.
|
||||||
|
|
||||||
/datum/power/changeling/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 = /mob/proc/changeling_absorb_dna
|
|
||||||
|
|
||||||
/datum/power/changeling/transform
|
|
||||||
name = "Transform"
|
|
||||||
desc = "We take on the apperance and voice of one we have absorbed."
|
|
||||||
genomecost = 0
|
|
||||||
verbpath = /mob/proc/changeling_transform
|
|
||||||
|
|
||||||
/datum/power/changeling/change_species
|
|
||||||
name = "Change Species"
|
|
||||||
desc = "We take on the apperance of a species that we have absorbed."
|
|
||||||
genomecost = 0
|
|
||||||
verbpath = /mob/proc/changeling_change_species
|
|
||||||
|
|
||||||
/datum/power/changeling/fakedeath
|
|
||||||
name = "Regenerative Stasis"
|
|
||||||
desc = "We become weakened to a death-like state, where we will rise again from death."
|
|
||||||
helptext = "Can be used before or after death. Duration varies greatly."
|
|
||||||
genomecost = 0
|
|
||||||
allowduringlesserform = 1
|
|
||||||
verbpath = /mob/proc/changeling_fakedeath
|
|
||||||
|
|
||||||
// Hivemind
|
|
||||||
|
|
||||||
/datum/power/changeling/hive_upload
|
|
||||||
name = "Hive Channel"
|
|
||||||
desc = "We can channel a DNA into the airwaves, allowing our fellow changelings to absorb it and transform into it as if they acquired the DNA themselves."
|
|
||||||
helptext = "Allows other changelings to absorb the DNA you channel from the airwaves. Will not help them towards their absorb objectives."
|
|
||||||
genomecost = 0
|
|
||||||
verbpath = /mob/proc/changeling_hiveupload
|
|
||||||
|
|
||||||
/datum/power/changeling/hive_download
|
|
||||||
name = "Hive Absorb"
|
|
||||||
desc = "We can absorb a single DNA from the airwaves, allowing us to use more disguises with help from our fellow changelings."
|
|
||||||
helptext = "Allows you to absorb a single DNA and use it. Does not count towards your absorb objective."
|
|
||||||
genomecost = 0
|
|
||||||
verbpath = /mob/proc/changeling_hivedownload
|
|
||||||
|
|
||||||
/datum/power/changeling/lesser_form
|
|
||||||
name = "Lesser Form"
|
|
||||||
desc = "We debase ourselves and become lesser. We become a monkey."
|
|
||||||
genomecost = 4
|
|
||||||
verbpath = /mob/proc/changeling_lesser_form
|
|
||||||
|
|
||||||
/datum/power/changeling/deaf_sting
|
|
||||||
name = "Deaf Sting"
|
|
||||||
desc = "We silently sting a human, completely deafening them for a short time."
|
|
||||||
genomecost = 1
|
|
||||||
allowduringlesserform = 1
|
|
||||||
verbpath = /mob/proc/changeling_deaf_sting
|
|
||||||
|
|
||||||
/datum/power/changeling/blind_sting
|
|
||||||
name = "Blind Sting"
|
|
||||||
desc = "We silently sting a human, completely blinding them for a short time."
|
|
||||||
genomecost = 2
|
|
||||||
allowduringlesserform = 1
|
|
||||||
verbpath = /mob/proc/changeling_blind_sting
|
|
||||||
|
|
||||||
/datum/power/changeling/silence_sting
|
|
||||||
name = "Silence Sting"
|
|
||||||
desc = "We silently sting a human, completely silencing them for a short time."
|
|
||||||
helptext = "Does not provide a warning to a victim that they have been stung, until they try to speak and cannot."
|
|
||||||
genomecost = 3
|
|
||||||
allowduringlesserform = 1
|
|
||||||
verbpath = /mob/proc/changeling_silence_sting
|
|
||||||
|
|
||||||
/datum/power/changeling/mimicvoice
|
|
||||||
name = "Mimic Voice"
|
|
||||||
desc = "We shape our vocal glands to sound like a desired voice."
|
|
||||||
helptext = "Will turn your voice into the name that you enter. We must constantly expend chemicals to maintain our form like this"
|
|
||||||
genomecost = 1
|
|
||||||
verbpath = /mob/proc/changeling_mimicvoice
|
|
||||||
|
|
||||||
/datum/power/changeling/extractdna
|
|
||||||
name = "Extract DNA"
|
|
||||||
desc = "We stealthily sting a target and extract the DNA from them."
|
|
||||||
helptext = "Will give you the DNA of your target, allowing you to transform into them. Does not count towards absorb objectives."
|
|
||||||
genomecost = 2
|
|
||||||
allowduringlesserform = 1
|
|
||||||
verbpath = /mob/proc/changeling_extract_dna_sting
|
|
||||||
|
|
||||||
/datum/power/changeling/transformation_sting
|
|
||||||
name = "Transformation Sting"
|
|
||||||
desc = "We silently sting a human, injecting a retrovirus that forces them to transform into another."
|
|
||||||
helptext = "Does not provide a warning to others. The victim will transform much like a changeling would."
|
|
||||||
genomecost = 3
|
|
||||||
verbpath = /mob/proc/changeling_transformation_sting
|
|
||||||
|
|
||||||
/datum/power/changeling/paralysis_sting
|
|
||||||
name = "Paralysis Sting"
|
|
||||||
desc = "We silently sting a human, paralyzing them for a short time."
|
|
||||||
genomecost = 8
|
|
||||||
verbpath = /mob/proc/changeling_paralysis_sting
|
|
||||||
|
|
||||||
/datum/power/changeling/LSDSting
|
|
||||||
name = "Hallucination Sting"
|
|
||||||
desc = "We evolve the ability to sting a target with a powerful hallunicationary chemical."
|
|
||||||
helptext = "The target does not notice they have been stung. The effect occurs after 30 to 60 seconds."
|
|
||||||
genomecost = 3
|
|
||||||
verbpath = /mob/proc/changeling_lsdsting
|
|
||||||
|
|
||||||
/datum/power/changeling/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 = /mob/proc/changeling_DEATHsting
|
|
||||||
|
|
||||||
///datum/power/changeling/unfat_sting
|
|
||||||
// name = "Unfat Sting"
|
|
||||||
// desc = "We silently sting a human, forcing them to rapidly metabolize their fat."
|
|
||||||
// genomecost = 1
|
|
||||||
// verbpath = /mob/proc/changeling_unfat_sting
|
|
||||||
|
|
||||||
/datum/power/changeling/boost_range
|
|
||||||
name = "Boost Range"
|
|
||||||
desc = "We evolve the ability to shoot our stingers at humans, with some preperation."
|
|
||||||
genomecost = 2
|
|
||||||
allowduringlesserform = 1
|
|
||||||
verbpath = /mob/proc/changeling_boost_range
|
|
||||||
|
|
||||||
/datum/power/changeling/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 = 3
|
|
||||||
verbpath = /mob/proc/changeling_unstun
|
|
||||||
|
|
||||||
/datum/power/changeling/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 = /mob/proc/changeling_fastchemical
|
|
||||||
/*
|
|
||||||
/datum/power/changeling/AdvChemicalSynth
|
|
||||||
name = "Advanced 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 = 8
|
|
||||||
isVerb = 0
|
|
||||||
verbpath = /mob/proc/changeling_fastchemical
|
|
||||||
*/
|
|
||||||
/datum/power/changeling/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 = /mob/proc/changeling_engorgedglands
|
|
||||||
|
|
||||||
/datum/power/changeling/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 = 1
|
|
||||||
allowduringlesserform = 1
|
|
||||||
verbpath = /mob/proc/changeling_digitalcamo
|
|
||||||
|
|
||||||
/datum/power/changeling/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 = 7
|
|
||||||
verbpath = /mob/proc/changeling_rapidregen
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Modularchangling, totally stolen from the new player panel. YAYY
|
// Modularchangling, totally stolen from the new player panel. YAYY
|
||||||
/datum/changeling/proc/EvolutionMenu()//The new one
|
/datum/changeling/proc/EvolutionMenu()//The new one
|
||||||
@@ -389,7 +220,7 @@ var/list/datum/power/changeling/powerinstances = list()
|
|||||||
<font size='5'><b>Changling Evolution Menu</b></font><br>
|
<font size='5'><b>Changling Evolution Menu</b></font><br>
|
||||||
Hover over a power to see more information<br>
|
Hover over a power to see more information<br>
|
||||||
Current evolution points left to evolve with: [geneticpoints]<br>
|
Current evolution points left to evolve with: [geneticpoints]<br>
|
||||||
Absorb genomes to acquire more evolution points
|
Absorb other changelings to acquire more evolution points
|
||||||
<p>
|
<p>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|||||||
126
code/game/gamemodes/changeling/powers/absorb.dm
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
/datum/power/changeling/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 = /mob/proc/changeling_absorb_dna
|
||||||
|
|
||||||
|
//Absorbs the victim's DNA making them uncloneable. Requires a strong grip on the victim.
|
||||||
|
//Doesn't cost anything as it's the most basic ability.
|
||||||
|
/mob/proc/changeling_absorb_dna()
|
||||||
|
set category = "Changeling"
|
||||||
|
set name = "Absorb DNA"
|
||||||
|
|
||||||
|
var/datum/changeling/changeling = changeling_power(0,0,100)
|
||||||
|
if(!changeling) return
|
||||||
|
|
||||||
|
var/obj/item/weapon/grab/G = src.get_active_hand()
|
||||||
|
if(!istype(G))
|
||||||
|
src << "<span class='warning'>We must be grabbing a creature in our active hand to absorb them.</span>"
|
||||||
|
return
|
||||||
|
|
||||||
|
var/mob/living/carbon/human/T = G.affecting
|
||||||
|
if(!istype(T))
|
||||||
|
src << "<span class='warning'>[T] is not compatible with our biology.</span>"
|
||||||
|
return
|
||||||
|
|
||||||
|
if(T.species.flags & NO_SCAN)
|
||||||
|
src << "<span class='warning'>We do not know how to parse this creature's DNA!</span>"
|
||||||
|
return
|
||||||
|
|
||||||
|
if(HUSK in T.mutations)
|
||||||
|
src << "<span class='warning'>This creature's DNA is ruined beyond useability!</span>"
|
||||||
|
return
|
||||||
|
|
||||||
|
if(G.state != GRAB_KILL)
|
||||||
|
src << "<span class='warning'>We must have a tighter grip to absorb this creature.</span>"
|
||||||
|
return
|
||||||
|
|
||||||
|
if(changeling.isabsorbing)
|
||||||
|
src << "<span class='warning'>We are already absorbing!</span>"
|
||||||
|
return
|
||||||
|
|
||||||
|
changeling.isabsorbing = 1
|
||||||
|
for(var/stage = 1, stage<=3, stage++)
|
||||||
|
switch(stage)
|
||||||
|
if(1)
|
||||||
|
src << "<span class='notice'>This creature is compatible. We must hold still...</span>"
|
||||||
|
if(2)
|
||||||
|
src << "<span class='notice'>We extend a proboscis.</span>"
|
||||||
|
src.visible_message("<span class='warning'>[src] extends a proboscis!</span>")
|
||||||
|
if(3)
|
||||||
|
src << "<span class='notice'>We stab [T] with the proboscis.</span>"
|
||||||
|
src.visible_message("<span class='danger'>[src] stabs [T] with the proboscis!</span>")
|
||||||
|
T << "<span class='danger'>You feel a sharp stabbing pain!</span>"
|
||||||
|
var/obj/item/organ/external/affecting = T.get_organ(src.zone_sel.selecting)
|
||||||
|
if(affecting.take_damage(39,0,1,0,"large organic needle"))
|
||||||
|
T:UpdateDamageIcon()
|
||||||
|
|
||||||
|
feedback_add_details("changeling_powers","A[stage]")
|
||||||
|
if(!do_mob(src, T, 150))
|
||||||
|
src << "<span class='warning'>Our absorption of [T] has been interrupted!</span>"
|
||||||
|
changeling.isabsorbing = 0
|
||||||
|
return
|
||||||
|
|
||||||
|
src << "<span class='notice'>We have absorbed [T]!</span>"
|
||||||
|
src.visible_message("<span class='danger'>[src] sucks the fluids from [T]!</span>")
|
||||||
|
T << "<span class='danger'>You have been absorbed by the changeling!</span>"
|
||||||
|
|
||||||
|
T.dna.real_name = T.real_name //Set this again, just to be sure that it's properly set.
|
||||||
|
changeling.absorbed_dna |= T.dna
|
||||||
|
if(src.nutrition < 400)
|
||||||
|
src.nutrition = min((src.nutrition + T.nutrition), 400)
|
||||||
|
changeling.chem_charges += 10
|
||||||
|
// changeling.geneticpoints += 2
|
||||||
|
src.verbs += /mob/proc/changeling_respec
|
||||||
|
src << "<span class='notice'>We can now re-adapt, reverting our evolution so that we may start anew, if needed.</span>"
|
||||||
|
|
||||||
|
//Steal all of their languages!
|
||||||
|
for(var/language in T.languages)
|
||||||
|
if(!(language in changeling.absorbed_languages))
|
||||||
|
changeling.absorbed_languages += language
|
||||||
|
|
||||||
|
changeling_update_languages(changeling.absorbed_languages)
|
||||||
|
|
||||||
|
//Steal their species!
|
||||||
|
if(T.species && !(T.species.name in changeling.absorbed_species))
|
||||||
|
changeling.absorbed_species += T.species.name
|
||||||
|
|
||||||
|
if(T.mind && T.mind.changeling)
|
||||||
|
if(T.mind.changeling.absorbed_dna)
|
||||||
|
for(var/dna_data in T.mind.changeling.absorbed_dna) //steal all their loot
|
||||||
|
if(dna_data in changeling.absorbed_dna)
|
||||||
|
continue
|
||||||
|
changeling.absorbed_dna += dna_data
|
||||||
|
changeling.absorbedcount++
|
||||||
|
T.mind.changeling.absorbed_dna.len = 1
|
||||||
|
|
||||||
|
changeling.geneticpoints += 5
|
||||||
|
changeling.max_geneticpoints += 5
|
||||||
|
src << "<span class='notice'>We absorbed another changeling, and we grow stronger. Our genomes increase.</span>"
|
||||||
|
|
||||||
|
/*
|
||||||
|
if(T.mind.changeling.purchasedpowers)
|
||||||
|
for(var/datum/power/changeling/Tp in T.mind.changeling.purchasedpowers)
|
||||||
|
if(Tp in changeling.purchasedpowers)
|
||||||
|
continue
|
||||||
|
else
|
||||||
|
changeling.purchasedpowers += Tp
|
||||||
|
|
||||||
|
if(!Tp.isVerb)
|
||||||
|
call(Tp.verbpath)()
|
||||||
|
else
|
||||||
|
src.make_changeling()
|
||||||
|
|
||||||
|
changeling.chem_charges += T.mind.changeling.chem_charges
|
||||||
|
changeling.geneticpoints += T.mind.changeling.geneticpoints
|
||||||
|
*/
|
||||||
|
T.mind.changeling.chem_charges = 0
|
||||||
|
T.mind.changeling.geneticpoints = 0
|
||||||
|
T.mind.changeling.absorbedcount = 0
|
||||||
|
|
||||||
|
changeling.absorbedcount++
|
||||||
|
changeling.isabsorbing = 0
|
||||||
|
|
||||||
|
T.death(0)
|
||||||
|
T.Drain()
|
||||||
|
return 1
|
||||||
75
code/game/gamemodes/changeling/powers/armblade.dm
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
/datum/power/changeling/arm_blade
|
||||||
|
name = "Arm Blade"
|
||||||
|
desc = "We reform one of our arms into a deadly blade."
|
||||||
|
helptext = "We may retract our armblade by dropping it. It can deflect projectiles. Cannot be used while in lesser form."
|
||||||
|
genomecost = 2
|
||||||
|
verbpath = /mob/proc/changeling_arm_blade
|
||||||
|
|
||||||
|
//Grows a scary, and powerful arm blade.
|
||||||
|
/mob/proc/changeling_arm_blade()
|
||||||
|
set category = "Changeling"
|
||||||
|
set name = "Arm Blade (20)"
|
||||||
|
|
||||||
|
if(changeling_generic_weapon(/obj/item/weapon/melee/arm_blade))
|
||||||
|
return 1
|
||||||
|
return 0
|
||||||
|
|
||||||
|
/obj/item/weapon/melee/arm_blade
|
||||||
|
name = "arm blade"
|
||||||
|
desc = "A grotesque blade made out of bone and flesh that cleaves through people as a hot knife through butter."
|
||||||
|
icon = 'icons/obj/weapons.dmi'
|
||||||
|
icon_state = "arm_blade"
|
||||||
|
item_state = "arm_blade"
|
||||||
|
w_class = 5.0
|
||||||
|
force = 40
|
||||||
|
sharp = 1
|
||||||
|
edge = 1
|
||||||
|
anchored = 1
|
||||||
|
throwforce = 0 //Just to be on the safe side
|
||||||
|
throw_range = 0
|
||||||
|
throw_speed = 0
|
||||||
|
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
||||||
|
var/mob/living/creator //This is just like ninja swords, needed to make sure dumb shit that removes the sword doesn't make it stay around.
|
||||||
|
|
||||||
|
/obj/item/weapon/melee/arm_blade/IsShield()
|
||||||
|
return 1
|
||||||
|
|
||||||
|
/obj/item/weapon/melee/arm_blade/New(location)
|
||||||
|
..()
|
||||||
|
processing_objects |= src
|
||||||
|
if(ismob(loc))
|
||||||
|
visible_message("<span class='warning'>A grotesque blade forms around [loc.name]\'s arm!</span>",
|
||||||
|
"<span class='warning'>Our arm twists and mutates, transforming it into a deadly blade.</span>",
|
||||||
|
"<span class='italics'>You hear organic matter ripping and tearing!</span>")
|
||||||
|
src.creator = loc
|
||||||
|
|
||||||
|
/obj/item/weapon/melee/arm_blade/dropped(mob/user)
|
||||||
|
visible_message("<span class='warning'>With a sickening crunch, [creator] reforms their arm blade into an arm!</span>",
|
||||||
|
"<span class='notice'>We assimilate the weapon back into our body.</span>",
|
||||||
|
"<span class='italics>You hear organic matter ripping and tearing!</span>")
|
||||||
|
playsound(src, 'sound/effects/blobattack.ogg', 30, 1)
|
||||||
|
spawn(1)
|
||||||
|
if(src)
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
|
/obj/item/weapon/melee/arm_blade/Destroy()
|
||||||
|
processing_objects -= src
|
||||||
|
creator = null
|
||||||
|
..()
|
||||||
|
|
||||||
|
/obj/item/weapon/melee/arm_blade/process() //Stolen from ninja swords.
|
||||||
|
if(!creator || loc != creator || (creator.l_hand != src && creator.r_hand != src))
|
||||||
|
// Tidy up a bit.
|
||||||
|
if(istype(loc,/mob/living))
|
||||||
|
var/mob/living/carbon/human/host = loc
|
||||||
|
if(istype(host))
|
||||||
|
for(var/obj/item/organ/external/organ in host.organs)
|
||||||
|
for(var/obj/item/O in organ.implants)
|
||||||
|
if(O == src)
|
||||||
|
organ.implants -= src
|
||||||
|
host.pinned -= src
|
||||||
|
host.embedded -= src
|
||||||
|
host.drop_from_inventory(src)
|
||||||
|
spawn(1)
|
||||||
|
if(src)
|
||||||
|
qdel(src)
|
||||||
97
code/game/gamemodes/changeling/powers/armor.dm
Normal file
@@ -0,0 +1,97 @@
|
|||||||
|
/datum/power/changeling/space_suit
|
||||||
|
name = "Organic Space Suit"
|
||||||
|
desc = "We grow an organic suit to protect ourselves from space exposure."
|
||||||
|
helptext = "Cannot be used in lesser form. To remove the suit, use the ability again."
|
||||||
|
genomecost = 1
|
||||||
|
verbpath = /mob/proc/changeling_spacesuit
|
||||||
|
|
||||||
|
/mob/proc/changeling_spacesuit()
|
||||||
|
set category = "Changeling"
|
||||||
|
set name = "Organic Space Suit (20)"
|
||||||
|
|
||||||
|
if(changeling_generic_armor(/obj/item/clothing/suit/space/changeling,/obj/item/clothing/head/helmet/space/changeling))
|
||||||
|
return 1
|
||||||
|
return 0
|
||||||
|
|
||||||
|
/datum/power/changeling/armor
|
||||||
|
name = "Chitinous Spacearmor"
|
||||||
|
desc = "We turn our skin into tough chitin to protect us from damage and space exposure."
|
||||||
|
helptext = "Cannot be used in lesser form. To remove the armor, use the ability again."
|
||||||
|
genomecost = 3
|
||||||
|
verbpath = /mob/proc/changeling_spacearmor
|
||||||
|
|
||||||
|
/mob/proc/changeling_spacearmor()
|
||||||
|
set category = "Changeling"
|
||||||
|
set name = "Organic Spacearmor (20)"
|
||||||
|
|
||||||
|
if(changeling_generic_armor(/obj/item/clothing/suit/space/changeling/armored,/obj/item/clothing/head/helmet/space/changeling/armored))
|
||||||
|
return 1
|
||||||
|
return 0
|
||||||
|
|
||||||
|
//Space suit
|
||||||
|
|
||||||
|
/obj/item/clothing/suit/space/changeling
|
||||||
|
name = "flesh mass"
|
||||||
|
icon_state = "lingspacesuit"
|
||||||
|
item_state = "lingspacehelmet"
|
||||||
|
desc = "A huge, bulky mass of pressure and temperature-resistant organic tissue, evolved to facilitate space travel."
|
||||||
|
flags = STOPPRESSUREDAMAGE //Not THICKMATERIAL because it's organic tissue, so if somebody tries to inject something into it,
|
||||||
|
//it still ends up in your blood. (also balance but muh fluff)
|
||||||
|
allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/emergency_oxygen, /obj/item/weapon/tank/oxygen)
|
||||||
|
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) //No armor at all.
|
||||||
|
canremove = 0
|
||||||
|
|
||||||
|
/obj/item/clothing/suit/space/changeling/New()
|
||||||
|
..()
|
||||||
|
if(ismob(loc))
|
||||||
|
loc.visible_message("<span class='warning'>[loc.name]\'s flesh rapidly inflates, forming a bloated mass around their body!</span>",
|
||||||
|
"<span class='warning'>We inflate our flesh, creating a spaceproof suit!</span>",
|
||||||
|
"<span class='italics'>You hear organic matter ripping and tearing!</span>")
|
||||||
|
|
||||||
|
/obj/item/clothing/suit/space/changeling/dropped()
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
|
/obj/item/clothing/head/helmet/space/changeling
|
||||||
|
name = "flesh mass"
|
||||||
|
icon_state = "lingspacehelmet"
|
||||||
|
item_state = "lingspacehelmet"
|
||||||
|
desc = "A covering of pressure and temperature-resistant organic tissue with a glass-like chitin front."
|
||||||
|
flags = BLOCKHAIR | STOPPRESSUREDAMAGE //Again, no THICKMATERIAL.
|
||||||
|
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||||
|
body_parts_covered = HEAD|FACE|EYES
|
||||||
|
canremove = 0
|
||||||
|
|
||||||
|
/obj/item/clothing/head/helmet/space/changeling/dropped()
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
|
//Armor
|
||||||
|
|
||||||
|
/obj/item/clothing/suit/space/changeling/armored
|
||||||
|
name = "chitinous mass"
|
||||||
|
desc = "A tough, hard covering of black chitin."
|
||||||
|
icon_state = "lingarmor"
|
||||||
|
item_state = "lingarmor"
|
||||||
|
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
|
||||||
|
armor = list(melee = 85, bullet = 70, laser = 70, energy = 70, bomb = 70, bio = 0, rad = 0) //It costs 3 points, so it should be very protective.
|
||||||
|
siemens_coefficient = 0.1
|
||||||
|
slowdown = 3
|
||||||
|
|
||||||
|
/obj/item/clothing/suit/space/changeling/armored/New()
|
||||||
|
..()
|
||||||
|
if(ismob(loc))
|
||||||
|
loc.visible_message("<span class='warning'>[loc.name]\'s flesh turns black, quickly transforming into a hard, chitinous mass!</span>",
|
||||||
|
"<span class='warning'>We harden our flesh, creating a suit of armor!</span>",
|
||||||
|
"<span class='italics'>You hear organic matter ripping and tearing!</span>")
|
||||||
|
|
||||||
|
/obj/item/clothing/suit/space/changeling/armored/dropped()
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
|
/obj/item/clothing/head/helmet/space/changeling/armored
|
||||||
|
name = "chitinous mass"
|
||||||
|
desc = "A tough, hard covering of black chitin with transparent chitin in front."
|
||||||
|
icon_state = "lingarmorhelmet"
|
||||||
|
item_state = "lingarmorhelmet"
|
||||||
|
armor = list(melee = 85, bullet = 70, laser = 70,energy = 70, bomb = 70, bio = 0, rad = 0)
|
||||||
|
|
||||||
|
/obj/item/clothing/head/helmet/space/changeling/armored/dropped()
|
||||||
|
qdel(src)
|
||||||
38
code/game/gamemodes/changeling/powers/augmented_eyesight.dm
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
//Augmented Eyesight: Gives you thermal and night vision - bye bye, flashlights. Also, high DNA cost because of how powerful it is.
|
||||||
|
|
||||||
|
/datum/power/changeling/augmented_eyesight
|
||||||
|
name = "Augmented Eyesight"
|
||||||
|
desc = "Creates heat receptors in our eyes and dramatically increases light sensing ability."
|
||||||
|
helptext = "Grants us night vision and thermal vision. It may be toggled on or off. We will become more vulnerable to flash-based devices while active."
|
||||||
|
genomecost = 2
|
||||||
|
var/active = 0 //Whether or not vision is enhanced
|
||||||
|
verbpath = /mob/proc/changeling_augmented_eyesight
|
||||||
|
|
||||||
|
/mob/proc/changeling_augmented_eyesight()
|
||||||
|
set category = "Changeling"
|
||||||
|
set name = "Augmented Eyesight (5)"
|
||||||
|
set desc = "We evolve our eyes to sense the infrared."
|
||||||
|
|
||||||
|
var/datum/changeling/changeling = changeling_power(5,0,100,CONSCIOUS)
|
||||||
|
if(!changeling)
|
||||||
|
return 0
|
||||||
|
src.mind.changeling.chem_charges -= 5
|
||||||
|
src.sight |= SEE_MOBS
|
||||||
|
/*
|
||||||
|
var/mob/living/carbon/human/C = src
|
||||||
|
|
||||||
|
active = !active
|
||||||
|
if(active)
|
||||||
|
C << "<span class='notice'>We feel a minute twitch in our eyes, and darkness creeps away.</span>"
|
||||||
|
C.sight |= SEE_MOBS
|
||||||
|
C.permanent_sight_flags |= SEE_MOBS
|
||||||
|
C.see_in_dark = 8
|
||||||
|
C.dna.species.invis_sight = SEE_INVISIBLE_MINIMUM
|
||||||
|
else
|
||||||
|
C << "<span class='notice'>Our vision dulls. Shadows gather.</span>"
|
||||||
|
C.sight &= ~SEE_MOBS
|
||||||
|
C.permanent_sight_flags &= ~SEE_MOBS
|
||||||
|
C.see_in_dark = 0
|
||||||
|
C.dna.species.invis_sight = initial(user.dna.species.invis_sight)
|
||||||
|
return 1
|
||||||
|
*/
|
||||||
134
code/game/gamemodes/changeling/powers/bioelectrogenesis.dm
Normal file
@@ -0,0 +1,134 @@
|
|||||||
|
/datum/power/changeling/bioelectrogenesis
|
||||||
|
name = "Bioelectrogenesis"
|
||||||
|
desc = "We reconfigure a large number of cells in our body to generate an electric charge. \
|
||||||
|
On demand, we can attempt to recharge anything in our active hand, or we can touch someone with an electrified hand, shocking them."
|
||||||
|
helptext = "We can shock someone by grabbing them and using this ability, or using the ability with an empty hand and touching them."
|
||||||
|
genomecost = 3
|
||||||
|
verbpath = /mob/proc/changeling_bioelectrogenesis
|
||||||
|
|
||||||
|
//Recharge whatever's in our hand, or shock people.
|
||||||
|
/mob/proc/changeling_bioelectrogenesis()
|
||||||
|
set category = "Changeling"
|
||||||
|
set name = "Bioelectrogenesis (20)"
|
||||||
|
set desc = "Recharges anything in your hand, or shocks people."
|
||||||
|
|
||||||
|
var/datum/changeling/changeling = changeling_power(20,0,100,CONSCIOUS)
|
||||||
|
|
||||||
|
var/obj/held_item = get_active_hand()
|
||||||
|
|
||||||
|
if(!changeling)
|
||||||
|
return 0
|
||||||
|
|
||||||
|
if(held_item == null)
|
||||||
|
if(changeling_generic_weapon(/obj/item/weapon/electric_hand,0)) //Chemical cost is handled in the equip proc.
|
||||||
|
return 1
|
||||||
|
return 0
|
||||||
|
|
||||||
|
else
|
||||||
|
//If we're grabbing someone, electrocute them.
|
||||||
|
if(istype(held_item,/obj/item/weapon/grab))
|
||||||
|
var/obj/item/weapon/grab/G = held_item
|
||||||
|
if(G.affecting)
|
||||||
|
G.affecting.electrocute_act(25,src,1.0,"chest")
|
||||||
|
visible_message("<span class='warning'>Arcs of electricity strike [G.affecting]!</span>",
|
||||||
|
"<span class='warning'>Our hand channels raw electricity into [G.affecting].</span>",
|
||||||
|
"<span class='italics'>You hear sparks!</span>")
|
||||||
|
src.mind.changeling.chem_charges -= 20
|
||||||
|
return 1
|
||||||
|
|
||||||
|
//Otherwise, charge up whatever's in their hand.
|
||||||
|
else
|
||||||
|
//This checks both the active hand, and the contents of the active hand's held item.
|
||||||
|
var/success = 0
|
||||||
|
var/list/L = new() //We make a new list to avoid copypasta.
|
||||||
|
|
||||||
|
//Check our hand.
|
||||||
|
if(istype(held_item,/obj/item/weapon/cell))
|
||||||
|
L.Add(held_item)
|
||||||
|
|
||||||
|
//Now check our hand's item's contents, so we can recharge guns and other stuff.
|
||||||
|
for(var/obj/item/weapon/cell/cell in held_item.contents)
|
||||||
|
L.Add(cell)
|
||||||
|
|
||||||
|
//Now for the actual recharging.
|
||||||
|
for(var/obj/item/weapon/cell/cell in L)
|
||||||
|
cell.charge += 1000 //This should be a nice compromise between recharging guns and other batteries.
|
||||||
|
if(cell.charge > cell.maxcharge)
|
||||||
|
cell.charge = cell.maxcharge
|
||||||
|
visible_message("<span class='warning'>Some sparks fall out from \the [src.name]\'s [held_item]!</span>",
|
||||||
|
"<span class='warning'>Our hand channels raw electricity into \the [held_item].</span>",
|
||||||
|
"<span class='italics'>You hear sparks!</span>")
|
||||||
|
var/T = get_turf(src)
|
||||||
|
new /obj/effect/effect/sparks(T)
|
||||||
|
held_item.update_icon()
|
||||||
|
success = 1
|
||||||
|
if(success == 0) //If we couldn't do anything with the ability, don't deduct the chemicals.
|
||||||
|
src << "<span class='warning'>We are unable to affect \the [held_item].</span>"
|
||||||
|
else
|
||||||
|
src.mind.changeling.chem_charges -= 20
|
||||||
|
return success
|
||||||
|
|
||||||
|
/obj/item/weapon/electric_hand
|
||||||
|
name = "electrified hand"
|
||||||
|
desc = "You could probably shock someone badly if you touched them, or recharge something."
|
||||||
|
icon = 'icons/obj/weapons.dmi'
|
||||||
|
icon_state = "electric_hand"
|
||||||
|
|
||||||
|
/obj/item/weapon/electric_hand/New()
|
||||||
|
if(ismob(loc))
|
||||||
|
visible_message("<span class='warning'>Electrical arcs form around [loc.name]\'s hand!</span>",
|
||||||
|
"<span class='warning'>We store a charge of electricity in our hand.</span>",
|
||||||
|
"<span class='italics'>You hear crackling electricity!</span>")
|
||||||
|
var/T = get_turf(src)
|
||||||
|
new /obj/effect/effect/sparks(T)
|
||||||
|
|
||||||
|
/obj/item/weapon/electric_hand/dropped(mob/user)
|
||||||
|
spawn(1)
|
||||||
|
if(src)
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
|
/obj/item/weapon/electric_hand/afterattack(var/atom/target, var/mob/living/user, proximity)
|
||||||
|
if(!target)
|
||||||
|
return
|
||||||
|
if(!proximity)
|
||||||
|
return
|
||||||
|
//Excuse the copypasta.
|
||||||
|
if(istype(target,/mob/living/carbon))
|
||||||
|
var/mob/living/carbon/C = target
|
||||||
|
C.electrocute_act(25,src,1.0,"chest")
|
||||||
|
visible_message("<span class='warning'>Arcs of electricity strike [C]!</span>",
|
||||||
|
"<span class='warning'>Our hand channels raw electricity into [C]</span>",
|
||||||
|
"<span class='italics'>You hear sparks!</span>")
|
||||||
|
qdel(src)
|
||||||
|
return 1
|
||||||
|
|
||||||
|
else if(istype(target,/mob/living/silicon))
|
||||||
|
var/mob/living/silicon/S = target
|
||||||
|
S.electrocute_act(25,src,1.0)
|
||||||
|
visible_message("<span class='warning'>Arcs of electricity strike [S]!</span>",
|
||||||
|
"<span class='warning'>Our hand channels raw electricity into [S]</span>",
|
||||||
|
"<span class='italics'>You hear sparks!</span>")
|
||||||
|
qdel(src)
|
||||||
|
return 1
|
||||||
|
|
||||||
|
else
|
||||||
|
if(istype(target,/obj/))
|
||||||
|
var/success = 0
|
||||||
|
var/obj/T = target
|
||||||
|
//We can also recharge things we touch, such as APCs or hardsuits.
|
||||||
|
for(var/obj/item/weapon/cell/cell in T.contents)
|
||||||
|
cell.charge += 1000
|
||||||
|
if(cell.charge > cell.maxcharge)
|
||||||
|
cell.charge = cell.maxcharge
|
||||||
|
visible_message("<span class='warning'>Some sparks fall out from \the [target]!</span>",
|
||||||
|
"<span class='warning'>Our hand channels raw electricity into \the [target].</span>",
|
||||||
|
"<span class='italics'>You hear sparks!</span>")
|
||||||
|
var/Turf = get_turf(src)
|
||||||
|
new /obj/effect/effect/sparks(Turf)
|
||||||
|
T.update_icon()
|
||||||
|
success = 1
|
||||||
|
if(success == 0)
|
||||||
|
src << "<span class='warning'>We are unable to affect \the [target].</span>"
|
||||||
|
else
|
||||||
|
qdel(src)
|
||||||
|
return 1
|
||||||
23
code/game/gamemodes/changeling/powers/blind_sting.dm
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
/datum/power/changeling/blind_sting
|
||||||
|
name = "Blind Sting"
|
||||||
|
desc = "We silently sting a human, completely blinding them for a short time."
|
||||||
|
genomecost = 2
|
||||||
|
allowduringlesserform = 1
|
||||||
|
verbpath = /mob/proc/changeling_blind_sting
|
||||||
|
|
||||||
|
/mob/proc/changeling_blind_sting()
|
||||||
|
set category = "Changeling"
|
||||||
|
set name = "Blind sting (20)"
|
||||||
|
set desc="Sting target"
|
||||||
|
|
||||||
|
var/mob/living/carbon/T = changeling_sting(20,/mob/proc/changeling_blind_sting)
|
||||||
|
if(!T)
|
||||||
|
return 0
|
||||||
|
T << "<span class='danger'>Your eyes burn horrificly!</span>"
|
||||||
|
T.disabilities |= NEARSIGHTED
|
||||||
|
spawn(300)
|
||||||
|
T.disabilities &= ~NEARSIGHTED
|
||||||
|
T.eye_blind = 10
|
||||||
|
T.eye_blurry = 20
|
||||||
|
feedback_add_details("changeling_powers","BS")
|
||||||
|
return 1
|
||||||
25
code/game/gamemodes/changeling/powers/boost_range.dm
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
/datum/power/changeling/boost_range
|
||||||
|
name = "Boost Range"
|
||||||
|
desc = "We evolve the ability to shoot our stingers at humans, with some preperation."
|
||||||
|
helptext = "Allows us to prepare the next sting to have a range of two tiles."
|
||||||
|
genomecost = 1
|
||||||
|
allowduringlesserform = 1
|
||||||
|
verbpath = /mob/proc/changeling_boost_range
|
||||||
|
|
||||||
|
//Boosts the range of your next sting attack by 1
|
||||||
|
/mob/proc/changeling_boost_range()
|
||||||
|
set category = "Changeling"
|
||||||
|
set name = "Ranged Sting (10)"
|
||||||
|
set desc="Your next sting ability can be used against targets 2 squares away."
|
||||||
|
|
||||||
|
var/datum/changeling/changeling = changeling_power(10,0,100)
|
||||||
|
if(!changeling)
|
||||||
|
return 0
|
||||||
|
changeling.chem_charges -= 10
|
||||||
|
src << "<span class='notice'>Your throat adjusts to launch the sting.</span>"
|
||||||
|
changeling.sting_range = 2
|
||||||
|
src.verbs -= /mob/proc/changeling_boost_range
|
||||||
|
spawn(5)
|
||||||
|
src.verbs += /mob/proc/changeling_boost_range
|
||||||
|
feedback_add_details("changeling_powers","RS")
|
||||||
|
return 1
|
||||||
19
code/game/gamemodes/changeling/powers/cryo_sting.dm
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
/datum/power/changeling/cryo_sting
|
||||||
|
name = "Cryogenic Sting"
|
||||||
|
desc = "We silently sting a biological with a cocktail of chemicals that freeze them."
|
||||||
|
helptext = "Does not provide a warning to the victim, though they will likely realize they are suddenly freezing."
|
||||||
|
genomecost = 1
|
||||||
|
verbpath = /mob/proc/changeling_cryo_sting
|
||||||
|
|
||||||
|
/mob/proc/changeling_cryo_sting()
|
||||||
|
set category = "Changeling"
|
||||||
|
set name = "Cryogenic Sting (20)"
|
||||||
|
set desc = "Chills and freezes a biological creature."
|
||||||
|
|
||||||
|
var/mob/living/carbon/T = changeling_sting(40,/mob/proc/changeling_cryo_sting)
|
||||||
|
if(!T)
|
||||||
|
return 0
|
||||||
|
if(T.reagents)
|
||||||
|
T.reagents.add_reagent("frostoil", 10)
|
||||||
|
feedback_add_details("changeling_powers","CS")
|
||||||
|
return 1
|
||||||
20
code/game/gamemodes/changeling/powers/deaf_sting.dm
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
/datum/power/changeling/deaf_sting
|
||||||
|
name = "Deaf Sting"
|
||||||
|
desc = "We silently sting a human, completely deafening them for a short time."
|
||||||
|
genomecost = 1
|
||||||
|
allowduringlesserform = 1
|
||||||
|
verbpath = /mob/proc/changeling_deaf_sting
|
||||||
|
|
||||||
|
|
||||||
|
/mob/proc/changeling_deaf_sting()
|
||||||
|
set category = "Changeling"
|
||||||
|
set name = "Deaf sting (5)"
|
||||||
|
set desc="Sting target:"
|
||||||
|
|
||||||
|
var/mob/living/carbon/T = changeling_sting(5,/mob/proc/changeling_deaf_sting)
|
||||||
|
if(!T) return 0
|
||||||
|
T << "<span class='danger'>Your ears pop and begin ringing loudly!</span>"
|
||||||
|
T.sdisabilities |= DEAF
|
||||||
|
spawn(300) T.sdisabilities &= ~DEAF
|
||||||
|
feedback_add_details("changeling_powers","DS")
|
||||||
|
return 1
|
||||||
21
code/game/gamemodes/changeling/powers/death_sting.dm
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
/datum/power/changeling/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 = /mob/proc/changeling_DEATHsting
|
||||||
|
|
||||||
|
/mob/proc/changeling_DEATHsting()
|
||||||
|
set category = "Changeling"
|
||||||
|
set name = "Death Sting (40)"
|
||||||
|
set desc = "Causes spasms onto death."
|
||||||
|
|
||||||
|
var/mob/living/carbon/T = changeling_sting(40,/mob/proc/changeling_DEATHsting)
|
||||||
|
if(!T)
|
||||||
|
return 0
|
||||||
|
T << "<span class='danger'>You feel a small prick and your chest becomes tight.</span>"
|
||||||
|
T.silent = 10
|
||||||
|
T.Paralyse(10)
|
||||||
|
T.make_jittery(100)
|
||||||
|
if(T.reagents) T.reagents.add_reagent("lexorin", 40)
|
||||||
|
feedback_add_details("changeling_powers","DTHS")
|
||||||
|
return 1
|
||||||
35
code/game/gamemodes/changeling/powers/digital_camo.dm
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
/datum/power/changeling/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 = 1
|
||||||
|
allowduringlesserform = 1
|
||||||
|
verbpath = /mob/proc/changeling_digitalcamo
|
||||||
|
|
||||||
|
//Prevents AIs tracking you but makes you easily detectable to the human-eye.
|
||||||
|
/mob/proc/changeling_digitalcamo()
|
||||||
|
set category = "Changeling"
|
||||||
|
set name = "Toggle Digital Camoflague"
|
||||||
|
set desc = "The AI can no longer track us, but we will look different if examined. Has a constant cost while active."
|
||||||
|
|
||||||
|
var/datum/changeling/changeling = changeling_power()
|
||||||
|
if(!changeling)
|
||||||
|
return 0
|
||||||
|
|
||||||
|
var/mob/living/carbon/human/C = src
|
||||||
|
if(C.digitalcamo)
|
||||||
|
C << "<span class='notice'>We return to normal.</span>"
|
||||||
|
else
|
||||||
|
C << "<span class='notice'>We distort our form to prevent AI-tracking.</span>"
|
||||||
|
C.digitalcamo = !C.digitalcamo
|
||||||
|
|
||||||
|
spawn(0)
|
||||||
|
while(C && C.digitalcamo && C.mind && C.mind.changeling)
|
||||||
|
C.mind.changeling.chem_charges = max(C.mind.changeling.chem_charges - 1, 0)
|
||||||
|
sleep(40)
|
||||||
|
|
||||||
|
src.verbs -= /mob/proc/changeling_digitalcamo
|
||||||
|
spawn(5)
|
||||||
|
src.verbs += /mob/proc/changeling_digitalcamo
|
||||||
|
feedback_add_details("changeling_powers","CAM")
|
||||||
|
return 1
|
||||||
13
code/game/gamemodes/changeling/powers/engorged_glands.dm
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
/datum/power/changeling/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, and doubles production rate."
|
||||||
|
genomecost = 1
|
||||||
|
isVerb = 0
|
||||||
|
verbpath = /mob/proc/changeling_engorgedglands
|
||||||
|
|
||||||
|
//Increases macimum chemical storage
|
||||||
|
/mob/proc/changeling_engorgedglands()
|
||||||
|
src.mind.changeling.chem_storage += 25
|
||||||
|
src.mind.changeling.chem_recharge_rate *= 2
|
||||||
|
return 1
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
/datum/power/changeling/epinephrine_overdose
|
||||||
|
name = "Epinephrine Overdose"
|
||||||
|
desc = "We evolve additional sacs of adrenaline throughout our body."
|
||||||
|
helptext = "We can instantly recover from stuns and reduce the effect of future stuns, but we will suffer toxicity in the long term. Can be used while unconscious."
|
||||||
|
genomecost = 2
|
||||||
|
verbpath = /mob/proc/changeling_epinephrine_overdose
|
||||||
|
|
||||||
|
//Recover from stuns.
|
||||||
|
/mob/proc/changeling_epinephrine_overdose()
|
||||||
|
set category = "Changeling"
|
||||||
|
set name = "Epinephrine Overdose (30)"
|
||||||
|
set desc = "Removes all stuns instantly, and reduces future stuns."
|
||||||
|
|
||||||
|
var/datum/changeling/changeling = changeling_power(30,0,100,UNCONSCIOUS)
|
||||||
|
if(!changeling)
|
||||||
|
return 0
|
||||||
|
changeling.chem_charges -= 30
|
||||||
|
|
||||||
|
var/mob/living/carbon/human/C = src
|
||||||
|
C << "<span class='notice'>Energy rushes through us. [C.lying ? "We arise." : ""]</span>"
|
||||||
|
C.stat = 0
|
||||||
|
C.SetParalysis(0)
|
||||||
|
C.SetStunned(0)
|
||||||
|
C.SetWeakened(0)
|
||||||
|
C.lying = 0
|
||||||
|
C.update_canmove()
|
||||||
|
// C.reagents.add_reagent("toxin", 10)
|
||||||
|
C.reagents.add_reagent("epinephrine", 20)
|
||||||
|
|
||||||
|
feedback_add_details("changeling_powers","UNS")
|
||||||
|
return 1
|
||||||
|
|
||||||
|
/datum/reagent/epinephrine
|
||||||
|
name = "Epinephrine"
|
||||||
|
id = "epinephrine"
|
||||||
|
description = "Reduces stun times, but causing toxicity due to high concentration."
|
||||||
|
reagent_state = LIQUID
|
||||||
|
color = "#C8A5DC"
|
||||||
|
metabolism = REM * 2
|
||||||
|
overdose = 5 //This is intentionally low, as we want the ling to take some tox damage, to discourage spamming the ability.
|
||||||
|
|
||||||
|
/datum/reagent/epinephrine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
|
||||||
|
if(alien == IS_DIONA)
|
||||||
|
return
|
||||||
|
M.add_chemical_effect(CE_SPEEDBOOST, 3)
|
||||||
|
M.add_chemical_effect(CE_PAINKILLER, 60)
|
||||||
|
M.adjustHalLoss(-30)
|
||||||
|
M.AdjustParalysis(-2)
|
||||||
|
M.AdjustStunned(-2)
|
||||||
|
M.AdjustWeakened(-2)
|
||||||
|
..()
|
||||||
|
return
|
||||||
29
code/game/gamemodes/changeling/powers/extract_dna_sting.dm
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
/datum/power/changeling/extractdna
|
||||||
|
name = "Extract DNA"
|
||||||
|
desc = "We stealthily sting a target and extract the DNA from them."
|
||||||
|
helptext = "Will give you the DNA of your target, allowing you to transform into them. Does not count towards absorb objectives."
|
||||||
|
genomecost = 0
|
||||||
|
allowduringlesserform = 1
|
||||||
|
verbpath = /mob/proc/changeling_extract_dna_sting
|
||||||
|
|
||||||
|
/mob/proc/changeling_extract_dna_sting()
|
||||||
|
set category = "Changeling"
|
||||||
|
set name = "Extract DNA Sting (40)"
|
||||||
|
set desc="Stealthily sting a target to extract their DNA."
|
||||||
|
|
||||||
|
var/datum/changeling/changeling = null
|
||||||
|
if(src.mind && src.mind.changeling)
|
||||||
|
changeling = src.mind.changeling
|
||||||
|
if(!changeling)
|
||||||
|
return 0
|
||||||
|
|
||||||
|
var/mob/living/carbon/human/T = changeling_sting(40, /mob/proc/changeling_extract_dna_sting)
|
||||||
|
if(!T) return 0
|
||||||
|
|
||||||
|
T.dna.real_name = T.real_name
|
||||||
|
changeling.absorbed_dna |= T.dna
|
||||||
|
if(T.species && !(T.species.name in changeling.absorbed_species))
|
||||||
|
changeling.absorbed_species += T.species.name
|
||||||
|
|
||||||
|
feedback_add_details("changeling_powers","ED")
|
||||||
|
return 1
|
||||||
56
code/game/gamemodes/changeling/powers/fake_death.dm
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
/datum/power/changeling/fakedeath
|
||||||
|
name = "Regenerative Stasis"
|
||||||
|
desc = "We become weakened to a death-like state, where we will rise again from death."
|
||||||
|
helptext = "Can be used before or after death. Duration varies greatly."
|
||||||
|
genomecost = 0
|
||||||
|
allowduringlesserform = 1
|
||||||
|
verbpath = /mob/proc/changeling_fakedeath
|
||||||
|
|
||||||
|
//Fake our own death and fully heal. You will appear to be dead but regenerate fully after a short delay.
|
||||||
|
/mob/proc/changeling_fakedeath()
|
||||||
|
set category = "Changeling"
|
||||||
|
set name = "Regenerative Stasis (20)"
|
||||||
|
|
||||||
|
var/datum/changeling/changeling = changeling_power(20,1,100,DEAD)
|
||||||
|
if(!changeling)
|
||||||
|
return
|
||||||
|
|
||||||
|
var/mob/living/carbon/C = src
|
||||||
|
if(!C.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
|
||||||
|
C << "<span class='notice'>We will attempt to regenerate our form.</span>"
|
||||||
|
|
||||||
|
C.status_flags |= FAKEDEATH //play dead
|
||||||
|
C.update_canmove()
|
||||||
|
C.remove_changeling_powers()
|
||||||
|
|
||||||
|
if(C.stat != DEAD)
|
||||||
|
C.emote("deathgasp")
|
||||||
|
C.tod = worldtime2text()
|
||||||
|
|
||||||
|
spawn(rand(800,2000))
|
||||||
|
//The ling will now be able to choose when to revive
|
||||||
|
src.verbs += /mob/proc/changeling_revive
|
||||||
|
src << "<span class='notice'>We are ready to rise. Use the Revive verb when you are ready.</span>"
|
||||||
|
/*
|
||||||
|
// charge the changeling chemical cost for stasis
|
||||||
|
changeling.chem_charges -= 20
|
||||||
|
|
||||||
|
// restore us to health
|
||||||
|
C.revive()
|
||||||
|
|
||||||
|
// remove our fake death flag
|
||||||
|
C.status_flags &= ~(FAKEDEATH)
|
||||||
|
|
||||||
|
// let us move again
|
||||||
|
C.update_canmove()
|
||||||
|
|
||||||
|
// re-add out changeling powers
|
||||||
|
C.make_changeling()
|
||||||
|
|
||||||
|
// sending display messages
|
||||||
|
C << "<span class='notice'>We have regenerated.</span>"
|
||||||
|
*/
|
||||||
|
|
||||||
|
feedback_add_details("changeling_powers","FD")
|
||||||
|
return 1
|
||||||
33
code/game/gamemodes/changeling/powers/fleshmend.dm
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
/datum/power/changeling/fleshmend
|
||||||
|
name = "Fleshmend"
|
||||||
|
desc = "Begins a slow rengeration of our form. Does not effect stuns or chemicals."
|
||||||
|
genomecost = 1
|
||||||
|
verbpath = /mob/proc/changeling_fleshmend
|
||||||
|
|
||||||
|
//Starts healing you every second for 50 seconds. Can be used whilst unconscious.
|
||||||
|
/mob/proc/changeling_fleshmend()
|
||||||
|
set category = "Changeling"
|
||||||
|
set name = "Fleshmend (10)"
|
||||||
|
set desc = "Begins a slow rengeration of our form. Does not effect stuns or chemicals."
|
||||||
|
|
||||||
|
var/datum/changeling/changeling = changeling_power(10,0,100,UNCONSCIOUS)
|
||||||
|
if(!changeling)
|
||||||
|
return 0
|
||||||
|
src.mind.changeling.chem_charges -= 10
|
||||||
|
|
||||||
|
var/mob/living/carbon/human/C = src
|
||||||
|
spawn(0)
|
||||||
|
src << "<span class='notice'>We begin to heal ourselves.</span>"
|
||||||
|
for(var/i = 0, i<50,i++)
|
||||||
|
if(C)
|
||||||
|
C.adjustBruteLoss(-2)
|
||||||
|
C.adjustOxyLoss(-2)
|
||||||
|
C.adjustFireLoss(-2)
|
||||||
|
sleep(10)
|
||||||
|
|
||||||
|
src.verbs -= /mob/proc/changeling_fleshmend
|
||||||
|
spawn(500)
|
||||||
|
src << "<span class='notice'>Our regeneration has slowed to normal levels.</span>"
|
||||||
|
src.verbs += /mob/proc/changeling_fleshmend
|
||||||
|
feedback_add_details("changeling_powers","FM")
|
||||||
|
return 1
|
||||||
78
code/game/gamemodes/changeling/powers/hivemind.dm
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
// Hivemind
|
||||||
|
|
||||||
|
/datum/power/changeling/hive_upload
|
||||||
|
name = "Hive Channel"
|
||||||
|
desc = "We can channel a DNA into the airwaves, allowing our fellow changelings to absorb it and transform into it as if they acquired the DNA themselves."
|
||||||
|
helptext = "Allows other changelings to absorb the DNA you channel from the airwaves. Will not help them towards their absorb objectives."
|
||||||
|
genomecost = 0
|
||||||
|
verbpath = /mob/proc/changeling_hiveupload
|
||||||
|
|
||||||
|
/datum/power/changeling/hive_download
|
||||||
|
name = "Hive Absorb"
|
||||||
|
desc = "We can absorb a single DNA from the airwaves, allowing us to use more disguises with help from our fellow changelings."
|
||||||
|
helptext = "Allows you to absorb a single DNA and use it. Does not count towards your absorb objective."
|
||||||
|
genomecost = 0
|
||||||
|
verbpath = /mob/proc/changeling_hivedownload
|
||||||
|
|
||||||
|
// HIVE MIND UPLOAD/DOWNLOAD DNA
|
||||||
|
|
||||||
|
var/list/datum/dna/hivemind_bank = list()
|
||||||
|
|
||||||
|
/mob/proc/changeling_hiveupload()
|
||||||
|
set category = "Changeling"
|
||||||
|
set name = "Hive Channel (10)"
|
||||||
|
set desc = "Allows you to channel DNA in the airwaves to allow other changelings to absorb it."
|
||||||
|
|
||||||
|
var/datum/changeling/changeling = changeling_power(10,1)
|
||||||
|
if(!changeling) return
|
||||||
|
|
||||||
|
var/list/names = list()
|
||||||
|
for(var/datum/dna/DNA in changeling.absorbed_dna)
|
||||||
|
if(!(DNA in hivemind_bank))
|
||||||
|
names += DNA.real_name
|
||||||
|
|
||||||
|
if(names.len <= 0)
|
||||||
|
src << "<span class='notice'>The airwaves already have all of our DNA.</span>"
|
||||||
|
return
|
||||||
|
|
||||||
|
var/S = input("Select a DNA to channel: ", "Channel DNA", null) as null|anything in names
|
||||||
|
if(!S) return
|
||||||
|
|
||||||
|
var/datum/dna/chosen_dna = changeling.GetDNA(S)
|
||||||
|
if(!chosen_dna)
|
||||||
|
return
|
||||||
|
|
||||||
|
changeling.chem_charges -= 10
|
||||||
|
hivemind_bank += chosen_dna
|
||||||
|
src << "<span class='notice'>We channel the DNA of [S] to the air.</span>"
|
||||||
|
feedback_add_details("changeling_powers","HU")
|
||||||
|
return 1
|
||||||
|
|
||||||
|
/mob/proc/changeling_hivedownload()
|
||||||
|
set category = "Changeling"
|
||||||
|
set name = "Hive Absorb (20)"
|
||||||
|
set desc = "Allows you to absorb DNA that is being channeled in the airwaves."
|
||||||
|
|
||||||
|
var/datum/changeling/changeling = changeling_power(20,1)
|
||||||
|
if(!changeling) return
|
||||||
|
|
||||||
|
var/list/names = list()
|
||||||
|
for(var/datum/dna/DNA in hivemind_bank)
|
||||||
|
if(!(DNA in changeling.absorbed_dna))
|
||||||
|
names[DNA.real_name] = DNA
|
||||||
|
|
||||||
|
if(names.len <= 0)
|
||||||
|
src << "<span class='notice'>There's no new DNA to absorb from the air.</span>"
|
||||||
|
return
|
||||||
|
|
||||||
|
var/S = input("Select a DNA absorb from the air: ", "Absorb DNA", null) as null|anything in names
|
||||||
|
if(!S) return
|
||||||
|
var/datum/dna/chosen_dna = names[S]
|
||||||
|
if(!chosen_dna)
|
||||||
|
return
|
||||||
|
|
||||||
|
changeling.chem_charges -= 20
|
||||||
|
changeling.absorbed_dna += chosen_dna
|
||||||
|
src << "<span class='notice'>We absorb the DNA of [S] from the air.</span>"
|
||||||
|
feedback_add_details("changeling_powers","HD")
|
||||||
|
return 1
|
||||||
114
code/game/gamemodes/changeling/powers/lesser_form.dm
Normal file
@@ -0,0 +1,114 @@
|
|||||||
|
/datum/power/changeling/lesser_form
|
||||||
|
name = "Lesser Form"
|
||||||
|
desc = "We debase ourselves and become lesser. We become a monkey."
|
||||||
|
genomecost = 1
|
||||||
|
verbpath = /mob/proc/changeling_lesser_form
|
||||||
|
|
||||||
|
//Transform into a monkey.
|
||||||
|
/mob/proc/changeling_lesser_form()
|
||||||
|
set category = "Changeling"
|
||||||
|
set name = "Lesser Form (1)"
|
||||||
|
|
||||||
|
var/datum/changeling/changeling = changeling_power(1,0,0)
|
||||||
|
if(!changeling) return
|
||||||
|
|
||||||
|
if(src.has_brain_worms())
|
||||||
|
src << "<span class='warning'>We cannot perform this ability at the present time!</span>"
|
||||||
|
return
|
||||||
|
|
||||||
|
var/mob/living/carbon/human/H = src
|
||||||
|
|
||||||
|
if(!istype(H) || !H.species.primitive_form)
|
||||||
|
src << "<span class='warning'>We cannot perform this ability in this form!</span>"
|
||||||
|
return
|
||||||
|
|
||||||
|
changeling.chem_charges--
|
||||||
|
H.remove_changeling_powers()
|
||||||
|
H.visible_message("<span class='warning'>[H] transforms!</span>")
|
||||||
|
changeling.geneticdamage = 30
|
||||||
|
H << "<span class='warning'>Our genes cry out!</span>"
|
||||||
|
var/list/implants = list() //Try to preserve implants.
|
||||||
|
for(var/obj/item/weapon/implant/W in H)
|
||||||
|
implants += W
|
||||||
|
H.monkeyize()
|
||||||
|
feedback_add_details("changeling_powers","LF")
|
||||||
|
return 1
|
||||||
|
|
||||||
|
//Transform into a human
|
||||||
|
/mob/proc/changeling_lesser_transform()
|
||||||
|
set category = "Changeling"
|
||||||
|
set name = "Transform (1)"
|
||||||
|
|
||||||
|
var/datum/changeling/changeling = changeling_power(1,1,0)
|
||||||
|
if(!changeling) return
|
||||||
|
|
||||||
|
var/list/names = list()
|
||||||
|
for(var/datum/dna/DNA in changeling.absorbed_dna)
|
||||||
|
names += "[DNA.real_name]"
|
||||||
|
|
||||||
|
var/S = input("Select the target DNA: ", "Target DNA", null) as null|anything in names
|
||||||
|
if(!S) return
|
||||||
|
|
||||||
|
var/datum/dna/chosen_dna = changeling.GetDNA(S)
|
||||||
|
if(!chosen_dna)
|
||||||
|
return
|
||||||
|
|
||||||
|
var/mob/living/carbon/C = src
|
||||||
|
|
||||||
|
changeling.chem_charges--
|
||||||
|
C.remove_changeling_powers()
|
||||||
|
C.visible_message("<span class='warning'>[C] transforms!</span>")
|
||||||
|
C.dna = chosen_dna.Clone()
|
||||||
|
|
||||||
|
var/list/implants = list()
|
||||||
|
for (var/obj/item/weapon/implant/I in C) //Still preserving implants
|
||||||
|
implants += I
|
||||||
|
|
||||||
|
C.transforming = 1
|
||||||
|
C.canmove = 0
|
||||||
|
C.icon = null
|
||||||
|
C.overlays.Cut()
|
||||||
|
C.invisibility = 101
|
||||||
|
var/atom/movable/overlay/animation = new /atom/movable/overlay( C.loc )
|
||||||
|
animation.icon_state = "blank"
|
||||||
|
animation.icon = 'icons/mob/mob.dmi'
|
||||||
|
animation.master = src
|
||||||
|
flick("monkey2h", animation)
|
||||||
|
sleep(48)
|
||||||
|
qdel(animation)
|
||||||
|
|
||||||
|
for(var/obj/item/W in src)
|
||||||
|
C.drop_from_inventory(W)
|
||||||
|
|
||||||
|
var/mob/living/carbon/human/O = new /mob/living/carbon/human( src )
|
||||||
|
if (C.dna.GetUIState(DNA_UI_GENDER))
|
||||||
|
O.gender = FEMALE
|
||||||
|
else
|
||||||
|
O.gender = MALE
|
||||||
|
O.dna = C.dna.Clone()
|
||||||
|
C.dna = null
|
||||||
|
O.real_name = chosen_dna.real_name
|
||||||
|
|
||||||
|
for(var/obj/T in C)
|
||||||
|
qdel(T)
|
||||||
|
|
||||||
|
O.loc = C.loc
|
||||||
|
|
||||||
|
O.UpdateAppearance()
|
||||||
|
domutcheck(O, null)
|
||||||
|
O.setToxLoss(C.getToxLoss())
|
||||||
|
O.adjustBruteLoss(C.getBruteLoss())
|
||||||
|
O.setOxyLoss(C.getOxyLoss())
|
||||||
|
O.adjustFireLoss(C.getFireLoss())
|
||||||
|
O.stat = C.stat
|
||||||
|
for (var/obj/item/weapon/implant/I in implants)
|
||||||
|
I.loc = O
|
||||||
|
I.implanted = O
|
||||||
|
|
||||||
|
C.mind.transfer_to(O)
|
||||||
|
O.make_changeling()
|
||||||
|
O.changeling_update_languages(changeling.absorbed_languages)
|
||||||
|
|
||||||
|
feedback_add_details("changeling_powers","LFT")
|
||||||
|
qdel(C)
|
||||||
|
return 1
|
||||||
19
code/game/gamemodes/changeling/powers/lsd_sting.dm
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
//This only exists to be abused, so it's highly recommended to ensure this file is unchecked.
|
||||||
|
/datum/power/changeling/LSDSting
|
||||||
|
name = "Hallucination Sting"
|
||||||
|
desc = "We evolve the ability to sting a target with a powerful hallunicationary chemical."
|
||||||
|
helptext = "The target does not notice they have been stung. The effect occurs after 30 to 60 seconds."
|
||||||
|
genomecost = 3
|
||||||
|
verbpath = /mob/proc/changeling_lsdsting
|
||||||
|
|
||||||
|
/mob/proc/changeling_lsdsting()
|
||||||
|
set category = "Changeling"
|
||||||
|
set name = "Hallucination Sting (15)"
|
||||||
|
set desc = "Causes terror in the target."
|
||||||
|
|
||||||
|
var/mob/living/carbon/T = changeling_sting(15,/mob/proc/changeling_lsdsting)
|
||||||
|
if(!T) return 0
|
||||||
|
spawn(rand(300,600))
|
||||||
|
if(T) T.hallucination += 400
|
||||||
|
feedback_add_details("changeling_powers","HS")
|
||||||
|
return 1
|
||||||
40
code/game/gamemodes/changeling/powers/mimic_voice.dm
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
/datum/power/changeling/mimicvoice
|
||||||
|
name = "Mimic Voice"
|
||||||
|
desc = "We shape our vocal glands to sound like a desired voice."
|
||||||
|
helptext = "Will turn your voice into the name that you enter. We must constantly expend chemicals to maintain our form like this"
|
||||||
|
genomecost = 1
|
||||||
|
verbpath = /mob/proc/changeling_mimicvoice
|
||||||
|
|
||||||
|
// Fake Voice
|
||||||
|
|
||||||
|
/mob/proc/changeling_mimicvoice()
|
||||||
|
set category = "Changeling"
|
||||||
|
set name = "Mimic Voice"
|
||||||
|
set desc = "Shape our vocal glands to form a voice of someone we choose. We cannot regenerate chemicals when mimicing."
|
||||||
|
|
||||||
|
|
||||||
|
var/datum/changeling/changeling = changeling_power()
|
||||||
|
if(!changeling) return
|
||||||
|
|
||||||
|
if(changeling.mimicing)
|
||||||
|
changeling.mimicing = ""
|
||||||
|
src << "<span class='notice'>We return our vocal glands to their original location.</span>"
|
||||||
|
return
|
||||||
|
|
||||||
|
var/mimic_voice = sanitize(input(usr, "Enter a name to mimic.", "Mimic Voice", null), MAX_NAME_LEN)
|
||||||
|
if(!mimic_voice)
|
||||||
|
return
|
||||||
|
|
||||||
|
changeling.mimicing = mimic_voice
|
||||||
|
|
||||||
|
src << "<span class='notice'>We shape our glands to take the voice of <b>[mimic_voice]</b>, this will stop us from regenerating chemicals while active.</span>"
|
||||||
|
src << "<span class='notice'>Use this power again to return to our original voice and reproduce chemicals again.</span>"
|
||||||
|
|
||||||
|
feedback_add_details("changeling_powers","MV")
|
||||||
|
|
||||||
|
spawn(0)
|
||||||
|
while(src && src.mind && src.mind.changeling && src.mind.changeling.mimicing)
|
||||||
|
src.mind.changeling.chem_charges = max(src.mind.changeling.chem_charges - 1, 0)
|
||||||
|
sleep(40)
|
||||||
|
if(src && src.mind && src.mind.changeling)
|
||||||
|
src.mind.changeling.mimicing = ""
|
||||||
37
code/game/gamemodes/changeling/powers/panacea.dm
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
/datum/power/changeling/panacea
|
||||||
|
name = "Anatomic Panacea"
|
||||||
|
desc = "Expels impurifications from our form; curing diseases, removing toxins, chemicals, radiation, and resetting our genetic code completely."
|
||||||
|
helptext = "Can be used while unconscious."
|
||||||
|
genomecost = 1
|
||||||
|
verbpath = /mob/proc/changeling_panacea
|
||||||
|
|
||||||
|
//Heals the things that the other regenerative abilities don't.
|
||||||
|
/mob/proc/changeling_panacea()
|
||||||
|
set category = "Changeling"
|
||||||
|
set name = "Anatomic Panacea (20)"
|
||||||
|
set desc = "Clense ourselves of impurities."
|
||||||
|
|
||||||
|
var/datum/changeling/changeling = changeling_power(20,0,100,UNCONSCIOUS)
|
||||||
|
if(!changeling)
|
||||||
|
return 0
|
||||||
|
src.mind.changeling.chem_charges -= 20
|
||||||
|
|
||||||
|
src << "<span class='notice'>We cleanse impurities from our form.</span>"
|
||||||
|
|
||||||
|
for(var/datum/disease/D in src.viruses)
|
||||||
|
D.cure()
|
||||||
|
|
||||||
|
var/mob/living/carbon/human/C = src
|
||||||
|
|
||||||
|
C.radiation = 0
|
||||||
|
C.sdisabilities = 0
|
||||||
|
C.disabilities = 0
|
||||||
|
C.reagents.clear_reagents()
|
||||||
|
|
||||||
|
for(var/i = 0, i<10,i++)
|
||||||
|
if(C)
|
||||||
|
C.adjustToxLoss(-5)
|
||||||
|
sleep(10)
|
||||||
|
|
||||||
|
feedback_add_details("changeling_powers","AP")
|
||||||
|
return 1
|
||||||
18
code/game/gamemodes/changeling/powers/para_sting.dm
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
/datum/power/changeling/paralysis_sting
|
||||||
|
name = "Paralysis Sting"
|
||||||
|
desc = "We silently sting a human, paralyzing them for a short time."
|
||||||
|
genomecost = 3
|
||||||
|
verbpath = /mob/proc/changeling_paralysis_sting
|
||||||
|
|
||||||
|
/mob/proc/changeling_paralysis_sting()
|
||||||
|
set category = "Changeling"
|
||||||
|
set name = "Paralysis sting (30)"
|
||||||
|
set desc="Sting target"
|
||||||
|
|
||||||
|
var/mob/living/carbon/T = changeling_sting(30,/mob/proc/changeling_paralysis_sting)
|
||||||
|
if(!T)
|
||||||
|
return 0
|
||||||
|
T << "<span class='danger'>Your muscles begin to painfully tighten.</span>"
|
||||||
|
T.Weaken(20)
|
||||||
|
feedback_add_details("changeling_powers","PS")
|
||||||
|
return 1
|
||||||
48
code/game/gamemodes/changeling/powers/rapid_regen.dm
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
/datum/power/changeling/rapid_regen
|
||||||
|
name = "Rapid Regeneration"
|
||||||
|
desc = "We quickly heal ourselves, removing most advanced injuries, at a high chemical cost."
|
||||||
|
helptext = "This will heal a significant amount of brute, fire, oxy, clone, and brain damage, and heal broken bones, internal bleeding, low blood, \
|
||||||
|
and organ damage. The process is fast, but anyone who sees us do this will likely realize we are not what we seem."
|
||||||
|
genomecost = 2
|
||||||
|
verbpath = /mob/proc/changeling_rapid_regen
|
||||||
|
|
||||||
|
//Gives a big heal, removing various injuries that might shut down normal people, like IB or fractures.
|
||||||
|
/mob/proc/changeling_rapid_regen()
|
||||||
|
set category = "Changeling"
|
||||||
|
set name = "Rapid Regeneration (50)"
|
||||||
|
set desc = "Heal ourselves of most injuries instantly."
|
||||||
|
|
||||||
|
var/datum/changeling/changeling = changeling_power(50,0,100,UNCONSCIOUS)
|
||||||
|
if(!changeling)
|
||||||
|
return 0
|
||||||
|
src.mind.changeling.chem_charges -= 50
|
||||||
|
|
||||||
|
if(ishuman(src))
|
||||||
|
var/mob/living/carbon/human/C = src
|
||||||
|
spawn(0)
|
||||||
|
C.adjustBruteLoss(-40)
|
||||||
|
C.adjustFireLoss(-40)
|
||||||
|
C.adjustOxyLoss(-40)
|
||||||
|
C.adjustCloneLoss(-40)
|
||||||
|
C.adjustBrainLoss(-40)
|
||||||
|
C.restore_blood()
|
||||||
|
C.restore_all_organs()
|
||||||
|
C.blinded = 0
|
||||||
|
C.eye_blind = 0
|
||||||
|
C.eye_blurry = 0
|
||||||
|
C.ear_deaf = 0
|
||||||
|
C.ear_damage = 0
|
||||||
|
|
||||||
|
// make the icons look correct
|
||||||
|
C.regenerate_icons()
|
||||||
|
|
||||||
|
// now make it obvious that we're not human (or whatever xeno race they are impersonating)
|
||||||
|
playsound(src, 'sound/effects/blobattack.ogg', 30, 1)
|
||||||
|
var/T = get_turf(src)
|
||||||
|
new /obj/effect/gibspawner/human(T)
|
||||||
|
visible_message("<span class='warning'>With a sickening squish, [src] reforms their whole body, casting their old parts on the floor!</span>",
|
||||||
|
"<span class='notice'>We reform our body. We are whole once more.</span>",
|
||||||
|
"<span class='italics>You hear organic matter ripping and tearing!</span>")
|
||||||
|
|
||||||
|
feedback_add_details("changeling_powers","RR")
|
||||||
|
return 1
|
||||||
21
code/game/gamemodes/changeling/powers/respec.dm
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
/mob/proc/changeling_respec()
|
||||||
|
set category = "Changeling"
|
||||||
|
set name = "Re-adapt"
|
||||||
|
set desc = "Allows us to refund our purchased abilities."
|
||||||
|
|
||||||
|
var/datum/changeling/changeling = changeling_power(0,0,100)
|
||||||
|
if(!changeling)
|
||||||
|
return
|
||||||
|
|
||||||
|
src.remove_changeling_powers() //First, remove the verbs.
|
||||||
|
var/datum/changeling/ling_datum = src.mind.changeling
|
||||||
|
ling_datum.purchasedpowers = list() //Then wipe all the powers we bought.
|
||||||
|
ling_datum.geneticpoints = ling_datum.max_geneticpoints //Now refund our points to the maximum.
|
||||||
|
ling_datum.chem_recharge_rate = 0.5 //If glands were bought, revert that upgrade.
|
||||||
|
ling_datum.chem_storage = 50
|
||||||
|
src.make_changeling() //And give back our freebies.
|
||||||
|
|
||||||
|
src << "<span class='notice'>We have removed our evolutions from this form, and are now ready to readapt.</span>"
|
||||||
|
|
||||||
|
//Now to lose the verb, so no unlimited resets.
|
||||||
|
src.verbs -= /mob/proc/changeling_respec
|
||||||
39
code/game/gamemodes/changeling/powers/revive.dm
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
//Revive from revival stasis
|
||||||
|
/mob/proc/changeling_revive()
|
||||||
|
set category = "Changeling"
|
||||||
|
set name = "Revive"
|
||||||
|
set desc = "We are ready to revive ourselves on command."
|
||||||
|
|
||||||
|
var/datum/changeling/changeling = changeling_power(0,0,100,DEAD)
|
||||||
|
if(!changeling)
|
||||||
|
return 0
|
||||||
|
|
||||||
|
if(src.stat == DEAD)
|
||||||
|
dead_mob_list -= src
|
||||||
|
living_mob_list += src
|
||||||
|
var/mob/living/carbon/C = src
|
||||||
|
|
||||||
|
C.tod = null
|
||||||
|
C.setToxLoss(0)
|
||||||
|
C.setOxyLoss(0)
|
||||||
|
C.setCloneLoss(0)
|
||||||
|
C.SetParalysis(0)
|
||||||
|
C.SetStunned(0)
|
||||||
|
C.SetWeakened(0)
|
||||||
|
C.radiation = 0
|
||||||
|
C.heal_overall_damage(C.getBruteLoss(), C.getFireLoss())
|
||||||
|
C.reagents.clear_reagents()
|
||||||
|
C.restore_all_organs() //Covers things like fractures and other things not covered by the above.
|
||||||
|
if(ishuman(C))
|
||||||
|
var/mob/living/carbon/human/H = src
|
||||||
|
H.restore_blood()
|
||||||
|
C << "<span class='notice'>We have regenerated.</span>"
|
||||||
|
C.status_flags &= ~(FAKEDEATH)
|
||||||
|
C.update_canmove()
|
||||||
|
C.mind.changeling.purchasedpowers -= C
|
||||||
|
feedback_add_details("changeling_powers","CR")
|
||||||
|
C.stat = CONSCIOUS
|
||||||
|
src.verbs -= /mob/proc/changeling_revive
|
||||||
|
// re-add out changeling powers
|
||||||
|
C.make_changeling()
|
||||||
|
return 1
|
||||||
56
code/game/gamemodes/changeling/powers/shriek.dm
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
/datum/power/changeling/resonant_shriek
|
||||||
|
name = "Resonant Shriek"
|
||||||
|
desc = "Our lungs and vocal chords shift, allowing us to briefly emit a noise that deafens and confuses the weak-minded biologicals and synthetics."
|
||||||
|
genomecost = 2
|
||||||
|
verbpath = /mob/proc/changeling_resonant_shriek
|
||||||
|
|
||||||
|
/datum/power/changeling/dissonant_shriek
|
||||||
|
name = "Dissonant Shriek"
|
||||||
|
desc = "We shift our vocal cords to release a high-frequency sound that overloads nearby electronics."
|
||||||
|
genomecost = 2
|
||||||
|
verbpath = /mob/proc/changeling_dissonant_shriek
|
||||||
|
|
||||||
|
//A flashy ability, good for crowd control and sewing chaos.
|
||||||
|
/mob/proc/changeling_resonant_shriek()
|
||||||
|
set category = "Changeling"
|
||||||
|
set name = "Resonant Shriek (20)"
|
||||||
|
set desc = "Emits a high-frequency sound that confuses and deafens humans, blows out nearby lights and overloads cyborg sensors."
|
||||||
|
|
||||||
|
var/datum/changeling/changeling = changeling_power(20,0,100,CONSCIOUS)
|
||||||
|
if(!changeling) return 0
|
||||||
|
changeling.chem_charges -= 20
|
||||||
|
|
||||||
|
for(var/mob/living/M in range(4, src))
|
||||||
|
if(iscarbon(M))
|
||||||
|
if(!M.mind || !M.mind.changeling)
|
||||||
|
M.adjustEarDamage(0,30)
|
||||||
|
M.confused += 20
|
||||||
|
else
|
||||||
|
M << sound('sound/effects/screech.ogg')
|
||||||
|
|
||||||
|
if(issilicon(M))
|
||||||
|
M << sound('sound/weapons/flash.ogg')
|
||||||
|
M.Weaken(rand(5,10))
|
||||||
|
|
||||||
|
for(var/obj/machinery/light/L in range(4, src))
|
||||||
|
L.on = 1
|
||||||
|
L.broken()
|
||||||
|
|
||||||
|
feedback_add_details("changeling_powers","RS")
|
||||||
|
return 1
|
||||||
|
|
||||||
|
//EMP version
|
||||||
|
/mob/proc/changeling_dissonant_shriek()
|
||||||
|
set category = "Changeling"
|
||||||
|
set name = "Dissonant Shriek (20)"
|
||||||
|
set desc = "We shift our vocal cords to release a high-frequency sound that overloads nearby electronics."
|
||||||
|
|
||||||
|
var/datum/changeling/changeling = changeling_power(20,0,100,CONSCIOUS)
|
||||||
|
if(!changeling) return 0
|
||||||
|
changeling.chem_charges -= 20
|
||||||
|
|
||||||
|
for(var/obj/machinery/light/L in range(5, src))
|
||||||
|
L.on = 1
|
||||||
|
L.broken()
|
||||||
|
empulse(get_turf(src), 2, 5, 1)
|
||||||
|
return 1
|
||||||
18
code/game/gamemodes/changeling/powers/silence_sting.dm
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
/datum/power/changeling/silence_sting
|
||||||
|
name = "Silence Sting"
|
||||||
|
desc = "We silently sting a human, completely silencing them for a short time."
|
||||||
|
helptext = "Does not provide a warning to a victim that they have been stung, until they try to speak and cannot."
|
||||||
|
genomecost = 2
|
||||||
|
allowduringlesserform = 1
|
||||||
|
verbpath = /mob/proc/changeling_silence_sting
|
||||||
|
|
||||||
|
/mob/proc/changeling_silence_sting()
|
||||||
|
set category = "Changeling"
|
||||||
|
set name = "Silence sting (10)"
|
||||||
|
set desc="Sting target"
|
||||||
|
|
||||||
|
var/mob/living/carbon/T = changeling_sting(10,/mob/proc/changeling_silence_sting)
|
||||||
|
if(!T) return 0
|
||||||
|
T.silent += 30
|
||||||
|
feedback_add_details("changeling_powers","SS")
|
||||||
|
return 1
|
||||||
85
code/game/gamemodes/changeling/powers/transform.dm
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
/datum/power/changeling/transform
|
||||||
|
name = "Transform"
|
||||||
|
desc = "We take on the apperance and voice of one we have absorbed."
|
||||||
|
genomecost = 0
|
||||||
|
verbpath = /mob/proc/changeling_transform
|
||||||
|
|
||||||
|
/datum/power/changeling/change_species
|
||||||
|
name = "Change Species"
|
||||||
|
desc = "We take on the apperance of a species that we have absorbed."
|
||||||
|
genomecost = 0
|
||||||
|
verbpath = /mob/proc/changeling_change_species
|
||||||
|
|
||||||
|
//Change our DNA to that of somebody we've absorbed.
|
||||||
|
/mob/proc/changeling_transform()
|
||||||
|
set category = "Changeling"
|
||||||
|
set name = "Transform (5)"
|
||||||
|
|
||||||
|
var/datum/changeling/changeling = changeling_power(5,1,0)
|
||||||
|
if(!changeling) return
|
||||||
|
|
||||||
|
var/list/names = list()
|
||||||
|
for(var/datum/dna/DNA in changeling.absorbed_dna)
|
||||||
|
names += "[DNA.real_name]"
|
||||||
|
|
||||||
|
var/S = input("Select the target DNA: ", "Target DNA", null) as null|anything in names
|
||||||
|
if(!S) return
|
||||||
|
|
||||||
|
var/datum/dna/chosen_dna = changeling.GetDNA(S)
|
||||||
|
if(!chosen_dna)
|
||||||
|
return
|
||||||
|
|
||||||
|
changeling.chem_charges -= 5
|
||||||
|
src.visible_message("<span class='warning'>[src] transforms!</span>")
|
||||||
|
changeling.geneticdamage = 30
|
||||||
|
src.dna = chosen_dna.Clone()
|
||||||
|
src.real_name = chosen_dna.real_name
|
||||||
|
src.flavor_text = ""
|
||||||
|
src.UpdateAppearance()
|
||||||
|
domutcheck(src, null)
|
||||||
|
|
||||||
|
src.verbs -= /mob/proc/changeling_transform
|
||||||
|
spawn(10) src.verbs += /mob/proc/changeling_transform
|
||||||
|
|
||||||
|
feedback_add_details("changeling_powers","TR")
|
||||||
|
return 1
|
||||||
|
|
||||||
|
//Used to switch species based on the changeling datum.
|
||||||
|
/mob/proc/changeling_change_species()
|
||||||
|
|
||||||
|
set category = "Changeling"
|
||||||
|
set name = "Change Species (5)"
|
||||||
|
|
||||||
|
var/mob/living/carbon/human/H = src
|
||||||
|
if(!istype(H))
|
||||||
|
src << "<span class='warning'>We may only use this power while in humanoid form.</span>"
|
||||||
|
return
|
||||||
|
|
||||||
|
var/datum/changeling/changeling = changeling_power(5,1,0)
|
||||||
|
if(!changeling) return
|
||||||
|
|
||||||
|
if(changeling.absorbed_species.len < 2)
|
||||||
|
src << "<span class='warning'>We do not know of any other species genomes to use.</span>"
|
||||||
|
return
|
||||||
|
|
||||||
|
var/S = input("Select the target species: ", "Target Species", null) as null|anything in changeling.absorbed_species
|
||||||
|
if(!S) return
|
||||||
|
|
||||||
|
domutcheck(src, null)
|
||||||
|
|
||||||
|
changeling.chem_charges -= 5
|
||||||
|
changeling.geneticdamage = 30
|
||||||
|
|
||||||
|
src.visible_message("<span class='warning'>[src] transforms!</span>")
|
||||||
|
|
||||||
|
src.verbs -= /mob/proc/changeling_change_species
|
||||||
|
H.set_species(S,1) //Until someone moves body colour into DNA, they're going to have to use the default.
|
||||||
|
|
||||||
|
spawn(10)
|
||||||
|
src.verbs += /mob/proc/changeling_change_species
|
||||||
|
src.regenerate_icons()
|
||||||
|
|
||||||
|
changeling_update_languages(changeling.absorbed_languages)
|
||||||
|
feedback_add_details("changeling_powers","TR")
|
||||||
|
|
||||||
|
return 1
|
||||||
44
code/game/gamemodes/changeling/powers/transform_sting.dm
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
//Suggested to leave unchecked because this is why we can't have nice things.
|
||||||
|
/datum/power/changeling/transformation_sting
|
||||||
|
name = "Transformation Sting"
|
||||||
|
desc = "We silently sting a human, injecting a retrovirus that forces them to transform into another."
|
||||||
|
helptext = "Does not provide a warning to others. The victim will transform much like a changeling would."
|
||||||
|
genomecost = 3
|
||||||
|
verbpath = /mob/proc/changeling_transformation_sting
|
||||||
|
|
||||||
|
/mob/proc/changeling_transformation_sting()
|
||||||
|
set category = "Changeling"
|
||||||
|
set name = "Transformation sting (40)"
|
||||||
|
set desc="Sting target"
|
||||||
|
|
||||||
|
var/datum/changeling/changeling = changeling_power(40)
|
||||||
|
if(!changeling)
|
||||||
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
var/list/names = list()
|
||||||
|
for(var/datum/dna/DNA in changeling.absorbed_dna)
|
||||||
|
names += "[DNA.real_name]"
|
||||||
|
|
||||||
|
var/S = input("Select the target DNA: ", "Target DNA", null) as null|anything in names
|
||||||
|
if(!S)
|
||||||
|
return
|
||||||
|
|
||||||
|
var/datum/dna/chosen_dna = changeling.GetDNA(S)
|
||||||
|
if(!chosen_dna)
|
||||||
|
return
|
||||||
|
|
||||||
|
var/mob/living/carbon/T = changeling_sting(40,/mob/proc/changeling_transformation_sting)
|
||||||
|
if(!T)
|
||||||
|
return 0
|
||||||
|
if((HUSK in T.mutations) || (!ishuman(T) && !issmall(T)))
|
||||||
|
src << "<span class='warning'>Our sting appears ineffective against its DNA.</span>"
|
||||||
|
return 0
|
||||||
|
T.visible_message("<span class='warning'>[T] transforms!</span>")
|
||||||
|
T.dna = chosen_dna.Clone()
|
||||||
|
T.real_name = chosen_dna.real_name
|
||||||
|
T.UpdateAppearance()
|
||||||
|
domutcheck(T, null)
|
||||||
|
feedback_add_details("changeling_powers","TS")
|
||||||
|
return 1
|
||||||
18
code/game/gamemodes/changeling/powers/unfat_sting.dm
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
/datum/power/changeling/unfat_sting
|
||||||
|
name = "Unfat Sting"
|
||||||
|
desc = "We silently sting a human, forcing them to rapidly metabolize their fat."
|
||||||
|
genomecost = 1
|
||||||
|
verbpath = /mob/proc/changeling_unfat_sting
|
||||||
|
|
||||||
|
/mob/proc/changeling_unfat_sting()
|
||||||
|
set category = "Changeling"
|
||||||
|
set name = "Unfat sting (5)"
|
||||||
|
set desc = "Sting target"
|
||||||
|
|
||||||
|
var/mob/living/carbon/T = changeling_sting(5,/mob/proc/changeling_unfat_sting)
|
||||||
|
if(!T) return 0
|
||||||
|
T << "<span class='danger'>you feel a small prick as stomach churns violently and you become to feel skinnier.</span>"
|
||||||
|
T.overeatduration = 0
|
||||||
|
T.nutrition -= 100
|
||||||
|
feedback_add_details("changeling_powers","US")
|
||||||
|
return 1
|
||||||
@@ -114,7 +114,7 @@
|
|||||||
playsound(loc, "sparks", 50, 1, -1)
|
playsound(loc, "sparks", 50, 1, -1)
|
||||||
if (shock_damage > 15)
|
if (shock_damage > 15)
|
||||||
src.visible_message(
|
src.visible_message(
|
||||||
"\red [src] was shocked by the [source]!", \
|
"\red [src] was shocked by \the [source]!", \
|
||||||
"\red <B>You feel a powerful shock course through your body!</B>", \
|
"\red <B>You feel a powerful shock course through your body!</B>", \
|
||||||
"\red You hear a heavy electrical crack." \
|
"\red You hear a heavy electrical crack." \
|
||||||
)
|
)
|
||||||
@@ -122,7 +122,7 @@
|
|||||||
Weaken(10)
|
Weaken(10)
|
||||||
else
|
else
|
||||||
src.visible_message(
|
src.visible_message(
|
||||||
"\red [src] was mildly shocked by the [source].", \
|
"\red [src] was mildly shocked by \the [source].", \
|
||||||
"\red You feel a mild shock course through your body.", \
|
"\red You feel a mild shock course through your body.", \
|
||||||
"\red You hear a light zapping." \
|
"\red You hear a light zapping." \
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -127,6 +127,11 @@
|
|||||||
break_to_parts()
|
break_to_parts()
|
||||||
return
|
return
|
||||||
|
|
||||||
|
if(istype(W, /obj/item/weapon/melee/arm_blade))
|
||||||
|
user.visible_message("<span class='danger'>\The [src] was sliced apart by [user]!</span>")
|
||||||
|
break_to_parts()
|
||||||
|
return
|
||||||
|
|
||||||
if(can_plate && !material)
|
if(can_plate && !material)
|
||||||
user << "<span class='warning'>There's nothing to put \the [W] on! Try adding plating to \the [src] first.</span>"
|
user << "<span class='warning'>There's nothing to put \the [W] on! Try adding plating to \the [src] first.</span>"
|
||||||
return
|
return
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 135 KiB After Width: | Height: | Size: 136 KiB |
|
Before Width: | Height: | Size: 105 KiB After Width: | Height: | Size: 110 KiB |
|
Before Width: | Height: | Size: 105 KiB After Width: | Height: | Size: 110 KiB |
|
Before Width: | Height: | Size: 288 KiB After Width: | Height: | Size: 293 KiB |
|
Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 63 KiB |
|
Before Width: | Height: | Size: 102 KiB After Width: | Height: | Size: 104 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 28 KiB |
26
polaris.dme
@@ -287,7 +287,33 @@
|
|||||||
#include "code\game\gamemodes\calamity\calamity.dm"
|
#include "code\game\gamemodes\calamity\calamity.dm"
|
||||||
#include "code\game\gamemodes\changeling\changeling.dm"
|
#include "code\game\gamemodes\changeling\changeling.dm"
|
||||||
#include "code\game\gamemodes\changeling\changeling_powers.dm"
|
#include "code\game\gamemodes\changeling\changeling_powers.dm"
|
||||||
|
#include "code\game\gamemodes\changeling\generic_equip_procs.dm"
|
||||||
#include "code\game\gamemodes\changeling\modularchangling.dm"
|
#include "code\game\gamemodes\changeling\modularchangling.dm"
|
||||||
|
#include "code\game\gamemodes\changeling\powers\absorb.dm"
|
||||||
|
#include "code\game\gamemodes\changeling\powers\armblade.dm"
|
||||||
|
#include "code\game\gamemodes\changeling\powers\armor.dm"
|
||||||
|
#include "code\game\gamemodes\changeling\powers\bioelectrogenesis.dm"
|
||||||
|
#include "code\game\gamemodes\changeling\powers\blind_sting.dm"
|
||||||
|
#include "code\game\gamemodes\changeling\powers\boost_range.dm"
|
||||||
|
#include "code\game\gamemodes\changeling\powers\cryo_sting.dm"
|
||||||
|
#include "code\game\gamemodes\changeling\powers\deaf_sting.dm"
|
||||||
|
#include "code\game\gamemodes\changeling\powers\digital_camo.dm"
|
||||||
|
#include "code\game\gamemodes\changeling\powers\engorged_glands.dm"
|
||||||
|
#include "code\game\gamemodes\changeling\powers\epinephrine_overdose.dm"
|
||||||
|
#include "code\game\gamemodes\changeling\powers\extract_dna_sting.dm"
|
||||||
|
#include "code\game\gamemodes\changeling\powers\fake_death.dm"
|
||||||
|
#include "code\game\gamemodes\changeling\powers\fleshmend.dm"
|
||||||
|
#include "code\game\gamemodes\changeling\powers\hivemind.dm"
|
||||||
|
#include "code\game\gamemodes\changeling\powers\lesser_form.dm"
|
||||||
|
#include "code\game\gamemodes\changeling\powers\mimic_voice.dm"
|
||||||
|
#include "code\game\gamemodes\changeling\powers\panacea.dm"
|
||||||
|
#include "code\game\gamemodes\changeling\powers\para_sting.dm"
|
||||||
|
#include "code\game\gamemodes\changeling\powers\rapid_regen.dm"
|
||||||
|
#include "code\game\gamemodes\changeling\powers\respec.dm"
|
||||||
|
#include "code\game\gamemodes\changeling\powers\revive.dm"
|
||||||
|
#include "code\game\gamemodes\changeling\powers\shriek.dm"
|
||||||
|
#include "code\game\gamemodes\changeling\powers\silence_sting.dm"
|
||||||
|
#include "code\game\gamemodes\changeling\powers\transform.dm"
|
||||||
#include "code\game\gamemodes\cult\cult.dm"
|
#include "code\game\gamemodes\cult\cult.dm"
|
||||||
#include "code\game\gamemodes\cult\cult_items.dm"
|
#include "code\game\gamemodes\cult\cult_items.dm"
|
||||||
#include "code\game\gamemodes\cult\cult_structures.dm"
|
#include "code\game\gamemodes\cult\cult_structures.dm"
|
||||||
|
|||||||