mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-20 03:25:49 +01:00
Merge branch 'BEF-staging'
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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]")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>"
|
||||
|
||||
@@ -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])
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
..()
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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")
|
||||
|
||||
|
||||
@@ -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]\"";
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user