mirror of
https://github.com/Aurorastation/Aurora-Old.git
synced 2026-07-16 02:02:20 +01:00
bac5f3e6c0
changeling sword arms + riot shield growth abilities. as far as i can tell, bug free. forcegloves: see thread on forum for details. i personally think it's a great idea to make them standard issue for sec or at least put them in the armoury. they amp melee damage (varedit amplification if you want ingame shenanigans with them) and also interact with harm-grab-disarm.
518 lines
15 KiB
Plaintext
518 lines
15 KiB
Plaintext
// READ: Don't use the apostrophe in name or desc. Causes script errors.
|
|
|
|
var/list/powers = typesof(/datum/power/changeling) - /datum/power/changeling //needed for the badmin verb for now
|
|
var/list/datum/power/changeling/powerinstances = list()
|
|
|
|
/datum/power //Could be used by other antags too
|
|
var/name = "Power"
|
|
var/desc = "Placeholder"
|
|
var/helptext = ""
|
|
var/isVerb = 1 // Is it an active power, or passive?
|
|
var/verbpath // Path to a verb that contains the effects.
|
|
|
|
/datum/power/changeling
|
|
var/allowduringlesserform = 0
|
|
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 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 = "Blinding Sting"
|
|
desc = "With this, we completely blind a human for a short time."
|
|
genomecost = 2
|
|
allowduringlesserform = 1
|
|
verbpath = /mob/proc/changeling_blind_sting
|
|
|
|
/datum/power/changeling/silence_sting
|
|
name = "Silence Sting"
|
|
desc = "We 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 impale 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
|
|
|
|
/datum/power/changeling/armblades
|
|
name = "Mutate Armblades"
|
|
desc = "Permits us to reshape our arms into a deadly blade."
|
|
genomecost = 1
|
|
verbpath = /mob/proc/armblades
|
|
|
|
/datum/power/changeling/changeling_shield
|
|
name = "Mutate Shield"
|
|
desc = "Permits us to bloat our hands into a robust shield."
|
|
genomecost = 3
|
|
verbpath = /mob/proc/changeling_shield
|
|
|
|
|
|
// Modularchangling, totally stolen from the new player panel. YAYY
|
|
/datum/changeling/proc/EvolutionMenu()//The new one
|
|
set category = "Changeling"
|
|
set desc = "Level up!"
|
|
|
|
if(!usr || !usr.mind || !usr.mind.changeling) return
|
|
src = usr.mind.changeling
|
|
|
|
if(!powerinstances.len)
|
|
for(var/P in powers)
|
|
powerinstances += new P()
|
|
|
|
var/dat = "<html><head><title>Changling Evolution Menu</title></head>"
|
|
|
|
//javascript, the part that does most of the work~
|
|
dat += {"
|
|
|
|
<head>
|
|
<script type='text/javascript'>
|
|
|
|
var locked_tabs = new Array();
|
|
|
|
function updateSearch(){
|
|
|
|
|
|
var filter_text = document.getElementById('filter');
|
|
var filter = filter_text.value.toLowerCase();
|
|
|
|
if(complete_list != null && complete_list != ""){
|
|
var mtbl = document.getElementById("maintable_data_archive");
|
|
mtbl.innerHTML = complete_list;
|
|
}
|
|
|
|
if(filter.value == ""){
|
|
return;
|
|
}else{
|
|
|
|
var maintable_data = document.getElementById('maintable_data');
|
|
var ltr = maintable_data.getElementsByTagName("tr");
|
|
for ( var i = 0; i < ltr.length; ++i )
|
|
{
|
|
try{
|
|
var tr = ltr\[i\];
|
|
if(tr.getAttribute("id").indexOf("data") != 0){
|
|
continue;
|
|
}
|
|
var ltd = tr.getElementsByTagName("td");
|
|
var td = ltd\[0\];
|
|
var lsearch = td.getElementsByTagName("b");
|
|
var search = lsearch\[0\];
|
|
//var inner_span = li.getElementsByTagName("span")\[1\] //Should only ever contain one element.
|
|
//document.write("<p>"+search.innerText+"<br>"+filter+"<br>"+search.innerText.indexOf(filter))
|
|
if ( search.innerText.toLowerCase().indexOf(filter) == -1 )
|
|
{
|
|
//document.write("a");
|
|
//ltr.removeChild(tr);
|
|
td.innerHTML = "";
|
|
i--;
|
|
}
|
|
}catch(err) { }
|
|
}
|
|
}
|
|
|
|
var count = 0;
|
|
var index = -1;
|
|
var debug = document.getElementById("debug");
|
|
|
|
locked_tabs = new Array();
|
|
|
|
}
|
|
|
|
function expand(id,name,desc,helptext,power,ownsthis){
|
|
|
|
clearAll();
|
|
|
|
var span = document.getElementById(id);
|
|
|
|
body = "<table><tr><td>";
|
|
|
|
body += "</td><td align='center'>";
|
|
|
|
body += "<font size='2'><b>"+desc+"</b></font> <BR>"
|
|
|
|
body += "<font size='2'><font color = 'red'><b>"+helptext+"</b></font> <BR>"
|
|
|
|
if(!ownsthis)
|
|
{
|
|
body += "<a href='?src=\ref[src];P="+power+"'>Evolve</a>"
|
|
}
|
|
|
|
body += "</td><td align='center'>";
|
|
|
|
body += "</td></tr></table>";
|
|
|
|
|
|
span.innerHTML = body
|
|
}
|
|
|
|
function clearAll(){
|
|
var spans = document.getElementsByTagName('span');
|
|
for(var i = 0; i < spans.length; i++){
|
|
var span = spans\[i\];
|
|
|
|
var id = span.getAttribute("id");
|
|
|
|
if(!(id.indexOf("item")==0))
|
|
continue;
|
|
|
|
var pass = 1;
|
|
|
|
for(var j = 0; j < locked_tabs.length; j++){
|
|
if(locked_tabs\[j\]==id){
|
|
pass = 0;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(pass != 1)
|
|
continue;
|
|
|
|
|
|
|
|
|
|
span.innerHTML = "";
|
|
}
|
|
}
|
|
|
|
function addToLocked(id,link_id,notice_span_id){
|
|
var link = document.getElementById(link_id);
|
|
var decision = link.getAttribute("name");
|
|
if(decision == "1"){
|
|
link.setAttribute("name","2");
|
|
}else{
|
|
link.setAttribute("name","1");
|
|
removeFromLocked(id,link_id,notice_span_id);
|
|
return;
|
|
}
|
|
|
|
var pass = 1;
|
|
for(var j = 0; j < locked_tabs.length; j++){
|
|
if(locked_tabs\[j\]==id){
|
|
pass = 0;
|
|
break;
|
|
}
|
|
}
|
|
if(!pass)
|
|
return;
|
|
locked_tabs.push(id);
|
|
var notice_span = document.getElementById(notice_span_id);
|
|
notice_span.innerHTML = "<font color='red'>Locked</font> ";
|
|
//link.setAttribute("onClick","attempt('"+id+"','"+link_id+"','"+notice_span_id+"');");
|
|
//document.write("removeFromLocked('"+id+"','"+link_id+"','"+notice_span_id+"')");
|
|
//document.write("aa - "+link.getAttribute("onClick"));
|
|
}
|
|
|
|
function attempt(ab){
|
|
return ab;
|
|
}
|
|
|
|
function removeFromLocked(id,link_id,notice_span_id){
|
|
//document.write("a");
|
|
var index = 0;
|
|
var pass = 0;
|
|
for(var j = 0; j < locked_tabs.length; j++){
|
|
if(locked_tabs\[j\]==id){
|
|
pass = 1;
|
|
index = j;
|
|
break;
|
|
}
|
|
}
|
|
if(!pass)
|
|
return;
|
|
locked_tabs\[index\] = "";
|
|
var notice_span = document.getElementById(notice_span_id);
|
|
notice_span.innerHTML = "";
|
|
//var link = document.getElementById(link_id);
|
|
//link.setAttribute("onClick","addToLocked('"+id+"','"+link_id+"','"+notice_span_id+"')");
|
|
}
|
|
|
|
function selectTextField(){
|
|
var filter_text = document.getElementById('filter');
|
|
filter_text.focus();
|
|
filter_text.select();
|
|
}
|
|
|
|
</script>
|
|
</head>
|
|
|
|
|
|
"}
|
|
|
|
//body tag start + onload and onkeypress (onkeyup) javascript event calls
|
|
dat += "<body onload='selectTextField(); updateSearch();' onkeyup='updateSearch();'>"
|
|
|
|
//title + search bar
|
|
dat += {"
|
|
|
|
<table width='560' align='center' cellspacing='0' cellpadding='5' id='maintable'>
|
|
<tr id='title_tr'>
|
|
<td align='center'>
|
|
<font size='5'><b>Changling Evolution Menu</b></font><br>
|
|
Hover over a power to see more information<br>
|
|
Current evolution points left to evolve with: [geneticpoints]<br>
|
|
Absorb genomes to acquire more evolution points
|
|
<p>
|
|
</td>
|
|
</tr>
|
|
<tr id='search_tr'>
|
|
<td align='center'>
|
|
<b>Search:</b> <input type='text' id='filter' value='' style='width:300px;'>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
|
|
"}
|
|
|
|
//player table header
|
|
dat += {"
|
|
<span id='maintable_data_archive'>
|
|
<table width='560' align='center' cellspacing='0' cellpadding='5' id='maintable_data'>"}
|
|
|
|
var/i = 1
|
|
for(var/datum/power/changeling/P in powerinstances)
|
|
var/ownsthis = 0
|
|
|
|
if(P in purchasedpowers)
|
|
ownsthis = 1
|
|
|
|
|
|
var/color = "#e6e6e6"
|
|
if(i%2 == 0)
|
|
color = "#f2f2f2"
|
|
|
|
|
|
dat += {"
|
|
|
|
<tr id='data[i]' name='[i]' onClick="addToLocked('item[i]','data[i]','notice_span[i]')">
|
|
<td align='center' bgcolor='[color]'>
|
|
<span id='notice_span[i]'></span>
|
|
<a id='link[i]'
|
|
onmouseover='expand("item[i]","[P.name]","[P.desc]","[P.helptext]","[P]",[ownsthis])'
|
|
>
|
|
<b id='search[i]'>Evolve [P] - Cost: [ownsthis ? "Purchased" : P.genomecost]</b>
|
|
</a>
|
|
<br><span id='item[i]'></span>
|
|
</td>
|
|
</tr>
|
|
|
|
"}
|
|
|
|
i++
|
|
|
|
|
|
//player table ending
|
|
dat += {"
|
|
</table>
|
|
</span>
|
|
|
|
<script type='text/javascript'>
|
|
var maintable = document.getElementById("maintable_data_archive");
|
|
var complete_list = maintable.innerHTML;
|
|
</script>
|
|
</body></html>
|
|
"}
|
|
|
|
usr << browse(dat, "window=powers;size=900x480")
|
|
|
|
|
|
/datum/changeling/Topic(href, href_list)
|
|
..()
|
|
if(!ismob(usr))
|
|
return
|
|
|
|
if(href_list["P"])
|
|
var/datum/mind/M = usr.mind
|
|
if(!istype(M))
|
|
return
|
|
purchasePower(M, href_list["P"])
|
|
call(/datum/changeling/proc/EvolutionMenu)()
|
|
|
|
|
|
|
|
/datum/changeling/proc/purchasePower(var/datum/mind/M, var/Pname, var/remake_verbs = 1)
|
|
if(!M || !M.changeling)
|
|
return
|
|
|
|
var/datum/power/changeling/Thepower = Pname
|
|
|
|
|
|
for (var/datum/power/changeling/P in powerinstances)
|
|
//world << "[P] - [Pname] = [P.name == Pname ? "True" : "False"]"
|
|
if(P.name == Pname)
|
|
Thepower = P
|
|
break
|
|
|
|
|
|
if(Thepower == null)
|
|
M.current << "This is awkward. Changeling power purchase failed, please report this bug to a coder!"
|
|
return
|
|
|
|
if(Thepower in purchasedpowers)
|
|
M.current << "We have already evolved this ability!"
|
|
return
|
|
|
|
|
|
if(geneticpoints < Thepower.genomecost)
|
|
M.current << "We cannot evolve this... yet. We must acquire more DNA."
|
|
return
|
|
|
|
geneticpoints -= Thepower.genomecost
|
|
|
|
purchasedpowers += Thepower
|
|
|
|
if(!Thepower.isVerb && Thepower.verbpath)
|
|
call(M.current, Thepower.verbpath)()
|
|
else if(remake_verbs)
|
|
M.current.make_changeling()
|
|
|