Merge branch 'BEF-staging'

This commit is contained in:
Mloc-Argent
2013-07-08 23:28:22 +01:00
855 changed files with 7479 additions and 3031 deletions
@@ -57,11 +57,11 @@
if(!gibbed)
emote("deathgasp") //let the world KNOW WE ARE DEAD
//For ninjas exploding when they die./N
//For ninjas exploding when they die.
if( istype(wear_suit, /obj/item/clothing/suit/space/space_ninja) && wear_suit:s_initialized )
src << browse(null, "window=spideros")//Just in case.
var/location = loc
explosion(location, 1, 2, 3, 4)
explosion(location, 0, 0, 3, 4)
update_canmove()
if(client) blind.layer = 0
+62 -48
View File
@@ -381,65 +381,56 @@
if(display_gloves)
msg += "<span class='warning'><b>[src] has blood running from under [t_his] gloves!</b></span>\n"
for(var/implant in get_visible_implants(1))
msg += "<span class='warning'><b>[src] has \a [implant] sticking out of their flesh!</span>\n"
if(digitalcamo)
msg += "[t_He] [t_is] repulsively uncanny!\n"
if(istype(usr, /mob/living/carbon/human))
var/mob/living/carbon/human/H = usr
if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.glasses, /obj/item/clothing/glasses/sunglasses/sechud))
if(usr.stat || H != usr) //|| !usr.canmove || usr.restrained()) Fluff: Sechuds have eye-tracking technology and sets 'arrest' to people that the wearer looks and blinks at.
return //Non-fluff: This allows sec to set people to arrest as they get disarmed or beaten
if(hasHUD(usr,"security"))
var/perpname = "wot"
var/criminal = "None"
var/perpname = "wot"
var/criminal = "None"
if(wear_id)
var/obj/item/weapon/card/id/I = wear_id.GetID()
if(I)
perpname = I.registered_name
else
perpname = name
if(wear_id)
var/obj/item/weapon/card/id/I = wear_id.GetID()
if(I)
perpname = I.registered_name
else
perpname = name
else
perpname = name
if(perpname)
for (var/datum/data/record/E in data_core.general)
if(E.fields["name"] == perpname)
for (var/datum/data/record/R in data_core.security)
if(R.fields["id"] == E.fields["id"])
criminal = R.fields["criminal"]
msg += "<span class = 'deptradio'>Criminal status:</span> <a href='?src=\ref[src];criminal=1'>\[[criminal]\]</a>\n"
msg += "<span class = 'deptradio'>Security records:</span> <a href='?src=\ref[src];secrecord=`'>\[View\]</a> <a href='?src=\ref[src];secrecordadd=`'>\[Add comment\]</a>\n"
//msg += "\[Set Hostile Identification\]\n"
if(istype(usr, /mob/living/carbon/human))
var/mob/living/carbon/human/H = usr
if(istype(H.glasses, /obj/item/clothing/glasses/hud/health))
var/perpname = "wot"
var/medical = "None"
if(wear_id)
if(istype(wear_id,/obj/item/weapon/card/id))
perpname = wear_id:registered_name
else if(istype(wear_id,/obj/item/device/pda))
var/obj/item/device/pda/tempPda = wear_id
perpname = tempPda.owner
else
perpname = src.name
if(perpname)
for (var/datum/data/record/E in data_core.general)
if (E.fields["name"] == perpname)
for (var/datum/data/record/R in data_core.general)
if (R.fields["id"] == E.fields["id"])
medical = R.fields["p_stat"]
if(E.fields["name"] == perpname)
for (var/datum/data/record/R in data_core.security)
if(R.fields["id"] == E.fields["id"])
criminal = R.fields["criminal"]
msg += "<span class = 'deptradio'>Criminal status:</span> <a href='?src=\ref[src];criminal=1'>\[[criminal]\]</a>\n"
msg += "<span class = 'deptradio'>Security records:</span> <a href='?src=\ref[src];secrecord=`'>\[View\]</a> <a href='?src=\ref[src];secrecordadd=`'>\[Add comment\]</a>\n"
msg += "<span class = 'deptradio'>Physical status:</span> <a href='?src=\ref[src];medical=1'>\[[medical]\]</a>\n"
msg += "<span class = 'deptradio'>Medical records:</span> <a href='?src=\ref[src];medrecord=`'>\[View\]</a> <a href='?src=\ref[src];medrecordadd=`'>\[Add comment\]</a>\n"
if(hasHUD(usr,"medical"))
var/perpname = "wot"
var/medical = "None"
if(wear_id)
if(istype(wear_id,/obj/item/weapon/card/id))
perpname = wear_id:registered_name
else if(istype(wear_id,/obj/item/device/pda))
var/obj/item/device/pda/tempPda = wear_id
perpname = tempPda.owner
else
perpname = src.name
for (var/datum/data/record/E in data_core.general)
if (E.fields["name"] == perpname)
for (var/datum/data/record/R in data_core.general)
if (R.fields["id"] == E.fields["id"])
medical = R.fields["p_stat"]
msg += "<span class = 'deptradio'>Physical status:</span> <a href='?src=\ref[src];medical=1'>\[[medical]\]</a>\n"
msg += "<span class = 'deptradio'>Medical records:</span> <a href='?src=\ref[src];medrecord=`'>\[View\]</a> <a href='?src=\ref[src];medrecordadd=`'>\[Add comment\]</a>\n"
if(print_flavor_text()) msg += "[print_flavor_text()]\n"
@@ -451,3 +442,26 @@
msg += "\n[t_He] is [pose]"
usr << msg
//Helper procedure. Called by /mob/living/carbon/human/examine() and /mob/living/carbon/human/Topic() to determine HUD access to security and medical records.
/proc/hasHUD(mob/M as mob, hudtype)
if(istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
switch(hudtype)
if("security")
return istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.glasses, /obj/item/clothing/glasses/sunglasses/sechud)
if("medical")
return istype(H.glasses, /obj/item/clothing/glasses/hud/health)
else
return 0
else if(istype(M, /mob/living/silicon/robot))
var/mob/living/silicon/robot/R = M
switch(hudtype)
if("security")
return istype(R.module_state_1, /obj/item/borg/sight/hud/sec) || istype(R.module_state_2, /obj/item/borg/sight/hud/sec) || istype(R.module_state_3, /obj/item/borg/sight/hud/sec)
if("medical")
return istype(R.module_state_1, /obj/item/borg/sight/hud/med) || istype(R.module_state_2, /obj/item/borg/sight/hud/med) || istype(R.module_state_3, /obj/item/borg/sight/hud/med)
else
return 0
else
return 0
+342 -239
View File
@@ -45,7 +45,7 @@
if(istype(tmob, /mob/living/carbon/human))
for(var/mob/M in range(tmob, 1))
if( ((M.pulling == tmob && ( tmob.restrained() && !( M.restrained() ) && M.stat == 0)) || locate(/obj/item/weapon/grab, tmob.grabbed_by.len)) )
if(tmob.pinned.len || ((M.pulling == tmob && ( tmob.restrained() && !( M.restrained() ) && M.stat == 0)) || locate(/obj/item/weapon/grab, tmob.grabbed_by.len)) )
if ( !(world.time % 5) )
src << "\red [tmob] is restrained, you cannot push past"
now_pushing = 0
@@ -499,267 +499,258 @@
return
if (href_list["criminal"])
if(istype(usr, /mob/living/carbon/human))
var/mob/living/carbon/human/H = usr
if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.glasses, /obj/item/clothing/glasses/sunglasses/sechud))
if(hasHUD(usr,"security"))
/* // Uncomment if you want sechuds to need security access
var/allowed_access = 0
if(H.wear_id)
var/list/access = H.wear_id.GetAccess()
if(access_security in access)
allowed_access = 1
return
if(!allowed_access)
H << "<span class='warning'>ERROR: Invalid Access</span>"
return
*/
var/modified = 0
var/perpname = "wot"
if(wear_id)
var/obj/item/weapon/card/id/I = wear_id.GetID()
if(I)
perpname = I.registered_name
else
perpname = name
var/modified = 0
var/perpname = "wot"
if(wear_id)
var/obj/item/weapon/card/id/I = wear_id.GetID()
if(I)
perpname = I.registered_name
else
perpname = name
else
perpname = name
if(perpname)
for (var/datum/data/record/E in data_core.general)
if (E.fields["name"] == perpname)
for (var/datum/data/record/R in data_core.security)
if (R.fields["id"] == E.fields["id"])
var/setcriminal = input(usr, "Specify a new criminal status for this person.", "Security HUD", R.fields["criminal"]) in list("None", "*Arrest*", "Incarcerated", "Parolled", "Released", "Cancel")
if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.glasses, /obj/item/clothing/glasses/sunglasses/sechud))
if(setcriminal != "Cancel")
R.fields["criminal"] = setcriminal
modified = 1
spawn()
H.handle_regular_hud_updates()
if(!modified)
usr << "\red Unable to locate a data core entry for this person."
if (href_list["secrecord"])
if(istype(usr, /mob/living/carbon/human))
var/mob/living/carbon/human/H = usr
if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.glasses, /obj/item/clothing/glasses/sunglasses/sechud))
var/perpname = "wot"
var/read = 0
if(wear_id)
if(istype(wear_id,/obj/item/weapon/card/id))
perpname = wear_id:registered_name
else if(istype(wear_id,/obj/item/device/pda))
var/obj/item/device/pda/tempPda = wear_id
perpname = tempPda.owner
else
perpname = src.name
if(perpname)
for (var/datum/data/record/E in data_core.general)
if (E.fields["name"] == perpname)
for (var/datum/data/record/R in data_core.security)
if (R.fields["id"] == E.fields["id"])
if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.glasses, /obj/item/clothing/glasses/sunglasses/sechud))
usr << "<b>Name:</b> [R.fields["name"]] <b>Criminal Status:</b> [R.fields["criminal"]]"
usr << "<b>Minor Crimes:</b> [R.fields["mi_crim"]]"
usr << "<b>Details:</b> [R.fields["mi_crim_d"]]"
usr << "<b>Major Crimes:</b> [R.fields["ma_crim"]]"
usr << "<b>Details:</b> [R.fields["ma_crim_d"]]"
usr << "<b>Notes:</b> [R.fields["notes"]]"
usr << "<a href='?src=\ref[src];secrecordComment=`'>\[View Comment Log\]</a>"
read = 1
if(!read)
usr << "\red Unable to locate a data core entry for this person."
var/setcriminal = input(usr, "Specify a new criminal status for this person.", "Security HUD", R.fields["criminal"]) in list("None", "*Arrest*", "Incarcerated", "Parolled", "Released", "Cancel")
if (href_list["secrecordComment"])
if(istype(usr, /mob/living/carbon/human))
var/mob/living/carbon/human/H = usr
if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.glasses, /obj/item/clothing/glasses/sunglasses/sechud))
var/perpname = "wot"
var/read = 0
if(wear_id)
if(istype(wear_id,/obj/item/weapon/card/id))
perpname = wear_id:registered_name
else if(istype(wear_id,/obj/item/device/pda))
var/obj/item/device/pda/tempPda = wear_id
perpname = tempPda.owner
else
perpname = src.name
for (var/datum/data/record/E in data_core.general)
if (E.fields["name"] == perpname)
for (var/datum/data/record/R in data_core.security)
if (R.fields["id"] == E.fields["id"])
if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.glasses, /obj/item/clothing/glasses/sunglasses/sechud))
read = 1
var/counter = 1
while(R.fields[text("com_[]", counter)])
usr << text("[]", R.fields[text("com_[]", counter)])
counter++
if (counter == 1)
usr << "No comment found"
usr << "<a href='?src=\ref[src];secrecordadd=`'>\[Add comment\]</a>"
if(!read)
usr << "\red Unable to locate a data core entry for this person."
if (href_list["secrecordadd"])
if(istype(usr, /mob/living/carbon/human))
var/mob/living/carbon/human/H = usr
if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.glasses, /obj/item/clothing/glasses/sunglasses/sechud))
var/perpname = "wot"
if(wear_id)
if(istype(wear_id,/obj/item/weapon/card/id))
perpname = wear_id:registered_name
else if(istype(wear_id,/obj/item/device/pda))
var/obj/item/device/pda/tempPda = wear_id
perpname = tempPda.owner
else
perpname = src.name
for (var/datum/data/record/E in data_core.general)
if (E.fields["name"] == perpname)
for (var/datum/data/record/R in data_core.security)
if (R.fields["id"] == E.fields["id"])
if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.glasses, /obj/item/clothing/glasses/sunglasses/sechud))
var/t1 = copytext(sanitize(input("Add Comment:", "Sec. records", null, null) as message),1,MAX_MESSAGE_LEN)
if ((!( t1 ) || src.stat || src.restrained() || !(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.glasses, /obj/item/clothing/glasses/sunglasses/sechud))))
return
var/counter = 1
while(R.fields[text("com_[]", counter)])
counter++
R.fields[text("com_[]", counter)] = text("Made by [] ([]) on [], 2053<BR>[]",H.get_authentification_name(), H.get_assignment(), time2text(world.realtime, "DDD MMM DD hh:mm:ss"), t1)
if (href_list["medical"])
if(istype(usr, /mob/living/carbon/human))
var/mob/living/carbon/human/H = usr
if(istype(H.glasses, /obj/item/clothing/glasses/hud/health))
var/perpname = "wot"
var/modified = 0
if(wear_id)
if(istype(wear_id,/obj/item/weapon/card/id))
perpname = wear_id:registered_name
else if(istype(wear_id,/obj/item/device/pda))
var/obj/item/device/pda/tempPda = wear_id
perpname = tempPda.owner
else
perpname = src.name
for (var/datum/data/record/E in data_core.general)
if (E.fields["name"] == perpname)
for (var/datum/data/record/R in data_core.general)
if (R.fields["id"] == E.fields["id"])
var/setmedical = input(usr, "Specify a new medical status for this person.", "Medical HUD", R.fields["p_stat"]) in list("*Deceased*", "*Unconscious*", "Physically Unfit", "Active", "Cancel")
if(istype(H.glasses, /obj/item/clothing/glasses/hud/health))
if(setmedical != "Cancel")
R.fields["p_stat"] = setmedical
if(hasHUD(usr, "security"))
if(setcriminal != "Cancel")
R.fields["criminal"] = setcriminal
modified = 1
spawn()
H.handle_regular_hud_updates()
if(istype(usr,/mob/living/carbon/human))
var/mob/living/carbon/human/U = usr
U.handle_regular_hud_updates()
if(istype(usr,/mob/living/silicon/robot))
var/mob/living/silicon/robot/U = usr
U.handle_regular_hud_updates()
if(!modified)
usr << "\red Unable to locate a data core entry for this person."
if(!modified)
usr << "\red Unable to locate a data core entry for this person."
if (href_list["secrecord"])
if(hasHUD(usr,"security"))
var/perpname = "wot"
var/read = 0
if(wear_id)
if(istype(wear_id,/obj/item/weapon/card/id))
perpname = wear_id:registered_name
else if(istype(wear_id,/obj/item/device/pda))
var/obj/item/device/pda/tempPda = wear_id
perpname = tempPda.owner
else
perpname = src.name
for (var/datum/data/record/E in data_core.general)
if (E.fields["name"] == perpname)
for (var/datum/data/record/R in data_core.security)
if (R.fields["id"] == E.fields["id"])
if(hasHUD(usr,"security"))
usr << "<b>Name:</b> [R.fields["name"]] <b>Criminal Status:</b> [R.fields["criminal"]]"
usr << "<b>Minor Crimes:</b> [R.fields["mi_crim"]]"
usr << "<b>Details:</b> [R.fields["mi_crim_d"]]"
usr << "<b>Major Crimes:</b> [R.fields["ma_crim"]]"
usr << "<b>Details:</b> [R.fields["ma_crim_d"]]"
usr << "<b>Notes:</b> [R.fields["notes"]]"
usr << "<a href='?src=\ref[src];secrecordComment=`'>\[View Comment Log\]</a>"
read = 1
if(!read)
usr << "\red Unable to locate a data core entry for this person."
if (href_list["secrecordComment"])
if(hasHUD(usr,"security"))
var/perpname = "wot"
var/read = 0
if(wear_id)
if(istype(wear_id,/obj/item/weapon/card/id))
perpname = wear_id:registered_name
else if(istype(wear_id,/obj/item/device/pda))
var/obj/item/device/pda/tempPda = wear_id
perpname = tempPda.owner
else
perpname = src.name
for (var/datum/data/record/E in data_core.general)
if (E.fields["name"] == perpname)
for (var/datum/data/record/R in data_core.security)
if (R.fields["id"] == E.fields["id"])
if(hasHUD(usr,"security"))
read = 1
var/counter = 1
while(R.fields[text("com_[]", counter)])
usr << text("[]", R.fields[text("com_[]", counter)])
counter++
if (counter == 1)
usr << "No comment found"
usr << "<a href='?src=\ref[src];secrecordadd=`'>\[Add comment\]</a>"
if(!read)
usr << "\red Unable to locate a data core entry for this person."
if (href_list["secrecordadd"])
if(hasHUD(usr,"security"))
var/perpname = "wot"
if(wear_id)
if(istype(wear_id,/obj/item/weapon/card/id))
perpname = wear_id:registered_name
else if(istype(wear_id,/obj/item/device/pda))
var/obj/item/device/pda/tempPda = wear_id
perpname = tempPda.owner
else
perpname = src.name
for (var/datum/data/record/E in data_core.general)
if (E.fields["name"] == perpname)
for (var/datum/data/record/R in data_core.security)
if (R.fields["id"] == E.fields["id"])
if(hasHUD(usr,"security"))
var/t1 = copytext(sanitize(input("Add Comment:", "Sec. records", null, null) as message),1,MAX_MESSAGE_LEN)
if ( !(t1) || usr.stat || usr.restrained() || !(hasHUD(usr,"security")) )
return
var/counter = 1
while(R.fields[text("com_[]", counter)])
counter++
if(istype(usr,/mob/living/carbon/human))
var/mob/living/carbon/human/U = usr
R.fields[text("com_[counter]")] = text("Made by [U.get_authentification_name()] ([U.get_assignment()]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], 2557<BR>[t1]")
if(istype(usr,/mob/living/silicon/robot))
var/mob/living/silicon/robot/U = usr
R.fields[text("com_[counter]")] = text("Made by [U.name] ([U.braintype]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], 2557<BR>[t1]")
if (href_list["medical"])
if(hasHUD(usr,"medical"))
var/perpname = "wot"
var/modified = 0
if(wear_id)
if(istype(wear_id,/obj/item/weapon/card/id))
perpname = wear_id:registered_name
else if(istype(wear_id,/obj/item/device/pda))
var/obj/item/device/pda/tempPda = wear_id
perpname = tempPda.owner
else
perpname = src.name
for (var/datum/data/record/E in data_core.general)
if (E.fields["name"] == perpname)
for (var/datum/data/record/R in data_core.general)
if (R.fields["id"] == E.fields["id"])
var/setmedical = input(usr, "Specify a new medical status for this person.", "Medical HUD", R.fields["p_stat"]) in list("*Deceased*", "*Unconscious*", "Physically Unfit", "Active", "Cancel")
if(hasHUD(usr,"medical"))
if(setmedical != "Cancel")
R.fields["p_stat"] = setmedical
modified = 1
spawn()
if(istype(usr,/mob/living/carbon/human))
var/mob/living/carbon/human/U = usr
U.handle_regular_hud_updates()
if(istype(usr,/mob/living/silicon/robot))
var/mob/living/silicon/robot/U = usr
U.handle_regular_hud_updates()
if(!modified)
usr << "\red Unable to locate a data core entry for this person."
if (href_list["medrecord"])
if(istype(usr, /mob/living/carbon/human))
var/mob/living/carbon/human/H = usr
if(istype(H.glasses, /obj/item/clothing/glasses/hud/health))
var/perpname = "wot"
var/read = 0
if(hasHUD(usr,"medical"))
var/perpname = "wot"
var/read = 0
if(wear_id)
if(istype(wear_id,/obj/item/weapon/card/id))
perpname = wear_id:registered_name
else if(istype(wear_id,/obj/item/device/pda))
var/obj/item/device/pda/tempPda = wear_id
perpname = tempPda.owner
else
perpname = src.name
for (var/datum/data/record/E in data_core.general)
if (E.fields["name"] == perpname)
for (var/datum/data/record/R in data_core.medical)
if (R.fields["id"] == E.fields["id"])
if(istype(H.glasses, /obj/item/clothing/glasses/hud/health))
usr << "<b>Name:</b> [R.fields["name"]] <b>Blood Type:</b> [R.fields["b_type"]]"
usr << "<b>DNA:</b> [R.fields["b_dna"]]"
usr << "<b>Minor Disabilities:</b> [R.fields["mi_dis"]]"
usr << "<b>Details:</b> [R.fields["mi_dis_d"]]"
usr << "<b>Major Disabilities:</b> [R.fields["ma_dis"]]"
usr << "<b>Details:</b> [R.fields["ma_dis_d"]]"
usr << "<b>Notes:</b> [R.fields["notes"]]"
usr << "<a href='?src=\ref[src];medrecordComment=`'>\[View Comment Log\]</a>"
read = 1
if(wear_id)
if(istype(wear_id,/obj/item/weapon/card/id))
perpname = wear_id:registered_name
else if(istype(wear_id,/obj/item/device/pda))
var/obj/item/device/pda/tempPda = wear_id
perpname = tempPda.owner
else
perpname = src.name
for (var/datum/data/record/E in data_core.general)
if (E.fields["name"] == perpname)
for (var/datum/data/record/R in data_core.medical)
if (R.fields["id"] == E.fields["id"])
if(hasHUD(usr,"medical"))
usr << "<b>Name:</b> [R.fields["name"]] <b>Blood Type:</b> [R.fields["b_type"]]"
usr << "<b>DNA:</b> [R.fields["b_dna"]]"
usr << "<b>Minor Disabilities:</b> [R.fields["mi_dis"]]"
usr << "<b>Details:</b> [R.fields["mi_dis_d"]]"
usr << "<b>Major Disabilities:</b> [R.fields["ma_dis"]]"
usr << "<b>Details:</b> [R.fields["ma_dis_d"]]"
usr << "<b>Notes:</b> [R.fields["notes"]]"
usr << "<a href='?src=\ref[src];medrecordComment=`'>\[View Comment Log\]</a>"
read = 1
if(!read)
usr << "\red Unable to locate a data core entry for this person."
if(!read)
usr << "\red Unable to locate a data core entry for this person."
if (href_list["medrecordComment"])
if(istype(usr, /mob/living/carbon/human))
var/mob/living/carbon/human/H = usr
if(istype(H.glasses, /obj/item/clothing/glasses/hud/health))
var/perpname = "wot"
var/read = 0
if(hasHUD(usr,"medical"))
var/perpname = "wot"
var/read = 0
if(wear_id)
if(istype(wear_id,/obj/item/weapon/card/id))
perpname = wear_id:registered_name
else if(istype(wear_id,/obj/item/device/pda))
var/obj/item/device/pda/tempPda = wear_id
perpname = tempPda.owner
else
perpname = src.name
for (var/datum/data/record/E in data_core.general)
if (E.fields["name"] == perpname)
for (var/datum/data/record/R in data_core.medical)
if (R.fields["id"] == E.fields["id"])
if(istype(H.glasses, /obj/item/clothing/glasses/hud/health))
read = 1
var/counter = 1
while(R.fields[text("com_[]", counter)])
usr << text("[]", R.fields[text("com_[]", counter)])
counter++
if (counter == 1)
usr << "No comment found"
usr << "<a href='?src=\ref[src];medrecordadd=`'>\[Add comment\]</a>"
if(wear_id)
if(istype(wear_id,/obj/item/weapon/card/id))
perpname = wear_id:registered_name
else if(istype(wear_id,/obj/item/device/pda))
var/obj/item/device/pda/tempPda = wear_id
perpname = tempPda.owner
else
perpname = src.name
for (var/datum/data/record/E in data_core.general)
if (E.fields["name"] == perpname)
for (var/datum/data/record/R in data_core.medical)
if (R.fields["id"] == E.fields["id"])
if(hasHUD(usr,"medical"))
read = 1
var/counter = 1
while(R.fields[text("com_[]", counter)])
usr << text("[]", R.fields[text("com_[]", counter)])
counter++
if (counter == 1)
usr << "No comment found"
usr << "<a href='?src=\ref[src];medrecordadd=`'>\[Add comment\]</a>"
if(!read)
usr << "\red Unable to locate a data core entry for this person."
if(!read)
usr << "\red Unable to locate a data core entry for this person."
if (href_list["medrecordadd"])
if(istype(usr, /mob/living/carbon/human))
var/mob/living/carbon/human/H = usr
if(istype(H.glasses, /obj/item/clothing/glasses/hud/health))
var/perpname = "wot"
if(wear_id)
if(istype(wear_id,/obj/item/weapon/card/id))
perpname = wear_id:registered_name
else if(istype(wear_id,/obj/item/device/pda))
var/obj/item/device/pda/tempPda = wear_id
perpname = tempPda.owner
else
perpname = src.name
for (var/datum/data/record/E in data_core.general)
if (E.fields["name"] == perpname)
for (var/datum/data/record/R in data_core.medical)
if (R.fields["id"] == E.fields["id"])
if(istype(H.glasses, /obj/item/clothing/glasses/hud/health))
var/t1 = copytext(sanitize(input("Add Comment:", "Med. records", null, null) as message),1,MAX_MESSAGE_LEN)
if ((!( t1 ) || src.stat || src.restrained() || !(istype(H.glasses, /obj/item/clothing/glasses/hud/health))))
return
var/counter = 1
while(R.fields[text("com_[]", counter)])
counter++
R.fields[text("com_[]", counter)] = text("Made by [] ([]) on [], 2053<BR>[]",H.get_authentification_name(), H.get_assignment(), time2text(world.realtime, "DDD MMM DD hh:mm:ss"), t1)
if(hasHUD(usr,"medical"))
var/perpname = "wot"
if(wear_id)
if(istype(wear_id,/obj/item/weapon/card/id))
perpname = wear_id:registered_name
else if(istype(wear_id,/obj/item/device/pda))
var/obj/item/device/pda/tempPda = wear_id
perpname = tempPda.owner
else
perpname = src.name
for (var/datum/data/record/E in data_core.general)
if (E.fields["name"] == perpname)
for (var/datum/data/record/R in data_core.medical)
if (R.fields["id"] == E.fields["id"])
if(hasHUD(usr,"medical"))
var/t1 = copytext(sanitize(input("Add Comment:", "Med. records", null, null) as message),1,MAX_MESSAGE_LEN)
if ( !(t1) || usr.stat || usr.restrained() || !(hasHUD(usr,"medical")) )
return
var/counter = 1
while(R.fields[text("com_[]", counter)])
counter++
if(istype(usr,/mob/living/carbon/human))
var/mob/living/carbon/human/U = usr
R.fields[text("com_[counter]")] = text("Made by [U.get_authentification_name()] ([U.get_assignment()]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], 2557<BR>[t1]")
if(istype(usr,/mob/living/silicon/robot))
var/mob/living/silicon/robot/U = usr
R.fields[text("com_[counter]")] = text("Made by [U.name] ([U.braintype]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], 2557<BR>[t1]")
..()
return
@@ -817,6 +808,8 @@
return "Mobile vegetation"
if("golem")
return "Animated Construct"
if("kidan")
return "Kidan"
else
return "Human"
@@ -829,7 +822,9 @@
else if(src.dna.mutantrace == "tajaran")
return "Tajaran"
else if(src.dna.mutantrace == "vox")
return "vox"
return "Vox"
else if(src.dna.mutantrace == "kidan")
return "Kidan"
/mob/living/carbon/proc/update_mutantrace_languages()
if(src.dna)
@@ -841,6 +836,8 @@
src.tajaran_talk_understand = 1
else if(src.dna.mutantrace == "vox")
src.vox_talk_understand = 1
else if(src.dna.mutantrace == "kidan")
src.kidan_talk_understand = 1
/mob/living/carbon/human/proc/play_xylophone()
if(!src.xylophone)
@@ -1116,3 +1113,109 @@
if(istype(feet_blood_DNA, /list) && feet_blood_DNA.len)
del(feet_blood_DNA)
return 1
mob/living/carbon/human/yank_out_object()
set category = "Object"
set name = "Yank out object"
set desc = "Remove an embedded item at the cost of bleeding and pain."
set src in view(1)
if(!isliving(usr) || usr.next_move > world.time)
return
usr.next_move = world.time + 20
if(usr.stat == 1)
usr << "You are unconcious and cannot do that!"
return
if(usr.restrained())
usr << "You are restrained and cannot do that!"
return
var/list/valid_objects = list()
var/datum/organ/external/affected = null
var/mob/living/carbon/human/S = src
var/mob/living/carbon/human/U = usr
var/self = null
if(S == U)
self = 1 // Removing object from yourself.
valid_objects = get_visible_implants(1)
if(!valid_objects.len)
if(self)
src << "You have nothing stuck in your wounds that is large enough to remove without surgery."
else
U << "[src] has nothing stuck in their wounds that is large enough to remove without surgery."
return
var/obj/item/weapon/selection = input("What do you want to yank out?", "Embedded objects") in valid_objects
for(var/datum/organ/external/organ in organs) //Grab the organ holding the implant.
for(var/obj/item/weapon/O in organ.implants)
if(O == selection)
affected = organ
if(self)
src << "<span class='warning'>You attempt to get a good grip on the [selection] in your [affected.display_name] with bloody fingers.</span>"
else
U << "<span class='warning'>You attempt to get a good grip on the [selection] in [S]'s [affected.display_name] with bloody fingers.</span>"
if(istype(U,/mob/living/carbon/human/)) U.bloody_hands(S)
if(!do_after(U, 80))
return
if(!selection || !affected || !S || !U)
return
if(self)
visible_message("<span class='warning'><b>[src] rips [selection] out of their [affected.display_name] in a welter of blood.</b></span>","<span class='warning'><b>You rip [selection] out of your [affected] in a welter of blood.</b></span>")
else
visible_message("<span class='warning'><b>[usr] rips [selection] out of [src]'s [affected.display_name] in a welter of blood.</b></span>","<span class='warning'><b>[usr] rips [selection] out of your [affected] in a welter of blood.</b></span>")
selection.loc = get_turf(src)
affected.implants -= selection
shock_stage+=10
for(var/obj/item/weapon/O in pinned)
if(O == selection)
pinned -= O
if(!pinned.len)
anchored = 0
if(prob(10)) //I'M SO ANEMIC I COULD JUST -DIE-.
var/datum/wound/internal_bleeding/I = new (15)
affected.wounds += I
custom_pain("Something tears wetly in your [affected] as [selection] is pulled free!", 1)
return 1
/mob/living/carbon/human/proc/get_visible_implants(var/class = 0)
var/list/visible_implants = list()
for(var/datum/organ/external/organ in src.organs)
for(var/obj/item/weapon/O in organ.implants)
if(!istype(O,/obj/item/weapon/implant) && O.w_class > class)
visible_implants += O
return(visible_implants)
/mob/living/carbon/human/proc/handle_embedded_objects()
for(var/datum/organ/external/organ in src.organs)
for(var/obj/item/weapon/O in organ.implants)
if(!istype(O,/obj/item/weapon/implant) && prob(5)) //Moving with things stuck in you could be bad.
// All kinds of embedded objects cause bleeding.
var/msg = null
switch(rand(1,3))
if(1)
msg ="<span class='warning'>A spike of pain jolts your [organ.display_name] as you bump [O] inside.</span>"
if(2)
msg ="<span class='warning'>Your movement jostles [O] in your [organ.display_name] painfully.</span>"
if(3)
msg ="<span class='warning'>[O] in your [organ.display_name] twists painfully as you move.</span>"
src << msg
organ.status |= ORGAN_BLEEDING
organ.take_damage(rand(1,3), 0, 0)
src.adjustToxLoss(rand(1,3))
@@ -190,7 +190,9 @@
zone = "head"
return organs_by_name[zone]
/mob/living/carbon/human/apply_damage(var/damage = 0,var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/sharp = 0, var/used_weapon = null)
/mob/living/carbon/human/apply_damage(var/damage = 0,var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/sharp = 0, var/obj/used_weapon = null)
//visible_message("Hit debug. [damage] | [damagetype] | [def_zone] | [blocked] | [sharp] | [used_weapon]")
if((damagetype != BRUTE) && (damagetype != BURN))
..(damage, damagetype, def_zone, blocked)
return 1
@@ -219,6 +221,29 @@
UpdateDamageIcon()
// Will set our damageoverlay icon to the next level, which will then be set back to the normal level the next mob.Life().
updatehealth()
return 1
//Embedded projectile code.
if(!organ) return
if(istype(used_weapon,/obj/item/weapon))
var/obj/item/weapon/W = used_weapon //Sharp objects will always embed if they do enough damage.
if( (damage > (10*W.w_class)) && ( (sharp && !ismob(W.loc)) || prob(damage/W.w_class) ) )
organ.implants += W
visible_message("<span class='danger'>\The [W] sticks in the wound!</span>")
W.add_blood(src)
if(ismob(W.loc))
var/mob/living/H = W.loc
H.drop_item()
W.loc = src
else if(istype(used_weapon,/obj/item/projectile)) //We don't want to use the actual projectile item, so we spawn some shrapnel.
if(prob(75) && damagetype == BRUTE)
var/obj/item/projectile/P = used_weapon
var/obj/item/weapon/shard/shrapnel/S = new()
S.name = "[P.name] shrapnel"
S.desc = "[S.desc] It looks like it was fired from [P.shot_from]."
S.loc = src
organ.implants += S
visible_message("<span class='danger'>The projectile sticks in the wound!</span>")
S.add_blood(src)
return 1
@@ -23,6 +23,8 @@ emp_act
if(C.body_parts_covered & select_area.body_part) // Is that body part being targeted covered?
P.agony=P.agony*C.siemens_coefficient
apply_effect(P.agony,AGONY,0)
flash_pain()
src <<"\red You have been shot!"
del P
/* Commenting out new-old taser nerf.
if(C.siemens_coefficient == 0) //If so, is that clothing shock proof?
@@ -41,7 +43,7 @@ emp_act
// END TASER NERF
if(wear_suit && istype(wear_suit, /obj/item/clothing/suit/armor/laserproof))
if(istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam))
if(istype(P, /obj/item/projectile/energy) || !(istype(P, /obj/item/projectile/energy/electrode)) || istype(P, /obj/item/projectile/beam))
var/reflectchance = 40 - round(P.damage/3)
if(!(def_zone in list("chest", "groin")))
reflectchance /= 2
@@ -161,6 +163,17 @@ emp_act
if((user != src) && check_shields(I.force, "the [I.name]"))
return 0
if(istype(I,/obj/item/weapon/card/emag))
if(!(affecting.status & ORGAN_ROBOT))
user << "\red That limb isn't robotic."
return
if(affecting.sabotaged)
user << "\red [src]'s [affecting.display_name] is already sabotaged!"
else
user << "\red You sneakily slide [I] into the dataport on [src]'s [affecting.display_name] and short out the safeties."
affecting.sabotaged = 1
return
if(I.attack_verb.len)
visible_message("\red <B>[src] has been [pick(I.attack_verb)] in the [hit_area] with [I.name] by [user]!</B>")
else
@@ -170,7 +183,7 @@ emp_act
if(armor >= 2) return 0
if(!I.force) return 0
apply_damage(I.force, I.damtype, affecting, armor , is_sharp(I), I.name)
apply_damage(I.force, I.damtype, affecting, armor , is_sharp(I), I)
var/bloody = 0
if(((I.damtype == BRUTE) || (I.damtype == HALLOSS)) && prob(25 + (I.force * 2)))
@@ -7,6 +7,8 @@
if (istype(loc, /turf/space)) return -1 // It's hard to be slowed down in space by... anything
handle_embedded_objects() //Moving with objects stuck in you can cause bad times.
var/health_deficiency = (100 - health - halloss)
if(health_deficiency >= 40) tally += (health_deficiency / 25)
+9 -9
View File
@@ -470,7 +470,7 @@
reagents.add_reagent("plasma", Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE))
toxins_alert = max(toxins_alert, 1)
else if(O2_pp > vox_oxygen_max && src.dna.mutantrace=="vox") //Oxygen is toxic to vox.
var/ratio = (breath.oxygen/vox_oxygen_max) * 10
var/ratio = (breath.oxygen/vox_oxygen_max) * 1000
adjustToxLoss(Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE))
toxins_alert = max(toxins_alert, 1)
else
@@ -490,7 +490,7 @@
if( (abs(310.15 - breath.temperature) > 50) && !(COLD_RESISTANCE in mutations)) // Hot air hurts :(
if(status_flags & GODMODE) return 1 //godmode
if(breath.temperature < 260.15)
if(breath.temperature < 260.15 && dna.mutantrace != "vox") //Vox are resistant to cold.
if(prob(20))
src << "\red You feel your face freezing and an icicle forming in your lungs!"
else if(breath.temperature > 360.15)
@@ -501,10 +501,10 @@
if(-INFINITY to 120)
apply_damage(COLD_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Cold")
fire_alert = max(fire_alert, 1)
if(120 to 200)
if(120 to 200 && dna.mutantrace != "vox") //Vox are resistant to cold.
apply_damage(COLD_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Cold")
fire_alert = max(fire_alert, 1)
if(200 to 260)
if(200 to 260 && dna.mutantrace != "vox") //Vox are resistant to cold.
apply_damage(COLD_GAS_DAMAGE_LEVEL_1, BURN, "head", used_weapon = "Excessive Cold")
fire_alert = max(fire_alert, 1)
if(360 to 400)
@@ -602,7 +602,7 @@
if(HAZARD_LOW_PRESSURE to WARNING_LOW_PRESSURE)
pressure_alert = -1
else
if( !(COLD_RESISTANCE in mutations) && src.dna.mutantrace!="vox")
if( !(COLD_RESISTANCE in mutations) && src.dna.mutantrace!="vox") //Vox are resistant to pressure loss.
adjustBruteLoss( LOW_PRESSURE_DAMAGE )
pressure_alert = -2
else
@@ -978,10 +978,10 @@
blinded = 1
stat = UNCONSCIOUS
if(halloss > 0)
adjustHalLoss(-6)
adjustHalLoss(-3)
else if(sleeping)
handle_dreams()
adjustHalLoss(-6)
adjustHalLoss(-3)
if (mind)
if((mind.active && client != null) || immune_to_ssd) //This also checks whether a client is connected, if not, sleep is not reduced.
sleeping = max(sleeping-1, 0)
@@ -992,12 +992,12 @@
emote("snore")
else if(resting)
if(halloss > 0)
adjustHalLoss(-6)
adjustHalLoss(-3)
//CONSCIOUS
else
stat = CONSCIOUS
if(halloss > 0)
adjustHalLoss(-2)
adjustHalLoss(-1)
//Eyes
if(sdisabilities & BLIND) //disabled-blind, doesn't get better on its own
@@ -323,7 +323,7 @@ proc/get_damage_icon_part(damage_state, body_part)
stand_icon.Blend(new/icon('icons/mob/human_face.dmi', "lips_[lip_style]_s"), ICON_OVERLAY)
//Underwear
if(underwear >0 && underwear < 12)
if(underwear >0 && underwear < 12 && (src.dna.mutantrace != "vox" && src.dna.mutantrace != "kidan"))
if(!fat && !skeleton)
stand_icon.Blend(new /icon('icons/mob/human.dmi', "underwear[underwear]_[g]_s"), ICON_OVERLAY)
@@ -443,10 +443,12 @@ proc/get_damage_icon_part(damage_state, body_part)
if("skrell")
race_icon = 'icons/mob/human_races/r_skrell.dmi'
deform_icon = 'icons/mob/human_races/r_def_skrell.dmi'
if("vox")
race_icon = 'icons/mob/human_races/r_vox.dmi'
deform_icon = 'icons/mob/human_races/r_def_vox.dmi'
if("kidan")
race_icon = 'icons/mob/human_races/r_kidan.dmi'
deform_icon = 'icons/mob/human_races/r_def_kidan.dmi'
else
race_icon = 'icons/mob/human_races/r_human.dmi'
@@ -723,7 +725,7 @@ proc/get_damage_icon_part(damage_state, body_part)
/mob/living/carbon/human/update_inv_wear_mask(var/update_icons=1)
if( wear_mask && istype(wear_mask, /obj/item/clothing/mask) )
if( wear_mask && ( istype(wear_mask, /obj/item/clothing/mask) || istype(wear_mask, /obj/item/clothing/tie) ) )
wear_mask.screen_loc = ui_mask //TODO
var/image/lying = image("icon" = 'icons/mob/mask.dmi', "icon_state" = "[wear_mask.icon_state]2")
var/image/standing = image("icon" = 'icons/mob/mask.dmi', "icon_state" = "[wear_mask.icon_state]")
+16 -1
View File
@@ -438,21 +438,36 @@
if(!reagents.has_reagent("inaprovaline"))
adjustOxyLoss(1)
Paralyse(3)
if(halloss > 100)
src << "<span class='notice'>You're in too much pain to keep going...</span>"
for(var/mob/O in oviewers(src, null))
O.show_message("<B>[src]</B> slumps to the ground, too weak to continue fighting.", 1)
Paralyse(10)
setHalLoss(99)
if(paralysis)
AdjustParalysis(-1)
blinded = 1
stat = UNCONSCIOUS
if(halloss > 0)
adjustHalLoss(-3)
else if(sleeping)
handle_dreams()
adjustHalLoss(-3)
sleeping = max(sleeping-1, 0)
blinded = 1
stat = UNCONSCIOUS
if( prob(10) && health )
if( prob(10) && health && !hal_crit )
spawn(0)
emote("snore")
else if(resting)
if(halloss > 0)
adjustHalLoss(-3)
//CONSCIOUS
else
stat = CONSCIOUS
if(halloss > 0)
adjustHalLoss(-1)
//Eyes
if(sdisabilities & BLIND) //disabled-blind, doesn't get better on its own
+102 -1
View File
@@ -3,14 +3,115 @@
voice_name = "monkey"
voice_message = "chimpers"
say_message = "chimpers"
icon = 'icons/mob/monkey.dmi'
icon_state = "monkey1"
icon = 'icons/mob/monkey.dmi'
gender = NEUTER
pass_flags = PASSTABLE
update_icon = 0 ///no need to call regenerate_icon
var/obj/item/weapon/card/id/wear_id = null // Fix for station bounced radios -- Skie
/mob/living/carbon/monkey/tajara
name = "farwa"
voice_name = "farwa"
voice_message = "mews"
say_message = "mews"
icon_state = "tajkey1"
/mob/living/carbon/monkey/skrell
name = "neaera"
voice_name = "neaera"
voice_message = "squicks"
say_message = "squicks"
icon_state = "skrellkey1"
/mob/living/carbon/monkey/unathi
name = "stok"
voice_name = "stok"
voice_message = "hisses"
say_message = "hisses"
icon_state = "stokkey1"
/mob/living/carbon/monkey/unathi/New()
var/datum/reagents/R = new/datum/reagents(1000)
reagents = R
R.my_atom = src
if(name == "stok")
name = text("stok ([rand(1, 1000)])")
real_name = name
if (!(dna))
if(gender == NEUTER)
gender = pick(MALE, FEMALE)
dna = new /datum/dna( null )
dna.real_name = real_name
dna.uni_identity = "000000000000000000DC0000066000"
dna.struc_enzymes = "43359156756131E13763334D1C369012032164D4FE4CD61544B6C03F251B6C60A42821D26BA3B0FD6"
dna.unique_enzymes = md5(name)
dna.mutantrace = "lizard"
//////////blah
var/gendervar
if (gender == MALE)
gendervar = add_zero2(num2hex((rand(1,2049)),1), 3)
else
gendervar = add_zero2(num2hex((rand(2051,4094)),1), 3)
dna.uni_identity += gendervar
dna.uni_identity += "044"
dna.uni_identity += "C5D"
..()
/mob/living/carbon/monkey/skrell/New()
var/datum/reagents/R = new/datum/reagents(1000)
reagents = R
R.my_atom = src
if(name == "neaera")
name = text("neaera ([rand(1, 1000)])")
real_name = name
if (!(dna))
if(gender == NEUTER)
gender = pick(MALE, FEMALE)
dna = new /datum/dna( null )
dna.real_name = real_name
dna.uni_identity = "000000000000000000DC0000066000"
dna.struc_enzymes = "43359156756131E13763334D1C369012032164D4FE4CD61544B6C03F251B6C60A42821D26BA3B0FD6"
dna.unique_enzymes = md5(name)
dna.mutantrace = "skrell"
//////////blah
var/gendervar
if (gender == MALE)
gendervar = add_zero2(num2hex((rand(1,2049)),1), 3)
else
gendervar = add_zero2(num2hex((rand(2051,4094)),1), 3)
dna.uni_identity += gendervar
dna.uni_identity += "01C"
dna.uni_identity += "C92"
..()
/mob/living/carbon/monkey/tajara/New()
var/datum/reagents/R = new/datum/reagents(1000)
reagents = R
R.my_atom = src
if(name == "farwa")
name = text("farwa ([rand(1, 1000)])")
real_name = name
if (!(dna))
if(gender == NEUTER)
gender = pick(MALE, FEMALE)
dna = new /datum/dna( null )
dna.real_name = real_name
dna.uni_identity = "000000000000000000DC0000066000"
dna.struc_enzymes = "43359156756131E13763334D1C369012032164D4FE4CD61544B6C03F251B6C60A42821D26BA3B0FD6"
dna.unique_enzymes = md5(name)
dna.mutantrace = "tajaran"
//////////blah
var/gendervar
if (gender == MALE)
gendervar = add_zero2(num2hex((rand(1,2049)),1), 3)
else
gendervar = add_zero2(num2hex((rand(2051,4094)),1), 3)
dna.uni_identity += gendervar
dna.uni_identity += "0A0"
dna.uni_identity += "E00"
..()
/mob/living/carbon/monkey/New()
var/datum/reagents/R = new/datum/reagents(1000)
reagents = R
@@ -28,12 +28,20 @@
update_hud()
lying_prev = lying //so we don't update overlays for lying/standing unless our stance changes again
overlays.Cut()
var/ico = "monkey"
switch(src.dna.mutantrace) //On monkey spawn, check the DNA of the mob. If alien, change to appropriate alien monkey sprite
if("tajaran")
ico = "tajkey"
if("lizard")
ico = "stokkey"
if("skrell")
ico = "skrellkey"
if(lying)
icon_state = "monkey0"
icon_state = ico + "0"
for(var/image/I in overlays_lying)
overlays += I
else
icon_state = "monkey1"
icon_state = ico + "1"
for(var/image/I in overlays_standing)
overlays += I
+2 -2
View File
@@ -28,7 +28,7 @@
return 1
/mob/living/proc/apply_damages(var/brute = 0, var/burn = 0, var/tox = 0, var/oxy = 0, var/clone = 0, var/def_zone = null, var/blocked = 0, var/halloss = 0)
/mob/living/proc/apply_damages(var/brute = 0, var/burn = 0, var/tox = 0, var/oxy = 0, var/clone = 0, var/halloss = 0, var/def_zone = null, var/blocked = 0)
if(blocked >= 2) return 0
if(brute) apply_damage(brute, BRUTE, def_zone, blocked)
if(burn) apply_damage(burn, BURN, def_zone, blocked)
@@ -64,7 +64,7 @@
return 1
/mob/living/proc/apply_effects(var/stun = 0, var/weaken = 0, var/paralyze = 0, var/irradiate = 0, var/stutter = 0, var/eyeblur = 0, var/drowsy = 0, var/blocked = 0, var/agony = 0)
/mob/living/proc/apply_effects(var/stun = 0, var/weaken = 0, var/paralyze = 0, var/irradiate = 0, var/stutter = 0, var/eyeblur = 0, var/drowsy = 0, var/agony = 0, var/blocked = 0)
if(blocked >= 2) return 0
if(stun) apply_effect(stun, STUN, blocked)
if(weaken) apply_effect(weaken, WEAKEN, blocked)
+46 -3
View File
@@ -57,11 +57,11 @@
P.on_hit(src,2)
return 2
if(!P.nodamage)
apply_damage((P.damage/(absorb+1)), P.damage_type, def_zone, used_weapon = "Projectile([P.name])")
apply_damage((P.damage/(absorb+1)), P.damage_type, def_zone, absorb, 0, P)
P.on_hit(src, absorb)
return absorb
/mob/living/hitby(atom/movable/AM as mob|obj)//Standardization and logging -Sieve
/mob/living/hitby(atom/movable/AM as mob|obj,var/speed = 5)//Standardization and logging -Sieve
if(istype(AM,/obj/))
var/obj/O = AM
var/zone = ran_zone("chest",75)//Hits a random part of the body, geared towards the chest
@@ -72,12 +72,55 @@
src.visible_message("\red [src] has been hit by [O].")
var/armor = run_armor_check(zone, "melee", "Your armor has protected your [zone].", "Your armor has softened hit to your [zone].")
if(armor < 2)
apply_damage(O.throwforce, dtype, zone, armor, O)
apply_damage(O.throwforce*(speed/5), dtype, zone, armor, O.sharp, O)
if(!O.fingerprintslast)
return
var/client/assailant = directory[ckey(O.fingerprintslast)]
if(assailant && assailant.mob && istype(assailant.mob,/mob))
var/mob/M = assailant.mob
src.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been hit with [O], last touched by [M.name] ([assailant.ckey])</font>")
M.attack_log += text("\[[time_stamp()]\] <font color='red'>Hit [src.name] ([src.ckey]) with [O]</font>")
log_attack("<font color='red'>[src.name] ([src.ckey]) was hit by [O], last touched by [M.name] ([assailant.ckey])</font>")
// Begin BS12 momentum-transfer code.
if(speed >= 20)
var/obj/item/weapon/W = O
var/momentum = speed/2
var/dir = get_dir(M,src)
visible_message("\red [src] staggers under the impact!","\red You stagger under the impact!")
src.throw_at(get_edge_target_turf(src,dir),1,momentum)
if(istype(W.loc,/mob/living) && W.sharp) //Projectile is embedded and suitable for pinning.
if(!istype(src,/mob/living/carbon/human)) //Handles embedding for non-humans and simple_animals.
O.loc = src
src.embedded += O
var/turf/T = near_wall(dir,2)
if(T)
src.loc = T
visible_message("<span class='warning'>[src] is pinned to the wall by [O]!</span>","<span class='warning'>You are pinned to the wall by [O]!</span>")
src.anchored = 1
src.pinned += O
/mob/living/proc/near_wall(var/direction,var/distance=1)
var/turf/T = get_step(get_turf(src),direction)
var/turf/last_turf = src.loc
var/i = 1
while(i>0 && i<=distance)
if(T.density) //Turf is a wall!
return last_turf
i++
last_turf = T
T = get_step(T,direction)
return 0
// End BS12 momentum-transfer code.
@@ -24,7 +24,6 @@
//Allows mobs to move through dense areas without restriction. For instance, in space or out of holder objects.
var/incorporeal_move = 0 //0 is off, 1 is normal, 2 is for ninjas.
var/t_plasma = null
var/t_oxygen = null
var/t_sl_gas = null
+11 -2
View File
@@ -19,6 +19,7 @@ var/list/department_radio_keys = list(
":j" = "tajaran", "#j" = "tajaran", ".j" = "tajaran",
":o" = "soghun", "#o" = "soghun", ".o" = "soghun",
":v" = "vox", "#v" = "vox", ".v" = "vox",
":q" = "kidan", "#q" = "kidan", ".q" = "kidan",
":R" = "right hand", "#R" = "right hand", ".R" = "right hand",
":L" = "left hand", "#L" = "left hand", ".L" = "left hand",
@@ -39,6 +40,7 @@ var/list/department_radio_keys = list(
":J" = "tajaran", "#J" = "tajaran", ".J" = "tajaran",
":O" = "soghun", "#O" = "soghun", ".O" = "soghun",
":V" = "vox", "#V" = "vox", ".V" = "vox",
":Q" = "kidan", "#Q" = "kidan", ".Q" = "kidan",
//kinda localization -- rastaf0
//same keys as above, but on russian keyboard layout. This file uses cp1251 as encoding.
@@ -188,6 +190,7 @@ var/list/department_radio_keys = list(
var/is_speaking_soghun = 0
var/is_speaking_taj = 0
var/is_speaking_vox = 0
var/is_speaking_kidan = 0
var/is_speaking_radio = 0
switch (message_mode)
@@ -290,6 +293,10 @@ var/list/department_radio_keys = list(
if(vox_talk_understand || universal_speak)
is_speaking_vox = 1
if ("kidan")
if(kidan_talk_understand || universal_speak)
is_speaking_kidan = 1
if("changeling")
if(mind && mind.changeling)
for(var/mob/Changeling in mob_list)
@@ -388,6 +395,8 @@ var/list/department_radio_keys = list(
heard_a += M
else if(is_speaking_vox && (M:vox_talk_understand || M:universal_speak))
heard_a += M
else if(is_speaking_kidan && (M:kidan_talk_understand || M:universal_speak))
heard_a += M
else
heard_b += M
else
@@ -403,7 +412,7 @@ var/list/department_radio_keys = list(
var/rendered = null
if (length(heard_a))
var/message_a = say_quote(message,is_speaking_soghun,is_speaking_skrell,is_speaking_taj,is_speaking_vox)
var/message_a = say_quote(message,is_speaking_soghun,is_speaking_skrell,is_speaking_taj,is_speaking_vox,is_speaking_kidan)
if (italics)
message_a = "<i>[message_a]</i>"
@@ -428,7 +437,7 @@ var/list/department_radio_keys = list(
message_b = voice_message
else
message_b = stars(message)
message_b = say_quote(message_b,is_speaking_soghun,is_speaking_skrell,is_speaking_taj,is_speaking_vox)
message_b = say_quote(message_b,is_speaking_soghun,is_speaking_skrell,is_speaking_taj,is_speaking_vox,is_speaking_kidan)
if (italics)
message_b = "<i>[message_b]</i>"
+43 -47
View File
@@ -31,6 +31,8 @@ var/list/ai_list = list()
var/icon/holo_icon//Default is assigned when AI is created.
var/obj/item/device/pda/ai/aiPDA = null
var/obj/item/device/multitool/aiMulti = null
var/custom_sprite = 0 //For our custom sprites
//Hud stuff
//MALFUNCTION
var/datum/AI_Module/module_picker/malf_picker
@@ -125,55 +127,45 @@ var/list/ai_list = list()
set name = "Set AI Core Display"
if(stat || aiRestorePowerRoutine)
return
if(!custom_sprite) //Check to see if custom sprite time, checking the appopriate file to change a var
var/file = file2text("config/custom_sprites.txt")
var/lines = text2list(file, "\n")
for(var/line in lines)
// split & clean up
var/list/Entry = text2list(line, "-")
for(var/i = 1 to Entry.len)
Entry[i] = trim(Entry[i])
if(Entry.len < 2)
continue;
if(Entry[1] == src.ckey && Entry[2] == src.real_name)
custom_sprite = 1 //They're in the list? Custom sprite time
icon = 'icons/mob/custom-synthetic.dmi'
//if(icon_state == initial(icon_state))
var/icontype = ""
var/list/icons = list("Monochrome", "Blue", "Inverted", "Text", "Smiley", "Angry", "Dorf", "Matrix", "Bliss", "Firewall", "Green", "Red", "Static", "Triumvirate", "Triumvirate Static")
if (src.name == "M00X-BC" && src.ckey == "searif")
icons += "M00X-BC"
if (src.name == "Skuld" && src.ckey == "ravensdale")
icons += "Skuld"
if (src.name == "REMNANT" && src.ckey == "serithi")
icons += "REMNANT"
icontype = input("Please, select a display!", "AI", null/*, null*/) in icons
if(icontype == "Clown")
icon_state = "ai-clown2"
else if(icontype == "Monochrome")
icon_state = "ai-mono"
else if(icontype == "Blue")
icon_state = "ai"
else if(icontype == "Inverted")
icon_state = "ai-u"
else if(icontype == "Firewall")
icon_state = "ai-magma"
else if(icontype == "Green")
icon_state = "ai-wierd"
else if(icontype == "Red")
icon_state = "ai-malf"
else if(icontype == "Static")
icon_state = "ai-static"
else if(icontype == "Text")
icon_state = "ai-text"
else if(icontype == "Smiley")
icon_state = "ai-smiley"
else if(icontype == "Matrix")
icon_state = "ai-matrix"
else if(icontype == "Angry")
icon_state = "ai-angryface"
else if(icontype == "Dorf")
icon_state = "ai-dorf"
else if(icontype == "Bliss")
icon_state = "ai-bliss"
else if(icontype == "M00X-BC")
icon_state = "ai-searif"
else if(icontype == "Triumvirate")
icon_state = "ai-triumvirate"
else if(icontype == "Triumvirate Static")
icon_state = "ai-triumvirate-malf"
else if(icontype == "Skuld")
icon_state = "ai-ravensdale"
else if(icontype == "REMNANT")
icon_state = "ai-serithi"
if (custom_sprite == 1) icontype = ("Custom")//automagically selects custom sprite if one is available
else icontype = input("Select an icon!", "AI", null, null) in list("Monochrome", "Blue", "Inverted", "Text", "Smiley", "Angry", "Dorf", "Matrix", "Bliss", "Firewall", "Green", "Red", "Static", "Triumvirate", "Triumvirate Static")
switch(icontype)
if("Custom") icon_state = "[src.ckey]-ai"
if("Clown") icon_state = "ai-clown2"
if("Monochrome") icon_state = "ai-mono"
if("Inverted") icon_state = "ai-u"
if("Firewall") icon_state = "ai-magma"
if("Green") icon_state = "ai-wierd"
if("Red") icon_state = "ai-red"
if("Static") icon_state = "ai-static"
if("Text") icon_state = "ai-text"
if("Smiley") icon_state = "ai-smiley"
if("Matrix") icon_state = "ai-matrix"
if("Angry") icon_state = "ai-angryface"
if("Dorf") icon_state = "ai-dorf"
if("Bliss") icon_state = "ai-bliss"
if("Triumvirate") icon_state = "ai-triumvirate"
if("Triumvirate Static") icon_state = "ai-triumvirate-malf"
else icon_state = "ai"
//else
//usr <<"You can only change your display once!"
//return
@@ -188,7 +180,7 @@ var/list/ai_list = list()
if (malf.apcs >= 3)
stat(null, "Time until station control secured: [max(malf.AI_win_timeleft/(malf.apcs/3), 0)] seconds")
/mob/living/silicon/ai/proc/ai_alerts()
set category = "AI Commands"
set name = "Show Alerts"
@@ -345,6 +337,10 @@ var/list/ai_list = list()
// src << text ("Switching Law [L]'s report status to []", lawcheck[L+1])
checklaws()
if(href_list["say_word"])
src.announcement(href_list["say_word"])
return
if (href_list["lawi"]) // Toggling whether or not a law gets stated by the State Laws verb --NeoFite
var/L = text2num(href_list["lawi"])
switch(ioncheck[L])
+2 -4
View File
@@ -1,10 +1,8 @@
/mob/living/silicon/ai/death(gibbed)
if(stat == DEAD) return
stat = DEAD
if (src.name == "Skuld" && src.ckey == "ravensdale")//checks ID of AI and player to see if it needs to pull the custom death sprite and goes to blue-screen if it doesn't
icon_state = "ai-ravensdale-crash"
else if (src.name == "REMNANT" && src.ckey == "serithi")
icon_state = "ai-serithi-crash"
if (src.custom_sprite == 1)//check for custom AI sprite, defaulting to blue screen if no.
icon_state = "[ckey]-ai-crash"
else icon_state = "ai-crash"
update_canmove()
if(src.eyeobj)
+693
View File
@@ -27,3 +27,696 @@
return "declares, \"[text]\"";
return "states, \"[text]\"";
var/announcing_vox = 0
var/const/VOX_CHANNEL = 200
var/const/VOX_VOLUME = 75
/mob/living/silicon/ai/verb/announcement_help()
set name = "Announcement Help"
set desc = "Display a list of vocal words to announce to the crew."
set category = "AI Commands"
var/dat = "Here is a list of words you can type into the Announcement button to create sentences to vocally announce.<BR> \
Do not use punctuation as you would normally, if you want a pause you can use the full stop and comma characters by separating them with spaces, like so: 'Alpha . Test , Bravo'.<BR>"
var/index = 0
for(var/word in vox_sounds)
index++
dat += "<A href='?src=\ref[src];say_word=[word]'>[capitalize(word)]</A>"
if(index != vox_sounds.len)
dat += " / "
src << browse(dat, "window=announce_help;size=500x400")
/mob/living/silicon/ai/verb/announcement(var/message as text)
set name = "Announcement"
set desc = "Create a vocal announcement by typing in the available words to create a setence. More help is available in 'Announcement Help'"
set category = "AI Commands"
if(!message)
return
//if(!announcing_vox > world.time)
// return
log_game("[key_name_admin(src)] made a vocal announcement with the following message: [message].")
announcing_vox = world.time + 30
var/list/words = stringsplit(trim(message), " ")
var/list/incorrect_words = list()
if(words.len > 32)
words.len = 32
for(var/word in words)
word = trim(word)
if(!word)
continue
if(!play_vox_word(word, src.z)) // If the word isn't speakable
incorrect_words += word
if(incorrect_words.len)
src << "<span class='notice'>These words are not available on the announcement system: [english_list(incorrect_words)].</span>"
/proc/play_vox_word(var/word, var/z_level)
word = lowertext(word)
if(vox_sounds[word])
var/sound_file = vox_sounds[word]
var/sound/voice = sound(sound_file, wait = 1, channel = VOX_CHANNEL, volume = VOX_VOLUME)
voice.status = SOUND_STREAM
// Play voice for all mobs in the z level
for(var/mob/M in player_list)
if(M.client)
var/turf/T = get_turf(M)
if(T.z == z_level)
M << voice
return 1
return 0
// List is required to compile the resources into the game when it loads.
// Dynamically loading it has bad results with sounds overtaking each other, even with the wait variable.
var/list/vox_sounds = list("," = 'sound/vox/,.wav',
"." = 'sound/vox/..wav',
"a" = 'sound/vox/a.wav',
"accelerating" = 'sound/vox/accelerating.wav',
"accelerator" = 'sound/vox/accelerator.wav',
"accepted" = 'sound/vox/accepted.wav',
"access" = 'sound/vox/access.wav',
"acknowledge" = 'sound/vox/acknowledge.wav',
"acknowledged" = 'sound/vox/acknowledged.wav',
"acquired" = 'sound/vox/acquired.wav',
"acquisition" = 'sound/vox/acquisition.wav',
"across" = 'sound/vox/across.wav',
"activate" = 'sound/vox/activate.wav',
"activated" = 'sound/vox/activated.wav',
"activity" = 'sound/vox/activity.wav',
"adios" = 'sound/vox/adios.wav',
"administration" = 'sound/vox/administration.wav',
"advanced" = 'sound/vox/advanced.wav',
"after" = 'sound/vox/after.wav',
"agent" = 'sound/vox/agent.wav',
"alarm" = 'sound/vox/alarm.wav',
"alert" = 'sound/vox/alert.wav',
"alien" = 'sound/vox/alien.wav',
"aligned" = 'sound/vox/aligned.wav',
"all" = 'sound/vox/all.wav',
"alpha" = 'sound/vox/alpha.wav',
"am" = 'sound/vox/am.wav',
"amigo" = 'sound/vox/amigo.wav',
"ammunition" = 'sound/vox/ammunition.wav',
"an" = 'sound/vox/an.wav',
"and" = 'sound/vox/and.wav',
"announcement" = 'sound/vox/announcement.wav',
"anomalous" = 'sound/vox/anomalous.wav',
"antenna" = 'sound/vox/antenna.wav',
"any" = 'sound/vox/any.wav',
"apprehend" = 'sound/vox/apprehend.wav',
"approach" = 'sound/vox/approach.wav',
"are" = 'sound/vox/are.wav',
"area" = 'sound/vox/area.wav',
"arm" = 'sound/vox/arm.wav',
"armed" = 'sound/vox/armed.wav',
"armor" = 'sound/vox/armor.wav',
"armory" = 'sound/vox/armory.wav',
"arrest" = 'sound/vox/arrest.wav',
"ass" = 'sound/vox/ass.wav',
"at" = 'sound/vox/at.wav',
"atomic" = 'sound/vox/atomic.wav',
"attention" = 'sound/vox/attention.wav',
"authorize" = 'sound/vox/authorize.wav',
"authorized" = 'sound/vox/authorized.wav',
"automatic" = 'sound/vox/automatic.wav',
"away" = 'sound/vox/away.wav',
"b" = 'sound/vox/b.wav',
"back" = 'sound/vox/back.wav',
"backman" = 'sound/vox/backman.wav',
"bad" = 'sound/vox/bad.wav',
"bag" = 'sound/vox/bag.wav',
"bailey" = 'sound/vox/bailey.wav',
"barracks" = 'sound/vox/barracks.wav',
"base" = 'sound/vox/base.wav',
"bay" = 'sound/vox/bay.wav',
"be" = 'sound/vox/be.wav',
"been" = 'sound/vox/been.wav',
"before" = 'sound/vox/before.wav',
"beyond" = 'sound/vox/beyond.wav',
"biohazard" = 'sound/vox/biohazard.wav',
"biological" = 'sound/vox/biological.wav',
"birdwell" = 'sound/vox/birdwell.wav',
"bizwarn" = 'sound/vox/bizwarn.wav',
"black" = 'sound/vox/black.wav',
"blast" = 'sound/vox/blast.wav',
"blocked" = 'sound/vox/blocked.wav',
"bloop" = 'sound/vox/bloop.wav',
"blue" = 'sound/vox/blue.wav',
"bottom" = 'sound/vox/bottom.wav',
"bravo" = 'sound/vox/bravo.wav',
"breach" = 'sound/vox/breach.wav',
"breached" = 'sound/vox/breached.wav',
"break" = 'sound/vox/break.wav',
"bridge" = 'sound/vox/bridge.wav',
"bust" = 'sound/vox/bust.wav',
"but" = 'sound/vox/but.wav',
"button" = 'sound/vox/button.wav',
"buzwarn" = 'sound/vox/buzwarn.wav',
"bypass" = 'sound/vox/bypass.wav',
"c" = 'sound/vox/c.wav',
"cable" = 'sound/vox/cable.wav',
"call" = 'sound/vox/call.wav',
"called" = 'sound/vox/called.wav',
"canal" = 'sound/vox/canal.wav',
"cap" = 'sound/vox/cap.wav',
"captain" = 'sound/vox/captain.wav',
"capture" = 'sound/vox/capture.wav',
"ceiling" = 'sound/vox/ceiling.wav',
"celsius" = 'sound/vox/celsius.wav',
"center" = 'sound/vox/center.wav',
"centi" = 'sound/vox/centi.wav',
"central" = 'sound/vox/central.wav',
"chamber" = 'sound/vox/chamber.wav',
"charlie" = 'sound/vox/charlie.wav',
"check" = 'sound/vox/check.wav',
"checkpoint" = 'sound/vox/checkpoint.wav',
"chemical" = 'sound/vox/chemical.wav',
"cleanup" = 'sound/vox/cleanup.wav',
"clear" = 'sound/vox/clear.wav',
"clearance" = 'sound/vox/clearance.wav',
"close" = 'sound/vox/close.wav',
"code" = 'sound/vox/code.wav',
"coded" = 'sound/vox/coded.wav',
"collider" = 'sound/vox/collider.wav',
"command" = 'sound/vox/command.wav',
"communication" = 'sound/vox/communication.wav',
"complex" = 'sound/vox/complex.wav',
"computer" = 'sound/vox/computer.wav',
"condition" = 'sound/vox/condition.wav',
"containment" = 'sound/vox/containment.wav',
"contamination" = 'sound/vox/contamination.wav',
"control" = 'sound/vox/control.wav',
"coolant" = 'sound/vox/coolant.wav',
"coomer" = 'sound/vox/coomer.wav',
"core" = 'sound/vox/core.wav',
"correct" = 'sound/vox/correct.wav',
"corridor" = 'sound/vox/corridor.wav',
"crew" = 'sound/vox/crew.wav',
"cross" = 'sound/vox/cross.wav',
"cryogenic" = 'sound/vox/cryogenic.wav',
"d" = 'sound/vox/d.wav',
"dadeda" = 'sound/vox/dadeda.wav',
"damage" = 'sound/vox/damage.wav',
"damaged" = 'sound/vox/damaged.wav',
"danger" = 'sound/vox/danger.wav',
"day" = 'sound/vox/day.wav',
"deactivated" = 'sound/vox/deactivated.wav',
"decompression" = 'sound/vox/decompression.wav',
"decontamination" = 'sound/vox/decontamination.wav',
"deeoo" = 'sound/vox/deeoo.wav',
"defense" = 'sound/vox/defense.wav',
"degrees" = 'sound/vox/degrees.wav',
"delta" = 'sound/vox/delta.wav',
"denied" = 'sound/vox/denied.wav',
"deploy" = 'sound/vox/deploy.wav',
"deployed" = 'sound/vox/deployed.wav',
"destroy" = 'sound/vox/destroy.wav',
"destroyed" = 'sound/vox/destroyed.wav',
"detain" = 'sound/vox/detain.wav',
"detected" = 'sound/vox/detected.wav',
"detonation" = 'sound/vox/detonation.wav',
"device" = 'sound/vox/device.wav',
"did" = 'sound/vox/did.wav',
"die" = 'sound/vox/die.wav',
"dimensional" = 'sound/vox/dimensional.wav',
"dirt" = 'sound/vox/dirt.wav',
"disengaged" = 'sound/vox/disengaged.wav',
"dish" = 'sound/vox/dish.wav',
"disposal" = 'sound/vox/disposal.wav',
"distance" = 'sound/vox/distance.wav',
"distortion" = 'sound/vox/distortion.wav',
"do" = 'sound/vox/do.wav',
"doctor" = 'sound/vox/doctor.wav',
"doop" = 'sound/vox/doop.wav',
"door" = 'sound/vox/door.wav',
"down" = 'sound/vox/down.wav',
"dual" = 'sound/vox/dual.wav',
"duct" = 'sound/vox/duct.wav',
"e" = 'sound/vox/e.wav',
"east" = 'sound/vox/east.wav',
"echo" = 'sound/vox/echo.wav',
"ed" = 'sound/vox/ed.wav',
"effect" = 'sound/vox/effect.wav',
"egress" = 'sound/vox/egress.wav',
"eight" = 'sound/vox/eight.wav',
"eighteen" = 'sound/vox/eighteen.wav',
"eighty" = 'sound/vox/eighty.wav',
"electric" = 'sound/vox/electric.wav',
"electromagnetic" = 'sound/vox/electromagnetic.wav',
"elevator" = 'sound/vox/elevator.wav',
"eleven" = 'sound/vox/eleven.wav',
"eliminate" = 'sound/vox/eliminate.wav',
"emergency" = 'sound/vox/emergency.wav',
"energy" = 'sound/vox/energy.wav',
"engage" = 'sound/vox/engage.wav',
"engaged" = 'sound/vox/engaged.wav',
"engine" = 'sound/vox/engine.wav',
"enter" = 'sound/vox/enter.wav',
"entry" = 'sound/vox/entry.wav',
"environment" = 'sound/vox/environment.wav',
"error" = 'sound/vox/error.wav',
"escape" = 'sound/vox/escape.wav',
"evacuate" = 'sound/vox/evacuate.wav',
"exchange" = 'sound/vox/exchange.wav',
"exit" = 'sound/vox/exit.wav',
"expect" = 'sound/vox/expect.wav',
"experiment" = 'sound/vox/experiment.wav',
"experimental" = 'sound/vox/experimental.wav',
"explode" = 'sound/vox/explode.wav',
"explosion" = 'sound/vox/explosion.wav',
"exposure" = 'sound/vox/exposure.wav',
"exterminate" = 'sound/vox/exterminate.wav',
"extinguish" = 'sound/vox/extinguish.wav',
"extinguisher" = 'sound/vox/extinguisher.wav',
"extreme" = 'sound/vox/extreme.wav',
"f" = 'sound/vox/f.wav',
"facility" = 'sound/vox/facility.wav',
"fahrenheit" = 'sound/vox/fahrenheit.wav',
"failed" = 'sound/vox/failed.wav',
"failure" = 'sound/vox/failure.wav',
"farthest" = 'sound/vox/farthest.wav',
"fast" = 'sound/vox/fast.wav',
"feet" = 'sound/vox/feet.wav',
"field" = 'sound/vox/field.wav',
"fifteen" = 'sound/vox/fifteen.wav',
"fifth" = 'sound/vox/fifth.wav',
"fifty" = 'sound/vox/fifty.wav',
"final" = 'sound/vox/final.wav',
"fine" = 'sound/vox/fine.wav',
"fire" = 'sound/vox/fire.wav',
"first" = 'sound/vox/first.wav',
"five" = 'sound/vox/five.wav',
"flooding" = 'sound/vox/flooding.wav',
"floor" = 'sound/vox/floor.wav',
"fool" = 'sound/vox/fool.wav',
"for" = 'sound/vox/for.wav',
"forbidden" = 'sound/vox/forbidden.wav',
"force" = 'sound/vox/force.wav',
"forms" = 'sound/vox/forms.wav',
"found" = 'sound/vox/found.wav',
"four" = 'sound/vox/four.wav',
"fourteen" = 'sound/vox/fourteen.wav',
"fourth" = 'sound/vox/fourth.wav',
"fourty" = 'sound/vox/fourty.wav',
"foxtrot" = 'sound/vox/foxtrot.wav',
"freeman" = 'sound/vox/freeman.wav',
"freezer" = 'sound/vox/freezer.wav',
"from" = 'sound/vox/from.wav',
"front" = 'sound/vox/front.wav',
"fuel" = 'sound/vox/fuel.wav',
"g" = 'sound/vox/g.wav',
"get" = 'sound/vox/get.wav',
"go" = 'sound/vox/go.wav',
"going" = 'sound/vox/going.wav',
"good" = 'sound/vox/good.wav',
"goodbye" = 'sound/vox/goodbye.wav',
"gordon" = 'sound/vox/gordon.wav',
"got" = 'sound/vox/got.wav',
"government" = 'sound/vox/government.wav',
"granted" = 'sound/vox/granted.wav',
"great" = 'sound/vox/great.wav',
"green" = 'sound/vox/green.wav',
"grenade" = 'sound/vox/grenade.wav',
"guard" = 'sound/vox/guard.wav',
"gulf" = 'sound/vox/gulf.wav',
"gun" = 'sound/vox/gun.wav',
"guthrie" = 'sound/vox/guthrie.wav',
"handling" = 'sound/vox/handling.wav',
"hangar" = 'sound/vox/hangar.wav',
"has" = 'sound/vox/has.wav',
"have" = 'sound/vox/have.wav',
"hazard" = 'sound/vox/hazard.wav',
"head" = 'sound/vox/head.wav',
"health" = 'sound/vox/health.wav',
"heat" = 'sound/vox/heat.wav',
"helicopter" = 'sound/vox/helicopter.wav',
"helium" = 'sound/vox/helium.wav',
"hello" = 'sound/vox/hello.wav',
"help" = 'sound/vox/help.wav',
"here" = 'sound/vox/here.wav',
"hide" = 'sound/vox/hide.wav',
"high" = 'sound/vox/high.wav',
"highest" = 'sound/vox/highest.wav',
"hit" = 'sound/vox/hit.wav',
"hole" = 'sound/vox/hole.wav',
"hostile" = 'sound/vox/hostile.wav',
"hot" = 'sound/vox/hot.wav',
"hotel" = 'sound/vox/hotel.wav',
"hour" = 'sound/vox/hour.wav',
"hours" = 'sound/vox/hours.wav',
"hundred" = 'sound/vox/hundred.wav',
"hydro" = 'sound/vox/hydro.wav',
"i" = 'sound/vox/i.wav',
"idiot" = 'sound/vox/idiot.wav',
"illegal" = 'sound/vox/illegal.wav',
"immediate" = 'sound/vox/immediate.wav',
"immediately" = 'sound/vox/immediately.wav',
"in" = 'sound/vox/in.wav',
"inches" = 'sound/vox/inches.wav',
"india" = 'sound/vox/india.wav',
"ing" = 'sound/vox/ing.wav',
"inoperative" = 'sound/vox/inoperative.wav',
"inside" = 'sound/vox/inside.wav',
"inspection" = 'sound/vox/inspection.wav',
"inspector" = 'sound/vox/inspector.wav',
"interchange" = 'sound/vox/interchange.wav',
"intruder" = 'sound/vox/intruder.wav',
"invallid" = 'sound/vox/invallid.wav',
"invasion" = 'sound/vox/invasion.wav',
"is" = 'sound/vox/is.wav',
"it" = 'sound/vox/it.wav',
"johnson" = 'sound/vox/johnson.wav',
"juliet" = 'sound/vox/juliet.wav',
"key" = 'sound/vox/key.wav',
"kill" = 'sound/vox/kill.wav',
"kilo" = 'sound/vox/kilo.wav',
"kit" = 'sound/vox/kit.wav',
"lab" = 'sound/vox/lab.wav',
"lambda" = 'sound/vox/lambda.wav',
"laser" = 'sound/vox/laser.wav',
"last" = 'sound/vox/last.wav',
"launch" = 'sound/vox/launch.wav',
"leak" = 'sound/vox/leak.wav',
"leave" = 'sound/vox/leave.wav',
"left" = 'sound/vox/left.wav',
"legal" = 'sound/vox/legal.wav',
"level" = 'sound/vox/level.wav',
"lever" = 'sound/vox/lever.wav',
"lie" = 'sound/vox/lie.wav',
"lieutenant" = 'sound/vox/lieutenant.wav',
"life" = 'sound/vox/life.wav',
"light" = 'sound/vox/light.wav',
"lima" = 'sound/vox/lima.wav',
"liquid" = 'sound/vox/liquid.wav',
"loading" = 'sound/vox/loading.wav',
"locate" = 'sound/vox/locate.wav',
"located" = 'sound/vox/located.wav',
"location" = 'sound/vox/location.wav',
"lock" = 'sound/vox/lock.wav',
"locked" = 'sound/vox/locked.wav',
"locker" = 'sound/vox/locker.wav',
"lockout" = 'sound/vox/lockout.wav',
"lower" = 'sound/vox/lower.wav',
"lowest" = 'sound/vox/lowest.wav',
"magnetic" = 'sound/vox/magnetic.wav',
"main" = 'sound/vox/main.wav',
"maintenance" = 'sound/vox/maintenance.wav',
"malfunction" = 'sound/vox/malfunction.wav',
"man" = 'sound/vox/man.wav',
"mass" = 'sound/vox/mass.wav',
"materials" = 'sound/vox/materials.wav',
"maximum" = 'sound/vox/maximum.wav',
"may" = 'sound/vox/may.wav',
"medical" = 'sound/vox/medical.wav',
"men" = 'sound/vox/men.wav',
"mercy" = 'sound/vox/mercy.wav',
"mesa" = 'sound/vox/mesa.wav',
"message" = 'sound/vox/message.wav',
"meter" = 'sound/vox/meter.wav',
"micro" = 'sound/vox/micro.wav',
"middle" = 'sound/vox/middle.wav',
"mike" = 'sound/vox/mike.wav',
"miles" = 'sound/vox/miles.wav',
"military" = 'sound/vox/military.wav',
"milli" = 'sound/vox/milli.wav',
"million" = 'sound/vox/million.wav',
"minefield" = 'sound/vox/minefield.wav',
"minimum" = 'sound/vox/minimum.wav',
"minutes" = 'sound/vox/minutes.wav',
"mister" = 'sound/vox/mister.wav',
"mode" = 'sound/vox/mode.wav',
"motor" = 'sound/vox/motor.wav',
"motorpool" = 'sound/vox/motorpool.wav',
"move" = 'sound/vox/move.wav',
"must" = 'sound/vox/must.wav',
"nearest" = 'sound/vox/nearest.wav',
"nice" = 'sound/vox/nice.wav',
"nine" = 'sound/vox/nine.wav',
"nineteen" = 'sound/vox/nineteen.wav',
"ninety" = 'sound/vox/ninety.wav',
"no" = 'sound/vox/no.wav',
"nominal" = 'sound/vox/nominal.wav',
"north" = 'sound/vox/north.wav',
"not" = 'sound/vox/not.wav',
"november" = 'sound/vox/november.wav',
"now" = 'sound/vox/now.wav',
"number" = 'sound/vox/number.wav',
"objective" = 'sound/vox/objective.wav',
"observation" = 'sound/vox/observation.wav',
"of" = 'sound/vox/of.wav',
"officer" = 'sound/vox/officer.wav',
"ok" = 'sound/vox/ok.wav',
"on" = 'sound/vox/on.wav',
"one" = 'sound/vox/one.wav',
"open" = 'sound/vox/open.wav',
"operating" = 'sound/vox/operating.wav',
"operations" = 'sound/vox/operations.wav',
"operative" = 'sound/vox/operative.wav',
"option" = 'sound/vox/option.wav',
"order" = 'sound/vox/order.wav',
"organic" = 'sound/vox/organic.wav',
"oscar" = 'sound/vox/oscar.wav',
"out" = 'sound/vox/out.wav',
"outside" = 'sound/vox/outside.wav',
"over" = 'sound/vox/over.wav',
"overload" = 'sound/vox/overload.wav',
"override" = 'sound/vox/override.wav',
"pacify" = 'sound/vox/pacify.wav',
"pain" = 'sound/vox/pain.wav',
"pal" = 'sound/vox/pal.wav',
"panel" = 'sound/vox/panel.wav',
"percent" = 'sound/vox/percent.wav',
"perimeter" = 'sound/vox/perimeter.wav',
"permitted" = 'sound/vox/permitted.wav',
"personnel" = 'sound/vox/personnel.wav',
"pipe" = 'sound/vox/pipe.wav',
"plant" = 'sound/vox/plant.wav',
"platform" = 'sound/vox/platform.wav',
"please" = 'sound/vox/please.wav',
"point" = 'sound/vox/point.wav',
"portal" = 'sound/vox/portal.wav',
"power" = 'sound/vox/power.wav',
"presence" = 'sound/vox/presence.wav',
"press" = 'sound/vox/press.wav',
"primary" = 'sound/vox/primary.wav',
"proceed" = 'sound/vox/proceed.wav',
"processing" = 'sound/vox/processing.wav',
"progress" = 'sound/vox/progress.wav',
"proper" = 'sound/vox/proper.wav',
"propulsion" = 'sound/vox/propulsion.wav',
"prosecute" = 'sound/vox/prosecute.wav',
"protective" = 'sound/vox/protective.wav',
"push" = 'sound/vox/push.wav',
"quantum" = 'sound/vox/quantum.wav',
"quebec" = 'sound/vox/quebec.wav',
"question" = 'sound/vox/question.wav',
"questioning" = 'sound/vox/questioning.wav',
"quick" = 'sound/vox/quick.wav',
"quit" = 'sound/vox/quit.wav',
"radiation" = 'sound/vox/radiation.wav',
"radioactive" = 'sound/vox/radioactive.wav',
"rads" = 'sound/vox/rads.wav',
"rapid" = 'sound/vox/rapid.wav',
"reach" = 'sound/vox/reach.wav',
"reached" = 'sound/vox/reached.wav',
"reactor" = 'sound/vox/reactor.wav',
"red" = 'sound/vox/red.wav',
"relay" = 'sound/vox/relay.wav',
"released" = 'sound/vox/released.wav',
"remaining" = 'sound/vox/remaining.wav',
"renegade" = 'sound/vox/renegade.wav',
"repair" = 'sound/vox/repair.wav',
"report" = 'sound/vox/report.wav',
"reports" = 'sound/vox/reports.wav',
"required" = 'sound/vox/required.wav',
"research" = 'sound/vox/research.wav',
"resevoir" = 'sound/vox/resevoir.wav',
"resistance" = 'sound/vox/resistance.wav',
"right" = 'sound/vox/right.wav',
"rocket" = 'sound/vox/rocket.wav',
"roger" = 'sound/vox/roger.wav',
"romeo" = 'sound/vox/romeo.wav',
"room" = 'sound/vox/room.wav',
"round" = 'sound/vox/round.wav',
"run" = 'sound/vox/run.wav',
"safe" = 'sound/vox/safe.wav',
"safety" = 'sound/vox/safety.wav',
"sargeant" = 'sound/vox/sargeant.wav',
"satellite" = 'sound/vox/satellite.wav',
"save" = 'sound/vox/save.wav',
"science" = 'sound/vox/science.wav',
"scream" = 'sound/vox/scream.wav',
"screen" = 'sound/vox/screen.wav',
"search" = 'sound/vox/search.wav',
"second" = 'sound/vox/second.wav',
"secondary" = 'sound/vox/secondary.wav',
"seconds" = 'sound/vox/seconds.wav',
"sector" = 'sound/vox/sector.wav',
"secure" = 'sound/vox/secure.wav',
"secured" = 'sound/vox/secured.wav',
"security" = 'sound/vox/security.wav',
"select" = 'sound/vox/select.wav',
"selected" = 'sound/vox/selected.wav',
"service" = 'sound/vox/service.wav',
"seven" = 'sound/vox/seven.wav',
"seventeen" = 'sound/vox/seventeen.wav',
"seventy" = 'sound/vox/seventy.wav',
"severe" = 'sound/vox/severe.wav',
"sewage" = 'sound/vox/sewage.wav',
"sewer" = 'sound/vox/sewer.wav',
"shield" = 'sound/vox/shield.wav',
"shipment" = 'sound/vox/shipment.wav',
"shock" = 'sound/vox/shock.wav',
"shoot" = 'sound/vox/shoot.wav',
"shower" = 'sound/vox/shower.wav',
"shut" = 'sound/vox/shut.wav',
"side" = 'sound/vox/side.wav',
"sierra" = 'sound/vox/sierra.wav',
"sight" = 'sound/vox/sight.wav',
"silo" = 'sound/vox/silo.wav',
"six" = 'sound/vox/six.wav',
"sixteen" = 'sound/vox/sixteen.wav',
"sixty" = 'sound/vox/sixty.wav',
"slime" = 'sound/vox/slime.wav',
"slow" = 'sound/vox/slow.wav',
"soldier" = 'sound/vox/soldier.wav',
"some" = 'sound/vox/some.wav',
"someone" = 'sound/vox/someone.wav',
"something" = 'sound/vox/something.wav',
"son" = 'sound/vox/son.wav',
"sorry" = 'sound/vox/sorry.wav',
"south" = 'sound/vox/south.wav',
"squad" = 'sound/vox/squad.wav',
"square" = 'sound/vox/square.wav',
"stairway" = 'sound/vox/stairway.wav',
"status" = 'sound/vox/status.wav',
"sterile" = 'sound/vox/sterile.wav',
"sterilization" = 'sound/vox/sterilization.wav',
"storage" = 'sound/vox/storage.wav',
"sub" = 'sound/vox/sub.wav',
"subsurface" = 'sound/vox/subsurface.wav',
"sudden" = 'sound/vox/sudden.wav',
"suit" = 'sound/vox/suit.wav',
"superconducting" = 'sound/vox/superconducting.wav',
"supercooled" = 'sound/vox/supercooled.wav',
"supply" = 'sound/vox/supply.wav',
"surface" = 'sound/vox/surface.wav',
"surrender" = 'sound/vox/surrender.wav',
"surround" = 'sound/vox/surround.wav',
"surrounded" = 'sound/vox/surrounded.wav',
"switch" = 'sound/vox/switch.wav',
"system" = 'sound/vox/system.wav',
"systems" = 'sound/vox/systems.wav',
"tactical" = 'sound/vox/tactical.wav',
"take" = 'sound/vox/take.wav',
"talk" = 'sound/vox/talk.wav',
"tango" = 'sound/vox/tango.wav',
"tank" = 'sound/vox/tank.wav',
"target" = 'sound/vox/target.wav',
"team" = 'sound/vox/team.wav',
"temperature" = 'sound/vox/temperature.wav',
"temporal" = 'sound/vox/temporal.wav',
"ten" = 'sound/vox/ten.wav',
"terminal" = 'sound/vox/terminal.wav',
"terminated" = 'sound/vox/terminated.wav',
"termination" = 'sound/vox/termination.wav',
"test" = 'sound/vox/test.wav',
"that" = 'sound/vox/that.wav',
"the" = 'sound/vox/the.wav',
"then" = 'sound/vox/then.wav',
"there" = 'sound/vox/there.wav',
"third" = 'sound/vox/third.wav',
"thirteen" = 'sound/vox/thirteen.wav',
"thirty" = 'sound/vox/thirty.wav',
"this" = 'sound/vox/this.wav',
"those" = 'sound/vox/those.wav',
"thousand" = 'sound/vox/thousand.wav',
"threat" = 'sound/vox/threat.wav',
"three" = 'sound/vox/three.wav',
"through" = 'sound/vox/through.wav',
"time" = 'sound/vox/time.wav',
"to" = 'sound/vox/to.wav',
"top" = 'sound/vox/top.wav',
"topside" = 'sound/vox/topside.wav',
"touch" = 'sound/vox/touch.wav',
"towards" = 'sound/vox/towards.wav',
"track" = 'sound/vox/track.wav',
"train" = 'sound/vox/train.wav',
"transportation" = 'sound/vox/transportation.wav',
"truck" = 'sound/vox/truck.wav',
"tunnel" = 'sound/vox/tunnel.wav',
"turn" = 'sound/vox/turn.wav',
"turret" = 'sound/vox/turret.wav',
"twelve" = 'sound/vox/twelve.wav',
"twenty" = 'sound/vox/twenty.wav',
"two" = 'sound/vox/two.wav',
"unauthorized" = 'sound/vox/unauthorized.wav',
"under" = 'sound/vox/under.wav',
"uniform" = 'sound/vox/uniform.wav',
"unlocked" = 'sound/vox/unlocked.wav',
"until" = 'sound/vox/until.wav',
"up" = 'sound/vox/up.wav',
"upper" = 'sound/vox/upper.wav',
"uranium" = 'sound/vox/uranium.wav',
"us" = 'sound/vox/us.wav',
"usa" = 'sound/vox/usa.wav',
"use" = 'sound/vox/use.wav',
"used" = 'sound/vox/used.wav',
"user" = 'sound/vox/user.wav',
"vacate" = 'sound/vox/vacate.wav',
"valid" = 'sound/vox/valid.wav',
"vapor" = 'sound/vox/vapor.wav',
"vent" = 'sound/vox/vent.wav',
"ventillation" = 'sound/vox/ventillation.wav',
"victor" = 'sound/vox/victor.wav',
"violated" = 'sound/vox/violated.wav',
"violation" = 'sound/vox/violation.wav',
"voltage" = 'sound/vox/voltage.wav',
"vox_login" = 'sound/vox/vox_login.wav',
"walk" = 'sound/vox/walk.wav',
"wall" = 'sound/vox/wall.wav',
"want" = 'sound/vox/want.wav',
"wanted" = 'sound/vox/wanted.wav',
"warm" = 'sound/vox/warm.wav',
"warn" = 'sound/vox/warn.wav',
"warning" = 'sound/vox/warning.wav',
"waste" = 'sound/vox/waste.wav',
"water" = 'sound/vox/water.wav',
"we" = 'sound/vox/we.wav',
"weapon" = 'sound/vox/weapon.wav',
"west" = 'sound/vox/west.wav',
"whiskey" = 'sound/vox/whiskey.wav',
"white" = 'sound/vox/white.wav',
"wilco" = 'sound/vox/wilco.wav',
"will" = 'sound/vox/will.wav',
"with" = 'sound/vox/with.wav',
"without" = 'sound/vox/without.wav',
"woop" = 'sound/vox/woop.wav',
"xeno" = 'sound/vox/xeno.wav',
"yankee" = 'sound/vox/yankee.wav',
"yards" = 'sound/vox/yards.wav',
"year" = 'sound/vox/year.wav',
"yellow" = 'sound/vox/yellow.wav',
"yes" = 'sound/vox/yes.wav',
"you" = 'sound/vox/you.wav',
"your" = 'sound/vox/your.wav',
"yourself" = 'sound/vox/yourself.wav',
"zero" = 'sound/vox/zero.wav',
"zone" = 'sound/vox/zone.wav',
"zulu" = 'sound/vox/zulu.wav')
@@ -93,6 +93,8 @@ var/datum/paiController/paiController // Global handler for pAI candidates
proc/recruitWindow(var/mob/M as mob)
var/datum/paiCandidate/candidate
for(var/datum/paiCandidate/c in pai_candidates)
if(!istype(c) || !istype(M))
break
if(c.key == M.key)
candidate = c
if(!candidate)
@@ -0,0 +1,145 @@
// TODO: remove the robot.mmi and robot.cell variables and completely rely on the robot component system
/datum/robot_component/var/name
/datum/robot_component/var/installed = 0
/datum/robot_component/var/powered = 0
/datum/robot_component/var/toggled = 1
/datum/robot_component/var/brute_damage = 0
/datum/robot_component/var/electronics_damage = 0
/datum/robot_component/var/energy_consumption = 0
/datum/robot_component/var/max_damage = 30
/datum/robot_component/var/mob/living/silicon/robot/owner
// The actual device object that has to be installed for this.
/datum/robot_component/var/external_type = null
// The wrapped device(e.g. radio), only set if external_type isn't null
/datum/robot_component/var/obj/item/wrapped = null
/datum/robot_component/New(mob/living/silicon/robot/R)
src.owner = R
/datum/robot_component/proc/install()
/datum/robot_component/proc/uninstall()
/datum/robot_component/proc/destroy()
if(wrapped)
del wrapped
wrapped = new/obj/item/broken_device
// The thing itself isn't there anymore, but some fried remains are.
installed = -1
uninstall()
/datum/robot_component/proc/take_damage(brute, electronics, sharp)
if(installed != 1) return
brute_damage += brute
electronics_damage += electronics
if(brute_damage + electronics_damage >= max_damage) destroy()
/datum/robot_component/proc/heal_damage(brute, electronics)
if(installed != 1)
// If it's not installed, can't repair it.
return 0
brute_damage = max(0, brute_damage - brute)
electronics_damage = max(0, electronics_damage - electronics)
/datum/robot_component/proc/is_powered()
return (installed == 1) && (brute_damage + electronics_damage < max_damage) && (!energy_consumption || powered)
/datum/robot_component/proc/consume_power()
if(toggled == 0)
powered = 0
return
if(owner.cell.charge >= energy_consumption)
owner.cell.use(energy_consumption)
powered = 1
else
powered = 0
/datum/robot_component/actuator
name = "actuator"
energy_consumption = 2
external_type = /obj/item/robot_parts/robot_component/actuator
max_damage = 60
/datum/robot_component/cell
name = "power cell"
max_damage = 60
/datum/robot_component/cell/destroy()
..()
owner.cell = null
/datum/robot_component/radio
name = "radio"
external_type = /obj/item/robot_parts/robot_component/radio
energy_consumption = 3
max_damage = 10
/datum/robot_component/binary_communication
name = "binary communication device"
external_type = /obj/item/robot_parts/robot_component/binary_communication_device
energy_consumption = 0
max_damage = 30
/datum/robot_component/camera
name = "camera"
external_type = /obj/item/robot_parts/robot_component/camera
energy_consumption = 2
max_damage = 20
/datum/robot_component/diagnosis_unit
name = "self-diagnosis unit"
energy_consumption = 1
external_type = /obj/item/robot_parts/robot_component/diagnosis_unit
max_damage = 30
/mob/living/silicon/robot/proc/initialize_components()
// This only initializes the components, it doesn't set them to installed.
components["actuator"] = new/datum/robot_component/actuator(src)
components["radio"] = new/datum/robot_component/radio(src)
components["power cell"] = new/datum/robot_component/cell(src)
components["diagnosis unit"] = new/datum/robot_component/diagnosis_unit(src)
components["camera"] = new/datum/robot_component/camera(src)
components["comms"] = new/datum/robot_component/binary_communication(src)
/mob/living/silicon/robot/proc/is_component_functioning(module_name)
var/datum/robot_component/C = components[module_name]
return C && C.installed == 1 && C.toggled && C.is_powered()
/obj/item/broken_device
name = "broken component"
icon = 'robot_component.dmi'
icon_state = "broken"
/obj/item/robot_parts/robot_component
icon = 'robot_component.dmi'
icon_state = "working"
construction_time = 200
construction_cost = list("metal"=5000)
// TODO: actual icons ;)
/obj/item/robot_parts/robot_component/binary_communication_device
name = "binary communication device"
/obj/item/robot_parts/robot_component/actuator
name = "actuator"
/obj/item/robot_parts/robot_component/camera
name = "camera"
/obj/item/robot_parts/robot_component/diagnosis_unit
name = "diagnosis unit"
/obj/item/robot_parts/robot_component/radio
name = "radio"
@@ -5,8 +5,6 @@
/mob/living/silicon/robot/get_active_hand()
return module_active
/*-------TODOOOOOOOOOO--------*/
/mob/living/silicon/robot/proc/uneq_active()
if(isnull(module_active))
@@ -38,6 +36,7 @@
module_active = null
module_state_3 = null
inv3.icon_state = "inv3"
updateicon()
/mob/living/silicon/robot/proc/uneq_all()
module_active = null
@@ -66,7 +65,7 @@
contents -= module_state_3
module_state_3 = null
inv3.icon_state = "inv3"
updateicon()
/mob/living/silicon/robot/proc/activated(obj/item/O)
if(module_state_1 == O)
@@ -76,4 +75,5 @@
else if(module_state_3 == O)
return 1
else
return 0
return 0
updateicon()
+25 -18
View File
@@ -5,7 +5,6 @@
if (src.monkeyizing)
return
src.blinded = null
//Status updates, death etc.
@@ -21,9 +20,6 @@
process_locks()
update_canmove()
/mob/living/silicon/robot/proc/clamp_values()
// SetStunned(min(stunned, 30))
@@ -37,23 +33,25 @@
/mob/living/silicon/robot/proc/use_power()
if (src.cell)
if (is_component_functioning("power cell") && cell)
if(src.cell.charge <= 0)
uneq_all()
src.stat = 1
else if (src.cell.charge <= 100)
uneq_all()
src.sight_mode = 0
src.cell.use(1)
else
if(src.module_state_1)
src.cell.use(5)
src.cell.use(3)
if(src.module_state_2)
src.cell.use(5)
src.cell.use(3)
if(src.module_state_3)
src.cell.use(5)
src.cell.use(1)
src.blinded = 0
src.cell.use(3)
for(var/V in components)
var/datum/robot_component/C = components[V]
C.consume_power()
if(!is_component_functioning("actuator"))
Paralyse(3)
src.stat = 0
else
uneq_all()
@@ -68,9 +66,7 @@
else
src.camera.status = 1
health = 200 - (getOxyLoss() + getFireLoss() + getBruteLoss())
if(getOxyLoss() > 50) Paralyse(3)
updatehealth()
if(src.sleeping)
Paralyse(3)
@@ -128,6 +124,17 @@
src.druggy--
src.druggy = max(0, src.druggy)
if(!is_component_functioning("radio"))
radio.on = 0
else
radio.on = 1
if(is_component_functioning("camera"))
src.blinded = 0
else
src.blinded = 1
return 1
/mob/living/silicon/robot/proc/handle_regular_hud_updates()
@@ -273,7 +280,7 @@
src.module_state_2:screen_loc = ui_inv2
if(src.module_state_3)
src.module_state_3:screen_loc = ui_inv3
updateicon()
/mob/living/silicon/robot/proc/process_killswitch()
if(killswitch)
+260 -99
View File
@@ -5,8 +5,12 @@
icon_state = "robot"
maxHealth = 300
health = 300
universal_speak = 1
var/sight_mode = 0
var/custom_name = ""
var/base_icon
var/custom_sprite = 0 //Due to all the sprites involved, a var for our custom borgs may be best
//Hud stuff
@@ -27,6 +31,9 @@
var/obj/item/weapon/cell/cell = null
var/obj/machinery/camera/camera = null
// Components are basically robot organs.
var/list/components = list()
var/obj/item/device/mmi/mmi = null
var/obj/item/device/pda/ai/rbPDA = null
@@ -58,7 +65,7 @@
var/braintype = "Cyborg"
var/pose
/mob/living/silicon/robot/New(loc,var/syndie = 0)
/mob/living/silicon/robot/New(loc,var/syndie = 0,var/unfinished = 0)
spark_system = new /datum/effect/effect/system/spark_spread()
spark_system.set_up(5, 0, src)
spark_system.attach(src)
@@ -67,12 +74,10 @@
updatename("Default")
updateicon()
if(!cell)
cell = new /obj/item/weapon/cell(src)
cell.maxcharge = 7500
cell.charge = 7500
if(syndie)
if(!cell)
cell = new /obj/item/weapon/cell(src)
laws = new /datum/ai_laws/antimov()
lawupdate = 0
scrambledcodes = 1
@@ -99,8 +104,27 @@
camera.network = list("SS13")
if(isWireCut(5)) // 5 = BORG CAMERA
camera.status = 0
initialize_components()
if(!unfinished)
// Create all the robot parts.
for(var/V in components) if(V != "power cell")
var/datum/robot_component/C = components[V]
C.installed = 1
C.wrapped = new C.external_type
if(!cell)
cell = new /obj/item/weapon/cell(src)
cell.maxcharge = 7500
cell.charge = 7500
..()
if(cell)
var/datum/robot_component/cell_component = components["power cell"]
cell_component.wrapped = cell
cell_component.installed = 1
playsound(loc, 'sound/voice/liveagain.ogg', 75, 1)
// setup the PDA and its name
@@ -122,131 +146,96 @@
/mob/living/silicon/robot/proc/pick_module()
if(module)
return
var/mod = input("Please, select a module!", "Robot", null, null) in list("Standard", "Engineering", "Medical", "Miner", "Janitor","Service", "Security")
var/list/modules = list("Standard", "Engineering", "Medical", "Miner", "Janitor", "Service", "Security", "Combat")
if(emagged || security_level > SEC_LEVEL_BLUE)
src << "\red Crisis mode active. Combat module available."
modules+="Combat"
var/mod = input("Please, select a module!", "Robot", null, null) in modules
var/module_sprites[0] //Used to store the associations between sprite names and sprite index.
var/channels = list()
if(module)
return
switch(mod)
if("Standard")
updatename(mod)
module = new /obj/item/weapon/robot_module/standard(src)
hands.icon_state = "standard"
var/icontype
if (src.name == "Lucy" && src.ckey == "rowtree") icontype = ("Lucy")
else icontype = input("Select an icon!", "Robot", null, null) in list("Basic", "Standard")
switch(icontype)
if("Basic") icon_state = "robot_old"
if("Lucy") icon_state = "rowtree-lucy"
else icon_state = "robot"
modtype = "Stand"
feedback_inc("cyborg_standard",1)
module_sprites["Basic"] = "robot_old"
module_sprites["Android"] = "droid"
module_sprites["Default"] = "robot"
if("Service")
updatename(mod)
module = new /obj/item/weapon/robot_module/butler(src)
hands.icon_state = "service"
var/icontype
if (src.name == "Lucy" && src.ckey == "rowtree") icontype = ("Lucy")
else icontype = input("Select an icon!", "Robot", null, null) in list("Waitress", "Bro", "Butler", "Kent", "Rich")
switch(icontype)
if("Waitress") icon_state = "Service"
if("Kent") icon_state = "toiletbot"
if("Bro") icon_state = "Brobot"
if("Rich") icon_state = "maximillion"
if("Lucy") icon_state = "rowtree-lucy"
else icon_state = "Service2"
modtype = "Butler"
feedback_inc("cyborg_service",1)
module_sprites["Waitress"] = "Service"
module_sprites["Kent"] = "toiletbot"
module_sprites["Bro"] = "Brobot"
module_sprites["Rich"] = "maximillion"
module_sprites["Default"] = "Service2"
if("Miner")
updatename(mod)
module = new /obj/item/weapon/robot_module/miner(src)
hands.icon_state = "miner"
var/icontype
if (src.name == "Lucy" && src.ckey == "rowtree") icontype = ("Lucy")
else icontype = input("Select an icon!", "Robot", null, null) in list("Basic", "Advanced Droid", "Treadhead")
switch(icontype)
if("Basic") icon_state = "Miner_old"
if("Advanced Droid") icon_state = "droid-miner"
if("Lucy") icon_state = "rowtree-lucy"
else icon_state = "Miner"
modtype = "Miner"
feedback_inc("cyborg_miner",1)
channels = list("Mining" = 1)
channels = list("Supply" = 1)
module_sprites["Basic"] = "Miner_old"
module_sprites["Advanced Droid"] = "droid-miner"
module_sprites["Treadhead"] = "Miner"
if("Medical")
updatename(mod)
module = new /obj/item/weapon/robot_module/medical(src)
hands.icon_state = "medical"
var/icontype
if (src.name == "Lucy" && src.ckey == "rowtree") icontype = ("Lucy")
else icontype = input("Select an icon!", "Robot", null, null) in list("Basic", "Advanced Droid", "Needles", "Hoverbot")
switch(icontype)
if("Basic") icon_state = "Medbot"
if("Advanced Droid") icon_state = "droid-medical"
if("Needles") icon_state = "medicalrobot"
if("Lucy") icon_state = "rowtree-medical"
else icon_state = "surgeon"
modtype = "Med"
status_flags &= ~CANPUSH
feedback_inc("cyborg_medical",1)
channels = list("Medical" = 1)
module_sprites["Basic"] = "Medbot"
module_sprites["Advanced Droid"] = "droid-medical"
module_sprites["Needles"] = "medicalrobot"
module_sprites["Standard"] = "surgeon"
if("Security")
updatename(mod)
module = new /obj/item/weapon/robot_module/security(src)
hands.icon_state = "security"
var/icontype
if (src.name == "Lucy" && src.ckey == "rowtree") icontype = ("Lucy")
else icontype = input("Select an icon!", "Robot", null, null) in list("Basic", "Red Knight", "Black Knight", "Bloodhound")
switch(icontype)
if("Basic") icon_state = "secborg"
if("Red Knight") icon_state = "Security"
if("Black Knight") icon_state = "securityrobot"
if("Lucy") icon_state = "rowtree-security"
else icon_state = "bloodhound"
modtype = "Sec"
//speed = -1 Secborgs have nerfed tasers now, so the speed boost is not necessary
status_flags &= ~CANPUSH
feedback_inc("cyborg_security",1)
channels = list("Security" = 1)
module_sprites["Basic"] = "secborg"
module_sprites["Red Knight"] = "Security"
module_sprites["Black Knight"] = "securityrobot"
module_sprites["Bloodhound"] = "bloodhound"
if("Engineering")
updatename(mod)
module = new /obj/item/weapon/robot_module/engineering(src)
hands.icon_state = "engineer"
var/icontype
if (src.name == "Lucy" && src.ckey == "rowtree") icontype = ("Lucy")
else icontype = input("Select an icon!", "Robot", null, null) in list("Basic", "Antique", "Landmate")
switch(icontype)
if("Basic") icon_state = "Engineering"
if("Antique") icon_state = "engineerrobot"
if("Lucy") icon_state = "rowtree-engineering"
else icon_state = "landmate"
modtype = "Eng"
feedback_inc("cyborg_engineering",1)
channels = list("Engineering" = 1)
module_sprites["Basic"] = "Engineering"
module_sprites["Antique"] = "engineerrobot"
module_sprites["Landmate"] = "landmate"
if("Janitor")
updatename(mod)
module = new /obj/item/weapon/robot_module/janitor(src)
hands.icon_state = "janitor"
var/icontype
if (src.name == "Lucy" && src.ckey == "rowtree") icontype = ("Lucy")
else icontype = input("Select an icon!", "Robot", null, null) in list("Basic", "Mopbot", "Zamboni")
switch(icontype)
if("Basic") icon_state = "JanBot2"
if("Mopbot") icon_state = "janitorrobot"
if("Lucy") icon_state = "rowtree-lucy"
else icon_state = "mopgearrex"
modtype = "Jan"
feedback_inc("cyborg_janitor",1)
module_sprites["Basic"] = "JanBot2"
module_sprites["Mopbot"] = "janitorrobot"
module_sprites["Mop Gear Rex"] = "mopgearrex"
overlays -= "eyes" //Takes off the eyes that it started with
if("Combat")
module = new /obj/item/weapon/robot_module/combat(src)
modtype = "Com"
module_sprites["Combat Android"] = "droid-combat"
channels = list("Security" = 1)
//Custom_sprite check and entry
if (custom_sprite == 1)
module_sprites["Custom"] = "[src.ckey]-[mod]"
hands.icon_state = lowertext(mod)
feedback_inc("cyborg_[lowertext(mod)]",1)
updatename(mod)
if(mod == "Medical" || mod == "Security" || mod == "Combat")
status_flags &= ~CANPUSH
choose_icon(6,module_sprites)
radio.config(channels)
updateicon()
/
base_icon = icon_state
/mob/living/silicon/robot/proc/updatename(var/prefix as text)
@@ -262,10 +251,31 @@
changed_name = "[(prefix ? "[prefix] " : "")][braintype]-[num2text(ident)]"
real_name = changed_name
name = real_name
// if we've changed our name, we also need to update the display name for our PDA
setup_PDA()
//We also need to update name of internal camera.
if (camera)
camera.c_tag = changed_name
if(!custom_sprite) //Check for custom sprite
var/file = file2text("config/custom_sprites.txt")
var/lines = text2list(file, "\n")
for(var/line in lines)
// split & clean up
var/list/Entry = text2list(line, "-")
for(var/i = 1 to Entry.len)
Entry[i] = trim(Entry[i])
if(Entry.len < 2)
continue;
if(Entry[1] == src.ckey && Entry[2] == src.real_name) //They're in the list? Custom sprite time, var and icon change required
custom_sprite = 1
icon = 'icons/mob/custom-synthetic.dmi'
/mob/living/silicon/robot/verb/Namepick()
if(custom_name)
return 0
@@ -314,6 +324,53 @@
viewalerts = 1
src << browse(dat, "window=robotalerts&can_close=0")
/mob/living/silicon/robot/proc/self_diagnosis()
if(!is_component_functioning("diagnosis unit"))
return null
var/dat = "<HEAD><TITLE>[src.name] Self-Diagnosis Report</TITLE></HEAD><BODY>\n"
for (var/V in components)
var/datum/robot_component/C = components[V]
dat += "<b>[C.name]</b><br><table><tr><td>Power consumption</td><td>[C.energy_consumption]</td></tr><tr><td>Brute Damage:</td><td>[C.brute_damage]</td></tr><tr><td>Electronics Damage:</td><td>[C.electronics_damage]</td></tr><tr><td>Powered:</td><td>[(!C.energy_consumption || C.is_powered()) ? "Yes" : "No"]</td></tr><tr><td>Toggled:</td><td>[ C.toggled ? "Yes" : "No"]</td></table><br>"
return dat
/mob/living/silicon/robot/verb/self_diagnosis_verb()
set category = "Robot Commands"
set name = "Self Diagnosis"
if(!is_component_functioning("diagnosis unit"))
src << "\red Your self-diagnosis component isn't functioning."
var/dat = self_diagnosis()
src << browse(dat, "window=robotdiagnosis")
/mob/living/silicon/robot/verb/toggle_component()
set category = "Robot Commands"
set name = "Toggle Component"
set desc = "Toggle a component, conserving power."
var/list/installed_components = list()
for(var/V in components)
if(V == "power cell") continue
var/datum/robot_component/C = components[V]
if(C.installed)
installed_components += V
var/toggle = input(src, "Which component do you want to toggle?", "Toggle Component") as null|anything in installed_components
if(!toggle)
return
var/datum/robot_component/C = components[toggle]
if(C.toggled)
C.toggled = 0
src << "\red You disable [C.name]."
else
C.toggled = 1
src << "\red You enable [C.name]."
/mob/living/silicon/robot/blob_act()
if (stat != 2)
adjustBruteLoss(60)
@@ -497,7 +554,24 @@
if (istype(W, /obj/item/weapon/handcuffs)) // fuck i don't even know why isrobot() in handcuff code isn't working so this will have to do
return
if(opened) // Are they trying to insert something?
for(var/V in components)
var/datum/robot_component/C = components[V]
if(!C.installed && istype(W, C.external_type))
C.installed = 1
C.wrapped = W
C.install()
user.drop_item()
W.loc = null
usr << "\blue You install the [W.name]."
return
if (istype(W, /obj/item/weapon/weldingtool))
if (!getBruteLoss())
user << "Nothing to fix here!"
return
var/obj/item/weapon/weldingtool/WT = W
if (WT.remove_fuel(0))
adjustBruteLoss(-30)
@@ -510,6 +584,9 @@
return
else if(istype(W, /obj/item/weapon/cable_coil) && wiresexposed)
if (!getFireLoss())
user << "Nothing to fix here!"
return
var/obj/item/weapon/cable_coil/coil = W
adjustFireLoss(-30)
updatehealth()
@@ -536,6 +613,27 @@
C.updateicon()
new/obj/item/robot_parts/chest(loc)
src.Del()
else
// Okay we're not removing the cell or an MMI, but maybe something else?
var/list/removable_components = list()
for(var/V in components)
if(V == "power cell") continue
var/datum/robot_component/C = components[V]
if(C.installed == 1 || C.installed == -1)
removable_components += V
var/remove = input(user, "Which component do you want to pry out?", "Remove Component") as null|anything in removable_components
if(!remove)
return
var/datum/robot_component/C = components[remove]
var/obj/item/I = C.wrapped
user << "You remove \the [I]."
I.loc = src.loc
if(C.installed == 1)
C.uninstall()
C.installed = 0
else
if(locked)
user << "The cover is locked and cannot be opened."
@@ -545,6 +643,7 @@
updateicon()
else if (istype(W, /obj/item/weapon/cell) && opened) // trying to put a cell inside
var/datum/robot_component/C = components["power cell"]
if(wiresexposed)
user << "Close the panel first."
else if(cell)
@@ -554,8 +653,10 @@
W.loc = src
cell = W
user << "You insert the power cell."
// chargecount = 0
updateicon()
C.installed = 1
C.wrapped = W
C.install()
else if (istype(W, /obj/item/weapon/wirecutters) || istype(W, /obj/item/device/multitool))
if (wiresexposed)
@@ -828,13 +929,21 @@
add_fingerprint(user)
if(opened && !wiresexposed && (!istype(user, /mob/living/silicon)))
var/datum/robot_component/cell_component = components["power cell"]
if(cell)
cell.updateicon()
cell.add_fingerprint(user)
user.put_in_active_hand(cell)
user << "You remove \the [cell]."
cell = null
cell_component.wrapped = null
cell_component.installed = 0
updateicon()
else if(cell_component.installed == -1)
cell_component.installed = 0
var/obj/item/broken_device = cell_component.wrapped
user << "You remove \the [broken_device]."
user.put_in_active_hand(broken_device)
if(ishuman(user))
if(istype(user:gloves, /obj/item/clothing/gloves/space_ninja)&&user:gloves:candrain&&!user:gloves:draining)
@@ -881,6 +990,14 @@
else
overlays -= "eyes"
if(opened && custom_sprite == 1) //Custom borgs also have custom panels, heh
if(wiresexposed)
overlays += "[src.ckey]-openpanel +w"
else if(cell)
overlays += "[src.ckey]-openpanel +c"
else
overlays += "[src.ckey]-openpanel -c"
if(opened)
if(wiresexposed)
overlays += "ov-openpanel +w"
@@ -888,7 +1005,16 @@
overlays += "ov-openpanel +c"
else
overlays += "ov-openpanel -c"
return
if(module_active && istype(module_active,/obj/item/borg/combat/shield))
overlays += "[icon_state]-shield"
if(base_icon)
if(module_active && istype(module_active,/obj/item/borg/combat/mobility))
icon_state = "[base_icon]-roll"
else
icon_state = base_icon
return
//Call when target overlay should be added/removed
/mob/living/silicon/robot/update_targeted()
@@ -1099,3 +1225,38 @@
set category = "IC"
flavor_text = copytext(sanitize(input(usr, "Please enter your new flavour text.", "Flavour text", null) as text), 1)
/mob/living/silicon/robot/proc/choose_icon(var/triesleft, var/list/module_sprites)
if(triesleft<1 || !module_sprites.len)
return
else
triesleft--
var/icontype
if (src.name == "Lucy" && src.ckey == "rowtree")
icontype = "Lucy"
triesleft = 0
else
icontype = input("Select an icon! [triesleft ? "You have [triesleft] more chances." : "This is your last try."]", "Robot", null, null) in module_sprites
if(icontype)
icon_state = module_sprites[icontype]
else
src << "Something is badly wrong with the sprite selection. Harass a coder."
icon_state = module_sprites[1]
return
overlays -= "eyes"
updateicon()
if (triesleft >= 1)
var/choice = input("Look at your icon - is this what you want?") in list("Yes","No")
if(choice=="No")
choose_icon(triesleft, module_sprites)
else
triesleft = 0
return
else
src << "Your icon has been set. You now require a module reset to change it."
@@ -0,0 +1,129 @@
/mob/living/silicon/robot/updatehealth()
if(status_flags & GODMODE)
health = 100
stat = CONSCIOUS
return
health = 100 - (getBruteLoss() + getFireLoss())
return
/mob/living/silicon/robot/getBruteLoss()
var/amount = 0
for(var/V in components)
var/datum/robot_component/C = components[V]
if(C.installed != 0) amount += C.brute_damage
return amount
/mob/living/silicon/robot/getFireLoss()
var/amount = 0
for(var/V in components)
var/datum/robot_component/C = components[V]
if(C.installed != 0) amount += C.electronics_damage
return amount
/mob/living/silicon/robot/adjustBruteLoss(var/amount)
if(amount > 0)
take_overall_damage(amount, 0)
else
heal_overall_damage(-amount, 0)
/mob/living/silicon/robot/adjustFireLoss(var/amount)
if(amount > 0)
take_overall_damage(0, amount)
else
heal_overall_damage(0, -amount)
/mob/living/silicon/robot/proc/get_damaged_components(var/brute, var/burn)
var/list/datum/robot_component/parts = list()
for(var/V in components)
var/datum/robot_component/C = components[V]
if(C.installed == 1) if((brute && C.brute_damage) || (burn && C.electronics_damage))
parts += C
return parts
/mob/living/silicon/robot/proc/get_damageable_components()
var/list/rval = new
for(var/V in components)
var/datum/robot_component/C = components[V]
if(C.installed == 1) rval += C
return rval
/mob/living/silicon/robot/heal_organ_damage(var/brute, var/burn)
var/list/datum/robot_component/parts = get_damaged_components(brute,burn)
if(!parts.len) return
var/datum/robot_component/picked = pick(parts)
picked.heal_damage(brute,burn)
/mob/living/silicon/robot/take_organ_damage(var/brute = 0, var/burn = 0, var/sharp = 0)
var/list/components = get_damageable_components()
if(!components.len)
return
//Combat shielding absorbs a percentage of damage directly into the cell.
if(module_active && istype(module_active,/obj/item/borg/combat/shield))
var/obj/item/borg/combat/shield/shield = module_active
//Shields absorb a certain percentage of damage based on their power setting.
var/absorb_brute = brute*shield.shield_level
var/absorb_burn = burn*shield.shield_level
var/cost = (absorb_brute+absorb_burn)*100
cell.charge -= cost
if(cell.charge <= 0)
cell.charge = 0
src << "\red Your shield has overloaded!"
else
brute -= absorb_brute
burn -= absorb_burn
src << "\red Your shield absorbs some of the impact!"
var/datum/robot_component/C = pick(components)
C.take_damage(brute,burn,sharp)
/mob/living/silicon/robot/heal_overall_damage(var/brute, var/burn)
var/list/datum/robot_component/parts = get_damaged_components(brute,burn)
while(parts.len && (brute>0 || burn>0) )
var/datum/robot_component/picked = pick(parts)
var/brute_was = picked.brute_damage
var/burn_was = picked.electronics_damage
picked.heal_damage(brute,burn)
brute -= (brute_was-picked.brute_damage)
burn -= (burn_was-picked.electronics_damage)
parts -= picked
/mob/living/silicon/robot/take_overall_damage(var/brute = 0, var/burn = 0, var/sharp = 0, var/used_weapon = null)
if(status_flags & GODMODE) return //godmode
var/list/datum/robot_component/parts = get_damageable_components()
//Combat shielding absorbs a percentage of damage directly into the cell.
if(module_active && istype(module_active,/obj/item/borg/combat/shield))
var/obj/item/borg/combat/shield/shield = module_active
//Shields absorb a certain percentage of damage based on their power setting.
var/absorb_brute = brute*shield.shield_level
var/absorb_burn = burn*shield.shield_level
var/cost = (absorb_brute+absorb_burn)*100
cell.charge -= cost
if(cell.charge <= 0)
cell.charge = 0
src << "\red Your shield has overloaded!"
else
brute -= absorb_brute
burn -= absorb_burn
src << "\red Your shield absorbs some of the impact!"
while(parts.len && (brute>0 || burn>0) )
var/datum/robot_component/picked = pick(parts)
var/brute_was = picked.brute_damage
var/burn_was = picked.electronics_damage
picked.take_damage(brute,burn)
brute -= (picked.brute_damage - brute_was)
burn -= (picked.electronics_damage - burn_was)
parts -= picked
@@ -120,3 +120,25 @@
add_fingerprint(user)
return
//Personal shielding for the combat module.
/obj/item/borg/combat/shield
name = "personal shielding"
desc = "A powerful experimental module that turns aside or absorbs incoming attacks at the cost of charge."
icon = 'icons/obj/decals.dmi'
icon_state = "shock"
var/shield_level = 0.5 //Percentage of damage absorbed by the shield.
/obj/item/borg/combat/shield/verb/set_shield_level()
set name = "Set shield level"
set category = "Object"
set src in range(0)
var/N = input("How much damage should the shield absorb?") in list("5","10","25","50","75","100")
if (N)
shield_level = text2num(N)/100
/obj/item/borg/combat/mobility
name = "mobility module"
desc = "By retracting limbs and tucking in its head, a combat android can roll at high speeds."
icon = 'icons/obj/decals.dmi'
icon_state = "shock"
@@ -219,3 +219,17 @@
src.modules += new /obj/item/weapon/gun/energy/pulse_rifle/destroyer(src)
src.modules += new /obj/item/weapon/card/emag(src)
return
/obj/item/weapon/robot_module/combat
name = "combat robot module"
New()
src.modules += new /obj/item/borg/sight/thermal(src)
src.modules += new /obj/item/weapon/gun/energy/lasercannon/cyborg(src)
src.modules += new /obj/item/weapon/pickaxe/plasmacutter(src)
src.modules += new /obj/item/borg/combat/shield(src)
src.modules += new /obj/item/borg/combat/mobility(src)
src.modules += new /obj/item/weapon/wrench(src) //Is a combat android really going to be stopped by a chair?
src.emag = new /obj/item/weapon/gun/energy/pulse_rifle/cyborg(src)
return
@@ -12,4 +12,10 @@
tally = speed
if(module_active && istype(module_active,/obj/item/borg/combat/mobility))
tally-=3
return tally+config.robot_delay
/mob/living/silicon/robot/Move()
..()
+8
View File
@@ -24,6 +24,14 @@
return ..(message)
message = copytext(message, 3)
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
// TODO: move the component system up to silicon so we don't have to use this ugly hack..
if(istype(src, /mob/living/silicon/robot))
var/mob/living/silicon/robot/R = src
if(!R.is_component_functioning("comms"))
src << "\red Your binary communications component isn't functional."
return
robot_talk(message)
else if (department_radio_keys[prefix] == "department")
if(isAI(src)&&client)//For patching directly into AI holopads.
@@ -96,7 +96,7 @@
AdjustParalysis(-1)
//Movement
if(!client && !stop_automated_movement && wander)
if(!client && !stop_automated_movement && wander && !anchored)
if(isturf(src.loc) && !resting && !buckled && canmove) //This is so it only moves if it's not inside a closet, gentics machine, etc.
turns_since_move++
if(turns_since_move >= turns_per_move)
@@ -0,0 +1,161 @@
/mob/living/simple_animal/vox/armalis/
name = "serpentine alien"
real_name = "serpentine alien"
desc = "A one-eyed, serpentine creature, half-machine, easily nine feet from tail to beak!"
icon = 'icons/mob/vox.dmi'
icon_state = "armalis"
icon_living = "armalis"
maxHealth = 500
health = 500
response_harm = "slashes at the"
harm_intent_damage = 0
melee_damage_lower = 30
melee_damage_upper = 40
attacktext = "slammed its enormous claws into"
speed = -1
wall_smash = 1
attack_sound = 'sound/weapons/bladeslice.ogg'
status_flags = 0
universal_speak = 1
vox_talk_understand = 1
var/armour = null
var/amp = null
var/quills = 3
/mob/living/simple_animal/vox/armalis/Die()
living_mob_list -= src
dead_mob_list += src
stat = DEAD
visible_message("\red <B>[src] shudders violently and explodes!</B>","\red <B>You feel your body rupture!</B>")
explosion(get_turf(loc), -1, -1, 3, 5)
src.gib()
return
/mob/living/simple_animal/vox/armalis/attackby(var/obj/item/O as obj, var/mob/user as mob)
if(O.force)
if(O.force >= 25)
var/damage = O.force
if (O.damtype == HALLOSS)
damage = 0
health -= damage
for(var/mob/M in viewers(src, null))
if ((M.client && !( M.blinded )))
M.show_message("\red \b [src] has been attacked with the [O] by [user]. ")
else
for(var/mob/M in viewers(src, null))
if ((M.client && !( M.blinded )))
M.show_message("\red \b The [O] bounces harmlessly off of [src]. ")
else
usr << "\red This weapon is ineffective, it does no damage."
for(var/mob/M in viewers(src, null))
if ((M.client && !( M.blinded )))
M.show_message("\red [user] gently taps [src] with the [O]. ")
/mob/living/simple_animal/vox/armalis/verb/fire_quill(mob/target as mob in oview())
set name = "Fire quill"
set desc = "Fires a viciously pointed quill at a high speed."
set category = "Alien"
if(quills<=0)
return
src << "\red You launch a razor-sharp quill at [target]!"
for(var/mob/O in oviewers())
if ((O.client && !( O.blinded )))
O << "\red [src] launches a razor-sharp quill at [target]!"
var/obj/item/weapon/arrow/quill/Q = new(loc)
Q.fingerprintslast = src.ckey
Q.throw_at(target,10,20)
quills--
spawn(100)
src << "\red You feel a fresh quill slide into place."
quills++
/mob/living/simple_animal/vox/armalis/verb/message_mob()
set category = "Alien"
set name = "Commune with creature"
set desc = "Send a telepathic message to an unlucky recipient."
var/list/targets = list()
var/target = null
var/text = null
targets += getmobs() //Fill list, prompt user with list
target = input("Select a creature!", "Speak to creature", null, null) as null|anything in targets
text = input("What would you like to say?", "Speak to creature", null, null)
if (!target || !text)
return
var/mob/M = targets[target]
if(istype(M, /mob/dead/observer) || M.stat == DEAD)
src << "Not even the armalis can speak to the dead."
return
M << "\blue Like lead slabs crashing into the ocean, alien thoughts drop into your mind: [text]"
if(istype(M,/mob/living/carbon/human))
var/mob/living/carbon/human/H = M
if(H.dna.mutantrace == "vox")
return
H << "\red Your nose begins to bleed..."
H.drip(1)
/mob/living/simple_animal/vox/armalis/verb/shriek()
set category = "Alien"
set name = "Shriek"
set desc = "Give voice to a psychic shriek."
/mob/living/simple_animal/vox/armalis/attackby(var/obj/item/O as obj, var/mob/user as mob)
if(istype(O,/obj/item/vox/armalis_armour))
user.drop_item()
armour = O
speed = 1
maxHealth += 200
health += 200
O.loc = src
visible_message("\blue [src] is quickly outfitted in [O] by [user].","\blue You quickly outfit [src] in [O].")
regenerate_icons()
return
if(istype(O,/obj/item/vox/armalis_amp))
user.drop_item()
amp = O
O.loc = src
visible_message("\blue [src] is quickly outfitted in [O] by [user].","\blue You quickly outfit [src] in [O].")
regenerate_icons()
return
return ..()
/mob/living/simple_animal/vox/armalis/regenerate_icons()
overlays = list()
if(armour)
var/icon/armour = image('icons/mob/vox.dmi',"armour")
speed = 1
overlays += armour
if(amp)
var/icon/amp = image('icons/mob/vox.dmi',"amplifier")
overlays += amp
return
/obj/item/vox/armalis_armour
name = "strange armour"
desc = "Hulking reinforced armour for something huge."
icon = 'icons/obj/clothing/suits.dmi'
icon_state = "armalis_armour"
item_state = "armalis_armour"
/obj/item/vox/armalis_amp
name = "strange lenses"
desc = "A series of metallic lenses and chains."
icon = 'icons/obj/clothing/hats.dmi'
icon_state = "amp"
item_state = "amp"
+83 -15
View File
@@ -583,24 +583,29 @@ var/list/slot_equipment_priority = list( \
pulling = null
/mob/proc/start_pulling(var/atom/movable/AM)
if ( !AM || !usr || src==AM || !isturf(src.loc) ) //if there's no person pulling OR the person is pulling themself OR the object being pulled is inside something: abort!
return
if (!( AM.anchored ))
if(pulling)
var/pulling_old = pulling
stop_pulling()
// Are we pulling the same thing twice? Just stop pulling.
if(pulling_old == AM)
return
src.pulling = AM
AM.pulledby = src
if(ismob(AM))
var/mob/M = AM
if(!iscarbon(src))
M.LAssailant = null
else
M.LAssailant = usr
if (AM.anchored)
return
var/mob/M = AM
if(ismob(AM))
if(!iscarbon(src))
M.LAssailant = null
else
M.LAssailant = usr
if(pulling)
var/pulling_old = pulling
stop_pulling()
// Are we pulling the same thing twice? Just stop pulling.
if(pulling_old == AM)
return
src.pulling = AM
AM.pulledby = src
/mob/proc/can_use_hands()
return
@@ -888,3 +893,66 @@ note dizziness decrements automatically in the mob's Life() proc.
/mob/proc/flash_weak_pain()
flick("weak_pain",pain)
mob/verb/yank_out_object()
set category = "Object"
set name = "Yank out object"
set desc = "Remove an embedded item at the cost of bleeding and pain."
set src in view(1)
if(!isliving(usr) || usr.next_move > world.time)
return
usr.next_move = world.time + 20
if(usr.stat == 1)
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/list/valid_objects = list()
var/self = null
if(S == U)
self = 1 // Removing object from yourself.
for(var/obj/item/weapon/W in embedded)
if(W.w_class >= 2)
valid_objects += W
if(!valid_objects.len)
if(self)
src << "You have nothing stuck in your body that is large enough to remove."
else
U << "[src] has nothing stuck in their wounds that is large enough to remove."
return
var/obj/item/weapon/selection = input("What do you want to yank out?", "Embedded objects") in valid_objects
if(self)
src << "<span class='warning'>You attempt to get a good grip on the [selection] in your body.</span>"
else
U << "<span class='warning'>You attempt to get a good grip on the [selection] in [S]'s body.</span>"
if(!do_after(U, 80))
return
if(!selection || !S || !U)
return
if(self)
visible_message("<span class='warning'><b>[src] rips [selection] out of their body.</b></span>","<span class='warning'><b>You rip [selection] out of your body.</b></span>")
else
visible_message("<span class='warning'><b>[usr] rips [selection] out of [src]'s body.</b></span>","<span class='warning'><b>[usr] rips [selection] out of your body.</b></span>")
selection.loc = get_turf(src)
for(var/obj/item/weapon/O in pinned)
if(O == selection)
pinned -= O
if(!pinned.len)
anchored = 0
return 1
+9 -6
View File
@@ -85,6 +85,8 @@
var/lastpuke = 0
var/unacidable = 0
var/small = 0
var/list/pinned = list() //List of things pinning this creature to walls (see living_defense.dm)
var/list/embedded = list() //Embedded items, since simple mobs don't have organs.
var/name_archive //For admin things like possession
@@ -206,12 +208,13 @@
//Whether or not mobs can understand other mobtypes. These stay in /mob so that ghosts can hear everything.
var/universal_speak = 0 // Set to 1 to enable the mob to speak to everyone -- TLE
var/robot_talk_understand = 0
var/alien_talk_understand = 0
var/tajaran_talk_understand = 0
var/soghun_talk_understand = 0
var/skrell_talk_understand = 0
var/vox_talk_understand = 0
var/robot_talk_understand = 0
var/alien_talk_understand = 0
var/tajaran_talk_understand = 0
var/soghun_talk_understand = 0
var/skrell_talk_understand = 0
var/vox_talk_understand = 0
var/kidan_talk_understand = 0
var/has_limbs = 1 //Whether this mob have any limbs he can move with
var/can_stand = 1 //Whether this mob have ability to stand
+4 -1
View File
@@ -256,7 +256,6 @@
if(!mob.canmove) return
//if(istype(mob.loc, /turf/space) || (mob.flags & NOGRAV))
// if(!mob.Process_Spacemove(0)) return 0
@@ -279,6 +278,10 @@
src << "\blue You're restrained! You can't move!"
return 0
if(mob.pinned.len)
src << "\blue You're pinned to a wall by [mob.pinned[1]]!"
return 0
move_delay = world.time//set move delay
mob.last_move_intent = world.time + 10
switch(mob.m_intent)
+32 -8
View File
@@ -269,6 +269,14 @@
proc/AttemptLateSpawn(rank)
if (src != usr)
return 0
if(!ticker || ticker.current_state != GAME_STATE_PLAYING)
usr << "\red The round is either not ready, or has already finished..."
return 0
if(!enter_allowed)
usr << "\blue There is an administrative lock on entering the game!"
return 0
if(!IsJobAvailable(rank))
src << alert("[rank] is not available. Please try another.")
return 0
@@ -314,8 +322,10 @@
if(emergency_shuttle) //In case Nanotrasen decides reposess CentComm's shuttles.
if(emergency_shuttle.direction == 2) //Shuttle is going to centcomm, not recalled
dat += "<font color='red'><b>The station has been evacuated.</b></font><br>"
if(emergency_shuttle.direction == 1 && emergency_shuttle.timeleft() < 300) //Shuttle is past the point of no recall
if(emergency_shuttle.direction == 1 && emergency_shuttle.timeleft() < 300 && emergency_shuttle.alert == 0) // Emergency shuttle is past the point of no recall
dat += "<font color='red'>The station is currently undergoing evacuation procedures.</font><br>"
if(emergency_shuttle.direction == 1 && emergency_shuttle.alert == 1) // Crew transfer initiated
dat += "<font color='red'>The station is currently undergoing crew transfer procedures.</font><br>"
dat += "Choose from the following open positions:<br>"
for(var/datum/job/job in job_master.occupations)
@@ -338,21 +348,35 @@
new_character.lastarea = get_area(loc)
if(client.prefs.species == "Tajaran") //This is like the worst, but it works, so meh. - Erthilo
if(is_alien_whitelisted(src, "Tajaran"|| !config.usealienwhitelist))
if(is_alien_whitelisted(src, "Tajaran") || !config.usealienwhitelist)
new_character.dna.mutantrace = "tajaran"
new_character.tajaran_talk_understand = 1
if(client.prefs.species == "Unathi")
if(is_alien_whitelisted(src, "Soghun"|| !config.usealienwhitelist))
if(is_alien_whitelisted(src, "Soghun") || !config.usealienwhitelist)
new_character.dna.mutantrace = "lizard"
new_character.soghun_talk_understand = 1
if(client.prefs.species == "Skrell")
if(is_alien_whitelisted(src, "Skrell"|| !config.usealienwhitelist))
if(is_alien_whitelisted(src, "Skrell") || !config.usealienwhitelist)
new_character.dna.mutantrace = "skrell"
new_character.skrell_talk_understand = 1
if(client.prefs.species == "Vox")
if(is_alien_whitelisted(src, "Vox"|| !config.usealienwhitelist))
new_character.dna.mutantrace = "vox"
new_character.vox_talk_understand = 1
if(client.prefs.species == "Kidan")
if(is_alien_whitelisted(src, "Kidan") || !config.usealienwhitelist)
new_character.dna.mutantrace = "kidan"
new_character.kidan_talk_understand = 1
if(client.prefs.language == "Tajaran")
if(is_alien_whitelisted(src, "Language_Tajaran") || !config.usealienwhitelist)
new_character.tajaran_talk_understand = 1
if(client.prefs.language == "Unathi")
if(is_alien_whitelisted(src, "Language_Soghun") || !config.usealienwhitelist)
new_character.soghun_talk_understand = 1
if(client.prefs.language == "Skrell")
if(is_alien_whitelisted(src, "Language_Skrell") || !config.usealienwhitelist)
new_character.skrell_talk_understand = 1
if(client.prefs.language == "Kidan")
if(is_alien_whitelisted(src, "Language_Kidan") || !config.usealienwhitelist)
new_character.kidan_talk_understand = 1
if(ticker.random_players)
new_character.gender = pick(MALE, FEMALE)
@@ -144,9 +144,10 @@ datum/preferences
icobase = 'icons/mob/human_races/r_lizard.dmi'
if("Skrell")
icobase = 'icons/mob/human_races/r_skrell.dmi'
if("Vox")
icobase = 'icons/mob/human_races/r_vox.dmi'
if("Kidan")
icobase = 'icons/mob/human_races/r_kidan.dmi'
else
icobase = 'icons/mob/human_races/r_human.dmi'
@@ -430,6 +431,19 @@ datum/preferences
clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-vir"), ICON_OVERLAY)
if(4)
clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY)
if(ROBOTICIST)
clothes_s = new /icon('icons/mob/uniform.dmi', "robotics_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/items_righthand.dmi', "toolbox_blue"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_open"), ICON_OVERLAY)
switch(backbag)
if(2)
clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
if(3)
clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY)
if(4)
clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY)
else if(job_engsec_high)
switch(job_engsec_high)
@@ -537,19 +551,7 @@ datum/preferences
clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY)
if(4)
clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY)
if(ROBOTICIST)
clothes_s = new /icon('icons/mob/uniform.dmi', "robotics_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/items_righthand.dmi', "toolbox_blue"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_open"), ICON_OVERLAY)
switch(backbag)
if(2)
clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
if(3)
clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY)
if(4)
clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY)
if(AI)//Gives AI and borgs assistant-wear, so they can still customize their character
clothes_s = new /icon('icons/mob/uniform.dmi', "grey_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
@@ -285,7 +285,6 @@
icon_state = "hair_e"
gender = MALE // turnoff!
bald
name = "Bald"
icon_state = "bald"
@@ -306,7 +305,7 @@
name = "Shaved"
icon_state = "bald"
gender = NEUTER
species_allowed = list("Human","Unathi","Tajaran","Skrell","Vox")
species_allowed = list("Human","Unathi","Tajaran","Skrell","Vox","Kidan")
watson
name = "Watson Mustache"
@@ -484,7 +483,7 @@
species_allowed = list("Tajaran")
taj_ears_spiky
name = "Tajara Spiky"
name = "Tajara Spiky"
icon_state = "hair_tajspiky"
species_allowed = list("Tajaran")
+5 -3
View File
@@ -50,7 +50,7 @@
for(var/mob/M in player_list)
if(istype(M, /mob/new_player))
continue
if(M.client && M.client.holder && M.client.holder.rights & R_ADMIN && (M.client.prefs.toggles & CHAT_DEAD)) //admins can toggle deadchat on and off. This is a proc in admin.dm and is only give to Administrators and above
if(M.client && M.client.holder && (M.client.holder.rights & R_ADMIN|R_MOD) && (M.client.prefs.toggles & CHAT_DEAD)) //admins can toggle deadchat on and off. This is a proc in admin.dm and is only give to Administrators and above
M << rendered //Admins can hear deadchat, if they choose to, no matter if they're blind/deaf or not.
else if(M.stat == DEAD)
M.show_message(rendered, 2) //Takes into account blindness and such.
@@ -69,7 +69,7 @@
return 1
return 0
/mob/proc/say_quote(var/text,var/is_speaking_soghun,var/is_speaking_skrell,var/is_speaking_tajaran,var/is_speaking_vox)
/mob/proc/say_quote(var/text,var/is_speaking_soghun,var/is_speaking_skrell,var/is_speaking_tajaran,var/is_speaking_vox,var/is_speaking_kidan)
if(!text)
return "says, \"...\""; //not the best solution, but it will stop a large number of runtimes. The cause is somewhere in the Tcomms code
//tcomms code is still runtiming somewhere here
@@ -81,7 +81,9 @@
if (is_speaking_tajaran)
return "<span class='say_quote'>mrowls</span>, \"<span class='tajaran'>[text]</span>\"";
if (is_speaking_vox)
return "<span class='say_quote'>chirps</span>, \"<span class='vox'>[text]</span>\"";
return "<span class='say_quote'>shrieks</span>, \"<span class='vox'>[text]</span>\"";
if (is_speaking_kidan)
return "<span class='say_quote'>chitters</span>, \"<span class='kidan'>[text]</span>\"";
//Needs Virus2
// if (src.disease_symptoms & DISEASE_HOARSE)
// return "rasps, \"[text]\"";
+5 -3
View File
@@ -62,9 +62,11 @@
name = "storage"
master = null
/obj/screen/storage/attackby(W, mob/user as mob)
src.master.attackby(W, user)
return
/obj/screen/storage/attack_hand(mob/user)
if(master)
var/obj/item/I = user.get_active_hand()
if(I)
master.attackby(I, user)
/obj/screen/zone_sel
name = "Damage Zone"
+96 -21
View File
@@ -20,29 +20,104 @@
flick("h2monkey", animation)
sleep(48)
//animation = null
var/mob/living/carbon/monkey/O = new /mob/living/carbon/monkey( loc )
del(animation)
O.name = "monkey"
O.dna = dna
dna = null
O.dna.uni_identity = "00600200A00E0110148FC01300B009"
//O.dna.struc_enzymes = "0983E840344C39F4B059D5145FC5785DC6406A4BB8"
O.dna.struc_enzymes = "[copytext(O.dna.struc_enzymes,1,1+3*(STRUCDNASIZE-1))]BB8"
O.loc = loc
O.viruses = viruses
viruses = list()
for(var/datum/disease/D in O.viruses)
D.affected_mob = O
var/mob/living/carbon/monkey/O = null
switch(dna.mutantrace)
if("tajara")
O = new /mob/living/carbon/monkey/tajara( loc )
O.name = "farwa"
O.dna = dna
dna = null
O.dna.uni_identity = "000000000000000000DC00000660004DA0A0E00"
//O.dna.struc_enzymes = "0983E840344C39F4B059D5145FC5785DC6406A4BB8"
O.dna.struc_enzymes = "[copytext(O.dna.struc_enzymes,1,1+3*(STRUCDNASIZE-1))]BB8"
O.loc = loc
O.viruses = viruses
viruses = list()
for(var/datum/disease/D in O.viruses)
D.affected_mob = O
if (client)
client.mob = O
if(mind)
mind.transfer_to(O)
O << "<B>You are now a farwa. </B>"
O.a_intent = "hurt"
spawn(0)//To prevent the proc from returning null.
del(src)
del(animation)
if("lizard")
O = new /mob/living/carbon/monkey/unathi( loc )
O.name = "stok"
O.dna = dna
dna = null
O.dna.uni_identity = "000000000000000000DC00000660002A8044C5D"
//O.dna.struc_enzymes = "0983E840344C39F4B059D5145FC5785DC6406A4BB8"
O.dna.struc_enzymes = "[copytext(O.dna.struc_enzymes,1,1+3*(STRUCDNASIZE-1))]BB8"
O.loc = loc
O.viruses = viruses
viruses = list()
for(var/datum/disease/D in O.viruses)
D.affected_mob = O
if (client)
client.mob = O
if(mind)
mind.transfer_to(O)
O << "<B>You are now a stok. </B>"
O.a_intent = "hurt"
spawn(0)//To prevent the proc from returning null.
del(src)
del(animation)
if("skrell")
O = new /mob/living/carbon/monkey/unathi( loc )
O.name = "neaera"
O.dna = dna
dna = null
O.dna.uni_identity = "000000000000000000DC00000660002A8044C5D"
//O.dna.struc_enzymes = "0983E840344C39F4B059D5145FC5785DC6406A4BB8"
O.dna.struc_enzymes = "[copytext(O.dna.struc_enzymes,1,1+3*(STRUCDNASIZE-1))]BB8"
O.loc = loc
O.viruses = viruses
viruses = list()
for(var/datum/disease/D in O.viruses)
D.affected_mob = O
if (client)
client.mob = O
if(mind)
mind.transfer_to(O)
O << "<B>You are now a neaera. </B>"
O.a_intent = "hurt"
spawn(0)//To prevent the proc from returning null.
del(src)
del(animation)
else
O = new /mob/living/carbon/monkey( loc )
O.name = "monkey"
O.dna = dna
dna = null
O.dna.uni_identity = "00600200A00E0110148FC01300B009"
//O.dna.struc_enzymes = "0983E840344C39F4B059D5145FC5785DC6406A4BB8"
O.dna.struc_enzymes = "[copytext(O.dna.struc_enzymes,1,1+3*(STRUCDNASIZE-1))]BB8"
O.loc = loc
O.viruses = viruses
viruses = list()
for(var/datum/disease/D in O.viruses)
D.affected_mob = O
if (client)
client.mob = O
if(mind)
mind.transfer_to(O)
O << "<B>You are now a monkey.</B>"
O.a_intent = "hurt"
spawn(0)//To prevent the proc from returning null.
del(src)
del(animation)
if (client)
client.mob = O
if(mind)
mind.transfer_to(O)
O.a_intent = "hurt"
O << "<B>You are now a monkey.</B>"
spawn(0)//To prevent the proc from returning null.
del(src)
return O
/mob/new_player/AIize()