mirror of
https://github.com/PolarisSS13/Polaris.git
synced 2025-12-17 13:42:44 +00:00
Merged with dev.
This commit is contained in:
@@ -1117,6 +1117,7 @@
|
|||||||
#include "code\modules\mob\living\carbon\human\human_defense.dm"
|
#include "code\modules\mob\living\carbon\human\human_defense.dm"
|
||||||
#include "code\modules\mob\living\carbon\human\human_defines.dm"
|
#include "code\modules\mob\living\carbon\human\human_defines.dm"
|
||||||
#include "code\modules\mob\living\carbon\human\human_movement.dm"
|
#include "code\modules\mob\living\carbon\human\human_movement.dm"
|
||||||
|
#include "code\modules\mob\living\carbon\human\human_organs.dm"
|
||||||
#include "code\modules\mob\living\carbon\human\human_powers.dm"
|
#include "code\modules\mob\living\carbon\human\human_powers.dm"
|
||||||
#include "code\modules\mob\living\carbon\human\human_species.dm"
|
#include "code\modules\mob\living\carbon\human\human_species.dm"
|
||||||
#include "code\modules\mob\living\carbon\human\inventory.dm"
|
#include "code\modules\mob\living\carbon\human\inventory.dm"
|
||||||
@@ -1273,9 +1274,11 @@
|
|||||||
#include "code\modules\organs\organ.dm"
|
#include "code\modules\organs\organ.dm"
|
||||||
#include "code\modules\organs\organ_alien.dm"
|
#include "code\modules\organs\organ_alien.dm"
|
||||||
#include "code\modules\organs\organ_external.dm"
|
#include "code\modules\organs\organ_external.dm"
|
||||||
|
#include "code\modules\organs\organ_icon.dm"
|
||||||
#include "code\modules\organs\organ_internal.dm"
|
#include "code\modules\organs\organ_internal.dm"
|
||||||
#include "code\modules\organs\organ_objects.dm"
|
#include "code\modules\organs\organ_stump.dm"
|
||||||
#include "code\modules\organs\pain.dm"
|
#include "code\modules\organs\pain.dm"
|
||||||
|
#include "code\modules\organs\robolimbs.dm"
|
||||||
#include "code\modules\organs\wound.dm"
|
#include "code\modules\organs\wound.dm"
|
||||||
#include "code\modules\overmap\_defines.dm"
|
#include "code\modules\overmap\_defines.dm"
|
||||||
#include "code\modules\overmap\sectors.dm"
|
#include "code\modules\overmap\sectors.dm"
|
||||||
|
|||||||
@@ -120,7 +120,7 @@ obj/var/contaminated = 0
|
|||||||
if(!species.has_organ["eyes"])
|
if(!species.has_organ["eyes"])
|
||||||
return
|
return
|
||||||
|
|
||||||
var/datum/organ/internal/eyes/E = internal_organs_by_name["eyes"]
|
var/obj/item/organ/eyes/E = internal_organs_by_name["eyes"]
|
||||||
if(E)
|
if(E)
|
||||||
if(prob(20)) src << "\red Your eyes burn!"
|
if(prob(20)) src << "\red Your eyes burn!"
|
||||||
E.damage += 2.5
|
E.damage += 2.5
|
||||||
|
|||||||
@@ -41,10 +41,17 @@
|
|||||||
// TODO: needs to be refactored into a mob/living level attacked_by() proc. ~Z
|
// TODO: needs to be refactored into a mob/living level attacked_by() proc. ~Z
|
||||||
if(istype(M, /mob/living/carbon/human))
|
if(istype(M, /mob/living/carbon/human))
|
||||||
var/mob/living/carbon/human/H = M
|
var/mob/living/carbon/human/H = M
|
||||||
var/hit = H.attacked_by(src, user, def_zone)
|
|
||||||
if(hit && hitsound)
|
// Handle striking to cripple.
|
||||||
|
var/dislocation_str
|
||||||
|
if(user.a_intent == "disarm")
|
||||||
|
dislocation_str = H.attack_joint(src, user, def_zone)
|
||||||
|
if(H.attacked_by(src, user, def_zone) && hitsound)
|
||||||
playsound(loc, hitsound, 50, 1, -1)
|
playsound(loc, hitsound, 50, 1, -1)
|
||||||
return hit
|
spawn(1) //ugh I hate this but I don't want to root through human attack procs to print it after this call resolves.
|
||||||
|
if(dislocation_str) user.visible_message("<span class='danger'>[dislocation_str]</span>")
|
||||||
|
return 1
|
||||||
|
return 0
|
||||||
else
|
else
|
||||||
if(attack_verb.len)
|
if(attack_verb.len)
|
||||||
user.visible_message("<span class='danger'>[M] has been [pick(attack_verb)] with [src] by [user]!</span>")
|
user.visible_message("<span class='danger'>[M] has been [pick(attack_verb)] with [src] by [user]!</span>")
|
||||||
|
|||||||
@@ -155,12 +155,8 @@ proc/get_id_photo(var/mob/living/carbon/human/H)
|
|||||||
temp = new /icon(icobase, "head_[g]")
|
temp = new /icon(icobase, "head_[g]")
|
||||||
preview_icon.Blend(temp, ICON_OVERLAY)
|
preview_icon.Blend(temp, ICON_OVERLAY)
|
||||||
|
|
||||||
for(var/datum/organ/external/E in H.organs)
|
for(var/obj/item/organ/external/E in H.organs)
|
||||||
if(E.status & ORGAN_CUT_AWAY || E.status & ORGAN_DESTROYED) continue
|
preview_icon.Blend(E.get_icon(), ICON_OVERLAY)
|
||||||
temp = new /icon(icobase, "[E.name]")
|
|
||||||
if(E.status & ORGAN_ROBOT)
|
|
||||||
temp.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0))
|
|
||||||
preview_icon.Blend(temp, ICON_OVERLAY)
|
|
||||||
|
|
||||||
//Tail
|
//Tail
|
||||||
if(H.species.tail)
|
if(H.species.tail)
|
||||||
|
|||||||
@@ -854,7 +854,7 @@ client
|
|||||||
usr << "This can only be done to instances of type /mob/living/carbon"
|
usr << "This can only be done to instances of type /mob/living/carbon"
|
||||||
return
|
return
|
||||||
|
|
||||||
var/new_organ = input("Please choose an organ to add.","Organ",null) as null|anything in typesof(/datum/organ/internal)-/datum/organ/internal
|
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(!new_organ) return
|
||||||
|
|
||||||
if(!M)
|
if(!M)
|
||||||
@@ -865,36 +865,8 @@ client
|
|||||||
usr << "Mob already has that organ."
|
usr << "Mob already has that organ."
|
||||||
return
|
return
|
||||||
|
|
||||||
if(istype(M,/mob/living/carbon/human))
|
new new_organ(M)
|
||||||
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]."
|
|
||||||
|
|
||||||
else if(href_list["remorgan"])
|
else if(href_list["remorgan"])
|
||||||
if(!check_rights(R_SPAWN)) return
|
if(!check_rights(R_SPAWN)) return
|
||||||
@@ -904,7 +876,7 @@ client
|
|||||||
usr << "This can only be done to instances of type /mob/living/carbon"
|
usr << "This can only be done to instances of type /mob/living/carbon"
|
||||||
return
|
return
|
||||||
|
|
||||||
var/rem_organ = input("Please choose an organ to remove.","Organ",null) as null|anything in M.internal_organs
|
var/obj/item/organ/rem_organ = input("Please choose an organ to remove.","Organ",null) as null|anything in M.internal_organs
|
||||||
|
|
||||||
if(!M)
|
if(!M)
|
||||||
usr << "Mob doesn't exist anymore"
|
usr << "Mob doesn't exist anymore"
|
||||||
@@ -915,6 +887,7 @@ client
|
|||||||
return
|
return
|
||||||
|
|
||||||
usr << "Removed [rem_organ] from [M]."
|
usr << "Removed [rem_organ] from [M]."
|
||||||
|
rem_organ.removed()
|
||||||
del(rem_organ)
|
del(rem_organ)
|
||||||
|
|
||||||
else if(href_list["fix_nano"])
|
else if(href_list["fix_nano"])
|
||||||
|
|||||||
988
code/datums/datumvars.dm.orig
Normal file
988
code/datums/datumvars.dm.orig
Normal file
@@ -0,0 +1,988 @@
|
|||||||
|
|
||||||
|
// 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
|
||||||
|
|
||||||
@@ -46,7 +46,7 @@
|
|||||||
H << "\red Your abdomen is a world of pain!"
|
H << "\red Your abdomen is a world of pain!"
|
||||||
H.Weaken(10)
|
H.Weaken(10)
|
||||||
|
|
||||||
var/datum/organ/external/groin = H.get_organ("groin")
|
var/obj/item/organ/external/groin = H.get_organ("groin")
|
||||||
var/datum/wound/W = new /datum/wound/internal_bleeding(20)
|
var/datum/wound/W = new /datum/wound/internal_bleeding(20)
|
||||||
H.adjustToxLoss(25)
|
H.adjustToxLoss(25)
|
||||||
groin.wounds += W
|
groin.wounds += W
|
||||||
|
|||||||
@@ -309,7 +309,7 @@ datum/mind
|
|||||||
switch(href_list["implant"])
|
switch(href_list["implant"])
|
||||||
if("remove")
|
if("remove")
|
||||||
for(var/obj/item/weapon/implant/loyalty/I in H.contents)
|
for(var/obj/item/weapon/implant/loyalty/I in H.contents)
|
||||||
for(var/datum/organ/external/organs in H.organs)
|
for(var/obj/item/organ/external/organs in H.organs)
|
||||||
if(I in organs.implants)
|
if(I in organs.implants)
|
||||||
I.Del()
|
I.Del()
|
||||||
break
|
break
|
||||||
|
|||||||
@@ -27,8 +27,8 @@ var/datum/antagonist/xenos/borer/borers
|
|||||||
borer.host = host
|
borer.host = host
|
||||||
borer.host_brain.name = host.name
|
borer.host_brain.name = host.name
|
||||||
borer.host_brain.real_name = host.real_name
|
borer.host_brain.real_name = host.real_name
|
||||||
var/datum/organ/external/head = host.get_organ("head")
|
var/obj/item/organ/external/head = host.get_organ("head")
|
||||||
head.implants += borer
|
if(head) head.implants += borer
|
||||||
|
|
||||||
/datum/antagonist/xenos/borer/proc/get_hosts()
|
/datum/antagonist/xenos/borer/proc/get_hosts()
|
||||||
var/list/possible_hosts = list()
|
var/list/possible_hosts = list()
|
||||||
|
|||||||
@@ -146,6 +146,7 @@
|
|||||||
H.r_eyes = dna.GetUIValueRange(DNA_UI_EYES_R, 255)
|
H.r_eyes = dna.GetUIValueRange(DNA_UI_EYES_R, 255)
|
||||||
H.g_eyes = dna.GetUIValueRange(DNA_UI_EYES_G, 255)
|
H.g_eyes = dna.GetUIValueRange(DNA_UI_EYES_G, 255)
|
||||||
H.b_eyes = dna.GetUIValueRange(DNA_UI_EYES_B, 255)
|
H.b_eyes = dna.GetUIValueRange(DNA_UI_EYES_B, 255)
|
||||||
|
H.update_eyes()
|
||||||
|
|
||||||
H.s_tone = 35 - dna.GetUIValueRange(DNA_UI_SKIN_TONE, 220) // Value can be negative.
|
H.s_tone = 35 - dna.GetUIValueRange(DNA_UI_SKIN_TONE, 220) // Value can be negative.
|
||||||
|
|
||||||
|
|||||||
@@ -235,6 +235,9 @@
|
|||||||
H.r_eyes = hex2num(getblock(structure,8,3))
|
H.r_eyes = hex2num(getblock(structure,8,3))
|
||||||
H.g_eyes = hex2num(getblock(structure,9,3))
|
H.g_eyes = hex2num(getblock(structure,9,3))
|
||||||
H.b_eyes = hex2num(getblock(structure,10,3))
|
H.b_eyes = hex2num(getblock(structure,10,3))
|
||||||
|
if(H.internal_organs_by_name["eyes"])
|
||||||
|
var/obj/item/organ/eyes/eyes = H.internal_organs_by_name["eyes"]
|
||||||
|
eyes.eye_colour = list(H.r_eyes,H.g_eyes,H.b_eyes)
|
||||||
|
|
||||||
if (isblockon(getblock(structure, 11,3),11 , 1))
|
if (isblockon(getblock(structure, 11,3),11 , 1))
|
||||||
H.gender = FEMALE
|
H.gender = FEMALE
|
||||||
@@ -461,7 +464,7 @@
|
|||||||
O.adjustToxLoss(M.getToxLoss() + 20)
|
O.adjustToxLoss(M.getToxLoss() + 20)
|
||||||
O.adjustOxyLoss(M.getOxyLoss())
|
O.adjustOxyLoss(M.getOxyLoss())
|
||||||
O.stat = M.stat
|
O.stat = M.stat
|
||||||
O.a_intent = I_HURT
|
O.a_intent = "hurt"
|
||||||
for (var/obj/item/weapon/implant/I in implants)
|
for (var/obj/item/weapon/implant/I in implants)
|
||||||
I.loc = O
|
I.loc = O
|
||||||
I.implanted = O
|
I.implanted = O
|
||||||
|
|||||||
1123
code/game/dna/dna_misc.dm.orig
Normal file
1123
code/game/dna/dna_misc.dm.orig
Normal file
File diff suppressed because it is too large
Load Diff
@@ -213,7 +213,7 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
|
|||||||
src << "<span class='notice'>We stab [T] with the proboscis.</span>"
|
src << "<span class='notice'>We stab [T] with the proboscis.</span>"
|
||||||
src.visible_message("<span class='danger'>[src] stabs [T] with the proboscis!</span>")
|
src.visible_message("<span class='danger'>[src] stabs [T] with the proboscis!</span>")
|
||||||
T << "<span class='danger'>You feel a sharp stabbing pain!</span>"
|
T << "<span class='danger'>You feel a sharp stabbing pain!</span>"
|
||||||
var/datum/organ/external/affecting = T.get_organ(src.zone_sel.selecting)
|
var/obj/item/organ/external/affecting = T.get_organ(src.zone_sel.selecting)
|
||||||
if(affecting.take_damage(39,0,1,0,"large organic needle"))
|
if(affecting.take_damage(39,0,1,0,"large organic needle"))
|
||||||
T:UpdateDamageIcon()
|
T:UpdateDamageIcon()
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
user.Paralyse(5)
|
user.Paralyse(5)
|
||||||
user << "\red An unexplicable force powerfully repels the sword from [target]!"
|
user << "\red An unexplicable force powerfully repels the sword from [target]!"
|
||||||
var/organ = ((user.hand ? "l_":"r_") + "arm")
|
var/organ = ((user.hand ? "l_":"r_") + "arm")
|
||||||
var/datum/organ/external/affecting = user.get_organ(organ)
|
var/obj/item/organ/external/affecting = user.get_organ(organ)
|
||||||
if(affecting.take_damage(rand(force/2, force))) //random amount of damage between half of the blade's force and the full force of the blade.
|
if(affecting.take_damage(rand(force/2, force))) //random amount of damage between half of the blade's force and the full force of the blade.
|
||||||
user.UpdateDamageIcon()
|
user.UpdateDamageIcon()
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -433,10 +433,9 @@ var/list/sacrificed = list()
|
|||||||
D.b_eyes = 200
|
D.b_eyes = 200
|
||||||
D.r_eyes = 200
|
D.r_eyes = 200
|
||||||
D.g_eyes = 200
|
D.g_eyes = 200
|
||||||
|
D.update_eyes()
|
||||||
D.underwear = 0
|
D.underwear = 0
|
||||||
|
|
||||||
D.key = ghost.key
|
D.key = ghost.key
|
||||||
|
|
||||||
cult.add_antagonist(D.mind)
|
cult.add_antagonist(D.mind)
|
||||||
|
|
||||||
if(!chose_name)
|
if(!chose_name)
|
||||||
|
|||||||
@@ -455,15 +455,21 @@ datum/objective/harm
|
|||||||
return 0
|
return 0
|
||||||
|
|
||||||
var/mob/living/carbon/human/H = target.current
|
var/mob/living/carbon/human/H = target.current
|
||||||
for(var/datum/organ/external/E in H.organs)
|
for(var/obj/item/organ/external/E in H.organs)
|
||||||
if(E.status & ORGAN_BROKEN)
|
if(E.status & ORGAN_BROKEN)
|
||||||
already_completed = 1
|
|
||||||
return 1
|
return 1
|
||||||
if(E.status & ORGAN_DESTROYED && !E.amputated)
|
for(var/limb_tag in H.species.has_limbs) //todo check prefs for robotic limbs and amputations.
|
||||||
already_completed = 1
|
var/list/organ_data = H.species.has_limbs[limb_tag]
|
||||||
|
var/limb_type = organ_data["path"]
|
||||||
|
var/found
|
||||||
|
for(var/obj/item/organ/external/E in H.organs)
|
||||||
|
if(limb_type == E.type)
|
||||||
|
found = 1
|
||||||
|
break
|
||||||
|
if(!found)
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
var/datum/organ/external/head/head = H.get_organ("head")
|
var/obj/item/organ/external/head/head = H.get_organ("head")
|
||||||
if(head.disfigured)
|
if(head.disfigured)
|
||||||
return 1
|
return 1
|
||||||
return 0
|
return 0
|
||||||
|
|||||||
@@ -514,8 +514,8 @@ var/global/datum/controller/occupations/job_master
|
|||||||
H.internals.icon_state = "internal1"
|
H.internals.icon_state = "internal1"
|
||||||
|
|
||||||
if(istype(H)) //give humans wheelchairs, if they need them.
|
if(istype(H)) //give humans wheelchairs, if they need them.
|
||||||
var/datum/organ/external/l_foot = H.get_organ("l_foot")
|
var/obj/item/organ/external/l_foot = H.get_organ("l_foot")
|
||||||
var/datum/organ/external/r_foot = H.get_organ("r_foot")
|
var/obj/item/organ/external/r_foot = H.get_organ("r_foot")
|
||||||
if((!l_foot || l_foot.status & ORGAN_DESTROYED) && (!r_foot || r_foot.status & ORGAN_DESTROYED))
|
if((!l_foot || l_foot.status & ORGAN_DESTROYED) && (!r_foot || r_foot.status & ORGAN_DESTROYED))
|
||||||
var/obj/structure/bed/chair/wheelchair/W = new /obj/structure/bed/chair/wheelchair(H.loc)
|
var/obj/structure/bed/chair/wheelchair/W = new /obj/structure/bed/chair/wheelchair(H.loc)
|
||||||
H.buckled = W
|
H.buckled = W
|
||||||
|
|||||||
@@ -346,7 +346,7 @@
|
|||||||
dat += "<th>Other Wounds</th>"
|
dat += "<th>Other Wounds</th>"
|
||||||
dat += "</tr>"
|
dat += "</tr>"
|
||||||
|
|
||||||
for(var/datum/organ/external/e in occ["external_organs"])
|
for(var/obj/item/organ/external/e in occ["external_organs"])
|
||||||
var/AN = ""
|
var/AN = ""
|
||||||
var/open = ""
|
var/open = ""
|
||||||
var/infected = ""
|
var/infected = ""
|
||||||
@@ -362,7 +362,7 @@
|
|||||||
for(var/datum/wound/W in e.wounds) if(W.internal)
|
for(var/datum/wound/W in e.wounds) if(W.internal)
|
||||||
internal_bleeding = "<br>Internal bleeding"
|
internal_bleeding = "<br>Internal bleeding"
|
||||||
break
|
break
|
||||||
if(istype(e, /datum/organ/external/chest) && occ["lung_ruptured"])
|
if(istype(e, /obj/item/organ/external/chest) && occ["lung_ruptured"])
|
||||||
lung_ruptured = "Lung ruptured:"
|
lung_ruptured = "Lung ruptured:"
|
||||||
if(e.status & ORGAN_SPLINTED)
|
if(e.status & ORGAN_SPLINTED)
|
||||||
splint = "Splinted:"
|
splint = "Splinted:"
|
||||||
@@ -404,12 +404,12 @@
|
|||||||
if(!AN && !open && !infected & !imp)
|
if(!AN && !open && !infected & !imp)
|
||||||
AN = "None:"
|
AN = "None:"
|
||||||
if(!(e.status & ORGAN_DESTROYED))
|
if(!(e.status & ORGAN_DESTROYED))
|
||||||
dat += "<td>[e.display_name]</td><td>[e.burn_dam]</td><td>[e.brute_dam]</td><td>[robot][bled][AN][splint][open][infected][imp][internal_bleeding][lung_ruptured]</td>"
|
dat += "<td>[e.name]</td><td>[e.burn_dam]</td><td>[e.brute_dam]</td><td>[robot][bled][AN][splint][open][infected][imp][internal_bleeding][lung_ruptured]</td>"
|
||||||
else
|
else
|
||||||
dat += "<td>[e.display_name]</td><td>-</td><td>-</td><td>Not Found</td>"
|
dat += "<td>[e.name]</td><td>-</td><td>-</td><td>Not Found</td>"
|
||||||
dat += "</tr>"
|
dat += "</tr>"
|
||||||
|
|
||||||
for(var/datum/organ/internal/i in occ["internal_organs"])
|
for(var/obj/item/organ/i in occ["internal_organs"])
|
||||||
|
|
||||||
var/mech = ""
|
var/mech = ""
|
||||||
if(i.robotic == 1)
|
if(i.robotic == 1)
|
||||||
|
|||||||
@@ -43,18 +43,14 @@
|
|||||||
if(prints_prosthetics)
|
if(prints_prosthetics)
|
||||||
O.robotic = 2
|
O.robotic = 2
|
||||||
else if(loaded_dna)
|
else if(loaded_dna)
|
||||||
visible_message("<span class='notice'>The printer injects stored DNA in used biomass.</span>.")
|
visible_message("<span class='notice'>The printer injects the stored DNA into the biomass.</span>.")
|
||||||
var/datum/organ/internal/I = new O.organ_type
|
O.transplant_data = list()
|
||||||
I.transplant_data = list()
|
|
||||||
var/mob/living/carbon/C = loaded_dna["donor"]
|
var/mob/living/carbon/C = loaded_dna["donor"]
|
||||||
I.transplant_data["species"] = C.species.name
|
O.transplant_data["species"] = C.species.name
|
||||||
I.transplant_data["blood_type"] = loaded_dna["blood_type"]
|
O.transplant_data["blood_type"] = loaded_dna["blood_type"]
|
||||||
I.transplant_data["blood_DNA"] = loaded_dna["blood_DNA"]
|
O.transplant_data["blood_DNA"] = loaded_dna["blood_DNA"]
|
||||||
O.organ_data = I
|
|
||||||
I.organ_holder = O
|
|
||||||
|
|
||||||
|
visible_message("<span class='info'>The bioprinter spits out a new organ.</span>")
|
||||||
visible_message("<span class='info'>The bioprinter spits out a new organ.")
|
|
||||||
|
|
||||||
else
|
else
|
||||||
user << "<span class='warning'>There is not enough matter in the printer.</span>"
|
user << "<span class='warning'>There is not enough matter in the printer.</span>"
|
||||||
|
|||||||
@@ -593,7 +593,7 @@ About the new airlock wires panel:
|
|||||||
playsound(src.loc, 'sound/effects/bang.ogg', 25, 1)
|
playsound(src.loc, 'sound/effects/bang.ogg', 25, 1)
|
||||||
if(!istype(H.head, /obj/item/clothing/head/helmet))
|
if(!istype(H.head, /obj/item/clothing/head/helmet))
|
||||||
visible_message("\red [user] headbutts the airlock.")
|
visible_message("\red [user] headbutts the airlock.")
|
||||||
var/datum/organ/external/affecting = H.get_organ("head")
|
var/obj/item/organ/external/affecting = H.get_organ("head")
|
||||||
H.Stun(8)
|
H.Stun(8)
|
||||||
H.Weaken(5)
|
H.Weaken(5)
|
||||||
if(affecting.take_damage(10, 0))
|
if(affecting.take_damage(10, 0))
|
||||||
|
|||||||
@@ -82,7 +82,7 @@
|
|||||||
O.Weaken(strength)
|
O.Weaken(strength)
|
||||||
if (istype(O, /mob/living/carbon/human))
|
if (istype(O, /mob/living/carbon/human))
|
||||||
var/mob/living/carbon/human/H = O
|
var/mob/living/carbon/human/H = O
|
||||||
var/datum/organ/internal/eyes/E = H.internal_organs_by_name["eyes"]
|
var/obj/item/organ/eyes/E = H.internal_organs_by_name["eyes"]
|
||||||
if (E && (E.damage > E.min_bruised_damage && prob(E.damage + 50)))
|
if (E && (E.damage > E.min_bruised_damage && prob(E.damage + 50)))
|
||||||
flick("e_flash", O:flash)
|
flick("e_flash", O:flash)
|
||||||
E.damage += rand(1, 5)
|
E.damage += rand(1, 5)
|
||||||
|
|||||||
@@ -228,7 +228,7 @@
|
|||||||
for (var/obj/thing in contents)
|
for (var/obj/thing in contents)
|
||||||
// Todo: unify limbs and internal organs
|
// Todo: unify limbs and internal organs
|
||||||
// There's a chance that the gibber will fail to destroy some evidence.
|
// There's a chance that the gibber will fail to destroy some evidence.
|
||||||
if((istype(thing,/obj/item/weapon/organ) || istype(thing,/obj/item/organ)) && prob(80))
|
if((istype(thing,/obj/item/organ) || istype(thing,/obj/item/organ)) && prob(80))
|
||||||
del(thing)
|
del(thing)
|
||||||
continue
|
continue
|
||||||
thing.loc = get_turf(thing) // Drop it onto the turf for throwing.
|
thing.loc = get_turf(thing) // Drop it onto the turf for throwing.
|
||||||
|
|||||||
@@ -331,7 +331,7 @@
|
|||||||
sleep(50)
|
sleep(50)
|
||||||
if(src.OCCUPANT)
|
if(src.OCCUPANT)
|
||||||
OCCUPANT.radiation += 50
|
OCCUPANT.radiation += 50
|
||||||
var/datum/organ/internal/diona/nutrients/rad_organ = locate() in OCCUPANT.internal_organs
|
var/obj/item/organ/diona/nutrients/rad_organ = locate() in OCCUPANT.internal_organs
|
||||||
if (!rad_organ)
|
if (!rad_organ)
|
||||||
if(src.issuperUV)
|
if(src.issuperUV)
|
||||||
var/burndamage = rand(28,35)
|
var/burndamage = rand(28,35)
|
||||||
|
|||||||
@@ -41,7 +41,7 @@
|
|||||||
var/mob/living/carbon/human/H = target
|
var/mob/living/carbon/human/H = target
|
||||||
// if (M.health <= 0) return
|
// if (M.health <= 0) return
|
||||||
|
|
||||||
var/datum/organ/external/temp = H.get_organ(pick("chest", "chest", "chest", "head"))
|
var/obj/item/organ/external/temp = H.get_organ(pick("chest", "chest", "chest", "head"))
|
||||||
if(temp)
|
if(temp)
|
||||||
var/update = 0
|
var/update = 0
|
||||||
switch(damtype)
|
switch(damtype)
|
||||||
|
|||||||
@@ -13,6 +13,7 @@
|
|||||||
idle_power_usage = 20
|
idle_power_usage = 20
|
||||||
active_power_usage = 5000
|
active_power_usage = 5000
|
||||||
req_access = list(access_robotics)
|
req_access = list(access_robotics)
|
||||||
|
var/current_manufacturer
|
||||||
var/time_coeff = 1.5 //can be upgraded with research
|
var/time_coeff = 1.5 //can be upgraded with research
|
||||||
var/resource_coeff = 1.5 //can be upgraded with research
|
var/resource_coeff = 1.5 //can be upgraded with research
|
||||||
var/list/resources = list(
|
var/list/resources = list(
|
||||||
@@ -143,6 +144,7 @@
|
|||||||
|
|
||||||
/obj/machinery/mecha_part_fabricator/New()
|
/obj/machinery/mecha_part_fabricator/New()
|
||||||
..()
|
..()
|
||||||
|
|
||||||
component_parts = list()
|
component_parts = list()
|
||||||
component_parts += new /obj/item/weapon/circuitboard/mechfab(src)
|
component_parts += new /obj/item/weapon/circuitboard/mechfab(src)
|
||||||
component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
|
component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
|
||||||
@@ -165,6 +167,9 @@
|
|||||||
*/
|
*/
|
||||||
return
|
return
|
||||||
|
|
||||||
|
/obj/machinery/mecha_part_fabricator/initialize()
|
||||||
|
current_manufacturer = basic_robolimb.company
|
||||||
|
|
||||||
/obj/machinery/mecha_part_fabricator/RefreshParts()
|
/obj/machinery/mecha_part_fabricator/RefreshParts()
|
||||||
var/T = 0
|
var/T = 0
|
||||||
for(var/obj/item/weapon/stock_parts/matter_bin/M in component_parts)
|
for(var/obj/item/weapon/stock_parts/matter_bin/M in component_parts)
|
||||||
@@ -361,7 +366,11 @@
|
|||||||
if( !(locate(part, src.contents)) || !(part.vars.Find("construction_time")) || !(part.vars.Find("construction_cost")) ) // these 3 are the current requirements for an object being buildable by the mech_fabricator
|
if( !(locate(part, src.contents)) || !(part.vars.Find("construction_time")) || !(part.vars.Find("construction_cost")) ) // these 3 are the current requirements for an object being buildable by the mech_fabricator
|
||||||
return
|
return
|
||||||
|
|
||||||
src.being_built = new part.type(src)
|
if(current_manufacturer)
|
||||||
|
src.being_built = new part.type(src, current_manufacturer)
|
||||||
|
else
|
||||||
|
src.being_built = new part.type(src, basic_robolimb.company)
|
||||||
|
|
||||||
src.desc = "It's building [src.being_built]."
|
src.desc = "It's building [src.being_built]."
|
||||||
src.remove_resources(part)
|
src.remove_resources(part)
|
||||||
src.overlays += "fab-active"
|
src.overlays += "fab-active"
|
||||||
@@ -562,7 +571,7 @@
|
|||||||
switch(screen)
|
switch(screen)
|
||||||
if("main")
|
if("main")
|
||||||
left_part = output_available_resources()+"<hr>"
|
left_part = output_available_resources()+"<hr>"
|
||||||
left_part += "<a href='?src=\ref[src];sync=1'>Sync with R&D servers</a><hr>"
|
left_part += "<a href='?src=\ref[src];sync=1'>Sync with R&D servers</a> | <a href='?src=\ref[src];set_manufacturer=1'>Set manufacturer</a> ([current_manufacturer])<hr>"
|
||||||
for(var/part_set in part_sets)
|
for(var/part_set in part_sets)
|
||||||
left_part += "<a href='?src=\ref[src];part_set=[part_set]'>[part_set]</a> - \[<a href='?src=\ref[src];partset_to_queue=[part_set]'>Add all parts to queue\]<br>"
|
left_part += "<a href='?src=\ref[src];part_set=[part_set]'>[part_set]</a> - \[<a href='?src=\ref[src];partset_to_queue=[part_set]'>Add all parts to queue\]<br>"
|
||||||
if("parts")
|
if("parts")
|
||||||
@@ -623,6 +632,9 @@
|
|||||||
return
|
return
|
||||||
|
|
||||||
var/datum/topic_input/filter = new /datum/topic_input(href,href_list)
|
var/datum/topic_input/filter = new /datum/topic_input(href,href_list)
|
||||||
|
if(href_list["set_manufacturer"])
|
||||||
|
var/choice = input(usr, "Which manufacturer do you wish to use for this fabricator?") as null|anything in all_robolimbs
|
||||||
|
if(choice) current_manufacturer = choice
|
||||||
if(href_list["part_set"])
|
if(href_list["part_set"])
|
||||||
var/tpart_set = filter.getStr("part_set")
|
var/tpart_set = filter.getStr("part_set")
|
||||||
if(tpart_set)
|
if(tpart_set)
|
||||||
|
|||||||
@@ -113,7 +113,7 @@
|
|||||||
// Aliens can get straight through these.
|
// Aliens can get straight through these.
|
||||||
if(istype(usr,/mob/living/carbon))
|
if(istype(usr,/mob/living/carbon))
|
||||||
var/mob/living/carbon/M = usr
|
var/mob/living/carbon/M = usr
|
||||||
if(locate(/datum/organ/internal/xenos/hivenode) in M.internal_organs)
|
if(locate(/obj/item/organ/xenos/hivenode) in M.internal_organs)
|
||||||
for(var/mob/O in oviewers(src))
|
for(var/mob/O in oviewers(src))
|
||||||
O.show_message("\red [usr] strokes the [name] and it melts away!", 1)
|
O.show_message("\red [usr] strokes the [name] and it melts away!", 1)
|
||||||
health = 0
|
health = 0
|
||||||
@@ -355,7 +355,7 @@ Alien plants should do something if theres a lot of poison
|
|||||||
/obj/effect/alien/egg/attack_hand(user as mob)
|
/obj/effect/alien/egg/attack_hand(user as mob)
|
||||||
|
|
||||||
var/mob/living/carbon/M = user
|
var/mob/living/carbon/M = user
|
||||||
if(!istype(M) || !(locate(/datum/organ/internal/xenos/hivenode) in M.internal_organs))
|
if(!istype(M) || !(locate(/obj/item/organ/xenos/hivenode) in M.internal_organs))
|
||||||
return attack_hand(user)
|
return attack_hand(user)
|
||||||
|
|
||||||
switch(status)
|
switch(status)
|
||||||
|
|||||||
@@ -51,8 +51,8 @@ var/global/list/image/splatter_cache=list()
|
|||||||
if(amount < 1)
|
if(amount < 1)
|
||||||
return
|
return
|
||||||
|
|
||||||
var/datum/organ/external/l_foot = perp.get_organ("l_foot")
|
var/obj/item/organ/external/l_foot = perp.get_organ("l_foot")
|
||||||
var/datum/organ/external/r_foot = perp.get_organ("r_foot")
|
var/obj/item/organ/external/r_foot = perp.get_organ("r_foot")
|
||||||
var/hasfeet = 1
|
var/hasfeet = 1
|
||||||
if((!l_foot || l_foot.status & ORGAN_DESTROYED) && (!r_foot || r_foot.status & ORGAN_DESTROYED))
|
if((!l_foot || l_foot.status & ORGAN_DESTROYED) && (!r_foot || r_foot.status & ORGAN_DESTROYED))
|
||||||
hasfeet = 0
|
hasfeet = 0
|
||||||
|
|||||||
@@ -119,11 +119,12 @@
|
|||||||
/obj/item/attack_hand(mob/user as mob)
|
/obj/item/attack_hand(mob/user as mob)
|
||||||
if (!user) return
|
if (!user) return
|
||||||
if (hasorgans(user))
|
if (hasorgans(user))
|
||||||
var/datum/organ/external/temp = user:organs_by_name["r_hand"]
|
var/mob/living/carbon/human/H = user
|
||||||
|
var/obj/item/organ/external/temp = H.organs_by_name["r_hand"]
|
||||||
if (user.hand)
|
if (user.hand)
|
||||||
temp = user:organs_by_name["l_hand"]
|
temp = H.organs_by_name["l_hand"]
|
||||||
if(temp && !temp.is_usable())
|
if(temp && !temp.is_usable())
|
||||||
user << "<span class='notice'>You try to move your [temp.display_name], but cannot!"
|
user << "<span class='notice'>You try to move your [temp.name], but cannot!"
|
||||||
return
|
return
|
||||||
|
|
||||||
if (istype(src.loc, /obj/item/weapon/storage))
|
if (istype(src.loc, /obj/item/weapon/storage))
|
||||||
@@ -496,11 +497,11 @@
|
|||||||
M.adjustBruteLoss(10)
|
M.adjustBruteLoss(10)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if(istype(M, /mob/living/carbon/human))
|
if(istype(H))
|
||||||
|
|
||||||
var/datum/organ/internal/eyes/eyes = H.internal_organs_by_name["eyes"]
|
var/obj/item/organ/eyes/eyes = H.internal_organs_by_name["eyes"]
|
||||||
|
|
||||||
if(M != user)
|
if(H != user)
|
||||||
for(var/mob/O in (viewers(M) - user - M))
|
for(var/mob/O in (viewers(M) - user - M))
|
||||||
O.show_message("\red [M] has been stabbed in the eye with [src] by [user].", 1)
|
O.show_message("\red [M] has been stabbed in the eye with [src] by [user].", 1)
|
||||||
M << "\red [user] stabs you in the eye with [src]!"
|
M << "\red [user] stabs you in the eye with [src]!"
|
||||||
@@ -526,7 +527,7 @@
|
|||||||
if (eyes.damage >= eyes.min_broken_damage)
|
if (eyes.damage >= eyes.min_broken_damage)
|
||||||
if(M.stat != 2)
|
if(M.stat != 2)
|
||||||
M << "\red You go blind!"
|
M << "\red You go blind!"
|
||||||
var/datum/organ/external/affecting = M:get_organ("head")
|
var/obj/item/organ/external/affecting = H.get_organ("head")
|
||||||
if(affecting.take_damage(7))
|
if(affecting.take_damage(7))
|
||||||
M:UpdateDamageIcon()
|
M:UpdateDamageIcon()
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -1207,8 +1207,8 @@ var/global/list/obj/item/device/pda/PDAs = list()
|
|||||||
var/list/damaged = H.get_damaged_organs(1,1)
|
var/list/damaged = H.get_damaged_organs(1,1)
|
||||||
user.show_message("\blue Localized Damage, Brute/Burn:",1)
|
user.show_message("\blue Localized Damage, Brute/Burn:",1)
|
||||||
if(length(damaged)>0)
|
if(length(damaged)>0)
|
||||||
for(var/datum/organ/external/org in damaged)
|
for(var/obj/item/organ/external/org in damaged)
|
||||||
user.show_message(text("\blue \t []: []\blue-[]",capitalize(org.display_name),(org.brute_dam > 0)?"\red [org.brute_dam]":0,(org.burn_dam > 0)?"\red [org.burn_dam]":0),1)
|
user.show_message(text("\blue \t []: []\blue-[]",capitalize(org.name),(org.brute_dam > 0)?"\red [org.brute_dam]":0,(org.burn_dam > 0)?"\red [org.burn_dam]":0),1)
|
||||||
else
|
else
|
||||||
user.show_message("\blue \t Limbs are OK.",1)
|
user.show_message("\blue \t Limbs are OK.",1)
|
||||||
|
|
||||||
|
|||||||
@@ -123,9 +123,9 @@ REAGENT SCANNER
|
|||||||
var/list/damaged = H.get_damaged_organs(1,1)
|
var/list/damaged = H.get_damaged_organs(1,1)
|
||||||
user.show_message("\blue Localized Damage, Brute/Burn:",1)
|
user.show_message("\blue Localized Damage, Brute/Burn:",1)
|
||||||
if(length(damaged)>0)
|
if(length(damaged)>0)
|
||||||
for(var/datum/organ/external/org in damaged)
|
for(var/obj/item/organ/external/org in damaged)
|
||||||
user.show_message(text("\blue \t []: [][]\blue - []", \
|
user.show_message(text("\blue \t []: [][]\blue - []", \
|
||||||
"[capitalize(org.display_name)][org.status & ORGAN_ROBOT ? "(Cybernetic)" : ""]", \
|
"[capitalize(org.name)][org.status & ORGAN_ROBOT ? "(Cybernetic)" : ""]", \
|
||||||
(org.brute_dam > 0) ? "\red [org.brute_dam]" :0, \
|
(org.brute_dam > 0) ? "\red [org.brute_dam]" :0, \
|
||||||
(org.status & ORGAN_BLEEDING)?"\red <b>\[Bleeding\]</b>":"\t", \
|
(org.status & ORGAN_BLEEDING)?"\red <b>\[Bleeding\]</b>":"\t", \
|
||||||
(org.burn_dam > 0) ? "<font color='#FFA500'>[org.burn_dam]</font>" :0),1)
|
(org.burn_dam > 0) ? "<font color='#FFA500'>[org.burn_dam]</font>" :0),1)
|
||||||
@@ -180,8 +180,10 @@ REAGENT SCANNER
|
|||||||
if(ishuman(M))
|
if(ishuman(M))
|
||||||
var/mob/living/carbon/human/H = M
|
var/mob/living/carbon/human/H = M
|
||||||
for(var/name in H.organs_by_name)
|
for(var/name in H.organs_by_name)
|
||||||
var/datum/organ/external/e = H.organs_by_name[name]
|
var/obj/item/organ/external/e = H.organs_by_name[name]
|
||||||
var/limb = e.display_name
|
if(!e)
|
||||||
|
continue
|
||||||
|
var/limb = e.name
|
||||||
if(e.status & ORGAN_BROKEN)
|
if(e.status & ORGAN_BROKEN)
|
||||||
if(((e.name == "l_arm") || (e.name == "r_arm") || (e.name == "l_leg") || (e.name == "r_leg")) && (!(e.status & ORGAN_SPLINTED)))
|
if(((e.name == "l_arm") || (e.name == "r_arm") || (e.name == "l_leg") || (e.name == "r_leg")) && (!(e.status & ORGAN_SPLINTED)))
|
||||||
user << "\red Unsecured fracture in subject [limb]. Splinting recommended for transport."
|
user << "\red Unsecured fracture in subject [limb]. Splinting recommended for transport."
|
||||||
@@ -189,11 +191,11 @@ REAGENT SCANNER
|
|||||||
user << "\red Infected wound detected in subject [limb]. Disinfection recommended."
|
user << "\red Infected wound detected in subject [limb]. Disinfection recommended."
|
||||||
|
|
||||||
for(var/name in H.organs_by_name)
|
for(var/name in H.organs_by_name)
|
||||||
var/datum/organ/external/e = H.organs_by_name[name]
|
var/obj/item/organ/external/e = H.organs_by_name[name]
|
||||||
if(e.status & ORGAN_BROKEN)
|
if(e.status & ORGAN_BROKEN)
|
||||||
user.show_message(text("\red Bone fractures detected. Advanced scanner required for location."), 1)
|
user.show_message(text("\red Bone fractures detected. Advanced scanner required for location."), 1)
|
||||||
break
|
break
|
||||||
for(var/datum/organ/external/e in H.organs)
|
for(var/obj/item/organ/external/e in H.organs)
|
||||||
for(var/datum/wound/W in e.wounds) if(W.internal)
|
for(var/datum/wound/W in e.wounds) if(W.internal)
|
||||||
user.show_message(text("\red Internal bleeding detected. Advanced scanner required for location."), 1)
|
user.show_message(text("\red Internal bleeding detected. Advanced scanner required for location."), 1)
|
||||||
break
|
break
|
||||||
|
|||||||
@@ -7,43 +7,65 @@
|
|||||||
slot_flags = SLOT_BELT
|
slot_flags = SLOT_BELT
|
||||||
var/construction_time = 100
|
var/construction_time = 100
|
||||||
var/list/construction_cost = list("metal"=20000,"glass"=5000)
|
var/list/construction_cost = list("metal"=20000,"glass"=5000)
|
||||||
var/list/part = null
|
var/list/part = null // Order of args is important for installing robolimbs.
|
||||||
var/sabotaged = 0 //Emagging limbs can have repercussions when installed as prosthetics.
|
var/sabotaged = 0 //Emagging limbs can have repercussions when installed as prosthetics.
|
||||||
|
var/model_info
|
||||||
|
dir = SOUTH
|
||||||
|
|
||||||
|
/obj/item/robot_parts/set_dir()
|
||||||
|
return
|
||||||
|
|
||||||
|
/obj/item/robot_parts/New(var/newloc, var/model)
|
||||||
|
..(newloc)
|
||||||
|
if(model_info && model)
|
||||||
|
model_info = model
|
||||||
|
var/datum/robolimb/R = all_robolimbs[model]
|
||||||
|
if(R)
|
||||||
|
name = "[R.company] [initial(name)]"
|
||||||
|
desc = "[R.desc]"
|
||||||
|
if(icon_state in icon_states(R.icon))
|
||||||
|
icon = R.icon
|
||||||
|
else
|
||||||
|
name = "robot [initial(name)]"
|
||||||
|
|
||||||
/obj/item/robot_parts/l_arm
|
/obj/item/robot_parts/l_arm
|
||||||
name = "robot left arm"
|
name = "left arm"
|
||||||
desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case."
|
desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case."
|
||||||
icon_state = "l_arm"
|
icon_state = "l_arm"
|
||||||
construction_time = 200
|
construction_time = 200
|
||||||
construction_cost = list("metal"=18000)
|
construction_cost = list("metal"=18000)
|
||||||
part = list("l_arm","l_hand")
|
part = list("l_arm","l_hand")
|
||||||
|
model_info = 1
|
||||||
|
|
||||||
/obj/item/robot_parts/r_arm
|
/obj/item/robot_parts/r_arm
|
||||||
name = "robot right arm"
|
name = "right arm"
|
||||||
desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case."
|
desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case."
|
||||||
icon_state = "r_arm"
|
icon_state = "r_arm"
|
||||||
construction_time = 200
|
construction_time = 200
|
||||||
construction_cost = list("metal"=18000)
|
construction_cost = list("metal"=18000)
|
||||||
part = list("r_arm","r_hand")
|
part = list("r_arm","r_hand")
|
||||||
|
model_info = 1
|
||||||
|
|
||||||
/obj/item/robot_parts/l_leg
|
/obj/item/robot_parts/l_leg
|
||||||
name = "robot left leg"
|
name = "left leg"
|
||||||
desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case."
|
desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case."
|
||||||
icon_state = "l_leg"
|
icon_state = "l_leg"
|
||||||
construction_time = 200
|
construction_time = 200
|
||||||
construction_cost = list("metal"=15000)
|
construction_cost = list("metal"=15000)
|
||||||
part = list("l_leg","l_foot")
|
part = list("l_leg","l_foot")
|
||||||
|
model_info = 1
|
||||||
|
|
||||||
/obj/item/robot_parts/r_leg
|
/obj/item/robot_parts/r_leg
|
||||||
name = "robot right leg"
|
name = "right leg"
|
||||||
desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case."
|
desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case."
|
||||||
icon_state = "r_leg"
|
icon_state = "r_leg"
|
||||||
construction_time = 200
|
construction_time = 200
|
||||||
construction_cost = list("metal"=15000)
|
construction_cost = list("metal"=15000)
|
||||||
part = list("r_leg","r_foot")
|
part = list("r_leg","r_foot")
|
||||||
|
model_info = 1
|
||||||
|
|
||||||
/obj/item/robot_parts/chest
|
/obj/item/robot_parts/chest
|
||||||
name = "robot torso"
|
name = "torso"
|
||||||
desc = "A heavily reinforced case containing cyborg logic boards, with space for a standard power cell."
|
desc = "A heavily reinforced case containing cyborg logic boards, with space for a standard power cell."
|
||||||
icon_state = "chest"
|
icon_state = "chest"
|
||||||
construction_time = 350
|
construction_time = 350
|
||||||
@@ -52,7 +74,7 @@
|
|||||||
var/obj/item/weapon/cell/cell = null
|
var/obj/item/weapon/cell/cell = null
|
||||||
|
|
||||||
/obj/item/robot_parts/head
|
/obj/item/robot_parts/head
|
||||||
name = "robot head"
|
name = "head"
|
||||||
desc = "A standard reinforced braincase, with spine-plugged neural socket and sensor gimbals."
|
desc = "A standard reinforced braincase, with spine-plugged neural socket and sensor gimbals."
|
||||||
icon_state = "head"
|
icon_state = "head"
|
||||||
construction_time = 350
|
construction_time = 350
|
||||||
@@ -61,7 +83,7 @@
|
|||||||
var/obj/item/device/flash/flash2 = null
|
var/obj/item/device/flash/flash2 = null
|
||||||
|
|
||||||
/obj/item/robot_parts/robot_suit
|
/obj/item/robot_parts/robot_suit
|
||||||
name = "robot endoskeleton"
|
name = "endoskeleton"
|
||||||
desc = "A complex metal backbone with standard limb sockets and pseudomuscle anchors."
|
desc = "A complex metal backbone with standard limb sockets and pseudomuscle anchors."
|
||||||
icon_state = "robo_suit"
|
icon_state = "robo_suit"
|
||||||
construction_time = 500
|
construction_time = 500
|
||||||
|
|||||||
@@ -22,9 +22,9 @@
|
|||||||
|
|
||||||
if (istype(M, /mob/living/carbon/human))
|
if (istype(M, /mob/living/carbon/human))
|
||||||
var/mob/living/carbon/human/H = M
|
var/mob/living/carbon/human/H = M
|
||||||
var/datum/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
|
var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
|
||||||
|
|
||||||
if(affecting.display_name == "head")
|
if(affecting.name == "head")
|
||||||
if(H.head && istype(H.head,/obj/item/clothing/head/helmet/space))
|
if(H.head && istype(H.head,/obj/item/clothing/head/helmet/space))
|
||||||
user << "\red You can't apply [src] through [H.head]!"
|
user << "\red You can't apply [src] through [H.head]!"
|
||||||
return 1
|
return 1
|
||||||
@@ -62,33 +62,33 @@
|
|||||||
|
|
||||||
if (istype(M, /mob/living/carbon/human))
|
if (istype(M, /mob/living/carbon/human))
|
||||||
var/mob/living/carbon/human/H = M
|
var/mob/living/carbon/human/H = M
|
||||||
var/datum/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
|
var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
|
||||||
|
|
||||||
if(affecting.open == 0)
|
if(affecting.open == 0)
|
||||||
if(!affecting.bandage())
|
if(!affecting.bandage())
|
||||||
user << "\red The wounds on [M]'s [affecting.display_name] have already been bandaged."
|
user << "\red The wounds on [M]'s [affecting.name] have already been bandaged."
|
||||||
return 1
|
return 1
|
||||||
else
|
else
|
||||||
for (var/datum/wound/W in affecting.wounds)
|
for (var/datum/wound/W in affecting.wounds)
|
||||||
if (W.internal)
|
if (W.internal)
|
||||||
continue
|
continue
|
||||||
if (W.current_stage <= W.max_bleeding_stage)
|
if (W.current_stage <= W.max_bleeding_stage)
|
||||||
user.visible_message( "\blue [user] bandages [W.desc] on [M]'s [affecting.display_name].", \
|
user.visible_message( "\blue [user] bandages [W.desc] on [M]'s [affecting.name].", \
|
||||||
"\blue You bandage [W.desc] on [M]'s [affecting.display_name]." )
|
"\blue You bandage [W.desc] on [M]'s [affecting.name]." )
|
||||||
//H.add_side_effect("Itch")
|
//H.add_side_effect("Itch")
|
||||||
else if (istype(W,/datum/wound/bruise))
|
else if (istype(W,/datum/wound/bruise))
|
||||||
user.visible_message( "\blue [user] places bruise patch over [W.desc] on [M]'s [affecting.display_name].", \
|
user.visible_message( "\blue [user] places bruise patch over [W.desc] on [M]'s [affecting.name].", \
|
||||||
"\blue You place bruise patch over [W.desc] on [M]'s [affecting.display_name]." )
|
"\blue You place bruise patch over [W.desc] on [M]'s [affecting.name]." )
|
||||||
else
|
else
|
||||||
user.visible_message( "\blue [user] places bandaid over [W.desc] on [M]'s [affecting.display_name].", \
|
user.visible_message( "\blue [user] places bandaid over [W.desc] on [M]'s [affecting.name].", \
|
||||||
"\blue You place bandaid over [W.desc] on [M]'s [affecting.display_name]." )
|
"\blue You place bandaid over [W.desc] on [M]'s [affecting.name]." )
|
||||||
use(1)
|
use(1)
|
||||||
else
|
else
|
||||||
if (can_operate(H)) //Checks if mob is lying down on table for surgery
|
if (can_operate(H)) //Checks if mob is lying down on table for surgery
|
||||||
if (do_surgery(H,user,src))
|
if (do_surgery(H,user,src))
|
||||||
return
|
return
|
||||||
else
|
else
|
||||||
user << "<span class='notice'>The [affecting.display_name] is cut open, you'll need more than a bandage!</span>"
|
user << "<span class='notice'>The [affecting.name] is cut open, you'll need more than a bandage!</span>"
|
||||||
|
|
||||||
/obj/item/stack/medical/ointment
|
/obj/item/stack/medical/ointment
|
||||||
name = "ointment"
|
name = "ointment"
|
||||||
@@ -105,22 +105,22 @@
|
|||||||
|
|
||||||
if (istype(M, /mob/living/carbon/human))
|
if (istype(M, /mob/living/carbon/human))
|
||||||
var/mob/living/carbon/human/H = M
|
var/mob/living/carbon/human/H = M
|
||||||
var/datum/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
|
var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
|
||||||
|
|
||||||
if(affecting.open == 0)
|
if(affecting.open == 0)
|
||||||
if(!affecting.salve())
|
if(!affecting.salve())
|
||||||
user << "\red The wounds on [M]'s [affecting.display_name] have already been salved."
|
user << "\red The wounds on [M]'s [affecting.name] have already been salved."
|
||||||
return 1
|
return 1
|
||||||
else
|
else
|
||||||
user.visible_message( "\blue [user] salves wounds on [M]'s [affecting.display_name].", \
|
user.visible_message( "\blue [user] salves wounds on [M]'s [affecting.name].", \
|
||||||
"\blue You salve wounds on [M]'s [affecting.display_name]." )
|
"\blue You salve wounds on [M]'s [affecting.name]." )
|
||||||
use(1)
|
use(1)
|
||||||
else
|
else
|
||||||
if (can_operate(H)) //Checks if mob is lying down on table for surgery
|
if (can_operate(H)) //Checks if mob is lying down on table for surgery
|
||||||
if (do_surgery(H,user,src))
|
if (do_surgery(H,user,src))
|
||||||
return
|
return
|
||||||
else
|
else
|
||||||
user << "<span class='notice'>The [affecting.display_name] is cut open, you'll need more than a bandage!</span>"
|
user << "<span class='notice'>The [affecting.name] is cut open, you'll need more than a bandage!</span>"
|
||||||
|
|
||||||
/obj/item/stack/medical/advanced/bruise_pack
|
/obj/item/stack/medical/advanced/bruise_pack
|
||||||
name = "advanced trauma kit"
|
name = "advanced trauma kit"
|
||||||
@@ -136,29 +136,29 @@
|
|||||||
|
|
||||||
if (istype(M, /mob/living/carbon/human))
|
if (istype(M, /mob/living/carbon/human))
|
||||||
var/mob/living/carbon/human/H = M
|
var/mob/living/carbon/human/H = M
|
||||||
var/datum/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
|
var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
|
||||||
|
|
||||||
if(affecting.open == 0)
|
if(affecting.open == 0)
|
||||||
var/bandaged = affecting.bandage()
|
var/bandaged = affecting.bandage()
|
||||||
var/disinfected = affecting.disinfect()
|
var/disinfected = affecting.disinfect()
|
||||||
|
|
||||||
if(!(bandaged || disinfected))
|
if(!(bandaged || disinfected))
|
||||||
user << "\red The wounds on [M]'s [affecting.display_name] have already been treated."
|
user << "\red The wounds on [M]'s [affecting.name] have already been treated."
|
||||||
return 1
|
return 1
|
||||||
else
|
else
|
||||||
for (var/datum/wound/W in affecting.wounds)
|
for (var/datum/wound/W in affecting.wounds)
|
||||||
if (W.internal)
|
if (W.internal)
|
||||||
continue
|
continue
|
||||||
if (W.current_stage <= W.max_bleeding_stage)
|
if (W.current_stage <= W.max_bleeding_stage)
|
||||||
user.visible_message( "\blue [user] cleans [W.desc] on [M]'s [affecting.display_name] and seals edges with bioglue.", \
|
user.visible_message( "\blue [user] cleans [W.desc] on [M]'s [affecting.name] and seals edges with bioglue.", \
|
||||||
"\blue You clean and seal [W.desc] on [M]'s [affecting.display_name]." )
|
"\blue You clean and seal [W.desc] on [M]'s [affecting.name]." )
|
||||||
//H.add_side_effect("Itch")
|
//H.add_side_effect("Itch")
|
||||||
else if (istype(W,/datum/wound/bruise))
|
else if (istype(W,/datum/wound/bruise))
|
||||||
user.visible_message( "\blue [user] places medicine patch over [W.desc] on [M]'s [affecting.display_name].", \
|
user.visible_message( "\blue [user] places medicine patch over [W.desc] on [M]'s [affecting.name].", \
|
||||||
"\blue You place medicine patch over [W.desc] on [M]'s [affecting.display_name]." )
|
"\blue You place medicine patch over [W.desc] on [M]'s [affecting.name]." )
|
||||||
else
|
else
|
||||||
user.visible_message( "\blue [user] smears some bioglue over [W.desc] on [M]'s [affecting.display_name].", \
|
user.visible_message( "\blue [user] smears some bioglue over [W.desc] on [M]'s [affecting.name].", \
|
||||||
"\blue You smear some bioglue over [W.desc] on [M]'s [affecting.display_name]." )
|
"\blue You smear some bioglue over [W.desc] on [M]'s [affecting.name]." )
|
||||||
if (bandaged)
|
if (bandaged)
|
||||||
affecting.heal_damage(heal_brute,0)
|
affecting.heal_damage(heal_brute,0)
|
||||||
use(1)
|
use(1)
|
||||||
@@ -167,7 +167,7 @@
|
|||||||
if (do_surgery(H,user,src))
|
if (do_surgery(H,user,src))
|
||||||
return
|
return
|
||||||
else
|
else
|
||||||
user << "<span class='notice'>The [affecting.display_name] is cut open, you'll need more than a bandage!</span>"
|
user << "<span class='notice'>The [affecting.name] is cut open, you'll need more than a bandage!</span>"
|
||||||
|
|
||||||
/obj/item/stack/medical/advanced/ointment
|
/obj/item/stack/medical/advanced/ointment
|
||||||
name = "advanced burn kit"
|
name = "advanced burn kit"
|
||||||
@@ -184,15 +184,15 @@
|
|||||||
|
|
||||||
if (istype(M, /mob/living/carbon/human))
|
if (istype(M, /mob/living/carbon/human))
|
||||||
var/mob/living/carbon/human/H = M
|
var/mob/living/carbon/human/H = M
|
||||||
var/datum/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
|
var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
|
||||||
|
|
||||||
if(affecting.open == 0)
|
if(affecting.open == 0)
|
||||||
if(!affecting.salve())
|
if(!affecting.salve())
|
||||||
user << "\red The wounds on [M]'s [affecting.display_name] have already been salved."
|
user << "\red The wounds on [M]'s [affecting.name] have already been salved."
|
||||||
return 1
|
return 1
|
||||||
else
|
else
|
||||||
user.visible_message( "\blue [user] covers wounds on [M]'s [affecting.display_name] with regenerative membrane.", \
|
user.visible_message( "\blue [user] covers wounds on [M]'s [affecting.name] with regenerative membrane.", \
|
||||||
"\blue You cover wounds on [M]'s [affecting.display_name] with regenerative membrane." )
|
"\blue You cover wounds on [M]'s [affecting.name] with regenerative membrane." )
|
||||||
affecting.heal_damage(0,heal_burn)
|
affecting.heal_damage(0,heal_burn)
|
||||||
use(1)
|
use(1)
|
||||||
else
|
else
|
||||||
@@ -200,7 +200,7 @@
|
|||||||
if (do_surgery(H,user,src))
|
if (do_surgery(H,user,src))
|
||||||
return
|
return
|
||||||
else
|
else
|
||||||
user << "<span class='notice'>The [affecting.display_name] is cut open, you'll need more than a bandage!</span>"
|
user << "<span class='notice'>The [affecting.name] is cut open, you'll need more than a bandage!</span>"
|
||||||
|
|
||||||
/obj/item/stack/medical/splint
|
/obj/item/stack/medical/splint
|
||||||
name = "medical splints"
|
name = "medical splints"
|
||||||
@@ -215,8 +215,8 @@
|
|||||||
|
|
||||||
if (istype(M, /mob/living/carbon/human))
|
if (istype(M, /mob/living/carbon/human))
|
||||||
var/mob/living/carbon/human/H = M
|
var/mob/living/carbon/human/H = M
|
||||||
var/datum/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
|
var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
|
||||||
var/limb = affecting.display_name
|
var/limb = affecting.name
|
||||||
if(!((affecting.name == "l_arm") || (affecting.name == "r_arm") || (affecting.name == "l_leg") || (affecting.name == "r_leg")))
|
if(!((affecting.name == "l_arm") || (affecting.name == "r_arm") || (affecting.name == "l_leg") || (affecting.name == "r_leg")))
|
||||||
user << "\red You can't apply a splint there!"
|
user << "\red You can't apply a splint there!"
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
|
|
||||||
if (istype(M,/mob/living/carbon/human)) //Repairing robolimbs
|
if (istype(M,/mob/living/carbon/human)) //Repairing robolimbs
|
||||||
var/mob/living/carbon/human/H = M
|
var/mob/living/carbon/human/H = M
|
||||||
var/datum/organ/external/S = H.get_organ(user.zone_sel.selecting)
|
var/obj/item/organ/external/S = H.get_organ(user.zone_sel.selecting)
|
||||||
|
|
||||||
if(S.open == 1)
|
if(S.open == 1)
|
||||||
if (S && (S.status & ORGAN_ROBOT))
|
if (S && (S.status & ORGAN_ROBOT))
|
||||||
@@ -33,8 +33,8 @@
|
|||||||
S.heal_damage(15, 15, robo_repair = 1)
|
S.heal_damage(15, 15, robo_repair = 1)
|
||||||
H.updatehealth()
|
H.updatehealth()
|
||||||
use(1)
|
use(1)
|
||||||
user.visible_message("<span class='notice'>\The [user] applies some nanite paste at[user != M ? " \the [M]'s" : " \the"][S.display_name] with \the [src].</span>",\
|
user.visible_message("<span class='notice'>\The [user] applies some nanite paste at[user != M ? " \the [M]'s" : " \the"][S.name] with \the [src].</span>",\
|
||||||
"<span class='notice'>You apply some nanite paste at [user == M ? "your" : "[M]'s"] [S.display_name].</span>")
|
"<span class='notice'>You apply some nanite paste at [user == M ? "your" : "[M]'s"] [S.name].</span>")
|
||||||
else
|
else
|
||||||
user << "<span class='notice'>Nothing to fix here.</span>"
|
user << "<span class='notice'>Nothing to fix here.</span>"
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -37,7 +37,7 @@
|
|||||||
W.time_inflicted = time_inflicted
|
W.time_inflicted = time_inflicted
|
||||||
return W
|
return W
|
||||||
|
|
||||||
/obj/item/weapon/autopsy_scanner/proc/add_data(var/datum/organ/external/O)
|
/obj/item/weapon/autopsy_scanner/proc/add_data(var/obj/item/organ/external/O)
|
||||||
if(!O.autopsy_data.len && !O.trace_chemicals.len) return
|
if(!O.autopsy_data.len && !O.trace_chemicals.len) return
|
||||||
|
|
||||||
for(var/V in O.autopsy_data)
|
for(var/V in O.autopsy_data)
|
||||||
@@ -64,9 +64,9 @@
|
|||||||
|
|
||||||
if(!D.organs_scanned[O.name])
|
if(!D.organs_scanned[O.name])
|
||||||
if(D.organ_names == "")
|
if(D.organ_names == "")
|
||||||
D.organ_names = O.display_name
|
D.organ_names = O.name
|
||||||
else
|
else
|
||||||
D.organ_names += ", [O.display_name]"
|
D.organ_names += ", [O.name]"
|
||||||
|
|
||||||
del D.organs_scanned[O.name]
|
del D.organs_scanned[O.name]
|
||||||
D.organs_scanned[O.name] = W.copy()
|
D.organs_scanned[O.name] = W.copy()
|
||||||
@@ -191,7 +191,7 @@
|
|||||||
|
|
||||||
src.timeofdeath = M.timeofdeath
|
src.timeofdeath = M.timeofdeath
|
||||||
|
|
||||||
var/datum/organ/external/S = M.get_organ(user.zone_sel.selecting)
|
var/obj/item/organ/external/S = M.get_organ(user.zone_sel.selecting)
|
||||||
if(!S)
|
if(!S)
|
||||||
usr << "<b>You can't scan this body part.</b>"
|
usr << "<b>You can't scan this body part.</b>"
|
||||||
return
|
return
|
||||||
@@ -199,7 +199,7 @@
|
|||||||
usr << "<b>You have to cut the limb open first!</b>"
|
usr << "<b>You have to cut the limb open first!</b>"
|
||||||
return
|
return
|
||||||
for(var/mob/O in viewers(M))
|
for(var/mob/O in viewers(M))
|
||||||
O.show_message("\red [user.name] scans the wounds on [M.name]'s [S.display_name] with \the [src.name]", 1)
|
O.show_message("\red [user.name] scans the wounds on [M.name]'s [S.name] with \the [src.name]", 1)
|
||||||
|
|
||||||
src.add_data(S)
|
src.add_data(S)
|
||||||
|
|
||||||
|
|||||||
@@ -84,7 +84,7 @@
|
|||||||
//This really should be in mob not every check
|
//This really should be in mob not every check
|
||||||
if(ishuman(M))
|
if(ishuman(M))
|
||||||
var/mob/living/carbon/human/H = M
|
var/mob/living/carbon/human/H = M
|
||||||
var/datum/organ/internal/eyes/E = H.internal_organs_by_name["eyes"]
|
var/obj/item/organ/eyes/E = H.internal_organs_by_name["eyes"]
|
||||||
if (E && E.damage >= E.min_bruised_damage)
|
if (E && E.damage >= E.min_bruised_damage)
|
||||||
M << "\red Your eyes start to burn badly!"
|
M << "\red Your eyes start to burn badly!"
|
||||||
if(!banglet && !(istype(src , /obj/item/weapon/grenade/flashbang/clusterbang)))
|
if(!banglet && !(istype(src , /obj/item/weapon/grenade/flashbang/clusterbang)))
|
||||||
|
|||||||
@@ -79,11 +79,11 @@ var/last_chew = 0
|
|||||||
if (H.wear_mask) return
|
if (H.wear_mask) return
|
||||||
if (istype(H.wear_suit, /obj/item/clothing/suit/straight_jacket)) return
|
if (istype(H.wear_suit, /obj/item/clothing/suit/straight_jacket)) return
|
||||||
|
|
||||||
var/datum/organ/external/O = H.organs_by_name[H.hand?"l_hand":"r_hand"]
|
var/obj/item/organ/external/O = H.organs_by_name[H.hand?"l_hand":"r_hand"]
|
||||||
if (!O) return
|
if (!O) return
|
||||||
|
|
||||||
var/s = "\red [H.name] chews on \his [O.display_name]!"
|
var/s = "\red [H.name] chews on \his [O.name]!"
|
||||||
H.visible_message(s, "\red You chew on your [O.display_name]!")
|
H.visible_message(s, "\red You chew on your [O.name]!")
|
||||||
H.attack_log += text("\[[time_stamp()]\] <font color='red'>[s] ([H.ckey])</font>")
|
H.attack_log += text("\[[time_stamp()]\] <font color='red'>[s] ([H.ckey])</font>")
|
||||||
log_attack("[s] ([H.ckey])")
|
log_attack("[s] ([H.ckey])")
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
icon_state = "implant"
|
icon_state = "implant"
|
||||||
var/implanted = null
|
var/implanted = null
|
||||||
var/mob/imp_in = null
|
var/mob/imp_in = null
|
||||||
var/datum/organ/external/part = null
|
var/obj/item/organ/external/part = null
|
||||||
item_color = "b"
|
item_color = "b"
|
||||||
var/allow_reagents = 0
|
var/allow_reagents = 0
|
||||||
var/malfunction = 0
|
var/malfunction = 0
|
||||||
@@ -35,7 +35,7 @@
|
|||||||
return 0
|
return 0
|
||||||
|
|
||||||
proc/meltdown() //breaks it down, making implant unrecongizible
|
proc/meltdown() //breaks it down, making implant unrecongizible
|
||||||
imp_in << "\red You feel something melting inside [part ? "your [part.display_name]" : "you"]!"
|
imp_in << "\red You feel something melting inside [part ? "your [part.name]" : "you"]!"
|
||||||
if (part)
|
if (part)
|
||||||
part.take_damage(burn = 15, used_weapon = "Electronics meltdown")
|
part.take_damage(burn = 15, used_weapon = "Electronics meltdown")
|
||||||
else
|
else
|
||||||
@@ -171,18 +171,18 @@ Implant Specifics:<BR>"}
|
|||||||
if(ishuman(imp_in))
|
if(ishuman(imp_in))
|
||||||
if (elevel == "Localized Limb")
|
if (elevel == "Localized Limb")
|
||||||
if(part) //For some reason, small_boom() didn't work. So have this bit of working copypaste.
|
if(part) //For some reason, small_boom() didn't work. So have this bit of working copypaste.
|
||||||
imp_in.visible_message("\red Something beeps inside [imp_in][part ? "'s [part.display_name]" : ""]!")
|
imp_in.visible_message("\red Something beeps inside [imp_in][part ? "'s [part.name]" : ""]!")
|
||||||
playsound(loc, 'sound/items/countdown.ogg', 75, 1, -3)
|
playsound(loc, 'sound/items/countdown.ogg', 75, 1, -3)
|
||||||
sleep(25)
|
sleep(25)
|
||||||
if (istype(part,/datum/organ/external/chest) || \
|
if (istype(part,/obj/item/organ/external/chest) || \
|
||||||
istype(part,/datum/organ/external/groin) || \
|
istype(part,/obj/item/organ/external/groin) || \
|
||||||
istype(part,/datum/organ/external/head))
|
istype(part,/obj/item/organ/external/head))
|
||||||
part.createwound(BRUISE, 60) //mangle them instead
|
part.createwound(BRUISE, 60) //mangle them instead
|
||||||
explosion(get_turf(imp_in), -1, -1, 2, 3)
|
explosion(get_turf(imp_in), -1, -1, 2, 3)
|
||||||
del(src)
|
del(src)
|
||||||
else
|
else
|
||||||
explosion(get_turf(imp_in), -1, -1, 2, 3)
|
explosion(get_turf(imp_in), -1, -1, 2, 3)
|
||||||
part.droplimb(1)
|
part.droplimb()
|
||||||
del(src)
|
del(src)
|
||||||
if (elevel == "Destroy Body")
|
if (elevel == "Destroy Body")
|
||||||
explosion(get_turf(T), -1, 0, 1, 6)
|
explosion(get_turf(T), -1, 0, 1, 6)
|
||||||
@@ -236,18 +236,18 @@ Implant Specifics:<BR>"}
|
|||||||
|
|
||||||
proc/small_boom()
|
proc/small_boom()
|
||||||
if (ishuman(imp_in) && part)
|
if (ishuman(imp_in) && part)
|
||||||
imp_in.visible_message("\red Something beeps inside [imp_in][part ? "'s [part.display_name]" : ""]!")
|
imp_in.visible_message("\red Something beeps inside [imp_in][part ? "'s [part.name]" : ""]!")
|
||||||
playsound(loc, 'sound/items/countdown.ogg', 75, 1, -3)
|
playsound(loc, 'sound/items/countdown.ogg', 75, 1, -3)
|
||||||
spawn(25)
|
spawn(25)
|
||||||
if (ishuman(imp_in) && part)
|
if (ishuman(imp_in) && part)
|
||||||
//No tearing off these parts since it's pretty much killing
|
//No tearing off these parts since it's pretty much killing
|
||||||
//and you can't replace groins
|
//and you can't replace groins
|
||||||
if (istype(part,/datum/organ/external/chest) || \
|
if (istype(part,/obj/item/organ/external/chest) || \
|
||||||
istype(part,/datum/organ/external/groin) || \
|
istype(part,/obj/item/organ/external/groin) || \
|
||||||
istype(part,/datum/organ/external/head))
|
istype(part,/obj/item/organ/external/head))
|
||||||
part.createwound(BRUISE, 60) //mangle them instead
|
part.createwound(BRUISE, 60) //mangle them instead
|
||||||
else
|
else
|
||||||
part.droplimb(1)
|
part.droplimb()
|
||||||
explosion(get_turf(imp_in), -1, -1, 2, 3)
|
explosion(get_turf(imp_in), -1, -1, 2, 3)
|
||||||
del(src)
|
del(src)
|
||||||
|
|
||||||
|
|||||||
@@ -43,7 +43,7 @@
|
|||||||
src.imp.implanted = 1
|
src.imp.implanted = 1
|
||||||
if (ishuman(M))
|
if (ishuman(M))
|
||||||
var/mob/living/carbon/human/H = M
|
var/mob/living/carbon/human/H = M
|
||||||
var/datum/organ/external/affected = H.get_organ(user.zone_sel.selecting)
|
var/obj/item/organ/external/affected = H.get_organ(user.zone_sel.selecting)
|
||||||
affected.implants += src.imp
|
affected.implants += src.imp
|
||||||
imp.part = affected
|
imp.part = affected
|
||||||
|
|
||||||
|
|||||||
@@ -111,6 +111,8 @@
|
|||||||
w_class = 2
|
w_class = 2
|
||||||
flags = NOSHIELD | NOBLOODY
|
flags = NOSHIELD | NOBLOODY
|
||||||
origin_tech = "magnets=3;syndicate=4"
|
origin_tech = "magnets=3;syndicate=4"
|
||||||
|
sharp = 1
|
||||||
|
edge = 1
|
||||||
|
|
||||||
/obj/item/weapon/melee/energy/sword/dropped(var/mob/user)
|
/obj/item/weapon/melee/energy/sword/dropped(var/mob/user)
|
||||||
..()
|
..()
|
||||||
@@ -207,7 +209,7 @@
|
|||||||
if(istype(loc,/mob/living))
|
if(istype(loc,/mob/living))
|
||||||
var/mob/living/carbon/human/host = loc
|
var/mob/living/carbon/human/host = loc
|
||||||
if(istype(host))
|
if(istype(host))
|
||||||
for(var/datum/organ/external/organ in host.organs)
|
for(var/obj/item/organ/external/organ in host.organs)
|
||||||
for(var/obj/item/O in organ.implants)
|
for(var/obj/item/O in organ.implants)
|
||||||
if(O == src)
|
if(O == src)
|
||||||
organ.implants -= src
|
organ.implants -= src
|
||||||
|
|||||||
@@ -80,7 +80,7 @@
|
|||||||
return
|
return
|
||||||
|
|
||||||
if( !H.shoes && ( !H.wear_suit || !(H.wear_suit.body_parts_covered & FEET) ) )
|
if( !H.shoes && ( !H.wear_suit || !(H.wear_suit.body_parts_covered & FEET) ) )
|
||||||
var/datum/organ/external/affecting = H.get_organ(pick("l_foot", "r_foot"))
|
var/obj/item/organ/external/affecting = H.get_organ(pick("l_foot", "r_foot"))
|
||||||
if(affecting.status & ORGAN_ROBOT)
|
if(affecting.status & ORGAN_ROBOT)
|
||||||
return
|
return
|
||||||
if(affecting.take_damage(5, 0))
|
if(affecting.take_damage(5, 0))
|
||||||
|
|||||||
@@ -20,79 +20,9 @@
|
|||||||
new /obj/item/weapon/spacecash(src)
|
new /obj/item/weapon/spacecash(src)
|
||||||
new /obj/item/weapon/spacecash(src)
|
new /obj/item/weapon/spacecash(src)
|
||||||
new /obj/item/weapon/spacecash(src)
|
new /obj/item/weapon/spacecash(src)
|
||||||
//BS12 EDIT
|
|
||||||
/* // All cult functionality moved to Null Rod
|
|
||||||
/obj/item/weapon/storage/bible/proc/bless(mob/living/carbon/M as mob)
|
|
||||||
if(ishuman(M))
|
|
||||||
var/mob/living/carbon/human/H = M
|
|
||||||
var/heal_amt = 10
|
|
||||||
for(var/datum/organ/external/affecting in H.organs)
|
|
||||||
if(affecting.heal_damage(heal_amt, heal_amt))
|
|
||||||
H.UpdateDamageIcon()
|
|
||||||
return
|
|
||||||
|
|
||||||
/obj/item/weapon/storage/bible/attack(mob/living/M as mob, mob/living/user as mob)
|
|
||||||
|
|
||||||
var/chaplain = 0
|
|
||||||
if(user.mind && (user.mind.assigned_role == "Chaplain"))
|
|
||||||
chaplain = 1
|
|
||||||
|
|
||||||
|
|
||||||
M.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been attacked with [src.name] by [user.name] ([user.ckey])</font>")
|
|
||||||
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Used the [src.name] to attack [M.name] ([M.ckey])</font>")
|
|
||||||
|
|
||||||
log_attack("<font color='red'>[user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])</font>")
|
|
||||||
|
|
||||||
if (!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
|
|
||||||
user << "\red You don't have the dexterity to do this!"
|
|
||||||
return
|
|
||||||
if(!chaplain)
|
|
||||||
user << "\red The book sizzles in your hands."
|
|
||||||
user.take_organ_damage(0,10)
|
|
||||||
return
|
|
||||||
|
|
||||||
if ((CLUMSY in user.mutations) && prob(50))
|
|
||||||
user << "\red The [src] slips out of your hand and hits your head."
|
|
||||||
user.take_organ_damage(10)
|
|
||||||
user.Paralyse(20)
|
|
||||||
return
|
|
||||||
|
|
||||||
// if(..() == BLOCKED)
|
|
||||||
// return
|
|
||||||
|
|
||||||
if (M.stat !=2)
|
|
||||||
if(M.mind && (M.mind.assigned_role == "Chaplain"))
|
|
||||||
user << "\red You can't heal yourself!"
|
|
||||||
return
|
|
||||||
/*if((M.mind in ticker.mode.cult) && (prob(20)))
|
|
||||||
M << "\red The power of [src.deity_name] clears your mind of heresy!"
|
|
||||||
user << "\red You see how [M]'s eyes become clear, the cult no longer holds control over him!"
|
|
||||||
ticker.mode.remove_cultist(M.mind)*/
|
|
||||||
if ((istype(M, /mob/living/carbon/human) && prob(60)))
|
|
||||||
bless(M)
|
|
||||||
for(var/mob/O in viewers(M, null))
|
|
||||||
O.show_message(text("\red <B>[] heals [] with the power of [src.deity_name]!</B>", user, M), 1)
|
|
||||||
M << "\red May the power of [src.deity_name] compel you to be healed!"
|
|
||||||
playsound(src.loc, "punch", 25, 1, -1)
|
|
||||||
else
|
|
||||||
if(ishuman(M) && !istype(M:head, /obj/item/clothing/head/helmet))
|
|
||||||
M.adjustBrainLoss(10)
|
|
||||||
M << "\red You feel dumber."
|
|
||||||
for(var/mob/O in viewers(M, null))
|
|
||||||
O.show_message(text("\red <B>[] beats [] over the head with []!</B>", user, M, src), 1)
|
|
||||||
playsound(src.loc, "punch", 25, 1, -1)
|
|
||||||
else if(M.stat == 2)
|
|
||||||
for(var/mob/O in viewers(M, null))
|
|
||||||
O.show_message(text("\red <B>[] smacks []'s lifeless corpse with [].</B>", user, M, src), 1)
|
|
||||||
playsound(src.loc, "punch", 25, 1, -1)
|
|
||||||
return
|
|
||||||
*/
|
|
||||||
/obj/item/weapon/storage/bible/afterattack(atom/A, mob/user as mob, proximity)
|
/obj/item/weapon/storage/bible/afterattack(atom/A, mob/user as mob, proximity)
|
||||||
if(!proximity) return
|
if(!proximity) return
|
||||||
/* if (istype(A, /turf/simulated/floor))
|
|
||||||
user << "\blue You hit the floor with the bible."
|
|
||||||
if(user.mind && (user.mind.assigned_role == "Chaplain"))
|
|
||||||
call(/obj/effect/rune/proc/revealrunes)(src)*/
|
|
||||||
if(user.mind && (user.mind.assigned_role == "Chaplain"))
|
if(user.mind && (user.mind.assigned_role == "Chaplain"))
|
||||||
if(A.reagents && A.reagents.has_reagent("water")) //blesses all the water in the holder
|
if(A.reagents && A.reagents.has_reagent("water")) //blesses all the water in the holder
|
||||||
user << "\blue You bless [A]."
|
user << "\blue You bless [A]."
|
||||||
|
|||||||
@@ -133,13 +133,13 @@
|
|||||||
return 0
|
return 0
|
||||||
|
|
||||||
var/mob/living/carbon/human/H = L
|
var/mob/living/carbon/human/H = L
|
||||||
var/datum/organ/external/affecting = H.get_organ(target_zone)
|
var/obj/item/organ/external/affecting = H.get_organ(target_zone)
|
||||||
if (affecting)
|
if (affecting)
|
||||||
if(!status)
|
if(!status)
|
||||||
L.visible_message("<span class='warning'>[L] has been prodded in the [affecting.display_name] with [src] by [user]. Luckily it was off.</span>")
|
L.visible_message("<span class='warning'>[L] has been prodded in the [affecting.name] with [src] by [user]. Luckily it was off.</span>")
|
||||||
return 1
|
return 1
|
||||||
else
|
else
|
||||||
H.visible_message("<span class='danger'>[L] has been prodded in the [affecting.display_name] with [src] by [user]!</span>")
|
H.visible_message("<span class='danger'>[L] has been prodded in the [affecting.name] with [src] by [user]!</span>")
|
||||||
else
|
else
|
||||||
if(!status)
|
if(!status)
|
||||||
L.visible_message("<span class='warning'>[L] has been prodded with [src] by [user]. Luckily it was off.</span>")
|
L.visible_message("<span class='warning'>[L] has been prodded with [src] by [user]. Luckily it was off.</span>")
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ Frequency:
|
|||||||
|
|
||||||
src.temp += "<B>Extranneous Signals:</B><BR>"
|
src.temp += "<B>Extranneous Signals:</B><BR>"
|
||||||
for (var/obj/item/weapon/implant/tracking/W in world)
|
for (var/obj/item/weapon/implant/tracking/W in world)
|
||||||
if (!W.implanted || !(istype(W.loc,/datum/organ/external) || ismob(W.loc)))
|
if (!W.implanted || !(istype(W.loc,/obj/item/organ/external) || ismob(W.loc)))
|
||||||
continue
|
continue
|
||||||
else
|
else
|
||||||
var/mob/M = W.loc
|
var/mob/M = W.loc
|
||||||
|
|||||||
@@ -362,7 +362,7 @@
|
|||||||
var/safety = user:eyecheck()
|
var/safety = user:eyecheck()
|
||||||
if(istype(user, /mob/living/carbon/human))
|
if(istype(user, /mob/living/carbon/human))
|
||||||
var/mob/living/carbon/human/H = user
|
var/mob/living/carbon/human/H = user
|
||||||
var/datum/organ/internal/eyes/E = H.internal_organs_by_name["eyes"]
|
var/obj/item/organ/eyes/E = H.internal_organs_by_name["eyes"]
|
||||||
if(!E)
|
if(!E)
|
||||||
return
|
return
|
||||||
if(H.species.flags & IS_SYNTHETIC)
|
if(H.species.flags & IS_SYNTHETIC)
|
||||||
@@ -457,7 +457,7 @@
|
|||||||
|
|
||||||
if(hasorgans(M))
|
if(hasorgans(M))
|
||||||
|
|
||||||
var/datum/organ/external/S = M:organs_by_name[user.zone_sel.selecting]
|
var/obj/item/organ/external/S = M:organs_by_name[user.zone_sel.selecting]
|
||||||
|
|
||||||
if (!S) return
|
if (!S) return
|
||||||
if(!(S.status & ORGAN_ROBOT) || user.a_intent != I_HELP)
|
if(!(S.status & ORGAN_ROBOT) || user.a_intent != I_HELP)
|
||||||
@@ -472,7 +472,7 @@
|
|||||||
|
|
||||||
if(S.brute_dam)
|
if(S.brute_dam)
|
||||||
S.heal_damage(15,0,0,1)
|
S.heal_damage(15,0,0,1)
|
||||||
user.visible_message("\red \The [user] patches some dents on \the [M]'s [S.display_name] with \the [src].")
|
user.visible_message("\red \The [user] patches some dents on \the [M]'s [S.name] with \the [src].")
|
||||||
return
|
return
|
||||||
else
|
else
|
||||||
user << "Nothing to fix!"
|
user << "Nothing to fix!"
|
||||||
|
|||||||
@@ -128,12 +128,12 @@
|
|||||||
base_icon = "fireaxe"
|
base_icon = "fireaxe"
|
||||||
name = "fire axe"
|
name = "fire axe"
|
||||||
desc = "Truly, the weapon of a madman. Who would think to fight fire with an axe?"
|
desc = "Truly, the weapon of a madman. Who would think to fight fire with an axe?"
|
||||||
force = 10
|
force = 15
|
||||||
sharp = 1
|
sharp = 1
|
||||||
edge = 1
|
edge = 1
|
||||||
w_class = 4.0
|
w_class = 4.0
|
||||||
slot_flags = SLOT_BACK
|
slot_flags = SLOT_BACK
|
||||||
force_wielded = 40
|
force_wielded = 30
|
||||||
attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut")
|
attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut")
|
||||||
|
|
||||||
/obj/item/weapon/twohanded/fireaxe/afterattack(atom/A as mob|obj|turf|area, mob/user as mob, proximity)
|
/obj/item/weapon/twohanded/fireaxe/afterattack(atom/A as mob|obj|turf|area, mob/user as mob, proximity)
|
||||||
@@ -198,7 +198,7 @@
|
|||||||
base_icon = "spearglass"
|
base_icon = "spearglass"
|
||||||
name = "spear"
|
name = "spear"
|
||||||
desc = "A haphazardly-constructed yet still deadly weapon of ancient design."
|
desc = "A haphazardly-constructed yet still deadly weapon of ancient design."
|
||||||
force = 14
|
force = 10
|
||||||
w_class = 4.0
|
w_class = 4.0
|
||||||
slot_flags = SLOT_BACK
|
slot_flags = SLOT_BACK
|
||||||
force_wielded = 22 // Was 13, Buffed - RR
|
force_wielded = 22 // Was 13, Buffed - RR
|
||||||
@@ -219,13 +219,13 @@
|
|||||||
sharp = 0
|
sharp = 0
|
||||||
edge = 0
|
edge = 0
|
||||||
w_class = 3
|
w_class = 3
|
||||||
force = 15
|
force = 10
|
||||||
throw_speed = 3
|
throw_speed = 3
|
||||||
throw_range = 7
|
throw_range = 7
|
||||||
throwforce = 7
|
throwforce = 7
|
||||||
attack_verb = list("smashed", "beaten", "slammed", "smacked", "striked", "battered", "bonked")
|
attack_verb = list("smashed", "beaten", "slammed", "smacked", "struck", "battered", "bonked")
|
||||||
hitsound = 'sound/weapons/genhit3.ogg'
|
hitsound = 'sound/weapons/genhit3.ogg'
|
||||||
force_wielded = 23
|
force_wielded = 20
|
||||||
|
|
||||||
/obj/item/weapon/twohanded/baseballbat/metal
|
/obj/item/weapon/twohanded/baseballbat/metal
|
||||||
name = "metal bat"
|
name = "metal bat"
|
||||||
@@ -233,6 +233,6 @@
|
|||||||
icon_state = "metalbat0"
|
icon_state = "metalbat0"
|
||||||
base_icon = "metalbat"
|
base_icon = "metalbat"
|
||||||
item_state = "metalbat"
|
item_state = "metalbat"
|
||||||
force = 18
|
force = 15
|
||||||
w_class = 3.0
|
w_class = 3.0
|
||||||
force_wielded = 27
|
force_wielded = 25
|
||||||
@@ -133,7 +133,7 @@
|
|||||||
M.adjustBruteLoss(damage)
|
M.adjustBruteLoss(damage)
|
||||||
return
|
return
|
||||||
|
|
||||||
var/datum/organ/external/affecting
|
var/obj/item/organ/external/affecting
|
||||||
|
|
||||||
switch(pick(list("ankle","wrist","head","knee","elbow")))
|
switch(pick(list("ankle","wrist","head","knee","elbow")))
|
||||||
if("ankle")
|
if("ankle")
|
||||||
@@ -148,7 +148,7 @@
|
|||||||
affecting = H.get_organ("head")
|
affecting = H.get_organ("head")
|
||||||
|
|
||||||
if(affecting)
|
if(affecting)
|
||||||
M << "<span class='danger'>You land heavily on your [affecting.display_name]!</span>"
|
M << "<span class='danger'>You land heavily on your [affecting.name]!</span>"
|
||||||
affecting.take_damage(damage, 0)
|
affecting.take_damage(damage, 0)
|
||||||
if(affecting.parent)
|
if(affecting.parent)
|
||||||
affecting.parent.add_autopsy_data("Misadventure", damage)
|
affecting.parent.add_autopsy_data("Misadventure", damage)
|
||||||
|
|||||||
@@ -31,12 +31,13 @@
|
|||||||
/obj/structure/extinguisher_cabinet/attack_hand(mob/user)
|
/obj/structure/extinguisher_cabinet/attack_hand(mob/user)
|
||||||
if(isrobot(user))
|
if(isrobot(user))
|
||||||
return
|
return
|
||||||
if (hasorgans(user))
|
if (ishuman(user))
|
||||||
var/datum/organ/external/temp = user:organs_by_name["r_hand"]
|
var/mob/living/carbon/human/H = user
|
||||||
|
var/obj/item/organ/external/temp = H.organs_by_name["r_hand"]
|
||||||
if (user.hand)
|
if (user.hand)
|
||||||
temp = user:organs_by_name["l_hand"]
|
temp = H.organs_by_name["l_hand"]
|
||||||
if(temp && !temp.is_usable())
|
if(temp && !temp.is_usable())
|
||||||
user << "<span class='notice'>You try to move your [temp.display_name], but cannot!"
|
user << "<span class='notice'>You try to move your [temp.name], but cannot!"
|
||||||
return
|
return
|
||||||
if(has_extinguisher)
|
if(has_extinguisher)
|
||||||
user.put_in_hands(has_extinguisher)
|
user.put_in_hands(has_extinguisher)
|
||||||
|
|||||||
@@ -249,7 +249,7 @@
|
|||||||
TryToSwitchState(atom/user)
|
TryToSwitchState(atom/user)
|
||||||
|
|
||||||
var/mob/living/carbon/M = user
|
var/mob/living/carbon/M = user
|
||||||
if(istype(M) && locate(/datum/organ/internal/xenos/hivenode) in M.internal_organs)
|
if(istype(M) && locate(/obj/item/organ/xenos/hivenode) in M.internal_organs)
|
||||||
return ..()
|
return ..()
|
||||||
|
|
||||||
Open()
|
Open()
|
||||||
|
|||||||
@@ -45,10 +45,10 @@
|
|||||||
var/mob/living/carbon/xenos = user
|
var/mob/living/carbon/xenos = user
|
||||||
var/mob/living/carbon/victim = M
|
var/mob/living/carbon/victim = M
|
||||||
|
|
||||||
if(istype(victim) && locate(/datum/organ/internal/xenos/hivenode) in victim.internal_organs)
|
if(istype(victim) && locate(/obj/item/organ/xenos/hivenode) in victim.internal_organs)
|
||||||
return
|
return
|
||||||
|
|
||||||
if(istype(xenos) && !(locate(/datum/organ/internal/xenos/hivenode) in xenos.internal_organs))
|
if(istype(xenos) && !(locate(/obj/item/organ/xenos/hivenode) in xenos.internal_organs))
|
||||||
return
|
return
|
||||||
|
|
||||||
if(M == usr)
|
if(M == usr)
|
||||||
|
|||||||
@@ -346,12 +346,13 @@
|
|||||||
var/busy = 0 //Something's being washed at the moment
|
var/busy = 0 //Something's being washed at the moment
|
||||||
|
|
||||||
/obj/structure/sink/attack_hand(mob/user as mob)
|
/obj/structure/sink/attack_hand(mob/user as mob)
|
||||||
if (hasorgans(user))
|
if (ishuman(user))
|
||||||
var/datum/organ/external/temp = user:organs_by_name["r_hand"]
|
var/mob/living/carbon/human/H = user
|
||||||
|
var/obj/item/organ/external/temp = H.organs_by_name["r_hand"]
|
||||||
if (user.hand)
|
if (user.hand)
|
||||||
temp = user:organs_by_name["l_hand"]
|
temp = H.organs_by_name["l_hand"]
|
||||||
if(temp && !temp.is_usable())
|
if(temp && !temp.is_usable())
|
||||||
user << "<span class='notice'>You try to move your [temp.display_name], but cannot!"
|
user << "<span class='notice'>You try to move your [temp.name], but cannot!"
|
||||||
return
|
return
|
||||||
|
|
||||||
if(isrobot(user) || isAI(user))
|
if(isrobot(user) || isAI(user))
|
||||||
|
|||||||
@@ -802,6 +802,7 @@ var/list/admin_verbs_mentor = list(
|
|||||||
M.r_eyes = hex2num(copytext(new_eyes, 2, 4))
|
M.r_eyes = hex2num(copytext(new_eyes, 2, 4))
|
||||||
M.g_eyes = hex2num(copytext(new_eyes, 4, 6))
|
M.g_eyes = hex2num(copytext(new_eyes, 4, 6))
|
||||||
M.b_eyes = hex2num(copytext(new_eyes, 6, 8))
|
M.b_eyes = hex2num(copytext(new_eyes, 6, 8))
|
||||||
|
M.update_eyes()
|
||||||
|
|
||||||
var/new_skin = input("Please select body color. This is for Tajaran, Unathi, and Skrell only!", "Character Generation") as color
|
var/new_skin = input("Please select body color. This is for Tajaran, Unathi, and Skrell only!", "Character Generation") as color
|
||||||
if(new_skin)
|
if(new_skin)
|
||||||
|
|||||||
@@ -1835,7 +1835,7 @@
|
|||||||
if(!security)
|
if(!security)
|
||||||
//strip their stuff before they teleport into a cell :downs:
|
//strip their stuff before they teleport into a cell :downs:
|
||||||
for(var/obj/item/weapon/W in H)
|
for(var/obj/item/weapon/W in H)
|
||||||
if(istype(W, /datum/organ/external))
|
if(istype(W, /obj/item/organ/external))
|
||||||
continue
|
continue
|
||||||
//don't strip organs
|
//don't strip organs
|
||||||
H.u_equip(W)
|
H.u_equip(W)
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
proc/triggered(mob/target as mob, var/type = "feet")
|
proc/triggered(mob/target as mob, var/type = "feet")
|
||||||
if(!armed)
|
if(!armed)
|
||||||
return
|
return
|
||||||
var/datum/organ/external/affecting = null
|
var/obj/item/organ/external/affecting = null
|
||||||
if(ishuman(target))
|
if(ishuman(target))
|
||||||
var/mob/living/carbon/human/H = target
|
var/mob/living/carbon/human/H = target
|
||||||
switch(type)
|
switch(type)
|
||||||
|
|||||||
@@ -111,6 +111,7 @@ datum/preferences
|
|||||||
// maps each organ to either null(intact), "cyborg" or "amputated"
|
// maps each organ to either null(intact), "cyborg" or "amputated"
|
||||||
// will probably not be able to do this for head and torso ;)
|
// will probably not be able to do this for head and torso ;)
|
||||||
var/list/organ_data = list()
|
var/list/organ_data = list()
|
||||||
|
var/list/rlimb_data = list()
|
||||||
var/list/player_alt_titles = new() // the default name of a job like "Medical Doctor"
|
var/list/player_alt_titles = new() // the default name of a job like "Medical Doctor"
|
||||||
|
|
||||||
var/list/flavor_texts = list()
|
var/list/flavor_texts = list()
|
||||||
@@ -344,7 +345,12 @@ datum/preferences
|
|||||||
++ind
|
++ind
|
||||||
if(ind > 1)
|
if(ind > 1)
|
||||||
dat += ", "
|
dat += ", "
|
||||||
dat += "\tMechanical [organ_name] prothesis"
|
var/datum/robolimb/R
|
||||||
|
if(rlimb_data[name] && all_robolimbs[rlimb_data[name]])
|
||||||
|
R = all_robolimbs[rlimb_data[name]]
|
||||||
|
else
|
||||||
|
R = basic_robolimb
|
||||||
|
dat += "\t[R.company] [organ_name] prothesis"
|
||||||
else if(status == "amputated")
|
else if(status == "amputated")
|
||||||
++ind
|
++ind
|
||||||
if(ind > 1)
|
if(ind > 1)
|
||||||
@@ -629,6 +635,8 @@ datum/preferences
|
|||||||
dat += "</br><b>Has a plantlike physiology.</b>"
|
dat += "</br><b>Has a plantlike physiology.</b>"
|
||||||
if(current_species.flags & IS_SYNTHETIC)
|
if(current_species.flags & IS_SYNTHETIC)
|
||||||
dat += "</br><b>Is machine-based.</b>"
|
dat += "</br><b>Is machine-based.</b>"
|
||||||
|
if(current_species.flags & REGENERATES_LIMBS)
|
||||||
|
dat += "</br><b>Has a plantlike physiology.</b>"
|
||||||
dat += "</small></td>"
|
dat += "</small></td>"
|
||||||
dat += "</tr>"
|
dat += "</tr>"
|
||||||
dat += "</table><center><hr/>"
|
dat += "</table><center><hr/>"
|
||||||
@@ -1421,15 +1429,25 @@ datum/preferences
|
|||||||
switch(new_state)
|
switch(new_state)
|
||||||
if("Normal")
|
if("Normal")
|
||||||
organ_data[limb] = null
|
organ_data[limb] = null
|
||||||
|
rlimb_data[limb] = null
|
||||||
if(third_limb)
|
if(third_limb)
|
||||||
organ_data[third_limb] = null
|
organ_data[third_limb] = null
|
||||||
|
rlimb_data[third_limb] = null
|
||||||
if("Amputated")
|
if("Amputated")
|
||||||
organ_data[limb] = "amputated"
|
organ_data[limb] = "amputated"
|
||||||
|
rlimb_data[limb] = null
|
||||||
if(second_limb)
|
if(second_limb)
|
||||||
organ_data[second_limb] = "amputated"
|
organ_data[second_limb] = "amputated"
|
||||||
|
rlimb_data[second_limb] = null
|
||||||
|
|
||||||
if("Prothesis")
|
if("Prothesis")
|
||||||
|
var/choice = input(user, "Which manufacturer do you wish to use for this limb?") as null|anything in chargen_robolimbs
|
||||||
|
if(!choice)
|
||||||
|
return
|
||||||
|
rlimb_data[limb] = choice
|
||||||
organ_data[limb] = "cyborg"
|
organ_data[limb] = "cyborg"
|
||||||
if(second_limb)
|
if(second_limb)
|
||||||
|
organ_data[second_limb] = choice
|
||||||
organ_data[second_limb] = "cyborg"
|
organ_data[second_limb] = "cyborg"
|
||||||
if(third_limb && organ_data[third_limb] == "amputated")
|
if(third_limb && organ_data[third_limb] == "amputated")
|
||||||
organ_data[third_limb] = null
|
organ_data[third_limb] = null
|
||||||
@@ -1662,21 +1680,28 @@ datum/preferences
|
|||||||
for(var/name in organ_data)
|
for(var/name in organ_data)
|
||||||
|
|
||||||
var/status = organ_data[name]
|
var/status = organ_data[name]
|
||||||
var/datum/organ/external/O = character.organs_by_name[name]
|
var/obj/item/organ/external/O = character.organs_by_name[name]
|
||||||
if(O)
|
if(O)
|
||||||
if(status == "amputated")
|
if(status == "amputated")
|
||||||
O.amputated = 1
|
character.organs_by_name[O.limb_name] = null
|
||||||
O.status |= ORGAN_DESTROYED
|
character.organs -= O
|
||||||
O.destspawn = 1
|
if(O.children) // This might need to become recursive.
|
||||||
|
for(var/obj/item/organ/external/child in O.children)
|
||||||
|
character.organs_by_name[child.limb_name] = null
|
||||||
|
character.organs -= child
|
||||||
|
|
||||||
else if(status == "cyborg")
|
else if(status == "cyborg")
|
||||||
O.status |= ORGAN_ROBOT
|
if(rlimb_data[name])
|
||||||
|
O.robotize(rlimb_data[name])
|
||||||
|
else
|
||||||
|
O.robotize()
|
||||||
else
|
else
|
||||||
var/datum/organ/internal/I = character.internal_organs_by_name[name]
|
var/obj/item/organ/I = character.internal_organs_by_name[name]
|
||||||
if(I)
|
if(I)
|
||||||
if(status == "assisted")
|
if(status == "assisted")
|
||||||
I.mechassist()
|
I.mechassist()
|
||||||
else if(status == "mechanical")
|
else if(status == "mechanical")
|
||||||
I.mechanize()
|
I.robotize()
|
||||||
|
|
||||||
character.underwear = underwear
|
character.underwear = underwear
|
||||||
|
|
||||||
|
|||||||
@@ -170,6 +170,7 @@
|
|||||||
S["skills"] >> skills
|
S["skills"] >> skills
|
||||||
S["skill_specialization"] >> skill_specialization
|
S["skill_specialization"] >> skill_specialization
|
||||||
S["organ_data"] >> organ_data
|
S["organ_data"] >> organ_data
|
||||||
|
S["rlimb_data"] >> rlimb_data
|
||||||
S["gear"] >> gear
|
S["gear"] >> gear
|
||||||
S["home_system"] >> home_system
|
S["home_system"] >> home_system
|
||||||
S["citizenship"] >> citizenship
|
S["citizenship"] >> citizenship
|
||||||
@@ -240,6 +241,7 @@
|
|||||||
if(isnull(disabilities)) disabilities = 0
|
if(isnull(disabilities)) disabilities = 0
|
||||||
if(!player_alt_titles) player_alt_titles = new()
|
if(!player_alt_titles) player_alt_titles = new()
|
||||||
if(!organ_data) src.organ_data = list()
|
if(!organ_data) src.organ_data = list()
|
||||||
|
if(!rlimb_data) src.rlimb_data = list()
|
||||||
if(!gear) src.gear = list()
|
if(!gear) src.gear = list()
|
||||||
//if(!skin_style) skin_style = "Default"
|
//if(!skin_style) skin_style = "Default"
|
||||||
|
|
||||||
@@ -324,6 +326,7 @@
|
|||||||
S["skills"] << skills
|
S["skills"] << skills
|
||||||
S["skill_specialization"] << skill_specialization
|
S["skill_specialization"] << skill_specialization
|
||||||
S["organ_data"] << organ_data
|
S["organ_data"] << organ_data
|
||||||
|
S["rlimb_data"] << rlimb_data
|
||||||
S["gear"] << gear
|
S["gear"] << gear
|
||||||
S["home_system"] << home_system
|
S["home_system"] << home_system
|
||||||
S["citizenship"] << citizenship
|
S["citizenship"] << citizenship
|
||||||
|
|||||||
@@ -76,7 +76,7 @@
|
|||||||
// Some space suits are equipped with reactive membranes that support
|
// Some space suits are equipped with reactive membranes that support
|
||||||
// broken limbs - at the time of writing, only the ninja suit, but
|
// broken limbs - at the time of writing, only the ninja suit, but
|
||||||
// I can see it being useful for other suits as we expand them. ~ Z
|
// I can see it being useful for other suits as we expand them. ~ Z
|
||||||
// The actual splinting occurs in /datum/organ/external/proc/fracture()
|
// The actual splinting occurs in /obj/item/organ/external/proc/fracture()
|
||||||
/obj/item/clothing/suit/space/proc/check_limb_support(var/mob/living/carbon/human/user)
|
/obj/item/clothing/suit/space/proc/check_limb_support(var/mob/living/carbon/human/user)
|
||||||
|
|
||||||
// If this isn't set, then we don't need to care.
|
// If this isn't set, then we don't need to care.
|
||||||
@@ -87,7 +87,7 @@
|
|||||||
return
|
return
|
||||||
|
|
||||||
// Otherwise, remove the splints.
|
// Otherwise, remove the splints.
|
||||||
for(var/datum/organ/external/E in supporting_limbs)
|
for(var/obj/item/organ/external/E in supporting_limbs)
|
||||||
E.status &= ~ ORGAN_SPLINTED
|
E.status &= ~ ORGAN_SPLINTED
|
||||||
user << "The suit stops supporting your [E.display_name]."
|
user << "The suit stops supporting your [E.name]."
|
||||||
supporting_limbs = list()
|
supporting_limbs = list()
|
||||||
|
|||||||
@@ -26,7 +26,7 @@
|
|||||||
finish(mob/living/carbon/human/H)
|
finish(mob/living/carbon/human/H)
|
||||||
if(!H.reagents.has_reagent("dexalin"))
|
if(!H.reagents.has_reagent("dexalin"))
|
||||||
for(var/organ_name in list("chest","l_arm","r_arm","r_leg","l_leg","head","groin"))
|
for(var/organ_name in list("chest","l_arm","r_arm","r_leg","l_leg","head","groin"))
|
||||||
var/datum/organ/external/E = H.get_organ(organ_name)
|
var/obj/item/organ/external/E = H.get_organ(organ_name)
|
||||||
E.take_damage(0, 5, 0)
|
E.take_damage(0, 5, 0)
|
||||||
|
|
||||||
/datum/genetics/side_effect/bone_snap
|
/datum/genetics/side_effect/bone_snap
|
||||||
@@ -42,7 +42,7 @@
|
|||||||
finish(mob/living/carbon/human/H)
|
finish(mob/living/carbon/human/H)
|
||||||
if(!H.reagents.has_reagent("bicaridine"))
|
if(!H.reagents.has_reagent("bicaridine"))
|
||||||
var/organ_name = pick("chest","l_arm","r_arm","r_leg","l_leg","head","groin")
|
var/organ_name = pick("chest","l_arm","r_arm","r_leg","l_leg","head","groin")
|
||||||
var/datum/organ/external/E = H.get_organ(organ_name)
|
var/obj/item/organ/external/E = H.get_organ(organ_name)
|
||||||
E.take_damage(20, 0, 0)
|
E.take_damage(20, 0, 0)
|
||||||
E.fracture()
|
E.fracture()
|
||||||
|
|
||||||
|
|||||||
@@ -110,19 +110,19 @@
|
|||||||
|
|
||||||
|
|
||||||
if(!target_limb) target_limb = pick("l_foot","r_foot","l_leg","r_leg","l_hand","r_hand","l_arm", "r_arm","head","chest","groin")
|
if(!target_limb) target_limb = pick("l_foot","r_foot","l_leg","r_leg","l_hand","r_hand","l_arm", "r_arm","head","chest","groin")
|
||||||
var/datum/organ/external/affecting = target.get_organ(target_limb)
|
var/obj/item/organ/external/affecting = target.get_organ(target_limb)
|
||||||
var/damage = 0
|
var/damage = 0
|
||||||
|
|
||||||
if(get_trait(TRAIT_CARNIVOROUS))
|
if(get_trait(TRAIT_CARNIVOROUS))
|
||||||
if(get_trait(TRAIT_CARNIVOROUS) == 2)
|
if(get_trait(TRAIT_CARNIVOROUS) == 2)
|
||||||
if(affecting)
|
if(affecting)
|
||||||
target << "<span class='danger'>\The [fruit]'s thorns pierce your [affecting.display_name] greedily!</span>"
|
target << "<span class='danger'>\The [fruit]'s thorns pierce your [affecting.name] greedily!</span>"
|
||||||
else
|
else
|
||||||
target << "<span class='danger'>\The [fruit]'s thorns pierce your flesh greedily!</span>"
|
target << "<span class='danger'>\The [fruit]'s thorns pierce your flesh greedily!</span>"
|
||||||
damage = get_trait(TRAIT_POTENCY)/2
|
damage = get_trait(TRAIT_POTENCY)/2
|
||||||
else
|
else
|
||||||
if(affecting)
|
if(affecting)
|
||||||
target << "<span class='danger'>\The [fruit]'s thorns dig deeply into your [affecting.display_name]!</span>"
|
target << "<span class='danger'>\The [fruit]'s thorns dig deeply into your [affecting.name]!</span>"
|
||||||
else
|
else
|
||||||
target << "<span class='danger'>\The [fruit]'s thorns dig deeply into your flesh!</span>"
|
target << "<span class='danger'>\The [fruit]'s thorns dig deeply into your flesh!</span>"
|
||||||
damage = get_trait(TRAIT_POTENCY)/5
|
damage = get_trait(TRAIT_POTENCY)/5
|
||||||
|
|||||||
@@ -226,7 +226,7 @@
|
|||||||
icon_state = "hatchet"
|
icon_state = "hatchet"
|
||||||
flags = CONDUCT
|
flags = CONDUCT
|
||||||
force = 12.0
|
force = 12.0
|
||||||
w_class = 2.0
|
w_class = 3.0
|
||||||
throwforce = 15.0
|
throwforce = 15.0
|
||||||
throw_speed = 4
|
throw_speed = 4
|
||||||
throw_range = 4
|
throw_range = 4
|
||||||
|
|||||||
@@ -118,6 +118,8 @@
|
|||||||
origin_tech = "materials=4;phorontech=3;engineering=3"
|
origin_tech = "materials=4;phorontech=3;engineering=3"
|
||||||
desc = "A rock cutter that uses bursts of hot plasma. You could use it to cut limbs off of xenos! Or, you know, mine stuff."
|
desc = "A rock cutter that uses bursts of hot plasma. You could use it to cut limbs off of xenos! Or, you know, mine stuff."
|
||||||
drill_verb = "cutting"
|
drill_verb = "cutting"
|
||||||
|
sharp = 1
|
||||||
|
edge = 1
|
||||||
|
|
||||||
/obj/item/weapon/pickaxe/diamond
|
/obj/item/weapon/pickaxe/diamond
|
||||||
name = "diamond pickaxe"
|
name = "diamond pickaxe"
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
var/mob/living/carbon/M = other
|
var/mob/living/carbon/M = other
|
||||||
if(!istype(M))
|
if(!istype(M))
|
||||||
return 1
|
return 1
|
||||||
if(locate(/datum/organ/internal/xenos/hivenode) in M.internal_organs)
|
if(locate(/obj/item/organ/xenos/hivenode) in M.internal_organs)
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
|
|||||||
@@ -11,4 +11,4 @@
|
|||||||
/mob/living/carbon/alien/larva/New()
|
/mob/living/carbon/alien/larva/New()
|
||||||
..()
|
..()
|
||||||
add_language("Xenomorph") //Bonus language.
|
add_language("Xenomorph") //Bonus language.
|
||||||
internal_organs += new /datum/organ/internal/xenos/hivenode(src)
|
internal_organs |= new /obj/item/organ/xenos/hivenode(src)
|
||||||
@@ -10,11 +10,6 @@
|
|||||||
throw_range = 5
|
throw_range = 5
|
||||||
origin_tech = "biotech=3"
|
origin_tech = "biotech=3"
|
||||||
attack_verb = list("attacked", "slapped", "whacked")
|
attack_verb = list("attacked", "slapped", "whacked")
|
||||||
prosthetic_name = "cyberbrain"
|
|
||||||
prosthetic_icon = "brain-prosthetic"
|
|
||||||
organ_tag = "brain"
|
|
||||||
organ_type = /datum/organ/internal/brain
|
|
||||||
|
|
||||||
var/mob/living/carbon/brain/brainmob = null
|
var/mob/living/carbon/brain/brainmob = null
|
||||||
|
|
||||||
/obj/item/organ/brain/xeno
|
/obj/item/organ/brain/xeno
|
||||||
@@ -49,19 +44,18 @@
|
|||||||
else
|
else
|
||||||
user << "This one seems particularly lifeless. Perhaps it will regain some of its luster later.."
|
user << "This one seems particularly lifeless. Perhaps it will regain some of its luster later.."
|
||||||
|
|
||||||
/obj/item/organ/brain/removed(var/mob/living/target,var/mob/living/user)
|
/obj/item/organ/brain/removed(var/mob/living/user)
|
||||||
|
|
||||||
..()
|
..()
|
||||||
|
|
||||||
var/mob/living/simple_animal/borer/borer = target.has_brain_worms()
|
var/mob/living/simple_animal/borer/borer = owner.has_brain_worms()
|
||||||
|
|
||||||
if(borer)
|
if(borer)
|
||||||
borer.detatch() //Should remove borer if the brain is removed - RR
|
borer.detatch() //Should remove borer if the brain is removed - RR
|
||||||
|
|
||||||
var/mob/living/carbon/human/H = target
|
|
||||||
var/obj/item/organ/brain/B = src
|
var/obj/item/organ/brain/B = src
|
||||||
if(istype(B) && istype(H))
|
if(istype(B) && istype(owner))
|
||||||
B.transfer_identity(target)
|
B.transfer_identity(owner)
|
||||||
|
|
||||||
/obj/item/organ/brain/replaced(var/mob/living/target)
|
/obj/item/organ/brain/replaced(var/mob/living/target)
|
||||||
|
|
||||||
@@ -78,8 +72,6 @@
|
|||||||
/obj/item/organ/brain/slime
|
/obj/item/organ/brain/slime
|
||||||
name = "slime core"
|
name = "slime core"
|
||||||
desc = "A complex, organic knot of jelly and crystalline particles."
|
desc = "A complex, organic knot of jelly and crystalline particles."
|
||||||
prosthetic_name = null
|
|
||||||
prosthetic_icon = null
|
|
||||||
robotic = 2
|
robotic = 2
|
||||||
icon = 'icons/mob/slimes.dmi'
|
icon = 'icons/mob/slimes.dmi'
|
||||||
icon_state = "green slime extract"
|
icon_state = "green slime extract"
|
||||||
@@ -87,8 +79,6 @@
|
|||||||
/obj/item/organ/brain/golem
|
/obj/item/organ/brain/golem
|
||||||
name = "chem"
|
name = "chem"
|
||||||
desc = "A tightly furled roll of paper, covered with indecipherable runes."
|
desc = "A tightly furled roll of paper, covered with indecipherable runes."
|
||||||
prosthetic_name = null
|
|
||||||
prosthetic_icon = null
|
|
||||||
robotic = 2
|
robotic = 2
|
||||||
icon = 'icons/obj/wizard.dmi'
|
icon = 'icons/obj/wizard.dmi'
|
||||||
icon_state = "scroll"
|
icon_state = "scroll"
|
||||||
@@ -32,8 +32,8 @@
|
|||||||
if(istype(src, /mob/living/carbon/human))
|
if(istype(src, /mob/living/carbon/human))
|
||||||
var/mob/living/carbon/human/H = src
|
var/mob/living/carbon/human/H = src
|
||||||
var/organ = H.get_organ("chest")
|
var/organ = H.get_organ("chest")
|
||||||
if (istype(organ, /datum/organ/external))
|
if (istype(organ, /obj/item/organ/external))
|
||||||
var/datum/organ/external/temp = organ
|
var/obj/item/organ/external/temp = organ
|
||||||
if(temp.take_damage(d, 0))
|
if(temp.take_damage(d, 0))
|
||||||
H.UpdateDamageIcon()
|
H.UpdateDamageIcon()
|
||||||
H.updatehealth()
|
H.updatehealth()
|
||||||
@@ -60,12 +60,13 @@
|
|||||||
|
|
||||||
/mob/living/carbon/attack_hand(mob/M as mob)
|
/mob/living/carbon/attack_hand(mob/M as mob)
|
||||||
if(!istype(M, /mob/living/carbon)) return
|
if(!istype(M, /mob/living/carbon)) return
|
||||||
if (hasorgans(M))
|
if (ishuman(M))
|
||||||
var/datum/organ/external/temp = M:organs_by_name["r_hand"]
|
var/mob/living/carbon/human/H = M
|
||||||
if (M.hand)
|
var/obj/item/organ/external/temp = H.organs_by_name["r_hand"]
|
||||||
temp = M:organs_by_name["l_hand"]
|
if (H.hand)
|
||||||
|
temp = H.organs_by_name["l_hand"]
|
||||||
if(temp && !temp.is_usable())
|
if(temp && !temp.is_usable())
|
||||||
M << "\red You can't use your [temp.display_name]"
|
H << "\red You can't use your [temp.name]"
|
||||||
return
|
return
|
||||||
|
|
||||||
for(var/datum/disease/D in viruses)
|
for(var/datum/disease/D in viruses)
|
||||||
@@ -155,7 +156,7 @@
|
|||||||
"\blue You check yourself for injuries." \
|
"\blue You check yourself for injuries." \
|
||||||
)
|
)
|
||||||
|
|
||||||
for(var/datum/organ/external/org in H.organs)
|
for(var/obj/item/organ/external/org in H.organs)
|
||||||
var/status = ""
|
var/status = ""
|
||||||
var/brutedamage = org.brute_dam
|
var/brutedamage = org.brute_dam
|
||||||
var/burndamage = org.burn_dam
|
var/burndamage = org.burn_dam
|
||||||
@@ -186,7 +187,7 @@
|
|||||||
status = "weirdly shapen."
|
status = "weirdly shapen."
|
||||||
if(status == "")
|
if(status == "")
|
||||||
status = "OK"
|
status = "OK"
|
||||||
src.show_message(text("\t []My [] is [].",status=="OK"?"\blue ":"\red ",org.display_name,status),1)
|
src.show_message(text("\t []My [] is [].",status=="OK"?"\blue ":"\red ",org.name,status),1)
|
||||||
if((SKELETON in H.mutations) && (!H.w_uniform) && (!H.wear_suit))
|
if((SKELETON in H.mutations) && (!H.w_uniform) && (!H.wear_suit))
|
||||||
H.play_xylophone()
|
H.play_xylophone()
|
||||||
else if (on_fire)
|
else if (on_fire)
|
||||||
|
|||||||
@@ -83,6 +83,7 @@
|
|||||||
g_eyes = green
|
g_eyes = green
|
||||||
b_eyes = blue
|
b_eyes = blue
|
||||||
|
|
||||||
|
update_eyes()
|
||||||
update_body()
|
update_body()
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
|
|||||||
@@ -1,19 +1,14 @@
|
|||||||
/mob/living/carbon/human/gib()
|
/mob/living/carbon/human/gib()
|
||||||
|
|
||||||
for(var/datum/organ/internal/I in internal_organs)
|
for(var/obj/item/organ/I in internal_organs)
|
||||||
var/obj/item/organ/current_organ = I.remove()
|
I.removed()
|
||||||
if(current_organ)
|
if(istype(loc,/turf))
|
||||||
if(istype(loc,/turf))
|
I.throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),30)
|
||||||
current_organ.throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),30)
|
|
||||||
current_organ.removed(src)
|
|
||||||
|
|
||||||
for(var/datum/organ/external/E in src.organs)
|
for(var/obj/item/organ/external/E in src.organs)
|
||||||
if(istype(E, /datum/organ/external/chest))
|
E.droplimb(0,0,1)
|
||||||
continue
|
|
||||||
// Only make the limb drop if it's not too damaged
|
sleep(1)
|
||||||
if(prob(100 - E.get_damage()))
|
|
||||||
// Override the current limb status and don't cause an explosion
|
|
||||||
E.droplimb(1,1)
|
|
||||||
|
|
||||||
..(species.gibbed_anim)
|
..(species.gibbed_anim)
|
||||||
gibs(loc, viruses, dna, null, species.flesh_color, species.blood_color)
|
gibs(loc, viruses, dna, null, species.flesh_color, species.blood_color)
|
||||||
@@ -38,7 +33,7 @@
|
|||||||
if(species) species.handle_death(src)
|
if(species) species.handle_death(src)
|
||||||
|
|
||||||
//Handle brain slugs.
|
//Handle brain slugs.
|
||||||
var/datum/organ/external/head = get_organ("head")
|
var/obj/item/organ/external/head = get_organ("head")
|
||||||
var/mob/living/simple_animal/borer/B
|
var/mob/living/simple_animal/borer/B
|
||||||
|
|
||||||
for(var/I in head.implants)
|
for(var/I in head.implants)
|
||||||
|
|||||||
@@ -198,9 +198,9 @@
|
|||||||
|
|
||||||
//splints
|
//splints
|
||||||
for(var/organ in list("l_leg","r_leg","l_arm","r_arm"))
|
for(var/organ in list("l_leg","r_leg","l_arm","r_arm"))
|
||||||
var/datum/organ/external/o = get_organ(organ)
|
var/obj/item/organ/external/o = get_organ(organ)
|
||||||
if(o && o.status & ORGAN_SPLINTED)
|
if(o && o.status & ORGAN_SPLINTED)
|
||||||
msg += "<span class='warning'>[t_He] [t_has] a splint on [t_his] [o.display_name]!</span>\n"
|
msg += "<span class='warning'>[t_He] [t_has] a splint on [t_his] [o.name]!</span>\n"
|
||||||
|
|
||||||
if(suiciding)
|
if(suiciding)
|
||||||
msg += "<span class='warning'>[t_He] appears to have commited suicide... there is no hope of recovery.</span>\n"
|
msg += "<span class='warning'>[t_He] appears to have commited suicide... there is no hope of recovery.</span>\n"
|
||||||
@@ -251,33 +251,44 @@
|
|||||||
var/list/wound_flavor_text = list()
|
var/list/wound_flavor_text = list()
|
||||||
var/list/is_destroyed = list()
|
var/list/is_destroyed = list()
|
||||||
var/list/is_bleeding = list()
|
var/list/is_bleeding = list()
|
||||||
for(var/datum/organ/external/temp in organs)
|
|
||||||
|
for(var/organ_tag in species.has_limbs)
|
||||||
|
|
||||||
|
var/list/organ_data = species.has_limbs[organ_tag]
|
||||||
|
var/organ_descriptor = organ_data["descriptor"]
|
||||||
|
is_destroyed["[organ_data["descriptor"]]"] = 1
|
||||||
|
|
||||||
|
var/obj/item/organ/external/E = organs_by_name[organ_tag]
|
||||||
|
if(!E)
|
||||||
|
wound_flavor_text["[organ_descriptor]"] = "<span class='warning'><b>[t_He] is missing [t_his] [organ_descriptor].</b></span>\n"
|
||||||
|
else if(E.is_stump())
|
||||||
|
wound_flavor_text["[organ_descriptor]"] = "<span class='warning'><b>[t_He] has a stump where [t_his] [organ_descriptor] should be.</b></span>\n"
|
||||||
|
else
|
||||||
|
continue
|
||||||
|
|
||||||
|
for(var/obj/item/organ/external/temp in organs)
|
||||||
if(temp)
|
if(temp)
|
||||||
if(temp.status & ORGAN_DESTROYED)
|
|
||||||
is_destroyed["[temp.display_name]"] = 1
|
|
||||||
wound_flavor_text["[temp.display_name]"] = "<span class='warning'><b>[t_He] is missing [t_his] [temp.display_name].</b></span>\n"
|
|
||||||
continue
|
|
||||||
if(temp.status & ORGAN_ROBOT)
|
if(temp.status & ORGAN_ROBOT)
|
||||||
if(!(temp.brute_dam + temp.burn_dam))
|
if(!(temp.brute_dam + temp.burn_dam))
|
||||||
if(!species.flags & IS_SYNTHETIC)
|
if(!species.flags & IS_SYNTHETIC)
|
||||||
wound_flavor_text["[temp.display_name]"] = "<span class='warning'>[t_He] has a robot [temp.display_name]!</span>\n"
|
wound_flavor_text["[temp.name]"] = "<span class='warning'>[t_He] has a robot [temp.name]!</span>\n"
|
||||||
continue
|
continue
|
||||||
else
|
else
|
||||||
wound_flavor_text["[temp.display_name]"] = "<span class='warning'>[t_He] has a robot [temp.display_name]. It has"
|
wound_flavor_text["[temp.name]"] = "<span class='warning'>[t_He] has a robot [temp.name]. It has"
|
||||||
if(temp.brute_dam) switch(temp.brute_dam)
|
if(temp.brute_dam) switch(temp.brute_dam)
|
||||||
if(0 to 20)
|
if(0 to 20)
|
||||||
wound_flavor_text["[temp.display_name]"] += " some dents"
|
wound_flavor_text["[temp.name]"] += " some dents"
|
||||||
if(21 to INFINITY)
|
if(21 to INFINITY)
|
||||||
wound_flavor_text["[temp.display_name]"] += pick(" a lot of dents"," severe denting")
|
wound_flavor_text["[temp.name]"] += pick(" a lot of dents"," severe denting")
|
||||||
if(temp.brute_dam && temp.burn_dam)
|
if(temp.brute_dam && temp.burn_dam)
|
||||||
wound_flavor_text["[temp.display_name]"] += " and"
|
wound_flavor_text["[temp.name]"] += " and"
|
||||||
if(temp.burn_dam) switch(temp.burn_dam)
|
if(temp.burn_dam) switch(temp.burn_dam)
|
||||||
if(0 to 20)
|
if(0 to 20)
|
||||||
wound_flavor_text["[temp.display_name]"] += " some burns"
|
wound_flavor_text["[temp.name]"] += " some burns"
|
||||||
if(21 to INFINITY)
|
if(21 to INFINITY)
|
||||||
wound_flavor_text["[temp.display_name]"] += pick(" a lot of burns"," severe melting")
|
wound_flavor_text["[temp.name]"] += pick(" a lot of burns"," severe melting")
|
||||||
if(wound_flavor_text["[temp.display_name]"])
|
if(wound_flavor_text["[temp.name]"])
|
||||||
wound_flavor_text["[temp.display_name]"] += "!</span>\n"
|
wound_flavor_text["[temp.name]"] += "!</span>\n"
|
||||||
else if(temp.wounds.len > 0)
|
else if(temp.wounds.len > 0)
|
||||||
var/list/wound_descriptors = list()
|
var/list/wound_descriptors = list()
|
||||||
for(var/datum/wound/W in temp.wounds)
|
for(var/datum/wound/W in temp.wounds)
|
||||||
@@ -325,14 +336,14 @@
|
|||||||
else if(flavor_text.len > 1 && text > 1)
|
else if(flavor_text.len > 1 && text > 1)
|
||||||
flavor_text_string += ","
|
flavor_text_string += ","
|
||||||
flavor_text_string += flavor_text[text]
|
flavor_text_string += flavor_text[text]
|
||||||
flavor_text_string += " on [t_his] [temp.display_name].</span><br>"
|
flavor_text_string += " on [t_his] [temp.name].</span><br>"
|
||||||
wound_flavor_text["[temp.display_name]"] = flavor_text_string
|
wound_flavor_text["[temp.name]"] = flavor_text_string
|
||||||
else
|
else
|
||||||
wound_flavor_text["[temp.display_name]"] = ""
|
wound_flavor_text["[temp.name]"] = ""
|
||||||
if(temp.status & ORGAN_BLEEDING)
|
if(temp.status & ORGAN_BLEEDING)
|
||||||
is_bleeding["[temp.display_name]"] = 1
|
is_bleeding["[temp.name]"] = 1
|
||||||
else
|
else
|
||||||
wound_flavor_text["[temp.display_name]"] = ""
|
wound_flavor_text["[temp.name]"] = ""
|
||||||
|
|
||||||
//Handles the text strings being added to the actual description.
|
//Handles the text strings being added to the actual description.
|
||||||
//If they have something that covers the limb, and it is not missing, put flavortext. If it is covered but bleeding, add other flavortext.
|
//If they have something that covers the limb, and it is not missing, put flavortext. If it is covered but bleeding, add other flavortext.
|
||||||
|
|||||||
@@ -65,7 +65,7 @@
|
|||||||
stat("Tank Pressure", internal.air_contents.return_pressure())
|
stat("Tank Pressure", internal.air_contents.return_pressure())
|
||||||
stat("Distribution Pressure", internal.distribute_pressure)
|
stat("Distribution Pressure", internal.distribute_pressure)
|
||||||
|
|
||||||
var/datum/organ/internal/xenos/plasmavessel/P = internal_organs_by_name["plasma vessel"]
|
var/obj/item/organ/xenos/plasmavessel/P = internal_organs_by_name["plasma vessel"]
|
||||||
if(P)
|
if(P)
|
||||||
stat(null, "Phoron Stored: [P.stored_plasma]/[P.max_plasma]")
|
stat(null, "Phoron Stored: [P.stored_plasma]/[P.max_plasma]")
|
||||||
|
|
||||||
@@ -129,7 +129,7 @@
|
|||||||
var/update = 0
|
var/update = 0
|
||||||
|
|
||||||
// focus most of the blast on one organ
|
// focus most of the blast on one organ
|
||||||
var/datum/organ/external/take_blast = pick(organs)
|
var/obj/item/organ/external/take_blast = pick(organs)
|
||||||
update |= take_blast.take_damage(b_loss * 0.9, f_loss * 0.9, used_weapon = "Explosive blast")
|
update |= take_blast.take_damage(b_loss * 0.9, f_loss * 0.9, used_weapon = "Explosive blast")
|
||||||
|
|
||||||
// distribute the remaining 10% on all limbs equally
|
// distribute the remaining 10% on all limbs equally
|
||||||
@@ -138,7 +138,7 @@
|
|||||||
|
|
||||||
var/weapon_message = "Explosive Blast"
|
var/weapon_message = "Explosive Blast"
|
||||||
|
|
||||||
for(var/datum/organ/external/temp in organs)
|
for(var/obj/item/organ/external/temp in organs)
|
||||||
switch(temp.name)
|
switch(temp.name)
|
||||||
if("head")
|
if("head")
|
||||||
update |= temp.take_damage(b_loss * 0.2, f_loss * 0.2, used_weapon = weapon_message)
|
update |= temp.take_damage(b_loss * 0.2, f_loss * 0.2, used_weapon = weapon_message)
|
||||||
@@ -167,7 +167,7 @@
|
|||||||
if(stat == 2) return
|
if(stat == 2) return
|
||||||
show_message("\red The blob attacks you!")
|
show_message("\red The blob attacks you!")
|
||||||
var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg")
|
var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg")
|
||||||
var/datum/organ/external/affecting = get_organ(ran_zone(dam_zone))
|
var/obj/item/organ/external/affecting = get_organ(ran_zone(dam_zone))
|
||||||
apply_damage(rand(30,40), BRUTE, affecting, run_armor_check(affecting, "melee"))
|
apply_damage(rand(30,40), BRUTE, affecting, run_armor_check(affecting, "melee"))
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -176,7 +176,7 @@
|
|||||||
if ((M.client && !( M.blinded )))
|
if ((M.client && !( M.blinded )))
|
||||||
M.show_message("\red [src] has been hit by [O]", 1)
|
M.show_message("\red [src] has been hit by [O]", 1)
|
||||||
if (health > 0)
|
if (health > 0)
|
||||||
var/datum/organ/external/affecting = get_organ(pick("chest", "chest", "chest", "head"))
|
var/obj/item/organ/external/affecting = get_organ(pick("chest", "chest", "chest", "head"))
|
||||||
if(!affecting) return
|
if(!affecting) return
|
||||||
if (istype(O, /obj/effect/immovablerod))
|
if (istype(O, /obj/effect/immovablerod))
|
||||||
if(affecting.take_damage(101, 0))
|
if(affecting.take_damage(101, 0))
|
||||||
@@ -193,7 +193,7 @@
|
|||||||
var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(M)
|
var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(M)
|
||||||
L.imp_in = M
|
L.imp_in = M
|
||||||
L.implanted = 1
|
L.implanted = 1
|
||||||
var/datum/organ/external/affected = M.organs_by_name["head"]
|
var/obj/item/organ/external/affected = M.organs_by_name["head"]
|
||||||
affected.implants += L
|
affected.implants += L
|
||||||
L.part = affected
|
L.part = affected
|
||||||
L.implanted(src)
|
L.implanted(src)
|
||||||
@@ -201,7 +201,7 @@
|
|||||||
/mob/living/carbon/human/proc/is_loyalty_implanted(mob/living/carbon/human/M)
|
/mob/living/carbon/human/proc/is_loyalty_implanted(mob/living/carbon/human/M)
|
||||||
for(var/L in M.contents)
|
for(var/L in M.contents)
|
||||||
if(istype(L, /obj/item/weapon/implant/loyalty))
|
if(istype(L, /obj/item/weapon/implant/loyalty))
|
||||||
for(var/datum/organ/external/O in M.organs)
|
for(var/obj/item/organ/external/O in M.organs)
|
||||||
if(L in O.implants)
|
if(L in O.implants)
|
||||||
return 1
|
return 1
|
||||||
return 0
|
return 0
|
||||||
@@ -326,7 +326,7 @@
|
|||||||
|
|
||||||
//Returns "Unknown" if facially disfigured and real_name if not. Useful for setting name when polyacided or when updating a human's name variable
|
//Returns "Unknown" if facially disfigured and real_name if not. Useful for setting name when polyacided or when updating a human's name variable
|
||||||
/mob/living/carbon/human/proc/get_face_name()
|
/mob/living/carbon/human/proc/get_face_name()
|
||||||
var/datum/organ/external/head/head = get_organ("head")
|
var/obj/item/organ/external/head/head = get_organ("head")
|
||||||
if( !head || head.disfigured || (head.status & ORGAN_DESTROYED) || !real_name || (HUSK in mutations) ) //disfigured. use id-name if possible
|
if( !head || head.disfigured || (head.status & ORGAN_DESTROYED) || !real_name || (HUSK in mutations) ) //disfigured. use id-name if possible
|
||||||
return "Unknown"
|
return "Unknown"
|
||||||
return real_name
|
return real_name
|
||||||
@@ -357,7 +357,7 @@
|
|||||||
if (!def_zone)
|
if (!def_zone)
|
||||||
def_zone = pick("l_hand", "r_hand")
|
def_zone = pick("l_hand", "r_hand")
|
||||||
|
|
||||||
var/datum/organ/external/affected_organ = get_organ(check_zone(def_zone))
|
var/obj/item/organ/external/affected_organ = get_organ(check_zone(def_zone))
|
||||||
var/siemens_coeff = base_siemens_coeff * get_siemens_coefficient_organ(affected_organ)
|
var/siemens_coeff = base_siemens_coeff * get_siemens_coefficient_organ(affected_organ)
|
||||||
|
|
||||||
return ..(shock_damage, source, siemens_coeff, def_zone)
|
return ..(shock_damage, source, siemens_coeff, def_zone)
|
||||||
@@ -677,7 +677,7 @@
|
|||||||
return 2
|
return 2
|
||||||
|
|
||||||
if(internal_organs_by_name["eyes"]) // Eyes are fucked, not a 'weak point'.
|
if(internal_organs_by_name["eyes"]) // Eyes are fucked, not a 'weak point'.
|
||||||
var/datum/organ/internal/I = internal_organs_by_name["eyes"]
|
var/obj/item/organ/I = internal_organs_by_name["eyes"]
|
||||||
if(I.status & ORGAN_CUT_AWAY)
|
if(I.status & ORGAN_CUT_AWAY)
|
||||||
return 2
|
return 2
|
||||||
else
|
else
|
||||||
@@ -795,6 +795,7 @@
|
|||||||
r_eyes = hex2num(copytext(new_eyes, 2, 4))
|
r_eyes = hex2num(copytext(new_eyes, 2, 4))
|
||||||
g_eyes = hex2num(copytext(new_eyes, 4, 6))
|
g_eyes = hex2num(copytext(new_eyes, 4, 6))
|
||||||
b_eyes = hex2num(copytext(new_eyes, 6, 8))
|
b_eyes = hex2num(copytext(new_eyes, 6, 8))
|
||||||
|
update_eyes()
|
||||||
|
|
||||||
var/new_tone = input("Please select skin tone level: 1-220 (1=albino, 35=caucasian, 150=black, 220='very' black)", "Character Generation", "[35-s_tone]") as text
|
var/new_tone = input("Please select skin tone level: 1-220 (1=albino, 35=caucasian, 150=black, 220='very' black)", "Character Generation", "[35-s_tone]") as text
|
||||||
|
|
||||||
@@ -922,19 +923,16 @@
|
|||||||
germ_level += n
|
germ_level += n
|
||||||
|
|
||||||
/mob/living/carbon/human/revive()
|
/mob/living/carbon/human/revive()
|
||||||
for (var/datum/organ/external/O in organs)
|
for (var/obj/item/organ/external/O in organs)
|
||||||
O.status &= ~ORGAN_BROKEN
|
O.status &= ~ORGAN_BROKEN
|
||||||
O.status &= ~ORGAN_BLEEDING
|
O.status &= ~ORGAN_BLEEDING
|
||||||
O.status &= ~ORGAN_SPLINTED
|
O.status &= ~ORGAN_SPLINTED
|
||||||
O.status &= ~ORGAN_CUT_AWAY
|
O.status &= ~ORGAN_CUT_AWAY
|
||||||
O.status &= ~ORGAN_ATTACHABLE
|
O.status &= ~ORGAN_ATTACHABLE
|
||||||
if (!O.amputated)
|
|
||||||
O.status &= ~ORGAN_DESTROYED
|
|
||||||
O.destspawn = 0
|
|
||||||
O.wounds.Cut()
|
O.wounds.Cut()
|
||||||
O.heal_damage(1000,1000,1,1)
|
O.heal_damage(1000,1000,1,1)
|
||||||
|
|
||||||
var/datum/organ/external/head/h = organs_by_name["head"]
|
var/obj/item/organ/external/head/h = organs_by_name["head"]
|
||||||
h.disfigured = 0
|
h.disfigured = 0
|
||||||
|
|
||||||
if(species && !(species.flags & NO_BLOOD))
|
if(species && !(species.flags & NO_BLOOD))
|
||||||
@@ -953,7 +951,7 @@
|
|||||||
H.brainmob.mind.transfer_to(src)
|
H.brainmob.mind.transfer_to(src)
|
||||||
del(H)
|
del(H)
|
||||||
|
|
||||||
for(var/datum/organ/internal/I in internal_organs)
|
for(var/obj/item/organ/I in internal_organs)
|
||||||
I.damage = 0
|
I.damage = 0
|
||||||
|
|
||||||
for (var/datum/disease/virus in viruses)
|
for (var/datum/disease/virus in viruses)
|
||||||
@@ -968,11 +966,11 @@
|
|||||||
..()
|
..()
|
||||||
|
|
||||||
/mob/living/carbon/human/proc/is_lung_ruptured()
|
/mob/living/carbon/human/proc/is_lung_ruptured()
|
||||||
var/datum/organ/internal/lungs/L = internal_organs_by_name["lungs"]
|
var/obj/item/organ/lungs/L = internal_organs_by_name["lungs"]
|
||||||
return L && L.is_bruised()
|
return L && L.is_bruised()
|
||||||
|
|
||||||
/mob/living/carbon/human/proc/rupture_lung()
|
/mob/living/carbon/human/proc/rupture_lung()
|
||||||
var/datum/organ/internal/lungs/L = internal_organs_by_name["lungs"]
|
var/obj/item/organ/lungs/L = internal_organs_by_name["lungs"]
|
||||||
|
|
||||||
if(L && !L.is_bruised())
|
if(L && !L.is_bruised())
|
||||||
src.custom_pain("You feel a stabbing pain in your chest!", 1)
|
src.custom_pain("You feel a stabbing pain in your chest!", 1)
|
||||||
@@ -1033,7 +1031,7 @@
|
|||||||
/mob/living/carbon/human/get_visible_implants(var/class = 0)
|
/mob/living/carbon/human/get_visible_implants(var/class = 0)
|
||||||
|
|
||||||
var/list/visible_implants = list()
|
var/list/visible_implants = list()
|
||||||
for(var/datum/organ/external/organ in src.organs)
|
for(var/obj/item/organ/external/organ in src.organs)
|
||||||
for(var/obj/item/weapon/O in organ.implants)
|
for(var/obj/item/weapon/O in organ.implants)
|
||||||
if(!istype(O,/obj/item/weapon/implant) && (O.w_class > class) && !istype(O,/obj/item/weapon/shard/shrapnel))
|
if(!istype(O,/obj/item/weapon/implant) && (O.w_class > class) && !istype(O,/obj/item/weapon/shard/shrapnel))
|
||||||
visible_implants += O
|
visible_implants += O
|
||||||
@@ -1042,7 +1040,7 @@
|
|||||||
|
|
||||||
/mob/living/carbon/human/proc/handle_embedded_objects()
|
/mob/living/carbon/human/proc/handle_embedded_objects()
|
||||||
|
|
||||||
for(var/datum/organ/external/organ in src.organs)
|
for(var/obj/item/organ/external/organ in src.organs)
|
||||||
if(organ.status & ORGAN_SPLINTED) //Splints prevent movement.
|
if(organ.status & ORGAN_SPLINTED) //Splints prevent movement.
|
||||||
continue
|
continue
|
||||||
for(var/obj/item/weapon/O in organ.implants)
|
for(var/obj/item/weapon/O in organ.implants)
|
||||||
@@ -1051,11 +1049,11 @@
|
|||||||
var/msg = null
|
var/msg = null
|
||||||
switch(rand(1,3))
|
switch(rand(1,3))
|
||||||
if(1)
|
if(1)
|
||||||
msg ="<span class='warning'>A spike of pain jolts your [organ.display_name] as you bump [O] inside.</span>"
|
msg ="<span class='warning'>A spike of pain jolts your [organ.name] as you bump [O] inside.</span>"
|
||||||
if(2)
|
if(2)
|
||||||
msg ="<span class='warning'>Your movement jostles [O] in your [organ.display_name] painfully.</span>"
|
msg ="<span class='warning'>Your movement jostles [O] in your [organ.name] painfully.</span>"
|
||||||
if(3)
|
if(3)
|
||||||
msg ="<span class='warning'>[O] in your [organ.display_name] twists painfully as you move.</span>"
|
msg ="<span class='warning'>[O] in your [organ.name] twists painfully as you move.</span>"
|
||||||
src << msg
|
src << msg
|
||||||
|
|
||||||
organ.take_damage(rand(1,3), 0, 0)
|
organ.take_damage(rand(1,3), 0, 0)
|
||||||
@@ -1292,14 +1290,14 @@
|
|||||||
|
|
||||||
/mob/living/carbon/human/has_brain()
|
/mob/living/carbon/human/has_brain()
|
||||||
if(internal_organs_by_name["brain"])
|
if(internal_organs_by_name["brain"])
|
||||||
var/datum/organ/internal/brain = internal_organs_by_name["brain"]
|
var/obj/item/organ/brain = internal_organs_by_name["brain"]
|
||||||
if(brain && istype(brain))
|
if(brain && istype(brain))
|
||||||
return 1
|
return 1
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
/mob/living/carbon/human/has_eyes()
|
/mob/living/carbon/human/has_eyes()
|
||||||
if(internal_organs_by_name["eyes"])
|
if(internal_organs_by_name["eyes"])
|
||||||
var/datum/organ/internal/eyes = internal_organs_by_name["eyes"]
|
var/obj/item/organ/eyes = internal_organs_by_name["eyes"]
|
||||||
if(eyes && istype(eyes) && !eyes.status & ORGAN_CUT_AWAY)
|
if(eyes && istype(eyes) && !eyes.status & ORGAN_CUT_AWAY)
|
||||||
return 1
|
return 1
|
||||||
return 0
|
return 0
|
||||||
@@ -1308,3 +1306,58 @@
|
|||||||
if((species.flags & NO_SLIP) || (shoes && (shoes.flags & NOSLIP)))
|
if((species.flags & NO_SLIP) || (shoes && (shoes.flags & NOSLIP)))
|
||||||
return 0
|
return 0
|
||||||
..(slipped_on,stun_duration)
|
..(slipped_on,stun_duration)
|
||||||
|
|
||||||
|
/mob/living/carbon/human/proc/undislocate()
|
||||||
|
set category = "Object"
|
||||||
|
set name = "Undislocate Joint"
|
||||||
|
set desc = "Pop a joint back into place. Extremely painful."
|
||||||
|
set src in view(1)
|
||||||
|
|
||||||
|
if(!isliving(usr) || usr.next_move > world.time)
|
||||||
|
return
|
||||||
|
usr.next_move = world.time + 20
|
||||||
|
|
||||||
|
if(usr.stat > 0)
|
||||||
|
usr << "You are unconcious and cannot do that!"
|
||||||
|
return
|
||||||
|
|
||||||
|
if(usr.restrained())
|
||||||
|
usr << "You are restrained and cannot do that!"
|
||||||
|
return
|
||||||
|
|
||||||
|
var/mob/S = src
|
||||||
|
var/mob/U = usr
|
||||||
|
var/self = null
|
||||||
|
|
||||||
|
if(S == U)
|
||||||
|
self = 1 // Removing object from yourself.
|
||||||
|
|
||||||
|
var/list/limbs = list()
|
||||||
|
for(var/limb in organs_by_name)
|
||||||
|
var/obj/item/organ/external/current_limb = organs_by_name[limb]
|
||||||
|
if(current_limb && current_limb.dislocated == 2)
|
||||||
|
limbs |= limb
|
||||||
|
|
||||||
|
var/choice = input(src,"Which joint do you wish to relocate?") as null|anything in limbs
|
||||||
|
|
||||||
|
if(!choice)
|
||||||
|
return
|
||||||
|
|
||||||
|
var/obj/item/organ/external/current_limb = organs_by_name[choice]
|
||||||
|
|
||||||
|
if(self)
|
||||||
|
src << "<span class='warning'>You brace yourself to relocate your [current_limb.joint]...</span>"
|
||||||
|
else
|
||||||
|
U << "<span class='warning'>You begin to relocate [S]'s [current_limb.joint]...</span>"
|
||||||
|
|
||||||
|
if(!do_after(U, 30))
|
||||||
|
return
|
||||||
|
if(!choice || !current_limb || !S || !U)
|
||||||
|
return
|
||||||
|
|
||||||
|
if(self)
|
||||||
|
src << "<span class='danger'>You pop your [current_limb.joint] back in!</span>"
|
||||||
|
else
|
||||||
|
U << "<span class='danger'>You pop [S]'s [current_limb.joint] back in!</span>"
|
||||||
|
S << "<span class='danger'>[U] pops your [current_limb.joint] back in!</span>"
|
||||||
|
current_limb.undislocate()
|
||||||
|
|||||||
@@ -2,11 +2,11 @@
|
|||||||
|
|
||||||
var/mob/living/carbon/human/H = M
|
var/mob/living/carbon/human/H = M
|
||||||
if(istype(H))
|
if(istype(H))
|
||||||
var/datum/organ/external/temp = H.organs_by_name["r_hand"]
|
var/obj/item/organ/external/temp = H.organs_by_name["r_hand"]
|
||||||
if(H.hand)
|
if(H.hand)
|
||||||
temp = H.organs_by_name["l_hand"]
|
temp = H.organs_by_name["l_hand"]
|
||||||
if(temp && !temp.is_usable())
|
if(!temp || !temp.is_usable())
|
||||||
H << "\red You can't use your [temp.display_name]."
|
H << "\red You can't use your hand."
|
||||||
return
|
return
|
||||||
|
|
||||||
..()
|
..()
|
||||||
@@ -24,7 +24,7 @@
|
|||||||
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
|
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
|
||||||
visible_message("\red <B>[H] has attempted to punch [src]!</B>")
|
visible_message("\red <B>[H] has attempted to punch [src]!</B>")
|
||||||
return 0
|
return 0
|
||||||
var/datum/organ/external/affecting = get_organ(ran_zone(H.zone_sel.selecting))
|
var/obj/item/organ/external/affecting = get_organ(ran_zone(H.zone_sel.selecting))
|
||||||
var/armor_block = run_armor_check(affecting, "melee")
|
var/armor_block = run_armor_check(affecting, "melee")
|
||||||
|
|
||||||
if(HULK in H.mutations)
|
if(HULK in H.mutations)
|
||||||
@@ -98,7 +98,11 @@
|
|||||||
var/block = 0
|
var/block = 0
|
||||||
var/accurate = 0
|
var/accurate = 0
|
||||||
var/hit_zone = H.zone_sel.selecting
|
var/hit_zone = H.zone_sel.selecting
|
||||||
var/datum/organ/external/affecting = get_organ(hit_zone)
|
var/obj/item/organ/external/affecting = get_organ(hit_zone)
|
||||||
|
|
||||||
|
if(!affecting || affecting.status & ORGAN_DESTROYED)
|
||||||
|
M << "<span class='danger'>They are missing that limb!</span>"
|
||||||
|
return
|
||||||
|
|
||||||
switch(src.a_intent)
|
switch(src.a_intent)
|
||||||
if(I_HELP)
|
if(I_HELP)
|
||||||
@@ -157,7 +161,7 @@
|
|||||||
miss_type = 1
|
miss_type = 1
|
||||||
|
|
||||||
if(!miss_type && block)
|
if(!miss_type && block)
|
||||||
attack_message = "[H] went for [src]'s [affecting.display_name] but was blocked!"
|
attack_message = "[H] went for [src]'s [affecting.name] but was blocked!"
|
||||||
miss_type = 2
|
miss_type = 2
|
||||||
|
|
||||||
// See what attack they use
|
// See what attack they use
|
||||||
@@ -208,7 +212,7 @@
|
|||||||
|
|
||||||
if(w_uniform)
|
if(w_uniform)
|
||||||
w_uniform.add_fingerprint(M)
|
w_uniform.add_fingerprint(M)
|
||||||
var/datum/organ/external/affecting = get_organ(ran_zone(M.zone_sel.selecting))
|
var/obj/item/organ/external/affecting = get_organ(ran_zone(M.zone_sel.selecting))
|
||||||
|
|
||||||
if(istype(r_hand,/obj/item/weapon/gun) || istype(l_hand,/obj/item/weapon/gun))
|
if(istype(r_hand,/obj/item/weapon/gun) || istype(l_hand,/obj/item/weapon/gun))
|
||||||
var/obj/item/weapon/gun/W = null
|
var/obj/item/weapon/gun/W = null
|
||||||
@@ -291,8 +295,23 @@
|
|||||||
src.visible_message("<span class='danger'>[user] has [attack_message] [src]!</span>")
|
src.visible_message("<span class='danger'>[user] has [attack_message] [src]!</span>")
|
||||||
|
|
||||||
var/dam_zone = pick("head", "chest", "l_arm", "r_arm", "l_leg", "r_leg", "groin")
|
var/dam_zone = pick("head", "chest", "l_arm", "r_arm", "l_leg", "r_leg", "groin")
|
||||||
var/datum/organ/external/affecting = get_organ(ran_zone(dam_zone))
|
var/obj/item/organ/external/affecting = get_organ(ran_zone(dam_zone))
|
||||||
var/armor_block = run_armor_check(affecting, "melee")
|
var/armor_block = run_armor_check(affecting, "melee")
|
||||||
apply_damage(damage, BRUTE, affecting, armor_block)
|
apply_damage(damage, BRUTE, affecting, armor_block)
|
||||||
updatehealth()
|
updatehealth()
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
|
/mob/living/carbon/human/proc/attack_joint(var/obj/item/W, var/mob/living/user, var/def_zone)
|
||||||
|
var/target_zone = def_zone? check_zone(def_zone) : get_zone_with_miss_chance(user.zone_sel.selecting, src)
|
||||||
|
if(user == src) // Attacking yourself can't miss
|
||||||
|
target_zone = user.zone_sel.selecting
|
||||||
|
if(!target_zone)
|
||||||
|
return null
|
||||||
|
var/obj/item/organ/external/organ = get_organ(check_zone(target_zone))
|
||||||
|
if(!organ || organ.is_dislocated() || organ.dislocated == -1)
|
||||||
|
return null
|
||||||
|
var/dislocation_str
|
||||||
|
if(prob(W.force))
|
||||||
|
dislocation_str = "[src]'s [organ.joint] [pick("gives way","caves in","crumbles","collapses")] with a grisly crunch!"
|
||||||
|
organ.dislocate()
|
||||||
|
return dislocation_str
|
||||||
|
|||||||
@@ -5,11 +5,11 @@
|
|||||||
health = maxHealth
|
health = maxHealth
|
||||||
stat = CONSCIOUS
|
stat = CONSCIOUS
|
||||||
return
|
return
|
||||||
var/total_burn = 0
|
var/total_burn = 0
|
||||||
var/total_brute = 0
|
var/total_brute = 0
|
||||||
for(var/datum/organ/external/O in organs) //hardcoded to streamline things a bit
|
for(var/obj/item/organ/external/O in organs) //hardcoded to streamline things a bit
|
||||||
total_brute += O.brute_dam
|
total_brute += O.brute_dam
|
||||||
total_burn += O.burn_dam
|
total_burn += O.burn_dam
|
||||||
|
|
||||||
var/oxy_l = ((species.flags & NO_BREATHE) ? 0 : getOxyLoss())
|
var/oxy_l = ((species.flags & NO_BREATHE) ? 0 : getOxyLoss())
|
||||||
var/tox_l = ((species.flags & NO_POISON) ? 0 : getToxLoss())
|
var/tox_l = ((species.flags & NO_POISON) ? 0 : getToxLoss())
|
||||||
@@ -27,7 +27,7 @@
|
|||||||
if(status_flags & GODMODE) return 0 //godmode
|
if(status_flags & GODMODE) return 0 //godmode
|
||||||
|
|
||||||
if(species && species.has_organ["brain"])
|
if(species && species.has_organ["brain"])
|
||||||
var/datum/organ/internal/brain/sponge = internal_organs_by_name["brain"]
|
var/obj/item/organ/brain/sponge = internal_organs_by_name["brain"]
|
||||||
if(sponge)
|
if(sponge)
|
||||||
sponge.take_damage(amount)
|
sponge.take_damage(amount)
|
||||||
sponge.damage = min(max(brainloss, 0),(maxHealth*2))
|
sponge.damage = min(max(brainloss, 0),(maxHealth*2))
|
||||||
@@ -42,7 +42,7 @@
|
|||||||
if(status_flags & GODMODE) return 0 //godmode
|
if(status_flags & GODMODE) return 0 //godmode
|
||||||
|
|
||||||
if(species && species.has_organ["brain"])
|
if(species && species.has_organ["brain"])
|
||||||
var/datum/organ/internal/brain/sponge = internal_organs_by_name["brain"]
|
var/obj/item/organ/brain/sponge = internal_organs_by_name["brain"]
|
||||||
if(sponge)
|
if(sponge)
|
||||||
sponge.damage = min(max(amount, 0),(maxHealth*2))
|
sponge.damage = min(max(amount, 0),(maxHealth*2))
|
||||||
brainloss = sponge.damage
|
brainloss = sponge.damage
|
||||||
@@ -56,7 +56,7 @@
|
|||||||
if(status_flags & GODMODE) return 0 //godmode
|
if(status_flags & GODMODE) return 0 //godmode
|
||||||
|
|
||||||
if(species && species.has_organ["brain"])
|
if(species && species.has_organ["brain"])
|
||||||
var/datum/organ/internal/brain/sponge = internal_organs_by_name["brain"]
|
var/obj/item/organ/brain/sponge = internal_organs_by_name["brain"]
|
||||||
if(sponge)
|
if(sponge)
|
||||||
brainloss = min(sponge.damage,maxHealth*2)
|
brainloss = min(sponge.damage,maxHealth*2)
|
||||||
else
|
else
|
||||||
@@ -68,13 +68,13 @@
|
|||||||
//These procs fetch a cumulative total damage from all organs
|
//These procs fetch a cumulative total damage from all organs
|
||||||
/mob/living/carbon/human/getBruteLoss()
|
/mob/living/carbon/human/getBruteLoss()
|
||||||
var/amount = 0
|
var/amount = 0
|
||||||
for(var/datum/organ/external/O in organs)
|
for(var/obj/item/organ/external/O in organs)
|
||||||
amount += O.brute_dam
|
amount += O.brute_dam
|
||||||
return amount
|
return amount
|
||||||
|
|
||||||
/mob/living/carbon/human/getFireLoss()
|
/mob/living/carbon/human/getFireLoss()
|
||||||
var/amount = 0
|
var/amount = 0
|
||||||
for(var/datum/organ/external/O in organs)
|
for(var/obj/item/organ/external/O in organs)
|
||||||
amount += O.burn_dam
|
amount += O.burn_dam
|
||||||
return amount
|
return amount
|
||||||
|
|
||||||
@@ -104,7 +104,7 @@
|
|||||||
amount = amount*species.brute_mod
|
amount = amount*species.brute_mod
|
||||||
|
|
||||||
if (organ_name in organs_by_name)
|
if (organ_name in organs_by_name)
|
||||||
var/datum/organ/external/O = get_organ(organ_name)
|
var/obj/item/organ/external/O = get_organ(organ_name)
|
||||||
|
|
||||||
if(amount > 0)
|
if(amount > 0)
|
||||||
O.take_damage(amount, 0, sharp=is_sharp(damage_source), edge=has_edge(damage_source), used_weapon=damage_source)
|
O.take_damage(amount, 0, sharp=is_sharp(damage_source), edge=has_edge(damage_source), used_weapon=damage_source)
|
||||||
@@ -119,7 +119,7 @@
|
|||||||
amount = amount*species.burn_mod
|
amount = amount*species.burn_mod
|
||||||
|
|
||||||
if (organ_name in organs_by_name)
|
if (organ_name in organs_by_name)
|
||||||
var/datum/organ/external/O = get_organ(organ_name)
|
var/obj/item/organ/external/O = get_organ(organ_name)
|
||||||
|
|
||||||
if(amount > 0)
|
if(amount > 0)
|
||||||
O.take_damage(0, amount, sharp=is_sharp(damage_source), edge=has_edge(damage_source), used_weapon=damage_source)
|
O.take_damage(0, amount, sharp=is_sharp(damage_source), edge=has_edge(damage_source), used_weapon=damage_source)
|
||||||
@@ -163,28 +163,28 @@
|
|||||||
var/mut_prob = min(80, getCloneLoss()+10)
|
var/mut_prob = min(80, getCloneLoss()+10)
|
||||||
if (amount > 0)
|
if (amount > 0)
|
||||||
if (prob(mut_prob))
|
if (prob(mut_prob))
|
||||||
var/list/datum/organ/external/candidates = list()
|
var/list/obj/item/organ/external/candidates = list()
|
||||||
for (var/datum/organ/external/O in organs)
|
for (var/obj/item/organ/external/O in organs)
|
||||||
if(!(O.status & ORGAN_MUTATED))
|
if(!(O.status & ORGAN_MUTATED))
|
||||||
candidates |= O
|
candidates |= O
|
||||||
if (candidates.len)
|
if (candidates.len)
|
||||||
var/datum/organ/external/O = pick(candidates)
|
var/obj/item/organ/external/O = pick(candidates)
|
||||||
O.mutate()
|
O.mutate()
|
||||||
src << "<span class = 'notice'>Something is not right with your [O.display_name]...</span>"
|
src << "<span class = 'notice'>Something is not right with your [O.name]...</span>"
|
||||||
return
|
return
|
||||||
else
|
else
|
||||||
if (prob(heal_prob))
|
if (prob(heal_prob))
|
||||||
for (var/datum/organ/external/O in organs)
|
for (var/obj/item/organ/external/O in organs)
|
||||||
if (O.status & ORGAN_MUTATED)
|
if (O.status & ORGAN_MUTATED)
|
||||||
O.unmutate()
|
O.unmutate()
|
||||||
src << "<span class = 'notice'>Your [O.display_name] is shaped normally again.</span>"
|
src << "<span class = 'notice'>Your [O.name] is shaped normally again.</span>"
|
||||||
return
|
return
|
||||||
|
|
||||||
if (getCloneLoss() < 1)
|
if (getCloneLoss() < 1)
|
||||||
for (var/datum/organ/external/O in organs)
|
for (var/obj/item/organ/external/O in organs)
|
||||||
if (O.status & ORGAN_MUTATED)
|
if (O.status & ORGAN_MUTATED)
|
||||||
O.unmutate()
|
O.unmutate()
|
||||||
src << "<span class = 'notice'>Your [O.display_name] is shaped normally again.</span>"
|
src << "<span class = 'notice'>Your [O.name] is shaped normally again.</span>"
|
||||||
BITSET(hud_updateflag, HEALTH_HUD)
|
BITSET(hud_updateflag, HEALTH_HUD)
|
||||||
|
|
||||||
// Defined here solely to take species flags into account without having to recast at mob/living level.
|
// Defined here solely to take species flags into account without having to recast at mob/living level.
|
||||||
@@ -226,16 +226,16 @@
|
|||||||
|
|
||||||
//Returns a list of damaged organs
|
//Returns a list of damaged organs
|
||||||
/mob/living/carbon/human/proc/get_damaged_organs(var/brute, var/burn)
|
/mob/living/carbon/human/proc/get_damaged_organs(var/brute, var/burn)
|
||||||
var/list/datum/organ/external/parts = list()
|
var/list/obj/item/organ/external/parts = list()
|
||||||
for(var/datum/organ/external/O in organs)
|
for(var/obj/item/organ/external/O in organs)
|
||||||
if((brute && O.brute_dam) || (burn && O.burn_dam))
|
if((brute && O.brute_dam) || (burn && O.burn_dam))
|
||||||
parts += O
|
parts += O
|
||||||
return parts
|
return parts
|
||||||
|
|
||||||
//Returns a list of damageable organs
|
//Returns a list of damageable organs
|
||||||
/mob/living/carbon/human/proc/get_damageable_organs()
|
/mob/living/carbon/human/proc/get_damageable_organs()
|
||||||
var/list/datum/organ/external/parts = list()
|
var/list/obj/item/organ/external/parts = list()
|
||||||
for(var/datum/organ/external/O in organs)
|
for(var/obj/item/organ/external/O in organs)
|
||||||
if(O.brute_dam + O.burn_dam < O.max_damage)
|
if(O.brute_dam + O.burn_dam < O.max_damage)
|
||||||
parts += O
|
parts += O
|
||||||
return parts
|
return parts
|
||||||
@@ -244,9 +244,9 @@
|
|||||||
//It automatically updates damage overlays if necesary
|
//It automatically updates damage overlays if necesary
|
||||||
//It automatically updates health status
|
//It automatically updates health status
|
||||||
/mob/living/carbon/human/heal_organ_damage(var/brute, var/burn)
|
/mob/living/carbon/human/heal_organ_damage(var/brute, var/burn)
|
||||||
var/list/datum/organ/external/parts = get_damaged_organs(brute,burn)
|
var/list/obj/item/organ/external/parts = get_damaged_organs(brute,burn)
|
||||||
if(!parts.len) return
|
if(!parts.len) return
|
||||||
var/datum/organ/external/picked = pick(parts)
|
var/obj/item/organ/external/picked = pick(parts)
|
||||||
if(picked.heal_damage(brute,burn))
|
if(picked.heal_damage(brute,burn))
|
||||||
UpdateDamageIcon()
|
UpdateDamageIcon()
|
||||||
BITSET(hud_updateflag, HEALTH_HUD)
|
BITSET(hud_updateflag, HEALTH_HUD)
|
||||||
@@ -260,9 +260,9 @@ In most cases it makes more sense to use apply_damage() instead! And make sure t
|
|||||||
//It automatically updates damage overlays if necesary
|
//It automatically updates damage overlays if necesary
|
||||||
//It automatically updates health status
|
//It automatically updates health status
|
||||||
/mob/living/carbon/human/take_organ_damage(var/brute, var/burn, var/sharp = 0, var/edge = 0)
|
/mob/living/carbon/human/take_organ_damage(var/brute, var/burn, var/sharp = 0, var/edge = 0)
|
||||||
var/list/datum/organ/external/parts = get_damageable_organs()
|
var/list/obj/item/organ/external/parts = get_damageable_organs()
|
||||||
if(!parts.len) return
|
if(!parts.len) return
|
||||||
var/datum/organ/external/picked = pick(parts)
|
var/obj/item/organ/external/picked = pick(parts)
|
||||||
if(picked.take_damage(brute,burn,sharp,edge))
|
if(picked.take_damage(brute,burn,sharp,edge))
|
||||||
UpdateDamageIcon()
|
UpdateDamageIcon()
|
||||||
BITSET(hud_updateflag, HEALTH_HUD)
|
BITSET(hud_updateflag, HEALTH_HUD)
|
||||||
@@ -272,11 +272,11 @@ In most cases it makes more sense to use apply_damage() instead! And make sure t
|
|||||||
|
|
||||||
//Heal MANY external organs, in random order
|
//Heal MANY external organs, in random order
|
||||||
/mob/living/carbon/human/heal_overall_damage(var/brute, var/burn)
|
/mob/living/carbon/human/heal_overall_damage(var/brute, var/burn)
|
||||||
var/list/datum/organ/external/parts = get_damaged_organs(brute,burn)
|
var/list/obj/item/organ/external/parts = get_damaged_organs(brute,burn)
|
||||||
|
|
||||||
var/update = 0
|
var/update = 0
|
||||||
while(parts.len && (brute>0 || burn>0) )
|
while(parts.len && (brute>0 || burn>0) )
|
||||||
var/datum/organ/external/picked = pick(parts)
|
var/obj/item/organ/external/picked = pick(parts)
|
||||||
|
|
||||||
var/brute_was = picked.brute_dam
|
var/brute_was = picked.brute_dam
|
||||||
var/burn_was = picked.burn_dam
|
var/burn_was = picked.burn_dam
|
||||||
@@ -295,10 +295,10 @@ In most cases it makes more sense to use apply_damage() instead! And make sure t
|
|||||||
// damage MANY external organs, in random order
|
// damage MANY external organs, in random order
|
||||||
/mob/living/carbon/human/take_overall_damage(var/brute, var/burn, var/sharp = 0, var/edge = 0, var/used_weapon = null)
|
/mob/living/carbon/human/take_overall_damage(var/brute, var/burn, var/sharp = 0, var/edge = 0, var/used_weapon = null)
|
||||||
if(status_flags & GODMODE) return //godmode
|
if(status_flags & GODMODE) return //godmode
|
||||||
var/list/datum/organ/external/parts = get_damageable_organs()
|
var/list/obj/item/organ/external/parts = get_damageable_organs()
|
||||||
var/update = 0
|
var/update = 0
|
||||||
while(parts.len && (brute>0 || burn>0) )
|
while(parts.len && (brute>0 || burn>0) )
|
||||||
var/datum/organ/external/picked = pick(parts)
|
var/obj/item/organ/external/picked = pick(parts)
|
||||||
|
|
||||||
var/brute_was = picked.brute_dam
|
var/brute_was = picked.brute_dam
|
||||||
var/burn_was = picked.burn_dam
|
var/burn_was = picked.burn_dam
|
||||||
@@ -328,12 +328,12 @@ This function restores the subjects blood to max.
|
|||||||
This function restores all organs.
|
This function restores all organs.
|
||||||
*/
|
*/
|
||||||
/mob/living/carbon/human/restore_all_organs()
|
/mob/living/carbon/human/restore_all_organs()
|
||||||
for(var/datum/organ/external/current_organ in organs)
|
for(var/obj/item/organ/external/current_organ in organs)
|
||||||
current_organ.rejuvenate()
|
current_organ.rejuvenate()
|
||||||
|
|
||||||
/mob/living/carbon/human/proc/HealDamage(zone, brute, burn)
|
/mob/living/carbon/human/proc/HealDamage(zone, brute, burn)
|
||||||
var/datum/organ/external/E = get_organ(zone)
|
var/obj/item/organ/external/E = get_organ(zone)
|
||||||
if(istype(E, /datum/organ/external))
|
if(istype(E, /obj/item/organ/external))
|
||||||
if (E.heal_damage(brute, burn))
|
if (E.heal_damage(brute, burn))
|
||||||
UpdateDamageIcon()
|
UpdateDamageIcon()
|
||||||
BITSET(hud_updateflag, HEALTH_HUD)
|
BITSET(hud_updateflag, HEALTH_HUD)
|
||||||
@@ -366,7 +366,7 @@ This function restores all organs.
|
|||||||
|
|
||||||
if(blocked >= 2) return 0
|
if(blocked >= 2) return 0
|
||||||
|
|
||||||
var/datum/organ/external/organ = null
|
var/obj/item/organ/external/organ = null
|
||||||
if(isorgan(def_zone))
|
if(isorgan(def_zone))
|
||||||
organ = def_zone
|
organ = def_zone
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -10,7 +10,9 @@ emp_act
|
|||||||
|
|
||||||
/mob/living/carbon/human/bullet_act(var/obj/item/projectile/P, var/def_zone)
|
/mob/living/carbon/human/bullet_act(var/obj/item/projectile/P, var/def_zone)
|
||||||
|
|
||||||
var/datum/organ/external/organ = get_organ(check_zone(def_zone))
|
var/obj/item/organ/external/organ = get_organ(check_zone(def_zone))
|
||||||
|
if(!organ)
|
||||||
|
return
|
||||||
|
|
||||||
//Shields
|
//Shields
|
||||||
if(check_shields(P.damage, "the [P.name]"))
|
if(check_shields(P.damage, "the [P.name]"))
|
||||||
@@ -50,7 +52,7 @@ emp_act
|
|||||||
return (..(P , def_zone))
|
return (..(P , def_zone))
|
||||||
|
|
||||||
/mob/living/carbon/human/stun_effect_act(var/stun_amount, var/agony_amount, var/def_zone)
|
/mob/living/carbon/human/stun_effect_act(var/stun_amount, var/agony_amount, var/def_zone)
|
||||||
var/datum/organ/external/affected = get_organ(check_zone(def_zone))
|
var/obj/item/organ/external/affected = get_organ(check_zone(def_zone))
|
||||||
var/siemens_coeff = get_siemens_coefficient_organ(affected)
|
var/siemens_coeff = get_siemens_coefficient_organ(affected)
|
||||||
stun_amount *= siemens_coeff
|
stun_amount *= siemens_coeff
|
||||||
agony_amount *= siemens_coeff
|
agony_amount *= siemens_coeff
|
||||||
@@ -70,10 +72,10 @@ emp_act
|
|||||||
|
|
||||||
u_equip(c_hand)
|
u_equip(c_hand)
|
||||||
if (affected.status & ORGAN_ROBOT)
|
if (affected.status & ORGAN_ROBOT)
|
||||||
emote("me", 1, "drops what they were holding, their [affected.display_name] malfunctioning!")
|
emote("me", 1, "drops what they were holding, their [affected.name] malfunctioning!")
|
||||||
else
|
else
|
||||||
var/emote_scream = pick("screams in pain and ", "lets out a sharp cry and ", "cries out and ")
|
var/emote_scream = pick("screams in pain and ", "lets out a sharp cry and ", "cries out and ")
|
||||||
emote("me", 1, "[(species && species.flags & NO_PAIN) ? "" : emote_scream ]drops what they were holding in their [affected.display_name]!")
|
emote("me", 1, "[(species && species.flags & NO_PAIN) ? "" : emote_scream ]drops what they were holding in their [affected.name]!")
|
||||||
|
|
||||||
..(stun_amount, agony_amount, def_zone)
|
..(stun_amount, agony_amount, def_zone)
|
||||||
|
|
||||||
@@ -84,21 +86,23 @@ emp_act
|
|||||||
if(def_zone)
|
if(def_zone)
|
||||||
if(isorgan(def_zone))
|
if(isorgan(def_zone))
|
||||||
return getarmor_organ(def_zone, type)
|
return getarmor_organ(def_zone, type)
|
||||||
var/datum/organ/external/affecting = get_organ(def_zone)
|
var/obj/item/organ/external/affecting = get_organ(def_zone)
|
||||||
return getarmor_organ(affecting, type)
|
if(affecting)
|
||||||
|
return getarmor_organ(affecting, type)
|
||||||
//If a specific bodypart is targetted, check how that bodypart is protected and return the value.
|
//If a specific bodypart is targetted, check how that bodypart is protected and return the value.
|
||||||
|
|
||||||
//If you don't specify a bodypart, it checks ALL your bodyparts for protection, and averages out the values
|
//If you don't specify a bodypart, it checks ALL your bodyparts for protection, and averages out the values
|
||||||
for(var/organ_name in organs_by_name)
|
for(var/organ_name in organs_by_name)
|
||||||
if (organ_name in organ_rel_size)
|
if (organ_name in organ_rel_size)
|
||||||
var/datum/organ/external/organ = organs_by_name[organ_name]
|
var/obj/item/organ/external/organ = organs_by_name[organ_name]
|
||||||
var/weight = organ_rel_size[organ_name]
|
if(organ)
|
||||||
armorval += getarmor_organ(organ, type) * weight
|
var/weight = organ_rel_size[organ_name]
|
||||||
total += weight
|
armorval += getarmor_organ(organ, type) * weight
|
||||||
|
total += weight
|
||||||
return (armorval/max(total, 1))
|
return (armorval/max(total, 1))
|
||||||
|
|
||||||
//this proc returns the Siemens coefficient of electrical resistivity for a particular external organ.
|
//this proc returns the Siemens coefficient of electrical resistivity for a particular external organ.
|
||||||
/mob/living/carbon/human/proc/get_siemens_coefficient_organ(var/datum/organ/external/def_zone)
|
/mob/living/carbon/human/proc/get_siemens_coefficient_organ(var/obj/item/organ/external/def_zone)
|
||||||
if (!def_zone)
|
if (!def_zone)
|
||||||
return 1.0
|
return 1.0
|
||||||
|
|
||||||
@@ -112,14 +116,14 @@ emp_act
|
|||||||
return siemens_coefficient
|
return siemens_coefficient
|
||||||
|
|
||||||
//this proc returns the armour value for a particular external organ.
|
//this proc returns the armour value for a particular external organ.
|
||||||
/mob/living/carbon/human/proc/getarmor_organ(var/datum/organ/external/def_zone, var/type)
|
/mob/living/carbon/human/proc/getarmor_organ(var/obj/item/organ/external/def_zone, var/type)
|
||||||
if(!type) return 0
|
if(!type || !def_zone) return 0
|
||||||
var/protection = 0
|
var/protection = 0
|
||||||
var/list/protective_gear = list(head, wear_mask, wear_suit, w_uniform, gloves, shoes)
|
var/list/protective_gear = list(head, wear_mask, wear_suit, w_uniform, gloves, shoes)
|
||||||
for(var/gear in protective_gear)
|
for(var/gear in protective_gear)
|
||||||
if(gear && istype(gear ,/obj/item/clothing))
|
if(gear && istype(gear ,/obj/item/clothing))
|
||||||
var/obj/item/clothing/C = gear
|
var/obj/item/clothing/C = gear
|
||||||
if(C.body_parts_covered & def_zone.body_part)
|
if(istype(C) && C.body_parts_covered & def_zone.body_part)
|
||||||
protection += C.armor[type]
|
protection += C.armor[type]
|
||||||
return protection
|
return protection
|
||||||
|
|
||||||
@@ -167,10 +171,10 @@ emp_act
|
|||||||
for(var/obj/O in src)
|
for(var/obj/O in src)
|
||||||
if(!O) continue
|
if(!O) continue
|
||||||
O.emp_act(severity)
|
O.emp_act(severity)
|
||||||
for(var/datum/organ/external/O in organs)
|
for(var/obj/item/organ/external/O in organs)
|
||||||
if(O.status & ORGAN_DESTROYED) continue
|
if(O.status & ORGAN_DESTROYED) continue
|
||||||
O.emp_act(severity)
|
O.emp_act(severity)
|
||||||
for(var/datum/organ/internal/I in O.internal_organs)
|
for(var/obj/item/organ/I in O.internal_organs)
|
||||||
if(I.robotic == 0) continue
|
if(I.robotic == 0) continue
|
||||||
I.emp_act(severity)
|
I.emp_act(severity)
|
||||||
..()
|
..()
|
||||||
@@ -186,17 +190,19 @@ emp_act
|
|||||||
target_zone = user.zone_sel.selecting
|
target_zone = user.zone_sel.selecting
|
||||||
if(!target_zone)
|
if(!target_zone)
|
||||||
visible_message("\red <B>[user] misses [src] with \the [I]!")
|
visible_message("\red <B>[user] misses [src] with \the [I]!")
|
||||||
return 0
|
return 1
|
||||||
|
|
||||||
var/datum/organ/external/affecting = get_organ(target_zone)
|
var/obj/item/organ/external/affecting = get_organ(target_zone)
|
||||||
if (!affecting)
|
|
||||||
return 0
|
|
||||||
if(affecting.status & ORGAN_DESTROYED)
|
|
||||||
user << "What [affecting.display_name]?"
|
|
||||||
return 0
|
|
||||||
var/hit_area = affecting.display_name
|
|
||||||
|
|
||||||
if((user != src) && check_shields(I.force, "the [I.name]"))
|
if (!affecting || (affecting.status & ORGAN_DESTROYED) || affecting.is_stump())
|
||||||
|
user << "<span class='danger'>They are missing that limb!</span>"
|
||||||
|
return
|
||||||
|
|
||||||
|
var/effective_force = I.force
|
||||||
|
if(user.a_intent == "disarm") effective_force = round(I.force/2)
|
||||||
|
var/hit_area = affecting.name
|
||||||
|
|
||||||
|
if((user != src) && check_shields(effective_force, "the [I.name]"))
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
if(istype(I,/obj/item/weapon/card/emag))
|
if(istype(I,/obj/item/weapon/card/emag))
|
||||||
@@ -204,9 +210,9 @@ emp_act
|
|||||||
user << "\red That limb isn't robotic."
|
user << "\red That limb isn't robotic."
|
||||||
return
|
return
|
||||||
if(affecting.sabotaged)
|
if(affecting.sabotaged)
|
||||||
user << "\red [src]'s [affecting.display_name] is already sabotaged!"
|
user << "\red [src]'s [affecting.name] is already sabotaged!"
|
||||||
else
|
else
|
||||||
user << "\red You sneakily slide [I] into the dataport on [src]'s [affecting.display_name] and short out the safeties."
|
user << "\red You sneakily slide [I] into the dataport on [src]'s [affecting.name] and short out the safeties."
|
||||||
var/obj/item/weapon/card/emag/emag = I
|
var/obj/item/weapon/card/emag/emag = I
|
||||||
emag.uses--
|
emag.uses--
|
||||||
affecting.sabotaged = 1
|
affecting.sabotaged = 1
|
||||||
@@ -224,14 +230,14 @@ emp_act
|
|||||||
weapon_sharp = 0
|
weapon_sharp = 0
|
||||||
weapon_edge = 0
|
weapon_edge = 0
|
||||||
|
|
||||||
if(armor >= 2) return 0
|
if(armor >= 2) return 0
|
||||||
if(!I.force) return 0
|
if(!effective_force) return 0
|
||||||
var/Iforce = I.force //to avoid runtimes on the forcesay checks at the bottom. Some items might delete themselves if you drop them. (stunning yourself, ninja swords)
|
var/Iforce = effective_force //to avoid runtimes on the forcesay checks at the bottom. Some items might delete themselves if you drop them. (stunning yourself, ninja swords)
|
||||||
|
|
||||||
apply_damage(I.force, I.damtype, affecting, armor, sharp=weapon_sharp, edge=weapon_edge, used_weapon=I)
|
apply_damage(effective_force, I.damtype, affecting, armor, sharp=weapon_sharp, edge=weapon_edge, used_weapon=I)
|
||||||
|
|
||||||
var/bloody = 0
|
var/bloody = 0
|
||||||
if(((I.damtype == BRUTE) || (I.damtype == HALLOSS)) && prob(25 + (I.force * 2)))
|
if(((I.damtype == BRUTE) || (I.damtype == HALLOSS)) && prob(25 + (effective_force * 2)))
|
||||||
I.add_blood(src) //Make the weapon bloody, not the person.
|
I.add_blood(src) //Make the weapon bloody, not the person.
|
||||||
// if(user.hand) user.update_inv_l_hand() //updates the attacker's overlay for the (now bloodied) weapon
|
// if(user.hand) user.update_inv_l_hand() //updates the attacker's overlay for the (now bloodied) weapon
|
||||||
// else user.update_inv_r_hand() //removed because weapons don't have on-mob blood overlays
|
// else user.update_inv_r_hand() //removed because weapons don't have on-mob blood overlays
|
||||||
@@ -246,36 +252,37 @@ emp_act
|
|||||||
H.bloody_body(src)
|
H.bloody_body(src)
|
||||||
H.bloody_hands(src)
|
H.bloody_hands(src)
|
||||||
|
|
||||||
switch(hit_area)
|
if(!stat)
|
||||||
if("head")//Harder to score a stun but if you do it lasts a bit longer
|
switch(hit_area)
|
||||||
if(prob(I.force))
|
if("head")//Harder to score a stun but if you do it lasts a bit longer
|
||||||
apply_effect(20, PARALYZE, armor)
|
if(prob(effective_force))
|
||||||
visible_message("\red <B>[src] has been knocked unconscious!</B>")
|
apply_effect(20, PARALYZE, armor)
|
||||||
if(bloody)//Apply blood
|
visible_message("\red <B>[src] has been knocked unconscious!</B>")
|
||||||
if(wear_mask)
|
if(bloody)//Apply blood
|
||||||
wear_mask.add_blood(src)
|
if(wear_mask)
|
||||||
update_inv_wear_mask(0)
|
wear_mask.add_blood(src)
|
||||||
if(head)
|
update_inv_wear_mask(0)
|
||||||
head.add_blood(src)
|
if(head)
|
||||||
update_inv_head(0)
|
head.add_blood(src)
|
||||||
if(glasses && prob(33))
|
update_inv_head(0)
|
||||||
glasses.add_blood(src)
|
if(glasses && prob(33))
|
||||||
update_inv_glasses(0)
|
glasses.add_blood(src)
|
||||||
|
update_inv_glasses(0)
|
||||||
|
|
||||||
if("chest")//Easier to score a stun but lasts less time
|
if("chest")//Easier to score a stun but lasts less time
|
||||||
if(prob((I.force + 10)))
|
if(prob((effective_force + 10)))
|
||||||
apply_effect(6, WEAKEN, armor)
|
apply_effect(6, WEAKEN, armor)
|
||||||
visible_message("\red <B>[src] has been knocked down!</B>")
|
visible_message("\red <B>[src] has been knocked down!</B>")
|
||||||
|
|
||||||
if(bloody)
|
if(bloody)
|
||||||
bloody_body(src)
|
bloody_body(src)
|
||||||
|
|
||||||
if(Iforce > 10 || Iforce >= 5 && prob(33))
|
if(Iforce > 10 || Iforce >= 5 && prob(33))
|
||||||
forcesay(hit_appends) //forcesay checks stat already
|
forcesay(hit_appends) //forcesay checks stat already
|
||||||
|
|
||||||
//Melee weapon embedded object code.
|
//Melee weapon embedded object code.
|
||||||
if (I && I.damtype == BRUTE && !I.anchored && !I.is_robot_module())
|
if (I && I.damtype == BRUTE && !I.anchored && !I.is_robot_module())
|
||||||
var/damage = I.force
|
var/damage = effective_force
|
||||||
if (armor)
|
if (armor)
|
||||||
damage /= armor+1
|
damage /= armor+1
|
||||||
|
|
||||||
@@ -327,8 +334,8 @@ emp_act
|
|||||||
if ((O.thrower != src) && check_shields(throw_damage, "[O]"))
|
if ((O.thrower != src) && check_shields(throw_damage, "[O]"))
|
||||||
return
|
return
|
||||||
|
|
||||||
var/datum/organ/external/affecting = get_organ(zone)
|
var/obj/item/organ/external/affecting = get_organ(zone)
|
||||||
var/hit_area = affecting.display_name
|
var/hit_area = affecting.name
|
||||||
|
|
||||||
src.visible_message("\red [src] has been hit in the [hit_area] by [O].")
|
src.visible_message("\red [src] has been hit in the [hit_area] by [O].")
|
||||||
var/armor = run_armor_check(affecting, "melee", "Your armor has protected your [hit_area].", "Your armor has softened hit to your [hit_area].") //I guess "melee" is the best fit here
|
var/armor = run_armor_check(affecting, "melee", "Your armor has protected your [hit_area].", "Your armor has softened hit to your [hit_area].") //I guess "melee" is the best fit here
|
||||||
@@ -390,7 +397,7 @@ emp_act
|
|||||||
/mob/living/carbon/human/embed(var/obj/O, var/def_zone=null)
|
/mob/living/carbon/human/embed(var/obj/O, var/def_zone=null)
|
||||||
if(!def_zone) ..()
|
if(!def_zone) ..()
|
||||||
|
|
||||||
var/datum/organ/external/affecting = get_organ(def_zone)
|
var/obj/item/organ/external/affecting = get_organ(def_zone)
|
||||||
if(affecting)
|
if(affecting)
|
||||||
affecting.embed(O)
|
affecting.embed(O)
|
||||||
|
|
||||||
|
|||||||
@@ -28,7 +28,7 @@
|
|||||||
|
|
||||||
if(istype(buckled, /obj/structure/bed/chair/wheelchair))
|
if(istype(buckled, /obj/structure/bed/chair/wheelchair))
|
||||||
for(var/organ_name in list("l_hand","r_hand","l_arm","r_arm"))
|
for(var/organ_name in list("l_hand","r_hand","l_arm","r_arm"))
|
||||||
var/datum/organ/external/E = get_organ(organ_name)
|
var/obj/item/organ/external/E = get_organ(organ_name)
|
||||||
if(!E || (E.status & ORGAN_DESTROYED))
|
if(!E || (E.status & ORGAN_DESTROYED))
|
||||||
tally += 4
|
tally += 4
|
||||||
if(E.status & ORGAN_SPLINTED)
|
if(E.status & ORGAN_SPLINTED)
|
||||||
@@ -40,7 +40,7 @@
|
|||||||
tally += shoes.slowdown
|
tally += shoes.slowdown
|
||||||
|
|
||||||
for(var/organ_name in list("l_foot","r_foot","l_leg","r_leg"))
|
for(var/organ_name in list("l_foot","r_foot","l_leg","r_leg"))
|
||||||
var/datum/organ/external/E = get_organ(organ_name)
|
var/obj/item/organ/external/E = get_organ(organ_name)
|
||||||
if(!E || (E.status & ORGAN_DESTROYED))
|
if(!E || (E.status & ORGAN_DESTROYED))
|
||||||
tally += 4
|
tally += 4
|
||||||
if(E.status & ORGAN_SPLINTED)
|
if(E.status & ORGAN_SPLINTED)
|
||||||
|
|||||||
135
code/modules/mob/living/carbon/human/human_organs.dm
Normal file
135
code/modules/mob/living/carbon/human/human_organs.dm
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
/mob/living/carbon/human/proc/update_eyes()
|
||||||
|
if(internal_organs_by_name["eyes"])
|
||||||
|
var/obj/item/organ/eyes/eyes = internal_organs_by_name["eyes"]
|
||||||
|
eyes.eye_colour = list(r_eyes,g_eyes,b_eyes)
|
||||||
|
regenerate_icons()
|
||||||
|
|
||||||
|
/mob/living/carbon/var/list/internal_organs = list()
|
||||||
|
/mob/living/carbon/human/var/list/organs = list()
|
||||||
|
/mob/living/carbon/human/var/list/organs_by_name = list() // map organ names to organs
|
||||||
|
/mob/living/carbon/human/var/list/internal_organs_by_name = list() // so internal organs have less ickiness too
|
||||||
|
|
||||||
|
// Takes care of organ related updates, such as broken and missing limbs
|
||||||
|
/mob/living/carbon/human/proc/handle_organs()
|
||||||
|
|
||||||
|
number_wounds = 0
|
||||||
|
var/force_process = 0
|
||||||
|
var/damage_this_tick = getBruteLoss() + getFireLoss() + getToxLoss()
|
||||||
|
if(damage_this_tick > last_dam)
|
||||||
|
force_process = 1
|
||||||
|
last_dam = damage_this_tick
|
||||||
|
if(force_process)
|
||||||
|
bad_external_organs.Cut()
|
||||||
|
for(var/obj/item/organ/external/Ex in organs)
|
||||||
|
bad_external_organs |= Ex
|
||||||
|
|
||||||
|
//processing internal organs is pretty cheap, do that first.
|
||||||
|
for(var/obj/item/organ/I in internal_organs)
|
||||||
|
I.process()
|
||||||
|
|
||||||
|
handle_stance()
|
||||||
|
handle_grasp()
|
||||||
|
|
||||||
|
if(!force_process && !bad_external_organs.len)
|
||||||
|
return
|
||||||
|
|
||||||
|
for(var/obj/item/organ/external/E in bad_external_organs)
|
||||||
|
if(!E)
|
||||||
|
continue
|
||||||
|
if(!E.need_process())
|
||||||
|
bad_external_organs -= E
|
||||||
|
continue
|
||||||
|
else
|
||||||
|
E.process()
|
||||||
|
number_wounds += E.number_wounds
|
||||||
|
|
||||||
|
if (!lying && world.time - l_move_time < 15)
|
||||||
|
//Moving around with fractured ribs won't do you any good
|
||||||
|
if (E.is_broken() && E.internal_organs && E.internal_organs.len && prob(15))
|
||||||
|
var/obj/item/organ/I = pick(E.internal_organs)
|
||||||
|
custom_pain("You feel broken bones moving in your [E.name]!", 1)
|
||||||
|
I.take_damage(rand(3,5))
|
||||||
|
|
||||||
|
//Moving makes open wounds get infected much faster
|
||||||
|
if (E.wounds.len)
|
||||||
|
for(var/datum/wound/W in E.wounds)
|
||||||
|
if (W.infection_check())
|
||||||
|
W.germ_level += 1
|
||||||
|
|
||||||
|
/mob/living/carbon/human/proc/handle_stance()
|
||||||
|
// Don't need to process any of this if they aren't standing anyways
|
||||||
|
// unless their stance is damaged, and we want to check if they should stay down
|
||||||
|
if (!stance_damage && (lying || resting) && (life_tick % 4) == 0)
|
||||||
|
return
|
||||||
|
|
||||||
|
stance_damage = 0
|
||||||
|
|
||||||
|
// Buckled to a bed/chair. Stance damage is forced to 0 since they're sitting on something solid
|
||||||
|
if (istype(buckled, /obj/structure/bed))
|
||||||
|
return
|
||||||
|
|
||||||
|
for(var/limb_tag in list("l_leg","r_leg","l_foot","r_foot"))
|
||||||
|
var/obj/item/organ/external/E = organs_by_name[limb_tag]
|
||||||
|
if(!E)
|
||||||
|
stance_damage += 2
|
||||||
|
else if (E.status & ORGAN_DESTROYED)
|
||||||
|
stance_damage += 2 // let it fail even if just foot&leg
|
||||||
|
else if (E.is_malfunctioning() || (E.is_broken() && !(E.status & ORGAN_SPLINTED)) || !E.is_usable())
|
||||||
|
stance_damage += 1
|
||||||
|
|
||||||
|
// Canes and crutches help you stand (if the latter is ever added)
|
||||||
|
// One cane mitigates a broken leg+foot, or a missing foot.
|
||||||
|
// Two canes are needed for a lost leg. If you are missing both legs, canes aren't gonna help you.
|
||||||
|
if (l_hand && istype(l_hand, /obj/item/weapon/cane))
|
||||||
|
stance_damage -= 2
|
||||||
|
if (r_hand && istype(r_hand, /obj/item/weapon/cane))
|
||||||
|
stance_damage -= 2
|
||||||
|
|
||||||
|
// standing is poor
|
||||||
|
if(stance_damage >= 4 || (stance_damage >= 2 && prob(5)))
|
||||||
|
if(!(lying || resting))
|
||||||
|
if(species && !(species.flags & NO_PAIN))
|
||||||
|
emote("scream")
|
||||||
|
custom_emote(1, "collapses!")
|
||||||
|
Weaken(5) //can't emote while weakened, apparently.
|
||||||
|
|
||||||
|
/mob/living/carbon/human/proc/handle_grasp()
|
||||||
|
|
||||||
|
if(!l_hand && !r_hand)
|
||||||
|
return
|
||||||
|
|
||||||
|
for (var/obj/item/organ/external/E in organs)
|
||||||
|
if(!E || !E.can_grasp || (E.status & ORGAN_SPLINTED))
|
||||||
|
continue
|
||||||
|
|
||||||
|
if(E.is_broken())
|
||||||
|
if(E.body_part == HAND_LEFT)
|
||||||
|
u_equip(l_hand)
|
||||||
|
else
|
||||||
|
u_equip(r_hand)
|
||||||
|
|
||||||
|
var/emote_scream = pick("screams in pain and ", "lets out a sharp cry and ", "cries out and ")
|
||||||
|
emote("me", 1, "[(species.flags & NO_PAIN) ? "" : emote_scream ]drops what they were holding in their [E.name]!")
|
||||||
|
|
||||||
|
else if(E.is_malfunctioning())
|
||||||
|
|
||||||
|
if(E.body_part == HAND_LEFT)
|
||||||
|
u_equip(l_hand)
|
||||||
|
else
|
||||||
|
u_equip(r_hand)
|
||||||
|
|
||||||
|
emote("me", 1, "drops what they were holding, their [E.name] malfunctioning!")
|
||||||
|
|
||||||
|
var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
|
||||||
|
spark_system.set_up(5, 0, src)
|
||||||
|
spark_system.attach(src)
|
||||||
|
spark_system.start()
|
||||||
|
spawn(10)
|
||||||
|
del(spark_system)
|
||||||
|
|
||||||
|
//Handles chem traces
|
||||||
|
/mob/living/carbon/human/proc/handle_trace_chems()
|
||||||
|
//New are added for reagents to random organs.
|
||||||
|
for(var/datum/reagent/A in reagents.reagent_list)
|
||||||
|
var/obj/item/organ/O = pick(organs)
|
||||||
|
O.trace_chemicals[A.name] = 100
|
||||||
@@ -39,7 +39,7 @@ This saves us from having to call add_fingerprint() any time something is put in
|
|||||||
|
|
||||||
|
|
||||||
/mob/living/carbon/human/proc/has_organ(name)
|
/mob/living/carbon/human/proc/has_organ(name)
|
||||||
var/datum/organ/external/O = organs_by_name[name]
|
var/obj/item/organ/external/O = organs_by_name[name]
|
||||||
|
|
||||||
return (O && !(O.status & ORGAN_DESTROYED) )
|
return (O && !(O.status & ORGAN_DESTROYED) )
|
||||||
|
|
||||||
@@ -407,7 +407,7 @@ This saves us from having to call add_fingerprint() any time something is put in
|
|||||||
if("splints")
|
if("splints")
|
||||||
var/count = 0
|
var/count = 0
|
||||||
for(var/organ in list("l_leg","r_leg","l_arm","r_arm"))
|
for(var/organ in list("l_leg","r_leg","l_arm","r_arm"))
|
||||||
var/datum/organ/external/o = target.organs_by_name[organ]
|
var/obj/item/organ/external/o = target.organs_by_name[organ]
|
||||||
if(o.status & ORGAN_SPLINTED)
|
if(o.status & ORGAN_SPLINTED)
|
||||||
count = 1
|
count = 1
|
||||||
break
|
break
|
||||||
@@ -695,7 +695,7 @@ It can still be worn/put on as normal.
|
|||||||
|
|
||||||
if(can_reach_splints)
|
if(can_reach_splints)
|
||||||
for(var/organ in list("l_leg","r_leg","l_arm","r_arm"))
|
for(var/organ in list("l_leg","r_leg","l_arm","r_arm"))
|
||||||
var/datum/organ/external/o = target.get_organ(organ)
|
var/obj/item/organ/external/o = target.get_organ(organ)
|
||||||
if (o && o.status & ORGAN_SPLINTED)
|
if (o && o.status & ORGAN_SPLINTED)
|
||||||
var/obj/item/W = new /obj/item/stack/medical/splint(amount=1)
|
var/obj/item/W = new /obj/item/stack/medical/splint(amount=1)
|
||||||
o.status &= ~ORGAN_SPLINTED
|
o.status &= ~ORGAN_SPLINTED
|
||||||
|
|||||||
@@ -276,7 +276,7 @@
|
|||||||
radiation = Clamp(radiation,0,100)
|
radiation = Clamp(radiation,0,100)
|
||||||
|
|
||||||
if (radiation)
|
if (radiation)
|
||||||
var/datum/organ/internal/diona/nutrients/rad_organ = locate() in internal_organs
|
var/obj/item/organ/diona/nutrients/rad_organ = locate() in internal_organs
|
||||||
if(rad_organ && !rad_organ.is_broken())
|
if(rad_organ && !rad_organ.is_broken())
|
||||||
var/rads = radiation/25
|
var/rads = radiation/25
|
||||||
radiation -= rads
|
radiation -= rads
|
||||||
@@ -323,7 +323,7 @@
|
|||||||
adjustToxLoss(damage * RADIATION_SPEED_COEFFICIENT)
|
adjustToxLoss(damage * RADIATION_SPEED_COEFFICIENT)
|
||||||
updatehealth()
|
updatehealth()
|
||||||
if(organs.len)
|
if(organs.len)
|
||||||
var/datum/organ/external/O = pick(organs)
|
var/obj/item/organ/external/O = pick(organs)
|
||||||
if(istype(O)) O.add_autopsy_data("Radiation Poisoning", damage)
|
if(istype(O)) O.add_autopsy_data("Radiation Poisoning", damage)
|
||||||
|
|
||||||
/** breathing **/
|
/** breathing **/
|
||||||
@@ -388,7 +388,7 @@
|
|||||||
|
|
||||||
// Lung damage increases the minimum safe pressure.
|
// Lung damage increases the minimum safe pressure.
|
||||||
if(species.has_organ["lungs"])
|
if(species.has_organ["lungs"])
|
||||||
var/datum/organ/internal/lungs/L = internal_organs_by_name["lungs"]
|
var/obj/item/organ/lungs/L = internal_organs_by_name["lungs"]
|
||||||
if(!L)
|
if(!L)
|
||||||
safe_pressure_min = INFINITY //No lungs, how are you breathing?
|
safe_pressure_min = INFINITY //No lungs, how are you breathing?
|
||||||
else if(L.is_broken())
|
else if(L.is_broken())
|
||||||
@@ -871,7 +871,7 @@
|
|||||||
|
|
||||||
if(status_flags & GODMODE) return 0 //godmode
|
if(status_flags & GODMODE) return 0 //godmode
|
||||||
|
|
||||||
var/datum/organ/internal/diona/node/light_organ = locate() in internal_organs
|
var/obj/item/organ/diona/node/light_organ = locate() in internal_organs
|
||||||
if(light_organ && !light_organ.is_broken())
|
if(light_organ && !light_organ.is_broken())
|
||||||
var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing
|
var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing
|
||||||
if(isturf(loc)) //else, there's considered to be no light
|
if(isturf(loc)) //else, there's considered to be no light
|
||||||
@@ -1503,7 +1503,7 @@
|
|||||||
if(pulse == PULSE_NONE || !species.has_organ["heart"])
|
if(pulse == PULSE_NONE || !species.has_organ["heart"])
|
||||||
return
|
return
|
||||||
|
|
||||||
var/datum/organ/internal/heart/H = internal_organs_by_name["heart"]
|
var/obj/item/organ/heart/H = internal_organs_by_name["heart"]
|
||||||
|
|
||||||
if(!H || H.robotic >=2 )
|
if(!H || H.robotic >=2 )
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -42,13 +42,13 @@
|
|||||||
)
|
)
|
||||||
|
|
||||||
has_organ = list(
|
has_organ = list(
|
||||||
"heart" = /datum/organ/internal/heart,
|
"heart" = /obj/item/organ/heart,
|
||||||
"lungs" = /datum/organ/internal/lungs,
|
"lungs" = /obj/item/organ/lungs,
|
||||||
"liver" = /datum/organ/internal/liver,
|
"liver" = /obj/item/organ/liver,
|
||||||
"kidneys" = /datum/organ/internal/kidney,
|
"kidneys" = /obj/item/organ/kidney,
|
||||||
"brain" = /datum/organ/internal/brain,
|
"brain" = /obj/item/organ/brain,
|
||||||
"eyes" = /datum/organ/internal/eyes,
|
"eyes" = /obj/item/organ/eyes,
|
||||||
"stack" = /datum/organ/internal/stack/vox
|
"stack" = /obj/item/organ/stack/vox
|
||||||
)
|
)
|
||||||
|
|
||||||
/datum/species/vox/get_random_name(var/gender)
|
/datum/species/vox/get_random_name(var/gender)
|
||||||
|
|||||||
@@ -50,6 +50,7 @@
|
|||||||
// Death vars.
|
// Death vars.
|
||||||
var/meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/human
|
var/meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/human
|
||||||
var/gibber_type = /obj/effect/gibspawner/human
|
var/gibber_type = /obj/effect/gibspawner/human
|
||||||
|
var/single_gib_type = /obj/effect/decal/cleanable/blood/gibs
|
||||||
var/remains_type = /obj/effect/decal/remains/xeno
|
var/remains_type = /obj/effect/decal/remains/xeno
|
||||||
var/gibbed_anim = "gibbed-h"
|
var/gibbed_anim = "gibbed-h"
|
||||||
var/dusted_anim = "dust-h"
|
var/dusted_anim = "dust-h"
|
||||||
@@ -106,13 +107,27 @@
|
|||||||
var/rarity_value = 1 // Relative rarity/collector value for this species.
|
var/rarity_value = 1 // Relative rarity/collector value for this species.
|
||||||
// Determines the organs that the species spawns with and
|
// Determines the organs that the species spawns with and
|
||||||
var/list/has_organ = list( // which required-organ checks are conducted.
|
var/list/has_organ = list( // which required-organ checks are conducted.
|
||||||
"heart" = /datum/organ/internal/heart,
|
"heart" = /obj/item/organ/heart,
|
||||||
"lungs" = /datum/organ/internal/lungs,
|
"lungs" = /obj/item/organ/lungs,
|
||||||
"liver" = /datum/organ/internal/liver,
|
"liver" = /obj/item/organ/liver,
|
||||||
"kidneys" = /datum/organ/internal/kidney,
|
"kidneys" = /obj/item/organ/kidney,
|
||||||
"brain" = /datum/organ/internal/brain,
|
"brain" = /obj/item/organ/brain,
|
||||||
"appendix" = /datum/organ/internal/appendix,
|
"appendix" = /obj/item/organ/appendix,
|
||||||
"eyes" = /datum/organ/internal/eyes
|
"eyes" = /obj/item/organ/eyes
|
||||||
|
)
|
||||||
|
|
||||||
|
var/list/has_limbs = list(
|
||||||
|
"chest" = list("path" = /obj/item/organ/external/chest),
|
||||||
|
"groin" = list("path" = /obj/item/organ/external/groin),
|
||||||
|
"head" = list("path" = /obj/item/organ/external/head),
|
||||||
|
"l_arm" = list("path" = /obj/item/organ/external/arm),
|
||||||
|
"r_arm" = list("path" = /obj/item/organ/external/arm/right),
|
||||||
|
"l_leg" = list("path" = /obj/item/organ/external/leg),
|
||||||
|
"r_leg" = list("path" = /obj/item/organ/external/leg/right),
|
||||||
|
"l_hand" = list("path" = /obj/item/organ/external/hand),
|
||||||
|
"r_hand" = list("path" = /obj/item/organ/external/hand/right),
|
||||||
|
"l_foot" = list("path" = /obj/item/organ/external/foot),
|
||||||
|
"r_foot" = list("path" = /obj/item/organ/external/foot/right)
|
||||||
)
|
)
|
||||||
|
|
||||||
// Bump vars
|
// Bump vars
|
||||||
@@ -157,7 +172,10 @@
|
|||||||
|
|
||||||
/datum/species/proc/create_organs(var/mob/living/carbon/human/H) //Handles creation of mob organs.
|
/datum/species/proc/create_organs(var/mob/living/carbon/human/H) //Handles creation of mob organs.
|
||||||
|
|
||||||
//Trying to work out why species changes aren't fixing organs properly.
|
for(var/obj/item/organ/organ in H.contents)
|
||||||
|
if((organ in H.organs) || (organ in H.internal_organs))
|
||||||
|
del(organ)
|
||||||
|
|
||||||
if(H.organs) H.organs.Cut()
|
if(H.organs) H.organs.Cut()
|
||||||
if(H.internal_organs) H.internal_organs.Cut()
|
if(H.internal_organs) H.internal_organs.Cut()
|
||||||
if(H.organs_by_name) H.organs_by_name.Cut()
|
if(H.organs_by_name) H.organs_by_name.Cut()
|
||||||
@@ -168,35 +186,28 @@
|
|||||||
H.organs_by_name = list()
|
H.organs_by_name = list()
|
||||||
H.internal_organs_by_name = list()
|
H.internal_organs_by_name = list()
|
||||||
|
|
||||||
//This is a basic humanoid limb setup.
|
for(var/limb_type in has_limbs)
|
||||||
H.organs_by_name["chest"] = new/datum/organ/external/chest()
|
var/list/organ_data = has_limbs[limb_type]
|
||||||
H.organs_by_name["groin"] = new/datum/organ/external/groin(H.organs_by_name["chest"])
|
var/limb_path = organ_data["path"]
|
||||||
H.organs_by_name["head"] = new/datum/organ/external/head(H.organs_by_name["chest"])
|
var/obj/item/organ/O = new limb_path(H)
|
||||||
H.organs_by_name["l_arm"] = new/datum/organ/external/l_arm(H.organs_by_name["chest"])
|
organ_data["descriptor"] = O.name
|
||||||
H.organs_by_name["r_arm"] = new/datum/organ/external/r_arm(H.organs_by_name["chest"])
|
|
||||||
H.organs_by_name["r_leg"] = new/datum/organ/external/r_leg(H.organs_by_name["groin"])
|
|
||||||
H.organs_by_name["l_leg"] = new/datum/organ/external/l_leg(H.organs_by_name["groin"])
|
|
||||||
H.organs_by_name["l_hand"] = new/datum/organ/external/l_hand(H.organs_by_name["l_arm"])
|
|
||||||
H.organs_by_name["r_hand"] = new/datum/organ/external/r_hand(H.organs_by_name["r_arm"])
|
|
||||||
H.organs_by_name["l_foot"] = new/datum/organ/external/l_foot(H.organs_by_name["l_leg"])
|
|
||||||
H.organs_by_name["r_foot"] = new/datum/organ/external/r_foot(H.organs_by_name["r_leg"])
|
|
||||||
|
|
||||||
for(var/organ in has_organ)
|
for(var/organ in has_organ)
|
||||||
var/organ_type = has_organ[organ]
|
var/organ_type = has_organ[organ]
|
||||||
H.internal_organs_by_name[organ] = new organ_type(H)
|
H.internal_organs_by_name[organ] = new organ_type(H,1)
|
||||||
|
|
||||||
for(var/name in H.organs_by_name)
|
for(var/name in H.organs_by_name)
|
||||||
H.organs += H.organs_by_name[name]
|
H.organs |= H.organs_by_name[name]
|
||||||
|
|
||||||
for(var/datum/organ/external/O in H.organs)
|
for(var/obj/item/organ/external/O in H.organs)
|
||||||
O.owner = H
|
O.owner = H
|
||||||
|
|
||||||
if(flags & IS_SYNTHETIC)
|
if(flags & IS_SYNTHETIC)
|
||||||
for(var/datum/organ/external/E in H.organs)
|
for(var/obj/item/organ/external/E in H.organs)
|
||||||
if(E.status & ORGAN_CUT_AWAY || E.status & ORGAN_DESTROYED) continue
|
if(E.status & ORGAN_CUT_AWAY || E.status & ORGAN_DESTROYED) continue
|
||||||
E.status |= ORGAN_ROBOT
|
E.robotize()
|
||||||
for(var/datum/organ/internal/I in H.internal_organs)
|
for(var/obj/item/organ/I in H.internal_organs)
|
||||||
I.mechanize()
|
I.robotize()
|
||||||
|
|
||||||
/datum/species/proc/hug(var/mob/living/carbon/human/H,var/mob/living/target)
|
/datum/species/proc/hug(var/mob/living/carbon/human/H,var/mob/living/target)
|
||||||
|
|
||||||
|
|||||||
@@ -22,13 +22,13 @@
|
|||||||
|
|
||||||
/datum/unarmed_attack/claws/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
|
/datum/unarmed_attack/claws/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
|
||||||
var/skill = user.skills["combat"]
|
var/skill = user.skills["combat"]
|
||||||
var/datum/organ/external/affecting = target.get_organ(zone)
|
var/obj/item/organ/external/affecting = target.get_organ(zone)
|
||||||
|
|
||||||
if(!skill) skill = 1
|
if(!skill) skill = 1
|
||||||
attack_damage = Clamp(attack_damage, 1, 5)
|
attack_damage = Clamp(attack_damage, 1, 5)
|
||||||
|
|
||||||
if(target == user)
|
if(target == user)
|
||||||
user.visible_message("<span class='danger'>[user] [pick(attack_verb)] \himself in the [affecting.display_name]!</span>")
|
user.visible_message("<span class='danger'>[user] [pick(attack_verb)] \himself in the [affecting.name]!</span>")
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
switch(zone)
|
switch(zone)
|
||||||
@@ -47,9 +47,9 @@
|
|||||||
else
|
else
|
||||||
// ----- BODY ----- //
|
// ----- BODY ----- //
|
||||||
switch(attack_damage)
|
switch(attack_damage)
|
||||||
if(1 to 2) user.visible_message("<span class='danger'>[user] scratched [target]'s [affecting.display_name]!</span>")
|
if(1 to 2) user.visible_message("<span class='danger'>[user] scratched [target]'s [affecting.name]!</span>")
|
||||||
if(3 to 4) user.visible_message("<span class='danger'>[user] [pick(attack_verb)] [pick("", "", "the side of")] [target]'s [affecting.display_name]!</span>")
|
if(3 to 4) user.visible_message("<span class='danger'>[user] [pick(attack_verb)] [pick("", "", "the side of")] [target]'s [affecting.name]!</span>")
|
||||||
if(5) user.visible_message("<span class='danger'>[user] tears \his [pick(attack_noun)] [pick("deep into", "into", "across")] [target]'s [affecting.display_name]!</span>")
|
if(5) user.visible_message("<span class='danger'>[user] tears \his [pick(attack_noun)] [pick("deep into", "into", "across")] [target]'s [affecting.name]!</span>")
|
||||||
|
|
||||||
/datum/unarmed_attack/claws/strong
|
/datum/unarmed_attack/claws/strong
|
||||||
attack_verb = list("slashed")
|
attack_verb = list("slashed")
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
flesh_color = "#137E8F"
|
flesh_color = "#137E8F"
|
||||||
|
|
||||||
has_organ = list(
|
has_organ = list(
|
||||||
"brain" = /datum/organ/internal/brain/golem
|
"brain" = /obj/item/organ/brain/golem
|
||||||
)
|
)
|
||||||
|
|
||||||
death_message = "becomes completely motionless..."
|
death_message = "becomes completely motionless..."
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
death_message = "rapidly loses cohesion, splattering across the ground..."
|
death_message = "rapidly loses cohesion, splattering across the ground..."
|
||||||
|
|
||||||
has_organ = list(
|
has_organ = list(
|
||||||
"brain" = /datum/organ/internal/brain/slime
|
"brain" = /obj/item/organ/brain/slime
|
||||||
)
|
)
|
||||||
|
|
||||||
breath_type = null
|
breath_type = null
|
||||||
|
|||||||
@@ -135,6 +135,7 @@
|
|||||||
rarity_value = 3
|
rarity_value = 3
|
||||||
hud_type = /datum/hud_data/diona
|
hud_type = /datum/hud_data/diona
|
||||||
siemens_coefficient = 0.3
|
siemens_coefficient = 0.3
|
||||||
|
eyes = "blank_eyes"
|
||||||
|
|
||||||
blurb = "Commonly referred to (erroneously) as 'plant people', the Dionaea are a strange space-dwelling collective \
|
blurb = "Commonly referred to (erroneously) as 'plant people', the Dionaea are a strange space-dwelling collective \
|
||||||
species hailing from Epsilon Ursae Minoris. Each 'diona' is a cluster of numerous cat-sized organisms called nymphs; \
|
species hailing from Epsilon Ursae Minoris. Each 'diona' is a cluster of numerous cat-sized organisms called nymphs; \
|
||||||
@@ -145,12 +146,26 @@
|
|||||||
water and other radiation."
|
water and other radiation."
|
||||||
|
|
||||||
has_organ = list(
|
has_organ = list(
|
||||||
"nutrient channel" = /datum/organ/internal/diona/nutrients,
|
"nutrient channel" = /obj/item/organ/diona/nutrients,
|
||||||
"neural strata" = /datum/organ/internal/diona/strata,
|
"neural strata" = /obj/item/organ/diona/strata,
|
||||||
"response node" = /datum/organ/internal/diona/node,
|
"response node" = /obj/item/organ/diona/node,
|
||||||
"gas bladder" = /datum/organ/internal/diona/bladder,
|
"gas bladder" = /obj/item/organ/diona/bladder,
|
||||||
"polyp segment" = /datum/organ/internal/diona/polyp,
|
"polyp segment" = /obj/item/organ/diona/polyp,
|
||||||
"anchoring ligament" = /datum/organ/internal/diona/ligament
|
"anchoring ligament" = /obj/item/organ/diona/ligament
|
||||||
|
)
|
||||||
|
|
||||||
|
has_limbs = list(
|
||||||
|
"chest" = list("path" = /obj/item/organ/external/diona/chest),
|
||||||
|
"groin" = list("path" = /obj/item/organ/external/diona/groin),
|
||||||
|
"head" = list("path" = /obj/item/organ/external/diona/head),
|
||||||
|
"l_arm" = list("path" = /obj/item/organ/external/diona/arm),
|
||||||
|
"r_arm" = list("path" = /obj/item/organ/external/diona/arm/right),
|
||||||
|
"l_leg" = list("path" = /obj/item/organ/external/diona/leg),
|
||||||
|
"r_leg" = list("path" = /obj/item/organ/external/diona/leg/right),
|
||||||
|
"l_hand" = list("path" = /obj/item/organ/external/diona/hand),
|
||||||
|
"r_hand" = list("path" = /obj/item/organ/external/diona/hand/right),
|
||||||
|
"l_foot" = list("path" = /obj/item/organ/external/diona/foot),
|
||||||
|
"r_foot" = list("path" = /obj/item/organ/external/diona/foot/right)
|
||||||
)
|
)
|
||||||
|
|
||||||
warning_low_pressure = 50
|
warning_low_pressure = 50
|
||||||
@@ -166,7 +181,7 @@
|
|||||||
|
|
||||||
body_temperature = T0C + 15 //make the plant people have a bit lower body temperature, why not
|
body_temperature = T0C + 15 //make the plant people have a bit lower body temperature, why not
|
||||||
|
|
||||||
flags = CAN_JOIN | IS_WHITELISTED | NO_BREATHE | NO_SCAN | IS_PLANT | NO_BLOOD | NO_PAIN | NO_SLIP | HAS_EYE_COLOR
|
flags = CAN_JOIN | IS_WHITELISTED | NO_BREATHE | NO_SCAN | IS_PLANT | NO_BLOOD | NO_PAIN | NO_SLIP | REGENERATES_LIMBS
|
||||||
|
|
||||||
blood_color = "#004400"
|
blood_color = "#004400"
|
||||||
flesh_color = "#907E4A"
|
flesh_color = "#907E4A"
|
||||||
|
|||||||
@@ -108,7 +108,7 @@ Des: Removes all infection images from aliens and places an infection image on a
|
|||||||
|
|
||||||
for(var/mob/living/carbon/alien in player_list)
|
for(var/mob/living/carbon/alien in player_list)
|
||||||
|
|
||||||
if(!locate(/datum/organ/internal/xenos/hivenode) in alien.internal_organs)
|
if(!locate(/obj/item/organ/xenos/hivenode) in alien.internal_organs)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if(alien.client)
|
if(alien.client)
|
||||||
@@ -130,7 +130,7 @@ Des: Checks if the passed mob (C) is infected with the alien egg, then gives eac
|
|||||||
|
|
||||||
for(var/mob/living/carbon/alien in player_list)
|
for(var/mob/living/carbon/alien in player_list)
|
||||||
|
|
||||||
if(!locate(/datum/organ/internal/xenos/hivenode) in alien.internal_organs)
|
if(!locate(/obj/item/organ/xenos/hivenode) in alien.internal_organs)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if(alien.client)
|
if(alien.client)
|
||||||
@@ -149,7 +149,7 @@ Des: Removes the alien infection image from all aliens in the world located in p
|
|||||||
|
|
||||||
for(var/mob/living/carbon/alien in player_list)
|
for(var/mob/living/carbon/alien in player_list)
|
||||||
|
|
||||||
if(!locate(/datum/organ/internal/xenos/hivenode) in alien.internal_organs)
|
if(!locate(/obj/item/organ/xenos/hivenode) in alien.internal_organs)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if(alien.client)
|
if(alien.client)
|
||||||
|
|||||||
@@ -108,7 +108,7 @@ var/const/MAX_ACTIVE_TIME = 400
|
|||||||
return
|
return
|
||||||
|
|
||||||
var/mob/living/carbon/C = M
|
var/mob/living/carbon/C = M
|
||||||
if(istype(C) && locate(/datum/organ/internal/xenos/hivenode) in C.internal_organs)
|
if(istype(C) && locate(/obj/item/organ/xenos/hivenode) in C.internal_organs)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
@@ -228,7 +228,7 @@ var/const/MAX_ACTIVE_TIME = 400
|
|||||||
return 0
|
return 0
|
||||||
|
|
||||||
var/mob/living/carbon/C = M
|
var/mob/living/carbon/C = M
|
||||||
if(istype(C) && locate(/datum/organ/internal/xenos/hivenode) in C.internal_organs)
|
if(istype(C) && locate(/obj/item/organ/xenos/hivenode) in C.internal_organs)
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
if(ishuman(C))
|
if(ishuman(C))
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
|
|
||||||
/mob/living/carbon/human/proc/gain_plasma(var/amount)
|
/mob/living/carbon/human/proc/gain_plasma(var/amount)
|
||||||
|
|
||||||
var/datum/organ/internal/xenos/plasmavessel/I = internal_organs_by_name["plasma vessel"]
|
var/obj/item/organ/xenos/plasmavessel/I = internal_organs_by_name["plasma vessel"]
|
||||||
if(!istype(I)) return
|
if(!istype(I)) return
|
||||||
|
|
||||||
if(amount)
|
if(amount)
|
||||||
@@ -20,13 +20,13 @@
|
|||||||
|
|
||||||
/mob/living/carbon/human/proc/check_alien_ability(var/cost,var/needs_foundation,var/needs_organ)
|
/mob/living/carbon/human/proc/check_alien_ability(var/cost,var/needs_foundation,var/needs_organ)
|
||||||
|
|
||||||
var/datum/organ/internal/xenos/plasmavessel/P = internal_organs_by_name["plasma vessel"]
|
var/obj/item/organ/xenos/plasmavessel/P = internal_organs_by_name["plasma vessel"]
|
||||||
if(!istype(P))
|
if(!istype(P))
|
||||||
src << "<span class='danger'>Your plasma vessel has been removed!</span>"
|
src << "<span class='danger'>Your plasma vessel has been removed!</span>"
|
||||||
return
|
return
|
||||||
|
|
||||||
if(needs_organ)
|
if(needs_organ)
|
||||||
var/datum/organ/internal/I = internal_organs_by_name[needs_organ]
|
var/obj/item/organ/I = internal_organs_by_name[needs_organ]
|
||||||
if(!I)
|
if(!I)
|
||||||
src << "<span class='danger'>Your [needs_organ] has been removed!</span>"
|
src << "<span class='danger'>Your [needs_organ] has been removed!</span>"
|
||||||
return
|
return
|
||||||
@@ -62,7 +62,7 @@
|
|||||||
src << "<span class='alium'>You need to be closer.</span>"
|
src << "<span class='alium'>You need to be closer.</span>"
|
||||||
return
|
return
|
||||||
|
|
||||||
var/datum/organ/internal/xenos/plasmavessel/I = M.internal_organs_by_name["plasma vessel"]
|
var/obj/item/organ/xenos/plasmavessel/I = M.internal_organs_by_name["plasma vessel"]
|
||||||
if(!istype(I))
|
if(!istype(I))
|
||||||
src << "<span class='alium'>Their plasma vessel is missing.</span>"
|
src << "<span class='alium'>Their plasma vessel is missing.</span>"
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -45,11 +45,11 @@
|
|||||||
vision_flags = SEE_MOBS
|
vision_flags = SEE_MOBS
|
||||||
|
|
||||||
has_organ = list(
|
has_organ = list(
|
||||||
"heart" = /datum/organ/internal/heart,
|
"heart" = /obj/item/organ/heart,
|
||||||
"brain" = /datum/organ/internal/brain/xeno,
|
"brain" = /obj/item/organ/brain/xeno,
|
||||||
"plasma vessel" = /datum/organ/internal/xenos/plasmavessel,
|
"plasma vessel" = /obj/item/organ/xenos/plasmavessel,
|
||||||
"hive node" = /datum/organ/internal/xenos/hivenode,
|
"hive node" = /obj/item/organ/xenos/hivenode,
|
||||||
"nutrient vessel" = /datum/organ/internal/diona/nutrients
|
"nutrient vessel" = /obj/item/organ/diona/nutrients
|
||||||
)
|
)
|
||||||
|
|
||||||
bump_flag = ALIEN
|
bump_flag = ALIEN
|
||||||
@@ -93,7 +93,7 @@
|
|||||||
|
|
||||||
if(environment.gas["phoron"] > 0 || locate(/obj/effect/alien/weeds) in T)
|
if(environment.gas["phoron"] > 0 || locate(/obj/effect/alien/weeds) in T)
|
||||||
if(!regenerate(H))
|
if(!regenerate(H))
|
||||||
var/datum/organ/internal/xenos/plasmavessel/P = H.internal_organs_by_name["plasma vessel"]
|
var/obj/item/organ/xenos/plasmavessel/P = H.internal_organs_by_name["plasma vessel"]
|
||||||
P.stored_plasma += weeds_plasma_rate
|
P.stored_plasma += weeds_plasma_rate
|
||||||
P.stored_plasma = min(max(P.stored_plasma,0),P.max_plasma)
|
P.stored_plasma = min(max(P.stored_plasma,0),P.max_plasma)
|
||||||
..()
|
..()
|
||||||
@@ -116,7 +116,7 @@
|
|||||||
return 1
|
return 1
|
||||||
|
|
||||||
//next internal organs
|
//next internal organs
|
||||||
for(var/datum/organ/internal/I in H.internal_organs)
|
for(var/obj/item/organ/I in H.internal_organs)
|
||||||
if(I.damage > 0)
|
if(I.damage > 0)
|
||||||
I.damage = max(I.damage - heal_rate, 0)
|
I.damage = max(I.damage - heal_rate, 0)
|
||||||
if (prob(5))
|
if (prob(5))
|
||||||
@@ -124,11 +124,11 @@
|
|||||||
return 1
|
return 1
|
||||||
|
|
||||||
//next mend broken bones, approx 10 ticks each
|
//next mend broken bones, approx 10 ticks each
|
||||||
for(var/datum/organ/external/E in H.bad_external_organs)
|
for(var/obj/item/organ/external/E in H.bad_external_organs)
|
||||||
if (E.status & ORGAN_BROKEN)
|
if (E.status & ORGAN_BROKEN)
|
||||||
if (prob(mend_prob))
|
if (prob(mend_prob))
|
||||||
if (E.mend_fracture())
|
if (E.mend_fracture())
|
||||||
H << "<span class='alium'>You feel something mend itself inside your [E.display_name].</span>"
|
H << "<span class='alium'>You feel something mend itself inside your [E.name].</span>"
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
@@ -153,13 +153,13 @@
|
|||||||
deform = 'icons/mob/human_races/xenos/r_xenos_drone.dmi'
|
deform = 'icons/mob/human_races/xenos/r_xenos_drone.dmi'
|
||||||
|
|
||||||
has_organ = list(
|
has_organ = list(
|
||||||
"heart" = /datum/organ/internal/heart,
|
"heart" = /obj/item/organ/heart,
|
||||||
"brain" = /datum/organ/internal/brain/xeno,
|
"brain" = /obj/item/organ/brain/xeno,
|
||||||
"plasma vessel" = /datum/organ/internal/xenos/plasmavessel/queen,
|
"plasma vessel" = /obj/item/organ/xenos/plasmavessel/queen,
|
||||||
"acid gland" = /datum/organ/internal/xenos/acidgland,
|
"acid gland" = /obj/item/organ/xenos/acidgland,
|
||||||
"hive node" = /datum/organ/internal/xenos/hivenode,
|
"hive node" = /obj/item/organ/xenos/hivenode,
|
||||||
"resin spinner" = /datum/organ/internal/xenos/resinspinner,
|
"resin spinner" = /obj/item/organ/xenos/resinspinner,
|
||||||
"nutrient vessel" = /datum/organ/internal/diona/nutrients
|
"nutrient vessel" = /obj/item/organ/diona/nutrients
|
||||||
)
|
)
|
||||||
|
|
||||||
inherent_verbs = list(
|
inherent_verbs = list(
|
||||||
@@ -192,11 +192,11 @@
|
|||||||
deform = 'icons/mob/human_races/xenos/r_xenos_hunter.dmi'
|
deform = 'icons/mob/human_races/xenos/r_xenos_hunter.dmi'
|
||||||
|
|
||||||
has_organ = list(
|
has_organ = list(
|
||||||
"heart" = /datum/organ/internal/heart,
|
"heart" = /obj/item/organ/heart,
|
||||||
"brain" = /datum/organ/internal/brain/xeno,
|
"brain" = /obj/item/organ/brain/xeno,
|
||||||
"plasma vessel" = /datum/organ/internal/xenos/plasmavessel/hunter,
|
"plasma vessel" = /obj/item/organ/xenos/plasmavessel/hunter,
|
||||||
"hive node" = /datum/organ/internal/xenos/hivenode,
|
"hive node" = /obj/item/organ/xenos/hivenode,
|
||||||
"nutrient vessel" = /datum/organ/internal/diona/nutrients
|
"nutrient vessel" = /obj/item/organ/diona/nutrients
|
||||||
)
|
)
|
||||||
|
|
||||||
inherent_verbs = list(
|
inherent_verbs = list(
|
||||||
@@ -220,12 +220,12 @@
|
|||||||
deform = 'icons/mob/human_races/xenos/r_xenos_sentinel.dmi'
|
deform = 'icons/mob/human_races/xenos/r_xenos_sentinel.dmi'
|
||||||
|
|
||||||
has_organ = list(
|
has_organ = list(
|
||||||
"heart" = /datum/organ/internal/heart,
|
"heart" = /obj/item/organ/heart,
|
||||||
"brain" = /datum/organ/internal/brain/xeno,
|
"brain" = /obj/item/organ/brain/xeno,
|
||||||
"plasma vessel" = /datum/organ/internal/xenos/plasmavessel/sentinel,
|
"plasma vessel" = /obj/item/organ/xenos/plasmavessel/sentinel,
|
||||||
"acid gland" = /datum/organ/internal/xenos/acidgland,
|
"acid gland" = /obj/item/organ/xenos/acidgland,
|
||||||
"hive node" = /datum/organ/internal/xenos/hivenode,
|
"hive node" = /obj/item/organ/xenos/hivenode,
|
||||||
"nutrient vessel" = /datum/organ/internal/diona/nutrients
|
"nutrient vessel" = /obj/item/organ/diona/nutrients
|
||||||
)
|
)
|
||||||
|
|
||||||
inherent_verbs = list(
|
inherent_verbs = list(
|
||||||
@@ -252,14 +252,14 @@
|
|||||||
deform = 'icons/mob/human_races/xenos/r_xenos_queen.dmi'
|
deform = 'icons/mob/human_races/xenos/r_xenos_queen.dmi'
|
||||||
|
|
||||||
has_organ = list(
|
has_organ = list(
|
||||||
"heart" = /datum/organ/internal/heart,
|
"heart" = /obj/item/organ/heart,
|
||||||
"brain" = /datum/organ/internal/brain/xeno,
|
"brain" = /obj/item/organ/brain/xeno,
|
||||||
"egg sac" = /datum/organ/internal/xenos/eggsac,
|
"egg sac" = /obj/item/organ/xenos/eggsac,
|
||||||
"plasma vessel" = /datum/organ/internal/xenos/plasmavessel/queen,
|
"plasma vessel" = /obj/item/organ/xenos/plasmavessel/queen,
|
||||||
"acid gland" = /datum/organ/internal/xenos/acidgland,
|
"acid gland" = /obj/item/organ/xenos/acidgland,
|
||||||
"hive node" = /datum/organ/internal/xenos/hivenode,
|
"hive node" = /obj/item/organ/xenos/hivenode,
|
||||||
"resin spinner" = /datum/organ/internal/xenos/resinspinner,
|
"resin spinner" = /obj/item/organ/xenos/resinspinner,
|
||||||
"nutrient vessel" = /datum/organ/internal/diona/nutrients
|
"nutrient vessel" = /obj/item/organ/diona/nutrients
|
||||||
)
|
)
|
||||||
|
|
||||||
inherent_verbs = list(
|
inherent_verbs = list(
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
return 0
|
return 0
|
||||||
|
|
||||||
// Check if they have a functioning hand.
|
// Check if they have a functioning hand.
|
||||||
var/datum/organ/external/E = user.organs_by_name["l_hand"]
|
var/obj/item/organ/external/E = user.organs_by_name["l_hand"]
|
||||||
if(E && !(E.status & ORGAN_DESTROYED))
|
if(E && !(E.status & ORGAN_DESTROYED))
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
@@ -74,8 +74,8 @@
|
|||||||
target.apply_effect(3, WEAKEN, armour)
|
target.apply_effect(3, WEAKEN, armour)
|
||||||
|
|
||||||
/datum/unarmed_attack/proc/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
|
/datum/unarmed_attack/proc/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
|
||||||
var/datum/organ/external/affecting = target.get_organ(zone)
|
var/obj/item/organ/external/affecting = target.get_organ(zone)
|
||||||
user.visible_message("<span class='warning'>[user] [pick(attack_verb)] [target] in the [affecting.display_name]!</span>")
|
user.visible_message("<span class='warning'>[user] [pick(attack_verb)] [target] in the [affecting.name]!</span>")
|
||||||
playsound(user.loc, attack_sound, 25, 1, -1)
|
playsound(user.loc, attack_sound, 25, 1, -1)
|
||||||
|
|
||||||
/datum/unarmed_attack/bite
|
/datum/unarmed_attack/bite
|
||||||
@@ -100,8 +100,8 @@
|
|||||||
damage = 0
|
damage = 0
|
||||||
|
|
||||||
/datum/unarmed_attack/punch/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
|
/datum/unarmed_attack/punch/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
|
||||||
var/datum/organ/external/affecting = target.get_organ(zone)
|
var/obj/item/organ/external/affecting = target.get_organ(zone)
|
||||||
var/organ = affecting.display_name
|
var/organ = affecting.name
|
||||||
|
|
||||||
attack_damage = Clamp(attack_damage, 1, 5) // We expect damage input of 1 to 5 for this proc. But we leave this check juuust in case.
|
attack_damage = Clamp(attack_damage, 1, 5) // We expect damage input of 1 to 5 for this proc. But we leave this check juuust in case.
|
||||||
|
|
||||||
@@ -154,7 +154,7 @@
|
|||||||
if(!(zone in list("l_leg", "r_leg", "l_foot", "r_foot", "groin")))
|
if(!(zone in list("l_leg", "r_leg", "l_foot", "r_foot", "groin")))
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
var/datum/organ/external/E = user.organs_by_name["l_foot"]
|
var/obj/item/organ/external/E = user.organs_by_name["l_foot"]
|
||||||
if(E && !(E.status & ORGAN_DESTROYED))
|
if(E && !(E.status & ORGAN_DESTROYED))
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
@@ -171,8 +171,8 @@
|
|||||||
return damage + (shoes ? shoes.force : 0)
|
return damage + (shoes ? shoes.force : 0)
|
||||||
|
|
||||||
/datum/unarmed_attack/kick/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
|
/datum/unarmed_attack/kick/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
|
||||||
var/datum/organ/external/affecting = target.get_organ(zone)
|
var/obj/item/organ/external/affecting = target.get_organ(zone)
|
||||||
var/organ = affecting.display_name
|
var/organ = affecting.name
|
||||||
|
|
||||||
attack_damage = Clamp(attack_damage, 1, 5)
|
attack_damage = Clamp(attack_damage, 1, 5)
|
||||||
|
|
||||||
@@ -198,7 +198,7 @@
|
|||||||
if (!user.lying && (target.lying || (zone in list("l_foot", "r_foot"))))
|
if (!user.lying && (target.lying || (zone in list("l_foot", "r_foot"))))
|
||||||
if(target.grabbed_by == user && target.lying)
|
if(target.grabbed_by == user && target.lying)
|
||||||
return 0
|
return 0
|
||||||
var/datum/organ/external/E = user.organs_by_name["l_foot"]
|
var/obj/item/organ/external/E = user.organs_by_name["l_foot"]
|
||||||
if(E && !(E.status & ORGAN_DESTROYED))
|
if(E && !(E.status & ORGAN_DESTROYED))
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
@@ -213,8 +213,8 @@
|
|||||||
return damage + (shoes ? shoes.force : 0)
|
return damage + (shoes ? shoes.force : 0)
|
||||||
|
|
||||||
/datum/unarmed_attack/stomp/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
|
/datum/unarmed_attack/stomp/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
|
||||||
var/datum/organ/external/affecting = target.get_organ(zone)
|
var/obj/item/organ/external/affecting = target.get_organ(zone)
|
||||||
var/organ = affecting.display_name
|
var/organ = affecting.name
|
||||||
var/obj/item/clothing/shoes = user.shoes
|
var/obj/item/clothing/shoes = user.shoes
|
||||||
|
|
||||||
attack_damage = Clamp(attack_damage, 1, 5)
|
attack_damage = Clamp(attack_damage, 1, 5)
|
||||||
|
|||||||
@@ -182,7 +182,9 @@ var/global/list/damage_icon_parts = list()
|
|||||||
// first check whether something actually changed about damage appearance
|
// first check whether something actually changed about damage appearance
|
||||||
var/damage_appearance = ""
|
var/damage_appearance = ""
|
||||||
|
|
||||||
for(var/datum/organ/external/O in organs)
|
for(var/obj/item/organ/external/O in organs)
|
||||||
|
if(O.is_stump())
|
||||||
|
continue
|
||||||
if(O.status & ORGAN_DESTROYED) damage_appearance += "d"
|
if(O.status & ORGAN_DESTROYED) damage_appearance += "d"
|
||||||
else
|
else
|
||||||
damage_appearance += O.damage_state
|
damage_appearance += O.damage_state
|
||||||
@@ -198,7 +200,9 @@ var/global/list/damage_icon_parts = list()
|
|||||||
var/image/standing_image = new /image("icon" = standing)
|
var/image/standing_image = new /image("icon" = standing)
|
||||||
|
|
||||||
// blend the individual damage states with our icons
|
// blend the individual damage states with our icons
|
||||||
for(var/datum/organ/external/O in organs)
|
for(var/obj/item/organ/external/O in organs)
|
||||||
|
if(O.is_stump())
|
||||||
|
continue
|
||||||
if(!(O.status & ORGAN_DESTROYED))
|
if(!(O.status & ORGAN_DESTROYED))
|
||||||
O.update_icon()
|
O.update_icon()
|
||||||
if(O.damage_state == "00") continue
|
if(O.damage_state == "00") continue
|
||||||
@@ -223,7 +227,6 @@ var/global/list/damage_icon_parts = list()
|
|||||||
|
|
||||||
var/husk_color_mod = rgb(96,88,80)
|
var/husk_color_mod = rgb(96,88,80)
|
||||||
var/hulk_color_mod = rgb(48,224,40)
|
var/hulk_color_mod = rgb(48,224,40)
|
||||||
var/necrosis_color_mod = rgb(10,50,0)
|
|
||||||
|
|
||||||
var/husk = (HUSK in src.mutations)
|
var/husk = (HUSK in src.mutations)
|
||||||
var/fat = (FAT in src.mutations)
|
var/fat = (FAT in src.mutations)
|
||||||
@@ -231,7 +234,6 @@ var/global/list/damage_icon_parts = list()
|
|||||||
var/skeleton = (SKELETON in src.mutations)
|
var/skeleton = (SKELETON in src.mutations)
|
||||||
|
|
||||||
var/g = (gender == FEMALE ? "f" : "m")
|
var/g = (gender == FEMALE ? "f" : "m")
|
||||||
var/has_head = 0
|
|
||||||
|
|
||||||
//CACHING: Generate an index key from visible bodyparts.
|
//CACHING: Generate an index key from visible bodyparts.
|
||||||
//0 = destroyed, 1 = normal, 2 = robotic, 3 = necrotic.
|
//0 = destroyed, 1 = normal, 2 = robotic, 3 = necrotic.
|
||||||
@@ -239,19 +241,14 @@ var/global/list/damage_icon_parts = list()
|
|||||||
//Create a new, blank icon for our mob to use.
|
//Create a new, blank icon for our mob to use.
|
||||||
if(stand_icon)
|
if(stand_icon)
|
||||||
del(stand_icon)
|
del(stand_icon)
|
||||||
|
|
||||||
stand_icon = new(species.icon_template ? species.icon_template : 'icons/mob/human.dmi',"blank")
|
stand_icon = new(species.icon_template ? species.icon_template : 'icons/mob/human.dmi',"blank")
|
||||||
|
|
||||||
var/icon_key = "[species.race_key][g][s_tone]"
|
var/icon_key = "[species.race_key][g][s_tone]"
|
||||||
for(var/datum/organ/external/part in organs)
|
for(var/obj/item/organ/external/part in organs)
|
||||||
|
if(part.is_stump() || (part.status & ORGAN_DESTROYED))
|
||||||
if(istype(part,/datum/organ/external/head) && !(part.status & ORGAN_DESTROYED))
|
|
||||||
has_head = 1
|
|
||||||
|
|
||||||
if(part.status & ORGAN_DESTROYED)
|
|
||||||
icon_key = "[icon_key]0"
|
icon_key = "[icon_key]0"
|
||||||
else if(part.status & ORGAN_ROBOT)
|
else if(part.status & ORGAN_ROBOT)
|
||||||
icon_key = "[icon_key]2"
|
icon_key = "[icon_key]2[part.model ? "-[part.model]": ""]"
|
||||||
else if(part.status & ORGAN_DEAD)
|
else if(part.status & ORGAN_DEAD)
|
||||||
icon_key = "[icon_key]3"
|
icon_key = "[icon_key]3"
|
||||||
else
|
else
|
||||||
@@ -261,69 +258,31 @@ var/global/list/damage_icon_parts = list()
|
|||||||
|
|
||||||
var/icon/base_icon
|
var/icon/base_icon
|
||||||
if(human_icon_cache[icon_key])
|
if(human_icon_cache[icon_key])
|
||||||
//Icon is cached, use existing icon.
|
|
||||||
base_icon = human_icon_cache[icon_key]
|
base_icon = human_icon_cache[icon_key]
|
||||||
|
|
||||||
//log_debug("Retrieved cached mob icon ([icon_key] \icon[human_icon_cache[icon_key]]) for [src].")
|
|
||||||
|
|
||||||
else
|
else
|
||||||
|
//BEGIN CACHED ICON GENERATION.
|
||||||
|
var/obj/item/organ/external/chest = get_organ("chest")
|
||||||
|
base_icon = chest.get_icon()
|
||||||
|
|
||||||
//BEGIN CACHED ICON GENERATION.
|
for(var/obj/item/organ/external/part in organs)
|
||||||
var/race_icon = (skeleton ? 'icons/mob/human_races/r_skeleton.dmi' : species.icobase)
|
var/icon/temp = part.get_icon(skeleton)
|
||||||
var/deform_icon = (skeleton ? 'icons/mob/human_races/r_skeleton.dmi' : species.icobase)
|
|
||||||
|
|
||||||
//Robotic limbs are handled in get_icon() so all we worry about are missing or dead limbs.
|
|
||||||
//No icon stored, so we need to start with a basic one.
|
|
||||||
var/datum/organ/external/chest = get_organ("chest")
|
|
||||||
base_icon = chest.get_icon(race_icon,deform_icon,g)
|
|
||||||
|
|
||||||
if(chest.status & ORGAN_DEAD)
|
|
||||||
base_icon.ColorTone(necrosis_color_mod)
|
|
||||||
base_icon.SetIntensity(0.7)
|
|
||||||
|
|
||||||
for(var/datum/organ/external/part in organs)
|
|
||||||
|
|
||||||
var/icon/temp //Hold the bodypart icon for processing.
|
|
||||||
|
|
||||||
if(part.status & ORGAN_DESTROYED)
|
|
||||||
continue
|
|
||||||
|
|
||||||
if (istype(part, /datum/organ/external/groin) || istype(part, /datum/organ/external/head))
|
|
||||||
temp = part.get_icon(race_icon,deform_icon,g)
|
|
||||||
else
|
|
||||||
temp = part.get_icon(race_icon,deform_icon)
|
|
||||||
|
|
||||||
if(part.status & ORGAN_DEAD)
|
|
||||||
temp.ColorTone(necrosis_color_mod)
|
|
||||||
temp.SetIntensity(0.7)
|
|
||||||
|
|
||||||
//That part makes left and right legs drawn topmost and lowermost when human looks WEST or EAST
|
//That part makes left and right legs drawn topmost and lowermost when human looks WEST or EAST
|
||||||
//And no change in rendering for other parts (they icon_position is 0, so goes to 'else' part)
|
//And no change in rendering for other parts (they icon_position is 0, so goes to 'else' part)
|
||||||
if(part.icon_position&(LEFT|RIGHT))
|
if(part.icon_position&(LEFT|RIGHT))
|
||||||
|
|
||||||
var/icon/temp2 = new('icons/mob/human.dmi',"blank")
|
var/icon/temp2 = new('icons/mob/human.dmi',"blank")
|
||||||
|
|
||||||
temp2.Insert(new/icon(temp,dir=NORTH),dir=NORTH)
|
temp2.Insert(new/icon(temp,dir=NORTH),dir=NORTH)
|
||||||
temp2.Insert(new/icon(temp,dir=SOUTH),dir=SOUTH)
|
temp2.Insert(new/icon(temp,dir=SOUTH),dir=SOUTH)
|
||||||
|
|
||||||
if(!(part.icon_position & LEFT))
|
if(!(part.icon_position & LEFT))
|
||||||
temp2.Insert(new/icon(temp,dir=EAST),dir=EAST)
|
temp2.Insert(new/icon(temp,dir=EAST),dir=EAST)
|
||||||
|
|
||||||
if(!(part.icon_position & RIGHT))
|
if(!(part.icon_position & RIGHT))
|
||||||
temp2.Insert(new/icon(temp,dir=WEST),dir=WEST)
|
temp2.Insert(new/icon(temp,dir=WEST),dir=WEST)
|
||||||
|
|
||||||
base_icon.Blend(temp2, ICON_OVERLAY)
|
base_icon.Blend(temp2, ICON_OVERLAY)
|
||||||
|
|
||||||
if(part.icon_position & LEFT)
|
if(part.icon_position & LEFT)
|
||||||
temp2.Insert(new/icon(temp,dir=EAST),dir=EAST)
|
temp2.Insert(new/icon(temp,dir=EAST),dir=EAST)
|
||||||
|
|
||||||
if(part.icon_position & RIGHT)
|
if(part.icon_position & RIGHT)
|
||||||
temp2.Insert(new/icon(temp,dir=WEST),dir=WEST)
|
temp2.Insert(new/icon(temp,dir=WEST),dir=WEST)
|
||||||
|
|
||||||
base_icon.Blend(temp2, ICON_UNDERLAY)
|
base_icon.Blend(temp2, ICON_UNDERLAY)
|
||||||
|
|
||||||
else
|
else
|
||||||
|
|
||||||
base_icon.Blend(temp, ICON_OVERLAY)
|
base_icon.Blend(temp, ICON_OVERLAY)
|
||||||
|
|
||||||
if(!skeleton)
|
if(!skeleton)
|
||||||
@@ -334,46 +293,18 @@ var/global/list/damage_icon_parts = list()
|
|||||||
base_icon.MapColors(rgb(tone[1],0,0),rgb(0,tone[2],0),rgb(0,0,tone[3]))
|
base_icon.MapColors(rgb(tone[1],0,0),rgb(0,tone[2],0),rgb(0,0,tone[3]))
|
||||||
|
|
||||||
//Handle husk overlay.
|
//Handle husk overlay.
|
||||||
if(husk && ("overlay_husk" in icon_states(race_icon)))
|
if(husk && ("overlay_husk" in icon_states(species.icobase)))
|
||||||
var/icon/mask = new(base_icon)
|
var/icon/mask = new(base_icon)
|
||||||
var/icon/husk_over = new(race_icon,"overlay_husk")
|
var/icon/husk_over = new(species.icobase,"overlay_husk")
|
||||||
mask.MapColors(0,0,0,1, 0,0,0,1, 0,0,0,1, 0,0,0,1, 0,0,0,0)
|
mask.MapColors(0,0,0,1, 0,0,0,1, 0,0,0,1, 0,0,0,1, 0,0,0,0)
|
||||||
husk_over.Blend(mask, ICON_ADD)
|
husk_over.Blend(mask, ICON_ADD)
|
||||||
base_icon.Blend(husk_over, ICON_OVERLAY)
|
base_icon.Blend(husk_over, ICON_OVERLAY)
|
||||||
|
|
||||||
|
|
||||||
//Skin tone.
|
|
||||||
if(!husk && !hulk)
|
|
||||||
if(species.flags & HAS_SKIN_TONE)
|
|
||||||
if(s_tone >= 0)
|
|
||||||
base_icon.Blend(rgb(s_tone, s_tone, s_tone), ICON_ADD)
|
|
||||||
else
|
|
||||||
base_icon.Blend(rgb(-s_tone, -s_tone, -s_tone), ICON_SUBTRACT)
|
|
||||||
|
|
||||||
human_icon_cache[icon_key] = base_icon
|
human_icon_cache[icon_key] = base_icon
|
||||||
|
|
||||||
//log_debug("Generated new cached mob icon ([icon_key] \icon[human_icon_cache[icon_key]]) for [src]. [human_icon_cache.len] cached mob icons.")
|
|
||||||
|
|
||||||
//END CACHED ICON GENERATION.
|
//END CACHED ICON GENERATION.
|
||||||
|
|
||||||
stand_icon.Blend(base_icon,ICON_OVERLAY)
|
stand_icon.Blend(base_icon,ICON_OVERLAY)
|
||||||
|
|
||||||
//Skin colour. Not in cache because highly variable (and relatively benign).
|
|
||||||
if (species.flags & HAS_SKIN_COLOR)
|
|
||||||
stand_icon.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD)
|
|
||||||
|
|
||||||
if(has_head)
|
|
||||||
//Eyes
|
|
||||||
if(!skeleton)
|
|
||||||
var/icon/eyes = new/icon('icons/mob/human_face.dmi', species.eyes)
|
|
||||||
if (species.flags & HAS_EYE_COLOR)
|
|
||||||
eyes.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD)
|
|
||||||
stand_icon.Blend(eyes, ICON_OVERLAY)
|
|
||||||
|
|
||||||
//Mouth (lipstick!)
|
|
||||||
if(lip_style && (species && species.flags & HAS_LIPS)) //skeletons are allowed to wear lipstick no matter what you think, agouri.
|
|
||||||
stand_icon.Blend(new/icon('icons/mob/human_face.dmi', "lips_[lip_style]_s"), ICON_OVERLAY)
|
|
||||||
|
|
||||||
//Underwear
|
//Underwear
|
||||||
if(underwear && species.flags & HAS_UNDERWEAR)
|
if(underwear && species.flags & HAS_UNDERWEAR)
|
||||||
stand_icon.Blend(new /icon('icons/mob/human.dmi', underwear), ICON_OVERLAY)
|
stand_icon.Blend(new /icon('icons/mob/human.dmi', underwear), ICON_OVERLAY)
|
||||||
@@ -392,7 +323,7 @@ var/global/list/damage_icon_parts = list()
|
|||||||
//Reset our hair
|
//Reset our hair
|
||||||
overlays_standing[HAIR_LAYER] = null
|
overlays_standing[HAIR_LAYER] = null
|
||||||
|
|
||||||
var/datum/organ/external/head/head_organ = get_organ("head")
|
var/obj/item/organ/external/head/head_organ = get_organ("head")
|
||||||
if( !head_organ || (head_organ.status & ORGAN_DESTROYED) )
|
if( !head_organ || (head_organ.status & ORGAN_DESTROYED) )
|
||||||
if(update_icons) update_icons()
|
if(update_icons) update_icons()
|
||||||
return
|
return
|
||||||
@@ -925,48 +856,13 @@ var/global/list/damage_icon_parts = list()
|
|||||||
/mob/living/carbon/human/proc/update_surgery(var/update_icons=1)
|
/mob/living/carbon/human/proc/update_surgery(var/update_icons=1)
|
||||||
overlays_standing[SURGERY_LEVEL] = null
|
overlays_standing[SURGERY_LEVEL] = null
|
||||||
var/image/total = new
|
var/image/total = new
|
||||||
for(var/datum/organ/external/E in organs)
|
for(var/obj/item/organ/external/E in organs)
|
||||||
if(E.open)
|
if(E.open)
|
||||||
var/image/I = image("icon"='icons/mob/surgery.dmi', "icon_state"="[E.name][round(E.open)]", "layer"=-SURGERY_LEVEL)
|
var/image/I = image("icon"='icons/mob/surgery.dmi', "icon_state"="[E.name][round(E.open)]", "layer"=-SURGERY_LEVEL)
|
||||||
total.overlays += I
|
total.overlays += I
|
||||||
overlays_standing[SURGERY_LEVEL] = total
|
overlays_standing[SURGERY_LEVEL] = total
|
||||||
if(update_icons) update_icons()
|
if(update_icons) update_icons()
|
||||||
|
|
||||||
// Used mostly for creating head items
|
|
||||||
/mob/living/carbon/human/proc/generate_head_icon()
|
|
||||||
//gender no longer matters for the mouth, although there should probably be seperate base head icons.
|
|
||||||
// var/g = "m"
|
|
||||||
// if (gender == FEMALE) g = "f"
|
|
||||||
|
|
||||||
//base icons
|
|
||||||
var/icon/face_lying = new /icon('icons/mob/human_face.dmi',"bald_l")
|
|
||||||
|
|
||||||
if(f_style)
|
|
||||||
var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[f_style]
|
|
||||||
if(facial_hair_style)
|
|
||||||
var/icon/facial_l = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_l")
|
|
||||||
facial_l.Blend(rgb(r_facial, g_facial, b_facial), ICON_ADD)
|
|
||||||
face_lying.Blend(facial_l, ICON_OVERLAY)
|
|
||||||
|
|
||||||
if(h_style)
|
|
||||||
var/datum/sprite_accessory/hair_style = hair_styles_list[h_style]
|
|
||||||
if(hair_style)
|
|
||||||
var/icon/hair_l = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_l")
|
|
||||||
hair_l.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD)
|
|
||||||
face_lying.Blend(hair_l, ICON_OVERLAY)
|
|
||||||
|
|
||||||
//Eyes
|
|
||||||
// Note: These used to be in update_face(), and the fact they're here will make it difficult to create a disembodied head
|
|
||||||
var/icon/eyes_l = new/icon('icons/mob/human_face.dmi', "eyes_l")
|
|
||||||
eyes_l.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD)
|
|
||||||
face_lying.Blend(eyes_l, ICON_OVERLAY)
|
|
||||||
|
|
||||||
if(lip_style)
|
|
||||||
face_lying.Blend(new/icon('icons/mob/human_face.dmi', "lips_[lip_style]_l"), ICON_OVERLAY)
|
|
||||||
|
|
||||||
var/image/face_lying_image = new /image(icon = face_lying)
|
|
||||||
return face_lying_image
|
|
||||||
|
|
||||||
//Human Overlays Indexes/////////
|
//Human Overlays Indexes/////////
|
||||||
#undef MUTATIONS_LAYER
|
#undef MUTATIONS_LAYER
|
||||||
#undef DAMAGE_LAYER
|
#undef DAMAGE_LAYER
|
||||||
|
|||||||
@@ -35,11 +35,9 @@
|
|||||||
// broken or ripped off organs will add quite a bit of pain
|
// broken or ripped off organs will add quite a bit of pain
|
||||||
if(istype(src,/mob/living/carbon/human))
|
if(istype(src,/mob/living/carbon/human))
|
||||||
var/mob/living/carbon/human/M = src
|
var/mob/living/carbon/human/M = src
|
||||||
for(var/datum/organ/external/organ in M.organs)
|
for(var/obj/item/organ/external/organ in M.organs)
|
||||||
if (!organ)
|
if (!organ)
|
||||||
continue
|
continue
|
||||||
if((organ.status & ORGAN_DESTROYED) && !organ.amputated)
|
|
||||||
src.traumatic_shock += 60
|
|
||||||
else if(organ.status & ORGAN_BROKEN || organ.open)
|
else if(organ.status & ORGAN_BROKEN || organ.open)
|
||||||
src.traumatic_shock += 30
|
src.traumatic_shock += 30
|
||||||
if(organ.status & ORGAN_SPLINTED)
|
if(organ.status & ORGAN_SPLINTED)
|
||||||
|
|||||||
@@ -169,7 +169,7 @@ default behaviour is:
|
|||||||
var/mob/living/carbon/human/H = src //make this damage method divide the damage to be done among all the body parts, then burn each body part for that much damage. will have better effect then just randomly picking a body part
|
var/mob/living/carbon/human/H = src //make this damage method divide the damage to be done among all the body parts, then burn each body part for that much damage. will have better effect then just randomly picking a body part
|
||||||
var/divided_damage = (burn_amount)/(H.organs.len)
|
var/divided_damage = (burn_amount)/(H.organs.len)
|
||||||
var/extradam = 0 //added to when organ is at max dam
|
var/extradam = 0 //added to when organ is at max dam
|
||||||
for(var/datum/organ/external/affecting in H.organs)
|
for(var/obj/item/organ/external/affecting in H.organs)
|
||||||
if(!affecting) continue
|
if(!affecting) continue
|
||||||
if(affecting.take_damage(0, divided_damage+extradam)) //TODO: fix the extradam stuff. Or, ebtter yet...rewrite this entire proc ~Carn
|
if(affecting.take_damage(0, divided_damage+extradam)) //TODO: fix the extradam stuff. Or, ebtter yet...rewrite this entire proc ~Carn
|
||||||
H.UpdateDamageIcon()
|
H.UpdateDamageIcon()
|
||||||
@@ -339,7 +339,7 @@ default behaviour is:
|
|||||||
var/t = shooter:zone_sel.selecting
|
var/t = shooter:zone_sel.selecting
|
||||||
if ((t in list( "eyes", "mouth" )))
|
if ((t in list( "eyes", "mouth" )))
|
||||||
t = "head"
|
t = "head"
|
||||||
var/datum/organ/external/def_zone = ran_zone(t)
|
var/obj/item/organ/external/def_zone = ran_zone(t)
|
||||||
return def_zone
|
return def_zone
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -65,9 +65,9 @@
|
|||||||
var/list/damaged = H.get_damaged_organs(1,1)
|
var/list/damaged = H.get_damaged_organs(1,1)
|
||||||
user.show_message("\blue Localized Damage, Brute/Electronics:",1)
|
user.show_message("\blue Localized Damage, Brute/Electronics:",1)
|
||||||
if(length(damaged)>0)
|
if(length(damaged)>0)
|
||||||
for(var/datum/organ/external/org in damaged)
|
for(var/obj/item/organ/external/org in damaged)
|
||||||
user.show_message(text("\blue \t []: [] - []", \
|
user.show_message(text("\blue \t []: [] - []", \
|
||||||
capitalize(org.display_name), \
|
capitalize(org.name), \
|
||||||
(org.brute_dam > 0) ? "\red [org.brute_dam]" :0, \
|
(org.brute_dam > 0) ? "\red [org.brute_dam]" :0, \
|
||||||
(org.burn_dam > 0) ? "<font color='#FFA500'>[org.burn_dam]</font>" :0),1)
|
(org.burn_dam > 0) ? "<font color='#FFA500'>[org.burn_dam]</font>" :0),1)
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -100,7 +100,7 @@
|
|||||||
|
|
||||||
if(istype(host,/mob/living/carbon/human))
|
if(istype(host,/mob/living/carbon/human))
|
||||||
var/mob/living/carbon/human/H = host
|
var/mob/living/carbon/human/H = host
|
||||||
var/datum/organ/external/head = H.get_organ("head")
|
var/obj/item/organ/external/head = H.get_organ("head")
|
||||||
head.implants -= src
|
head.implants -= src
|
||||||
|
|
||||||
controlling = 0
|
controlling = 0
|
||||||
|
|||||||
@@ -69,7 +69,7 @@
|
|||||||
if(istype(M,/mob/living/carbon/human))
|
if(istype(M,/mob/living/carbon/human))
|
||||||
var/mob/living/carbon/human/H = M
|
var/mob/living/carbon/human/H = M
|
||||||
|
|
||||||
var/datum/organ/external/E = H.organs_by_name["head"]
|
var/obj/item/organ/external/E = H.organs_by_name["head"]
|
||||||
if(!E || (E.status & ORGAN_DESTROYED))
|
if(!E || (E.status & ORGAN_DESTROYED))
|
||||||
src << "\The [H] does not have a head!"
|
src << "\The [H] does not have a head!"
|
||||||
|
|
||||||
@@ -115,12 +115,12 @@
|
|||||||
if(istype(M,/mob/living/carbon/human))
|
if(istype(M,/mob/living/carbon/human))
|
||||||
|
|
||||||
var/mob/living/carbon/human/H = M
|
var/mob/living/carbon/human/H = M
|
||||||
var/datum/organ/internal/I = H.internal_organs_by_name["brain"]
|
var/obj/item/organ/I = H.internal_organs_by_name["brain"]
|
||||||
if(!I) // No brain organ, so the borer moves in and replaces it permanently.
|
if(!I) // No brain organ, so the borer moves in and replaces it permanently.
|
||||||
replace_brain()
|
replace_brain()
|
||||||
else
|
else
|
||||||
// If they're in normally, implant removal can get them out.
|
// If they're in normally, implant removal can get them out.
|
||||||
var/datum/organ/external/head = H.get_organ("head")
|
var/obj/item/organ/external/head = H.get_organ("head")
|
||||||
head.implants += src
|
head.implants += src
|
||||||
|
|
||||||
return
|
return
|
||||||
@@ -183,11 +183,11 @@
|
|||||||
|
|
||||||
H.ChangeToHusk()
|
H.ChangeToHusk()
|
||||||
|
|
||||||
var/datum/organ/internal/borer/B = new(H)
|
var/obj/item/organ/borer/B = new(H)
|
||||||
H.internal_organs_by_name["brain"] = B
|
H.internal_organs_by_name["brain"] = B
|
||||||
H.internal_organs |= B
|
H.internal_organs |= B
|
||||||
|
|
||||||
var/datum/organ/external/affecting = H.get_organ("head")
|
var/obj/item/organ/external/affecting = H.get_organ("head")
|
||||||
affecting.implants -= src
|
affecting.implants -= src
|
||||||
|
|
||||||
var/s2h_id = src.computer_id
|
var/s2h_id = src.computer_id
|
||||||
|
|||||||
@@ -134,7 +134,7 @@
|
|||||||
if(ishuman(target_mob))
|
if(ishuman(target_mob))
|
||||||
var/mob/living/carbon/human/H = target_mob
|
var/mob/living/carbon/human/H = target_mob
|
||||||
var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg")
|
var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg")
|
||||||
var/datum/organ/external/affecting = H.get_organ(ran_zone(dam_zone))
|
var/obj/item/organ/external/affecting = H.get_organ(ran_zone(dam_zone))
|
||||||
H.apply_damage(damage, BRUTE, affecting, H.run_armor_check(affecting, "melee"), sharp=1, edge=1)
|
H.apply_damage(damage, BRUTE, affecting, H.run_armor_check(affecting, "melee"), sharp=1, edge=1)
|
||||||
return H
|
return H
|
||||||
else if(isliving(target_mob))
|
else if(isliving(target_mob))
|
||||||
|
|||||||
@@ -475,7 +475,7 @@
|
|||||||
|
|
||||||
if(ishuman(parrot_interest))
|
if(ishuman(parrot_interest))
|
||||||
var/mob/living/carbon/human/H = parrot_interest
|
var/mob/living/carbon/human/H = parrot_interest
|
||||||
var/datum/organ/external/affecting = H.get_organ(ran_zone(pick(parrot_dam_zone)))
|
var/obj/item/organ/external/affecting = H.get_organ(ran_zone(pick(parrot_dam_zone)))
|
||||||
|
|
||||||
H.apply_damage(damage, BRUTE, affecting, H.run_armor_check(affecting, "melee"), sharp=1)
|
H.apply_damage(damage, BRUTE, affecting, H.run_armor_check(affecting, "melee"), sharp=1)
|
||||||
visible_emote(pick("pecks [H]'s [affecting].", "cuts [H]'s [affecting] with its talons."))
|
visible_emote(pick("pecks [H]'s [affecting].", "cuts [H]'s [affecting] with its talons."))
|
||||||
|
|||||||
@@ -589,8 +589,8 @@ var/list/slot_equipment_priority = list( \
|
|||||||
var/mob/living/carbon/human/H = src
|
var/mob/living/carbon/human/H = src
|
||||||
if(H.health - H.halloss <= config.health_threshold_softcrit)
|
if(H.health - H.halloss <= config.health_threshold_softcrit)
|
||||||
for(var/name in H.organs_by_name)
|
for(var/name in H.organs_by_name)
|
||||||
var/datum/organ/external/e = H.organs_by_name[name]
|
var/obj/item/organ/external/e = H.organs_by_name[name]
|
||||||
if(H.lying)
|
if(e && H.lying)
|
||||||
if(((e.status & ORGAN_BROKEN && !(e.status & ORGAN_SPLINTED)) || e.status & ORGAN_BLEEDING) && (H.getBruteLoss() + H.getFireLoss() >= 100))
|
if(((e.status & ORGAN_BROKEN && !(e.status & ORGAN_SPLINTED)) || e.status & ORGAN_BLEEDING) && (H.getBruteLoss() + H.getFireLoss() >= 100))
|
||||||
return 1
|
return 1
|
||||||
break
|
break
|
||||||
@@ -1101,7 +1101,7 @@ mob/proc/yank_out_object()
|
|||||||
else
|
else
|
||||||
U << "<span class='warning'>You attempt to get a good grip on [selection] in [S]'s body.</span>"
|
U << "<span class='warning'>You attempt to get a good grip on [selection] in [S]'s body.</span>"
|
||||||
|
|
||||||
if(!do_after(U, 80))
|
if(!do_after(U, 30))
|
||||||
return
|
return
|
||||||
if(!selection || !S || !U)
|
if(!selection || !S || !U)
|
||||||
return
|
return
|
||||||
@@ -1116,9 +1116,9 @@ mob/proc/yank_out_object()
|
|||||||
|
|
||||||
if(ishuman(src))
|
if(ishuman(src))
|
||||||
var/mob/living/carbon/human/H = src
|
var/mob/living/carbon/human/H = src
|
||||||
var/datum/organ/external/affected
|
var/obj/item/organ/external/affected
|
||||||
|
|
||||||
for(var/datum/organ/external/organ in H.organs) //Grab the organ holding the implant.
|
for(var/obj/item/organ/external/organ in H.organs) //Grab the organ holding the implant.
|
||||||
for(var/obj/item/O in organ.implants)
|
for(var/obj/item/O in organ.implants)
|
||||||
if(O == selection)
|
if(O == selection)
|
||||||
affected = organ
|
affected = organ
|
||||||
@@ -1137,6 +1137,8 @@ mob/proc/yank_out_object()
|
|||||||
human_user.bloody_hands(H)
|
human_user.bloody_hands(H)
|
||||||
|
|
||||||
selection.loc = get_turf(src)
|
selection.loc = get_turf(src)
|
||||||
|
if(!(U.l_hand && U.r_hand))
|
||||||
|
U.put_in_hands(selection)
|
||||||
|
|
||||||
for(var/obj/item/weapon/O in pinned)
|
for(var/obj/item/weapon/O in pinned)
|
||||||
if(O == selection)
|
if(O == selection)
|
||||||
|
|||||||
@@ -125,7 +125,7 @@ proc/isobserver(A)
|
|||||||
return 0
|
return 0
|
||||||
|
|
||||||
proc/isorgan(A)
|
proc/isorgan(A)
|
||||||
if(istype(A, /datum/organ/external))
|
if(istype(A, /obj/item/organ/external))
|
||||||
return 1
|
return 1
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
@@ -140,7 +140,7 @@ proc/isnewplayer(A)
|
|||||||
return 1
|
return 1
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
proc/hasorgans(A)
|
proc/hasorgans(A) // Fucking really??
|
||||||
return ishuman(A)
|
return ishuman(A)
|
||||||
|
|
||||||
proc/iscuffed(A)
|
proc/iscuffed(A)
|
||||||
|
|||||||
@@ -289,8 +289,8 @@
|
|||||||
else if(istype(mob.buckled, /obj/structure/bed/chair/wheelchair))
|
else if(istype(mob.buckled, /obj/structure/bed/chair/wheelchair))
|
||||||
if(ishuman(mob.buckled))
|
if(ishuman(mob.buckled))
|
||||||
var/mob/living/carbon/human/driver = mob.buckled
|
var/mob/living/carbon/human/driver = mob.buckled
|
||||||
var/datum/organ/external/l_hand = driver.get_organ("l_hand")
|
var/obj/item/organ/external/l_hand = driver.get_organ("l_hand")
|
||||||
var/datum/organ/external/r_hand = driver.get_organ("r_hand")
|
var/obj/item/organ/external/r_hand = driver.get_organ("r_hand")
|
||||||
if((!l_hand || (l_hand.status & ORGAN_DESTROYED)) && (!r_hand || (r_hand.status & ORGAN_DESTROYED)))
|
if((!l_hand || (l_hand.status & ORGAN_DESTROYED)) && (!r_hand || (r_hand.status & ORGAN_DESTROYED)))
|
||||||
return // No hands to drive your chair? Tough luck!
|
return // No hands to drive your chair? Tough luck!
|
||||||
//drunk wheelchair driving
|
//drunk wheelchair driving
|
||||||
|
|||||||
@@ -200,12 +200,13 @@ datum/preferences
|
|||||||
|
|
||||||
for(var/name in list("r_arm","r_hand","r_leg","r_foot","l_leg","l_foot","l_arm","l_hand"))
|
for(var/name in list("r_arm","r_hand","r_leg","r_foot","l_leg","l_foot","l_arm","l_hand"))
|
||||||
if(organ_data[name] == "amputated") continue
|
if(organ_data[name] == "amputated") continue
|
||||||
|
|
||||||
var/icon/temp = new /icon(icobase, "[name]")
|
|
||||||
if(organ_data[name] == "cyborg")
|
if(organ_data[name] == "cyborg")
|
||||||
temp.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0))
|
var/datum/robolimb/R
|
||||||
|
if(rlimb_data[name]) R = all_robolimbs[rlimb_data[name]]
|
||||||
preview_icon.Blend(temp, ICON_OVERLAY)
|
if(!R) R = basic_robolimb
|
||||||
|
preview_icon.Blend(icon(R.icon, "[name]"), ICON_OVERLAY) // This doesn't check gendered_icon. Not an issue while only limbs can be robotic.
|
||||||
|
continue
|
||||||
|
preview_icon.Blend(new /icon(icobase, "[name]"), ICON_OVERLAY)
|
||||||
|
|
||||||
//Tail
|
//Tail
|
||||||
if(current_species && (current_species.tail))
|
if(current_species && (current_species.tail))
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
|
|||||||
// Damaged heart virtually reduces the blood volume, as the blood isn't
|
// Damaged heart virtually reduces the blood volume, as the blood isn't
|
||||||
// being pumped properly anymore.
|
// being pumped properly anymore.
|
||||||
if(species && species.has_organ["heart"])
|
if(species && species.has_organ["heart"])
|
||||||
var/datum/organ/internal/heart/heart = internal_organs_by_name["heart"]
|
var/obj/item/organ/heart/heart = internal_organs_by_name["heart"]
|
||||||
|
|
||||||
if(!heart)
|
if(!heart)
|
||||||
blood_volume = 0
|
blood_volume = 0
|
||||||
@@ -127,7 +127,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
|
|||||||
|
|
||||||
//Bleeding out
|
//Bleeding out
|
||||||
var/blood_max = 0
|
var/blood_max = 0
|
||||||
for(var/datum/organ/external/temp in organs)
|
for(var/obj/item/organ/external/temp in organs)
|
||||||
if(!(temp.status & ORGAN_BLEEDING) || temp.status & ORGAN_ROBOT)
|
if(!(temp.status & ORGAN_BLEEDING) || temp.status & ORGAN_ROBOT)
|
||||||
continue
|
continue
|
||||||
for(var/datum/wound/W in temp.wounds) if(W.bleeding())
|
for(var/datum/wound/W in temp.wounds) if(W.bleeding())
|
||||||
|
|||||||
@@ -1,26 +1,154 @@
|
|||||||
/datum/organ
|
var/list/organ_cache = list()
|
||||||
var/name = "organ"
|
|
||||||
|
/obj/item/organ
|
||||||
|
name = "organ"
|
||||||
|
icon = 'icons/obj/surgery.dmi'
|
||||||
|
|
||||||
var/mob/living/carbon/human/owner = null
|
var/mob/living/carbon/human/owner = null
|
||||||
var/status = 0
|
var/status = 0
|
||||||
var/vital //Lose a vital limb, die immediately.
|
var/vital //Lose a vital limb, die immediately.
|
||||||
|
var/damage = 0 // amount of damage to the organ
|
||||||
|
|
||||||
|
var/min_bruised_damage = 10
|
||||||
|
var/min_broken_damage = 30
|
||||||
|
var/max_damage
|
||||||
|
var/organ_tag = "organ"
|
||||||
|
|
||||||
|
var/parent_organ = "chest"
|
||||||
|
var/robotic = 0 //For being a robot
|
||||||
|
var/rejecting // Is this organ already being rejected?
|
||||||
|
|
||||||
|
var/list/transplant_data
|
||||||
var/list/datum/autopsy_data/autopsy_data = list()
|
var/list/datum/autopsy_data/autopsy_data = list()
|
||||||
var/list/trace_chemicals = list() // traces of chemicals in the organ,
|
var/list/trace_chemicals = list() // traces of chemicals in the organ,
|
||||||
// links chemical IDs to number of ticks for which they'll stay in the blood
|
// links chemical IDs to number of ticks for which they'll stay in the blood
|
||||||
|
germ_level = 0
|
||||||
|
|
||||||
var/germ_level = 0 // INTERNAL germs inside the organ, this is BAD if it's greater than INFECTION_LEVEL_ONE
|
/obj/item/organ/proc/update_health()
|
||||||
|
return
|
||||||
|
|
||||||
proc/process()
|
/obj/item/organ/New(var/mob/living/carbon/holder, var/internal)
|
||||||
return 0
|
..(holder)
|
||||||
|
create_reagents(5)
|
||||||
|
if(!max_damage)
|
||||||
|
max_damage = min_broken_damage * 2
|
||||||
|
if(istype(holder))
|
||||||
|
src.owner = holder
|
||||||
|
var/mob/living/carbon/human/H = holder
|
||||||
|
if(istype(H))
|
||||||
|
if(internal)
|
||||||
|
var/obj/item/organ/external/E = H.organs_by_name[src.parent_organ]
|
||||||
|
if(E)
|
||||||
|
if(E.internal_organs == null)
|
||||||
|
E.internal_organs = list()
|
||||||
|
E.internal_organs |= src
|
||||||
|
if(H.dna)
|
||||||
|
if(!blood_DNA)
|
||||||
|
blood_DNA = list()
|
||||||
|
blood_DNA[H.dna.unique_enzymes] = H.dna.b_type
|
||||||
|
if(internal)
|
||||||
|
holder.internal_organs |= src
|
||||||
|
|
||||||
proc/receive_chem(chemical as obj)
|
/obj/item/organ/proc/die()
|
||||||
return 0
|
name = "dead [initial(name)]"
|
||||||
|
health = 0
|
||||||
|
processing_objects -= src
|
||||||
|
//TODO: Grey out the icon state.
|
||||||
|
//TODO: Inject an organ with peridaxon to make it alive again.
|
||||||
|
|
||||||
/datum/organ/proc/get_icon(var/icon/race_icon, var/icon/deform_icon)
|
/obj/item/organ/process()
|
||||||
return icon('icons/mob/human.dmi',"blank")
|
|
||||||
|
// Don't process if we're in a freezer, an MMI or a stasis bag. //TODO: ambient temperature?
|
||||||
|
if(istype(loc,/obj/item/device/mmi) || istype(loc,/obj/item/bodybag/cryobag) || istype(loc,/obj/structure/closet/crate/freezer))
|
||||||
|
return
|
||||||
|
|
||||||
|
//Process infections
|
||||||
|
if (robotic >= 2 || (owner && owner.species && (owner.species.flags & IS_PLANT)))
|
||||||
|
germ_level = 0
|
||||||
|
return
|
||||||
|
|
||||||
|
if(loc != owner)
|
||||||
|
owner = null
|
||||||
|
|
||||||
|
if(!owner)
|
||||||
|
var/datum/reagent/blood/B = locate(/datum/reagent/blood) in reagents.reagent_list
|
||||||
|
if(B && prob(40))
|
||||||
|
reagents.remove_reagent("blood",0.1)
|
||||||
|
blood_splatter(src,B,1)
|
||||||
|
|
||||||
|
health -= rand(1,3)
|
||||||
|
if(health <= 0)
|
||||||
|
die()
|
||||||
|
else if(owner.bodytemperature >= 170) //cryo stops germs from moving and doing their bad stuffs
|
||||||
|
//** Handle antibiotics and curing infections
|
||||||
|
handle_antibiotics()
|
||||||
|
handle_rejection()
|
||||||
|
handle_germ_effects()
|
||||||
|
|
||||||
|
/obj/item/organ/proc/handle_germ_effects()
|
||||||
|
//** Handle the effects of infections
|
||||||
|
var/antibiotics = owner.reagents.get_reagent_amount("spaceacillin")
|
||||||
|
|
||||||
|
if (germ_level > 0 && germ_level < INFECTION_LEVEL_ONE/2 && prob(30))
|
||||||
|
germ_level--
|
||||||
|
|
||||||
|
if (germ_level >= INFECTION_LEVEL_ONE/2)
|
||||||
|
//aiming for germ level to go from ambient to INFECTION_LEVEL_TWO in an average of 15 minutes
|
||||||
|
if(antibiotics < 5 && prob(round(germ_level/6)))
|
||||||
|
germ_level++
|
||||||
|
|
||||||
|
if(germ_level >= INFECTION_LEVEL_ONE)
|
||||||
|
var/fever_temperature = (owner.species.heat_level_1 - owner.species.body_temperature - 5)* min(germ_level/INFECTION_LEVEL_TWO, 1) + owner.species.body_temperature
|
||||||
|
owner.bodytemperature += between(0, (fever_temperature - T20C)/BODYTEMP_COLD_DIVISOR + 1, fever_temperature - owner.bodytemperature)
|
||||||
|
|
||||||
|
if (germ_level >= INFECTION_LEVEL_TWO)
|
||||||
|
var/obj/item/organ/external/parent = owner.get_organ(parent_organ)
|
||||||
|
//spread germs
|
||||||
|
if (antibiotics < 5 && parent.germ_level < germ_level && ( parent.germ_level < INFECTION_LEVEL_ONE*2 || prob(30) ))
|
||||||
|
parent.germ_level++
|
||||||
|
|
||||||
|
if (prob(3)) //about once every 30 seconds
|
||||||
|
take_damage(1,silent=prob(30))
|
||||||
|
|
||||||
|
/obj/item/organ/proc/handle_rejection()
|
||||||
|
// Process unsuitable transplants. TODO: consider some kind of
|
||||||
|
// immunosuppressant that changes transplant data to make it match.
|
||||||
|
if(transplant_data)
|
||||||
|
if(!rejecting && prob(20) && owner.dna && blood_incompatible(transplant_data["blood_type"],owner.dna.b_type,owner.species,transplant_data["species"]))
|
||||||
|
rejecting = 1
|
||||||
|
else
|
||||||
|
rejecting++ //Rejection severity increases over time.
|
||||||
|
if(rejecting % 10 == 0) //Only fire every ten rejection ticks.
|
||||||
|
switch(rejecting)
|
||||||
|
if(1 to 50)
|
||||||
|
take_damage(1)
|
||||||
|
if(51 to 200)
|
||||||
|
owner.reagents.add_reagent("toxin", 1)
|
||||||
|
take_damage(1)
|
||||||
|
if(201 to 500)
|
||||||
|
take_damage(rand(2,3))
|
||||||
|
owner.reagents.add_reagent("toxin", 2)
|
||||||
|
if(501 to INFINITY)
|
||||||
|
take_damage(4)
|
||||||
|
owner.reagents.add_reagent("toxin", rand(3,5))
|
||||||
|
|
||||||
|
/obj/item/organ/proc/receive_chem(chemical as obj)
|
||||||
|
return 0
|
||||||
|
|
||||||
|
/obj/item/organ/proc/rejuvenate()
|
||||||
|
damage = 0
|
||||||
|
|
||||||
|
/obj/item/organ/proc/is_damaged()
|
||||||
|
return damage > 0
|
||||||
|
|
||||||
|
/obj/item/organ/proc/is_bruised()
|
||||||
|
return damage >= min_bruised_damage
|
||||||
|
|
||||||
|
/obj/item/organ/proc/is_broken()
|
||||||
|
return (damage >= min_broken_damage || (status & ORGAN_CUT_AWAY) || ((status & ORGAN_BROKEN) && !(status & ORGAN_SPLINTED)))
|
||||||
|
|
||||||
//Germs
|
//Germs
|
||||||
/datum/organ/proc/handle_antibiotics()
|
/obj/item/organ/proc/handle_antibiotics()
|
||||||
var/antibiotics = owner.reagents.get_reagent_amount("spaceacillin")
|
var/antibiotics = owner.reagents.get_reagent_amount("spaceacillin")
|
||||||
|
|
||||||
if (!germ_level || antibiotics < 5)
|
if (!germ_level || antibiotics < 5)
|
||||||
@@ -33,15 +161,8 @@
|
|||||||
else
|
else
|
||||||
germ_level -= 2 //at germ_level == 1000, this will cure the infection in 5 minutes
|
germ_level -= 2 //at germ_level == 1000, this will cure the infection in 5 minutes
|
||||||
|
|
||||||
//Handles chem traces
|
|
||||||
/mob/living/carbon/human/proc/handle_trace_chems()
|
|
||||||
//New are added for reagents to random organs.
|
|
||||||
for(var/datum/reagent/A in reagents.reagent_list)
|
|
||||||
var/datum/organ/O = pick(organs)
|
|
||||||
O.trace_chemicals[A.name] = 100
|
|
||||||
|
|
||||||
//Adds autopsy data for used_weapon.
|
//Adds autopsy data for used_weapon.
|
||||||
/datum/organ/proc/add_autopsy_data(var/used_weapon, var/damage)
|
/obj/item/organ/proc/add_autopsy_data(var/used_weapon, var/damage)
|
||||||
var/datum/autopsy_data/W = autopsy_data[used_weapon]
|
var/datum/autopsy_data/W = autopsy_data[used_weapon]
|
||||||
if(!W)
|
if(!W)
|
||||||
W = new()
|
W = new()
|
||||||
@@ -52,88 +173,147 @@
|
|||||||
W.damage += damage
|
W.damage += damage
|
||||||
W.time_inflicted = world.time
|
W.time_inflicted = world.time
|
||||||
|
|
||||||
/mob/living/carbon/human/var/list/organs = list()
|
/obj/item/organ/proc/take_damage(amount, var/silent=0)
|
||||||
/mob/living/carbon/human/var/list/organs_by_name = list() // map organ names to organs
|
if(src.robotic == 2)
|
||||||
/mob/living/carbon/human/var/list/internal_organs_by_name = list() // so internal organs have less ickiness too
|
src.damage += (amount * 0.8)
|
||||||
|
else
|
||||||
|
src.damage += amount
|
||||||
|
|
||||||
// Takes care of organ related updates, such as broken and missing limbs
|
var/obj/item/organ/external/parent = owner.get_organ(parent_organ)
|
||||||
/mob/living/carbon/human/proc/handle_organs()
|
if (!silent)
|
||||||
|
owner.custom_pain("Something inside your [parent.name] hurts a lot.", 1)
|
||||||
|
|
||||||
number_wounds = 0
|
/obj/item/organ/proc/robotize() //Being used to make robutt hearts, etc
|
||||||
var/force_process = 0
|
robotic = 2
|
||||||
var/damage_this_tick = getBruteLoss() + getFireLoss() + getToxLoss()
|
src.status &= ~ORGAN_BROKEN
|
||||||
if(damage_this_tick > last_dam)
|
src.status &= ~ORGAN_BLEEDING
|
||||||
force_process = 1
|
src.status &= ~ORGAN_SPLINTED
|
||||||
last_dam = damage_this_tick
|
src.status &= ~ORGAN_CUT_AWAY
|
||||||
if(force_process)
|
src.status &= ~ORGAN_ATTACHABLE
|
||||||
bad_external_organs.Cut()
|
src.status &= ~ORGAN_DESTROYED
|
||||||
for(var/datum/organ/external/Ex in organs)
|
src.status |= ORGAN_ROBOT
|
||||||
bad_external_organs += Ex
|
src.status |= ORGAN_ASSISTED
|
||||||
|
|
||||||
//processing internal organs is pretty cheap, do that first.
|
/obj/item/organ/proc/mechassist() //Used to add things like pacemakers, etc
|
||||||
for(var/datum/organ/internal/I in internal_organs)
|
robotize()
|
||||||
I.process()
|
src.status &= ~ORGAN_ROBOT
|
||||||
|
robotic = 1
|
||||||
|
min_bruised_damage = 15
|
||||||
|
min_broken_damage = 35
|
||||||
|
|
||||||
//losing a limb stops it from processing, so this has to be done separately
|
/obj/item/organ/emp_act(severity)
|
||||||
handle_stance()
|
switch(robotic)
|
||||||
|
if(0)
|
||||||
|
return
|
||||||
|
if(1)
|
||||||
|
switch (severity)
|
||||||
|
if (1.0)
|
||||||
|
take_damage(20,0)
|
||||||
|
return
|
||||||
|
if (2.0)
|
||||||
|
take_damage(7,0)
|
||||||
|
return
|
||||||
|
if(3.0)
|
||||||
|
take_damage(3,0)
|
||||||
|
return
|
||||||
|
if(2)
|
||||||
|
switch (severity)
|
||||||
|
if (1.0)
|
||||||
|
take_damage(40,0)
|
||||||
|
return
|
||||||
|
if (2.0)
|
||||||
|
take_damage(15,0)
|
||||||
|
return
|
||||||
|
if(3.0)
|
||||||
|
take_damage(10,0)
|
||||||
|
return
|
||||||
|
|
||||||
if(!force_process && !bad_external_organs.len)
|
/obj/item/organ/proc/removed(var/mob/living/user)
|
||||||
|
|
||||||
|
if(!istype(owner))
|
||||||
return
|
return
|
||||||
|
|
||||||
for(var/datum/organ/external/E in bad_external_organs)
|
owner.internal_organs_by_name[organ_tag] = null
|
||||||
if(!E)
|
owner.internal_organs_by_name -= organ_tag
|
||||||
continue
|
owner.internal_organs -= src
|
||||||
if(!E.need_process())
|
|
||||||
bad_external_organs -= E
|
|
||||||
continue
|
|
||||||
else
|
|
||||||
E.process()
|
|
||||||
number_wounds += E.number_wounds
|
|
||||||
|
|
||||||
if (!lying && world.time - l_move_time < 15)
|
var/obj/item/organ/external/affected = owner.get_organ(parent_organ)
|
||||||
//Moving around with fractured ribs won't do you any good
|
if(affected) affected.internal_organs -= src
|
||||||
if (E.is_broken() && E.internal_organs && prob(15))
|
|
||||||
var/datum/organ/internal/I = pick(E.internal_organs)
|
|
||||||
custom_pain("You feel broken bones moving in your [E.display_name]!", 1)
|
|
||||||
I.take_damage(rand(3,5))
|
|
||||||
|
|
||||||
//Moving makes open wounds get infected much faster
|
loc = owner.loc
|
||||||
if (E.wounds.len)
|
rejecting = null
|
||||||
for(var/datum/wound/W in E.wounds)
|
var/datum/reagent/blood/organ_blood = locate(/datum/reagent/blood) in reagents.reagent_list
|
||||||
if (W.infection_check())
|
if(!organ_blood || !organ_blood.data["blood_DNA"])
|
||||||
W.germ_level += 1
|
owner.vessel.trans_to(src, 5, 1, 1)
|
||||||
|
|
||||||
/mob/living/carbon/human/proc/handle_stance()
|
if(owner && vital)
|
||||||
// Don't need to process any of this if they aren't standing anyways
|
if(user)
|
||||||
// unless their stance is damaged, and we want to check if they should stay down
|
user.attack_log += "\[[time_stamp()]\]<font color='red'> removed a vital organ ([src]) from [owner.name] ([owner.ckey]) (INTENT: [uppertext(user.a_intent)])</font>"
|
||||||
if (!stance_damage && (lying || resting) && (life_tick % 4) == 0)
|
owner.attack_log += "\[[time_stamp()]\]<font color='orange'> had a vital organ ([src]) removed by [user.name] ([user.ckey]) (INTENT: [uppertext(user.a_intent)])</font>"
|
||||||
|
msg_admin_attack("[user.name] ([user.ckey]) removed a vital organ ([src]) from [owner.name] ([owner.ckey]) (INTENT: [uppertext(user.a_intent)]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
|
||||||
|
owner.death()
|
||||||
|
|
||||||
|
/obj/item/organ/proc/replaced(var/mob/living/carbon/human/target,var/obj/item/organ/external/affected)
|
||||||
|
|
||||||
|
if(!istype(target)) return
|
||||||
|
|
||||||
|
var/datum/reagent/blood/transplant_blood = locate(/datum/reagent/blood) in reagents.reagent_list
|
||||||
|
transplant_data = list()
|
||||||
|
if(!transplant_blood)
|
||||||
|
transplant_data["species"] = target.species.name
|
||||||
|
transplant_data["blood_type"] = target.dna.b_type
|
||||||
|
transplant_data["blood_DNA"] = target.dna.unique_enzymes
|
||||||
|
else
|
||||||
|
transplant_data["species"] = transplant_blood.data["species"]
|
||||||
|
transplant_data["blood_type"] = transplant_blood.data["blood_type"]
|
||||||
|
transplant_data["blood_DNA"] = transplant_blood.data["blood_DNA"]
|
||||||
|
|
||||||
|
owner = target
|
||||||
|
target.internal_organs |= src
|
||||||
|
affected.internal_organs |= src
|
||||||
|
target.internal_organs_by_name[organ_tag] = src
|
||||||
|
status |= ORGAN_CUT_AWAY
|
||||||
|
|
||||||
|
del(src)
|
||||||
|
|
||||||
|
/obj/item/organ/eyes/replaced(var/mob/living/carbon/human/target)
|
||||||
|
|
||||||
|
// Apply our eye colour to the target.
|
||||||
|
if(istype(target) && eye_colour)
|
||||||
|
target.r_eyes = eye_colour[1]
|
||||||
|
target.g_eyes = eye_colour[2]
|
||||||
|
target.b_eyes = eye_colour[3]
|
||||||
|
target.update_body()
|
||||||
|
..()
|
||||||
|
|
||||||
|
/obj/item/organ/proc/bitten(mob/user)
|
||||||
|
|
||||||
|
if(robotic)
|
||||||
return
|
return
|
||||||
|
|
||||||
stance_damage = 0
|
user << "\blue You take an experimental bite out of \the [src]."
|
||||||
|
var/datum/reagent/blood/B = locate(/datum/reagent/blood) in reagents.reagent_list
|
||||||
|
blood_splatter(src,B,1)
|
||||||
|
|
||||||
// Buckled to a bed/chair. Stance damage is forced to 0 since they're sitting on something solid
|
|
||||||
if (istype(buckled, /obj/structure/bed))
|
user.drop_from_inventory(src)
|
||||||
|
var/obj/item/weapon/reagent_containers/food/snacks/organ/O = new(get_turf(src))
|
||||||
|
O.name = name
|
||||||
|
O.icon_state = icon_state
|
||||||
|
|
||||||
|
// Pass over the blood.
|
||||||
|
reagents.trans_to(O, reagents.total_volume)
|
||||||
|
|
||||||
|
if(fingerprints) O.fingerprints = fingerprints.Copy()
|
||||||
|
if(fingerprintshidden) O.fingerprintshidden = fingerprintshidden.Copy()
|
||||||
|
if(fingerprintslast) O.fingerprintslast = fingerprintslast
|
||||||
|
|
||||||
|
user.put_in_active_hand(O)
|
||||||
|
del(src)
|
||||||
|
|
||||||
|
/obj/item/organ/attack_self(mob/user as mob)
|
||||||
|
|
||||||
|
// Convert it to an edible form, yum yum.
|
||||||
|
if(!robotic && user.a_intent == "help" && user.zone_sel.selecting == "mouth")
|
||||||
|
bitten(user)
|
||||||
return
|
return
|
||||||
|
|
||||||
for (var/organ in list("l_leg","l_foot","r_leg","r_foot"))
|
|
||||||
var/datum/organ/external/E = organs_by_name[organ]
|
|
||||||
if (E.status & ORGAN_DESTROYED)
|
|
||||||
stance_damage += 2 // let it fail even if just foot&leg
|
|
||||||
else if (E.is_malfunctioning() || (E.is_broken() && !(E.status & ORGAN_SPLINTED)) || !E.is_usable())
|
|
||||||
stance_damage += 1
|
|
||||||
|
|
||||||
// Canes and crutches help you stand (if the latter is ever added)
|
|
||||||
// One cane mitigates a broken leg+foot, or a missing foot.
|
|
||||||
// Two canes are needed for a lost leg. If you are missing both legs, canes aren't gonna help you.
|
|
||||||
if (istype(l_hand, /obj/item/weapon/cane))
|
|
||||||
stance_damage -= 2
|
|
||||||
if (istype(l_hand, /obj/item/weapon/cane))
|
|
||||||
stance_damage -= 2
|
|
||||||
|
|
||||||
// standing is poor
|
|
||||||
if(stance_damage >= 4 || (stance_damage >= 2 && prob(5)))
|
|
||||||
if(!(lying || resting))
|
|
||||||
if(species && !(species.flags & NO_PAIN))
|
|
||||||
emote("scream")
|
|
||||||
custom_emote(1, "collapses!")
|
|
||||||
Weaken(5) //can't emote while weakened, apparently.
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user