mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-10 18:22:39 +00:00
Removed some cocked up files.
This commit is contained in:
@@ -1,988 +0,0 @@
|
|||||||
|
|
||||||
// reference: /client/proc/modify_variables(var/atom/O, var/param_var_name = null, var/autodetect_class = 0)
|
|
||||||
|
|
||||||
client
|
|
||||||
proc/debug_variables(datum/D in world)
|
|
||||||
set category = "Debug"
|
|
||||||
set name = "View Variables"
|
|
||||||
//set src in world
|
|
||||||
|
|
||||||
|
|
||||||
if(!usr.client || !usr.client.holder)
|
|
||||||
usr << "\red You need to be an administrator to access this."
|
|
||||||
return
|
|
||||||
|
|
||||||
|
|
||||||
var/title = ""
|
|
||||||
var/body = ""
|
|
||||||
|
|
||||||
if(!D) return
|
|
||||||
if(istype(D, /atom))
|
|
||||||
var/atom/A = D
|
|
||||||
title = "[A.name] (\ref[A]) = [A.type]"
|
|
||||||
|
|
||||||
#ifdef VARSICON
|
|
||||||
if (A.icon)
|
|
||||||
body += debug_variable("icon", new/icon(A.icon, A.icon_state, A.dir), 0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
var/icon/sprite
|
|
||||||
|
|
||||||
if(istype(D,/atom))
|
|
||||||
var/atom/AT = D
|
|
||||||
if(AT.icon && AT.icon_state)
|
|
||||||
sprite = new /icon(AT.icon, AT.icon_state)
|
|
||||||
usr << browse_rsc(sprite, "view_vars_sprite.png")
|
|
||||||
|
|
||||||
title = "[D] (\ref[D]) = [D.type]"
|
|
||||||
|
|
||||||
body += {"<script type="text/javascript">
|
|
||||||
|
|
||||||
function updateSearch(){
|
|
||||||
var filter_text = document.getElementById('filter');
|
|
||||||
var filter = filter_text.value.toLowerCase();
|
|
||||||
|
|
||||||
if(event.keyCode == 13){ //Enter / return
|
|
||||||
var vars_ol = document.getElementById('vars');
|
|
||||||
var lis = vars_ol.getElementsByTagName("li");
|
|
||||||
for ( var i = 0; i < lis.length; ++i )
|
|
||||||
{
|
|
||||||
try{
|
|
||||||
var li = lis\[i\];
|
|
||||||
if ( li.style.backgroundColor == "#ffee88" )
|
|
||||||
{
|
|
||||||
alist = lis\[i\].getElementsByTagName("a")
|
|
||||||
if(alist.length > 0){
|
|
||||||
location.href=alist\[0\].href;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}catch(err) { }
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if(event.keyCode == 38){ //Up arrow
|
|
||||||
var vars_ol = document.getElementById('vars');
|
|
||||||
var lis = vars_ol.getElementsByTagName("li");
|
|
||||||
for ( var i = 0; i < lis.length; ++i )
|
|
||||||
{
|
|
||||||
try{
|
|
||||||
var li = lis\[i\];
|
|
||||||
if ( li.style.backgroundColor == "#ffee88" )
|
|
||||||
{
|
|
||||||
if( (i-1) >= 0){
|
|
||||||
var li_new = lis\[i-1\];
|
|
||||||
li.style.backgroundColor = "white";
|
|
||||||
li_new.style.backgroundColor = "#ffee88";
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}catch(err) { }
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if(event.keyCode == 40){ //Down arrow
|
|
||||||
var vars_ol = document.getElementById('vars');
|
|
||||||
var lis = vars_ol.getElementsByTagName("li");
|
|
||||||
for ( var i = 0; i < lis.length; ++i )
|
|
||||||
{
|
|
||||||
try{
|
|
||||||
var li = lis\[i\];
|
|
||||||
if ( li.style.backgroundColor == "#ffee88" )
|
|
||||||
{
|
|
||||||
if( (i+1) < lis.length){
|
|
||||||
var li_new = lis\[i+1\];
|
|
||||||
li.style.backgroundColor = "white";
|
|
||||||
li_new.style.backgroundColor = "#ffee88";
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}catch(err) { }
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
//This part here resets everything to how it was at the start so the filter is applied to the complete list. Screw efficiency, it's client-side anyway and it only looks through 200 or so variables at maximum anyway (mobs).
|
|
||||||
if(complete_list != null && complete_list != ""){
|
|
||||||
var vars_ol1 = document.getElementById("vars");
|
|
||||||
vars_ol1.innerHTML = complete_list
|
|
||||||
}
|
|
||||||
|
|
||||||
if(filter.value == ""){
|
|
||||||
return;
|
|
||||||
}else{
|
|
||||||
var vars_ol = document.getElementById('vars');
|
|
||||||
var lis = vars_ol.getElementsByTagName("li");
|
|
||||||
|
|
||||||
for ( var i = 0; i < lis.length; ++i )
|
|
||||||
{
|
|
||||||
try{
|
|
||||||
var li = lis\[i\];
|
|
||||||
if ( li.innerText.toLowerCase().indexOf(filter) == -1 )
|
|
||||||
{
|
|
||||||
vars_ol.removeChild(li);
|
|
||||||
i--;
|
|
||||||
}
|
|
||||||
}catch(err) { }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var lis_new = vars_ol.getElementsByTagName("li");
|
|
||||||
for ( var j = 0; j < lis_new.length; ++j )
|
|
||||||
{
|
|
||||||
var li1 = lis\[j\];
|
|
||||||
if (j == 0){
|
|
||||||
li1.style.backgroundColor = "#ffee88";
|
|
||||||
}else{
|
|
||||||
li1.style.backgroundColor = "white";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function selectTextField(){
|
|
||||||
var filter_text = document.getElementById('filter');
|
|
||||||
filter_text.focus();
|
|
||||||
filter_text.select();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
function loadPage(list) {
|
|
||||||
|
|
||||||
if(list.options\[list.selectedIndex\].value == ""){
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
location.href=list.options\[list.selectedIndex\].value;
|
|
||||||
|
|
||||||
}
|
|
||||||
</script> "}
|
|
||||||
|
|
||||||
body += "<body onload='selectTextField(); updateSearch()' onkeyup='updateSearch()'>"
|
|
||||||
|
|
||||||
body += "<div align='center'><table width='100%'><tr><td width='50%'>"
|
|
||||||
|
|
||||||
if(sprite)
|
|
||||||
body += "<table align='center' width='100%'><tr><td><img src='view_vars_sprite.png'></td><td>"
|
|
||||||
else
|
|
||||||
body += "<table align='center' width='100%'><tr><td>"
|
|
||||||
|
|
||||||
body += "<div align='center'>"
|
|
||||||
|
|
||||||
if(istype(D,/atom))
|
|
||||||
var/atom/A = D
|
|
||||||
if(isliving(A))
|
|
||||||
body += "<a href='?_src_=vars;rename=\ref[D]'><b>[D]</b></a>"
|
|
||||||
if(A.dir)
|
|
||||||
body += "<br><font size='1'><a href='?_src_=vars;rotatedatum=\ref[D];rotatedir=left'><<</a> <a href='?_src_=vars;datumedit=\ref[D];varnameedit=dir'>[dir2text(A.dir)]</a> <a href='?_src_=vars;rotatedatum=\ref[D];rotatedir=right'>>></a></font>"
|
|
||||||
var/mob/living/M = A
|
|
||||||
body += "<br><font size='1'><a href='?_src_=vars;datumedit=\ref[D];varnameedit=ckey'>[M.ckey ? M.ckey : "No ckey"]</a> / <a href='?_src_=vars;datumedit=\ref[D];varnameedit=real_name'>[M.real_name ? M.real_name : "No real name"]</a></font>"
|
|
||||||
body += {"
|
|
||||||
<br><font size='1'>
|
|
||||||
BRUTE:<font size='1'><a href='?_src_=vars;mobToDamage=\ref[D];adjustDamage=brute'>[M.getBruteLoss()]</a>
|
|
||||||
FIRE:<font size='1'><a href='?_src_=vars;mobToDamage=\ref[D];adjustDamage=fire'>[M.getFireLoss()]</a>
|
|
||||||
TOXIN:<font size='1'><a href='?_src_=vars;mobToDamage=\ref[D];adjustDamage=toxin'>[M.getToxLoss()]</a>
|
|
||||||
OXY:<font size='1'><a href='?_src_=vars;mobToDamage=\ref[D];adjustDamage=oxygen'>[M.getOxyLoss()]</a>
|
|
||||||
CLONE:<font size='1'><a href='?_src_=vars;mobToDamage=\ref[D];adjustDamage=clone'>[M.getCloneLoss()]</a>
|
|
||||||
BRAIN:<font size='1'><a href='?_src_=vars;mobToDamage=\ref[D];adjustDamage=brain'>[M.getBrainLoss()]</a>
|
|
||||||
</font>
|
|
||||||
|
|
||||||
|
|
||||||
"}
|
|
||||||
else
|
|
||||||
body += "<a href='?_src_=vars;datumedit=\ref[D];varnameedit=name'><b>[D]</b></a>"
|
|
||||||
if(A.dir)
|
|
||||||
body += "<br><font size='1'><a href='?_src_=vars;rotatedatum=\ref[D];rotatedir=left'><<</a> <a href='?_src_=vars;datumedit=\ref[D];varnameedit=dir'>[dir2text(A.dir)]</a> <a href='?_src_=vars;rotatedatum=\ref[D];rotatedir=right'>>></a></font>"
|
|
||||||
else
|
|
||||||
body += "<b>[D]</b>"
|
|
||||||
|
|
||||||
body += "</div>"
|
|
||||||
|
|
||||||
body += "</tr></td></table>"
|
|
||||||
|
|
||||||
var/formatted_type = text("[D.type]")
|
|
||||||
if(length(formatted_type) > 25)
|
|
||||||
var/middle_point = length(formatted_type) / 2
|
|
||||||
var/splitpoint = findtext(formatted_type,"/",middle_point)
|
|
||||||
if(splitpoint)
|
|
||||||
formatted_type = "[copytext(formatted_type,1,splitpoint)]<br>[copytext(formatted_type,splitpoint)]"
|
|
||||||
else
|
|
||||||
formatted_type = "Type too long" //No suitable splitpoint (/) found.
|
|
||||||
|
|
||||||
body += "<div align='center'><b><font size='1'>[formatted_type]</font></b>"
|
|
||||||
|
|
||||||
if(src.holder && src.holder.marked_datum && src.holder.marked_datum == D)
|
|
||||||
body += "<br><font size='1' color='red'><b>Marked Object</b></font>"
|
|
||||||
|
|
||||||
body += "</div>"
|
|
||||||
|
|
||||||
body += "</div></td>"
|
|
||||||
|
|
||||||
body += "<td width='50%'><div align='center'><a href='?_src_=vars;datumrefresh=\ref[D]'>Refresh</a>"
|
|
||||||
|
|
||||||
//if(ismob(D))
|
|
||||||
// body += "<br><a href='?_src_=vars;mob_player_panel=\ref[D]'>Show player panel</a></div></td></tr></table></div><hr>"
|
|
||||||
|
|
||||||
body += {" <form>
|
|
||||||
<select name="file" size="1"
|
|
||||||
onchange="loadPage(this.form.elements\[0\])"
|
|
||||||
target="_parent._top"
|
|
||||||
onmouseclick="this.focus()"
|
|
||||||
style="background-color:#ffffff">
|
|
||||||
"}
|
|
||||||
|
|
||||||
body += {" <option value>Select option</option>
|
|
||||||
<option value> </option>
|
|
||||||
"}
|
|
||||||
|
|
||||||
|
|
||||||
body += "<option value='?_src_=vars;mark_object=\ref[D]'>Mark Object</option>"
|
|
||||||
if(ismob(D))
|
|
||||||
body += "<option value='?_src_=vars;mob_player_panel=\ref[D]'>Show player panel</option>"
|
|
||||||
|
|
||||||
body += "<option value>---</option>"
|
|
||||||
|
|
||||||
if(ismob(D))
|
|
||||||
body += "<option value='?_src_=vars;give_spell=\ref[D]'>Give Spell</option>"
|
|
||||||
body += "<option value='?_src_=vars;give_disease2=\ref[D]'>Give Disease</option>"
|
|
||||||
body += "<option value='?_src_=vars;give_disease=\ref[D]'>Give TG-style Disease</option>"
|
|
||||||
body += "<option value='?_src_=vars;godmode=\ref[D]'>Toggle Godmode</option>"
|
|
||||||
body += "<option value='?_src_=vars;build_mode=\ref[D]'>Toggle Build Mode</option>"
|
|
||||||
|
|
||||||
body += "<option value='?_src_=vars;ninja=\ref[D]'>Make Space Ninja</option>"
|
|
||||||
body += "<option value='?_src_=vars;make_skeleton=\ref[D]'>Make 2spooky</option>"
|
|
||||||
|
|
||||||
body += "<option value='?_src_=vars;direct_control=\ref[D]'>Assume Direct Control</option>"
|
|
||||||
body += "<option value='?_src_=vars;drop_everything=\ref[D]'>Drop Everything</option>"
|
|
||||||
|
|
||||||
body += "<option value='?_src_=vars;regenerateicons=\ref[D]'>Regenerate Icons</option>"
|
|
||||||
body += "<option value='?_src_=vars;addlanguage=\ref[D]'>Add Language</option>"
|
|
||||||
body += "<option value='?_src_=vars;remlanguage=\ref[D]'>Remove Language</option>"
|
|
||||||
body += "<option value='?_src_=vars;addorgan=\ref[D]'>Add Organ</option>"
|
|
||||||
body += "<option value='?_src_=vars;remorgan=\ref[D]'>Remove Organ</option>"
|
|
||||||
|
|
||||||
body += "<option value='?_src_=vars;fix_nano=\ref[D]'>Fix NanoUI</option>"
|
|
||||||
|
|
||||||
body += "<option value='?_src_=vars;addverb=\ref[D]'>Add Verb</option>"
|
|
||||||
body += "<option value='?_src_=vars;remverb=\ref[D]'>Remove Verb</option>"
|
|
||||||
if(ishuman(D))
|
|
||||||
body += "<option value>---</option>"
|
|
||||||
body += "<option value='?_src_=vars;setspecies=\ref[D]'>Set Species</option>"
|
|
||||||
body += "<option value='?_src_=vars;makeai=\ref[D]'>Make AI</option>"
|
|
||||||
body += "<option value='?_src_=vars;makerobot=\ref[D]'>Make cyborg</option>"
|
|
||||||
body += "<option value='?_src_=vars;makemonkey=\ref[D]'>Make monkey</option>"
|
|
||||||
body += "<option value='?_src_=vars;makealien=\ref[D]'>Make alien</option>"
|
|
||||||
body += "<option value='?_src_=vars;makeslime=\ref[D]'>Make slime</option>"
|
|
||||||
body += "<option value>---</option>"
|
|
||||||
body += "<option value='?_src_=vars;gib=\ref[D]'>Gib</option>"
|
|
||||||
if(isobj(D))
|
|
||||||
body += "<option value='?_src_=vars;delall=\ref[D]'>Delete all of type</option>"
|
|
||||||
if(isobj(D) || ismob(D) || isturf(D))
|
|
||||||
body += "<option value='?_src_=vars;explode=\ref[D]'>Trigger explosion</option>"
|
|
||||||
body += "<option value='?_src_=vars;emp=\ref[D]'>Trigger EM pulse</option>"
|
|
||||||
|
|
||||||
body += "</select></form>"
|
|
||||||
|
|
||||||
body += "</div></td></tr></table></div><hr>"
|
|
||||||
|
|
||||||
body += "<font size='1'><b>E</b> - Edit, tries to determine the variable type by itself.<br>"
|
|
||||||
body += "<b>C</b> - Change, asks you for the var type first.<br>"
|
|
||||||
body += "<b>M</b> - Mass modify: changes this variable for all objects of this type.</font><br>"
|
|
||||||
|
|
||||||
body += "<hr><table width='100%'><tr><td width='20%'><div align='center'><b>Search:</b></div></td><td width='80%'><input type='text' id='filter' name='filter_text' value='' style='width:100%;'></td></tr></table><hr>"
|
|
||||||
|
|
||||||
body += "<ol id='vars'>"
|
|
||||||
|
|
||||||
var/list/names = list()
|
|
||||||
for (var/V in D.vars)
|
|
||||||
names += V
|
|
||||||
|
|
||||||
names = sortList(names)
|
|
||||||
|
|
||||||
for (var/V in names)
|
|
||||||
body += debug_variable(V, D.vars[V], 0, D)
|
|
||||||
|
|
||||||
body += "</ol>"
|
|
||||||
|
|
||||||
var/html = "<html><head>"
|
|
||||||
if (title)
|
|
||||||
html += "<title>[title]</title>"
|
|
||||||
html += {"<style>
|
|
||||||
body
|
|
||||||
{
|
|
||||||
font-family: Verdana, sans-serif;
|
|
||||||
font-size: 9pt;
|
|
||||||
}
|
|
||||||
.value
|
|
||||||
{
|
|
||||||
font-family: "Courier New", monospace;
|
|
||||||
font-size: 8pt;
|
|
||||||
}
|
|
||||||
</style>"}
|
|
||||||
html += "</head><body>"
|
|
||||||
html += body
|
|
||||||
|
|
||||||
html += {"
|
|
||||||
<script type='text/javascript'>
|
|
||||||
var vars_ol = document.getElementById("vars");
|
|
||||||
var complete_list = vars_ol.innerHTML;
|
|
||||||
</script>
|
|
||||||
"}
|
|
||||||
|
|
||||||
html += "</body></html>"
|
|
||||||
|
|
||||||
usr << browse(html, "window=variables\ref[D];size=475x650")
|
|
||||||
|
|
||||||
return
|
|
||||||
|
|
||||||
proc/debug_variable(name, value, level, var/datum/DA = null)
|
|
||||||
var/html = ""
|
|
||||||
|
|
||||||
if(DA)
|
|
||||||
html += "<li style='backgroundColor:white'>(<a href='?_src_=vars;datumedit=\ref[DA];varnameedit=[name]'>E</a>) (<a href='?_src_=vars;datumchange=\ref[DA];varnamechange=[name]'>C</a>) (<a href='?_src_=vars;datummass=\ref[DA];varnamemass=[name]'>M</a>) "
|
|
||||||
else
|
|
||||||
html += "<li>"
|
|
||||||
|
|
||||||
if (isnull(value))
|
|
||||||
html += "[name] = <span class='value'>null</span>"
|
|
||||||
|
|
||||||
else if (istext(value))
|
|
||||||
html += "[name] = <span class='value'>\"[value]\"</span>"
|
|
||||||
|
|
||||||
else if (isicon(value))
|
|
||||||
#ifdef VARSICON
|
|
||||||
var/icon/I = new/icon(value)
|
|
||||||
var/rnd = rand(1,10000)
|
|
||||||
var/rname = "tmp\ref[I][rnd].png"
|
|
||||||
usr << browse_rsc(I, rname)
|
|
||||||
html += "[name] = (<span class='value'>[value]</span>) <img class=icon src=\"[rname]\">"
|
|
||||||
#else
|
|
||||||
html += "[name] = /icon (<span class='value'>[value]</span>)"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* else if (istype(value, /image))
|
|
||||||
#ifdef VARSICON
|
|
||||||
var/rnd = rand(1, 10000)
|
|
||||||
var/image/I = value
|
|
||||||
|
|
||||||
src << browse_rsc(I.icon, "tmp\ref[value][rnd].png")
|
|
||||||
html += "[name] = <img src=\"tmp\ref[value][rnd].png\">"
|
|
||||||
#else
|
|
||||||
html += "[name] = /image (<span class='value'>[value]</span>)"
|
|
||||||
#endif
|
|
||||||
*/
|
|
||||||
else if (isfile(value))
|
|
||||||
html += "[name] = <span class='value'>'[value]'</span>"
|
|
||||||
|
|
||||||
else if (istype(value, /datum))
|
|
||||||
var/datum/D = value
|
|
||||||
html += "<a href='?_src_=vars;Vars=\ref[value]'>[name] \ref[value]</a> = [D.type]"
|
|
||||||
|
|
||||||
else if (istype(value, /client))
|
|
||||||
var/client/C = value
|
|
||||||
html += "<a href='?_src_=vars;Vars=\ref[value]'>[name] \ref[value]</a> = [C] [C.type]"
|
|
||||||
//
|
|
||||||
else if (istype(value, /list))
|
|
||||||
var/list/L = value
|
|
||||||
html += "[name] = /list ([L.len])"
|
|
||||||
|
|
||||||
if (L.len > 0 && !(name == "underlays" || name == "overlays" || name == "vars" || L.len > 500))
|
|
||||||
// not sure if this is completely right...
|
|
||||||
if(0) //(L.vars.len > 0)
|
|
||||||
html += "<ol>"
|
|
||||||
html += "</ol>"
|
|
||||||
else
|
|
||||||
html += "<ul>"
|
|
||||||
var/index = 1
|
|
||||||
for (var/entry in L)
|
|
||||||
if(istext(entry))
|
|
||||||
html += debug_variable(entry, L[entry], level + 1)
|
|
||||||
//html += debug_variable("[index]", L[index], level + 1)
|
|
||||||
else
|
|
||||||
html += debug_variable(index, L[index], level + 1)
|
|
||||||
index++
|
|
||||||
html += "</ul>"
|
|
||||||
|
|
||||||
else
|
|
||||||
html += "[name] = <span class='value'>[value]</span>"
|
|
||||||
|
|
||||||
html += "</li>"
|
|
||||||
|
|
||||||
return html
|
|
||||||
|
|
||||||
/client/proc/view_var_Topic(href, href_list, hsrc)
|
|
||||||
//This should all be moved over to datum/admins/Topic() or something ~Carn
|
|
||||||
if( (usr.client != src) || !src.holder )
|
|
||||||
return
|
|
||||||
if(href_list["Vars"])
|
|
||||||
debug_variables(locate(href_list["Vars"]))
|
|
||||||
|
|
||||||
//~CARN: for renaming mobs (updates their name, real_name, mind.name, their ID/PDA and datacore records).
|
|
||||||
else if(href_list["rename"])
|
|
||||||
if(!check_rights(R_VAREDIT)) return
|
|
||||||
|
|
||||||
var/mob/M = locate(href_list["rename"])
|
|
||||||
if(!istype(M))
|
|
||||||
usr << "This can only be used on instances of type /mob"
|
|
||||||
return
|
|
||||||
|
|
||||||
var/new_name = sanitize(input(usr,"What would you like to name this mob?","Input a name",M.real_name) as text|null, MAX_NAME_LEN)
|
|
||||||
if( !new_name || !M ) return
|
|
||||||
|
|
||||||
message_admins("Admin [key_name_admin(usr)] renamed [key_name_admin(M)] to [new_name].")
|
|
||||||
M.fully_replace_character_name(M.real_name,new_name)
|
|
||||||
href_list["datumrefresh"] = href_list["rename"]
|
|
||||||
|
|
||||||
else if(href_list["varnameedit"] && href_list["datumedit"])
|
|
||||||
if(!check_rights(R_VAREDIT)) return
|
|
||||||
|
|
||||||
var/D = locate(href_list["datumedit"])
|
|
||||||
if(!istype(D,/datum) && !istype(D,/client))
|
|
||||||
usr << "This can only be used on instances of types /client or /datum"
|
|
||||||
return
|
|
||||||
|
|
||||||
modify_variables(D, href_list["varnameedit"], 1)
|
|
||||||
|
|
||||||
else if(href_list["varnamechange"] && href_list["datumchange"])
|
|
||||||
if(!check_rights(R_VAREDIT)) return
|
|
||||||
|
|
||||||
var/D = locate(href_list["datumchange"])
|
|
||||||
if(!istype(D,/datum) && !istype(D,/client))
|
|
||||||
usr << "This can only be used on instances of types /client or /datum"
|
|
||||||
return
|
|
||||||
|
|
||||||
modify_variables(D, href_list["varnamechange"], 0)
|
|
||||||
|
|
||||||
else if(href_list["varnamemass"] && href_list["datummass"])
|
|
||||||
if(!check_rights(R_VAREDIT)) return
|
|
||||||
|
|
||||||
var/atom/A = locate(href_list["datummass"])
|
|
||||||
if(!istype(A))
|
|
||||||
usr << "This can only be used on instances of type /atom"
|
|
||||||
return
|
|
||||||
|
|
||||||
cmd_mass_modify_object_variables(A, href_list["varnamemass"])
|
|
||||||
|
|
||||||
else if(href_list["mob_player_panel"])
|
|
||||||
if(!check_rights(0)) return
|
|
||||||
|
|
||||||
var/mob/M = locate(href_list["mob_player_panel"])
|
|
||||||
if(!istype(M))
|
|
||||||
usr << "This can only be used on instances of type /mob"
|
|
||||||
return
|
|
||||||
|
|
||||||
src.holder.show_player_panel(M)
|
|
||||||
href_list["datumrefresh"] = href_list["mob_player_panel"]
|
|
||||||
|
|
||||||
else if(href_list["give_spell"])
|
|
||||||
if(!check_rights(R_ADMIN|R_FUN)) return
|
|
||||||
|
|
||||||
var/mob/M = locate(href_list["give_spell"])
|
|
||||||
if(!istype(M))
|
|
||||||
usr << "This can only be used on instances of type /mob"
|
|
||||||
return
|
|
||||||
|
|
||||||
src.give_spell(M)
|
|
||||||
href_list["datumrefresh"] = href_list["give_spell"]
|
|
||||||
|
|
||||||
else if(href_list["give_disease"])
|
|
||||||
if(!check_rights(R_ADMIN|R_FUN)) return
|
|
||||||
|
|
||||||
var/mob/M = locate(href_list["give_disease"])
|
|
||||||
if(!istype(M))
|
|
||||||
usr << "This can only be used on instances of type /mob"
|
|
||||||
return
|
|
||||||
|
|
||||||
src.give_disease(M)
|
|
||||||
href_list["datumrefresh"] = href_list["give_spell"]
|
|
||||||
|
|
||||||
else if(href_list["give_disease2"])
|
|
||||||
if(!check_rights(R_ADMIN|R_FUN)) return
|
|
||||||
|
|
||||||
var/mob/M = locate(href_list["give_disease2"])
|
|
||||||
if(!istype(M))
|
|
||||||
usr << "This can only be used on instances of type /mob"
|
|
||||||
return
|
|
||||||
|
|
||||||
src.give_disease2(M)
|
|
||||||
href_list["datumrefresh"] = href_list["give_spell"]
|
|
||||||
|
|
||||||
else if(href_list["godmode"])
|
|
||||||
if(!check_rights(R_REJUVINATE)) return
|
|
||||||
|
|
||||||
var/mob/M = locate(href_list["godmode"])
|
|
||||||
if(!istype(M))
|
|
||||||
usr << "This can only be used on instances of type /mob"
|
|
||||||
return
|
|
||||||
|
|
||||||
src.cmd_admin_godmode(M)
|
|
||||||
href_list["datumrefresh"] = href_list["godmode"]
|
|
||||||
|
|
||||||
else if(href_list["gib"])
|
|
||||||
if(!check_rights(0)) return
|
|
||||||
|
|
||||||
var/mob/M = locate(href_list["gib"])
|
|
||||||
if(!istype(M))
|
|
||||||
usr << "This can only be used on instances of type /mob"
|
|
||||||
return
|
|
||||||
|
|
||||||
src.cmd_admin_gib(M)
|
|
||||||
|
|
||||||
else if(href_list["build_mode"])
|
|
||||||
if(!check_rights(R_BUILDMODE)) return
|
|
||||||
|
|
||||||
var/mob/M = locate(href_list["build_mode"])
|
|
||||||
if(!istype(M))
|
|
||||||
usr << "This can only be used on instances of type /mob"
|
|
||||||
return
|
|
||||||
|
|
||||||
togglebuildmode(M)
|
|
||||||
href_list["datumrefresh"] = href_list["build_mode"]
|
|
||||||
|
|
||||||
else if(href_list["drop_everything"])
|
|
||||||
if(!check_rights(R_DEBUG|R_ADMIN)) return
|
|
||||||
|
|
||||||
var/mob/M = locate(href_list["drop_everything"])
|
|
||||||
if(!istype(M))
|
|
||||||
usr << "This can only be used on instances of type /mob"
|
|
||||||
return
|
|
||||||
|
|
||||||
if(usr.client)
|
|
||||||
usr.client.cmd_admin_drop_everything(M)
|
|
||||||
|
|
||||||
else if(href_list["direct_control"])
|
|
||||||
if(!check_rights(0)) return
|
|
||||||
|
|
||||||
var/mob/M = locate(href_list["direct_control"])
|
|
||||||
if(!istype(M))
|
|
||||||
usr << "This can only be used on instances of type /mob"
|
|
||||||
return
|
|
||||||
|
|
||||||
if(usr.client)
|
|
||||||
usr.client.cmd_assume_direct_control(M)
|
|
||||||
|
|
||||||
else if(href_list["make_skeleton"])
|
|
||||||
if(!check_rights(R_FUN)) return
|
|
||||||
|
|
||||||
var/mob/living/carbon/human/H = locate(href_list["make_skeleton"])
|
|
||||||
if(!istype(H))
|
|
||||||
usr << "This can only be used on instances of type /mob/living/carbon/human"
|
|
||||||
return
|
|
||||||
|
|
||||||
H.ChangeToSkeleton()
|
|
||||||
href_list["datumrefresh"] = href_list["make_skeleton"]
|
|
||||||
|
|
||||||
else if(href_list["delall"])
|
|
||||||
if(!check_rights(R_DEBUG|R_SERVER)) return
|
|
||||||
|
|
||||||
var/obj/O = locate(href_list["delall"])
|
|
||||||
if(!isobj(O))
|
|
||||||
usr << "This can only be used on instances of type /obj"
|
|
||||||
return
|
|
||||||
|
|
||||||
var/action_type = alert("Strict type ([O.type]) or type and all subtypes?",,"Strict type","Type and subtypes","Cancel")
|
|
||||||
if(action_type == "Cancel" || !action_type)
|
|
||||||
return
|
|
||||||
|
|
||||||
if(alert("Are you really sure you want to delete all objects of type [O.type]?",,"Yes","No") != "Yes")
|
|
||||||
return
|
|
||||||
|
|
||||||
if(alert("Second confirmation required. Delete?",,"Yes","No") != "Yes")
|
|
||||||
return
|
|
||||||
|
|
||||||
var/O_type = O.type
|
|
||||||
switch(action_type)
|
|
||||||
if("Strict type")
|
|
||||||
var/i = 0
|
|
||||||
for(var/obj/Obj in world)
|
|
||||||
if(Obj.type == O_type)
|
|
||||||
i++
|
|
||||||
del(Obj)
|
|
||||||
if(!i)
|
|
||||||
usr << "No objects of this type exist"
|
|
||||||
return
|
|
||||||
log_admin("[key_name(usr)] deleted all objects of type [O_type] ([i] objects deleted) ")
|
|
||||||
message_admins("\blue [key_name(usr)] deleted all objects of type [O_type] ([i] objects deleted) ")
|
|
||||||
if("Type and subtypes")
|
|
||||||
var/i = 0
|
|
||||||
for(var/obj/Obj in world)
|
|
||||||
if(istype(Obj,O_type))
|
|
||||||
i++
|
|
||||||
del(Obj)
|
|
||||||
if(!i)
|
|
||||||
usr << "No objects of this type exist"
|
|
||||||
return
|
|
||||||
log_admin("[key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted) ")
|
|
||||||
message_admins("\blue [key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted) ")
|
|
||||||
|
|
||||||
else if(href_list["explode"])
|
|
||||||
if(!check_rights(R_DEBUG|R_FUN)) return
|
|
||||||
|
|
||||||
var/atom/A = locate(href_list["explode"])
|
|
||||||
if(!isobj(A) && !ismob(A) && !isturf(A))
|
|
||||||
usr << "This can only be done to instances of type /obj, /mob and /turf"
|
|
||||||
return
|
|
||||||
|
|
||||||
src.cmd_admin_explosion(A)
|
|
||||||
href_list["datumrefresh"] = href_list["explode"]
|
|
||||||
|
|
||||||
else if(href_list["emp"])
|
|
||||||
if(!check_rights(R_DEBUG|R_FUN)) return
|
|
||||||
|
|
||||||
var/atom/A = locate(href_list["emp"])
|
|
||||||
if(!isobj(A) && !ismob(A) && !isturf(A))
|
|
||||||
usr << "This can only be done to instances of type /obj, /mob and /turf"
|
|
||||||
return
|
|
||||||
|
|
||||||
src.cmd_admin_emp(A)
|
|
||||||
href_list["datumrefresh"] = href_list["emp"]
|
|
||||||
|
|
||||||
else if(href_list["mark_object"])
|
|
||||||
if(!check_rights(0)) return
|
|
||||||
|
|
||||||
var/datum/D = locate(href_list["mark_object"])
|
|
||||||
if(!istype(D))
|
|
||||||
usr << "This can only be done to instances of type /datum"
|
|
||||||
return
|
|
||||||
|
|
||||||
src.holder.marked_datum = D
|
|
||||||
href_list["datumrefresh"] = href_list["mark_object"]
|
|
||||||
|
|
||||||
else if(href_list["rotatedatum"])
|
|
||||||
if(!check_rights(0)) return
|
|
||||||
|
|
||||||
var/atom/A = locate(href_list["rotatedatum"])
|
|
||||||
if(!istype(A))
|
|
||||||
usr << "This can only be done to instances of type /atom"
|
|
||||||
return
|
|
||||||
|
|
||||||
switch(href_list["rotatedir"])
|
|
||||||
if("right") A.set_dir(turn(A.dir, -45))
|
|
||||||
if("left") A.set_dir(turn(A.dir, 45))
|
|
||||||
href_list["datumrefresh"] = href_list["rotatedatum"]
|
|
||||||
|
|
||||||
else if(href_list["makemonkey"])
|
|
||||||
if(!check_rights(R_SPAWN)) return
|
|
||||||
|
|
||||||
var/mob/living/carbon/human/H = locate(href_list["makemonkey"])
|
|
||||||
if(!istype(H))
|
|
||||||
usr << "This can only be done to instances of type /mob/living/carbon/human"
|
|
||||||
return
|
|
||||||
|
|
||||||
if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return
|
|
||||||
if(!H)
|
|
||||||
usr << "Mob doesn't exist anymore"
|
|
||||||
return
|
|
||||||
holder.Topic(href, list("monkeyone"=href_list["makemonkey"]))
|
|
||||||
|
|
||||||
else if(href_list["makerobot"])
|
|
||||||
if(!check_rights(R_SPAWN)) return
|
|
||||||
|
|
||||||
var/mob/living/carbon/human/H = locate(href_list["makerobot"])
|
|
||||||
if(!istype(H))
|
|
||||||
usr << "This can only be done to instances of type /mob/living/carbon/human"
|
|
||||||
return
|
|
||||||
|
|
||||||
if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return
|
|
||||||
if(!H)
|
|
||||||
usr << "Mob doesn't exist anymore"
|
|
||||||
return
|
|
||||||
holder.Topic(href, list("makerobot"=href_list["makerobot"]))
|
|
||||||
|
|
||||||
else if(href_list["makealien"])
|
|
||||||
if(!check_rights(R_SPAWN)) return
|
|
||||||
|
|
||||||
var/mob/living/carbon/human/H = locate(href_list["makealien"])
|
|
||||||
if(!istype(H))
|
|
||||||
usr << "This can only be done to instances of type /mob/living/carbon/human"
|
|
||||||
return
|
|
||||||
|
|
||||||
if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return
|
|
||||||
if(!H)
|
|
||||||
usr << "Mob doesn't exist anymore"
|
|
||||||
return
|
|
||||||
holder.Topic(href, list("makealien"=href_list["makealien"]))
|
|
||||||
|
|
||||||
else if(href_list["makeslime"])
|
|
||||||
if(!check_rights(R_SPAWN)) return
|
|
||||||
|
|
||||||
var/mob/living/carbon/human/H = locate(href_list["makeslime"])
|
|
||||||
if(!istype(H))
|
|
||||||
usr << "This can only be done to instances of type /mob/living/carbon/human"
|
|
||||||
return
|
|
||||||
|
|
||||||
if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return
|
|
||||||
if(!H)
|
|
||||||
usr << "Mob doesn't exist anymore"
|
|
||||||
return
|
|
||||||
holder.Topic(href, list("makeslime"=href_list["makeslime"]))
|
|
||||||
|
|
||||||
else if(href_list["makeai"])
|
|
||||||
if(!check_rights(R_SPAWN)) return
|
|
||||||
|
|
||||||
var/mob/living/carbon/human/H = locate(href_list["makeai"])
|
|
||||||
if(!istype(H))
|
|
||||||
usr << "This can only be done to instances of type /mob/living/carbon/human"
|
|
||||||
return
|
|
||||||
|
|
||||||
if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return
|
|
||||||
if(!H)
|
|
||||||
usr << "Mob doesn't exist anymore"
|
|
||||||
return
|
|
||||||
holder.Topic(href, list("makeai"=href_list["makeai"]))
|
|
||||||
|
|
||||||
else if(href_list["setspecies"])
|
|
||||||
if(!check_rights(R_SPAWN)) return
|
|
||||||
|
|
||||||
var/mob/living/carbon/human/H = locate(href_list["setspecies"])
|
|
||||||
if(!istype(H))
|
|
||||||
usr << "This can only be done to instances of type /mob/living/carbon/human"
|
|
||||||
return
|
|
||||||
|
|
||||||
var/new_species = input("Please choose a new species.","Species",null) as null|anything in all_species
|
|
||||||
|
|
||||||
if(!H)
|
|
||||||
usr << "Mob doesn't exist anymore"
|
|
||||||
return
|
|
||||||
|
|
||||||
if(H.set_species(new_species))
|
|
||||||
usr << "Set species of [H] to [H.species]."
|
|
||||||
else
|
|
||||||
usr << "Failed! Something went wrong."
|
|
||||||
|
|
||||||
else if(href_list["addlanguage"])
|
|
||||||
if(!check_rights(R_SPAWN)) return
|
|
||||||
|
|
||||||
var/mob/H = locate(href_list["addlanguage"])
|
|
||||||
if(!istype(H))
|
|
||||||
usr << "This can only be done to instances of type /mob"
|
|
||||||
return
|
|
||||||
|
|
||||||
var/new_language = input("Please choose a language to add.","Language",null) as null|anything in all_languages
|
|
||||||
|
|
||||||
if(!new_language)
|
|
||||||
return
|
|
||||||
|
|
||||||
if(!H)
|
|
||||||
usr << "Mob doesn't exist anymore"
|
|
||||||
return
|
|
||||||
|
|
||||||
if(H.add_language(new_language))
|
|
||||||
usr << "Added [new_language] to [H]."
|
|
||||||
else
|
|
||||||
usr << "Mob already knows that language."
|
|
||||||
|
|
||||||
else if(href_list["remlanguage"])
|
|
||||||
if(!check_rights(R_SPAWN)) return
|
|
||||||
|
|
||||||
var/mob/H = locate(href_list["remlanguage"])
|
|
||||||
if(!istype(H))
|
|
||||||
usr << "This can only be done to instances of type /mob"
|
|
||||||
return
|
|
||||||
|
|
||||||
if(!H.languages.len)
|
|
||||||
usr << "This mob knows no languages."
|
|
||||||
return
|
|
||||||
|
|
||||||
var/datum/language/rem_language = input("Please choose a language to remove.","Language",null) as null|anything in H.languages
|
|
||||||
|
|
||||||
if(!rem_language)
|
|
||||||
return
|
|
||||||
|
|
||||||
if(!H)
|
|
||||||
usr << "Mob doesn't exist anymore"
|
|
||||||
return
|
|
||||||
|
|
||||||
if(H.remove_language(rem_language.name))
|
|
||||||
usr << "Removed [rem_language] from [H]."
|
|
||||||
else
|
|
||||||
usr << "Mob doesn't know that language."
|
|
||||||
|
|
||||||
else if(href_list["addverb"])
|
|
||||||
if(!check_rights(R_DEBUG)) return
|
|
||||||
|
|
||||||
var/mob/living/H = locate(href_list["addverb"])
|
|
||||||
|
|
||||||
if(!istype(H))
|
|
||||||
usr << "This can only be done to instances of type /mob/living"
|
|
||||||
return
|
|
||||||
var/list/possibleverbs = list()
|
|
||||||
possibleverbs += "Cancel" // One for the top...
|
|
||||||
possibleverbs += typesof(/mob/proc,/mob/verb,/mob/living/proc,/mob/living/verb)
|
|
||||||
switch(H.type)
|
|
||||||
if(/mob/living/carbon/human)
|
|
||||||
possibleverbs += typesof(/mob/living/carbon/proc,/mob/living/carbon/verb,/mob/living/carbon/human/verb,/mob/living/carbon/human/proc)
|
|
||||||
if(/mob/living/silicon/robot)
|
|
||||||
possibleverbs += typesof(/mob/living/silicon/proc,/mob/living/silicon/robot/proc,/mob/living/silicon/robot/verb)
|
|
||||||
if(/mob/living/silicon/ai)
|
|
||||||
possibleverbs += typesof(/mob/living/silicon/proc,/mob/living/silicon/ai/proc,/mob/living/silicon/ai/verb)
|
|
||||||
possibleverbs -= H.verbs
|
|
||||||
possibleverbs += "Cancel" // ...And one for the bottom
|
|
||||||
|
|
||||||
var/verb = input("Select a verb!", "Verbs",null) as anything in possibleverbs
|
|
||||||
if(!H)
|
|
||||||
usr << "Mob doesn't exist anymore"
|
|
||||||
return
|
|
||||||
if(!verb || verb == "Cancel")
|
|
||||||
return
|
|
||||||
else
|
|
||||||
H.verbs += verb
|
|
||||||
|
|
||||||
else if(href_list["remverb"])
|
|
||||||
if(!check_rights(R_DEBUG)) return
|
|
||||||
|
|
||||||
var/mob/H = locate(href_list["remverb"])
|
|
||||||
|
|
||||||
if(!istype(H))
|
|
||||||
usr << "This can only be done to instances of type /mob"
|
|
||||||
return
|
|
||||||
var/verb = input("Please choose a verb to remove.","Verbs",null) as null|anything in H.verbs
|
|
||||||
if(!H)
|
|
||||||
usr << "Mob doesn't exist anymore"
|
|
||||||
return
|
|
||||||
if(!verb)
|
|
||||||
return
|
|
||||||
else
|
|
||||||
H.verbs -= verb
|
|
||||||
|
|
||||||
else if(href_list["addorgan"])
|
|
||||||
if(!check_rights(R_SPAWN)) return
|
|
||||||
|
|
||||||
var/mob/living/carbon/M = locate(href_list["addorgan"])
|
|
||||||
if(!istype(M))
|
|
||||||
usr << "This can only be done to instances of type /mob/living/carbon"
|
|
||||||
return
|
|
||||||
|
|
||||||
var/new_organ = input("Please choose an organ to add.","Organ",null) as null|anything in typesof(/obj/item/organ)-/obj/item/organ
|
|
||||||
if(!new_organ) return
|
|
||||||
|
|
||||||
if(!M)
|
|
||||||
usr << "Mob doesn't exist anymore"
|
|
||||||
return
|
|
||||||
|
|
||||||
if(locate(new_organ) in M.internal_organs)
|
|
||||||
usr << "Mob already has that organ."
|
|
||||||
return
|
|
||||||
|
|
||||||
<<<<<<< HEAD
|
|
||||||
new new_organ(M)
|
|
||||||
|
|
||||||
=======
|
|
||||||
if(istype(M,/mob/living/carbon/human))
|
|
||||||
var/mob/living/carbon/human/H = M
|
|
||||||
var/datum/organ/internal/I = new new_organ(H)
|
|
||||||
|
|
||||||
var/organ_slot = input(usr, "Which slot do you want the organ to go in ('default' for default)?") as text|null
|
|
||||||
|
|
||||||
if(!organ_slot)
|
|
||||||
return
|
|
||||||
|
|
||||||
if(organ_slot != "default")
|
|
||||||
organ_slot = sanitize(organ_slot)
|
|
||||||
else
|
|
||||||
if(I.removed_type)
|
|
||||||
var/obj/item/organ/O = new I.removed_type()
|
|
||||||
organ_slot = O.organ_tag
|
|
||||||
del(O)
|
|
||||||
else
|
|
||||||
organ_slot = "unknown organ"
|
|
||||||
|
|
||||||
if(H.internal_organs_by_name[organ_slot])
|
|
||||||
usr << "[H] already has an organ in that slot."
|
|
||||||
del(I)
|
|
||||||
return
|
|
||||||
|
|
||||||
H.internal_organs |= I
|
|
||||||
H.internal_organs_by_name[organ_slot] = I
|
|
||||||
usr << "Added new [new_organ] to [H] as slot [organ_slot]."
|
|
||||||
else
|
|
||||||
new new_organ(M)
|
|
||||||
usr << "Added new [new_organ] to [M]."
|
|
||||||
>>>>>>> 2aa4646fa0425bed412e2ef0e7852591ecb4bc40
|
|
||||||
|
|
||||||
else if(href_list["remorgan"])
|
|
||||||
if(!check_rights(R_SPAWN)) return
|
|
||||||
|
|
||||||
var/mob/living/carbon/M = locate(href_list["remorgan"])
|
|
||||||
if(!istype(M))
|
|
||||||
usr << "This can only be done to instances of type /mob/living/carbon"
|
|
||||||
return
|
|
||||||
|
|
||||||
var/obj/item/organ/rem_organ = input("Please choose an organ to remove.","Organ",null) as null|anything in M.internal_organs
|
|
||||||
|
|
||||||
if(!M)
|
|
||||||
usr << "Mob doesn't exist anymore"
|
|
||||||
return
|
|
||||||
|
|
||||||
if(!(locate(rem_organ) in M.internal_organs))
|
|
||||||
usr << "Mob does not have that organ."
|
|
||||||
return
|
|
||||||
|
|
||||||
usr << "Removed [rem_organ] from [M]."
|
|
||||||
rem_organ.removed()
|
|
||||||
del(rem_organ)
|
|
||||||
|
|
||||||
else if(href_list["fix_nano"])
|
|
||||||
if(!check_rights(R_DEBUG)) return
|
|
||||||
|
|
||||||
var/mob/H = locate(href_list["fix_nano"])
|
|
||||||
|
|
||||||
if(!istype(H) || !H.client)
|
|
||||||
usr << "This can only be done on mobs with clients"
|
|
||||||
return
|
|
||||||
|
|
||||||
nanomanager.send_resources(H.client)
|
|
||||||
|
|
||||||
usr << "Resource files sent"
|
|
||||||
H << "Your NanoUI Resource files have been refreshed"
|
|
||||||
|
|
||||||
log_admin("[key_name(usr)] resent the NanoUI resource files to [key_name(H)] ")
|
|
||||||
|
|
||||||
else if(href_list["regenerateicons"])
|
|
||||||
if(!check_rights(0)) return
|
|
||||||
|
|
||||||
var/mob/M = locate(href_list["regenerateicons"])
|
|
||||||
if(!ismob(M))
|
|
||||||
usr << "This can only be done to instances of type /mob"
|
|
||||||
return
|
|
||||||
M.regenerate_icons()
|
|
||||||
|
|
||||||
else if(href_list["adjustDamage"] && href_list["mobToDamage"])
|
|
||||||
if(!check_rights(R_DEBUG|R_ADMIN|R_FUN)) return
|
|
||||||
|
|
||||||
var/mob/living/L = locate(href_list["mobToDamage"])
|
|
||||||
if(!istype(L)) return
|
|
||||||
|
|
||||||
var/Text = href_list["adjustDamage"]
|
|
||||||
|
|
||||||
var/amount = input("Deal how much damage to mob? (Negative values here heal)","Adjust [Text]loss",0) as num
|
|
||||||
|
|
||||||
if(!L)
|
|
||||||
usr << "Mob doesn't exist anymore"
|
|
||||||
return
|
|
||||||
|
|
||||||
switch(Text)
|
|
||||||
if("brute") L.adjustBruteLoss(amount)
|
|
||||||
if("fire") L.adjustFireLoss(amount)
|
|
||||||
if("toxin") L.adjustToxLoss(amount)
|
|
||||||
if("oxygen")L.adjustOxyLoss(amount)
|
|
||||||
if("brain") L.adjustBrainLoss(amount)
|
|
||||||
if("clone") L.adjustCloneLoss(amount)
|
|
||||||
else
|
|
||||||
usr << "You caused an error. DEBUG: Text:[Text] Mob:[L]"
|
|
||||||
return
|
|
||||||
|
|
||||||
if(amount != 0)
|
|
||||||
log_admin("[key_name(usr)] dealt [amount] amount of [Text] damage to [L] ")
|
|
||||||
message_admins("\blue [key_name(usr)] dealt [amount] amount of [Text] damage to [L] ")
|
|
||||||
href_list["datumrefresh"] = href_list["mobToDamage"]
|
|
||||||
|
|
||||||
if(href_list["datumrefresh"])
|
|
||||||
var/datum/DAT = locate(href_list["datumrefresh"])
|
|
||||||
if(!istype(DAT, /datum))
|
|
||||||
return
|
|
||||||
src.debug_variables(DAT)
|
|
||||||
|
|
||||||
return
|
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,934 +0,0 @@
|
|||||||
///////////////////////////////
|
|
||||||
//CABLE STRUCTURE
|
|
||||||
///////////////////////////////
|
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////
|
|
||||||
// Definitions
|
|
||||||
////////////////////////////////
|
|
||||||
|
|
||||||
/* Cable directions (d1 and d2)
|
|
||||||
|
|
||||||
|
|
||||||
9 1 5
|
|
||||||
\ | /
|
|
||||||
8 - 0 - 4
|
|
||||||
/ | \
|
|
||||||
10 2 6
|
|
||||||
|
|
||||||
If d1 = 0 and d2 = 0, there's no cable
|
|
||||||
If d1 = 0 and d2 = dir, it's a O-X cable, getting from the center of the tile to dir (knot cable)
|
|
||||||
If d1 = dir1 and d2 = dir2, it's a full X-X cable, getting from dir1 to dir2
|
|
||||||
By design, d1 is the smallest direction and d2 is the highest
|
|
||||||
*/
|
|
||||||
|
|
||||||
/obj/structure/cable
|
|
||||||
level = 1
|
|
||||||
anchored =1
|
|
||||||
var/datum/powernet/powernet
|
|
||||||
name = "power cable"
|
|
||||||
desc = "A flexible superconducting cable for heavy-duty power transfer"
|
|
||||||
icon = 'icons/obj/power_cond_white.dmi'
|
|
||||||
icon_state = "0-1"
|
|
||||||
var/d1 = 0
|
|
||||||
var/d2 = 1
|
|
||||||
layer = 2.44 //Just below unary stuff, which is at 2.45 and above pipes, which are at 2.4
|
|
||||||
color = COLOR_RED
|
|
||||||
var/obj/machinery/power/breakerbox/breaker_box
|
|
||||||
|
|
||||||
/obj/structure/cable/drain_power(var/drain_check, var/surge, var/amount = 0)
|
|
||||||
|
|
||||||
if(drain_check)
|
|
||||||
return 1
|
|
||||||
|
|
||||||
var/datum/powernet/PN = get_powernet()
|
|
||||||
if(!PN) return 0
|
|
||||||
|
|
||||||
return PN.draw_power(amount)
|
|
||||||
|
|
||||||
/obj/structure/cable/yellow
|
|
||||||
color = COLOR_YELLOW
|
|
||||||
|
|
||||||
/obj/structure/cable/green
|
|
||||||
color = COLOR_GREEN
|
|
||||||
|
|
||||||
/obj/structure/cable/blue
|
|
||||||
color = COLOR_BLUE
|
|
||||||
|
|
||||||
/obj/structure/cable/pink
|
|
||||||
color = COLOR_PINK
|
|
||||||
|
|
||||||
/obj/structure/cable/orange
|
|
||||||
color = COLOR_ORANGE
|
|
||||||
|
|
||||||
/obj/structure/cable/cyan
|
|
||||||
color = COLOR_CYAN
|
|
||||||
|
|
||||||
/obj/structure/cable/white
|
|
||||||
color = COLOR_WHITE
|
|
||||||
|
|
||||||
/obj/structure/cable/New()
|
|
||||||
..()
|
|
||||||
|
|
||||||
|
|
||||||
// ensure d1 & d2 reflect the icon_state for entering and exiting cable
|
|
||||||
|
|
||||||
var/dash = findtext(icon_state, "-")
|
|
||||||
|
|
||||||
d1 = text2num( copytext( icon_state, 1, dash ) )
|
|
||||||
|
|
||||||
d2 = text2num( copytext( icon_state, dash+1 ) )
|
|
||||||
|
|
||||||
var/turf/T = src.loc // hide if turf is not intact
|
|
||||||
|
|
||||||
if(level==1) hide(T.intact)
|
|
||||||
cable_list += src //add it to the global cable list
|
|
||||||
|
|
||||||
|
|
||||||
/obj/structure/cable/Del() // called when a cable is deleted
|
|
||||||
if(powernet)
|
|
||||||
cut_cable_from_powernet() // update the powernets
|
|
||||||
cable_list -= src //remove it from global cable list
|
|
||||||
..() // then go ahead and delete the cable
|
|
||||||
|
|
||||||
///////////////////////////////////
|
|
||||||
// General procedures
|
|
||||||
///////////////////////////////////
|
|
||||||
|
|
||||||
//If underfloor, hide the cable
|
|
||||||
/obj/structure/cable/hide(var/i)
|
|
||||||
|
|
||||||
if(level == 1 && istype(loc, /turf))
|
|
||||||
invisibility = i ? 101 : 0
|
|
||||||
updateicon()
|
|
||||||
|
|
||||||
/obj/structure/cable/proc/updateicon()
|
|
||||||
icon_state = "[d1]-[d2]"
|
|
||||||
alpha = invisibility ? 127 : 255
|
|
||||||
|
|
||||||
// returns the powernet this cable belongs to
|
|
||||||
/obj/structure/cable/proc/get_powernet() //TODO: remove this as it is obsolete
|
|
||||||
return powernet
|
|
||||||
|
|
||||||
//Telekinesis has no effect on a cable
|
|
||||||
/obj/structure/cable/attack_tk(mob/user)
|
|
||||||
return
|
|
||||||
|
|
||||||
// Items usable on a cable :
|
|
||||||
// - Wirecutters : cut it duh !
|
|
||||||
// - Cable coil : merge cables
|
|
||||||
// - Multitool : get the power currently passing through the cable
|
|
||||||
//
|
|
||||||
/obj/structure/cable/attackby(obj/item/W, mob/user)
|
|
||||||
|
|
||||||
var/turf/T = src.loc
|
|
||||||
if(T.intact)
|
|
||||||
return
|
|
||||||
|
|
||||||
if(istype(W, /obj/item/weapon/wirecutters))
|
|
||||||
///// Z-Level Stuff
|
|
||||||
if(src.d1 == 12 || src.d2 == 12)
|
|
||||||
user << "<span class='warning'>You must cut this cable from above.</span>"
|
|
||||||
return
|
|
||||||
///// Z-Level Stuff
|
|
||||||
if(breaker_box)
|
|
||||||
user << "\red This cable is connected to nearby breaker box. Use breaker box to interact with it."
|
|
||||||
return
|
|
||||||
|
|
||||||
if (shock(user, 50))
|
|
||||||
return
|
|
||||||
|
|
||||||
if(src.d1) // 0-X cables are 1 unit, X-X cables are 2 units long
|
|
||||||
new/obj/item/stack/cable_coil(T, 2, color)
|
|
||||||
else
|
|
||||||
new/obj/item/stack/cable_coil(T, 1, color)
|
|
||||||
|
|
||||||
for(var/mob/O in viewers(src, null))
|
|
||||||
O.show_message("<span class='warning'>[user] cuts the cable.</span>", 1)
|
|
||||||
|
|
||||||
///// Z-Level Stuff
|
|
||||||
if(src.d1 == 11 || src.d2 == 11)
|
|
||||||
var/turf/controllerlocation = locate(1, 1, z)
|
|
||||||
for(var/obj/effect/landmark/zcontroller/controller in controllerlocation)
|
|
||||||
if(controller.down)
|
|
||||||
var/turf/below = locate(src.x, src.y, controller.down_target)
|
|
||||||
for(var/obj/structure/cable/c in below)
|
|
||||||
if(c.d1 == 12 || c.d2 == 12)
|
|
||||||
c.Del()
|
|
||||||
///// Z-Level Stuff
|
|
||||||
investigate_log("was cut by [key_name(usr, usr.client)] in [user.loc.loc]","wires")
|
|
||||||
|
|
||||||
del(src) // qdel
|
|
||||||
return
|
|
||||||
|
|
||||||
|
|
||||||
else if(istype(W, /obj/item/stack/cable_coil))
|
|
||||||
var/obj/item/stack/cable_coil/coil = W
|
|
||||||
if (coil.get_amount() < 1)
|
|
||||||
user << "Not enough cable"
|
|
||||||
return
|
|
||||||
coil.cable_join(src, user)
|
|
||||||
|
|
||||||
else if(istype(W, /obj/item/device/multitool))
|
|
||||||
|
|
||||||
if(powernet && (powernet.avail > 0)) // is it powered?
|
|
||||||
user << "<span class='warning'>[powernet.avail]W in power network.</span>"
|
|
||||||
|
|
||||||
else
|
|
||||||
user << "<span class='warning'>The cable is not powered.</span>"
|
|
||||||
|
|
||||||
shock(user, 5, 0.2)
|
|
||||||
|
|
||||||
else
|
|
||||||
if (W.flags & CONDUCT)
|
|
||||||
shock(user, 50, 0.7)
|
|
||||||
|
|
||||||
src.add_fingerprint(user)
|
|
||||||
|
|
||||||
// shock the user with probability prb
|
|
||||||
/obj/structure/cable/proc/shock(mob/user, prb, var/siemens_coeff = 1.0)
|
|
||||||
if(!prob(prb))
|
|
||||||
return 0
|
|
||||||
if (electrocute_mob(user, powernet, src, siemens_coeff))
|
|
||||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
|
||||||
s.set_up(5, 1, src)
|
|
||||||
s.start()
|
|
||||||
if(usr.stunned)
|
|
||||||
return 1
|
|
||||||
return 0
|
|
||||||
|
|
||||||
//explosion handling
|
|
||||||
/obj/structure/cable/ex_act(severity)
|
|
||||||
switch(severity)
|
|
||||||
if(1.0)
|
|
||||||
del(src) // qdel
|
|
||||||
if(2.0)
|
|
||||||
if (prob(50))
|
|
||||||
new/obj/item/stack/cable_coil(src.loc, src.d1 ? 2 : 1, color)
|
|
||||||
del(src) // qdel
|
|
||||||
|
|
||||||
if(3.0)
|
|
||||||
if (prob(25))
|
|
||||||
new/obj/item/stack/cable_coil(src.loc, src.d1 ? 2 : 1, color)
|
|
||||||
del(src) // qdel
|
|
||||||
return
|
|
||||||
|
|
||||||
obj/structure/cable/proc/cableColor(var/colorC)
|
|
||||||
var/color_n = "#DD0000"
|
|
||||||
if(colorC)
|
|
||||||
color_n = colorC
|
|
||||||
color = color_n
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////
|
|
||||||
// Cable laying helpers
|
|
||||||
////////////////////////////////////////////////
|
|
||||||
|
|
||||||
//handles merging diagonally matching cables
|
|
||||||
//for info : direction^3 is flipping horizontally, direction^12 is flipping vertically
|
|
||||||
/obj/structure/cable/proc/mergeDiagonalsNetworks(var/direction)
|
|
||||||
|
|
||||||
//search for and merge diagonally matching cables from the first direction component (north/south)
|
|
||||||
var/turf/T = get_step(src, direction&3)//go north/south
|
|
||||||
|
|
||||||
for(var/obj/structure/cable/C in T)
|
|
||||||
|
|
||||||
if(!C)
|
|
||||||
continue
|
|
||||||
|
|
||||||
if(src == C)
|
|
||||||
continue
|
|
||||||
|
|
||||||
if(C.d1 == (direction^3) || C.d2 == (direction^3)) //we've got a diagonally matching cable
|
|
||||||
if(!C.powernet) //if the matching cable somehow got no powernet, make him one (should not happen for cables)
|
|
||||||
var/datum/powernet/newPN = new()
|
|
||||||
newPN.add_cable(C)
|
|
||||||
|
|
||||||
if(powernet) //if we already have a powernet, then merge the two powernets
|
|
||||||
merge_powernets(powernet,C.powernet)
|
|
||||||
else
|
|
||||||
C.powernet.add_cable(src) //else, we simply connect to the matching cable powernet
|
|
||||||
|
|
||||||
//the same from the second direction component (east/west)
|
|
||||||
T = get_step(src, direction&12)//go east/west
|
|
||||||
|
|
||||||
for(var/obj/structure/cable/C in T)
|
|
||||||
|
|
||||||
if(!C)
|
|
||||||
continue
|
|
||||||
|
|
||||||
if(src == C)
|
|
||||||
continue
|
|
||||||
if(C.d1 == (direction^12) || C.d2 == (direction^12)) //we've got a diagonally matching cable
|
|
||||||
if(!C.powernet) //if the matching cable somehow got no powernet, make him one (should not happen for cables)
|
|
||||||
var/datum/powernet/newPN = new()
|
|
||||||
newPN.add_cable(C)
|
|
||||||
|
|
||||||
if(powernet) //if we already have a powernet, then merge the two powernets
|
|
||||||
merge_powernets(powernet,C.powernet)
|
|
||||||
else
|
|
||||||
C.powernet.add_cable(src) //else, we simply connect to the matching cable powernet
|
|
||||||
|
|
||||||
// merge with the powernets of power objects in the given direction
|
|
||||||
/obj/structure/cable/proc/mergeConnectedNetworks(var/direction)
|
|
||||||
|
|
||||||
var/fdir = (!direction)? 0 : turn(direction, 180) //flip the direction, to match with the source position on its turf
|
|
||||||
|
|
||||||
if(!(d1 == direction || d2 == direction)) //if the cable is not pointed in this direction, do nothing
|
|
||||||
return
|
|
||||||
|
|
||||||
var/turf/TB = get_step(src, direction)
|
|
||||||
|
|
||||||
for(var/obj/structure/cable/C in TB)
|
|
||||||
|
|
||||||
if(!C)
|
|
||||||
continue
|
|
||||||
|
|
||||||
if(src == C)
|
|
||||||
continue
|
|
||||||
|
|
||||||
if(C.d1 == fdir || C.d2 == fdir) //we've got a matching cable in the neighbor turf
|
|
||||||
if(!C.powernet) //if the matching cable somehow got no powernet, make him one (should not happen for cables)
|
|
||||||
var/datum/powernet/newPN = new()
|
|
||||||
newPN.add_cable(C)
|
|
||||||
|
|
||||||
if(powernet) //if we already have a powernet, then merge the two powernets
|
|
||||||
merge_powernets(powernet,C.powernet)
|
|
||||||
else
|
|
||||||
C.powernet.add_cable(src) //else, we simply connect to the matching cable powernet
|
|
||||||
|
|
||||||
// merge with the powernets of power objects in the source turf
|
|
||||||
/obj/structure/cable/proc/mergeConnectedNetworksOnTurf()
|
|
||||||
var/list/to_connect = list()
|
|
||||||
|
|
||||||
if(!powernet) //if we somehow have no powernet, make one (should not happen for cables)
|
|
||||||
var/datum/powernet/newPN = new()
|
|
||||||
newPN.add_cable(src)
|
|
||||||
|
|
||||||
//first let's add turf cables to our powernet
|
|
||||||
//then we'll connect machines on turf with a node cable is present
|
|
||||||
for(var/AM in loc)
|
|
||||||
if(istype(AM,/obj/structure/cable))
|
|
||||||
var/obj/structure/cable/C = AM
|
|
||||||
if(C.d1 == d1 || C.d2 == d1 || C.d1 == d2 || C.d2 == d2) //only connected if they have a common direction
|
|
||||||
if(C.powernet == powernet) continue
|
|
||||||
if(C.powernet)
|
|
||||||
merge_powernets(powernet, C.powernet)
|
|
||||||
else
|
|
||||||
powernet.add_cable(C) //the cable was powernetless, let's just add it to our powernet
|
|
||||||
|
|
||||||
else if(istype(AM,/obj/machinery/power/apc))
|
|
||||||
var/obj/machinery/power/apc/N = AM
|
|
||||||
if(!N.terminal) continue // APC are connected through their terminal
|
|
||||||
|
|
||||||
if(N.terminal.powernet == powernet)
|
|
||||||
continue
|
|
||||||
|
|
||||||
to_connect += N.terminal //we'll connect the machines after all cables are merged
|
|
||||||
|
|
||||||
else if(istype(AM,/obj/machinery/power)) //other power machines
|
|
||||||
var/obj/machinery/power/M = AM
|
|
||||||
|
|
||||||
if(M.powernet == powernet)
|
|
||||||
continue
|
|
||||||
|
|
||||||
to_connect += M //we'll connect the machines after all cables are merged
|
|
||||||
|
|
||||||
//now that cables are done, let's connect found machines
|
|
||||||
for(var/obj/machinery/power/PM in to_connect)
|
|
||||||
if(!PM.connect_to_network())
|
|
||||||
PM.disconnect_from_network() //if we somehow can't connect the machine to the new powernet, remove it from the old nonetheless
|
|
||||||
|
|
||||||
//////////////////////////////////////////////
|
|
||||||
// Powernets handling helpers
|
|
||||||
//////////////////////////////////////////////
|
|
||||||
|
|
||||||
//if powernetless_only = 1, will only get connections without powernet
|
|
||||||
/obj/structure/cable/proc/get_connections(var/powernetless_only = 0)
|
|
||||||
. = list() // this will be a list of all connected power objects
|
|
||||||
var/turf/T
|
|
||||||
|
|
||||||
///// Z-Level Stuff
|
|
||||||
if (d1 == 11 || d1 == 12)
|
|
||||||
var/turf/controllerlocation = locate(1, 1, z)
|
|
||||||
for(var/obj/effect/landmark/zcontroller/controller in controllerlocation)
|
|
||||||
if(controller.up && d1 == 12)
|
|
||||||
T = locate(src.x, src.y, controller.up_target)
|
|
||||||
if(T)
|
|
||||||
. += power_list(T, src, 11, 1)
|
|
||||||
if(controller.down && d1 == 11)
|
|
||||||
T = locate(src.x, src.y, controller.down_target)
|
|
||||||
if(T)
|
|
||||||
. += power_list(T, src, 12, 1)
|
|
||||||
///// Z-Level Stuff
|
|
||||||
//get matching cables from the first direction
|
|
||||||
else if(d1) //if not a node cable
|
|
||||||
T = get_step(src, d1)
|
|
||||||
if(T)
|
|
||||||
. += power_list(T, src, turn(d1, 180), powernetless_only) //get adjacents matching cables
|
|
||||||
|
|
||||||
if(d1&(d1-1)) //diagonal direction, must check the 4 possibles adjacents tiles
|
|
||||||
T = get_step(src,d1&3) // go north/south
|
|
||||||
if(T)
|
|
||||||
. += power_list(T, src, d1 ^ 3, powernetless_only) //get diagonally matching cables
|
|
||||||
T = get_step(src,d1&12) // go east/west
|
|
||||||
if(T)
|
|
||||||
. += power_list(T, src, d1 ^ 12, powernetless_only) //get diagonally matching cables
|
|
||||||
|
|
||||||
. += power_list(loc, src, d1, powernetless_only) //get on turf matching cables
|
|
||||||
|
|
||||||
///// Z-Level Stuff
|
|
||||||
if(d2 == 11 || d2 == 12)
|
|
||||||
var/turf/controllerlocation = locate(1, 1, z)
|
|
||||||
for(var/obj/effect/landmark/zcontroller/controller in controllerlocation)
|
|
||||||
if(controller.up && d2 == 12)
|
|
||||||
T = locate(src.x, src.y, controller.up_target)
|
|
||||||
if(T)
|
|
||||||
. += power_list(T, src, 11, 1)
|
|
||||||
if(controller.down && d2 == 11)
|
|
||||||
T = locate(src.x, src.y, controller.down_target)
|
|
||||||
if(T)
|
|
||||||
. += power_list(T, src, 12, 1)
|
|
||||||
///// Z-Level Stuff
|
|
||||||
else
|
|
||||||
//do the same on the second direction (which can't be 0)
|
|
||||||
T = get_step(src, d2)
|
|
||||||
if(T)
|
|
||||||
. += power_list(T, src, turn(d2, 180), powernetless_only) //get adjacents matching cables
|
|
||||||
|
|
||||||
if(d2&(d2-1)) //diagonal direction, must check the 4 possibles adjacents tiles
|
|
||||||
T = get_step(src,d2&3) // go north/south
|
|
||||||
if(T)
|
|
||||||
. += power_list(T, src, d2 ^ 3, powernetless_only) //get diagonally matching cables
|
|
||||||
T = get_step(src,d2&12) // go east/west
|
|
||||||
if(T)
|
|
||||||
. += power_list(T, src, d2 ^ 12, powernetless_only) //get diagonally matching cables
|
|
||||||
. += power_list(loc, src, d2, powernetless_only) //get on turf matching cables
|
|
||||||
|
|
||||||
return .
|
|
||||||
|
|
||||||
//should be called after placing a cable which extends another cable, creating a "smooth" cable that no longer terminates in the centre of a turf.
|
|
||||||
//needed as this can, unlike other placements, disconnect cables
|
|
||||||
/obj/structure/cable/proc/denode()
|
|
||||||
var/turf/T1 = loc
|
|
||||||
if(!T1) return
|
|
||||||
|
|
||||||
var/list/powerlist = power_list(T1,src,0,0) //find the other cables that ended in the centre of the turf, with or without a powernet
|
|
||||||
if(powerlist.len>0)
|
|
||||||
var/datum/powernet/PN = new()
|
|
||||||
propagate_network(powerlist[1],PN) //propagates the new powernet beginning at the source cable
|
|
||||||
|
|
||||||
if(PN.is_empty()) //can happen with machines made nodeless when smoothing cables
|
|
||||||
del(PN) // qdel
|
|
||||||
|
|
||||||
// cut the cable's powernet at this cable and updates the powergrid
|
|
||||||
/obj/structure/cable/proc/cut_cable_from_powernet()
|
|
||||||
var/turf/T1 = loc
|
|
||||||
var/list/P_list
|
|
||||||
if(!T1) return
|
|
||||||
if(d1)
|
|
||||||
T1 = get_step(T1, d1)
|
|
||||||
P_list = power_list(T1, src, turn(d1,180),0,cable_only = 1) // what adjacently joins on to cut cable...
|
|
||||||
|
|
||||||
P_list += power_list(loc, src, d1, 0, cable_only = 1)//... and on turf
|
|
||||||
|
|
||||||
|
|
||||||
if(P_list.len == 0)//if nothing in both list, then the cable was a lone cable, just delete it and its powernet
|
|
||||||
powernet.remove_cable(src)
|
|
||||||
|
|
||||||
for(var/obj/machinery/power/P in T1)//check if it was powering a machine
|
|
||||||
if(!P.connect_to_network()) //can't find a node cable on a the turf to connect to
|
|
||||||
P.disconnect_from_network() //remove from current network (and delete powernet)
|
|
||||||
return
|
|
||||||
|
|
||||||
// remove the cut cable from its turf and powernet, so that it doesn't get count in propagate_network worklist
|
|
||||||
loc = null
|
|
||||||
powernet.remove_cable(src) //remove the cut cable from its powernet
|
|
||||||
|
|
||||||
var/datum/powernet/newPN = new()// creates a new powernet...
|
|
||||||
propagate_network(P_list[1], newPN)//... and propagates it to the other side of the cable
|
|
||||||
|
|
||||||
// Disconnect machines connected to nodes
|
|
||||||
if(d1 == 0) // if we cut a node (O-X) cable
|
|
||||||
for(var/obj/machinery/power/P in T1)
|
|
||||||
if(!P.connect_to_network()) //can't find a node cable on a the turf to connect to
|
|
||||||
P.disconnect_from_network() //remove from current network
|
|
||||||
|
|
||||||
///////////////////////////////////////////////
|
|
||||||
// The cable coil object, used for laying cable
|
|
||||||
///////////////////////////////////////////////
|
|
||||||
|
|
||||||
////////////////////////////////
|
|
||||||
// Definitions
|
|
||||||
////////////////////////////////
|
|
||||||
|
|
||||||
#define MAXCOIL 30
|
|
||||||
|
|
||||||
/obj/item/stack/cable_coil
|
|
||||||
name = "cable coil"
|
|
||||||
icon = 'icons/obj/power.dmi'
|
|
||||||
icon_state = "coil"
|
|
||||||
amount = MAXCOIL
|
|
||||||
max_amount = MAXCOIL
|
|
||||||
color = COLOR_RED
|
|
||||||
//item_color = COLOR_RED Use regular "color" var instead. No need to have it duplicate in two vars. Causes confusion.
|
|
||||||
desc = "A coil of power cable."
|
|
||||||
throwforce = 10
|
|
||||||
w_class = 2.0
|
|
||||||
throw_speed = 2
|
|
||||||
throw_range = 5
|
|
||||||
matter = list("metal" = 50, "glass" = 20)
|
|
||||||
flags = CONDUCT
|
|
||||||
slot_flags = SLOT_BELT
|
|
||||||
item_state = "coil"
|
|
||||||
attack_verb = list("whipped", "lashed", "disciplined", "flogged")
|
|
||||||
|
|
||||||
/obj/item/stack/cable_coil/cyborg
|
|
||||||
name = "cable coil synthesizer"
|
|
||||||
desc = "A device that makes cable."
|
|
||||||
gender = NEUTER
|
|
||||||
matter = null
|
|
||||||
uses_charge = 1
|
|
||||||
charge_costs = list(1)
|
|
||||||
stacktype = /obj/item/stack/cable_coil
|
|
||||||
|
|
||||||
/obj/item/stack/cable_coil/suicide_act(mob/user)
|
|
||||||
if(locate(/obj/item/weapon/stool) in user.loc)
|
|
||||||
user.visible_message("<span class='suicide'>[user] is making a noose with the [src.name]! It looks like \he's trying to commit suicide.</span>")
|
|
||||||
else
|
|
||||||
user.visible_message("<span class='suicide'>[user] is strangling \himself with the [src.name]! It looks like \he's trying to commit suicide.</span>")
|
|
||||||
return(OXYLOSS)
|
|
||||||
|
|
||||||
/obj/item/stack/cable_coil/New(loc, length = MAXCOIL, var/param_color = null)
|
|
||||||
..()
|
|
||||||
src.amount = length
|
|
||||||
if (param_color) // It should be red by default, so only recolor it if parameter was specified.
|
|
||||||
color = param_color
|
|
||||||
pixel_x = rand(-2,2)
|
|
||||||
pixel_y = rand(-2,2)
|
|
||||||
update_icon()
|
|
||||||
update_wclass()
|
|
||||||
|
|
||||||
///////////////////////////////////
|
|
||||||
// General procedures
|
|
||||||
///////////////////////////////////
|
|
||||||
|
|
||||||
//you can use wires to heal robotics
|
|
||||||
/obj/item/stack/cable_coil/attack(mob/M as mob, mob/user as mob)
|
|
||||||
if(istype(M,/mob/living/carbon/human))
|
|
||||||
var/mob/living/carbon/human/H = M
|
|
||||||
<<<<<<< HEAD
|
|
||||||
var/datum/organ/external/S = H.get_organ(user.zone_sel.selecting)
|
|
||||||
if(!(S.status & ORGAN_ROBOT) || user.a_intent != I_HELP)
|
|
||||||
=======
|
|
||||||
var/obj/item/organ/external/S = H.get_organ(user.zone_sel.selecting)
|
|
||||||
if(!(S.status & ORGAN_ROBOT) || user.a_intent != "help")
|
|
||||||
>>>>>>> d77010221cbd08f6373edebee25d727b6409413b
|
|
||||||
return ..()
|
|
||||||
|
|
||||||
if(H.species.flags & IS_SYNTHETIC)
|
|
||||||
if(M == user)
|
|
||||||
user << "\red You can't repair damage to your own body - it's against OH&S."
|
|
||||||
return
|
|
||||||
|
|
||||||
if(S.burn_dam > 0 && use(1))
|
|
||||||
S.heal_damage(0,15,0,1)
|
|
||||||
user.visible_message("\red \The [user] repairs some burn damage on \the [M]'s [S.name] with \the [src].")
|
|
||||||
return
|
|
||||||
else
|
|
||||||
user << "Nothing to fix!"
|
|
||||||
|
|
||||||
else
|
|
||||||
return ..()
|
|
||||||
|
|
||||||
|
|
||||||
/obj/item/stack/cable_coil/update_icon()
|
|
||||||
if (!color)
|
|
||||||
color = pick(COLOR_RED, COLOR_BLUE, COLOR_GREEN, COLOR_ORANGE, COLOR_WHITE, COLOR_PINK, COLOR_YELLOW, COLOR_CYAN)
|
|
||||||
if(amount == 1)
|
|
||||||
icon_state = "coil1"
|
|
||||||
name = "cable piece"
|
|
||||||
else if(amount == 2)
|
|
||||||
icon_state = "coil2"
|
|
||||||
name = "cable piece"
|
|
||||||
else
|
|
||||||
icon_state = "coil"
|
|
||||||
name = "cable coil"
|
|
||||||
|
|
||||||
/obj/item/stack/cable_coil/proc/update_wclass()
|
|
||||||
if(amount == 1)
|
|
||||||
w_class = 1.0
|
|
||||||
else
|
|
||||||
w_class = 2.0
|
|
||||||
|
|
||||||
/obj/item/stack/cable_coil/examine(mob/user)
|
|
||||||
if(get_dist(src, user) > 1)
|
|
||||||
return
|
|
||||||
|
|
||||||
if(get_amount() == 1)
|
|
||||||
user << "A short piece of power cable."
|
|
||||||
else if(get_amount() == 2)
|
|
||||||
user << "A piece of power cable."
|
|
||||||
else
|
|
||||||
user << "A coil of power cable. There are [get_amount()] lengths of cable in the coil."
|
|
||||||
|
|
||||||
|
|
||||||
/obj/item/stack/cable_coil/verb/make_restraint()
|
|
||||||
set name = "Make Cable Restraints"
|
|
||||||
set category = "Object"
|
|
||||||
var/mob/M = usr
|
|
||||||
|
|
||||||
if(ishuman(M) && !M.restrained() && !M.stat && !M.paralysis && ! M.stunned)
|
|
||||||
if(!istype(usr.loc,/turf)) return
|
|
||||||
if(src.amount <= 14)
|
|
||||||
usr << "\red You need at least 15 lengths to make restraints!"
|
|
||||||
return
|
|
||||||
var/obj/item/weapon/handcuffs/cable/B = new /obj/item/weapon/handcuffs/cable(usr.loc)
|
|
||||||
B.color = color
|
|
||||||
usr << "<span class='notice'>You wind some cable together to make some restraints.</span>"
|
|
||||||
src.use(15)
|
|
||||||
else
|
|
||||||
usr << "\blue You cannot do that."
|
|
||||||
..()
|
|
||||||
|
|
||||||
/obj/item/stack/cable_coil/cyborg/verb/set_colour()
|
|
||||||
set name = "Change Colour"
|
|
||||||
set category = "Object"
|
|
||||||
|
|
||||||
var/list/possible_colours = list ("Yellow", "Green", "Pink", "Blue", "Orange", "Cyan", "Red")
|
|
||||||
var/selected_type = input("Pick new colour.", "Cable Colour", null, null) as null|anything in possible_colours
|
|
||||||
|
|
||||||
if(selected_type)
|
|
||||||
switch(selected_type)
|
|
||||||
if("Yellow")
|
|
||||||
color = COLOR_YELLOW
|
|
||||||
if("Green")
|
|
||||||
color = COLOR_GREEN
|
|
||||||
if("Pink")
|
|
||||||
color = COLOR_PINK
|
|
||||||
if("Blue")
|
|
||||||
color = COLOR_BLUE
|
|
||||||
if("Orange")
|
|
||||||
color = COLOR_ORANGE
|
|
||||||
if("Cyan")
|
|
||||||
color = COLOR_CYAN
|
|
||||||
else
|
|
||||||
color = COLOR_RED
|
|
||||||
usr << "You change your cable coil's colour to [selected_type]"
|
|
||||||
|
|
||||||
// Items usable on a cable coil :
|
|
||||||
// - Wirecutters : cut them duh !
|
|
||||||
// - Cable coil : merge cables
|
|
||||||
/obj/item/stack/cable_coil/attackby(obj/item/weapon/W, mob/user)
|
|
||||||
..()
|
|
||||||
if( istype(W, /obj/item/weapon/wirecutters) && src.get_amount() > 1)
|
|
||||||
src.use(1)
|
|
||||||
new/obj/item/stack/cable_coil(user.loc, 1,color)
|
|
||||||
user << "You cut a piece off the cable coil."
|
|
||||||
src.update_icon()
|
|
||||||
return
|
|
||||||
else if(istype(W, /obj/item/stack/cable_coil))
|
|
||||||
var/obj/item/stack/cable_coil/C = W
|
|
||||||
if(C.get_amount() >= get_max_amount())
|
|
||||||
user << "The coil is too long, you cannot add any more cable to it."
|
|
||||||
return
|
|
||||||
|
|
||||||
if( (C.get_amount() + src.get_amount() <= get_max_amount()) )
|
|
||||||
user << "You join the cable coils together."
|
|
||||||
C.give(src.get_amount()) // give it cable
|
|
||||||
src.use(src.get_amount()) // make sure this one cleans up right
|
|
||||||
return
|
|
||||||
|
|
||||||
else
|
|
||||||
var/amt = get_max_amount() - C.get_amount()
|
|
||||||
user << "You transfer [amt] length\s of cable from one coil to the other."
|
|
||||||
C.give(amt)
|
|
||||||
src.use(amt)
|
|
||||||
return
|
|
||||||
|
|
||||||
//remove cables from the stack
|
|
||||||
/* This is probably reduntant
|
|
||||||
/obj/item/stack/cable_coil/use(var/used)
|
|
||||||
if(src.amount < used)
|
|
||||||
return 0
|
|
||||||
else if (src.amount == used)
|
|
||||||
if(ismob(loc)) //handle mob icon update
|
|
||||||
var/mob/M = loc
|
|
||||||
M.unEquip(src)
|
|
||||||
qdel(src)
|
|
||||||
return 1
|
|
||||||
else
|
|
||||||
amount -= used
|
|
||||||
update_icon()
|
|
||||||
return 1
|
|
||||||
*/
|
|
||||||
/obj/item/stack/cable_coil/use(var/used)
|
|
||||||
. = ..()
|
|
||||||
update_icon()
|
|
||||||
return
|
|
||||||
|
|
||||||
//add cables to the stack
|
|
||||||
/obj/item/stack/cable_coil/proc/give(var/extra)
|
|
||||||
if(amount + extra > MAXCOIL)
|
|
||||||
amount = MAXCOIL
|
|
||||||
else
|
|
||||||
amount += extra
|
|
||||||
update_icon()
|
|
||||||
|
|
||||||
///////////////////////////////////////////////
|
|
||||||
// Cable laying procedures
|
|
||||||
//////////////////////////////////////////////
|
|
||||||
|
|
||||||
// called when cable_coil is clicked on a turf/simulated/floor
|
|
||||||
/obj/item/stack/cable_coil/proc/turf_place(turf/simulated/floor/F, mob/user)
|
|
||||||
if(!isturf(user.loc))
|
|
||||||
return
|
|
||||||
|
|
||||||
if(get_amount() < 1) // Out of cable
|
|
||||||
user << "There is no cable left."
|
|
||||||
return
|
|
||||||
|
|
||||||
if(get_dist(F,user) > 1) // Too far
|
|
||||||
user << "You can't lay cable at a place that far away."
|
|
||||||
return
|
|
||||||
|
|
||||||
if(F.intact) // Ff floor is intact, complain
|
|
||||||
user << "You can't lay cable there unless the floor tiles are removed."
|
|
||||||
return
|
|
||||||
|
|
||||||
else
|
|
||||||
var/dirn
|
|
||||||
|
|
||||||
if(user.loc == F)
|
|
||||||
dirn = user.dir // if laying on the tile we're on, lay in the direction we're facing
|
|
||||||
else
|
|
||||||
dirn = get_dir(F, user)
|
|
||||||
|
|
||||||
for(var/obj/structure/cable/LC in F)
|
|
||||||
if((LC.d1 == dirn && LC.d2 == 0 ) || ( LC.d2 == dirn && LC.d1 == 0))
|
|
||||||
user << "<span class='warning'>There's already a cable at that position.</span>"
|
|
||||||
return
|
|
||||||
///// Z-Level Stuff
|
|
||||||
// check if the target is open space
|
|
||||||
if(istype(F, /turf/simulated/floor/open))
|
|
||||||
for(var/obj/structure/cable/LC in F)
|
|
||||||
if((LC.d1 == dirn && LC.d2 == 11 ) || ( LC.d2 == dirn && LC.d1 == 11))
|
|
||||||
user << "<span class='warning'>There's already a cable at that position.</span>"
|
|
||||||
return
|
|
||||||
|
|
||||||
var/turf/simulated/floor/open/temp = F
|
|
||||||
var/obj/structure/cable/C = new(F)
|
|
||||||
var/obj/structure/cable/D = new(temp.floorbelow)
|
|
||||||
|
|
||||||
C.cableColor(color)
|
|
||||||
|
|
||||||
C.d1 = 11
|
|
||||||
C.d2 = dirn
|
|
||||||
C.add_fingerprint(user)
|
|
||||||
C.updateicon()
|
|
||||||
|
|
||||||
var/datum/powernet/PN = new()
|
|
||||||
PN.add_cable(C)
|
|
||||||
|
|
||||||
C.mergeConnectedNetworks(C.d2)
|
|
||||||
C.mergeConnectedNetworksOnTurf()
|
|
||||||
|
|
||||||
D.cableColor(color)
|
|
||||||
|
|
||||||
D.d1 = 12
|
|
||||||
D.d2 = 0
|
|
||||||
D.add_fingerprint(user)
|
|
||||||
D.updateicon()
|
|
||||||
|
|
||||||
PN.add_cable(D)
|
|
||||||
D.mergeConnectedNetworksOnTurf()
|
|
||||||
|
|
||||||
// do the normal stuff
|
|
||||||
else
|
|
||||||
///// Z-Level Stuff
|
|
||||||
for(var/obj/structure/cable/LC in F)
|
|
||||||
if((LC.d1 == dirn && LC.d2 == 0 ) || ( LC.d2 == dirn && LC.d1 == 0))
|
|
||||||
user << "There's already a cable at that position."
|
|
||||||
return
|
|
||||||
|
|
||||||
var/obj/structure/cable/C = new(F)
|
|
||||||
|
|
||||||
C.cableColor(color)
|
|
||||||
|
|
||||||
//set up the new cable
|
|
||||||
C.d1 = 0 //it's a O-X node cable
|
|
||||||
C.d2 = dirn
|
|
||||||
C.add_fingerprint(user)
|
|
||||||
C.updateicon()
|
|
||||||
|
|
||||||
//create a new powernet with the cable, if needed it will be merged later
|
|
||||||
var/datum/powernet/PN = new()
|
|
||||||
PN.add_cable(C)
|
|
||||||
|
|
||||||
C.mergeConnectedNetworks(C.d2) //merge the powernet with adjacents powernets
|
|
||||||
C.mergeConnectedNetworksOnTurf() //merge the powernet with on turf powernets
|
|
||||||
|
|
||||||
if(C.d2 & (C.d2 - 1))// if the cable is layed diagonally, check the others 2 possible directions
|
|
||||||
C.mergeDiagonalsNetworks(C.d2)
|
|
||||||
|
|
||||||
|
|
||||||
use(1)
|
|
||||||
if (C.shock(user, 50))
|
|
||||||
if (prob(50)) //fail
|
|
||||||
new/obj/item/stack/cable_coil(C.loc, 1, C.color)
|
|
||||||
del(C) // qdel
|
|
||||||
|
|
||||||
// called when cable_coil is click on an installed obj/cable
|
|
||||||
// or click on a turf that already contains a "node" cable
|
|
||||||
/obj/item/stack/cable_coil/proc/cable_join(obj/structure/cable/C, mob/user)
|
|
||||||
var/turf/U = user.loc
|
|
||||||
if(!isturf(U))
|
|
||||||
return
|
|
||||||
|
|
||||||
var/turf/T = C.loc
|
|
||||||
|
|
||||||
if(!isturf(T) || T.intact) // sanity checks, also stop use interacting with T-scanner revealed cable
|
|
||||||
return
|
|
||||||
|
|
||||||
if(get_dist(C, user) > 1) // make sure it's close enough
|
|
||||||
user << "You can't lay cable at a place that far away."
|
|
||||||
return
|
|
||||||
|
|
||||||
|
|
||||||
if(U == T) //if clicked on the turf we're standing on, try to put a cable in the direction we're facing
|
|
||||||
turf_place(T,user)
|
|
||||||
return
|
|
||||||
|
|
||||||
var/dirn = get_dir(C, user)
|
|
||||||
|
|
||||||
// one end of the clicked cable is pointing towards us
|
|
||||||
if(C.d1 == dirn || C.d2 == dirn)
|
|
||||||
if(U.intact) // can't place a cable if the floor is complete
|
|
||||||
user << "You can't lay cable there unless the floor tiles are removed."
|
|
||||||
return
|
|
||||||
else
|
|
||||||
// cable is pointing at us, we're standing on an open tile
|
|
||||||
// so create a stub pointing at the clicked cable on our tile
|
|
||||||
|
|
||||||
var/fdirn = turn(dirn, 180) // the opposite direction
|
|
||||||
|
|
||||||
for(var/obj/structure/cable/LC in U) // check to make sure there's not a cable there already
|
|
||||||
if(LC.d1 == fdirn || LC.d2 == fdirn)
|
|
||||||
user << "There's already a cable at that position."
|
|
||||||
return
|
|
||||||
|
|
||||||
var/obj/structure/cable/NC = new(U)
|
|
||||||
NC.cableColor(color)
|
|
||||||
|
|
||||||
NC.d1 = 0
|
|
||||||
NC.d2 = fdirn
|
|
||||||
NC.add_fingerprint()
|
|
||||||
NC.updateicon()
|
|
||||||
|
|
||||||
//create a new powernet with the cable, if needed it will be merged later
|
|
||||||
var/datum/powernet/newPN = new()
|
|
||||||
newPN.add_cable(NC)
|
|
||||||
|
|
||||||
NC.mergeConnectedNetworks(NC.d2) //merge the powernet with adjacents powernets
|
|
||||||
NC.mergeConnectedNetworksOnTurf() //merge the powernet with on turf powernets
|
|
||||||
|
|
||||||
if(NC.d2 & (NC.d2 - 1))// if the cable is layed diagonally, check the others 2 possible directions
|
|
||||||
NC.mergeDiagonalsNetworks(NC.d2)
|
|
||||||
|
|
||||||
use(1)
|
|
||||||
|
|
||||||
if (NC.shock(user, 50))
|
|
||||||
if (prob(50)) //fail
|
|
||||||
new/obj/item/stack/cable_coil(NC.loc, 1, NC.color)
|
|
||||||
del(NC) // qdel
|
|
||||||
|
|
||||||
return
|
|
||||||
|
|
||||||
// exisiting cable doesn't point at our position, so see if it's a stub
|
|
||||||
else if(C.d1 == 0)
|
|
||||||
// if so, make it a full cable pointing from it's old direction to our dirn
|
|
||||||
var/nd1 = C.d2 // these will be the new directions
|
|
||||||
var/nd2 = dirn
|
|
||||||
|
|
||||||
|
|
||||||
if(nd1 > nd2) // swap directions to match icons/states
|
|
||||||
nd1 = dirn
|
|
||||||
nd2 = C.d2
|
|
||||||
|
|
||||||
|
|
||||||
for(var/obj/structure/cable/LC in T) // check to make sure there's no matching cable
|
|
||||||
if(LC == C) // skip the cable we're interacting with
|
|
||||||
continue
|
|
||||||
if((LC.d1 == nd1 && LC.d2 == nd2) || (LC.d1 == nd2 && LC.d2 == nd1) ) // make sure no cable matches either direction
|
|
||||||
user << "There's already a cable at that position."
|
|
||||||
return
|
|
||||||
|
|
||||||
|
|
||||||
C.cableColor(color)
|
|
||||||
|
|
||||||
C.d1 = nd1
|
|
||||||
C.d2 = nd2
|
|
||||||
|
|
||||||
C.add_fingerprint()
|
|
||||||
C.updateicon()
|
|
||||||
|
|
||||||
|
|
||||||
C.mergeConnectedNetworks(C.d1) //merge the powernets...
|
|
||||||
C.mergeConnectedNetworks(C.d2) //...in the two new cable directions
|
|
||||||
C.mergeConnectedNetworksOnTurf()
|
|
||||||
|
|
||||||
if(C.d1 & (C.d1 - 1))// if the cable is layed diagonally, check the others 2 possible directions
|
|
||||||
C.mergeDiagonalsNetworks(C.d1)
|
|
||||||
|
|
||||||
if(C.d2 & (C.d2 - 1))// if the cable is layed diagonally, check the others 2 possible directions
|
|
||||||
C.mergeDiagonalsNetworks(C.d2)
|
|
||||||
|
|
||||||
use(1)
|
|
||||||
|
|
||||||
if (C.shock(user, 50))
|
|
||||||
if (prob(50)) //fail
|
|
||||||
new/obj/item/stack/cable_coil(C.loc, 2, C.color)
|
|
||||||
del(C) // qdel
|
|
||||||
return
|
|
||||||
|
|
||||||
C.denode()// this call may have disconnected some cables that terminated on the centre of the turf, if so split the powernets.
|
|
||||||
return
|
|
||||||
|
|
||||||
//////////////////////////////
|
|
||||||
// Misc.
|
|
||||||
/////////////////////////////
|
|
||||||
|
|
||||||
/obj/item/stack/cable_coil/cut
|
|
||||||
item_state = "coil2"
|
|
||||||
|
|
||||||
/obj/item/stack/cable_coil/cut/New(loc)
|
|
||||||
..()
|
|
||||||
src.amount = rand(1,2)
|
|
||||||
pixel_x = rand(-2,2)
|
|
||||||
pixel_y = rand(-2,2)
|
|
||||||
update_icon()
|
|
||||||
update_wclass()
|
|
||||||
|
|
||||||
/obj/item/stack/cable_coil/yellow
|
|
||||||
color = COLOR_YELLOW
|
|
||||||
|
|
||||||
/obj/item/stack/cable_coil/blue
|
|
||||||
color = COLOR_BLUE
|
|
||||||
|
|
||||||
/obj/item/stack/cable_coil/green
|
|
||||||
color = COLOR_GREEN
|
|
||||||
|
|
||||||
/obj/item/stack/cable_coil/pink
|
|
||||||
color = COLOR_PINK
|
|
||||||
|
|
||||||
/obj/item/stack/cable_coil/orange
|
|
||||||
color = COLOR_ORANGE
|
|
||||||
|
|
||||||
/obj/item/stack/cable_coil/cyan
|
|
||||||
color = COLOR_CYAN
|
|
||||||
|
|
||||||
/obj/item/stack/cable_coil/white
|
|
||||||
color = COLOR_WHITE
|
|
||||||
|
|
||||||
/obj/item/stack/cable_coil/random/New()
|
|
||||||
color = pick(COLOR_RED, COLOR_BLUE, COLOR_GREEN, COLOR_WHITE, COLOR_PINK, COLOR_YELLOW, COLOR_CYAN)
|
|
||||||
..()
|
|
||||||
Reference in New Issue
Block a user