mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2025-12-24 00:51:26 +00:00
512 lines
16 KiB
Plaintext
512 lines
16 KiB
Plaintext
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
|
|
var/name = "Power"
|
|
var/desc = "Placeholder"
|
|
var/helptext = ""
|
|
var/isVerb = TRUE //Is it an active or passive power?
|
|
var/verbpath //Path to a verb that contains the effects.
|
|
|
|
/datum/power/changeling
|
|
var/allowduringlesserform = FALSE
|
|
var/genomecost = 69420 // Cost for the changling to evolve this power.
|
|
|
|
//DNA absorption
|
|
|
|
/datum/power/changeling/absorb_dna
|
|
name = "Absorb DNA"
|
|
desc = "Permits us to forcibly absorb a massive quantity DNA from another sentient creature. They will perish during the process, and we become stronger, especially if they were another changeling. Have caution, this takes some time."
|
|
genomecost = 0
|
|
verbpath = /mob/proc/changeling_absorb_dna
|
|
|
|
// Accent Mimicry
|
|
|
|
/datum/power/changeling/mimic_accent
|
|
name = "Mimic Accent"
|
|
desc = "Allows us to shape our vocal glands to adopt a specific accent."
|
|
helptext = "Allows you to pick any accent from the list of all accents. Be mindful that you need to match the correct accent to pretend to be your victim."
|
|
genomecost = 0
|
|
verbpath = /mob/proc/changeling_mimic_accent
|
|
|
|
//Transformation
|
|
|
|
/datum/power/changeling/transform
|
|
name = "Transform"
|
|
desc = "We permanently take on the appearance and voice of one we have absorbed."
|
|
genomecost = 0
|
|
verbpath = /mob/proc/changeling_transform
|
|
|
|
/datum/power/changeling/lesser_form
|
|
name = "Lesser Form"
|
|
desc = "We debase ourselves and become lesser. We become a weaker, but more mobile form."
|
|
genomecost = 2
|
|
verbpath = /mob/proc/changeling_lesser_form
|
|
|
|
/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/fakedeath
|
|
name = "Regenerative Stasis"
|
|
desc = "We fake our own death, imperceptible to even the best of doctors. We can choose when to re-animate."
|
|
helptext = "Can be used before or after death. Duration varies greatly."
|
|
genomecost = 0
|
|
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/hivemind_commune
|
|
name = "Hivemind Commune"
|
|
desc = "We can speak with the members of our Hivemind, without it being apparent to the people in our view."
|
|
genomecost = 0
|
|
verbpath = /mob/proc/changeling_hivemind_commune
|
|
|
|
/datum/power/changeling/hivemind_eject
|
|
name = "Hivemind Eject"
|
|
desc = "We can eject a pesky hivemind from ourselves, if it complains a lot. This won't free up space, but will prevent them from screaming at us."
|
|
helptext = "Ghosts the chosen hivemind. Use it on salty people spamming you to send them to deadchat."
|
|
genomecost = 0
|
|
verbpath = /mob/proc/changeling_eject_hivemind
|
|
|
|
/datum/power/changeling/hivemind_morph
|
|
name = "Hivemind Release Morph"
|
|
desc = "We release a hivemind member as a morph at the cost of a limb. They will be able to crawl inside vents and disguise themselves as objects."
|
|
genomecost = 2
|
|
verbpath = /mob/living/carbon/human/proc/changeling_release_morph
|
|
|
|
//Stings and sting accessorries
|
|
//Rest in pieces, unfat sting. - Geeves
|
|
|
|
/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/deaf_sting
|
|
name = "Deaf Sting"
|
|
desc = "We sting a human, completely deafening them for a short time."
|
|
genomecost = 1
|
|
allowduringlesserform = TRUE
|
|
verbpath = /mob/proc/changeling_deaf_sting
|
|
|
|
/datum/power/changeling/blind_sting
|
|
name = "Blind Sting"
|
|
desc = "We sting a human, completely blinding them for a short time."
|
|
genomecost = 2
|
|
allowduringlesserform = TRUE
|
|
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 = TRUE
|
|
verbpath = /mob/proc/changeling_silence_sting
|
|
|
|
/datum/power/changeling/transformation_sting
|
|
name = "Transformation Sting"
|
|
desc = "We silently sting a dead 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 sting a human, paralyzing them for a short time."
|
|
genomecost = 8
|
|
verbpath = /mob/proc/changeling_paralysis_sting
|
|
|
|
/datum/power/changeling/hallucinate_sting
|
|
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 five to fifteen seconds."
|
|
genomecost = 3
|
|
verbpath = /mob/proc/changeling_hallucinate_sting
|
|
|
|
/datum/power/changeling/death_sting
|
|
name = "Death Sting"
|
|
desc = "We sting a human, transfering five units of cyanide. Their death is likely, unless immediate intervention occurs."
|
|
genomecost = 10
|
|
verbpath = /mob/proc/changeling_death_sting
|
|
|
|
//Chems and stuff
|
|
|
|
/datum/power/changeling/adrenaline_sacs
|
|
name = "Adrenaline Sacs"
|
|
desc = "We evolve additional ways of producing stimulants throughout our body."
|
|
helptext = "Gives us the ability to instantly shrug off stuns, as well as producing some painkiller and stimulants."
|
|
genomecost = 3
|
|
verbpath = /mob/proc/changeling_unstun
|
|
|
|
/datum/power/changeling/ChemicalSynth
|
|
name = "UPGRADE: Rapid Chemical-Synthesis"
|
|
desc = "We evolve new pathways for producing our necessary chemicals, permitting us to naturally create them faster."
|
|
helptext = "More than doubles the rate at which we naturally recharge chemicals."
|
|
genomecost = 4
|
|
isVerb = FALSE
|
|
verbpath = /mob/proc/changeling_fastchemical
|
|
|
|
/datum/power/changeling/engorged_glands
|
|
name = "UPGRADE: Engorged Chemical Glands"
|
|
desc = "Our chemical glands swell, permitting us to store more chemicals inside of them."
|
|
helptext = "Allows us to store an extra fifty units of chemicals."
|
|
genomecost = 4
|
|
isVerb = FALSE
|
|
verbpath = /mob/proc/changeling_engorgedglands
|
|
|
|
/datum/power/changeling/rapid_regeneration
|
|
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
|
|
|
|
//misc
|
|
|
|
/datum/power/changeling/digital_camouflage
|
|
name = "Digital Camouflage"
|
|
desc = "We evolve the ability to distort our form and proportions, defeating common algorithms used to detect lifeforms on cameras."
|
|
helptext = "An artificial intelligence will not be able to track our movements while we do this. However, anyone looking at us will find us.. uncanny. We must constantly expend chemicals to maintain our form like this."
|
|
genomecost = 1
|
|
allowduringlesserform = TRUE
|
|
verbpath = /mob/proc/changeling_digitalcamo
|
|
|
|
//weapon and armor like powers
|
|
|
|
/datum/power/changeling/armblades
|
|
name = "Mutate Armblades"
|
|
desc = "Permits us to reshape our arms into a deadly blade."
|
|
genomecost = 4
|
|
verbpath = /mob/proc/armblades
|
|
|
|
/datum/power/changeling/shield
|
|
name = "Mutate Shield"
|
|
desc = "Permits us to bloat our hands into a robust shield."
|
|
genomecost = 3
|
|
verbpath = /mob/proc/changeling_shield
|
|
|
|
/datum/power/changeling/horror_form
|
|
name = "Horror Form"
|
|
desc = "We tear apart our human disguise, revealing our true form."
|
|
helptext = "We will return to our current form after ten minutes."
|
|
genomecost = 15
|
|
verbpath = /mob/proc/horror_form
|
|
|
|
// Modularchangling, totally stolen from the new player panel. YAYY
|
|
//I'm too afraid to touch this, you win this time, oldcode - Geeves
|
|
// After an HTML course, I finally conquered this. Convert into VueUi eventually. - Geeves
|
|
/datum/changeling/proc/EvolutionMenu()//The new one
|
|
set category = "Changeling"
|
|
set desc = "Buy new abilities with the genomes we obtained."
|
|
|
|
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\];
|
|
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 color='#79d39e' size='2'>"+desc+"</font><br>";
|
|
|
|
if(helptext) {
|
|
body += "<font color='#f14c46' size='2'>"+helptext+"</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> ";
|
|
}
|
|
|
|
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 = "";
|
|
}
|
|
|
|
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 = "#2b2b2b"
|
|
if(i%2 == 0)
|
|
color = "#363636"
|
|
|
|
|
|
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>
|
|
<font color='#505dcf' id='link[i]' onmouseover='expand("item[i]","[html_encode(P.name)]","[html_encode(P.desc)]","[html_encode(P.helptext)]","[P]",[ownsthis])'><span id='search[i]'><b>Evolve [P] - Cost: [ownsthis ? "Purchased" : P.genomecost]</b></span></font>
|
|
<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>
|
|
"}
|
|
|
|
var/datum/browser/power_win = new(usr, "powers", "Changeling Powers", 900, 480)
|
|
power_win.set_content(dat)
|
|
power_win.open()
|
|
|
|
|
|
/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/power_name, var/remake_verbs = 1)
|
|
if(!M || !M.changeling)
|
|
return
|
|
|
|
var/datum/power/changeling/power = power_name
|
|
|
|
for (var/datum/power/changeling/P in powerinstances)
|
|
if(P.name == power_name)
|
|
power = P
|
|
break
|
|
|
|
if(power == null)
|
|
to_chat(M.current, "This is awkward. Changeling power purchase failed, please report this bug to a coder!")
|
|
return
|
|
if(power in purchasedpowers)
|
|
to_chat(M.current, "We have already evolved this ability!")
|
|
return
|
|
if(geneticpoints < power.genomecost)
|
|
to_chat(M.current, "We cannot evolve this. We must acquire more DNA.")
|
|
return
|
|
|
|
geneticpoints -= power.genomecost
|
|
|
|
purchasedpowers += power
|
|
|
|
if(!power.isVerb && power.verbpath)
|
|
call(M.current, power.verbpath)()
|
|
else if(remake_verbs)
|
|
M.current.make_changeling()
|
|
|