From 4d920bef59c40100a7e417ebe1ee0b50b4d714d8 Mon Sep 17 00:00:00 2001 From: JimTheCactus Date: Tue, 29 Jul 2014 23:19:29 -0600 Subject: [PATCH 01/83] Corrected variable edited field for blood dna. Was dna, not b_dna like it should be. --- code/WorkInProgress/computer3/computers/medical.dm | 4 ++-- code/game/machinery/computer/medical.dm | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/WorkInProgress/computer3/computers/medical.dm b/code/WorkInProgress/computer3/computers/medical.dm index 7fc5da12326..0168185b104 100644 --- a/code/WorkInProgress/computer3/computers/medical.dm +++ b/code/WorkInProgress/computer3/computers/medical.dm @@ -344,10 +344,10 @@ src.temp = text("Blood Type:
\n\tA- A+
\n\tB- B+
\n\tAB- AB+
\n\tO- O+
", src, src, src, src, src, src, src, src) if("b_dna") if (istype(src.active1, /datum/data/record)) - var/t1 = copytext(sanitize(input("Please input DNA hash:", "Med. records", src.active1.fields["dna"], null) as text),1,MAX_MESSAGE_LEN) + var/t1 = copytext(sanitize(input("Please input DNA hash:", "Med. records", src.active1.fields["b_dna"], null) as text),1,MAX_MESSAGE_LEN) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active1 != a1)) return - src.active1.fields["dna"] = t1 + src.active1.fields["b_dna"] = t1 if("vir_name") var/datum/data/record/v = locate(href_list["edit_vir"]) if (v) diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index 38985931728..6ffc97687e1 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -334,10 +334,10 @@ src.temp = text("Blood Type:
\n\tA- A+
\n\tB- B+
\n\tAB- AB+
\n\tO- O+
", src, src, src, src, src, src, src, src) if("b_dna") if (istype(src.active1, /datum/data/record)) - var/t1 = copytext(trim(sanitize(input("Please input DNA hash:", "Med. records", src.active1.fields["dna"], null) as text)),1,MAX_MESSAGE_LEN) + var/t1 = copytext(trim(sanitize(input("Please input DNA hash:", "Med. records", src.active1.fields["b_dna"], null) as text)),1,MAX_MESSAGE_LEN) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active1 != a1)) return - src.active1.fields["dna"] = t1 + src.active1.fields["b_dna"] = t1 if("vir_name") var/datum/data/record/v = locate(href_list["edit_vir"]) if (v) From 19b032d8e8b6e3ce8c528bdb66b06f3b4fcbee90 Mon Sep 17 00:00:00 2001 From: JimTheCactus Date: Wed, 30 Jul 2014 01:09:26 -0600 Subject: [PATCH 02/83] Fixed bad reference to active 1 in the medical computer's DNA field inputs. --- code/WorkInProgress/computer3/computers/medical.dm | 8 ++++---- code/game/machinery/computer/medical.dm | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/code/WorkInProgress/computer3/computers/medical.dm b/code/WorkInProgress/computer3/computers/medical.dm index 0168185b104..51c242e86c7 100644 --- a/code/WorkInProgress/computer3/computers/medical.dm +++ b/code/WorkInProgress/computer3/computers/medical.dm @@ -343,11 +343,11 @@ if (istype(src.active2, /datum/data/record)) src.temp = text("Blood Type:
\n\tA- A+
\n\tB- B+
\n\tAB- AB+
\n\tO- O+
", src, src, src, src, src, src, src, src) if("b_dna") - if (istype(src.active1, /datum/data/record)) - var/t1 = copytext(sanitize(input("Please input DNA hash:", "Med. records", src.active1.fields["b_dna"], null) as text),1,MAX_MESSAGE_LEN) - if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active1 != a1)) + if (istype(src.active2, /datum/data/record)) + var/t1 = copytext(sanitize(input("Please input DNA hash:", "Med. records", src.active2.fields["b_dna"], null) as text),1,MAX_MESSAGE_LEN) + if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return - src.active1.fields["b_dna"] = t1 + src.active2.fields["b_dna"] = t1 if("vir_name") var/datum/data/record/v = locate(href_list["edit_vir"]) if (v) diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index 6ffc97687e1..18f1ca059fc 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -333,11 +333,11 @@ if (istype(src.active2, /datum/data/record)) src.temp = text("Blood Type:
\n\tA- A+
\n\tB- B+
\n\tAB- AB+
\n\tO- O+
", src, src, src, src, src, src, src, src) if("b_dna") - if (istype(src.active1, /datum/data/record)) - var/t1 = copytext(trim(sanitize(input("Please input DNA hash:", "Med. records", src.active1.fields["b_dna"], null) as text)),1,MAX_MESSAGE_LEN) - if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active1 != a1)) + if (istype(src.active2, /datum/data/record)) + var/t1 = copytext(trim(sanitize(input("Please input DNA hash:", "Med. records", src.active2.fields["b_dna"], null) as text)),1,MAX_MESSAGE_LEN) + if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return - src.active1.fields["b_dna"] = t1 + src.active2.fields["b_dna"] = t1 if("vir_name") var/datum/data/record/v = locate(href_list["edit_vir"]) if (v) From e02ccd556433821af9b5ef5cf4e7f3d0f95b34bc Mon Sep 17 00:00:00 2001 From: JimTheCactus Date: Tue, 29 Jul 2014 23:29:16 -0600 Subject: [PATCH 03/83] Ported blank field patch to Computer3 systems --- .../computer3/computers/medical.dm | 26 +++++++++---------- .../computer3/computers/security.dm | 16 ++++++------ 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/code/WorkInProgress/computer3/computers/medical.dm b/code/WorkInProgress/computer3/computers/medical.dm index 7fc5da12326..72a2ada7543 100644 --- a/code/WorkInProgress/computer3/computers/medical.dm +++ b/code/WorkInProgress/computer3/computers/medical.dm @@ -263,7 +263,7 @@ switch(href_list["field"]) if("fingerprint") if (istype(src.active1, /datum/data/record)) - var/t1 = copytext(sanitize(input("Please input fingerprint hash:", "Med. records", src.active1.fields["fingerprint"], null) as text),1,MAX_MESSAGE_LEN) + var/t1 = copytext(trim(sanitize(input("Please input fingerprint hash:", "Med. records", src.active1.fields["fingerprint"], null) as text)),1,MAX_MESSAGE_LEN) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active1 != a1)) return src.active1.fields["fingerprint"] = t1 @@ -281,55 +281,55 @@ src.active1.fields["age"] = t1 if("mi_dis") if (istype(src.active2, /datum/data/record)) - var/t1 = copytext(sanitize(input("Please input minor disabilities list:", "Med. records", src.active2.fields["mi_dis"], null) as text),1,MAX_MESSAGE_LEN) + var/t1 = copytext(trim(sanitize(input("Please input minor disabilities list:", "Med. records", src.active2.fields["mi_dis"], null) as text)),1,MAX_MESSAGE_LEN) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return src.active2.fields["mi_dis"] = t1 if("mi_dis_d") if (istype(src.active2, /datum/data/record)) - var/t1 = copytext(sanitize(input("Please summarize minor dis.:", "Med. records", src.active2.fields["mi_dis_d"], null) as message),1,MAX_MESSAGE_LEN) + var/t1 = copytext(trim(sanitize(input("Please summarize minor dis.:", "Med. records", src.active2.fields["mi_dis_d"], null) as message)),1,MAX_MESSAGE_LEN) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return src.active2.fields["mi_dis_d"] = t1 if("ma_dis") if (istype(src.active2, /datum/data/record)) - var/t1 = copytext(sanitize(input("Please input major diabilities list:", "Med. records", src.active2.fields["ma_dis"], null) as text),1,MAX_MESSAGE_LEN) + var/t1 = copytext(trim(sanitize(input("Please input major diabilities list:", "Med. records", src.active2.fields["ma_dis"], null) as text)),1,MAX_MESSAGE_LEN) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return src.active2.fields["ma_dis"] = t1 if("ma_dis_d") if (istype(src.active2, /datum/data/record)) - var/t1 = copytext(sanitize(input("Please summarize major dis.:", "Med. records", src.active2.fields["ma_dis_d"], null) as message),1,MAX_MESSAGE_LEN) + var/t1 = copytext(trim(sanitize(input("Please summarize major dis.:", "Med. records", src.active2.fields["ma_dis_d"], null) as message)),1,MAX_MESSAGE_LEN) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return src.active2.fields["ma_dis_d"] = t1 if("alg") if (istype(src.active2, /datum/data/record)) - var/t1 = copytext(sanitize(input("Please state allergies:", "Med. records", src.active2.fields["alg"], null) as text),1,MAX_MESSAGE_LEN) + var/t1 = copytext(trim(sanitize(input("Please state allergies:", "Med. records", src.active2.fields["alg"], null) as text)),1,MAX_MESSAGE_LEN) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return src.active2.fields["alg"] = t1 if("alg_d") if (istype(src.active2, /datum/data/record)) - var/t1 = copytext(sanitize(input("Please summarize allergies:", "Med. records", src.active2.fields["alg_d"], null) as message),1,MAX_MESSAGE_LEN) + var/t1 = copytext(trim(sanitize(input("Please summarize allergies:", "Med. records", src.active2.fields["alg_d"], null) as message)),1,MAX_MESSAGE_LEN) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return src.active2.fields["alg_d"] = t1 if("cdi") if (istype(src.active2, /datum/data/record)) - var/t1 = copytext(sanitize(input("Please state diseases:", "Med. records", src.active2.fields["cdi"], null) as text),1,MAX_MESSAGE_LEN) + var/t1 = copytext(trim(sanitize(input("Please state diseases:", "Med. records", src.active2.fields["cdi"], null) as text)),1,MAX_MESSAGE_LEN) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return src.active2.fields["cdi"] = t1 if("cdi_d") if (istype(src.active2, /datum/data/record)) - var/t1 = copytext(sanitize(input("Please summarize diseases:", "Med. records", src.active2.fields["cdi_d"], null) as message),1,MAX_MESSAGE_LEN) + var/t1 = copytext(trim(sanitize(input("Please summarize diseases:", "Med. records", src.active2.fields["cdi_d"], null) as message)),1,MAX_MESSAGE_LEN) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return src.active2.fields["cdi_d"] = t1 if("notes") if (istype(src.active2, /datum/data/record)) - var/t1 = copytext(html_encode(input("Please summarize notes:", "Med. records", html_decode(src.active2.fields["notes"]), null) as message),1,MAX_MESSAGE_LEN) + var/t1 = copytext(html_encode(trim(input("Please summarize notes:", "Med. records", html_decode(src.active2.fields["notes"]), null) as message)),1,MAX_MESSAGE_LEN) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return src.active2.fields["notes"] = t1 @@ -344,21 +344,21 @@ src.temp = text("Blood Type:
\n\tA- A+
\n\tB- B+
\n\tAB- AB+
\n\tO- O+
", src, src, src, src, src, src, src, src) if("b_dna") if (istype(src.active1, /datum/data/record)) - var/t1 = copytext(sanitize(input("Please input DNA hash:", "Med. records", src.active1.fields["dna"], null) as text),1,MAX_MESSAGE_LEN) + var/t1 = copytext(sanitize(trim(input("Please input DNA hash:", "Med. records", src.active1.fields["dna"], null) as text)),1,MAX_MESSAGE_LEN) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active1 != a1)) return src.active1.fields["dna"] = t1 if("vir_name") var/datum/data/record/v = locate(href_list["edit_vir"]) if (v) - var/t1 = copytext(sanitize(input("Please input pathogen name:", "VirusDB", v.fields["name"], null) as text),1,MAX_MESSAGE_LEN) + var/t1 = copytext(trim(sanitize(input("Please input pathogen name:", "VirusDB", v.fields["name"], null) as text)),1,MAX_MESSAGE_LEN) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active1 != a1)) return v.fields["name"] = t1 if("vir_desc") var/datum/data/record/v = locate(href_list["edit_vir"]) if (v) - var/t1 = copytext(sanitize(input("Please input information about pathogen:", "VirusDB", v.fields["description"], null) as message),1,MAX_MESSAGE_LEN) + var/t1 = copytext(trim(sanitize(input("Please input information about pathogen:", "VirusDB", v.fields["description"], null) as message)),1,MAX_MESSAGE_LEN) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active1 != a1)) return v.fields["description"] = t1 diff --git a/code/WorkInProgress/computer3/computers/security.dm b/code/WorkInProgress/computer3/computers/security.dm index f193b071396..f4682a8d506 100644 --- a/code/WorkInProgress/computer3/computers/security.dm +++ b/code/WorkInProgress/computer3/computers/security.dm @@ -467,19 +467,19 @@ What a mess.*/ switch(href_list["field"]) if("name") if (istype(active1, /datum/data/record)) - var/t1 = input("Please input name:", "Secure. records", active1.fields["name"], null) as text + var/t1 = reject_bad_name(input("Please input name:", "Secure. records", active1.fields["name"], null) as text) if ((!( t1 ) || !length(trim(t1)) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon)))) || active1 != a1) return active1.fields["name"] = t1 if("id") if (istype(active2, /datum/data/record)) - var/t1 = copytext(sanitize(input("Please input id:", "Secure. records", active1.fields["id"], null) as text),1,MAX_MESSAGE_LEN) + var/t1 = copytext(trim(sanitize(input("Please input id:", "Secure. records", active1.fields["id"], null) as text)),1,MAX_MESSAGE_LEN) if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active1 != a1)) return active1.fields["id"] = t1 if("fingerprint") if (istype(active1, /datum/data/record)) - var/t1 = copytext(sanitize(input("Please input fingerprint hash:", "Secure. records", active1.fields["fingerprint"], null) as text),1,MAX_MESSAGE_LEN) + var/t1 = copytext(trim(sanitize(input("Please input fingerprint hash:", "Secure. records", active1.fields["fingerprint"], null) as text)),1,MAX_MESSAGE_LEN) if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active1 != a1)) return active1.fields["fingerprint"] = t1 @@ -497,31 +497,31 @@ What a mess.*/ active1.fields["age"] = t1 if("mi_crim") if (istype(active2, /datum/data/record)) - var/t1 = copytext(sanitize(input("Please input minor disabilities list:", "Secure. records", active2.fields["mi_crim"], null) as text),1,MAX_MESSAGE_LEN) + var/t1 = copytext(trim(sanitize(input("Please input minor disabilities list:", "Secure. records", active2.fields["mi_crim"], null) as text)),1,MAX_MESSAGE_LEN) if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active2 != a2)) return active2.fields["mi_crim"] = t1 if("mi_crim_d") if (istype(active2, /datum/data/record)) - var/t1 = copytext(sanitize(input("Please summarize minor dis.:", "Secure. records", active2.fields["mi_crim_d"], null) as message),1,MAX_MESSAGE_LEN) + var/t1 = copytext(trim(sanitize(input("Please summarize minor dis.:", "Secure. records", active2.fields["mi_crim_d"], null) as message)),1,MAX_MESSAGE_LEN) if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active2 != a2)) return active2.fields["mi_crim_d"] = t1 if("ma_crim") if (istype(active2, /datum/data/record)) - var/t1 = copytext(sanitize(input("Please input major diabilities list:", "Secure. records", active2.fields["ma_crim"], null) as text),1,MAX_MESSAGE_LEN) + var/t1 = copytext(trim(sanitize(input("Please input major diabilities list:", "Secure. records", active2.fields["ma_crim"], null) as text)),1,MAX_MESSAGE_LEN) if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active2 != a2)) return active2.fields["ma_crim"] = t1 if("ma_crim_d") if (istype(active2, /datum/data/record)) - var/t1 = copytext(sanitize(input("Please summarize major dis.:", "Secure. records", active2.fields["ma_crim_d"], null) as message),1,MAX_MESSAGE_LEN) + var/t1 = copytext(trim(sanitize(input("Please summarize major dis.:", "Secure. records", active2.fields["ma_crim_d"], null) as message)),1,MAX_MESSAGE_LEN) if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active2 != a2)) return active2.fields["ma_crim_d"] = t1 if("notes") if (istype(active2, /datum/data/record)) - var/t1 = copytext(html_encode(input("Please summarize notes:", "Secure. records", html_decode(active2.fields["notes"]), null) as message),1,MAX_MESSAGE_LEN) + var/t1 = copytext(html_encode(trim(input("Please summarize notes:", "Secure. records", html_decode(active2.fields["notes"]), null) as message)),1,MAX_MESSAGE_LEN) if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active2 != a2)) return active2.fields["notes"] = t1 From da6190aa25797fd8513ef182e77a503f5a68048f Mon Sep 17 00:00:00 2001 From: Atlantiscze Date: Wed, 30 Jul 2014 12:15:15 +0200 Subject: [PATCH 04/83] Fixes #5827 - Drones can now use .d to access Drone chat - Cleaner and nicer check for dronechat, uses proper data from say.dm shortcut list. - MISSING: .d alternative for "Russian localization" (Does anyone actually use that?) --- code/modules/mob/living/say.dm | 2 ++ code/modules/mob/living/silicon/robot/drone/drone.dm | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 3344a9e2101..01c4ad851c2 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -14,6 +14,7 @@ var/list/department_radio_keys = list( ":t" = "Syndicate", "#t" = "Syndicate", ".t" = "Syndicate", ":u" = "Supply", "#u" = "Supply", ".u" = "Supply", ":g" = "changeling", "#g" = "changeling", ".g" = "changeling", + ":d" = "dronechat", "#d" = "dronechat", ".d" = "dronechat", ":R" = "right ear", "#R" = "right ear", ".R" = "right ear", ":L" = "left ear", "#L" = "left ear", ".L" = "left ear", @@ -30,6 +31,7 @@ var/list/department_radio_keys = list( ":T" = "Syndicate", "#T" = "Syndicate", ".T" = "Syndicate", ":U" = "Supply", "#U" = "Supply", ".U" = "Supply", ":G" = "changeling", "#G" = "changeling", ".G" = "changeling", + ":D" = "dronechat", "#D" = "dronechat", ".D" = "dronechat", //kinda localization -- rastaf0 //same keys as above, but on russian keyboard layout. This file uses cp1251 as encoding. diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index 0ab4e42028d..bcce6d2f869 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -103,7 +103,7 @@ return emote(copytext(message,2)) else if(length(message) >= 2) - if(copytext(message, 1 ,3) == ":d" || copytext(message, 1 ,3) == ":D") + if(parse_message_mode(message, "NONE") == "dronechat") if(!is_component_functioning("radio")) src << "\red Your radio transmitter isn't functional." From 17574b8b20e57880d946efb3907641c5f39ec342 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Wed, 30 Jul 2014 15:13:53 -0400 Subject: [PATCH 05/83] Allows escape shuttle to scan IDs from within UI Fixes #5592 --- baystation12.dme | 2 +- .../shuttles/escape_pods.dm} | 19 ++++++++ code/modules/shuttles/shuttle_emergency.dm | 43 ++++--------------- .../escape_shuttle_control_console.tmpl | 6 ++- 4 files changed, 34 insertions(+), 36 deletions(-) rename code/{game/machinery/embedded_controller/escape_pod_docking_controller.dm => modules/shuttles/escape_pods.dm} (87%) diff --git a/baystation12.dme b/baystation12.dme index 7cee116ae4d..0389e40f4e4 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -397,7 +397,6 @@ #include "code\game\machinery\embedded_controller\docking_program_multi.dm" #include "code\game\machinery\embedded_controller\embedded_controller_base.dm" #include "code\game\machinery\embedded_controller\embedded_program_base.dm" -#include "code\game\machinery\embedded_controller\escape_pod_docking_controller.dm" #include "code\game\machinery\embedded_controller\simple_docking_controller.dm" #include "code\game\machinery\kitchen\gibber.dm" #include "code\game\machinery\kitchen\juicer.dm" @@ -1308,6 +1307,7 @@ #include "code\modules\security levels\security levels.dm" #include "code\modules\shuttles\antagonist.dm" #include "code\modules\shuttles\departmental.dm" +#include "code\modules\shuttles\escape_pods.dm" #include "code\modules\shuttles\shuttle.dm" #include "code\modules\shuttles\shuttle_console.dm" #include "code\modules\shuttles\shuttle_emergency.dm" diff --git a/code/game/machinery/embedded_controller/escape_pod_docking_controller.dm b/code/modules/shuttles/escape_pods.dm similarity index 87% rename from code/game/machinery/embedded_controller/escape_pod_docking_controller.dm rename to code/modules/shuttles/escape_pods.dm index 50348591287..8ef467d9006 100644 --- a/code/game/machinery/embedded_controller/escape_pod_docking_controller.dm +++ b/code/modules/shuttles/escape_pods.dm @@ -1,3 +1,22 @@ +/datum/shuttle/ferry/escape_pod + var/datum/computer/file/embedded_program/docking/simple/escape_pod/arming_controller + +/datum/shuttle/ferry/escape_pod/can_launch() + if(arming_controller && !arming_controller.armed) + return 0 + if(location) + return 0 //it's a one-way trip. + return ..() + +/datum/shuttle/ferry/escape_pod/can_force() + if (arming_controller.eject_time && world.time < arming_controller.eject_time + 50) + return 0 //dont allow force launching until 5 seconds after the arming controller has reached it's countdown + return ..() + +/datum/shuttle/ferry/escape_pod/can_cancel() + return 0 + + //This controller goes on the escape pod itself /obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod name = "escape pod controller" diff --git a/code/modules/shuttles/shuttle_emergency.dm b/code/modules/shuttles/shuttle_emergency.dm index a16b98db1e4..a6b7f4f0c2e 100644 --- a/code/modules/shuttles/shuttle_emergency.dm +++ b/code/modules/shuttles/shuttle_emergency.dm @@ -223,38 +223,13 @@ if(..()) return - if(href_list["auth"]) - /* - //This doesn't work at all. - if (!emagged && href_list["auth"] == -1) - //They selected an empty entry. Try to scan their id. - if (ishuman(usr)) - var/mob/living/carbon/human/H = usr - if (!read_authorization(H.get_active_hand())) //try to read what's in their hand first - read_authorization(H.wear_id) - else - */ - //remove the authorization - var/dna_hash = href_list["auth"] + if(href_list["removeid"]) + var/dna_hash = href_list["removeid"] authorized -= dna_hash - - - - -/datum/shuttle/ferry/escape_pod - var/datum/computer/file/embedded_program/docking/simple/escape_pod/arming_controller - -/datum/shuttle/ferry/escape_pod/can_launch() - if(arming_controller && !arming_controller.armed) - return 0 - if(location) - return 0 //it's a one-way trip. - return ..() - -/datum/shuttle/ferry/escape_pod/can_force() - if (arming_controller.eject_time && world.time < arming_controller.eject_time + 50) - return 0 //dont allow force launching until 5 seconds after the arming controller has reached it's countdown - return ..() - -/datum/shuttle/ferry/escape_pod/can_cancel() - return 0 + + if(!emagged && href_list["scanid"]) + //They selected an empty entry. Try to scan their id. + if (ishuman(usr)) + var/mob/living/carbon/human/H = usr + if (!read_authorization(H.get_active_hand())) //try to read what's in their hand first + read_authorization(H.wear_id) \ No newline at end of file diff --git a/nano/templates/escape_shuttle_control_console.tmpl b/nano/templates/escape_shuttle_control_console.tmpl index ad2d682ade9..a562275c18b 100644 --- a/nano/templates/escape_shuttle_control_console.tmpl +++ b/nano/templates/escape_shuttle_control_console.tmpl @@ -64,7 +64,11 @@
{{for auth_list}} - {{:~link(auth_name, 'eject', {'auth' : auth_hash}, null, 'itemContentWide')}} + {{if auth_hash}} + {{:~link(auth_name, 'eject', {'removeid' : auth_hash}, null, 'itemContentWide')}} + {{else}} + {{:~link("", 'eject', {'scanid' : 1}, null, 'itemContentWide')}} + {{/if}} {{/for}}
From 55279f2fc01ccd6ed0029c315e073d8b3b38f6ad Mon Sep 17 00:00:00 2001 From: mwerezak Date: Wed, 30 Jul 2014 15:45:21 -0400 Subject: [PATCH 06/83] Allows pod to be launched if shuttle leaves early --- code/modules/shuttles/escape_pods.dm | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/code/modules/shuttles/escape_pods.dm b/code/modules/shuttles/escape_pods.dm index 8ef467d9006..7fe1d1c36c1 100644 --- a/code/modules/shuttles/escape_pods.dm +++ b/code/modules/shuttles/escape_pods.dm @@ -2,7 +2,7 @@ var/datum/computer/file/embedded_program/docking/simple/escape_pod/arming_controller /datum/shuttle/ferry/escape_pod/can_launch() - if(arming_controller && !arming_controller.armed) + if(arming_controller && !arming_controller.armed) //must be armed return 0 if(location) return 0 //it's a one-way trip. @@ -30,7 +30,7 @@ "override_enabled" = docking_program.override_enabled, "door_state" = docking_program.memory["door_status"]["state"], "door_lock" = docking_program.memory["door_status"]["lock"], - "can_force" = pod.can_force(), + "can_force" = pod.can_force() || (emergency_shuttle.departed && pod.can_launch()), //allow players to manually launch ahead of time if the shuttle leaves "is_armed" = pod.arming_controller.armed, ) @@ -49,7 +49,10 @@ if("manual_arm") pod.arming_controller.arm() if("force_launch") - pod.force_launch(src) + if (pod.can_force()) + pod.force_launch(src) + else if (emergency_shuttle.departed && pod.can_launch()) //allow players to manually launch ahead of time if the shuttle leaves + pod.launch(src) return 0 From 8e5f62a9da81d3261bf2cb1df5e8d452f454283c Mon Sep 17 00:00:00 2001 From: mwerezak Date: Wed, 30 Jul 2014 17:02:02 -0400 Subject: [PATCH 07/83] Updates tajaran hardsuit sprites Adds inventory sprites for all hardsuits that didn't have it before, except for the wizard one. --- code/modules/clothing/spacesuits/rig.dm | 16 ++++++++-------- icons/mob/species/tajaran/helmet.dmi | Bin 10957 -> 11286 bytes icons/mob/species/tajaran/suit.dmi | Bin 5159 -> 5302 bytes icons/obj/clothing/species/tajaran/hats.dmi | Bin 2340 -> 4845 bytes icons/obj/clothing/species/tajaran/suits.dmi | Bin 863 -> 1901 bytes 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/code/modules/clothing/spacesuits/rig.dm b/code/modules/clothing/spacesuits/rig.dm index 4009d1a8f8f..e003f6a7dea 100644 --- a/code/modules/clothing/spacesuits/rig.dm +++ b/code/modules/clothing/spacesuits/rig.dm @@ -20,6 +20,9 @@ "Tajaran" = 'icons/mob/species/tajaran/helmet.dmi', "Skrell" = 'icons/mob/species/skrell/helmet.dmi' ) + sprite_sheets_obj = list( + "Tajaran" = 'icons/obj/clothing/species/tajaran/suits.dmi', + ) attack_self(mob/user) if(!isturf(user.loc)) @@ -65,6 +68,9 @@ "Tajaran" = 'icons/mob/species/tajaran/suit.dmi', "Skrell" = 'icons/mob/species/skrell/suit.dmi' ) + sprite_sheets_obj = list( + "Tajaran" = 'icons/obj/clothing/species/tajaran/suits.dmi', + ) //Breach thresholds, should ideally be inherited by most (if not all) hardsuits. breach_threshold = 18 @@ -299,9 +305,6 @@ icon_state = "rig0-engineering" item_state = "eng_helm" armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 35, bio = 100, rad = 80) - sprite_sheets_obj = list( - "Tajaran" = 'icons/obj/clothing/species/tajaran/hats.dmi', - ) /obj/item/clothing/suit/space/rig/engineering name = "engineering hardsuit" @@ -311,9 +314,6 @@ slowdown = 1 armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 35, bio = 100, rad = 80) allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/weapon/pickaxe, /obj/item/weapon/rcd) - sprite_sheets_obj = list( - "Tajaran" = 'icons/obj/clothing/species/tajaran/suits.dmi', - ) //Chief Engineer's rig /obj/item/clothing/head/helmet/space/rig/engineering/chief @@ -323,7 +323,6 @@ item_state = "ce_helm" item_color = "white" sprite_sheets = null - sprite_sheets_obj = null /obj/item/clothing/suit/space/rig/engineering/chief icon_state = "rig-white" @@ -331,7 +330,6 @@ desc = "An advanced suit that protects against hazardous, low pressure environments. Shines with a high polish." item_state = "ce_hardsuit" sprite_sheets = null - sprite_sheets_obj = null //Mining rig /obj/item/clothing/head/helmet/space/rig/mining @@ -412,6 +410,7 @@ armor = list(melee = 40, bullet = 20, laser = 20,energy = 20, bomb = 35, bio = 100, rad = 60) siemens_coefficient = 0.7 sprite_sheets = null + sprite_sheets_obj = null /obj/item/clothing/suit/space/rig/wizard icon_state = "rig-wiz" @@ -424,6 +423,7 @@ armor = list(melee = 40, bullet = 20, laser = 20,energy = 20, bomb = 35, bio = 100, rad = 60) siemens_coefficient = 0.7 sprite_sheets = null + sprite_sheets_obj = null //Medical Rig /obj/item/clothing/head/helmet/space/rig/medical diff --git a/icons/mob/species/tajaran/helmet.dmi b/icons/mob/species/tajaran/helmet.dmi index 7316d42bb398f3b61064fb61bd28b150df45f2f0..988512b58c98cb4a9818cd4a314355b37d1b576c 100644 GIT binary patch literal 11286 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 diff --git a/icons/mob/species/tajaran/suit.dmi b/icons/mob/species/tajaran/suit.dmi index 13eb7174d941c17463cfb89d809adfa7497f7e5d..5fae4520b60ddaf7fb1fe5092434b28379e3425a 100644 GIT binary patch delta 5169 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 literal 2340 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 From 404a89aed63c439267efce99a54e35816bbc542b Mon Sep 17 00:00:00 2001 From: Walter0o Date: Thu, 31 Jul 2014 04:01:14 +0200 Subject: [PATCH 08/83] clipboard exploit fixes --- code/modules/paperwork/clipboard.dm | 52 ++++++++++++++++++----------- 1 file changed, 32 insertions(+), 20 deletions(-) diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm index ea49067e130..4f73f0a6a02 100644 --- a/code/modules/paperwork/clipboard.dm +++ b/code/modules/paperwork/clipboard.dm @@ -44,6 +44,7 @@ return /obj/item/weapon/clipboard/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(istype(W, /obj/item/weapon/paper) || istype(W, /obj/item/weapon/photo)) user.drop_item() W.loc = src @@ -51,9 +52,11 @@ toppaper = W user << "You clip the [W] onto \the [src]." update_icon() - else if(toppaper) - toppaper.attackby(usr.get_active_hand(), usr) + + else if(istype(toppaper) && istype(W, /obj/item/weapon/pen)) + toppaper.attackby(W, usr) update_icon() + return /obj/item/weapon/clipboard/attack_self(mob/user as mob) @@ -85,7 +88,7 @@ if((usr.stat || usr.restrained())) return - if(usr.contents.Find(src)) + if(src.loc == usr) if(href_list["pen"]) if(haspen) @@ -93,24 +96,31 @@ usr.put_in_hands(haspen) haspen = null - if(href_list["addpen"]) + else if(href_list["addpen"]) if(!haspen) - if(istype(usr.get_active_hand(), /obj/item/weapon/pen)) - var/obj/item/weapon/pen/W = usr.get_active_hand() + var/obj/item/weapon/pen/W = usr.get_active_hand() + if(istype(W, /obj/item/weapon/pen)) usr.drop_item() W.loc = src haspen = W usr << "You slot the pen into \the [src]." - if(href_list["write"]) - var/obj/item/P = locate(href_list["write"]) - if(P) - if(usr.get_active_hand()) - P.attackby(usr.get_active_hand(), usr) + else if(href_list["write"]) + var/obj/item/weapon/P = locate(href_list["write"]) + + if(P && (P.loc == src) && (istype(P, /obj/item/weapon/paper) || istype(P, /obj/item/weapon/photo)) ) + + var/obj/item/I = usr.get_active_hand() + + if(istype(I, /obj/item/weapon/pen)) + + P.attackby(I, usr) - if(href_list["remove"]) + else if(href_list["remove"]) var/obj/item/P = locate(href_list["remove"]) - if(P) + + if(P && (P.loc == src) && (istype(P, /obj/item/weapon/paper) || istype(P, /obj/item/weapon/photo)) ) + P.loc = usr.loc usr.put_in_hands(P) if(P == toppaper) @@ -121,9 +131,11 @@ else toppaper = null - if(href_list["read"]) + else if(href_list["read"]) var/obj/item/weapon/paper/P = locate(href_list["read"]) - if(P) + + if(P && (P.loc == src) && (istype(P, /obj/item/weapon/paper) || istype(P, /obj/item/weapon/photo)) ) + if(!(istype(usr, /mob/living/carbon/human) || istype(usr, /mob/dead/observer) || istype(usr, /mob/living/silicon))) usr << browse("[P.name][stars(P.info)][P.stamps]", "window=[P.name]") onclose(usr, "[P.name]") @@ -131,18 +143,18 @@ usr << browse("[P.name][P.info][P.stamps]", "window=[P.name]") onclose(usr, "[P.name]") - if(href_list["look"]) + else if(href_list["look"]) var/obj/item/weapon/photo/P = locate(href_list["look"]) - if(P) + if(P && (P.loc == src) && (istype(P, /obj/item/weapon/paper) || istype(P, /obj/item/weapon/photo)) ) P.show(usr) - if(href_list["top"]) + else if(href_list["top"]) var/obj/item/P = locate(href_list["top"]) - if(P) + if(P && (P.loc == src) && (istype(P, /obj/item/weapon/paper) || istype(P, /obj/item/weapon/photo)) ) toppaper = P usr << "You move [P.name] to the top." //Update everything attack_self(usr) update_icon() - return \ No newline at end of file + return From 67e58effd28b6c37c10e4fff16b4e3c21c0098f4 Mon Sep 17 00:00:00 2001 From: Walter0o Date: Thu, 31 Jul 2014 04:08:34 +0200 Subject: [PATCH 09/83] folder exploit fixes --- code/modules/paperwork/folders.dm | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index 0f1b612e930..868fac30539 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -59,34 +59,34 @@ if((usr.stat || usr.restrained())) return - if(usr.contents.Find(src)) + if(src.loc == usr) if(href_list["remove"]) var/obj/item/P = locate(href_list["remove"]) - if(P && P.loc == src) + if(P && (P.loc == src) && istype(P)) P.loc = usr.loc usr.put_in_hands(P) - if(href_list["read"]) + else if(href_list["read"]) var/obj/item/weapon/paper/P = locate(href_list["read"]) - if(P) + if(P && (P.loc == src) && istype(P)) if(!(istype(usr, /mob/living/carbon/human) || istype(usr, /mob/dead/observer) || istype(usr, /mob/living/silicon))) usr << browse("[P.name][stars(P.info)][P.stamps]", "window=[P.name]") onclose(usr, "[P.name]") else usr << browse("[P.name][P.info][P.stamps]", "window=[P.name]") onclose(usr, "[P.name]") - if(href_list["look"]) + else if(href_list["look"]) var/obj/item/weapon/photo/P = locate(href_list["look"]) - if(P) + if(P && (P.loc == src) && istype(P)) P.show(usr) - if(href_list["browse"]) + else if(href_list["browse"]) var/obj/item/weapon/paper_bundle/P = locate(href_list["browse"]) - if(P) + if(P && (P.loc == src) && istype(P)) P.attack_self(usr) onclose(usr, "[P.name]") //Update everything attack_self(usr) update_icon() - return \ No newline at end of file + return From 596ae377948dab85c1014f9e6a06b99238313131 Mon Sep 17 00:00:00 2001 From: Walter0o Date: Thu, 31 Jul 2014 05:01:31 +0200 Subject: [PATCH 10/83] paper exploit fixes i think my favourite part of this was ```var/obj/item/i = usr.get_active_hand() if( ... && usr.get_active_hand() != i))``` --- code/modules/paperwork/paper.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index bd7a82a125a..7b78dd53b21 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -294,7 +294,8 @@ iscrayon = 1 - if((!in_range(src, usr) && loc != usr && !( istype(loc, /obj/item/weapon/clipboard) ) && loc.loc != usr && usr.get_active_hand() != i)) // Some check to see if he's allowed to write + // if paper is not in usr, then it must be in a clipboard or folder, which must be in or near usr + if(src.loc != usr && !((istype(src.loc, /obj/item/weapon/clipboard) || istype(src.loc, /obj/item/weapon/folder)) && (src.loc.loc == usr || src.loc.Adjacent(usr)) ) ) return /* t = checkhtml(t) From f9de5e38660a2825b27db05c86d35e7ffa6761ef Mon Sep 17 00:00:00 2001 From: Walter0o Date: Thu, 31 Jul 2014 08:57:56 +0200 Subject: [PATCH 11/83] refining the clipboard topic checks --- code/modules/paperwork/clipboard.dm | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm index 4f73f0a6a02..ca128c2c10c 100644 --- a/code/modules/paperwork/clipboard.dm +++ b/code/modules/paperwork/clipboard.dm @@ -91,7 +91,7 @@ if(src.loc == usr) if(href_list["pen"]) - if(haspen) + if(istype(haspen) && (haspen.loc == src)) haspen.loc = usr.loc usr.put_in_hands(haspen) haspen = null @@ -108,7 +108,7 @@ else if(href_list["write"]) var/obj/item/weapon/P = locate(href_list["write"]) - if(P && (P.loc == src) && (istype(P, /obj/item/weapon/paper) || istype(P, /obj/item/weapon/photo)) ) + if(P && (P.loc == src) && istype(P, /obj/item/weapon/paper) && (P == toppaper) ) var/obj/item/I = usr.get_active_hand() @@ -134,7 +134,7 @@ else if(href_list["read"]) var/obj/item/weapon/paper/P = locate(href_list["read"]) - if(P && (P.loc == src) && (istype(P, /obj/item/weapon/paper) || istype(P, /obj/item/weapon/photo)) ) + if(P && (P.loc == src) && istype(P, /obj/item/weapon/paper) ) if(!(istype(usr, /mob/living/carbon/human) || istype(usr, /mob/dead/observer) || istype(usr, /mob/living/silicon))) usr << browse("[P.name][stars(P.info)][P.stamps]", "window=[P.name]") @@ -145,12 +145,12 @@ else if(href_list["look"]) var/obj/item/weapon/photo/P = locate(href_list["look"]) - if(P && (P.loc == src) && (istype(P, /obj/item/weapon/paper) || istype(P, /obj/item/weapon/photo)) ) + if(P && (P.loc == src) && istype(P, /obj/item/weapon/photo) ) P.show(usr) - else if(href_list["top"]) + else if(href_list["top"]) // currently unused var/obj/item/P = locate(href_list["top"]) - if(P && (P.loc == src) && (istype(P, /obj/item/weapon/paper) || istype(P, /obj/item/weapon/photo)) ) + if(P && (P.loc == src) && istype(P, /obj/item/weapon/paper) ) toppaper = P usr << "You move [P.name] to the top." From 61a1904e78e9c2b243c811975d6815e872686dbd Mon Sep 17 00:00:00 2001 From: Walter0o Date: Thu, 31 Jul 2014 09:28:47 +0200 Subject: [PATCH 12/83] prisoner computer3 topic exploit fixes fun : you could trigger grenades this way --- .../WorkInProgress/computer3/computers/prisoner.dm | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/code/WorkInProgress/computer3/computers/prisoner.dm b/code/WorkInProgress/computer3/computers/prisoner.dm index 3ec29a5480a..11aa5ebd6e9 100644 --- a/code/WorkInProgress/computer3/computers/prisoner.dm +++ b/code/WorkInProgress/computer3/computers/prisoner.dm @@ -73,25 +73,29 @@ if(href_list["inject1"]) var/obj/item/weapon/implant/I = locate(href_list["inject1"]) - if(I) I.activate(1) + if(istype(I)) + I.activate(1) else if(href_list["inject5"]) var/obj/item/weapon/implant/I = locate(href_list["inject5"]) - if(I) I.activate(5) + if(istype(I)) + I.activate(5) else if(href_list["inject10"]) var/obj/item/weapon/implant/I = locate(href_list["inject10"]) - if(I) I.activate(10) + if(istype(I)) + I.activate(10) else if(href_list["lock"]) screen = !screen else if(href_list["warn"]) - var/warning = copytext(sanitize(input(usr,"Message:","Enter your message here!","")),1,MAX_MESSAGE_LEN) + var/warning = trim(copytext(sanitize(input(usr,"Message:","Enter your message here!","")),1,MAX_MESSAGE_LEN)) if(!warning) return var/obj/item/weapon/implant/I = locate(href_list["warn"]) - if((I)&&(I.imp_in)) + if( istype(I) && I.imp_in) var/mob/living/carbon/R = I.imp_in + log_say("PrisonComputer3 message: [key_name(usr)]->[key_name(R)] : [warning]") R << "\green You hear a voice in your head saying: '[warning]'" interact() From a8baa2c85590910565209bb3080504060f788e52 Mon Sep 17 00:00:00 2001 From: Walter0o Date: Thu, 31 Jul 2014 09:34:58 +0200 Subject: [PATCH 13/83] computer3 remote view exploit fix you could look at any atom for a tick. could need improvement, does not check camera network at the moment, because of the costly and temporary nature of the getter proc. --- code/WorkInProgress/computer3/computers/camera.dm | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/code/WorkInProgress/computer3/computers/camera.dm b/code/WorkInProgress/computer3/computers/camera.dm index 0883680f5c3..193070ce3e3 100644 --- a/code/WorkInProgress/computer3/computers/camera.dm +++ b/code/WorkInProgress/computer3/computers/camera.dm @@ -258,10 +258,11 @@ if("show" in href_list) var/obj/machinery/camera/C = locate(href_list["show"]) - current = C - usr.reset_view(C) - interact() - return + if(istype(C) && C.status) + current = C + usr.reset_view(C) + interact() + return if("keyselect" in href_list) current = null @@ -278,4 +279,4 @@ // Atlantis: Required for camnetkeys to work. /datum/file/program/security/hidden - hidden_file = 1 \ No newline at end of file + hidden_file = 1 From 0aadca2fabc0eebdb94b4e3302d1c623a12de3cf Mon Sep 17 00:00:00 2001 From: Walter0o Date: Thu, 31 Jul 2014 09:42:26 +0200 Subject: [PATCH 14/83] computer3 program topic protection --- code/WorkInProgress/computer3/program.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/WorkInProgress/computer3/program.dm b/code/WorkInProgress/computer3/program.dm index 4c977489f5d..74083b8ffde 100644 --- a/code/WorkInProgress/computer3/program.dm +++ b/code/WorkInProgress/computer3/program.dm @@ -239,7 +239,7 @@ Programs are a file that can be executed // if("runfile" in href_list) var/datum/file/F = locate(href_list["runfile"]) - if(F && F.computer == computer) + if(istype(F) && F.computer == computer) F.execute(src) return 1 From 06ca10df6ba4085154dd75a9097a0d2a4805de03 Mon Sep 17 00:00:00 2001 From: Walter0o Date: Thu, 31 Jul 2014 09:48:17 +0200 Subject: [PATCH 15/83] computer3 ntos topic exploit prevention --- code/WorkInProgress/computer3/NTOS.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/WorkInProgress/computer3/NTOS.dm b/code/WorkInProgress/computer3/NTOS.dm index 86157dcc1c9..5119084f0e6 100644 --- a/code/WorkInProgress/computer3/NTOS.dm +++ b/code/WorkInProgress/computer3/NTOS.dm @@ -210,6 +210,9 @@ if("viewperipheral" in href_list) // open drive, show status of peripheral var/obj/item/part/computer/C = locate(href_list["viewperipheral"]) + if(!istype(C) || (C.loc != src.computer)) + return + if(istype(C,/obj/item/part/computer/storage)) current = C interact() From f0042741fc5ddd8bef6eabdf2ce0f7972cdefc25 Mon Sep 17 00:00:00 2001 From: Walter0o Date: Thu, 31 Jul 2014 10:03:22 +0200 Subject: [PATCH 16/83] filing cabinet exploit fix hooray for teleporting atoms to you via magic office furniture --- code/modules/paperwork/filingcabinet.dm | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm index 1dd51443fb4..5bb1dde1957 100644 --- a/code/modules/paperwork/filingcabinet.dm +++ b/code/modules/paperwork/filingcabinet.dm @@ -57,9 +57,7 @@ user.set_machine(src) var/dat = "
" - var/i - for(i=contents.len, i>=1, i--) - var/obj/item/P = contents[i] + for(var/obj/item/P in src) dat += "" dat += "
[P.name]
" user << browse("[name][dat]", "window=filingcabinet;size=350x300") @@ -89,12 +87,13 @@ //var/retrieveindex = text2num(href_list["retrieve"]) var/obj/item/P = locate(href_list["retrieve"])//contents[retrieveindex] - if(P && in_range(src, usr)) + if(istype(P) && (P.loc == src) && src.Adjacent(usr)) usr.put_in_hands(P) updateUsrDialog() icon_state = "[initial(icon_state)]-open" - sleep(5) - icon_state = initial(icon_state) + spawn(0) + sleep(5) + icon_state = initial(icon_state) /* From ca78cb238a887d9702836698b5609b9c2ff8411e Mon Sep 17 00:00:00 2001 From: Walter0o Date: Thu, 31 Jul 2014 10:20:24 +0200 Subject: [PATCH 17/83] cyborg topic exploit fixes all kinds of fun here --- code/modules/mob/living/silicon/robot/robot.dm | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 8d1823f0c51..341804376f4 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -1094,18 +1094,24 @@ /mob/living/silicon/robot/Topic(href, href_list) ..() - + + if(usr != src) + return + if (href_list["showalerts"]) robot_alerts() return if (href_list["mod"]) var/obj/item/O = locate(href_list["mod"]) - if (O) + if (isytpe(O) && (O.loc == src)) O.attack_self(src) if (href_list["act"]) var/obj/item/O = locate(href_list["act"]) + if (!isytpe(O) || !(O.loc == src || O.loc == src.module)) + return + if(activated(O)) src << "Already activated" return From 7416d261976408592c9b03ded67c719a02c07c64 Mon Sep 17 00:00:00 2001 From: Walter0o Date: Thu, 31 Jul 2014 10:38:34 +0200 Subject: [PATCH 18/83] robot computer emagging exploit fix so an emagged borg can in turn emag all others ? the more you know. seems extremely OP to me but i am just closing the exploit, not changing the game. --- code/game/machinery/computer/robot.dm | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm index 30c5a3cd9b3..f8029b0e969 100644 --- a/code/game/machinery/computer/robot.dm +++ b/code/game/machinery/computer/robot.dm @@ -197,7 +197,10 @@ else if (href_list["magbot"]) if(src.allowed(usr)) var/mob/living/silicon/robot/R = locate(href_list["magbot"]) - if(R) + + // whatever weirdness this is supposed to be, but that is how the href gets added, so here it is again + if(istype(R) && istype(usr, /mob/living/silicon) && usr.mind.special_role && (usr.mind.original == usr) && !R.emagged) + var/choice = input("Are you certain you wish to hack [R.name]?") in list("Confirm", "Abort") if(choice == "Confirm") if(R && istype(R)) @@ -225,4 +228,4 @@ if(!R.scrambledcodes && !istype(R, /mob/living/silicon/robot/drone)) R.self_destruct() - return \ No newline at end of file + return From eeb02dcfde3ba0c18709b2115d4abe67ee6964e9 Mon Sep 17 00:00:00 2001 From: Walter0o Date: Thu, 31 Jul 2014 10:43:51 +0200 Subject: [PATCH 19/83] derp --- code/modules/mob/living/silicon/robot/robot.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 341804376f4..dd67574a11f 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -1104,12 +1104,12 @@ if (href_list["mod"]) var/obj/item/O = locate(href_list["mod"]) - if (isytpe(O) && (O.loc == src)) + if (istype(O) && (O.loc == src)) O.attack_self(src) if (href_list["act"]) var/obj/item/O = locate(href_list["act"]) - if (!isytpe(O) || !(O.loc == src || O.loc == src.module)) + if (!istype(O) || !(O.loc == src || O.loc == src.module)) return if(activated(O)) From a093bee190f0389ab204abd67edea5ff2a062ed1 Mon Sep 17 00:00:00 2001 From: PsiOmega Date: Thu, 31 Jul 2014 11:04:16 +0200 Subject: [PATCH 20/83] Fixes #5839 by making the comb slightly more gender aware. --- code/modules/customitems/item_defines.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index 9c820db0260..00385c11e8f 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -277,7 +277,7 @@ attack_self(mob/user) if(user.r_hand == src || user.l_hand == src) for(var/mob/O in viewers(user, null)) - O.show_message(text("\red [] uses [] to comb their hair with incredible style and sophistication. What a guy.", user, src), 1) + O.show_message(text("\red [] uses [] to comb their hair with incredible style and sophistication. What a [].", user, src, user.gender == FEMALE ? "lady" : "guy"), 1) return /obj/item/weapon/fluff/hugo_cinderbacth_1 //thatoneguy: Hugo Cinderbatch From d8df59a24483b361922e44b30fc967f3781e2901 Mon Sep 17 00:00:00 2001 From: PsiOmega Date: Thu, 31 Jul 2014 11:38:19 +0200 Subject: [PATCH 21/83] Fixes #5844 by only having a supermatter explosion affect living entities on the same Z-level. --- code/modules/supermatter/supermatter.dm | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/code/modules/supermatter/supermatter.dm b/code/modules/supermatter/supermatter.dm index e7e3cc4972f..5402957fcd8 100644 --- a/code/modules/supermatter/supermatter.dm +++ b/code/modules/supermatter/supermatter.dm @@ -141,11 +141,12 @@ if(damage > explosion_point) for(var/mob/living/mob in living_mob_list) - if(istype(mob, /mob/living/carbon/human)) - //Hilariously enough, running into a closet should make you get hit the hardest. - mob:hallucination += max(50, min(300, DETONATION_HALLUCINATION * sqrt(1 / (get_dist(mob, src) + 1)) ) ) - var/rads = DETONATION_RADS * sqrt( 1 / (get_dist(mob, src) + 1) ) - mob.apply_effect(rads, IRRADIATE) + if(mob.loc.z == loc.z) + if(istype(mob, /mob/living/carbon/human)) + //Hilariously enough, running into a closet should make you get hit the hardest. + mob:hallucination += max(50, min(300, DETONATION_HALLUCINATION * sqrt(1 / (get_dist(mob, src) + 1)) ) ) + var/rads = DETONATION_RADS * sqrt( 1 / (get_dist(mob, src) + 1) ) + mob.apply_effect(rads, IRRADIATE) explode() else From e7f31e1655fd4277c041214110714762d7b6fec3 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Thu, 31 Jul 2014 19:40:09 +0930 Subject: [PATCH 22/83] Fixes #5737 --- code/modules/mob/living/silicon/robot/robot.dm | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 8d1823f0c51..4880417cefb 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -284,10 +284,13 @@ /mob/living/silicon/robot/proc/updatename(var/prefix as text) if(prefix) modtype = prefix - if(istype(mmi, /obj/item/device/mmi/posibrain)) - braintype = "Android" + if(mmi) + if(istype(mmi, /obj/item/device/mmi/posibrain)) + braintype = "Android" + else + braintype = "Cyborg" else - braintype = "Cyborg" + braintype = "Robot" var/changed_name = "" if(custom_name) From cfdb3288e76d6bdede95dffbf68bbe53069e73bc Mon Sep 17 00:00:00 2001 From: Walter0o Date: Thu, 31 Jul 2014 12:12:30 +0200 Subject: [PATCH 23/83] derping derps thanks to @mwerezak --- code/modules/paperwork/paper.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 7b78dd53b21..c45d65f33f8 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -294,8 +294,8 @@ iscrayon = 1 - // if paper is not in usr, then it must be in a clipboard or folder, which must be in or near usr - if(src.loc != usr && !((istype(src.loc, /obj/item/weapon/clipboard) || istype(src.loc, /obj/item/weapon/folder)) && (src.loc.loc == usr || src.loc.Adjacent(usr)) ) ) + // if paper is not in usr, then it must be near them, or in a clipboard or folder, which must be in or near usr + if(src.loc != usr && !src.Adjacent(usr) && !((istype(src.loc, /obj/item/weapon/clipboard) || istype(src.loc, /obj/item/weapon/folder)) && (src.loc.loc == usr || src.loc.Adjacent(usr)) ) ) return /* t = checkhtml(t) From ba247ffa40303b66690f68d1acf9c53c17a9c963 Mon Sep 17 00:00:00 2001 From: PsiOmega Date: Thu, 31 Jul 2014 12:01:45 +0200 Subject: [PATCH 24/83] Recasts objects to avoid usage of : --- code/modules/supermatter/supermatter.dm | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/code/modules/supermatter/supermatter.dm b/code/modules/supermatter/supermatter.dm index 5402957fcd8..9db1f4addd4 100644 --- a/code/modules/supermatter/supermatter.dm +++ b/code/modules/supermatter/supermatter.dm @@ -141,10 +141,11 @@ if(damage > explosion_point) for(var/mob/living/mob in living_mob_list) - if(mob.loc.z == loc.z) + if(loc.z == mob.loc.z) if(istype(mob, /mob/living/carbon/human)) //Hilariously enough, running into a closet should make you get hit the hardest. - mob:hallucination += max(50, min(300, DETONATION_HALLUCINATION * sqrt(1 / (get_dist(mob, src) + 1)) ) ) + var/mob/living/carbon/human/H = mob + H.hallucination += max(50, min(300, DETONATION_HALLUCINATION * sqrt(1 / (get_dist(mob, src) + 1)) ) ) var/rads = DETONATION_RADS * sqrt( 1 / (get_dist(mob, src) + 1) ) mob.apply_effect(rads, IRRADIATE) @@ -335,7 +336,8 @@ if(!X:anchored) //unanchored objects pulled twice as fast step_towards(X,src) if(istype(X, /obj/structure/window)) //shatter windows - X.ex_act(2.0) + var/obj/structure/window/W = X + W.ex_act(2.0) else if(istype(X,/mob/living/carbon/human)) var/mob/living/carbon/human/H = X if(istype(H.shoes,/obj/item/clothing/shoes/magboots)) From 1cecd96e6642f90c3ee17b2933d89542fccd3294 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Thu, 31 Jul 2014 19:46:21 +0930 Subject: [PATCH 25/83] Fixes #5630 --- code/modules/mob/living/silicon/robot/robot_modules.dm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 256a9e50918..9ea3f67fd0a 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -398,14 +398,14 @@ /obj/item/weapon/robot_module/drone name = "drone module" stacktypes = list( - /obj/item/stack/sheet/wood/cyborg = 1, - /obj/item/stack/sheet/mineral/plastic/cyborg = 1, - /obj/item/stack/sheet/rglass/cyborg = 5, + /obj/item/stack/sheet/wood = 1, + /obj/item/stack/sheet/mineral/plastic = 1, + /obj/item/stack/sheet/rglass = 5, /obj/item/stack/tile/wood = 5, /obj/item/stack/rods = 15, /obj/item/stack/tile/plasteel = 15, - /obj/item/stack/sheet/metal/cyborg = 20, - /obj/item/stack/sheet/glass/cyborg = 20, + /obj/item/stack/sheet/metal = 20, + /obj/item/stack/sheet/glass = 20, /obj/item/weapon/cable_coil = 30 ) From a3778f5a5dd605aba1007e3d7dc26ed851c0f06f Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Thu, 31 Jul 2014 20:14:25 +0930 Subject: [PATCH 26/83] Fixes #5774 --- code/game/jobs/job_controller.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index d0600b4cca9..580d4f0fac6 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -355,7 +355,7 @@ var/global/datum/controller/occupations/job_master if(job) //Equip custom gear loadout. - if(H.client.prefs.gear && H.client.prefs.gear.len) + if(H.client.prefs.gear && H.client.prefs.gear.len && job.title != "Cyborg" && job.title != "AI") for(var/thing in H.client.prefs.gear) var/datum/gear/G = gear_datums[thing] From afc40e7f449e1ced76b276a2fec75c5eca462646 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Thu, 31 Jul 2014 20:46:52 +0930 Subject: [PATCH 27/83] Fixes #5202 --- code/game/machinery/cryopod.dm | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index ce9749402d3..50b17ddc338 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -152,7 +152,8 @@ var/global/list/frozen_items = list() /obj/item/clothing/suit, /obj/item/clothing/shoes/magboots, /obj/item/blueprints, - /obj/item/clothing/head/helmet/space/ + /obj/item/clothing/head/helmet/space, + /obj/item/weapon/storage/internal ) /obj/machinery/cryopod/right @@ -186,6 +187,8 @@ var/global/list/frozen_items = list() if(W.contents.len) //Make sure we catch anything not handled by del() on the items. for(var/obj/item/O in W.contents) + if(istype(O,/obj/item/weapon/storage/internal)) //Stop eating pockets you fuck! + continue O.loc = src //Delete all items not on the preservation list. @@ -194,6 +197,7 @@ var/global/list/frozen_items = list() items -= announce // or the autosay radio. for(var/obj/item/W in items) + var/preserve = null for(var/T in preserve_items) if(istype(W,T)) @@ -204,11 +208,14 @@ var/global/list/frozen_items = list() del(W) else frozen_items += W + W.loc = null //Update any existing objectives involving this mob. for(var/datum/objective/O in all_objectives) - if(istype(O,/datum/objective/mutiny) && O.target == occupant.mind) //We don't want revs to get objectives that aren't for heads of staff. Letting them win or lose based on cryo is silly so we remove the objective. - del(O) //TODO: Update rev objectives on login by head (may happen already?) ~ Z + // We don't want revs to get objectives that aren't for heads of staff. Letting + // them win or lose based on cryo is silly so we remove the objective. + if(istype(O,/datum/objective/mutiny) && O.target == occupant.mind) + del(O) else if(O.target && istype(O.target,/datum/mind)) if(O.target == occupant.mind) if(O.owner && O.owner.current) From da4dd93e7575cc14631bf0189ee61f60cad6412d Mon Sep 17 00:00:00 2001 From: PsiOmega Date: Thu, 31 Jul 2014 14:24:39 +0200 Subject: [PATCH 28/83] Is a little convoluted but this removes the last X: use in supermatter.dm --- code/modules/supermatter/supermatter.dm | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/code/modules/supermatter/supermatter.dm b/code/modules/supermatter/supermatter.dm index 9db1f4addd4..ce36d810747 100644 --- a/code/modules/supermatter/supermatter.dm +++ b/code/modules/supermatter/supermatter.dm @@ -333,7 +333,11 @@ if(is_type_in_list(X, uneatable)) continue if(((X) && (!istype(X,/mob/living/carbon/human)))) step_towards(X,src) - if(!X:anchored) //unanchored objects pulled twice as fast + if(istype(X, /obj)) //unanchored objects pulled twice as fast + var/obj/O = X + if(!O.anchored) + step_towards(X,src) + else step_towards(X,src) if(istype(X, /obj/structure/window)) //shatter windows var/obj/structure/window/W = X From b529d582e5ba0b0c7361869d6f72d21acd075049 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Thu, 31 Jul 2014 15:20:45 -0400 Subject: [PATCH 29/83] Fixes siemens_coefficent not affecting shock damage Also cleans up electrocute_act() --- code/game/gamemodes/events/ninja_equipment.dm | 2 +- code/modules/mob/living/carbon/carbon.dm | 33 +++++++++++-------- code/modules/mob/living/carbon/human/human.dm | 19 +++++++---- .../mob/living/carbon/human/human_defense.dm | 27 +++++++++------ code/modules/power/power.dm | 3 ++ 5 files changed, 52 insertions(+), 32 deletions(-) diff --git a/code/game/gamemodes/events/ninja_equipment.dm b/code/game/gamemodes/events/ninja_equipment.dm index f6e4a985c0d..341cf00eaf6 100644 --- a/code/game/gamemodes/events/ninja_equipment.dm +++ b/code/game/gamemodes/events/ninja_equipment.dm @@ -519,7 +519,7 @@ ________________________________________________________________________________ var/damage = min(cell.charge, rand(50,150))//Uses either the current energy left over or between 50 and 150. if(damage>1)//So they don't spam it when energy is a factor. spark_system.start()//SPARKS THERE SHALL BE SPARKS - U.electrocute_act(damage, src,0.1,1)//The last argument is a safety for the human proc that checks for gloves. + U.electrocute_act(damage, src, 0.1) if(cell.charge < damage) cell.use(cell.charge) else diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 0d6aaec965d..968d9f853f7 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -99,24 +99,29 @@ return -/mob/living/carbon/electrocute_act(var/shock_damage, var/obj/source, var/siemens_coeff = 1.0) +/mob/living/carbon/electrocute_act(var/shock_damage, var/obj/source, var/siemens_coeff = 1.0, var/def_zone = null) if(status_flags & GODMODE) return 0 //godmode shock_damage *= siemens_coeff if (shock_damage<1) return 0 - src.take_overall_damage(0,shock_damage,used_weapon="Electrocution") - //src.burn_skin(shock_damage) - //src.adjustFireLoss(shock_damage) //burn_skin will do this for us - //src.updatehealth() - src.visible_message( - "\red [src] was shocked by the [source]!", \ - "\red You feel a powerful shock course through your body!", \ - "\red You hear a heavy electrical crack." \ - ) -// if(src.stunned < shock_damage) src.stunned = shock_damage - Stun(10)//This should work for now, more is really silly and makes you lay there forever -// if(src.weakened < 20*siemens_coeff) src.weakened = 20*siemens_coeff - Weaken(10) + + src.apply_damage(shock_damage, BURN, def_zone, used_weapon="Electrocution") + + playsound(loc, "sparks", 50, 1, -1) + if (shock_damage > 10) + src.visible_message( + "\red [src] was shocked by the [source]!", \ + "\red You feel a powerful shock course through your body!", \ + "\red You hear a heavy electrical crack." \ + ) + Stun(10)//This should work for now, more is really silly and makes you lay there forever + Weaken(10) + else + src.visible_message( + "\red [src] was mildly shocked by the [source].", \ + "\red You feel a mild shock course through your body.", \ + "\red You hear a light zapping." \ + ) return shock_damage diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 85800991241..e80e7f63ed1 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -521,13 +521,18 @@ if(wear_id) return wear_id.GetID() -//Added a safety check in case you want to shock a human mob directly through electrocute_act. -/mob/living/carbon/human/electrocute_act(var/shock_damage, var/obj/source, var/siemens_coeff = 1.0, var/safety = 0) - if(!safety) - if(gloves) - var/obj/item/clothing/gloves/G = gloves - siemens_coeff = G.siemens_coefficient - return ..(shock_damage,source,siemens_coeff) +//Removed the horrible safety parameter. It was only being used by ninja code anyways. +//Now checks siemens_coefficient of the affected area by default +/mob/living/carbon/human/electrocute_act(var/shock_damage, var/obj/source, var/base_siemens_coeff = 1.0, var/def_zone = null) + if(status_flags & GODMODE) return 0 //godmode + + if (!def_zone) + def_zone = pick("l_hand", "r_hand") + + var/datum/organ/external/affected_organ = get_organ(check_zone(def_zone)) + var/siemens_coeff = base_siemens_coeff * get_siemens_coefficient_organ(affected_organ) + + return ..(shock_damage, source, siemens_coeff, def_zone) /mob/living/carbon/human/Topic(href, href_list) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 6260a297a1c..86f8e6eb67e 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -54,15 +54,7 @@ emp_act //BEGIN BOOK'S TASER NERF. if(istype(P, /obj/item/projectile/beam/stun)) var/datum/organ/external/select_area = get_organ(def_zone) // We're checking the outside, buddy! - var/list/body_parts = list(head, wear_mask, wear_suit, w_uniform, gloves, shoes) // What all are we checking? - // var/deflectchance=90 //Is it a CRITICAL HIT with that taser? - for(var/bp in body_parts) //Make an unregulated var to pass around. - if(!bp) - continue //Does this thing we're shooting even exist? - if(bp && istype(bp ,/obj/item/clothing)) // If it exists, and it's clothed - var/obj/item/clothing/C = bp // Then call an argument C to be that clothing! - if(C.body_parts_covered & select_area.body_part) // Is that body part being targeted covered? - P.agony=P.agony*C.siemens_coefficient + P.agony *= get_siemens_coefficient_organ(select_area) apply_effect(P.agony,AGONY,0) flash_pain() src <<"\red You have been shot!" @@ -119,6 +111,21 @@ emp_act organnum++ return (armorval/max(organnum, 1)) +//this proc returns the Siemens coefficient of electrical resistivity for a particular external organ. +/mob/living/carbon/human/proc/get_siemens_coefficient_organ(var/datum/organ/external/def_zone) + if (!def_zone) + return 1.0 + + var/siemens_coefficient = 1.0 + + var/list/clothing_items = list(head, wear_mask, wear_suit, w_uniform, gloves, shoes) // What all are we checking? + for(var/obj/item/clothing/C in clothing_items) + if(!istype(C)) //is this necessary? + continue + else if(C.body_parts_covered & def_zone.body_part) // Is that body part being targeted covered? + siemens_coefficient *= C.siemens_coefficient + + return siemens_coefficient //this proc returns the armour value for a particular external organ. /mob/living/carbon/human/proc/getarmor_organ(var/datum/organ/external/def_zone, var/type) @@ -189,7 +196,7 @@ emp_act /mob/living/carbon/human/proc/attacked_by(var/obj/item/I, var/mob/living/user, var/def_zone) if(!I || !user) return 0 - var/target_zone = def_zone? def_zone : get_zone_with_miss_chance(user.zone_sel.selecting, src) + var/target_zone = def_zone? check_zone(def_zone) : get_zone_with_miss_chance(user.zone_sel.selecting, src) if(user == src) // Attacking yourself can't miss target_zone = user.zone_sel.selecting diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index c634a4a2cb2..18ade02046f 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -490,6 +490,9 @@ //No animations will be performed by this proc. /proc/electrocute_mob(mob/living/carbon/M as mob, var/power_source, var/obj/source, var/siemens_coeff = 1.0) if(istype(M.loc,/obj/mecha)) return 0 //feckin mechs are dumb + + //This is for performance optimization only. + //DO NOT modify siemens_coeff here. That is checked in human/electrocute_act() if(istype(M,/mob/living/carbon/human)) var/mob/living/carbon/human/H = M if(H.gloves) From 718b94fa3a849cc6b1ae266c0fb70d8834cf987b Mon Sep 17 00:00:00 2001 From: JimTheCactus Date: Thu, 31 Jul 2014 18:33:56 -0600 Subject: [PATCH 30/83] Modified function such that the atom isn't used in the defaults. This caused the routine to crash when the atom didn't have an icon or was null. --- code/__HELPERS/icons.dm | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index e7a6bbba964..a7560129420 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -635,7 +635,7 @@ The _flatIcons list is a cache for generated icon files. */ proc // Creates a single icon from a given /atom or /image. Only the first argument is required. - getFlatIcon(image/A, defdir=A.dir, deficon=A.icon, defstate=A.icon_state, defblend=A.blend_mode) + getFlatIcon(image/A, defdir=2, deficon=null, defstate=null, defblend=null) // We start with a blank canvas, otherwise some icon procs crash silently var/icon/flat = icon('icons/effects/effects.dmi', "icon_state"="nothing") // Final flattened icon if(!A) @@ -672,10 +672,13 @@ proc // Creates a single icon from a given /atom or /image. Only the first argu curdir = defdir var/curblend - if(A.blend_mode == BLEND_DEFAULT) - curblend = defblend + if(A.blend_mode) + if(A.blend_mode == BLEND_DEFAULT) + curblend = defblend + else + curblend = A.blend_mode else - curblend = A.blend_mode + curblend = defblend // Layers will be a sorted list of icons/overlays, based on the order in which they are displayed var/list/layers = list() From e02cfbec8cd2f8227c4a05f03a50e7e04e04f921 Mon Sep 17 00:00:00 2001 From: JimTheCactus Date: Thu, 31 Jul 2014 22:17:26 -0600 Subject: [PATCH 31/83] Tidy up and use more sane defaults. --- code/__HELPERS/icons.dm | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index a7560129420..34fdfdc3ae2 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -635,7 +635,7 @@ The _flatIcons list is a cache for generated icon files. */ proc // Creates a single icon from a given /atom or /image. Only the first argument is required. - getFlatIcon(image/A, defdir=2, deficon=null, defstate=null, defblend=null) + getFlatIcon(image/A, defdir=2, deficon=null, defstate="", defblend=BLEND_DEFAULT) // We start with a blank canvas, otherwise some icon procs crash silently var/icon/flat = icon('icons/effects/effects.dmi', "icon_state"="nothing") // Final flattened icon if(!A) @@ -672,13 +672,10 @@ proc // Creates a single icon from a given /atom or /image. Only the first argu curdir = defdir var/curblend - if(A.blend_mode) - if(A.blend_mode == BLEND_DEFAULT) - curblend = defblend - else - curblend = A.blend_mode - else + if(A.blend_mode == BLEND_DEFAULT) curblend = defblend + else + curblend = A.blend_mode // Layers will be a sorted list of icons/overlays, based on the order in which they are displayed var/list/layers = list() From 1bd8b7baf08e93c658880468f8f0af83d5c413f7 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Fri, 1 Aug 2014 22:05:38 +0930 Subject: [PATCH 32/83] Added citizenship, faction, religion and home system to character generation. --- baystation12.dme | 1 + code/modules/client/preferences.dm | 55 +++++++++++++++++++++ code/modules/client/preferences_factions.dm | 40 +++++++++++++++ code/modules/client/preferences_savefile.dm | 13 +++++ code/modules/mob/new_player/new_player.dm | 3 ++ 5 files changed, 112 insertions(+) create mode 100644 code/modules/client/preferences_factions.dm diff --git a/baystation12.dme b/baystation12.dme index 98fc485a45f..a2905e53ebb 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -746,6 +746,7 @@ #include "code\modules\client\client defines.dm" #include "code\modules\client\client procs.dm" #include "code\modules\client\preferences.dm" +#include "code\modules\client\preferences_factions.dm" #include "code\modules\client\preferences_gear.dm" #include "code\modules\client\preferences_savefile.dm" #include "code\modules\client\preferences_spawnpoints.dm" diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 0aee3c0cf33..3ae9f5dd586 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -77,6 +77,12 @@ datum/preferences var/language = "None" //Secondary language var/list/gear //Custom/fluff item loadout. + //Some faction information. + var/home_system = "None" //System of birth. + var/citizenship = "None" //Current home system. + var/faction = "None" //Antag faction/general associated faction. + var/religion = "None" //Religious association. + //Mob preview var/icon/preview_icon = null var/icon/preview_icon_front = null @@ -404,7 +410,14 @@ datum/preferences dat += "
Body Color
" dat += "
Change Color
__
" + dat += "

Background Information
" + dat += "Home system: [home_system]
" + dat += "Citizenship: [citizenship]
" + dat += "Faction: [faction]
" + dat += "Religion: [religion]
" + dat += "

" + if(jobban_isbanned(user, "Syndicate")) dat += "You are banned from antagonist roles." src.be_special = 0 @@ -1337,6 +1350,48 @@ datum/preferences return spawnpoint = choice + if("home_system") + var/choice = input(user, "Please choose a home system.") as null|anything in home_system_choices + list("None","Other") + if(!choice) + return + if(choice == "Other") + var/raw_choice = input(user, "Please enter a home system.") as text|null + if(raw_choice) + home_system = sanitize(copytext(raw_choice,1,MAX_MESSAGE_LEN)) + return + home_system = choice + if("citizenship") + var/choice = input(user, "Please choose your current citizenship.") as null|anything in citizenship_choices + list("None","Other") + if(!choice) + return + if(choice == "Other") + var/raw_choice = input(user, "Please enter your current citizenship.", "Character Preference") as text|null + if(raw_choice) + citizenship = sanitize(copytext(raw_choice,1,MAX_MESSAGE_LEN)) + return + citizenship = choice + if("faction") + var/choice = input(user, "Please choose a faction to work for.") as null|anything in faction_choices + list("None","Other") + if(!choice) + return + if(choice == "Other") + var/raw_choice = input(user, "Please enter a faction.") as text|null + if(raw_choice) + faction = sanitize(copytext(raw_choice,1,MAX_MESSAGE_LEN)) + return + faction = choice + if("religion") + var/choice = input(user, "Please choose a religion.") as null|anything in religion_choices + list("None","Other") + if(!choice) + return + if(choice == "Other") + var/raw_choice = input(user, "Please enter a religon.") as text|null + if(raw_choice) + religion = sanitize(copytext(raw_choice,1,MAX_MESSAGE_LEN)) + return + religion = choice + + else switch(href_list["preference"]) if("gender") diff --git a/code/modules/client/preferences_factions.dm b/code/modules/client/preferences_factions.dm new file mode 100644 index 00000000000..7b158be0eb1 --- /dev/null +++ b/code/modules/client/preferences_factions.dm @@ -0,0 +1,40 @@ +var/global/list/citizenship_choices = list( + "Earth", + "Mars", + "Moghes", + "Ahdomai", + "Qerrbalak" + ) + +var/global/list/home_system_choices = list( + "Sol", + "Nyx", + "Tau Ceti", + "Epsilon Ursae Majoris", + "S'randarr" + ) + +var/global/list/faction_choices = list( + "Sol Central", + "Vey Med", + "Aleph", + "Einstein Engines", + "Free Trade Union", + "NanoTrasen", + "Ward-Takahashi GMB", + "Gilthari Exports", + "Grayson Manufactories Ltd.", + "Aether Atmospherics", + "Zeng-Hu Pharmaceuticals", + "Hesphaistos Industries" + ) + +var/global/list/religion_choices = list( + "Unitarianism", + "Hinduism", + "Buddhist", + "Islamic", + "Christian", + "Agnostic", + "Deist" + ) \ No newline at end of file diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 896be32bace..b8f1be845c9 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -166,6 +166,10 @@ S["skill_specialization"] >> skill_specialization S["organ_data"] >> organ_data S["gear"] >> gear + S["home_system"] >> home_system + S["citizenship"] >> citizenship + S["faction"] >> faction + S["religion"] >> religion S["nanotrasen_relation"] >> nanotrasen_relation //S["skin_style"] >> skin_style @@ -225,6 +229,11 @@ if(!gear) src.gear = list() //if(!skin_style) skin_style = "Default" + if(!home_system) home_system = "None" + if(!citizenship) citizenship = "None" + if(!faction) faction = "None" + if(!religion) religion = "None" + return 1 /datum/preferences/proc/save_character() @@ -297,6 +306,10 @@ S["skill_specialization"] << skill_specialization S["organ_data"] << organ_data S["gear"] << gear + S["home_system"] << home_system + S["citizenship"] << citizenship + S["faction"] << faction + S["religion"] << religion S["nanotrasen_relation"] << nanotrasen_relation //S["skin_style"] << skin_style diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 0f18e02cf38..0419924af75 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -330,6 +330,9 @@ if(character.mind.assigned_role != "Cyborg") data_core.manifest_inject(character) ticker.minds += character.mind//Cyborgs and AIs handle this in the transform proc. //TODO!!!!! ~Carn + + //Grab some data from the character prefs for use in random news procs. + AnnounceArrival(character, rank, join_message) else From e298b177db95b74ef816c05ed4733985946cb4b2 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Fri, 1 Aug 2014 22:40:48 +0930 Subject: [PATCH 33/83] Added flags for Mining and Xenoarch. --- code/modules/mining/mine_items.dm | 67 ++++++++++++++++++++++++++++++ icons/obj/mining.dmi | Bin 47481 -> 51774 bytes maps/tgstation2.dmm | 12 +++--- 3 files changed, 73 insertions(+), 6 deletions(-) diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index c54853355e9..f695621d977 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -181,3 +181,70 @@ icon_opened = "miningcaropen" icon_closed = "miningcar" +// Flags. + +/obj/item/stack/flag + name = "flags" + desc = "Some colourful flags." + singular_name = "flag" + amount = 10 + max_amount = 10 + icon = 'icons/obj/mining.dmi' + var/upright = 0 + var/base_state + +/obj/item/stack/flag/New() + ..() + base_state = icon_state + +/obj/item/stack/flag/red + name = "red flags" + singular_name = "red flag" + icon_state = "redflag" + +/obj/item/stack/flag/yellow + name = "yellow flags" + singular_name = "yellow flag" + icon_state = "yellowflag" + +/obj/item/stack/flag/green + name = "green flags" + singular_name = "green flag" + icon_state = "greenflag" + +/obj/item/stack/flag/attackby(obj/item/W as obj, mob/user as mob) + if(upright && istype(W,src.type)) + src.attack_hand(user) + else + ..() + +/obj/item/stack/flag/attack_hand(user as mob) + if(upright) + upright = 0 + icon_state = base_state + anchored = 0 + src.visible_message("[user] knocks down [src].") + else + ..() + +/obj/item/stack/flag/attack_self(mob/user as mob) + + var/obj/item/stack/flag/F = locate() in get_turf(src) + + var/turf/T = get_turf(src) + if(!T || !istype(T,/turf/simulated/floor/plating/airless/asteroid)) + user << "The flag won't stand up in this terrain." + return + + if(F && F.upright) + user << "There is already a flag here." + return + + var/obj/item/stack/flag/newflag = new src.type(T) + newflag.amount = 1 + newflag.upright = 1 + anchored = 1 + newflag.name = newflag.singular_name + newflag.icon_state = "[newflag.base_state]_open" + newflag.visible_message("[user] plants [newflag] firmly in the ground.") + src.use(1) diff --git a/icons/obj/mining.dmi b/icons/obj/mining.dmi index 5cb0b79e876c0f85e569454d1d14302398b77c36..b51f8106a9ae63254abec6bbea0781e6cbc54e6a 100644 GIT binary patch literal 51774 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

y_9V0hY>GPqf@)P%_3MQrQm zWi-V_EKY15iossHLcrY#7lP!zN8=ijJ%M3sv-=<{`3*9kGGiYY;}`wd?zIyHZFaU_ zOu{NG{1V*}DK9OpD^-7H9;X4{82@0DcTKXs(9>Z#kCWi&kA5f{dOt7SPu+tb`?BjH z28Z1?FdDGOeMVAaoa9*Hc7eWrK5g+(CrWijN(NmVqtBT%#*3OscaGkyD#l8xh|zT| z9W%ACe=*IH9PAA-*L%ncR6bs%CZQ&YkKz2$Sej6ZYQ8f+&28RtIHjtVy|MaK)MB_O zJtt>ispHE;=qX&|X(n{7AMxa~zJyC_QiJ=;ePoQ$jJ*MoPM1=Y(?|r0BlDXR(xa#q zuQV@;bL24nn!^Xn3JY|aAJ`&Clsn~fpeF?H+c7KqV7D&Z+;bq|*Zfw@pxVgdeA8v* zhuT{!X{7rX8B-FOrA~!sDRND(?$WFYUl;}~i6-6ca)Gqur+&-O! zh<|=jA7f!m$~|1*nFM`dC&=E$3UF*cWLEJQUu5-WC;H4kfJ55xYNpaVj z5_{jBqO?@!yXeaYqe|UayV@$wgNKC3(u76n5V7 z@^09=I5q7$Se06qPsH|pYc$KenRgPC?B4YB#$~thqSQe)aObF10jRn8vP7O1qK?)gW%$wLfpktO@B; za*LSz2to~!S^Wmd`u^84Nh0w3uYsPT0Aum1RsY1(jom#Us9=(bLFe_b1_{j6As_Vc z0&Tk&xec!k&XIver6{2IakK62uN??0+)Zov$!(of?w+UefPjPBLlyzu-D_V_Q`l=A zK4eFi3)-o~I59p3-YU{!`{K?r3cPcQki74wCM4XvK@&eKxlfirRQ-Jbj1D&kE}Bo! zEg{umN(>k#f0MWSozUQiokII_?!c;bcsX!*SJ~(x@?s!I0&Y&dd+^cnjvRuN?s$8^ z2OiZ2-`KxXaobQ4_+wpn(dO}NB)uxLf$~*en$pedF+KHr{5sz1KnGEmz%tcJbjt2n zx(BE}K6u;yU!jKE)F?8W0IfYsOez{F{eX3T^7P;SxHA*I@z&w{@acDQuf}^z*e}X? znoPZZ;#iKnkG}gWr6{y$Z%b*{7>_Mu6wrDFub?BKEmE|m=lgERL9R@dS-MSA%KNYI zVuK}?xFPl+$4j_@TtS@M=CefP=l4d9#AfX`kbl^WQdcBC?T&kwwN;iOnzl*WZ0h_z z+sUf!cO(m+G7h^@VF6px_5rBLB-_2B

Hb6PTj#&rbr$@^ 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 F{}*X$%N76t literal 47481 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 diff --git a/maps/tgstation2.dmm b/maps/tgstation2.dmm index a320e3401c3..96837982230 100644 --- a/maps/tgstation2.dmm +++ b/maps/tgstation2.dmm @@ -9544,7 +9544,7 @@ "dBB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/r_wall,/area/research_outpost/iso3) "dBC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Isolation room two"; req_access_txt = "65"},/turf/simulated/floor,/area/research_outpost/iso2) "dBD" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/research_outpost/entry) -"dBE" = (/obj/machinery/alarm{pixel_y = 24},/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/turf/simulated/floor,/area/mine/production) +"dBE" = (/obj/structure/table,/obj/item/weapon/storage/box/excavation,/obj/item/weapon/pickaxe,/obj/machinery/status_display{layer = 4; pixel_x = 32; pixel_y = 0},/obj/item/weapon/wrench,/obj/item/device/measuring_tape,/obj/item/stack/flag/yellow,/turf/simulated/floor,/area/research_outpost/gearstore) "dBF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor,/area/research_outpost/entry) "dBG" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/research_outpost/hallway) "dBH" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/research_outpost/hallway) @@ -9735,7 +9735,7 @@ "dFk" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/research_outpost/gearstore) "dFl" = (/obj/structure/dispenser/oxygen,/turf/simulated/floor,/area/research_outpost/gearstore) "dFm" = (/obj/structure/closet/crate/medical,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/o2,/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/firstaid/toxin,/obj/item/weapon/storage/firstaid/adv,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_mothership) -"dFn" = (/obj/structure/table,/obj/item/weapon/storage/box/excavation,/obj/item/weapon/pickaxe,/obj/machinery/status_display{layer = 4; pixel_x = 32; pixel_y = 0},/obj/item/weapon/wrench,/obj/item/device/measuring_tape,/turf/simulated/floor,/area/research_outpost/gearstore) +"dFn" = (/obj/structure/table,/obj/item/weapon/storage/box/excavation,/obj/item/weapon/pickaxe,/obj/item/weapon/wrench,/obj/item/device/measuring_tape,/obj/item/stack/flag/green,/turf/simulated/floor,/area/research_outpost/gearstore) "dFo" = (/obj/machinery/conveyor{dir = 2; id = "anominerals"},/obj/machinery/mineral/output,/turf/simulated/floor{icon_state = "floorgrime"},/area/research_outpost/tempstorage) "dFp" = (/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/mine/explored) "dFq" = (/obj/machinery/conveyor{dir = 2; id = "anotempload"},/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/explored) @@ -9767,7 +9767,7 @@ "dFQ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/research_outpost/gearstore) "dFR" = (/obj/machinery/atmospherics/portables_connector{dir = 2},/obj/machinery/portable_atmospherics/canister/air,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/window{dir = 4; name = "Air Tank Access"; req_access_txt = "0"; req_one_access_txt = "47;10;24"},/turf/simulated/floor,/area/research_outpost/gearstore) "dFS" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "research_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25; req_access_txt = null},/turf/simulated/floor,/area/research_outpost/gearstore) -"dFT" = (/obj/structure/table,/obj/item/weapon/storage/box/excavation,/obj/item/weapon/pickaxe,/obj/item/weapon/wrench,/obj/item/device/measuring_tape,/turf/simulated/floor,/area/research_outpost/gearstore) +"dFT" = (/obj/machinery/alarm{pixel_y = 24},/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/item/stack/flag/yellow,/obj/item/stack/flag/red,/turf/simulated/floor,/area/mine/production) "dFU" = (/obj/structure/rack,/obj/item/weapon/crowbar,/obj/item/weapon/extinguisher,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_mothership) "dFV" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_r"},/turf/space,/area/syndicate_mothership) "dFW" = (/obj/machinery/atmospherics/unary/heat_reservoir/heater{dir = 1},/turf/simulated/floor/plating,/area/research_outpost/maint) @@ -12076,8 +12076,8 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafdvcedaduBdxWdCPdvcdCQdCRdCSdvcdzzdvcdCTdCUdCVdvcduBdCWdtbdCXdvIdwndtbdvcdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdqTdqTdBvdBvdCidCidCidCidCidCidCidCidBvdBvdqTdCYdCZdrYdDadrsdrsdrsdtZduaaafaafdDbdDcdDddDedwHdDgdwtdwjdWOdwGdpjdpidWWdDodDpdDqdDrdXpdXsdBOdxfdWZdALdBRdxadXkdBadBUdxedXHdCxdBUdXOdxKdxCdYidDmdDIdDJdzrdzrdzrdzrdzrdDKdtDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsadvcedadvIduBdxUdzzdCWdBodDLdBodDMduBduBdDNdxuduBdvIdvIdvcdtbdDOdvIduBdvcdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdqTdBvdBvdCidCidCidCidCidCidCidCidCidCidDPdDQdDRdDQaaaaaaaaaaaaaaaaaaaaaaaaaafdDbdDcdVxdvudvsdVvdvpdxgdDYdDYdpadpbdBMdCtdBMdEadBMdoZdEcdVodBOdVldBOdBRdBRdVjdBRdBUdBUdVadBUdBUdUvdvkdvjdUodEldEldEmdCKdEndqWdrsdrsdEodEpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsadsadvcecZdEqdvIdvIdzzdvIdChdwTdvIdErdDMdChdBudEsdvIdEtdwodvcdBodtbdCWduBdvcdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdBvdDQdCidCidCidCidCidCidCidCidCidCidCidEudEvdEwdExaaaaaaaaaaaaaaaaaaaaaaaaaafdDbdDcdWtdvQdvRdvQdvPdECdEDdDYdpfdyUdyUdEGdpddEIdBMdpcdEJdvFdWmdVKdWhdWkdWldVzdVEdVFdVGdvOdEVdBUdEWdpedCKdEYdEZdEYdEZdCKdFadFbdsaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsadsadsadvcecZdFcdxUdxsdvcdFddvcdFedFfdvcdxWdvcdFedFfdvcdxVdCWdvcdDNdFgdtbdAwdvcdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdBvdFhdCidCidCidCidCidCidCidCidCidCidCidCidFidFjdExaaaaaaaaaaaaaaaaaaaaaaaaaafdDbdoVdECdECdFkdFldTHdECdFndDYdEEdyUdMCdFqdFpdFsdBMdoWdTQdTLdFwdTZdFydBRdFzdUadFBdBUdFCdTIdFEdBUdFFdwFdFHdCKdCKdCKdCKdFIdFJdqTdsadsadsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsadsadsadsadsadsadvcdvcdvcdvcdvcdvcdFddvcdFKdxudxWdAwdwodxVdBrdxVdzBdxUdvcdFedFLdFMdFNdvcdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdBvdDPdCidCidCidCidCidCidCidCidCidCidCidCidFidEwdExaaaaaaaaaaaaaaaaaaaaaaafaafdDbdFOdFPdFPdFQdFRdECdFSdFTdDYdFodyUdoXdFqdoYdFsdBMdUgdFWdBOdFXdFYdFZdBRdGadGbdGcdBUdGddGedGfdBUdGgdGhdFHdqTdsadqTdGidGjdGkdqTdsadsadsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsadsadsadvcecZdFcdxUdxsdvcdFddvcdFedFfdvcdxWdvcdFedFfdvcdxVdCWdvcdDNdFgdtbdAwdvcdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdBvdFhdCidCidCidCidCidCidCidCidCidCidCidCidFidFjdExaaaaaaaaaaaaaaaaaaaaaaaaaafdDbdoVdECdECdFkdFldTHdECdBEdDYdEEdyUdMCdFqdFpdFsdBMdoWdTQdTLdFwdTZdFydBRdFzdUadFBdBUdFCdTIdFEdBUdFFdwFdFHdCKdCKdCKdCKdFIdFJdqTdsadsadsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsadsadsadsadsadsadvcdvcdvcdvcdvcdvcdFddvcdFKdxudxWdAwdwodxVdBrdxVdzBdxUdvcdFedFLdFMdFNdvcdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdBvdDPdCidCidCidCidCidCidCidCidCidCidCidCidFidEwdExaaaaaaaaaaaaaaaaaaaaaaafaafdDbdFOdFPdFPdFQdFRdECdFSdFndDYdFodyUdoXdFqdoYdFsdBMdUgdFWdBOdFXdFYdFZdBRdGadGbdGcdBUdGddGedGfdBUdGgdGhdFHdqTdsadqTdGidGjdGkdqTdsadsadsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsadsadsadsadsadsadsadsadsadsadsadsadvcdFddvcdxudAwdGldzydtWdxUdxudvcdxVdwodvcdGmdGndGndGodvcdGpdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdBvdBvdCidCidCidoPdCidCidCidCidCidCidCidCidGqdGraafaaaaaaaaaaaaaaaaaaaafaafaafdDbdDbdGsdGtdDbduSdGvdTtdGvdDbdoOdGTdCidCidCidCidBMdBMdBMdBOdBOdBOdBOdBRdBRdBRdBRdBUdBUdBUdBUdBUdFHdFHdGydGzdrndrndGAdFbdqTdqTdsadsadsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsadsadsadsadsadsadsadsadsadsadsadsadvcdFddvcdAwduBdzBdxudxVdwodzBdvcdFddvcdvcdAydtbdGndGBdGCdGpdGpdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdBvdoFdoJdCidoUdoFdoKdCidCidCidCidCidCidCidCidGDdGEaaaaaaaaaaaaaaaaafdGFdGGdGHdGIdGJdoSdoRdoQdTvdTudGPdGQdDbdGxdCidCidCidCidCidGRdGSdGTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdrldGUdFbdGVdqTdqTdqTdqTdqTdsadsadsadsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsadsadsadsadsadsadsadsadsadsadsadsadsadvcdFddvcdvcdvcdvcdvcdvcdvcdvcdvcdFddvcdAydtbdAzdtbdGodGWdGpdGpdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdBvdoFdCidCidCidoFdoKdCidCidCidCidCidCidCidGXdGYdGZdHadHadHadHadHadHadHbdHcdHddHedHedoLdFrdFrdDbdRKduRdHjdDbdGxdCidCidCidCidCidFidHkdHldqTdqTdsadsadsadsadsadsadqTdqTdqTdqTdqTdrldGUdFbdHmdGpdHmdqTdqTdqTdqTdsadsadsadsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -12187,7 +12187,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadH aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndHVdHVdHVdHVdHVdHVdHndHndHndHndHndHndHndHVdHVdHVdHVdHVdHndHndBvdCidCidCidJodJzdwgdJBdJCdJDdMfdMcdMtdMpdMudJJdJKdJLdHJdCidCidBvdBvdBvdBvdqTdqTdqTdqTdqTdqTdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdqTdqTdBvdBvdCidCidCidCidCidCidCidCidCidCidBvdBvdBvdBvdBvdqTdqTdqTdqTdsadsadsadIPdJMdJNdJOdJPdJNdJNdIPdIXdIYdJQdMvdIPdJRdJSdJTdJTdJTdJedCidCidCidCidCidCidCiaaaaaaaaaaaaaaaaaaaaaaaaaaadBvdBvdBvdDQdwydNbdwkdwkdHGdCidCidJUdJVdJWdJXdJVdJVdCidCidCidCidCidCidBvdqTdqTdqTdsadsadsadsadsadsadsadsadsadsadsadqTdsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndHndHVdHVdHVdHndHndHndHndHndHndHndHndHVdHVdHVdHndHndqTdBvdCidCidCidJodJYdJAdJZdKadJAdMydJAdJAdMwecmdKedJKecndKgdCidCidCidCidCidBvdBvdBvdqTdqTdqTdqTdqTdqTdqTdsadsadsadsadsadsadsadsadsadsadsadsadqTdqTdBvdBvdDQdCidCidCidCidCidCidCidCidCidCidCidCidCidCidCidBvdBvdqTdqTdqTdqTdqTdqTdIPdTwdJNdKidTxdKkdKldIPdIPdIPdIPdMvdIPdJRdKmdKmecodKmdJidCidCidCidCidCidCidCiaaaaaaaaaaaaaaaaaaaaaaaaaaadCidCidCidCidCidCidCidCidCidCidCidJUdEjdEjdEjcsPdJVdCidKqdCidCidCidEudDQdBvdqTdqTdsadsadsadsadsadsadsadsadsadsadqTdqTdsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndHVdHVdHVdHndHndHndHndHndHndHndHndHndHndHndHndHndqTdBvdCidCidCidJodKrdJAdJAdKsdJAdMydJAdJAdMEdMudwzdKvdJLdHGdCidCidCidCidCidCidCidBvdBvdBvdBvdqTdqTdqTdqTdqTdqTdsadsadsadsadsadsadsadsadsadqTdqTdBvdBvdCidJfdCidCidCidCidCidCidCidCidCidCidCidCidCidCidCidCidBvdBvdBvdBvdqTdqTdqTdIPdKwdJNdKxdJNdKydJNdKzecodKAdKBdMHdIPdJRdKmdKDdMIdwIdJndCidCidCidCidCidCiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadCidCidCidCidCidKFdKFdKGdKHdJUdMJdMLdMKecpdJVdJVdJVdJVdCidCidCidCidBvdBvdqTdqTdsadsadsadsadsadsadsadsadsadqTdsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndsadsadBvdBvdCidCidJodKMdJAecqdMMdMpdMNecrdJAdJodJodJodJodJodJodIedHJdCidCidCidCidCidCidCidCidBvdBvdBvdqTdqTdqTdqTdqTdsadsadsadsadsadsadsadqTdqTdqTdBvdCidCidCidCidCidCidCidCidCidCidCidIedHJdCidCidCidCidCidCidCidCidCidBvdBvdqTdqTdIPdIPdIPdIPdIPdIPdIPdKSdMOdKUdKSdMOdIPdIPdIPdIPdwJdIPdIPdIPdKWdKXdCidCiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadCidCidKYdKHdBEdEbdDZdMRdDWdLedMVdMUdMTdLidLjdLkdHJdCidCidCidDPdBvdqTdqTdsadsadsadsadsadsadsadqTdqTdqTdsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndsadsadBvdBvdCidCidJodKMdJAecqdMMdMpdMNecrdJAdJodJodJodJodJodJodIedHJdCidCidCidCidCidCidCidCidBvdBvdBvdqTdqTdqTdqTdqTdsadsadsadsadsadsadsadqTdqTdqTdBvdCidCidCidCidCidCidCidCidCidCidCidIedHJdCidCidCidCidCidCidCidCidCidBvdBvdqTdqTdIPdIPdIPdIPdIPdIPdIPdKSdMOdKUdKSdMOdIPdIPdIPdIPdwJdIPdIPdIPdKWdKXdCidCiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadCidCidKYdKHdFTdEbdDZdMRdDWdLedMVdMUdMTdLidLjdLkdHJdCidCidCidDPdBvdqTdqTdsadsadsadsadsadsadsadqTdqTdqTdsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndHndHndHndHndHndHndHndHndHndsadsadqTdBvdCidCidJodLldJAdLmdKadOFdLodLpdJAdLqdLrdLsdLtdLudLvdIkdIldIcdIcdIcdIcdIcdIbdCidCidCidCidBvdBvdBvdqTdqTdqTdqTdqTdsadsadsadqTdqTdqTdqTdBvdBvdCidCidIhdIcdIcdIcdIcdIcdIcdIcdIcdIkdIldIcdIcdIcdIcdIbdCidCidCidCidCidBvdqTdqTdqTdqTdqTdIPdLwdLxdLydKmdMIdLzecodMIdKzdRudwNdLCdMIecudKmdKmdLDdLEdJxdJydLFdLGdLGdLGdLGdLGdLGdLGdLHdLHdLHdLHdLHdLHdLHdKGdLIdLJdLKdLadLLdMYdLNdLOdLedMXdLPectdLRdLSecsdLUdCidCidCidDPdBvdqTdqTdsadsadsadsadsadsadqTdqTdqTdsadsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndHndHndsadsadqTdBvdCidCidJodJodJodJodJodNldLWdLXdJodJodLYdJodJodJodJodHEdHGdCidCidCidCidCidHSdCidCidCidCidBvdCidBvdBvdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdBvdBvdCidCidCidHSdCidCidCidCidCidCidCidCidHEdHGdCidCidCidCidHSdCidCidCidCidCidBvdBvdDQdBvdBvdqTdIPdIPdIPdIPdLZdMIdMadOkdNWdKBdMddMedMedNKdNKdMgdMedMhdMidMedMidMjdMjdMjdMjdMjdMjdMjdMjdMkdMkdMkdMkdMkdMkdMkdMldMmdMldMndMmdModNGdMqdUtdMsdNCecvdMTdwOdMxdLkdHGdCidCidCidCidBvdBvdqTdqTdsadsadsadsadsadqTdqTdqTdsadsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndsadsadqTdBvdBvdCidCidCidCidCidJodOndMzdMAdwPdJodMCdMDdFrdCidCidCidCidCidHUdCidCidCidIadIcdIcdIbdCidCidCidCidBvdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdBvdCidCidIhdIcdIidCidCidCidCidBvdCidCidHUdCidCidCidCidCidCidHSdCidCidCidCidCidCidCidJfdCidBvdBvdBvdBvdBvdIPdKmdPLdPEdPJdPJdPEdPCdPzdPydPJdPIdPGdPzdOSdPadOQdORdOodOodOodOodOodOodOodOodOLdOLdOLdOLdOLdOLdPRdPOdPXdPWdQldQbdPNdPMdMZdKFdKFdKFdKFdKFdKFdKFdKFdNadNbdNcdNbdFrdDPdBvdqTdqTdsadsadsadsadqTdqTdqTdqTdsadsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa From 96fbc0c640e41989be71c66d34f36296e9e15a45 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Fri, 1 Aug 2014 22:41:07 +0930 Subject: [PATCH 34/83] Added two alt titles for Miner. --- code/game/jobs/job/civilian.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm index 57350f087a7..37d80432edd 100644 --- a/code/game/jobs/job/civilian.dm +++ b/code/game/jobs/job/civilian.dm @@ -171,7 +171,7 @@ selection_color = "#dddddd" access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mint, access_mining, access_mining_station) minimal_access = list(access_mining, access_mint, access_mining_station, access_mailsorting) - + alt_titles = list("Drill Technician","Prospector") equip(var/mob/living/carbon/human/H) if(!H) return 0 From 9eefdf4db80f10c6569ddcc000e45b5b7175e928 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Fri, 1 Aug 2014 22:54:57 +0930 Subject: [PATCH 35/83] A bit of prep work for integegrating player-set backgrounds into gameplay. --- code/game/gamemodes/gameticker.dm | 1 + code/modules/client/preferences_factions.dm | 15 ++++++++++++++- code/modules/mob/new_player/new_player.dm | 1 + 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index 0c8a7aa8bd1..797afab1d47 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -297,6 +297,7 @@ var/global/datum/controller/gameticker/ticker captainless=0 if(player.mind.assigned_role != "MODE") job_master.EquipRank(player, player.mind.assigned_role, 0) + UpdateFactionList(player) EquipCustomItems(player) if(captainless) for(var/mob/M in player_list) diff --git a/code/modules/client/preferences_factions.dm b/code/modules/client/preferences_factions.dm index 7b158be0eb1..2293be7dd6a 100644 --- a/code/modules/client/preferences_factions.dm +++ b/code/modules/client/preferences_factions.dm @@ -1,3 +1,17 @@ +var/global/list/seen_citizenships = list() +var/global/list/seen_systems = list() +var/global/list/seen_factions = list() +var/global/list/seen_religions = list() + +//Commenting this out for now until I work the lists it into the event generator/journalist/chaplain. +/proc/UpdateFactionList(mob/living/carbon/human/M) + /*if(M && M.client && M.client.prefs) + seen_citizenships |= M.client.prefs.citizenship + seen_systems |= M.client.prefs.home_system + seen_factions |= M.client.prefs.faction + seen_religions |= M.client.prefs.religion*/ + return + var/global/list/citizenship_choices = list( "Earth", "Mars", @@ -17,7 +31,6 @@ var/global/list/home_system_choices = list( var/global/list/faction_choices = list( "Sol Central", "Vey Med", - "Aleph", "Einstein Engines", "Free Trade Union", "NanoTrasen", diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 0419924af75..69581c43eea 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -301,6 +301,7 @@ var/mob/living/carbon/human/character = create_character() //creates the human and transfers vars and mind job_master.EquipRank(character, rank, 1) //equips the human + UpdateFactionList(character) EquipCustomItems(character) //Find our spawning point. From f21ac595889c6f5a2cb767260077d81cba1ba468 Mon Sep 17 00:00:00 2001 From: Walter0o Date: Fri, 1 Aug 2014 21:59:48 +0200 Subject: [PATCH 36/83] fixes runtime with calling PP on dna-less mobs --- code/modules/admin/admin.dm | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 11c3980db4f..12b5bf77898 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -120,7 +120,7 @@ var/global/floorIsLava = 0 body += "Animalize | " // DNA2 - Admin Hax - if(iscarbon(M)) + if(M.dna && iscarbon(M)) body += "

" body += "DNA Blocks:
" var/bname @@ -369,21 +369,21 @@ var/global/floorIsLava = 0 if(6) dat+="ERROR: Could not submit Feed story to Network.

" if(src.admincaster_feed_channel.channel_name=="") - dat+="•Invalid receiving channel name.
" + dat+="•Invalid receiving channel name.
" if(src.admincaster_feed_message.body == "" || src.admincaster_feed_message.body == "\[REDACTED\]") - dat+="•Invalid message body.
" + dat+="•Invalid message body.
" dat+="
Return
" if(7) dat+="ERROR: Could not submit Feed Channel to Network.

" if(src.admincaster_feed_channel.channel_name =="" || src.admincaster_feed_channel.channel_name == "\[REDACTED\]") - dat+="•Invalid channel name.
" + dat+="•Invalid channel name.
" var/check = 0 for(var/datum/feed_channel/FC in news_network.network_channels) if(FC.channel_name == src.admincaster_feed_channel.channel_name) check = 1 break if(check) - dat+="•Channel name already in use.
" + dat+="•Channel name already in use.
" dat+="
Return
" if(9) dat+="[src.admincaster_feed_channel.channel_name]: \[created by: [src.admincaster_feed_channel.author]\]
" @@ -497,9 +497,9 @@ var/global/floorIsLava = 0 if(16) dat+="ERROR: Wanted Issue rejected by Network.

" if(src.admincaster_feed_message.author =="" || src.admincaster_feed_message.author == "\[REDACTED\]") - dat+="•Invalid name for person wanted.
" + dat+="•Invalid name for person wanted.
" if(src.admincaster_feed_message.body == "" || src.admincaster_feed_message.body == "\[REDACTED\]") - dat+="•Invalid description.
" + dat+="•Invalid description.
" dat+="
Return
" if(17) dat+={" @@ -1142,4 +1142,4 @@ var/global/floorIsLava = 0 // //ALL DONE //********************************************************************************************************* -// +// From 5895a098feb003628fd8f6988943bc8775282e82 Mon Sep 17 00:00:00 2001 From: Walter0o Date: Fri, 1 Aug 2014 22:34:28 +0200 Subject: [PATCH 37/83] fixes alien castes not understanding each other only /mob/living/carbon/alien have this var set, so this will not touch anything else. --- code/modules/mob/say.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index 8bb02af6d42..a9648bc95d4 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -87,6 +87,8 @@ return 1 if (istype(other, src.type) || istype(src, other.type)) return 1 + if(src.alien_talk_understand && other.alien_talk_understand) + return 1 return 0 //Language check. @@ -159,4 +161,3 @@ return L return null - From dad248d49d4944f45331faab7a379418c152deda Mon Sep 17 00:00:00 2001 From: Whitellama Date: Fri, 1 Aug 2014 16:39:19 -0700 Subject: [PATCH 38/83] Fixed #5870: Glasses being labeled both 'glass' and 'Drinking glass' inconsistently --- .../reagents/reagent_containers/food/drinks/drinkingglass.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/reagents/reagent_containers/food/drinks/drinkingglass.dm b/code/modules/reagents/reagent_containers/food/drinks/drinkingglass.dm index 454badcf195..fa788fc5b4c 100644 --- a/code/modules/reagents/reagent_containers/food/drinks/drinkingglass.dm +++ b/code/modules/reagents/reagent_containers/food/drinks/drinkingglass.dm @@ -605,8 +605,8 @@ center_of_mass = list("x"=16, "y"=10) else icon_state = "glass_empty" - name = "Drinking glass" - desc = "Your standard drinking glass" + name = "glass" + desc = "Your standard drinking glass." center_of_mass = list("x"=16, "y"=10) return From a36becad2b3899897fb8a8417929f968a6945d41 Mon Sep 17 00:00:00 2001 From: Whitellama Date: Fri, 1 Aug 2014 17:05:54 -0700 Subject: [PATCH 39/83] Wet rag no longer makes noise or hits when wiping down windows (nor does anything with the NOBLUDGEON flag) --- code/game/objects/structures/window.dm | 1 + code/modules/detectivework/footprints_and_rag.dm | 1 + 2 files changed, 2 insertions(+) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index bc4d5fd25e8..374fe49a975 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -161,6 +161,7 @@ /obj/structure/window/attackby(obj/item/W as obj, mob/user as mob) if(!istype(W)) return//I really wish I did not need this + if(W.flags & NOBLUDGEON) return if (istype(W, /obj/item/weapon/grab) && get_dist(src,user)<2) var/obj/item/weapon/grab/G = W diff --git a/code/modules/detectivework/footprints_and_rag.dm b/code/modules/detectivework/footprints_and_rag.dm index e8a207ca8e2..c94786e17a1 100644 --- a/code/modules/detectivework/footprints_and_rag.dm +++ b/code/modules/detectivework/footprints_and_rag.dm @@ -23,6 +23,7 @@ possible_transfer_amounts = list(5) volume = 5 can_be_placed_into = null + flags = FPRINT | TABLEPASS | OPENCONTAINER | NOBLUDGEON /obj/item/weapon/reagent_containers/glass/rag/attack_self(mob/user as mob) return From 500fc11db958e44bce53dc186bac868cf2c5136b Mon Sep 17 00:00:00 2001 From: Loganbacca Date: Sun, 3 Aug 2014 16:36:24 +1200 Subject: [PATCH 40/83] Verb fix - Handles verb changes in the turn_off() and turn_on() procs --- code/modules/vehicles/cargo_train.dm | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/code/modules/vehicles/cargo_train.dm b/code/modules/vehicles/cargo_train.dm index 11d0c53fb8e..1906b63c081 100644 --- a/code/modules/vehicles/cargo_train.dm +++ b/code/modules/vehicles/cargo_train.dm @@ -43,10 +43,10 @@ ..() cell = new /obj/item/weapon/cell/high verbs -= /atom/movable/verb/pull - verbs -= /obj/vehicle/train/cargo/engine/verb/stop_engine key = new() var/image/I = new(icon = 'icons/obj/vehicles.dmi', icon_state = "cargo_engine_overlay", layer = src.layer + 0.2) //over mobs overlays += I + turn_off() //so engine verbs are correctly set /obj/vehicle/train/cargo/engine/Move() if(on && cell.charge < power_use) @@ -117,6 +117,25 @@ ..() update_stats() + verbs -= /obj/vehicle/train/cargo/engine/verb/stop_engine + verbs -= /obj/vehicle/train/cargo/engine/verb/start_engine + + if(on) + verbs += /obj/vehicle/train/cargo/engine/verb/stop_engine + else + verbs += /obj/vehicle/train/cargo/engine/verb/start_engine + +/obj/vehicle/train/cargo/engine/turn_off() + ..() + + verbs -= /obj/vehicle/train/cargo/engine/verb/stop_engine + verbs -= /obj/vehicle/train/cargo/engine/verb/start_engine + + if(!on) + verbs += /obj/vehicle/train/cargo/engine/verb/start_engine + else + verbs += /obj/vehicle/train/cargo/engine/verb/stop_engine + /obj/vehicle/train/cargo/RunOver(var/mob/living/carbon/human/H) var/list/parts = list("head", "chest", "l_leg", "r_leg", "l_arm", "r_arm") @@ -195,8 +214,6 @@ turn_on() if (on) usr << "You start [src]'s engine." - verbs += /obj/vehicle/train/cargo/engine/verb/stop_engine - verbs -= /obj/vehicle/train/cargo/engine/verb/start_engine else if(cell.charge < power_use) usr << "[src] is out of power." @@ -218,8 +235,6 @@ turn_off() if (!on) usr << "You stop [src]'s engine." - verbs -= /obj/vehicle/train/cargo/engine/verb/stop_engine - verbs += /obj/vehicle/train/cargo/engine/verb/start_engine /obj/vehicle/train/cargo/engine/verb/remove_key() set name = "Remove key" From b57a814fb26097cf279199a2c3fe4c5379d18a6c Mon Sep 17 00:00:00 2001 From: Loganbacca Date: Sun, 3 Aug 2014 16:42:14 +1200 Subject: [PATCH 41/83] Reversing fix - Allows cargo tugs to reverse their direction if they are not towing anything --- code/modules/vehicles/cargo_train.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/vehicles/cargo_train.dm b/code/modules/vehicles/cargo_train.dm index 1906b63c081..2438c5b73e8 100644 --- a/code/modules/vehicles/cargo_train.dm +++ b/code/modules/vehicles/cargo_train.dm @@ -168,7 +168,7 @@ return 0 if(is_train_head()) - if(direction == reverse_direction(dir)) + if(direction == reverse_direction(dir) && tow) return 0 if(Move(get_step(src, direction))) return 1 From b8f31c0b0aead3d878ab1c09252870404a183f8b Mon Sep 17 00:00:00 2001 From: Loganbacca Date: Sun, 3 Aug 2014 20:45:41 +1200 Subject: [PATCH 42/83] Train fixes and balancing - Slows trains to 90% of running speed - Changes train impact damage to only take into account speed, not train length (otherwise you could insta kill people with a long enough train) - Fixes a bug with towed cars ghosting through closed airlocks - Stuns mobs who fall off a train that has blown up - Fixes mobs standing/lying on vehicles - Fixes exploding trains not decoupling correctly --- code/modules/mob/mob.dm | 18 +++++++++++------- code/modules/vehicles/cargo_train.dm | 12 ++++-------- code/modules/vehicles/train.dm | 16 +++++++++++++--- code/modules/vehicles/vehicle.dm | 22 +++++++++++++++++----- 4 files changed, 45 insertions(+), 23 deletions(-) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 4c39c683b89..bbcfb42b306 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -755,17 +755,21 @@ note dizziness decrements automatically in the mob's Life() proc. //Updates canmove, lying and icons. Could perhaps do with a rename but I can't think of anything to describe it. /mob/proc/update_canmove() - if(buckled && (!buckled.movable)) + if(istype(buckled, /obj/vehicle)) + var/obj/vehicle/V = buckled + if(stat || weakened || paralysis || resting || sleeping || (status_flags & FAKEDEATH)) + lying = 1 + canmove = 0 + pixel_y = V.mob_offset_y - 5 + else + lying = 0 + canmove = 1 + pixel_y = V.mob_offset_y + else if(buckled && (!buckled.movable)) anchored = 1 canmove = 0 if( istype(buckled,/obj/structure/stool/bed/chair) ) lying = 0 - else if(istype(buckled, /obj/vehicle)) - var/obj/vehicle/V = buckled - if(V.standing_mob) - lying = 0 - else - lying = 1 else lying = 1 else if(buckled && (buckled.movable)) diff --git a/code/modules/vehicles/cargo_train.dm b/code/modules/vehicles/cargo_train.dm index 2438c5b73e8..806a42a3f66 100644 --- a/code/modules/vehicles/cargo_train.dm +++ b/code/modules/vehicles/cargo_train.dm @@ -7,10 +7,9 @@ powered = 1 locked = 0 - standing_mob = 1 load_item_visible = 1 load_offset_x = 0 - load_offset_y = 7 + mob_offset_y = 7 var/car_limit = 3 //how many cars an engine can pull before performance degrades active_engines = 1 @@ -31,10 +30,10 @@ passenger_allowed = 0 locked = 0 - standing_mob = 1 load_item_visible = 1 load_offset_x = 0 load_offset_y = 4 + mob_offset_y = 8 //------------------------------------------- // Standard procs @@ -267,10 +266,7 @@ return 0 ..() - - if(istype(load, /mob/living/carbon/human)) - load.pixel_y += 4 - + if(load) return 1 @@ -317,4 +313,4 @@ move_delay = max(0, (-car_limit * active_engines) + train_length - active_engines) //limits base overweight so you cant overspeed trains move_delay *= (1 / max(1, active_engines)) * 2 //overweight penalty (scaled by the number of engines) move_delay += config.run_speed //base reference speed - move_delay *= 1.05 //makes cargo trains 5% slower than running when not overweight \ No newline at end of file + move_delay *= 1.1 //makes cargo trains 10% slower than running when not overweight \ No newline at end of file diff --git a/code/modules/vehicles/train.dm b/code/modules/vehicles/train.dm index d29933b5ed8..9b0ae6653bd 100644 --- a/code/modules/vehicles/train.dm +++ b/code/modules/vehicles/train.dm @@ -32,6 +32,8 @@ tow.Move(old_loc) return 1 else + if(lead) + unattach() return 0 /obj/vehicle/train/Bump(atom/Obstacle) @@ -48,14 +50,22 @@ if(istype(A, /mob/living)) var/mob/living/M = A visible_message("\red [src] knocks over [M]!") - M.apply_effects(5, 5) //knock people down if you hit them - M.apply_damages(5 * train_length / move_delay) // and do damage according to how fast the train is going and how heavy it is + M.apply_effects(5, 5) //knock people down if you hit them + M.apply_damages(22 / move_delay) // and do damage according to how fast the train is going if(istype(load, /mob/living/carbon/human)) var/mob/living/D = load D << "\red You hit [M]!" msg_admin_attack("[D.name] ([D.ckey]) hit [M.name] ([M.ckey]) with [src]. (JMP)") +//------------------------------------------- +// Vehicle procs +//------------------------------------------- +/obj/vehicle/train/explode() + tow.unattach() + unattach() + ..() + //------------------------------------------- // Interaction procs @@ -79,7 +89,7 @@ return 1 /obj/vehicle/train/MouseDrop_T(var/atom/movable/C, mob/user as mob) - if(user.buckled || user.stat || user.restrained() || !Adjacent(user) || !user.Adjacent(C) || !istype(C)) + if(user.buckled || user.stat || user.restrained() || !Adjacent(user) || !user.Adjacent(C) || !istype(C) || (user == C && !user.canmove)) return if(istype(C,/obj/vehicle/train)) latch(C, user) diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm index caec0c896ab..55ecdb2780b 100644 --- a/code/modules/vehicles/vehicle.dm +++ b/code/modules/vehicles/vehicle.dm @@ -24,11 +24,11 @@ var/obj/item/weapon/cell/cell var/power_use = 5 //set this to adjust the amount of power the vehicle uses per move - var/standing_mob = 0 //if a mob loaded on the vehicle should be standing var/atom/movable/load //all vehicles can take a load, since they should all be a least drivable var/load_item_visible = 1 //set if the loaded item should be overlayed on the vehicle sprite var/load_offset_x = 0 //pixel_x offset for item overlay var/load_offset_y = 0 //pixel_y offset for item overlay + var/mob_offset_y = 0 //pixel_y offset for mob overlay //------------------------------------------- // Standard procs @@ -44,11 +44,15 @@ var/init_anc = anchored anchored = 0 - if(..()) - if(on && powered) - cell.use(power_use) + if(!..()) + anchored = init_anc + return 0 + anchored = init_anc + if(on && powered) + cell.use(power_use) + if(load) load.forceMove(loc)// = loc load.dir = dir @@ -200,6 +204,11 @@ cell.update_icon() cell = null + //stuns people who are thrown off a train that has been blown up + if(istype(load, /mob/living)) + var/mob/living/M = load + M.apply_effects(5, 5) + unload() new /obj/effect/gibspawner/robot(Tsec) @@ -280,7 +289,10 @@ if(load_item_visible) C.pixel_x += load_offset_x - C.pixel_y += load_offset_y + if(ismob(C)) + C.pixel_y += mob_offset_y + else + C.pixel_y += load_offset_y C.layer = layer + 0.1 //so it sits above the vehicle if(ismob(C)) From a586c1dd70573f3e5ac97833f1fbf1acc68a4167 Mon Sep 17 00:00:00 2001 From: Walter0o Date: Sun, 3 Aug 2014 13:52:47 +0200 Subject: [PATCH 43/83] remove double paper/attack() definition --- code/game/objects/items/weapons/cosmetics.dm | 22 +------------------- 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/code/game/objects/items/weapons/cosmetics.dm b/code/game/objects/items/weapons/cosmetics.dm index d473343e61f..2e5f61f80e2 100644 --- a/code/game/objects/items/weapons/cosmetics.dm +++ b/code/game/objects/items/weapons/cosmetics.dm @@ -65,24 +65,4 @@ else user << "Where are the lips on that?" -//you can wipe off lipstick with paper! -/obj/item/weapon/paper/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) - if(user.zone_sel.selecting == "mouth") - if(!istype(M, /mob)) return - - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(H == user) - user << "You wipe off the lipstick with [src]." - H.lip_style = null - H.update_body() - else - user.visible_message("[user] begins to wipe [H]'s lipstick off with \the [src].", \ - "You begin to wipe off [H]'s lipstick.") - if(do_after(user, 10) && do_after(H, 10, 5, 0)) //user needs to keep their active hand, H does not. - user.visible_message("[user] wipes [H]'s lipstick off with \the [src].", \ - "You wipe off [H]'s lipstick.") - H.lip_style = null - H.update_body() - else - ..() \ No newline at end of file +//you can wipe off lipstick with paper! see code/modules/paperwork/paper.dm, paper/attack() From 2dd71b53a715b0968cef262811ed664c73398ab3 Mon Sep 17 00:00:00 2001 From: Walter0o Date: Sun, 3 Aug 2014 13:52:59 +0200 Subject: [PATCH 44/83] adds lipstick wiping to proper paper/attack() --- code/modules/paperwork/paper.dm | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index c45d65f33f8..515d6b0bc86 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -113,6 +113,22 @@ user.visible_message("You show the paper to [M]. ", \ " [user] holds up a paper and shows it to [M]. ") M << examine() + + else if(user.zone_sel.selecting == "mouth") // lipstick wiping + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(H == user) + user << "You wipe off the lipstick with [src]." + H.lip_style = null + H.update_body() + else + user.visible_message("[user] begins to wipe [H]'s lipstick off with \the [src].", \ + "You begin to wipe off [H]'s lipstick.") + if(do_after(user, 10) && do_after(H, 10, 5, 0)) //user needs to keep their active hand, H does not. + user.visible_message("[user] wipes [H]'s lipstick off with \the [src].", \ + "You wipe off [H]'s lipstick.") + H.lip_style = null + H.update_body() /obj/item/weapon/paper/proc/addtofield(var/id, var/text, var/links = 0) var/locid = 0 From cf3a37d732e8363a04e52ac6a56095d36edac1df Mon Sep 17 00:00:00 2001 From: mwerezak Date: Sun, 3 Aug 2014 12:32:37 -0400 Subject: [PATCH 45/83] Fixes #5852 --- .../objects/items/weapons/tanks/jetpack.dm | 141 +++++++++--------- 1 file changed, 68 insertions(+), 73 deletions(-) diff --git a/code/game/objects/items/weapons/tanks/jetpack.dm b/code/game/objects/items/weapons/tanks/jetpack.dm index 3c63ac33273..6c3d4a3568f 100644 --- a/code/game/objects/items/weapons/tanks/jetpack.dm +++ b/code/game/objects/items/weapons/tanks/jetpack.dm @@ -13,63 +13,58 @@ var/volume_rate = 500 //Needed for borg jetpack transfer icon_action_button = "action_jetpack" - New() - ..() - src.ion_trail = new /datum/effect/effect/system/ion_trail_follow() - src.ion_trail.set_up(src) - return +/obj/item/weapon/tank/jetpack/New() + ..() + src.ion_trail = new /datum/effect/effect/system/ion_trail_follow() + src.ion_trail.set_up(src) +/obj/item/weapon/tank/jetpack/examine() + set src in usr + ..() + if(air_contents.oxygen < 10) + usr << text("\red The meter on the [src.name] indicates you are almost out of air!") + playsound(usr, 'sound/effects/alert.ogg', 50, 1) - examine() - set src in usr - ..() - if(air_contents.oxygen < 10) - usr << text("\red The meter on the [src.name] indicates you are almost out of air!") - playsound(usr, 'sound/effects/alert.ogg', 50, 1) - return +/obj/item/weapon/tank/jetpack/verb/toggle_rockets() + set name = "Toggle Jetpack Stabilization" + set category = "Object" + src.stabilization_on = !( src.stabilization_on ) + usr << "You toggle the stabilization [stabilization_on? "on":"off"]." +/obj/item/weapon/tank/jetpack/verb/toggle() + set name = "Toggle Jetpack" + set category = "Object" + + on = !on + if(on) + icon_state = "[icon_state]-on" + ion_trail.start() + else + icon_state = initial(icon_state) + ion_trail.stop() + + if (ismob(usr)) + var/mob/M = usr + M.update_inv_back() - verb/toggle_rockets() - set name = "Toggle Jetpack Stabilization" - set category = "Object" - src.stabilization_on = !( src.stabilization_on ) - usr << "You toggle the stabilization [stabilization_on? "on":"off"]." - return +/obj/item/weapon/tank/jetpack/proc/allow_thrust(num, mob/living/user as mob) + if(!(src.on)) + return 0 + if((num < 0.005 || src.air_contents.total_moles() < num)) + src.ion_trail.stop() + return 0 + var/datum/gas_mixture/G = src.air_contents.remove(num) - verb/toggle() - set name = "Toggle Jetpack" - set category = "Object" - on = !on - if(on) - icon_state = "[icon_state]-on" -// item_state = "[item_state]-on" - ion_trail.start() - else - icon_state = initial(icon_state) -// item_state = initial(item_state) - ion_trail.stop() - return + var/allgases = G.carbon_dioxide + G.nitrogen + G.oxygen + G.phoron //fuck trace gases -Pete + if(allgases >= 0.005) + return 1 + del(G) + return - proc/allow_thrust(num, mob/living/user as mob) - if(!(src.on)) - return 0 - if((num < 0.005 || src.air_contents.total_moles() < num)) - src.ion_trail.stop() - return 0 - - var/datum/gas_mixture/G = src.air_contents.remove(num) - - var/allgases = G.carbon_dioxide + G.nitrogen + G.oxygen + G.phoron //fuck trace gases -Pete - if(allgases >= 0.005) - return 1 - - del(G) - return - - ui_action_click() - toggle() +/obj/item/weapon/tank/jetpack/ui_action_click() + toggle() /obj/item/weapon/tank/jetpack/void @@ -78,11 +73,11 @@ icon_state = "jetpack-void" item_state = "jetpack-void" - New() - ..() - //src.air_contents.oxygen = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) - air_contents.adjust((6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) - return +/obj/item/weapon/tank/jetpack/void/New() + ..() + //src.air_contents.oxygen = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) + air_contents.adjust((6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) + return /obj/item/weapon/tank/jetpack/oxygen name = "Jetpack (Oxygen)" @@ -90,11 +85,11 @@ icon_state = "jetpack" item_state = "jetpack" - New() - ..() - //src.air_contents.oxygen = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) - air_contents.adjust((6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) - return +/obj/item/weapon/tank/jetpack/oxygen/New() + ..() + //src.air_contents.oxygen = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) + air_contents.adjust((6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) + return /obj/item/weapon/tank/jetpack/carbondioxide name = "Jetpack (Carbon Dioxide)" @@ -103,18 +98,18 @@ icon_state = "jetpack-black" item_state = "jetpack-black" - New() - ..() - src.ion_trail = new /datum/effect/effect/system/ion_trail_follow() - src.ion_trail.set_up(src) - //src.air_contents.carbon_dioxide = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) - air_contents.adjust(0,(6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) - return +/obj/item/weapon/tank/jetpack/carbondioxide/New() + ..() + src.ion_trail = new /datum/effect/effect/system/ion_trail_follow() + src.ion_trail.set_up(src) + //src.air_contents.carbon_dioxide = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) + air_contents.adjust(0,(6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) + return - examine() - set src in usr - ..() - if(air_contents.carbon_dioxide < 10) - usr << text("\red The meter on the [src.name] indicates you are almost out of air!") - playsound(usr, 'sound/effects/alert.ogg', 50, 1) - return +/obj/item/weapon/tank/jetpack/carbondioxide/examine() + set src in usr + ..() + if(air_contents.carbon_dioxide < 10) + usr << text("\red The meter on the [src.name] indicates you are almost out of air!") + playsound(usr, 'sound/effects/alert.ogg', 50, 1) + return From 4488ea1bf1d393d89395fb14d171b240efae48a5 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Mon, 4 Aug 2014 12:56:31 -0400 Subject: [PATCH 46/83] Fixes #5893 --- icons/mob/belt.dmi | Bin 6038 -> 6392 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/belt.dmi b/icons/mob/belt.dmi index d2b6ba4aef1c6a355bd8b194d65166a8605b702f..73ddaaf49f56f380bb13f4d39a8fa09182f3bc5a 100644 GIT binary patch literal 6392 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 Date: Mon, 4 Aug 2014 13:04:34 -0400 Subject: [PATCH 47/83] Fixes #5881 --- code/modules/mob/living/silicon/robot/robot.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 754c1b5dc6d..9e16fd0aa2b 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -1112,7 +1112,7 @@ if (href_list["act"]) var/obj/item/O = locate(href_list["act"]) - if (!istype(O) || !(O.loc == src || O.loc == src.module)) + if (!istype(O) || !(O in src.module.modules)) return if(activated(O)) From 029a3f3abd75f9d2f1a466df03ce8e0b522f1a42 Mon Sep 17 00:00:00 2001 From: Graham Lloyd Date: Mon, 4 Aug 2014 14:52:51 -0400 Subject: [PATCH 48/83] fixes wall rechargers showing up as normal rechargers. --- code/game/machinery/recharger.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index 5b4366259ee..eec36aaf576 100644 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -123,6 +123,7 @@ obj/machinery/recharger/update_icon() //we have an update_icon() in addition to // Atlantis: No need for that copy-pasta code, just use var to store icon_states instead. obj/machinery/recharger/wallcharger name = "wall recharger" + icon_state = "wrecharger0" icon_state_charged = "wrecharger2" icon_state_charging = "wrecharger1" icon_state_idle = "wrecharger0" From 2c30af61243a92a110c2d0a02501cf01688977bf Mon Sep 17 00:00:00 2001 From: Graham Lloyd Date: Mon, 4 Aug 2014 14:53:33 -0400 Subject: [PATCH 49/83] Fireaxe cabinet hacking now fails if player moves away --- .../structures/crates_lockers/closets/fireaxe.dm | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm index 2090d76af53..87eb2cb8114 100644 --- a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm +++ b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm @@ -25,10 +25,10 @@ if(istype(O, /obj/item/device/multitool)) user << "\red Resetting circuitry..." playsound(user, 'sound/machines/lockreset.ogg', 50, 1) - sleep(50) // Sleeping time~ - src.locked = 0 - user << "\blue You disable the locking modules." - update_icon() + if(do_after(user, 20)) + src.locked = 0 + user << " You disable the locking modules." + update_icon() return else if(istype(O, /obj/item/weapon)) var/obj/item/weapon/W = O @@ -87,6 +87,9 @@ src.locked = 1 user << "\blue You re-enable the locking modules." playsound(user, 'sound/machines/lockenable.ogg', 50, 1) + if(do_after(user,20)) + src.locked = 1 + user << " You re-enable the locking modules." return else localopened = !localopened From dcc3393b25797e8c7ebe026ab7f62ab924e9a9fc Mon Sep 17 00:00:00 2001 From: Walter0o Date: Mon, 4 Aug 2014 23:41:23 +0200 Subject: [PATCH 50/83] fixes #5876 stun beams killed simple animals --- code/modules/mob/living/simple_animal/simple_animal.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 0360de52b0a..f425f1a019d 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -229,7 +229,9 @@ adjustBruteLoss(damage) /mob/living/simple_animal/bullet_act(var/obj/item/projectile/Proj) - if(!Proj) return + if(!Proj || Proj.nodamage) + return + adjustBruteLoss(Proj.damage) return 0 From 52da372bac73f4228bcf96597d41b4e03ce24918 Mon Sep 17 00:00:00 2001 From: Ccomp5950 Date: Mon, 4 Aug 2014 21:11:09 -0500 Subject: [PATCH 51/83] Fueltanks now log and admin_msg when shot at / weldered --- code/game/objects/items/weapons/tools.dm | 8 ++++---- code/modules/reagents/reagent_dispenser.dm | 4 ++++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index d148b3b758a..af50cd10882 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -251,9 +251,9 @@ playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6) return else if (istype(O, /obj/structure/reagent_dispensers/fueltank) && get_dist(src,O) <= 1 && src.welding) - message_admins("[key_name_admin(user)] triggered a fueltank explosion.") - log_game("[key_name(user)] triggered a fueltank explosion.") - user << "\red That was stupid of you." + message_admins("[key_name_admin(user)] triggered a fueltank explosion with a welding tool.") + log_game("[key_name(user)] triggered a fueltank explosion with a welding tool.") + user << "\red You begin welding on the fueltank and with a moment of lucidity you realize, this might not have been the smartest thing you've ever done." var/obj/structure/reagent_dispensers/fueltank/tank = O tank.explode() return @@ -470,4 +470,4 @@ user << "Nothing to fix!" else - return ..() \ No newline at end of file + return ..() diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index fd5821784ee..54448450324 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -147,6 +147,10 @@ /obj/structure/reagent_dispensers/fueltank/bullet_act(var/obj/item/projectile/Proj) if(istype(Proj ,/obj/item/projectile/beam)||istype(Proj,/obj/item/projectile/bullet)) + if(istype(Proj.firer)) + message_admins("[key_name_admin(Proj.firer)] shot fueltank at ([loc.x],[loc.y],[loc.z]).") + log_game("[key_name(Proj.firer)] shot fueltank at ([loc.x],[loc.y],[loc.z]).") + if(!istype(Proj ,/obj/item/projectile/beam/lastertag) && !istype(Proj ,/obj/item/projectile/beam/practice) ) explode() From 74fd47e2deaeb3c2a2a3488a899bf9b4bd0123c0 Mon Sep 17 00:00:00 2001 From: Ccomp5950 Date: Tue, 5 Aug 2014 18:55:15 -0500 Subject: [PATCH 52/83] Fixed the font tag on mouse traps description. --- code/game/objects/items/weapons/storage/boxes.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index 86bbd13651c..dea00bcf082 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -397,7 +397,7 @@ /obj/item/weapon/storage/box/mousetraps name = "box of Pest-B-Gon mousetraps" - desc = "WARNING: Keep out of reach of children." + desc = "WARNING: Keep out of reach of children." icon_state = "mousetraps" New() @@ -506,4 +506,4 @@ for(var/i = 0; i < 14; i++) new /obj/item/weapon/light/tube(src) for(var/i = 0; i < 7; i++) - new /obj/item/weapon/light/bulb(src) \ No newline at end of file + new /obj/item/weapon/light/bulb(src) From d4c06d0424808bfb9f747821c9a790b0f330098e Mon Sep 17 00:00:00 2001 From: mwerezak Date: Wed, 6 Aug 2014 14:36:20 -0400 Subject: [PATCH 53/83] Fixes bad entry in rig/sprite_sheets_obj --- code/modules/clothing/spacesuits/rig.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/clothing/spacesuits/rig.dm b/code/modules/clothing/spacesuits/rig.dm index e003f6a7dea..6a0ecc49331 100644 --- a/code/modules/clothing/spacesuits/rig.dm +++ b/code/modules/clothing/spacesuits/rig.dm @@ -21,7 +21,7 @@ "Skrell" = 'icons/mob/species/skrell/helmet.dmi' ) sprite_sheets_obj = list( - "Tajaran" = 'icons/obj/clothing/species/tajaran/suits.dmi', + "Tajaran" = 'icons/obj/clothing/species/tajaran/hats.dmi', ) attack_self(mob/user) From 7f89f891b6d2687bf34f9f8f81ae69dd6171b1ef Mon Sep 17 00:00:00 2001 From: mwerezak Date: Thu, 7 Aug 2014 16:30:21 -0400 Subject: [PATCH 54/83] Fixes icon not reverting when cycling a suit back --- code/modules/clothing/clothing.dm | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index f6681f9d22f..3cc7eaa8077 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -33,16 +33,21 @@ return 1 /obj/item/clothing/proc/refit_for_species(var/target_species) + //Set species_restricted list switch(target_species) if("Human", "Skrell") //humanoid bodytypes species_restricted = list("exclude","Unathi","Tajaran","Diona","Vox") else species_restricted = list(target_species) + //Set icon if (sprite_sheets_obj && (target_species in sprite_sheets_obj)) icon = sprite_sheets_obj[target_species] + else + icon = initial(icon) /obj/item/clothing/head/helmet/refit_for_species(var/target_species) + //Set species_restricted list switch(target_species) if("Skrell") species_restricted = list("exclude","Unathi","Tajaran","Diona","Vox") @@ -51,8 +56,11 @@ else species_restricted = list(target_species) + //Set icon if (sprite_sheets_obj && (target_species in sprite_sheets_obj)) icon = sprite_sheets_obj[target_species] + else + icon = initial(icon) //Ears: headsets, earmuffs and tiny objects From 170e03d736d17857f4110bb315d3ddf16ed8100d Mon Sep 17 00:00:00 2001 From: mwerezak Date: Thu, 7 Aug 2014 16:49:44 -0400 Subject: [PATCH 55/83] Fixes yank out object bloodying the wrong hands --- code/modules/mob/mob.dm | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index bbcfb42b306..d1b5f1c7b1e 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -982,8 +982,7 @@ mob/proc/yank_out_object() if(valid_objects.len == 1) //Yanking out last object - removing verb. src.verbs -= /mob/proc/yank_out_object - if(istype(src,/mob/living/carbon/human)) - + if(ishuman(src)) var/mob/living/carbon/human/H = src var/datum/organ/external/affected @@ -994,13 +993,16 @@ mob/proc/yank_out_object() affected.implants -= selection H.shock_stage+=20 - H.bloody_hands(S) affected.take_damage((selection.w_class * 3), 0, 0, 1, "Embedded object extraction") if(prob(selection.w_class * 5)) //I'M SO ANEMIC I COULD JUST -DIE-. var/datum/wound/internal_bleeding/I = new (15) affected.wounds += I H.custom_pain("Something tears wetly in your [affected] as [selection] is pulled free!", 1) + + if (ishuman(U)) + var/mob/living/carbon/human/human_user = U + human_user.bloody_hands(H) selection.loc = get_turf(src) From a6c31bc5e8967e137851eb3cde04e71d29ad94af Mon Sep 17 00:00:00 2001 From: mwerezak Date: Thu, 7 Aug 2014 17:06:01 -0400 Subject: [PATCH 56/83] Fixes xbow tension not being rest when fired --- code/modules/projectiles/guns/projectile/crossbow.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/projectiles/guns/projectile/crossbow.dm b/code/modules/projectiles/guns/projectile/crossbow.dm index e9bfb12b84c..84bd0d096ad 100644 --- a/code/modules/projectiles/guns/projectile/crossbow.dm +++ b/code/modules/projectiles/guns/projectile/crossbow.dm @@ -84,6 +84,7 @@ if(!..()) return //Only do this on a successful shot. icon_state = "crossbow" + tension = 0 /obj/item/weapon/gun/launcher/crossbow/attack_self(mob/living/user as mob) if(tension) From 4c6349f585b3df774dc8eaabc528c7cadc406d37 Mon Sep 17 00:00:00 2001 From: Walter0o Date: Thu, 7 Aug 2014 23:41:11 +0200 Subject: [PATCH 57/83] fixes #5914 user message blatantly stolen from /tg/ <3 --- code/modules/mob/living/silicon/robot/robot.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 9e16fd0aa2b..141667ecbb0 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -598,6 +598,10 @@ return if (istype(W, /obj/item/weapon/weldingtool)) + if (src == user) + user << "You lack the reach to be able to repair yourself." + return + if (!getBruteLoss()) user << "Nothing to fix here!" return From 30c96bc7ccc961963c8cda9c97ddf0ad253db9fb Mon Sep 17 00:00:00 2001 From: mwerezak Date: Fri, 8 Aug 2014 20:31:14 -0400 Subject: [PATCH 58/83] Fixes #5915 Also allows checking remaining engine charge by examining, and removes the verb. --- code/modules/vehicles/cargo_train.dm | 47 ++++++++++---------------- code/modules/vehicles/train.dm | 50 ++++++++++++++++++---------- code/modules/vehicles/vehicle.dm | 10 +++--- 3 files changed, 54 insertions(+), 53 deletions(-) diff --git a/code/modules/vehicles/cargo_train.dm b/code/modules/vehicles/cargo_train.dm index 806a42a3f66..ea3f7b72e6c 100644 --- a/code/modules/vehicles/cargo_train.dm +++ b/code/modules/vehicles/cargo_train.dm @@ -48,7 +48,7 @@ turn_off() //so engine verbs are correctly set /obj/vehicle/train/cargo/engine/Move() - if(on && cell.charge < power_use) + if(on && cell.charge < charge_use) turn_off() update_stats() if(load && is_train_head()) @@ -183,20 +183,7 @@ if(get_dist(usr,src) <= 1) usr << "The power light is [on ? "on" : "off"].\nThere are[key ? "" : " no"] keys in the ignition." - -/obj/vehicle/train/cargo/engine/verb/check_power() - set name = "Check power level" - set category = "Object" - set src in view(1) - - if(!istype(usr, /mob/living/carbon/human)) - return - - if(!cell) - usr << "There is no power cell installed in [src]." - return - - usr << "The power meter reads [round(cell.percent(), 0.01)]%" + usr << "The charge meter reads [cell? round(cell.percent(), 0.01) : 0]%" /obj/vehicle/train/cargo/engine/verb/start_engine() set name = "Start engine" @@ -214,7 +201,7 @@ if (on) usr << "You start [src]'s engine." else - if(cell.charge < power_use) + if(cell.charge < charge_use) usr << "[src] is out of power." else usr << "[src]'s engine won't start." @@ -288,13 +275,22 @@ // more engines increases this limit by car_limit per // engine. //------------------------------------------------------- -/obj/vehicle/train/cargo/engine/update_train_stats() - ..() +/obj/vehicle/train/cargo/engine/update_car(var/train_length, var/active_engines) + src.train_length = train_length + src.active_engines = active_engines - update_move_delay() + //Update move delay + if(!is_train_head() || !on) + move_delay = initial(move_delay) //so that engines that have been turned off don't lag behind + else + move_delay = max(0, (-car_limit * active_engines) + train_length - active_engines) //limits base overweight so you cant overspeed trains + move_delay *= (1 / max(1, active_engines)) * 2 //overweight penalty (scaled by the number of engines) + move_delay += config.run_speed //base reference speed + move_delay *= 1.1 //makes cargo trains 10% slower than running when not overweight -/obj/vehicle/train/cargo/trolley/update_train_stats() - ..() +/obj/vehicle/train/cargo/trolley/update_car(var/train_length, var/active_engines) + src.train_length = train_length + src.active_engines = active_engines if(!lead && !tow) anchored = 0 @@ -305,12 +301,3 @@ else anchored = 1 verbs -= /atom/movable/verb/pull - -/obj/vehicle/train/cargo/engine/proc/update_move_delay() - if(!is_train_head() || !on) - move_delay = initial(move_delay) //so that engines that have been turned off don't lag behind - else - move_delay = max(0, (-car_limit * active_engines) + train_length - active_engines) //limits base overweight so you cant overspeed trains - move_delay *= (1 / max(1, active_engines)) * 2 //overweight penalty (scaled by the number of engines) - move_delay += config.run_speed //base reference speed - move_delay *= 1.1 //makes cargo trains 10% slower than running when not overweight \ No newline at end of file diff --git a/code/modules/vehicles/train.dm b/code/modules/vehicles/train.dm index 9b0ae6653bd..b7e70f039fa 100644 --- a/code/modules/vehicles/train.dm +++ b/code/modules/vehicles/train.dm @@ -142,6 +142,15 @@ if (T.tow) user << "\red [T] is already towing something." return + + //check for cycles. + var/obj/vehicle/train/next_car = T + while (next_car) + if (next_car == src) + user << "\red That seems very silly." + return + next_car = next_car.lead + //latch with src as the follower lead = T T.tow = src @@ -192,23 +201,28 @@ // size of the train, to limit super long trains. //------------------------------------------------------- /obj/vehicle/train/update_stats() - if(tow) - return tow.update_stats() //take us to the very end - else - update_train_stats() //we're at the end + //first, seek to the end of the train + var/obj/vehicle/train/T = src + while(T.tow) + //check for cyclic train. + if (T.tow == src) + lead.tow = null + lead.update_stats() + + lead = null + update_stats() + return + T = T.tow -/obj/vehicle/train/proc/update_train_stats() - if(powered && on) - active_engines = 1 //increment active engine count if this is a running engine - else - active_engines = 0 + //now walk back to the front. + var/active_engines = 0 + var/train_length = 0 + while(T) + train_length++ + if (powered && on) + active_engines++ + T.update_car(train_length, active_engines) + T = T.lead - train_length = 1 - - if(istype(tow)) - active_engines += tow.active_engines - train_length += tow.train_length - - //update the next section of train ahead of us - if(istype(lead)) - lead.update_train_stats() \ No newline at end of file +/obj/vehicle/train/proc/update_car(var/train_length, var/active_engines) + return diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm index 55ecdb2780b..c018064349b 100644 --- a/code/modules/vehicles/vehicle.dm +++ b/code/modules/vehicles/vehicle.dm @@ -22,7 +22,7 @@ var/movable = 1 var/obj/item/weapon/cell/cell - var/power_use = 5 //set this to adjust the amount of power the vehicle uses per move + var/charge_use = 5 //set this to adjust the amount of power the vehicle uses per move var/atom/movable/load //all vehicles can take a load, since they should all be a least drivable var/load_item_visible = 1 //set if the loaded item should be overlayed on the vehicle sprite @@ -39,7 +39,7 @@ /obj/vehicle/Move() if(world.time > l_move_time + move_delay) - if(on && powered && cell.charge < power_use) + if(on && powered && cell.charge < charge_use) turn_off() var/init_anc = anchored @@ -51,7 +51,7 @@ anchored = init_anc if(on && powered) - cell.use(power_use) + cell.use(charge_use) if(load) load.forceMove(loc)// = loc @@ -172,7 +172,7 @@ /obj/vehicle/proc/turn_on() if(stat) return 0 - if(powered && cell.charge < power_use) + if(powered && cell.charge < charge_use) return 0 on = 1 luminosity = initial(luminosity) @@ -228,7 +228,7 @@ turn_off() return - if(cell.charge < power_use) + if(cell.charge < charge_use) turn_off() return From 000da8d5bc0d980ae6dfa4ff158556dec85f8fef Mon Sep 17 00:00:00 2001 From: Jarcolr Date: Sat, 9 Aug 2014 17:07:34 +0300 Subject: [PATCH 59/83] Removes diaper/ongrounds from monkey.dmi Ook. --- icons/mob/monkey.dmi | Bin 23047 -> 22349 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/monkey.dmi b/icons/mob/monkey.dmi index 2da3a2347325bdcda4559ffe0838d21cddce5d3e..cde5a39f5ea64dceb14a5a29d61a193fbacc19f3 100644 GIT binary patch literal 22349 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 literal 23047 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 Date: Sat, 9 Aug 2014 21:46:44 +0200 Subject: [PATCH 60/83] meter improvements - can unwrench meters now without needing to unwrench the pipe beneath - AIs and ghosts can still click to examine - other mobs don't read meter instead of doing whatever it is they are clicking for, e.g. shooting a gun - 3 tile range check for non-AI/ghost still in place - added feedback when no power or broken --- code/game/machinery/atmoalter/meter.dm | 38 ++++++++++---------------- 1 file changed, 15 insertions(+), 23 deletions(-) diff --git a/code/game/machinery/atmoalter/meter.dm b/code/game/machinery/atmoalter/meter.dm index b73e2cbde22..88fa2a07ecc 100644 --- a/code/game/machinery/atmoalter/meter.dm +++ b/code/game/machinery/atmoalter/meter.dm @@ -68,9 +68,16 @@ ) radio_connection.post_signal(src, signal) -/obj/machinery/meter/proc/status() - var/t = "" - if (src.target) +/obj/machinery/meter/examine() + var/t = "A gas flow meter. " + + if(get_dist(usr, src) > 3 && !(istype(usr, /mob/living/silicon/ai) || istype(usr, /mob/dead))) + t += "\blue You are too far away to read it." + + else if(stat & (NOPOWER|BROKEN)) + t += "\red The display is off." + + else if(src.target) var/datum/gas_mixture/environment = target.return_air() if(environment) t += "The pressure gauge reads [round(environment.return_pressure(), 0.01)] kPa; [round(environment.temperature,0.01)]°K ([round(environment.temperature-T0C,0.01)]°C)" @@ -78,31 +85,16 @@ t += "The sensor error light is blinking." else t += "The connect error light is blinking." - return t - -/obj/machinery/meter/examine() - set src in view(3) - - var/t = "A gas flow meter. " - t += status() + usr << t - - /obj/machinery/meter/Click() - if(stat & (NOPOWER|BROKEN)) + if(istype(usr, /mob/living/silicon/ai)) // ghosts can call ..() for examine + usr << examine() return 1 - - var/t = null - if (get_dist(usr, src) <= 3 || istype(usr, /mob/living/silicon/ai) || istype(usr, /mob/dead)) - t += status() - else - usr << "\blue You are too far away." - return 1 - - usr << t - return 1 + + return ..() /obj/machinery/meter/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) if (!istype(W, /obj/item/weapon/wrench)) From 852cccf94a6225d007bc67d14d3e742a4f1502ba Mon Sep 17 00:00:00 2001 From: Walter0o Date: Sun, 10 Aug 2014 02:07:13 +0200 Subject: [PATCH 61/83] fixes tele-comp not checking power on initialize() prevents exploiting the computer back on while area power is off --- code/game/machinery/teleporter.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index f9bc8d879b2..b247f179195 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -17,6 +17,7 @@ return /obj/machinery/computer/teleporter/initialize() + ..() var/obj/machinery/teleport/station/station = locate(/obj/machinery/teleport/station, get_step(src, dir)) var/obj/machinery/teleport/hub/hub if(station) From fa15a25b67be5acfac4027f6e76ff587c25ea187 Mon Sep 17 00:00:00 2001 From: Walter0o Date: Sun, 10 Aug 2014 02:17:06 +0200 Subject: [PATCH 62/83] fixes #5934 --- code/game/machinery/computer/message.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm index 60e7ac0484d..120e274e638 100644 --- a/code/game/machinery/computer/message.dm +++ b/code/game/machinery/computer/message.dm @@ -19,7 +19,7 @@ var/noserver = "ALERT: No server detected." var/incorrectkey = "ALERT: Incorrect decryption key!" var/defaultmsg = "Welcome. Please select an option." - var/rebootmsg = "%$&(£: Critical %$$@ Error // !RestArting! - ?pLeaSe wAit!" + var/rebootmsg = "%$&(£: Critical %$$@ Error // !RestArting! - ?pLeaSe wAit!" //Computer properties var/screen = 0 // 0 = Main menu, 1 = Message Logs, 2 = Hacked screen, 3 = Custom Message var/hacking = 0 // Is it being hacked into by the AI/Cyborg @@ -36,6 +36,7 @@ /obj/machinery/computer/message_monitor/attackby(obj/item/weapon/O as obj, mob/living/user as mob) if(stat & (NOPOWER|BROKEN)) + ..() return if(!istype(user)) return @@ -52,7 +53,7 @@ var/obj/item/weapon/paper/monitorkey/MK = new/obj/item/weapon/paper/monitorkey MK.loc = src.loc // Will help make emagging the console not so easy to get away with. - MK.info += "

£%@%(*$%&(£&?*(%&£/{}" + MK.info += "

£%@%(*$%&(£&?*(%&£/{}" spawn(100*length(src.linkedServer.decryptkey)) UnmagConsole() message = rebootmsg else From e7c4f09aad040dc8b294bfbc06c139457452b961 Mon Sep 17 00:00:00 2001 From: Walter0o Date: Sun, 10 Aug 2014 02:47:24 +0200 Subject: [PATCH 63/83] capsaicin and condensedcapsaicin changes turns them into pain dealing reagents instead of burndamage dealing --- code/modules/reagents/Chemistry-Reagents.dm | 65 ++++++++++++++------- 1 file changed, 44 insertions(+), 21 deletions(-) diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 145e3fd44c7..753b9355b79 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -2068,25 +2068,29 @@ datum description = "This is what makes chilis hot." reagent_state = LIQUID color = "#B31008" // rgb: 179, 16, 8 - + on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(!data) data = 1 - switch(data) - if(1 to 15) - M.bodytemperature += 5 * TEMPERATURE_DAMAGE_COEFFICIENT - if(holder.has_reagent("frostoil")) - holder.remove_reagent("frostoil", 5) - if(istype(M, /mob/living/carbon/slime)) - M.bodytemperature += rand(5,20) - if(15 to 25) - M.bodytemperature += 10 * TEMPERATURE_DAMAGE_COEFFICIENT - if(istype(M, /mob/living/carbon/slime)) - M.bodytemperature += rand(10,20) - if(25 to INFINITY) - M.bodytemperature += 15 * TEMPERATURE_DAMAGE_COEFFICIENT - if(istype(M, /mob/living/carbon/slime)) - M.bodytemperature += rand(15,20) + if(!M) + M = holder.my_atom + if(!data) + data = 1 + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(H.species && !(H.species.flags & (NO_PAIN | IS_SYNTHETIC)) ) + switch(data) + if(1 to 2) + H << "\red Your insides feel uncomfortably hot !" + if(2 to 20) + if(prob(5)) + H << "\red Your insides feel uncomfortably hot !" + if(20 to INFINITY) + H.apply_effect(2,AGONY,0) + if(prob(5)) + H.visible_message("[H] [pick("dry heaves!","coughs!","splutters!")]") + H << "\red You feel like your insides are burning !" + else if(istype(M, /mob/living/carbon/slime)) + M.bodytemperature += rand(10,25) + holder.remove_reagent("frostoil", 5) holder.remove_reagent(src.id, FOOD_METABOLISM) data++ ..() @@ -2152,10 +2156,29 @@ datum victim.Weaken(5) //victim.Paralyse(10) //victim.drop_item() + on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(prob(5)) - M.visible_message("[M] [pick("dry heaves!","coughs!","splutters!")]") + if(!M) + M = holder.my_atom + if(!data) + data = 1 + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(H.species && !(H.species.flags & (NO_PAIN | IS_SYNTHETIC)) ) + switch(data) + if(1) + H << "\red You feel like your insides are burning !" + if(2 to INFINITY) + H.apply_effect(4,AGONY,0) + if(prob(5)) + H.visible_message("[H] [pick("dry heaves!","coughs!","splutters!")]") + H << "\red You feel like your insides are burning !" + else if(istype(M, /mob/living/carbon/slime)) + M.bodytemperature += rand(15,30) + holder.remove_reagent("frostoil", 5) + holder.remove_reagent(src.id, FOOD_METABOLISM) + data++ + ..() return frostoil From 29ce255597e8b59f99ca06bc0367384b6e61abdb Mon Sep 17 00:00:00 2001 From: Walter0o Date: Sun, 10 Aug 2014 06:47:28 +0200 Subject: [PATCH 64/83] feedback change on meter improvements thanks @comma --- code/game/machinery/atmoalter/meter.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/atmoalter/meter.dm b/code/game/machinery/atmoalter/meter.dm index 88fa2a07ecc..b7a1236411f 100644 --- a/code/game/machinery/atmoalter/meter.dm +++ b/code/game/machinery/atmoalter/meter.dm @@ -91,7 +91,7 @@ /obj/machinery/meter/Click() if(istype(usr, /mob/living/silicon/ai)) // ghosts can call ..() for examine - usr << examine() + examine() return 1 return ..() From cfa1ff344057712e0ccea68f281363faa33753ce Mon Sep 17 00:00:00 2001 From: Whitellama Date: Sun, 10 Aug 2014 01:00:26 -0700 Subject: [PATCH 65/83] Fixed Dionaea crashing on death --- code/modules/mob/living/carbon/species.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/modules/mob/living/carbon/species.dm b/code/modules/mob/living/carbon/species.dm index 59c02ab2f7e..286bffb3a0f 100644 --- a/code/modules/mob/living/carbon/species.dm +++ b/code/modules/mob/living/carbon/species.dm @@ -291,7 +291,6 @@ if(H.mind) H.mind.transfer_to(S) - S.key = H for(var/mob/living/carbon/monkey/diona/D in H.contents) if(D.client) From 49c8c6f2cb699d4004f78ee2a078e780fc3bda5a Mon Sep 17 00:00:00 2001 From: Whitellama Date: Sun, 10 Aug 2014 02:23:36 -0700 Subject: [PATCH 66/83] Made arcane tomes a subtype of books, fixes #5838 --- code/datums/mind.dm | 4 +- code/game/gamemodes/cult/cult_items.dm | 7 +-- code/game/gamemodes/cult/ritual.dm | 16 ++--- code/game/gamemodes/cult/runes.dm | 4 +- code/modules/admin/verbs/debug.dm | 2 +- code/modules/library/lib_machines.dm | 41 +++++++------ code/modules/mob/dead/observer/observer.dm | 68 +++++++++++----------- 7 files changed, 73 insertions(+), 69 deletions(-) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 936eea26d1c..111c93d9d74 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -668,7 +668,7 @@ datum/mind if("tome") var/mob/living/carbon/human/H = current if (istype(H)) - var/obj/item/weapon/tome/T = new(H) + var/obj/item/weapon/book/tome/T = new(H) var/list/slots = list ( "backpack" = slot_in_backpack, @@ -1136,7 +1136,7 @@ datum/mind var/mob/living/carbon/human/H = current if (istype(H)) - var/obj/item/weapon/tome/T = new(H) + var/obj/item/weapon/book/tome/T = new(H) var/list/slots = list ( "backpack" = slot_in_backpack, diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index d55417c5f5e..29177888154 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -56,7 +56,7 @@ item_state = "cultrobes" flags = FPRINT | TABLEPASS body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS - allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade) + allowed = list(/obj/item/weapon/book/tome,/obj/item/weapon/melee/cultblade) armor = list(melee = 50, bullet = 30, laser = 50,energy = 20, bomb = 25, bio = 10, rad = 0) flags_inv = HIDEJUMPSUIT siemens_coefficient = 0 @@ -78,12 +78,11 @@ item_state = "magusred" flags = FPRINT | TABLEPASS body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS - allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade) + allowed = list(/obj/item/weapon/book/tome,/obj/item/weapon/melee/cultblade) armor = list(melee = 50, bullet = 30, laser = 50,energy = 20, bomb = 25, bio = 10, rad = 0) flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT siemens_coefficient = 0 - /obj/item/clothing/head/helmet/space/cult name = "cult helmet" desc = "A space worthy helmet used by the followers of Nar-Sie" @@ -98,7 +97,7 @@ item_state = "cult_armour" desc = "A bulky suit of armour, bristling with spikes. It looks space proof." w_class = 3 - allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade,/obj/item/weapon/tank/emergency_oxygen,/obj/item/device/suit_cooling_unit) + allowed = list(/obj/item/weapon/book/tome,/obj/item/weapon/melee/cultblade,/obj/item/weapon/tank/emergency_oxygen,/obj/item/device/suit_cooling_unit) slowdown = 1 armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30) siemens_coefficient = 0 \ No newline at end of file diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index 24f3ba27c72..e60795f5fd9 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -91,7 +91,7 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", attackby(I as obj, user as mob) - if(istype(I, /obj/item/weapon/tome) && iscultist(user)) + if(istype(I, /obj/item/weapon/book/tome) && iscultist(user)) user << "You retrace your steps, carefully undoing the lines of the rune." del(src) return @@ -178,13 +178,15 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", check_icon() icon = get_uristrune_cult(word1, word2, word3) -/obj/item/weapon/tome +/obj/item/weapon/book/tome name = "arcane tome" + icon = 'icons/obj/weapons.dmi' icon_state ="tome" throw_speed = 1 throw_range = 5 w_class = 2.0 flags = FPRINT | TABLEPASS + unique = 1 var/notedat = "" var/tomedat = "" var/list/words = list("ire" = "ire", "ego" = "ego", "nahlizet" = "nahlizet", "certum" = "certum", "veri" = "veri", "jatkaa" = "jatkaa", "balaq" = "balaq", "mgar" = "mgar", "karazet" = "karazet", "geeri" = "geeri") @@ -313,7 +315,7 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", [words[10]] is [words[words[10]]] Clear
"} usr << browse("[notedat]", "window=notes") -// call(/obj/item/weapon/tome/proc/edit_notes)() +// call(/obj/item/weapon/book/tome/proc/edit_notes)() else usr << browse(null, "window=notes") return @@ -408,7 +410,7 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", [words[9]] is [words[words[9]]] Clear
[words[10]] is [words[words[10]]] Clear
"} -// call(/obj/item/weapon/tome/proc/edit_notes)() +// call(/obj/item/weapon/book/tome/proc/edit_notes)() user << browse("[notedat]", "window=notes") return if(usr.get_active_hand() != src) @@ -493,8 +495,8 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", user << "The book seems full of illegible scribbles. Is this a joke?" return - attackby(obj/item/weapon/tome/T as obj, mob/living/user as mob) - if(istype(T, /obj/item/weapon/tome)) // sanity check to prevent a runtime error + attackby(obj/item/weapon/book/tome/T as obj, mob/living/user as mob) + if(istype(T, /obj/item/weapon/book/tome)) // sanity check to prevent a runtime error switch(alert("Copy the runes from your tome?",,"Copy", "Cancel")) if("cancel") return @@ -515,7 +517,7 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", else usr << "The scriptures of Nar-Sie, The One Who Sees, The Geometer of Blood. Contains the details of every ritual his followers could think of. Most of these are useless, though." -/obj/item/weapon/tome/imbued //admin tome, spawns working runes without waiting +/obj/item/weapon/book/tome/imbued //admin tome, spawns working runes without waiting w_class = 2.0 var/cultistsonly = 1 attack_self(mob/user as mob) diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index 3da1dd8d25a..1fbc0d6f987 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -87,9 +87,9 @@ var/list/sacrificed = list() "\red You are blinded by the flash of red light! After you're able to see again, you see that now instead of the rune there's a book.", \ "\red You hear a pop and smell ozone.") if(istype(src,/obj/effect/rune)) - new /obj/item/weapon/tome(src.loc) + new /obj/item/weapon/book/tome(src.loc) else - new /obj/item/weapon/tome(usr.loc) + new /obj/item/weapon/book/tome(usr.loc) del(src) return diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index d2a53f0aff1..b1aaf5567be 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -310,7 +310,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that else if(alert("Spawn that person a tome?",,"Yes","No")=="Yes") M << "\red You catch a glimpse of the Realm of Nar-Sie, The Geometer of Blood. You now see how flimsy the world is, you see that it should be open to the knowledge of Nar-Sie. A tome, a message from your new master, appears on the ground." - new /obj/item/weapon/tome(M.loc) + new /obj/item/weapon/book/tome(M.loc) else M << "\red You catch a glimpse of the Realm of Nar-Sie, The Geometer of Blood. You now see how flimsy the world is, you see that it should be open to the knowledge of Nar-Sie." var/glimpse=pick("1","2","3","4","5","6","7","8") diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index d93348d6bd0..d1561da59da 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -147,7 +147,7 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f if(src.emagged) dat += "7. Access the Forbidden Lore Vault
" if(src.arcanecheckout) - new /obj/item/weapon/tome(src.loc) + new /obj/item/weapon/book/tome(src.loc) user << "Your sanity barely endures the seconds spent in the vault's browsing window. The only thing to remind you of this when you stop browsing is a dusty old tome sitting on the desk. You don't really remember printing it." user.visible_message("[user] stares at the blank screen for a few moments, his expression frozen in fear. When he finally awakens from it, he looks a lot older.", 2) src.arcanecheckout = 0 @@ -329,26 +329,29 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f if(scanner.cache) var/choice = input("Are you certain you wish to upload this title to the Archive?") in list("Confirm", "Abort") if(choice == "Confirm") - establish_old_db_connection() - if(!dbcon_old.IsConnected()) - alert("Connection to Archive has been severed. Aborting.") + if(scanner.cache.unique) + alert("This book has been rejected from the database. Aborting!") else - /* - var/sqltitle = dbcon.Quote(scanner.cache.name) - var/sqlauthor = dbcon.Quote(scanner.cache.author) - var/sqlcontent = dbcon.Quote(scanner.cache.dat) - var/sqlcategory = dbcon.Quote(upload_category) - */ - var/sqltitle = sanitizeSQL(scanner.cache.name) - var/sqlauthor = sanitizeSQL(scanner.cache.author) - var/sqlcontent = sanitizeSQL(scanner.cache.dat) - var/sqlcategory = sanitizeSQL(upload_category) - var/DBQuery/query = dbcon_old.NewQuery("INSERT INTO library (author, title, content, category) VALUES ('[sqlauthor]', '[sqltitle]', '[sqlcontent]', '[sqlcategory]')") - if(!query.Execute()) - usr << query.ErrorMsg() + establish_old_db_connection() + if(!dbcon_old.IsConnected()) + alert("Connection to Archive has been severed. Aborting.") else - log_game("[usr.name]/[usr.key] has uploaded the book titled [scanner.cache.name], [length(scanner.cache.dat)] signs") - alert("Upload Complete.") + /* + var/sqltitle = dbcon.Quote(scanner.cache.name) + var/sqlauthor = dbcon.Quote(scanner.cache.author) + var/sqlcontent = dbcon.Quote(scanner.cache.dat) + var/sqlcategory = dbcon.Quote(upload_category) + */ + var/sqltitle = sanitizeSQL(scanner.cache.name) + var/sqlauthor = sanitizeSQL(scanner.cache.author) + var/sqlcontent = sanitizeSQL(scanner.cache.dat) + var/sqlcategory = sanitizeSQL(upload_category) + var/DBQuery/query = dbcon_old.NewQuery("INSERT INTO library (author, title, content, category) VALUES ('[sqlauthor]', '[sqltitle]', '[sqlcontent]', '[sqlcategory]')") + if(!query.Execute()) + usr << query.ErrorMsg() + else + log_game("[usr.name]/[usr.key] has uploaded the book titled [scanner.cache.name], [length(scanner.cache.dat)] signs") + alert("Upload Complete.") if(href_list["targetid"]) var/sqlid = sanitizeSQL(href_list["targetid"]) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 13cc1933e23..12fea0ca244 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -69,17 +69,17 @@ ..() - -/mob/dead/observer/Topic(href, href_list) - if (href_list["track"]) - var/mob/target = locate(href_list["track"]) in mob_list - if(target) - ManualFollow(target) - - - + +/mob/dead/observer/Topic(href, href_list) + if (href_list["track"]) + var/mob/target = locate(href_list["track"]) in mob_list + if(target) + ManualFollow(target) + + + /mob/dead/attackby(obj/item/W, mob/user) - if(istype(W,/obj/item/weapon/tome)) + if(istype(W,/obj/item/weapon/book/tome)) var/mob/dead/M = src if(src.invisibility != 0) M.invisibility = 0 @@ -111,7 +111,7 @@ Works together with spawning an observer, noted above. for(var/image/hud in client.images) if(copytext(hud.icon_state,1,4) == "hud") client.images.Remove(hud) - + if(antagHUD) var/list/target_list = list() for(var/mob/living/target in oview(src, 14)) @@ -123,19 +123,19 @@ Works together with spawning an observer, noted above. process_medHUD(src) -/mob/dead/proc/process_medHUD(var/mob/M) - var/client/C = M.client - for(var/mob/living/carbon/human/patient in oview(M, 14)) - C.images += patient.hud_list[HEALTH_HUD] - C.images += patient.hud_list[STATUS_HUD_OOC] - -/mob/dead/proc/assess_targets(list/target_list, mob/dead/observer/U) - var/client/C = U.client - for(var/mob/living/carbon/human/target in target_list) - C.images += target.hud_list[SPECIALROLE_HUD] - - -/* +/mob/dead/proc/process_medHUD(var/mob/M) + var/client/C = M.client + for(var/mob/living/carbon/human/patient in oview(M, 14)) + C.images += patient.hud_list[HEALTH_HUD] + C.images += patient.hud_list[STATUS_HUD_OOC] + +/mob/dead/proc/assess_targets(list/target_list, mob/dead/observer/U) + var/client/C = U.client + for(var/mob/living/carbon/human/target in target_list) + C.images += target.hud_list[SPECIALROLE_HUD] + + +/* else//If the silicon mob has no law datum, no inherent laws, or a law zero, add them to the hud. var/mob/living/silicon/silicon_target = target if(!silicon_target.laws||(silicon_target.laws&&(silicon_target.laws.zeroth||!silicon_target.laws.inherent.len))||silicon_target.mind.special_role=="traitor") @@ -143,9 +143,9 @@ Works together with spawning an observer, noted above. U.client.images += image(tempHud,silicon_target,"hudmalborg") else U.client.images += image(tempHud,silicon_target,"hudmalai") -*/ - return 1 - +*/ + return 1 + /mob/proc/ghostize(var/can_reenter_corpse = 1) if(key) var/mob/dead/observer/ghost = new(src) //Transfer safety to observer spawning proc. @@ -256,10 +256,10 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp set category = "Ghost" set name = "Toggle AntagHUD" set desc = "Toggles AntagHUD allowing you to see who is the antagonist" - - if(!client) - return - var/mentor = is_mentor(usr.client) + + if(!client) + return + var/mentor = is_mentor(usr.client) if(!config.antag_hud_allowed && (!client.holder || mentor)) src << "\red Admins have disabled this for this round." return @@ -387,9 +387,9 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp /mob/dead/observer/verb/analyze_air() set name = "Analyze Air" set category = "Ghost" - + if(!istype(usr, /mob/dead/observer)) return - + // Shamelessly copied from the Gas Analyzers if (!( istype(usr.loc, /turf) )) return @@ -572,4 +572,4 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp W.update_icon() W.message = message W.add_hiddenprint(src) - W.visible_message("\red Invisible fingers crudely paint something in blood on [T]...") + W.visible_message("\red Invisible fingers crudely paint something in blood on [T]...") From c87ad570f887c48f73856b765d034b6a0b67cbff Mon Sep 17 00:00:00 2001 From: Whitellama Date: Sun, 10 Aug 2014 12:50:53 -0700 Subject: [PATCH 67/83] Cult tomes can't be destroyed with ethanol --- code/modules/reagents/Chemistry-Reagents.dm | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 145e3fd44c7..5a6e7d1d0fa 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -842,18 +842,18 @@ datum description = "Sterilizes wounds in preparation for surgery." reagent_state = LIQUID color = "#C8A5DC" // rgb: 200, 165, 220 - + //makes you squeaky clean reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) if (method == TOUCH) M.germ_level -= min(volume*20, M.germ_level) - + reaction_obj(var/obj/O, var/volume) O.germ_level -= min(volume*20, O.germ_level) - + reaction_turf(var/turf/T, var/volume) T.germ_level -= min(volume*20, T.germ_level) - + /* reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) src = null if (method==TOUCH) @@ -1332,7 +1332,7 @@ datum if(!M) M = holder.my_atom if(ishuman(M)) var/mob/living/carbon/human/H = M - + //Peridaxon is hard enough to get, it's probably fair to make this all internal organs for(var/datum/organ/internal/I in H.internal_organs) if(I.damage > 0) @@ -3050,6 +3050,9 @@ datum paperaffected.clearpaper() usr << "The solution dissolves the ink on the paper." if(istype(O,/obj/item/weapon/book)) + if(istype(O,/obj/item/weapon/book/tome)) + usr << "The solution does nothing. Whatever this is, it isn't normal ink." + return if(volume >= 5) var/obj/item/weapon/book/affectedbook = O affectedbook.dat = null From 3a7fa00ba3c23e401a0e560e0f3f7c54f3e3cc8a Mon Sep 17 00:00:00 2001 From: Whitellama Date: Sun, 10 Aug 2014 15:27:23 -0700 Subject: [PATCH 68/83] Updated the changelog. --- html/changelog.html | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/html/changelog.html b/html/changelog.html index 0f0f300b5c3..beab3d10aee 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -113,6 +113,16 @@ should be listed in the changelog upon commit though. Thanks. --> +
+

2 August 2014

+

Whitellama updated:

+
    +
  • Arcane tomes can now be stored on bookshelves.
  • +
  • Dionaea players no longer crash on death, and now properly nymphs properly.
  • +
+
+ +

1 July 2014

Mloc updated:

From 84823145417e433a846553130d2c0b3212b84bbb Mon Sep 17 00:00:00 2001 From: mwerezak Date: Sun, 10 Aug 2014 18:37:39 -0400 Subject: [PATCH 69/83] Fixes runtime in train/explode() --- code/modules/vehicles/train.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/vehicles/train.dm b/code/modules/vehicles/train.dm index b7e70f039fa..d8e372d8189 100644 --- a/code/modules/vehicles/train.dm +++ b/code/modules/vehicles/train.dm @@ -62,7 +62,8 @@ // Vehicle procs //------------------------------------------- /obj/vehicle/train/explode() - tow.unattach() + if (tow) + tow.unattach() unattach() ..() From 756b220bf3c05d4e16475e628d2a8057cf17c2e8 Mon Sep 17 00:00:00 2001 From: Ccomp5950 Date: Sun, 10 Aug 2014 18:26:58 -0500 Subject: [PATCH 70/83] Summon cultist and free cultists runes now give cultists less damage Damage scales downward with each additional cultists around the rune. No more automatic 15 damage for freedom then 25 for summoning even if you have 8 cultists helping with the ritual. --- code/game/gamemodes/cult/runes.dm | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index 3da1dd8d25a..74bd92e1c5d 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -775,6 +775,7 @@ var/list/sacrificed = list() for(var/mob/living/carbon/C in orange(1,src)) if(iscultist(C) && !C.stat) users+=C + var/dam = round(15 / users.len) if(users.len>=3) var/mob/living/carbon/cultist = input("Choose the one who you want to free", "Followers of Geometer") as null|anything in (cultists - users) if(!cultist) @@ -804,7 +805,7 @@ var/list/sacrificed = list() if(istype(cultist.loc, /obj/machinery/dna_scannernew)&&cultist.loc:locked) cultist.loc:locked = 0 for(var/mob/living/carbon/C in users) - user.take_overall_damage(15, 0) + user.take_overall_damage(dam, 0) C.say("Khari[pick("'","`")]d! Gual'te nikka!") del(src) return fizzle() @@ -820,7 +821,7 @@ var/list/sacrificed = list() var/list/mob/living/carbon/users = new for(var/mob/living/carbon/C in orange(1,src)) if(iscultist(C) && !C.stat) - users+=C + users += C if(users.len>=3) var/mob/living/carbon/cultist = input("Choose the one who you want to summon", "Followers of Geometer") as null|anything in (cultists - user) if(!cultist) @@ -833,10 +834,16 @@ var/list/sacrificed = list() cultist.loc = src.loc cultist.lying = 1 cultist.regenerate_icons() - for(var/mob/living/carbon/human/C in orange(1,src)) + + var/dam = round(25 / (users.len/2)) //More people around the rune less damage everyone takes. Minimum is 3 cultists + + for(var/mob/living/carbon/human/C in users) if(iscultist(C) && !C.stat) C.say("N'ath reth sh'yro eth d[pick("'","`")]rekkathnor!") - C.take_overall_damage(25, 0) + C.take_overall_damage(dam, 0) + if(users.len <= 4) // You did the minimum, this is going to hurt more and we're going to stun you. + C.apply_effect(rand(3,6), STUN) + C.apply_effect(1, WEAKEN) user.visible_message("\red Rune disappears with a flash of red light, and in its place now a body lies.", \ "\red You are blinded by the flash of red light! After you're able to see again, you see that now instead of the rune there's a body.", \ "\red You hear a pop and smell ozone.") From dddaab172cdafbfad84145fa3ecfcb321cf6e9c2 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Mon, 11 Aug 2014 04:35:45 +0400 Subject: [PATCH 71/83] Made missing limbs not process. Moved code in processing so that ORGAN_DESTROYED limbs won't process wounds and chemicals. They still need to process once to actually fall off (too lazy to change that) Made dropping limbs remove all wounds and germs. Instead, one big wound is spawned on parent organ. Damage depends on the organ. Removed missing limbs bleeding on their own, since that's what that wound is for now. They still would ache until surgically mended anyway. Fixed possible issue with amputation not fixing the rotten limb. --- code/modules/organs/blood.dm | 2 -- code/modules/organs/organ_external.dm | 46 +++++++++++++++++---------- 2 files changed, 30 insertions(+), 18 deletions(-) diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm index 1459098db71..8933427f738 100644 --- a/code/modules/organs/blood.dm +++ b/code/modules/organs/blood.dm @@ -128,8 +128,6 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 continue for(var/datum/wound/W in temp.wounds) if(W.bleeding()) blood_max += W.damage / 4 - if(temp.status & ORGAN_DESTROYED && !(temp.status & ORGAN_GAUZED) && !temp.amputated) - blood_max += 20 //Yer missing a fucking limb. if (temp.open) blood_max += 2 //Yer stomach is cut open drip(blood_max) diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index d1bf4f170de..a3b259e3a61 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -155,14 +155,14 @@ // sync the organ's damage with its wounds src.update_damages() - + //If limb took enough damage, try to cut or tear it off if(body_part != UPPER_TORSO && body_part != LOWER_TORSO) //as hilarious as it is, getting hit on the chest too much shouldn't effectively gib you. if(config.limbs_can_break && brute_dam >= max_damage * config.organ_health_multiplier) if( (edge && prob(5 * brute)) || (brute > 20 && prob(2 * brute)) ) droplimb(1) return - + owner.updatehealth() var/result = update_icon() @@ -291,6 +291,8 @@ This function completely restores a damaged organ to perfect condition. //Determines if we even need to process this organ. /datum/organ/external/proc/need_process() + if(destspawn) //Missing limb is missing + return 0 if(status && status != ORGAN_ROBOT) // If it's robotic, that's fine it will have a status. return 1 if(brute_dam || burn_dam) @@ -305,17 +307,6 @@ This function completely restores a damaged organ to perfect condition. return 0 /datum/organ/external/process() - // Process wounds, doing healing etc. Only do this every few ticks to save processing power - if(owner.life_tick % wound_update_accuracy == 0) - update_wounds() - - //Chem traces slowly vanish - if(owner.life_tick % 10 == 0) - for(var/chemID in trace_chemicals) - trace_chemicals[chemID] = trace_chemicals[chemID] - 1 - if(trace_chemicals[chemID] <= 0) - trace_chemicals.Remove(chemID) - //Dismemberment if(status & ORGAN_DESTROYED) if(!destspawn && config.limbs_can_break) @@ -327,6 +318,17 @@ This function completely restores a damaged organ to perfect condition. owner.update_body(1) return + // Process wounds, doing healing etc. Only do this every few ticks to save processing power + if(owner.life_tick % wound_update_accuracy == 0) + update_wounds() + + //Chem traces slowly vanish + if(owner.life_tick % 10 == 0) + for(var/chemID in trace_chemicals) + trace_chemicals[chemID] = trace_chemicals[chemID] - 1 + if(trace_chemicals[chemID] <= 0) + trace_chemicals.Remove(chemID) + //Bone fracurtes if(config.bones_can_break && brute_dam > min_broken_damage * config.organ_health_multiplier && !(status & ORGAN_ROBOT)) src.fracture() @@ -585,13 +587,25 @@ Note that amputating the affected organ does in fact remove the infection from t src.status &= ~ORGAN_BROKEN src.status &= ~ORGAN_BLEEDING src.status &= ~ORGAN_SPLINTED + src.status &= ~ORGAN_DEAD for(var/implant in implants) del(implant) + germ_level = 0 + + //Replace all wounds on that arm with one wound on parent organ. + wounds.Cut() + if (parent) + var/wound_type = get_wound_type(CUT, max_damage) + if(wound_type) + var/datum/wound/W = new wound_type(max_damage) + parent.wounds += W + parent.update_damages() + update_damages() + // If any organs are attached to this, destroy them - for(var/datum/organ/external/O in owner.organs) - if(O.parent == src) - O.droplimb(1) + for(var/datum/organ/external/O in children) + O.droplimb(1) var/obj/organ //Dropped limb object switch(body_part) From 54ec5f0233dc0c68ecf7a7c9fb877031075289b4 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Mon, 11 Aug 2014 11:42:16 +0930 Subject: [PATCH 72/83] Attempting to fix a very weird overlay error, refactoring some shit mining code. --- code/modules/mining/drilling/distribution.dm | 6 +- code/modules/mining/mine_turfs.dm | 709 +++++++++---------- icons/turf/floors.dmi | Bin 311042 -> 311036 bytes 3 files changed, 322 insertions(+), 393 deletions(-) diff --git a/code/modules/mining/drilling/distribution.dm b/code/modules/mining/drilling/distribution.dm index bf32d417cd0..e935f55e52a 100644 --- a/code/modules/mining/drilling/distribution.dm +++ b/code/modules/mining/drilling/distribution.dm @@ -162,8 +162,12 @@ Deep minerals: target_turf = locate(tx+j, ty+i, asteroid_z) - if(target_turf && target_turf.has_resources) + //Very shitty fix for the asteroid turf overlays being screwy. + if(target_turf && istype(target_turf,/turf/simulated/floor/plating/airless/asteroid)) + var/turf/simulated/floor/plating/airless/asteroid/T = target_turf + T.updateMineralOverlays() + if(target_turf && target_turf.has_resources) target_turf.resources = list() target_turf.resources["silicates"] = rand(3,5) target_turf.resources["carbonaceous rock"] = rand(3,5) diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index 207b331535f..0f5a8aba3ab 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -26,352 +26,325 @@ has_resources = 1 - New() - . = ..() +/turf/simulated/mineral/New() + . = ..() + MineralSpread() - MineralSpread() - - spawn(1) - var/turf/T - if((istype(get_step(src, NORTH), /turf/simulated/floor)) || (istype(get_step(src, NORTH), /turf/space)) || (istype(get_step(src, NORTH), /turf/simulated/shuttle/floor))) - T = get_step(src, NORTH) - if (T) - T.overlays += image('icons/turf/walls.dmi', "rock_side_s", layer=2) - if((istype(get_step(src, SOUTH), /turf/simulated/floor)) || (istype(get_step(src, SOUTH), /turf/space)) || (istype(get_step(src, SOUTH), /turf/simulated/shuttle/floor))) - T = get_step(src, SOUTH) - if (T) - T.overlays += image('icons/turf/walls.dmi', "rock_side_n", layer=2) - if((istype(get_step(src, EAST), /turf/simulated/floor)) || (istype(get_step(src, EAST), /turf/space)) || (istype(get_step(src, EAST), /turf/simulated/shuttle/floor))) - T = get_step(src, EAST) - if (T) - T.overlays += image('icons/turf/walls.dmi', "rock_side_w", layer=2) - if((istype(get_step(src, WEST), /turf/simulated/floor)) || (istype(get_step(src, WEST), /turf/space)) || (istype(get_step(src, WEST), /turf/simulated/shuttle/floor))) - T = get_step(src, WEST) - if (T) - T.overlays += image('icons/turf/walls.dmi', "rock_side_e", layer=2) - - - ex_act(severity) - switch(severity) - if(2.0) - if (prob(70)) - mined_ore = 1 //some of the stuff gets blown up - GetDrilled() - if(1.0) - mined_ore = 2 //some of the stuff gets blown up +/turf/simulated/mineral/ex_act(severity) + switch(severity) + if(2.0) + if (prob(70)) + mined_ore = 1 //some of the stuff gets blown up GetDrilled() + if(1.0) + mined_ore = 2 //some of the stuff gets blown up + GetDrilled() + +/turf/simulated/mineral/Bumped(AM) + . = ..() + if(istype(AM,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = AM + if((istype(H.l_hand,/obj/item/weapon/pickaxe)) && (!H.hand)) + attackby(H.l_hand,H) + else if((istype(H.r_hand,/obj/item/weapon/pickaxe)) && H.hand) + attackby(H.r_hand,H) + + else if(istype(AM,/mob/living/silicon/robot)) + var/mob/living/silicon/robot/R = AM + if(istype(R.module_active,/obj/item/weapon/pickaxe)) + attackby(R.module_active,R) + + else if(istype(AM,/obj/mecha)) + var/obj/mecha/M = AM + if(istype(M.selected,/obj/item/mecha_parts/mecha_equipment/tool/drill)) + M.selected.action(src) + +/turf/simulated/mineral/proc/MineralSpread() + if(mineral && mineral.spread) + for(var/trydir in cardinal) + if(prob(mineral.spread_chance)) + var/turf/simulated/mineral/random/target_turf = get_step(src, trydir) + if(istype(target_turf) && !target_turf.mineral) + target_turf.mineral = mineral + target_turf.UpdateMineral() + target_turf.MineralSpread() - Bumped(AM) - . = ..() - if(istype(AM,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = AM - if((istype(H.l_hand,/obj/item/weapon/pickaxe)) && (!H.hand)) - attackby(H.l_hand,H) - else if((istype(H.r_hand,/obj/item/weapon/pickaxe)) && H.hand) - attackby(H.r_hand,H) +/turf/simulated/mineral/proc/UpdateMineral() + if(!mineral) + name = "\improper Rock" + icon_state = "rock" + return + name = "\improper [mineral.display_name] deposit" + overlays.Cut() + overlays += "rock_[mineral.name]" - else if(istype(AM,/mob/living/silicon/robot)) - var/mob/living/silicon/robot/R = AM - if(istype(R.module_active,/obj/item/weapon/pickaxe)) - attackby(R.module_active,R) +//Not even going to touch this pile of spaghetti +/turf/simulated/mineral/attackby(obj/item/weapon/W as obj, mob/user as mob) - else if(istype(AM,/obj/mecha)) - var/obj/mecha/M = AM - if(istype(M.selected,/obj/item/mecha_parts/mecha_equipment/tool/drill)) - M.selected.action(src) + if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") + usr << "\red You don't have the dexterity to do this!" + return + if (istype(W, /obj/item/device/core_sampler)) + geologic_data.UpdateNearbyArtifactInfo(src) + var/obj/item/device/core_sampler/C = W + C.sample_item(src, user) + return - proc/MineralSpread() - if(mineral && mineral.spread) - for(var/trydir in cardinal) - if(prob(mineral.spread_chance)) - var/turf/simulated/mineral/random/target_turf = get_step(src, trydir) - if(istype(target_turf) && !target_turf.mineral) - target_turf.mineral = mineral - target_turf.UpdateMineral() - target_turf.MineralSpread() + if (istype(W, /obj/item/device/depth_scanner)) + var/obj/item/device/depth_scanner/C = W + C.scan_atom(user, src) + return + if (istype(W, /obj/item/device/measuring_tape)) + var/obj/item/device/measuring_tape/P = W + user.visible_message("\blue[user] extends [P] towards [src].","\blue You extend [P] towards [src].") + if(do_after(user,25)) + user << "\blue \icon[P] [src] has been excavated to a depth of [2*excavation_level]cm." + return - proc/UpdateMineral() - if(!mineral) - name = "\improper Rock" - icon_state = "rock" - return - name = "\improper [mineral.display_name] deposit" - overlays.Cut() - overlays += "rock_[mineral.name]" - - - //Not even going to touch this pile of spaghetti - attackby(obj/item/weapon/W as obj, mob/user as mob) - - if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") - usr << "\red You don't have the dexterity to do this!" + if (istype(W, /obj/item/weapon/pickaxe)) + var/turf/T = user.loc + if (!( istype(T, /turf) )) return - if (istype(W, /obj/item/device/core_sampler)) - geologic_data.UpdateNearbyArtifactInfo(src) - var/obj/item/device/core_sampler/C = W - C.sample_item(src, user) + var/obj/item/weapon/pickaxe/P = W + if(last_act + P.digspeed > world.time)//prevents message spam return + last_act = world.time - if (istype(W, /obj/item/device/depth_scanner)) - var/obj/item/device/depth_scanner/C = W - C.scan_atom(user, src) - return + playsound(user, P.drill_sound, 20, 1) - if (istype(W, /obj/item/device/measuring_tape)) - var/obj/item/device/measuring_tape/P = W - user.visible_message("\blue[user] extends [P] towards [src].","\blue You extend [P] towards [src].") - if(do_after(user,25)) - user << "\blue \icon[P] [src] has been excavated to a depth of [2*excavation_level]cm." - return + //handle any archaeological finds we might uncover + var/fail_message + if(finds && finds.len) + var/datum/find/F = finds[1] + if(excavation_level + P.excavation_amount > F.excavation_required) + //Chance to destroy / extract any finds here + fail_message = ", [pick("there is a crunching noise","[W] collides with some different rock","part of the rock face crumbles away","something breaks under [W]")]" - if (istype(W, /obj/item/weapon/pickaxe)) - var/turf/T = user.loc - if (!( istype(T, /turf) )) - return + user << "\red You start [P.drill_verb][fail_message ? fail_message : ""]." - var/obj/item/weapon/pickaxe/P = W - if(last_act + P.digspeed > world.time)//prevents message spam - return - last_act = world.time + if(fail_message && prob(90)) + if(prob(25)) + excavate_find(5, finds[1]) + else if(prob(50)) + finds.Remove(finds[1]) + if(prob(50)) + artifact_debris() - playsound(user, P.drill_sound, 20, 1) + if(do_after(user,P.digspeed)) + user << "\blue You finish [P.drill_verb] the rock." - //handle any archaeological finds we might uncover - var/fail_message if(finds && finds.len) var/datum/find/F = finds[1] - if(excavation_level + P.excavation_amount > F.excavation_required) - //Chance to destroy / extract any finds here - fail_message = ", [pick("there is a crunching noise","[W] collides with some different rock","part of the rock face crumbles away","something breaks under [W]")]" - - user << "\red You start [P.drill_verb][fail_message ? fail_message : ""]." - - if(fail_message && prob(90)) - if(prob(25)) - excavate_find(5, finds[1]) - else if(prob(50)) - finds.Remove(finds[1]) - if(prob(50)) - artifact_debris() - - if(do_after(user,P.digspeed)) - user << "\blue You finish [P.drill_verb] the rock." - - if(finds && finds.len) - var/datum/find/F = finds[1] - if(round(excavation_level + P.excavation_amount) == F.excavation_required) - //Chance to extract any items here perfectly, otherwise just pull them out along with the rock surrounding them - if(excavation_level + P.excavation_amount > F.excavation_required) - //if you can get slightly over, perfect extraction - excavate_find(100, F) - else - excavate_find(80, F) - - else if(excavation_level + P.excavation_amount > F.excavation_required - F.clearance_range) - //just pull the surrounding rock out - excavate_find(0, F) - - if( excavation_level + P.excavation_amount >= 100 ) - //if players have been excavating this turf, leave some rocky debris behind - var/obj/structure/boulder/B - if(artifact_find) - if( excavation_level > 0 || prob(15) ) - //boulder with an artifact inside - B = new(src) - if(artifact_find) - B.artifact_find = artifact_find - else - artifact_debris(1) - else if(prob(15)) - //empty boulder - B = new(src) - - if(B) - GetDrilled(0) + if(round(excavation_level + P.excavation_amount) == F.excavation_required) + //Chance to extract any items here perfectly, otherwise just pull them out along with the rock surrounding them + if(excavation_level + P.excavation_amount > F.excavation_required) + //if you can get slightly over, perfect extraction + excavate_find(100, F) else - GetDrilled(1) - return + excavate_find(80, F) - excavation_level += P.excavation_amount + else if(excavation_level + P.excavation_amount > F.excavation_required - F.clearance_range) + //just pull the surrounding rock out + excavate_find(0, F) - //archaeo overlays - if(!archaeo_overlay && finds && finds.len) - var/datum/find/F = finds[1] - if(F.excavation_required <= excavation_level + F.view_range) - archaeo_overlay = "overlay_archaeo[rand(1,3)]" - overlays += archaeo_overlay + if( excavation_level + P.excavation_amount >= 100 ) + //if players have been excavating this turf, leave some rocky debris behind + var/obj/structure/boulder/B + if(artifact_find) + if( excavation_level > 0 || prob(15) ) + //boulder with an artifact inside + B = new(src) + if(artifact_find) + B.artifact_find = artifact_find + else + artifact_debris(1) + else if(prob(15)) + //empty boulder + B = new(src) - //there's got to be a better way to do this - var/update_excav_overlay = 0 - if(excavation_level >= 75) - if(excavation_level - P.excavation_amount < 75) - update_excav_overlay = 1 - else if(excavation_level >= 50) - if(excavation_level - P.excavation_amount < 50) - update_excav_overlay = 1 - else if(excavation_level >= 25) - if(excavation_level - P.excavation_amount < 25) - update_excav_overlay = 1 - - //update overlays displaying excavation level - if( !(excav_overlay && excavation_level > 0) || update_excav_overlay ) - var/excav_quadrant = round(excavation_level / 25) + 1 - excav_overlay = "overlay_excv[excav_quadrant]_[rand(1,3)]" - overlays += excav_overlay - - /* Nope. - //extract pesky minerals while we're excavating - while(excavation_minerals.len && excavation_level > excavation_minerals[excavation_minerals.len]) - DropMineral() - pop(excavation_minerals) - mineralAmt-- */ - - //drop some rocks - next_rock += P.excavation_amount * 10 - while(next_rock > 100) - next_rock -= 100 - var/obj/item/weapon/ore/O = new(src) - geologic_data.UpdateNearbyArtifactInfo(src) - O.geologic_data = geologic_data - - else - return attack_hand(user) - - - proc/DropMineral() - if(!mineral) - return - - var/obj/item/weapon/ore/O = new mineral.ore (src) - if(istype(O)) - geologic_data.UpdateNearbyArtifactInfo(src) - O.geologic_data = geologic_data - return O - - - proc/GetDrilled(var/artifact_fail = 0) - //var/destroyed = 0 //used for breaking strange rocks - if (mineral && mineral.result_amount) - - //if the turf has already been excavated, some of it's ore has been removed - for (var/i = 1 to mineral.result_amount - mined_ore) - DropMineral() - - //destroyed artifacts have weird, unpleasant effects - //make sure to destroy them before changing the turf though - if(artifact_find && artifact_fail) - var/pain = 0 - if(prob(50)) - pain = 1 - for(var/mob/living/M in range(src, 200)) - M << "[pick("A high pitched [pick("keening","wailing","whistle")]","A rumbling noise like [pick("thunder","heavy machinery")]")] somehow penetrates your mind before fading away!" - if(pain) - flick("pain",M.pain) - if(prob(50)) - M.adjustBruteLoss(5) + if(B) + GetDrilled(0) else - flick("flash",M.flash) - if(prob(50)) - M.Stun(5) - M.apply_effect(25, IRRADIATE) + GetDrilled(1) + return - var/turf/simulated/floor/plating/airless/asteroid/N = ChangeTurf(/turf/simulated/floor/plating/airless/asteroid) - N.fullUpdateMineralOverlays() + excavation_level += P.excavation_amount - if(rand(1,500) == 1) - visible_message("An old dusty crate was buried within!") - new /obj/structure/closet/crate/secure/loot(src) + //archaeo overlays + if(!archaeo_overlay && finds && finds.len) + var/datum/find/F = finds[1] + if(F.excavation_required <= excavation_level + F.view_range) + archaeo_overlay = "overlay_archaeo[rand(1,3)]" + overlays += archaeo_overlay + + //there's got to be a better way to do this + var/update_excav_overlay = 0 + if(excavation_level >= 75) + if(excavation_level - P.excavation_amount < 75) + update_excav_overlay = 1 + else if(excavation_level >= 50) + if(excavation_level - P.excavation_amount < 50) + update_excav_overlay = 1 + else if(excavation_level >= 25) + if(excavation_level - P.excavation_amount < 25) + update_excav_overlay = 1 + + //update overlays displaying excavation level + if( !(excav_overlay && excavation_level > 0) || update_excav_overlay ) + var/excav_quadrant = round(excavation_level / 25) + 1 + excav_overlay = "overlay_excv[excav_quadrant]_[rand(1,3)]" + overlays += excav_overlay + + /* Nope. + //extract pesky minerals while we're excavating + while(excavation_minerals.len && excavation_level > excavation_minerals[excavation_minerals.len]) + DropMineral() + pop(excavation_minerals) + mineralAmt-- */ + + //drop some rocks + next_rock += P.excavation_amount * 10 + while(next_rock > 100) + next_rock -= 100 + var/obj/item/weapon/ore/O = new(src) + geologic_data.UpdateNearbyArtifactInfo(src) + O.geologic_data = geologic_data + + else + return attack_hand(user) + +/turf/simulated/mineral/proc/DropMineral() + if(!mineral) + return + + var/obj/item/weapon/ore/O = new mineral.ore (src) + if(istype(O)) + geologic_data.UpdateNearbyArtifactInfo(src) + O.geologic_data = geologic_data + return O + +/turf/simulated/mineral/proc/GetDrilled(var/artifact_fail = 0) + //var/destroyed = 0 //used for breaking strange rocks + if (mineral && mineral.result_amount) + + //if the turf has already been excavated, some of it's ore has been removed + for (var/i = 1 to mineral.result_amount - mined_ore) + DropMineral() + + //destroyed artifacts have weird, unpleasant effects + //make sure to destroy them before changing the turf though + if(artifact_find && artifact_fail) + var/pain = 0 + if(prob(50)) + pain = 1 + for(var/mob/living/M in range(src, 200)) + M << "[pick("A high pitched [pick("keening","wailing","whistle")]","A rumbling noise like [pick("thunder","heavy machinery")]")] somehow penetrates your mind before fading away!" + if(pain) + flick("pain",M.pain) + if(prob(50)) + M.adjustBruteLoss(5) + else + flick("flash",M.flash) + if(prob(50)) + M.Stun(5) + M.apply_effect(25, IRRADIATE) + + var/turf/simulated/floor/plating/airless/asteroid/N = ChangeTurf(/turf/simulated/floor/plating/airless/asteroid) + N.updateMineralOverlays(1) + + if(rand(1,500) == 1) + visible_message("An old dusty crate was buried within!") + new /obj/structure/closet/crate/secure/loot(src) - proc/excavate_find(var/prob_clean = 0, var/datum/find/F) - //with skill and luck, players can cleanly extract finds - //otherwise, they come out inside a chunk of rock - var/obj/item/weapon/X - if(prob_clean) - X = new /obj/item/weapon/archaeological_find(src, new_item_type = F.find_type) - else - X = new /obj/item/weapon/ore/strangerock(src, inside_item_type = F.find_type) - geologic_data.UpdateNearbyArtifactInfo(src) - X:geologic_data = geologic_data +/turf/simulated/mineral/proc/excavate_find(var/prob_clean = 0, var/datum/find/F) + //with skill and luck, players can cleanly extract finds + //otherwise, they come out inside a chunk of rock + var/obj/item/weapon/X + if(prob_clean) + X = new /obj/item/weapon/archaeological_find(src, new_item_type = F.find_type) + else + X = new /obj/item/weapon/ore/strangerock(src, inside_item_type = F.find_type) + geologic_data.UpdateNearbyArtifactInfo(src) + X:geologic_data = geologic_data - //some find types delete the /obj/item/weapon/archaeological_find and replace it with something else, this handles when that happens - //yuck - var/display_name = "something" - if(!X) - X = last_find - if(X) - display_name = X.name + //some find types delete the /obj/item/weapon/archaeological_find and replace it with something else, this handles when that happens + //yuck + var/display_name = "something" + if(!X) + X = last_find + if(X) + display_name = X.name - //many finds are ancient and thus very delicate - luckily there is a specialised energy suspension field which protects them when they're being extracted - if(prob(F.prob_delicate)) - var/obj/effect/suspension_field/S = locate() in src - if(!S || S.field_type != get_responsive_reagent(F.find_type)) - if(X) - visible_message("\red[pick("[display_name] crumbles away into dust","[display_name] breaks apart")].") - del(X) + //many finds are ancient and thus very delicate - luckily there is a specialised energy suspension field which protects them when they're being extracted + if(prob(F.prob_delicate)) + var/obj/effect/suspension_field/S = locate() in src + if(!S || S.field_type != get_responsive_reagent(F.find_type)) + if(X) + visible_message("\red[pick("[display_name] crumbles away into dust","[display_name] breaks apart")].") + del(X) - finds.Remove(F) + finds.Remove(F) - proc/artifact_debris(var/severity = 0) - //cael's patented random limited drop componentized loot system! - //sky's patented not-fucking-retarded overhaul! +/turf/simulated/mineral/proc/artifact_debris(var/severity = 0) + //cael's patented random limited drop componentized loot system! + //sky's patented not-fucking-retarded overhaul! - //Give a random amount of loot from 1 to 3 or 5, varying on severity. - for(var/j in 1 to rand(1, 3 + max(min(severity, 1), 0) * 2)) - switch(rand(1,7)) - if(1) - var/obj/item/stack/rods/R = new(src) - R.amount = rand(5,25) + //Give a random amount of loot from 1 to 3 or 5, varying on severity. + for(var/j in 1 to rand(1, 3 + max(min(severity, 1), 0) * 2)) + switch(rand(1,7)) + if(1) + var/obj/item/stack/rods/R = new(src) + R.amount = rand(5,25) - if(2) - var/obj/item/stack/tile/R = new(src) - R.amount = rand(1,5) + if(2) + var/obj/item/stack/tile/R = new(src) + R.amount = rand(1,5) - if(3) - var/obj/item/stack/sheet/metal/R = new(src) - R.amount = rand(5,25) + if(3) + var/obj/item/stack/sheet/metal/R = new(src) + R.amount = rand(5,25) - if(4) - var/obj/item/stack/sheet/plasteel/R = new(src) - R.amount = rand(5,25) + if(4) + var/obj/item/stack/sheet/plasteel/R = new(src) + R.amount = rand(5,25) - if(5) - var/quantity = rand(1,3) - for(var/i=0, iO9N6=e0i`m{IB`A@eumG<50d6nJX?7ccj|L>7H zH#!KUTBCxtHRLMgUm;W|>{b_4EqUQWa0e1LvJb4?1hxxG`wqgT+Dj0xe-$KauMcmK z@={IA(;`zkZ)GOuZjsy{jp0@UbL$9__m4Q`L}88s9VpCE$eS1DDE!k?cOS`==coOs zy@-WA)Lz7r_piN(D%wWAF+qGjLQ$ z29^xC^UBsZbM;t~O@1{u%3ul3jSj2>%6okxWF0uts&u7lu~a=q+H8-$HP~j4CE4WV zCw-W)DajugX`_%TgVKcKF;HIQr;RU6&DOw(7bKe}`>3YzMKuan9FX zA8;yt!H@8Q-G9NZzhJjt?lJO!kw=U?VdN_z-5tRY`euZ{8KH1SNSqNGXISLU8Rc7L z1#kMj7x_;-*LGIwplYeGXak5<89*#?tE`x=biQonjn1_#7HRD61&)0goW}7SKpfPe zQ?Cv+c6MS3)kc;Ge}x!*5|5kQ!r>~c5-&!VfmkX7Nyt8s%%k)q5ut&^A&Mm4eUZeO zE|NImMH1(|QF)yHMwE{dkqk$aj}ws^N0g5gktkIc#5;`>N(A%ji05f@ICm%UM&Vu6 zyj9+j(?8`c(_If7J8<#tY@NYVq{6%NP={UM*X*VkB}zu$e@f_dg{$TsO|na3)|Jj$ zDRC|w+hcXTPrULTAZa2{(LnHpcymfGPuFBclgsF!SDXql3^B5X-WxTIhiUUNcHL(1C%J>bHZRu5&ZFvc{YvQo$QGQEjJ9=Gb ze>*+~yERct5A6M#C`c!k*6V&v6wwn)%W%IY3jc{s&;i$cBT7f&e$Ad&+5MWRkRqB8 zvV@2w1S}<9JjzCkEsXZYxy8xpglX?=r!3J$MG`-LB(bKE<)cJol@aCRMC8B`#gX#rf6xXu8=fwGa-k0G`|np4(9XJrq3R6E76QJT z8ko)YOZ+>#4qDz|)r+A<$HpSb+r)v4B#vVwaTp_sH(Vs~hKnTLaFN6tuK(e-z5I#w zTK25HKFBYx!Y;jGY!ug(N3cwBIM?<>4hGC|{v}BV9X~fZNKQ-?8yzGkn(Rggf60k1 zztKT*{E=7u;AxItdmTGp_!Z}OCJWLej@4+g;{MI1_6ic1_Fod1_QV31_Tzk DG8}5# delta 1699 zcmV;U23-04{St!y5|AVTzmX+Gf8>w=KaNH-!{N+G`n>w{`(Ho)UVZ!dKJATj{?qMErG2-0US+p8d#?`C|2LZzQ|Fj;p z7qL)>+KX87`n4CaybU-7CN#wgyee;Ej5~L_y2v~W%Jgur$onM=>hw#JB$G0EOOrax z*c4kQXj2$f;?!L>sucs(e}!_y*4pA@rzo{Aj~b`y2)g|q?=Dtoogmc8F?fY7GjNnk z29|WV^UBsZbM;t~Og@?$Wv~g(jSj2=%6okx%sOzSROw39VpH`PDYHHL)?k@EmL!um zKdHlvO-UvR+LQ;Ens646c~!oWT9)bbi_LvsKq^e>iN*VLOQJjdQ;C z`hZjE3%-RHto{pD{RON2a*vS*j67oG2_s(#)7=paVc(1}a7I`-BTSqTHqNk-J7<({ zl@+|{_g>^b@m$+kse`Je!bTfFY?T4TCT^7#)0NJb&AidMw#6ci)xE&6E`!q8p96@U zI&|vQp~lKiEMc{ge zu4>*Y@5t$&@|NkY2aX-Mcz3qW;3-n!-Fc|PF7Rt|Q-l&Ff1__Dbh^S-bB`v;B{Azt zXRVYt7Y^#a9SVngA}wsJGSg zD%)(nWY>O{r7zV8bLn??ACVmVv;mT;S92yO>e_qIaz$A9PP}RY83xyqASA1|? z`@wbRv~~T%7~B{19BvAF4wv~ohx?(PBPJob(zeDu!*IX2XX-)RhV>k70f!5-mL{62 z0c34WG*oA0OdcBX2j;DVvvXC>#?K7KK{SK08D=mx#SA9QF~K+hXD|+i8H~5U494L& zcM1;jQ8}IDLt;EIr<1%$MD(1-evEB8wnrqfEh35S5J_xDVZ9fJetr?WD`*A$ce?SoLKD4iN)@mSnQLr1QdVR3r3w5Ud(!$%9iby zi=WG6KxK?IS?A7JF3k-vm*obSOL7CuomB(OomB&jL!+N+-K}x}QWPLct$}~#_fy7isBB9|Rkr0#uw4^}U61lxI@{54o$YuZ?AAmnJ+Sv{q9C1E z+Fti-qKKYY+6?z=qVS*C1UulGZ$xQN+^^a5D!X436;ebKT$bRm1c#;gi$_^+v4zpz zIJY=CoiOd4?UW_Ds7T`5k0iEfBzZlt_alizDv~%(BZ+^5KazMyjh4rrA5q>*L{=G5 z-cLjh98v5kuMTZ+v*GE|Cl~6_zW;t@0qv|?7^=>oY{B8Xse##Szr^3!Iw*OAtzHZ@ zIu;g5UM6;AB(WbOiQO1Uyx}5=H(Vs~hKnTLaQ%bZ_VN+ywd`4YeUM*Xg Date: Mon, 11 Aug 2014 12:25:07 -0400 Subject: [PATCH 73/83] Adjusts train supply costs --- code/datums/supplypacks.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index 1e267e524f3..f0e0e316441 100755 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -235,7 +235,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee /datum/supply_packs/cargotrain name = "Cargo Train Tug" contains = list(/obj/vehicle/train/cargo/engine) - cost = 30 + cost = 45 containertype = /obj/structure/largecrate containername = "Cargo Train Tug Crate" group = "Operations" @@ -243,7 +243,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee /datum/supply_packs/cargotrailer name = "Cargo Train Trolley" contains = list(/obj/vehicle/train/cargo/trolley) - cost = 20 + cost = 15 containertype = /obj/structure/largecrate containername = "Cargo Train Trolley Crate" group = "Operations" From 573f49624e97f3410f92f2ddbde1bcb261029e8f Mon Sep 17 00:00:00 2001 From: Chinsky Date: Tue, 12 Aug 2014 19:48:17 +0400 Subject: [PATCH 74/83] Added suggested new type of wounds for stumps --- code/modules/organs/organ_external.dm | 12 ++++--- code/modules/organs/wound.dm | 46 +++++++++++++++++---------- 2 files changed, 36 insertions(+), 22 deletions(-) diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index a3b259e3a61..e1cf22f60eb 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -596,11 +596,13 @@ Note that amputating the affected organ does in fact remove the infection from t //Replace all wounds on that arm with one wound on parent organ. wounds.Cut() if (parent) - var/wound_type = get_wound_type(CUT, max_damage) - if(wound_type) - var/datum/wound/W = new wound_type(max_damage) - parent.wounds += W - parent.update_damages() + var/datum/wound/W + if(max_damage < 50) + W = new/datum/wound/lost_limb/small(max_damage) + else + W = new/datum/wound/lost_limb(max_damage) + parent.wounds += W + parent.update_damages() update_damages() // If any organs are attached to this, destroy them diff --git a/code/modules/organs/wound.dm b/code/modules/organs/wound.dm index d20fc0dbfb4..383e6be0149 100644 --- a/code/modules/organs/wound.dm +++ b/code/modules/organs/wound.dm @@ -31,7 +31,7 @@ var/germ_level = 0 /* These are defined by the wound type and should not be changed */ - + // stages such as "cut", "deep cut", etc. var/list/stages // internal wounds can only be fixed through surgery @@ -51,7 +51,7 @@ // helper lists var/tmp/list/desc_list = list() var/tmp/list/damage_list = list() - + New(var/damage) created = world.time @@ -65,7 +65,7 @@ src.damage = damage max_bleeding_stage = src.desc_list.len - max_bleeding_stage - + // initialize with the appropriate stage src.init_stage(damage) @@ -74,7 +74,7 @@ // returns 1 if there's a next stage, 0 otherwise proc/init_stage(var/initial_damage) current_stage = stages.len - + while(src.current_stage > 1 && src.damage_list[current_stage-1] <= initial_damage / src.amount) src.current_stage-- @@ -84,20 +84,20 @@ // the amount of damage per wound proc/wound_damage() return src.damage / src.amount - + proc/can_autoheal() if(src.wound_damage() <= autoheal_cutoff) return 1 - + return is_treated() - + // checks whether the wound has been appropriately treated proc/is_treated() if(damage_type == BRUISE || damage_type == CUT) return bandaged else if(damage_type == BURN) return salved - + // Checks whether other other can be merged into src. proc/can_merge(var/datum/wound/other) if (other.type != src.type) return 0 @@ -128,10 +128,10 @@ if (disinfected) germ_level = 0 //reset this, just in case return 0 - + if (damage_type == BRUISE && !bleeding()) //bruises only infectable if bleeding return 0 - + var/dam_coef = round(damage/10) switch (damage_type) if (BRUISE) @@ -179,32 +179,32 @@ proc/can_worsen(damage_type, damage) if (src.damage_type != damage_type) return 0 //incompatible damage types - + if (src.amount > 1) return 0 - + //with 1.5*, a shallow cut will be able to carry at most 30 damage, //37.5 for a deep cut //52.5 for a flesh wound, etc. var/max_wound_damage = 1.5*src.damage_list[1] if (src.damage + damage > max_wound_damage) return 0 - + return 1 proc/bleeding() if (src.internal) return 0 // internal wounds don't bleed in the sense of this function - + if (current_stage > max_bleeding_stage) return 0 - + if (bandaged||clamped) return 0 - + if (wound_damage() <= 30 && bleed_timer <= 0) return 0 //Bleed timer has run out. Wounds with more than 30 damage don't stop bleeding on their own. - + return (damage_type == BRUISE && wound_damage() >= 20 || damage_type == CUT && wound_damage() >= 5) /** CUTS **/ @@ -273,3 +273,15 @@ datum/wound/cut/massive stages = list("severed vein" = 30, "cut vein" = 20, "damaged vein" = 10, "bruised vein" = 5) autoheal_cutoff = 5 max_bleeding_stage = 0 //all stages bleed. It's called internal bleeding after all. + +/** EXTERNAL ORGAN LOSS **/ +/datum/wound/lost_limb + damage_type = CUT + stages = list("ripped stump" = 65, "bloody stump" = 50, "clotted stump" = 25, "scarred stump" = 0) + max_bleeding_stage = 3 + + can_merge(var/datum/wound/other) + return 0 //cannot be merged + +/datum/wound/lost_limb/small + stages = list("ripped stump" = 40, "bloody stump" = 30, "clotted stump" = 15, "scarred stump" = 0) \ No newline at end of file From dcd5092f23fa507f5adc2540df621104e923ecd8 Mon Sep 17 00:00:00 2001 From: GinjaNinja32 Date: Tue, 12 Aug 2014 20:47:26 +0100 Subject: [PATCH 75/83] Add floor painter --- baystation12.dme | 1 + .../objects/items/devices/floor_painter.dm | 205 ++++++++++++++++++ 2 files changed, 206 insertions(+) create mode 100644 code/game/objects/items/devices/floor_painter.dm diff --git a/baystation12.dme b/baystation12.dme index 52a2cd5319d..6994eb8e9d4 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -487,6 +487,7 @@ #include "code\game\objects\items\devices\debugger.dm" #include "code\game\objects\items\devices\flash.dm" #include "code\game\objects\items\devices\flashlight.dm" +#include "code\game\objects\items\devices\floor_painter.dm" #include "code\game\objects\items\devices\lightreplacer.dm" #include "code\game\objects\items\devices\megaphone.dm" #include "code\game\objects\items\devices\modkit.dm" diff --git a/code/game/objects/items/devices/floor_painter.dm b/code/game/objects/items/devices/floor_painter.dm new file mode 100644 index 00000000000..bc9e144da79 --- /dev/null +++ b/code/game/objects/items/devices/floor_painter.dm @@ -0,0 +1,205 @@ +/obj/item/device/floor_painter + name = "floor painter" + icon = 'icons/obj/bureaucracy.dmi' + icon_state = "labeler1" + item_state = "flight" + + var/mode_nice = "standard" + var/mode = "floor" + var/tile_dir_mode = 0 + + // mode 0 ignore direction; sets dir=0 + // mode 1 all-direction + // mode 2 corner selecting the side CW from the selected corner + // mode 3 cardinal + // mode 4 warningcorner and warnwhitecorner direction fix + // mode 5 Opposite corner tiles where the second icon_state is "[mode]_inv" +/obj/item/device/floor_painter/afterattack(atom/A, mob/user as mob) + if (get_dist(A,user) > 1) + return + + if(istype(A, /turf/simulated/floor)) + var/turf/simulated/floor/F = A + + if(F.is_plasteel_floor()) // only tiled floors + if(tile_dir_mode) + var/D = get_dir(usr, F) + if(usr.loc == F) + D = usr.dir + + switch(tile_dir_mode) + if(1) // All directions accepted + F.dir = D + F.icon_state = mode + if(2) // Corner mode - diagonal directions converted CW around. + switch(D) + if(NORTHEAST) + D = EAST + if(SOUTHEAST) + D = SOUTH + if(SOUTHWEST) + D = WEST + if(NORTHWEST) + D = NORTH + F.dir = D + F.icon_state = mode + if(3) // cardinal directions only. I've adjusted diagonals the same way the facing code does. + switch(D) + if(NORTHEAST) + D = EAST + if(SOUTHEAST) + D = EAST + if(SOUTHWEST) + D = WEST + if(NORTHWEST) + D = WEST + F.dir = D + F.icon_state = mode + if(4) // floors.dmi icon_states "warningcorner" and "warnwhitecorner" are incorrect, this fixes it + var/D2 + switch(D) + if(NORTHEAST) + D2 = WEST + if(SOUTHEAST) + D2 = SOUTH + if(SOUTHWEST) + D2 = NORTH + if(NORTHWEST) + D2 = EAST + F.dir = D2 + F.icon_state = mode + if(5) + F.dir = 0 + if(D == NORTH || D == SOUTH || D == NORTHEAST || D == SOUTHWEST) + F.icon_state = mode + else + F.icon_state = "[mode]_inv" + else + F.dir = 0 + F.icon_state = mode + else + usr << "You can't paint that!" + +/obj/item/device/floor_painter/attack_self(mob/user as mob) + var/type = input("What type of floor?", "Floor painter", "solid") in list("solid", "corner", "opposite corners", "side/three corners", "special", "letters") + + tile_dir_mode = 0 + + switch(type) + if("solid") + tile_dir_mode = 0 + var/design = input("Which color?", "Floor painter") in list("standard", "red", "blue", "green", "yellow", "purple", "white", "white-red", "white-blue", "white-green", "white-yellow", "white-purple") + if(design == "standard") + mode = "floor" + mode_nice = "standard" + return + if(design == "white") + mode = "white" + mode_nice = "white" + return + mode_nice = design + mode = "[replacetext(design, "-", "")]full" + if("corner") + var/design = input("Which design?", "Floor painter") in list("red", "blue", "green", "yellow", "purple", "white", "white-grey", "white-red", "white-blue", "white-green", "white-yellow", "white-purple") + mode_nice = "[design] corner" + mode = "[replacetext(design, "-", "")]corner" + tile_dir_mode = 2 + if("opposite corners") + var/design = input("Which design?", "Floor painter") in list("bar", "cmo", "yellowpatch", "cafeteria", "red-yellow", "red-blue", "red-green", "green-yellow", "green-blue", "blue-yellow") + mode_nice = design + if(design == "bar" || design == "cmo" || design == "yellowpatch" || design == "cafeteria") + mode = design + else + mode = "[replacetext(design, "-", "")]full" + if(design == "yellowpatch") + tile_dir_mode = 5 + else + tile_dir_mode = 0 + if("side/three corners") + var/design = input("Which design?", "Floor painter") in list("red", "blue", "green", "yellow", "purple", "white", "white-red", "white-blue", "white-green", "white-yellow", "white-purple") + if(design == "white") + mode = "whitehall" + mode_nice = "white side" + tile_dir_mode = 1 + else + mode_nice = design + mode = replacetext(design, "-", "") + tile_dir_mode = 1 + if("special") + var/design = input("Which design?", "Floor painter") in list("arrival", "escape", "caution", "warning", "white-warning", "white-blue-green", "loadingarea", "delivery", "bot") + if(design == "white-blue-green") + mode_nice = design + mode = "whitebluegreencorners" + tile_dir_mode = 2 + else if(design == "delivery" || design == "bot") + mode_nice = design + mode = design + tile_dir_mode = 0 + else if(design == "loadingarea") + mode_nice = design + mode = design + tile_dir_mode = 3 + else + if(design == "white-warning") + mode_nice = design + design = "warnwhite" + var/s_corner = alert("Do you want to paint a single corner of the tile?", "Floor painter","Yes","No") == "Yes" + if(s_corner) + mode_nice = "[design] corner" + mode = "[design]corner" + if(design == "warning" || design == "white-warning") // sprites for these are weird, need to fix dirs (icons/turf/floors.dmi, "warningcorner" and "warnwhitecorner") + tile_dir_mode = 4 + else + tile_dir_mode = 2 + else + mode_nice = design + mode = design + tile_dir_mode = 1 + if("letters") + var/which = input("Which letters/design?", "Floor painter") in list("A1", "A2", "DI", "SA", "SA (red)", "SB", "SB (red)", "SC", "SC (red)", "W (red)", "V (green)", "Psy", "Ex", "Ex (blue)", "CMO", "O (OP)", "P (OP)") + mode_nice = which + switch(which) + if("A1") + mode = "white_1" + if("A2") + mode = "white_2" + if("DI") + mode = "white_d" + if("SA") + mode = "white_a" + if("SA (red)") + mode = "whitered_a" + tile_dir_mode = 3 + if("SB") + mode = "white_b" + if("SB (red)") + mode = "whitered_b" + tile_dir_mode = 3 + if("SC") + mode = "white_c" + if("SC (red)") + mode = "whitered_c" + tile_dir_mode = 3 + if("W (red)") + mode = "whitered_w" + tile_dir_mode = 3 + if("V (green)") + mode = "whitegreen_v" + tile_dir_mode = 3 + if("Psy") + mode = "white_p" + if("Ex") + mode = "white_ex" + if("Ex (blue)") + mode = "whiteblue_ex" + tile_dir_mode = 3 + if("CMO") // yes this is also in "opposite corners" choices, but it's a different icon_state (!!) + mode = "white_cmo" + if("O (OP)") + mode = "white_halfo" + if("P (OP)") + mode = "white_halfp" + +/obj/item/device/floor_painter/examine() + ..() + usr << "It is in [mode_nice] mode." \ No newline at end of file From 0493090f15ca403737326184f2e35d4fa8b568ba Mon Sep 17 00:00:00 2001 From: GinjaNinja32 Date: Tue, 12 Aug 2014 21:09:51 +0100 Subject: [PATCH 76/83] Add more floor tile types --- code/game/objects/items/devices/floor_painter.dm | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/code/game/objects/items/devices/floor_painter.dm b/code/game/objects/items/devices/floor_painter.dm index bc9e144da79..7d6f6877fe5 100644 --- a/code/game/objects/items/devices/floor_painter.dm +++ b/code/game/objects/items/devices/floor_painter.dm @@ -88,7 +88,7 @@ switch(type) if("solid") tile_dir_mode = 0 - var/design = input("Which color?", "Floor painter") in list("standard", "red", "blue", "green", "yellow", "purple", "white", "white-red", "white-blue", "white-green", "white-yellow", "white-purple") + var/design = input("Which color?", "Floor painter") in list("standard", "dark", "red", "blue", "green", "yellow", "purple", "neutral", "white", "white-red", "white-blue", "white-green", "white-yellow", "white-purple", "freezer", "hydro", "showroom") if(design == "standard") mode = "floor" mode_nice = "standard" @@ -97,10 +97,14 @@ mode = "white" mode_nice = "white" return + if(design == "showroom" || design == "hydro" || design == "freezer") + mode = "[design]floor" + mode_nice = design + return mode_nice = design mode = "[replacetext(design, "-", "")]full" if("corner") - var/design = input("Which design?", "Floor painter") in list("red", "blue", "green", "yellow", "purple", "white", "white-grey", "white-red", "white-blue", "white-green", "white-yellow", "white-purple") + var/design = input("Which design?", "Floor painter") in list("black", "red", "blue", "green", "yellow", "purple", "neutral", "white", "white-grey", "white-red", "white-blue", "white-green", "white-yellow", "white-purple") mode_nice = "[design] corner" mode = "[replacetext(design, "-", "")]corner" tile_dir_mode = 2 @@ -116,7 +120,7 @@ else tile_dir_mode = 0 if("side/three corners") - var/design = input("Which design?", "Floor painter") in list("red", "blue", "green", "yellow", "purple", "white", "white-red", "white-blue", "white-green", "white-yellow", "white-purple") + var/design = input("Which design?", "Floor painter") in list("black", "red", "blue", "green", "yellow", "purple", "neutral", "white", "white-red", "white-blue", "white-green", "white-yellow", "white-purple") if(design == "white") mode = "whitehall" mode_nice = "white side" From 9abd6765b130170c2d77a6014bfaf5689f5139be Mon Sep 17 00:00:00 2001 From: GinjaNinja32 Date: Tue, 12 Aug 2014 21:13:46 +0100 Subject: [PATCH 77/83] More floor tiles --- code/game/objects/items/devices/floor_painter.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/devices/floor_painter.dm b/code/game/objects/items/devices/floor_painter.dm index 7d6f6877fe5..96b6d434862 100644 --- a/code/game/objects/items/devices/floor_painter.dm +++ b/code/game/objects/items/devices/floor_painter.dm @@ -120,7 +120,7 @@ else tile_dir_mode = 0 if("side/three corners") - var/design = input("Which design?", "Floor painter") in list("black", "red", "blue", "green", "yellow", "purple", "neutral", "white", "white-red", "white-blue", "white-green", "white-yellow", "white-purple") + var/design = input("Which design?", "Floor painter") in list("black", "red", "blue", "green", "yellow", "purple", "neutral", "white", "white-red", "white-blue", "white-green", "white-yellow", "white-purple", "red-yellow", "red-blue", "blue-red", "red-green", "green-yellow", "green-blue", "blue-yellow") if(design == "white") mode = "whitehall" mode_nice = "white side" @@ -130,7 +130,7 @@ mode = replacetext(design, "-", "") tile_dir_mode = 1 if("special") - var/design = input("Which design?", "Floor painter") in list("arrival", "escape", "caution", "warning", "white-warning", "white-blue-green", "loadingarea", "delivery", "bot") + var/design = input("Which design?", "Floor painter") in list("arrival", "escape", "caution", "warning", "white-warning", "white-blue-green", "loadingarea", "delivery", "bot", "white-delivery", "white-bot") if(design == "white-blue-green") mode_nice = design mode = "whitebluegreencorners" From 288257635871af4c689e7d0b1472dfb8ee45a5a5 Mon Sep 17 00:00:00 2001 From: Lancer411 Date: Wed, 13 Aug 2014 06:26:30 +0800 Subject: [PATCH 78/83] Fix for infinite loop in smokeFlow() proc. When chemical grenade being activated on any unsimulated turf (for example a space turf), smokeFlow() starts infinite while loop, overloading the server. With the only one unsimulated turf in pending list while() loop can't finish itself and for() loop can't start. This fix makes chemical grenades being able to explode in space without server going in infinite loop. Also fixed issue with smoke being able to pass through glass walls with help of c_airblock() proc. That's the best solution I could come up with. Zone check code was useless because every single turf besides walls (which allready checked) and unsimulated turfs have it, making algorithm believe that turfs behind the glass wall are being reachable by chemsmoke. I don't know if it was intended not to spread smoke in airless or unsimulated areas, but a bunch of airless simulated floor tiles in space is good enough for this algorithm to start spreading smoke around. P.S. this algorithm is good for large, open areas and horrible in narrow maint tunnels. It is creating only a single cloud of smoke for 50/50/50 recipie in 1 tile wide tunnel. --- code/game/objects/effects/chemsmoke.dm | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/code/game/objects/effects/chemsmoke.dm b/code/game/objects/effects/chemsmoke.dm index 4c245b78cc2..fb9b049a3e0 100644 --- a/code/game/objects/effects/chemsmoke.dm +++ b/code/game/objects/effects/chemsmoke.dm @@ -224,24 +224,25 @@ pending += location while(pending.len) - for(var/turf/simulated/current in pending) + for(var/turf/current in pending) for(var/D in cardinal) - var/turf/simulated/target = get_step(current, D) - + var/turf/target = get_step(current, D) if(wallList) if(istype(target, /turf/simulated/wall)) if(!(target in wallList)) wallList += target continue - if(!target.zone) - continue + if(target in pending) continue if(target in complete) continue if(!(target in targetTurfs)) continue - + if(current.c_airblock(target)) //this is needed to stop chemsmoke from passing through thin window walls + continue + if(target.c_airblock(current)) + continue pending += target pending -= current @@ -249,4 +250,4 @@ targetTurfs = complete - return \ No newline at end of file + return From 649af28c77ed34ffa1e8c56bdf55cfe9963da381 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 13 Aug 2014 12:04:51 +0930 Subject: [PATCH 79/83] Fixed the overlay issue for now. This will need replacing. --- code/controllers/master_controller.dm | 7 ++- code/modules/mining/drilling/distribution.dm | 5 --- code/modules/mining/mine_turfs.dm | 47 ++++++++++---------- 3 files changed, 29 insertions(+), 30 deletions(-) diff --git a/code/controllers/master_controller.dm b/code/controllers/master_controller.dm index 9a097030d58..0777c6aa417 100644 --- a/code/controllers/master_controller.dm +++ b/code/controllers/master_controller.dm @@ -113,6 +113,11 @@ datum/controller/game_controller/proc/setup_objects() asteroid_ore_map = new /datum/ore_distribution() asteroid_ore_map.populate_distribution_map() + //Shitty hack to fix mining turf overlays, for some reason New() is not being called. + for(var/turf/simulated/floor/plating/airless/asteroid/T in world) + T.updateMineralOverlays() + T.name = "asteroid" + //Set up spawn points. populate_spawn_points() @@ -301,7 +306,7 @@ datum/controller/game_controller/proc/process_machines_power() //check if the area has power for M's channel //this will keep stat updated in case the machine is moved from one area to another. M.power_change(A) //we've already made sure A is a master area, above. - + if(!(M.stat & NOPOWER) && M.use_power) M.auto_use_power() diff --git a/code/modules/mining/drilling/distribution.dm b/code/modules/mining/drilling/distribution.dm index e935f55e52a..e152a60b343 100644 --- a/code/modules/mining/drilling/distribution.dm +++ b/code/modules/mining/drilling/distribution.dm @@ -162,11 +162,6 @@ Deep minerals: target_turf = locate(tx+j, ty+i, asteroid_z) - //Very shitty fix for the asteroid turf overlays being screwy. - if(target_turf && istype(target_turf,/turf/simulated/floor/plating/airless/asteroid)) - var/turf/simulated/floor/plating/airless/asteroid/T = target_turf - T.updateMineralOverlays() - if(target_turf && target_turf.has_resources) target_turf.resources = list() target_turf.resources["silicates"] = rand(3,5) diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index 0f5a8aba3ab..bf70bb5c767 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -27,9 +27,23 @@ has_resources = 1 /turf/simulated/mineral/New() + . = ..() + MineralSpread() + spawn(2) + var/list/step_overlays = list("s" = NORTH, "n" = SOUTH, "w" = EAST, "e" = WEST) + for(var/direction in step_overlays) + var/turf/turf_to_check = get_step(src,step_overlays[direction]) + + if(istype(turf_to_check,/turf/simulated/floor/plating/airless/asteroid)) + var/turf/simulated/floor/plating/airless/asteroid/T = turf_to_check + T.updateMineralOverlays() + + else if(istype(turf_to_check,/turf/space) || istype(turf_to_check,/turf/simulated/floor)) + turf_to_check.overlays += image('icons/turf/walls.dmi', "rock_side_[direction]") + /turf/simulated/mineral/ex_act(severity) switch(severity) if(2.0) @@ -122,7 +136,7 @@ var/datum/find/F = finds[1] if(excavation_level + P.excavation_amount > F.excavation_required) //Chance to destroy / extract any finds here - fail_message = ", [pick("there is a crunching noise","[W] collides with some different rock","part of the rock face crumbles away","something breaks under [W]")]" + fail_message = ". [pick("There is a crunching noise","[W] collides with some different rock","Part of the rock face crumbles away","Something breaks under [W]")]" user << "\red You start [P.drill_verb][fail_message ? fail_message : ""]." @@ -199,13 +213,6 @@ excav_overlay = "overlay_excv[excav_quadrant]_[rand(1,3)]" overlays += excav_overlay - /* Nope. - //extract pesky minerals while we're excavating - while(excavation_minerals.len && excavation_level > excavation_minerals[excavation_minerals.len]) - DropMineral() - pop(excavation_minerals) - mineralAmt-- */ - //drop some rocks next_rock += P.excavation_amount * 10 while(next_rock > 100) @@ -254,6 +261,7 @@ M.apply_effect(25, IRRADIATE) var/turf/simulated/floor/plating/airless/asteroid/N = ChangeTurf(/turf/simulated/floor/plating/airless/asteroid) + for(var/i=0;i Date: Wed, 13 Aug 2014 09:30:11 +0100 Subject: [PATCH 80/83] Fixes being able to use the floor painter through windows, windoors etc. --- code/game/objects/items/devices/floor_painter.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/devices/floor_painter.dm b/code/game/objects/items/devices/floor_painter.dm index 96b6d434862..ebb1111429e 100644 --- a/code/game/objects/items/devices/floor_painter.dm +++ b/code/game/objects/items/devices/floor_painter.dm @@ -14,8 +14,8 @@ // mode 3 cardinal // mode 4 warningcorner and warnwhitecorner direction fix // mode 5 Opposite corner tiles where the second icon_state is "[mode]_inv" -/obj/item/device/floor_painter/afterattack(atom/A, mob/user as mob) - if (get_dist(A,user) > 1) +/obj/item/device/floor_painter/afterattack(atom/A, mob/user as mob, proximity) + if(!proximity) return if(istype(A, /turf/simulated/floor)) From 6c807199c918041b8908e77d7a01a642f7058487 Mon Sep 17 00:00:00 2001 From: Jarcolr Date: Wed, 13 Aug 2014 12:10:43 +0300 Subject: [PATCH 81/83] Adds the cigar case as a premium vending item 5 may be a bit too much, but who is going to get all those coins, anyway? --- code/game/machinery/vending.dm | 2 +- .../objects/items/weapons/storage/fancy.dm | 49 ++++++++++++++++++ icons/obj/cigarettes.dmi | Bin 2336 -> 2814 bytes 3 files changed, 50 insertions(+), 1 deletion(-) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 28efdb90874..5f503993d45 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -737,7 +737,7 @@ icon_state = "cigs" products = list(/obj/item/weapon/storage/fancy/cigarettes = 10,/obj/item/weapon/storage/box/matches = 10,/obj/item/weapon/lighter/random = 4) contraband = list(/obj/item/weapon/lighter/zippo = 4) - premium = list(/obj/item/clothing/mask/cigarette/cigar/havana = 2) + premium = list(/obj/item/weapon/storage/fancy/cigar = 5) prices = list(/obj/item/weapon/storage/fancy/cigarettes = 15,/obj/item/weapon/storage/box/matches = 1,/obj/item/weapon/lighter/random = 2) diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index 5766fd27e45..5353b6871db 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -202,6 +202,55 @@ icon_state = "Dpacket" item_state = "Dpacket" +/obj/item/weapon/storage/fancy/cigar + name = "cigar case" + desc = "A case for holding your cigars when you are not smoking them." + icon_state = "cigarcase" + item_state = "cigarcase" + icon = 'icons/obj/cigarettes.dmi' + w_class = 1 + throwforce = 2 + flags = TABLEPASS + slot_flags = SLOT_BELT + storage_slots = 7 + can_hold = list("/obj/item/clothing/mask/cigarette/cigar") + icon_type = "cigar" + +/obj/item/weapon/storage/fancy/cigar/New() + ..() + flags |= NOREACT + for(var/i = 1 to storage_slots) + new /obj/item/clothing/mask/cigarette/cigar(src) + create_reagents(15 * storage_slots) + +/obj/item/weapon/storage/fancy/cigar/Del() + del(reagents) + ..() + +/obj/item/weapon/storage/fancy/cigar/update_icon() + icon_state = "[initial(icon_state)][contents.len]" + return + +/obj/item/weapon/storage/fancy/cigar/remove_from_storage(obj/item/W as obj, atom/new_location) + var/obj/item/clothing/mask/cigarette/cigar/C = W + if(!istype(C)) return + reagents.trans_to(C, (reagents.total_volume/contents.len)) + ..() + +/obj/item/weapon/storage/fancy/cigar/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) + if(!istype(M, /mob)) + return + + if(M == user && user.zone_sel.selecting == "mouth" && contents.len > 0 && !user.wear_mask) + var/obj/item/clothing/mask/cigarette/cigar/W = new /obj/item/clothing/mask/cigarette/cigar(user) + reagents.trans_to(W, (reagents.total_volume/contents.len)) + user.equip_to_slot_if_possible(W, slot_wear_mask) + reagents.maximum_volume = 15 * contents.len + contents.len-- + user << "You take a cigar out of the case." + update_icon() + else + ..() /* * Vial Box diff --git a/icons/obj/cigarettes.dmi b/icons/obj/cigarettes.dmi index 59cab0298aa1dd6c8ae59ab6564127ee7d3cdf70..3da8e52c6ba9b95b6ae453ee59b75b8ff29d98e0 100644 GIT binary patch delta 2125 zcmY*acTm%N5>G-$Lobg&D1xFCK|tvVaA=;5A|N~?RZ%>oD51n8{^%$Q0nq~`5JVqM zN-Q)9y@*nxPl{3k2!i2(0TU8J5_0I>A9pi5TfY0*ot>Tee78htTQx^ru0vW31OkOZ zNQXfn$hYTv8z8^|xSW&8Z>JB#Ee#Y=hcvzIbS?FjRpg{J6lD;mTIZY(c-k50sP5Wo z@JJ1E;L~x7_mmlR!M!iB_jWpgF=yPoKu(LFF75aVH@y8YuAwm(u3w49T#1SVff7g$ zMusxG%vB_2V_7QBjol?R!_`x}eS3O0Wv|y%Li4tBfGN8zPP)vX%K>f1KAAwJ-{mh? zwT~69x_#uHEy|K_2;VqiM!#&tuSZqRKkfH9tBI@Hdpem?U_-jk8HwRtxLEq)$%bC- zkk46cHQR^);Hm{zbbq?C@ zZj)Gj+yZn&(`p&X-YGGg+N|aEGRD_T2kQ4`YwddvVj&)o827McnIVVAw+*eBsbxj) ztCb(IH@~c$l%oN{cKn=2MYvMh>wTX8XFkvl*^T}U7shTw+hA1mh`1FR1d^;c?&|EF zKw2fmCwPUbWJICE!(g}zg@CwN&1s|V+qgM8qqHgBQzkO^OAok-+t;cnmD$9FaOuV) znQHrQy?P_I`X1*Ofj+#(;&eegi%{ic zOUq9<@_sg;q{k}>E5B%L&YZ&?9c4Y6g3zIdsSkL|sy^Wz+p|0)GIEy7gYcFgbf!qj zhmfc2DW2xvek=ZwWDv*?h4}0{}tgejOd^yUR1pFjn6%!4v31GJB~$TUc7E9 zF_jN&^lZ0web85Np*jgnILspokO;p@TaC$Sx~!}U!s4UD(eXlpW>Jrmx@RHtcZ7R ze^X46s$}~}8l9XKnFWD46X?M^T6$w3oleNg%esP@D8L~_!7ouP$3B%OCjZV<{@21d zinm=aq7?R=2@DMESA8Xr@YnmJB*@qm23sEY$$^*YPy|qhY+Ags63^1O-|fC;?pC^$ zgrDwTen3>1M;K32vmWI*T|)U`oLg4rn&O=X8KA+etPSl|!oVD(uu}t{E@d6djY>?B zw`Ehhi8enfo)B$0P4j5<8|YIaDLUljow1V2${C(JOsB|P&u(tP%gu3>Z8@yvxNOqz zPO@3QiY8n$Un*92M8aBu*{%a#rRx6pw}0xFWh<|l1ZE>FB5t73 zlM4d}QL^VB2k))b(rH~@4zJw^h!;Yw=@{0xIWKh793LIk0%xCV(-ILDvNb+_Cs`3J z9wFDSEY`L#o4IX#orJZ=89G?Z;^0GKeZw%!qs~(U4 z@6|1Gpr;R+Rt^btdT|+J(ZutL(iX#mn~R?(tl!&dQeS^$4k^5~LZL{gl&8drOXxIxs2{Qs*VuTrP^k zifpuu@5q+i+MZ5XS#ngxp6~dVklG{Ju(FgUTflfnpL|Kq*c?#O)ciytOR>xXw;O?n zsv6*${?5tgWSS#j=QMu8a{3`c4u|8gnim5b4uS?|BKCabvitPvY+A@PBN0+^Yay`S zP7Vv56B15+xJkUakvEYp2pem;wfGp)>83ECz`zBAy>$dscFG`F|VvA#TJvF4vt4T*R zhT?cKshUB2E|t6f;M%+_okAvRqD%;V(zNnppgLj)LYp~{yD<-xsZxWHS76WC8u|`o z7?_HH@Qdkfd~SW8D!%b87yds994GiwyQc42pOAX3XQCX{gs_ERBgEIAjj^ZO-((qY zM&>c?Ll~CF5)g+W2?TM@N;kf3lQ#~xA1p_eu78Q_I)2p6wbmsl`QHcA BC@KH| delta 1643 zcmV-x29){!6`&H37Y?8Z0{{R3ZT6FI0008Du_d+wf55=NUrsC}00001bW%=J06^y0 zW&i*H=6Y0EbVOxyV{&P5bZKvH004NLm6Xd0!Y~j;*UeXix)td|-MNtwaiPB;u}*C; zeUMIl{JlYUig+cPJHwd-hC@brxms^_nzkEtVc*-f(F;ADBr3Yvqg0{DGZj^APnEoi zUW{;ve{o??ohi;Nv5Jn?_o0`nsPv}hSN&qsdRSHd0i3XTPj9 z4_$WV9%42Q=Y4Q!zK(u8au|FAvWNBtgL~uZwwH2n4xizFujjgxJFN@=}eWX`Adj2>Mf6Nq2fArp|JOBU%CrLy>RCt{2oM(3% zMHGg|HbRjsw8CD=$dR#Rl9(ELGrg}|;?TPSM5be6Q$vYE?>+QxLNNr>drRoOH`$ng z;`|S0Rubj}&%Lrn^6bKW&T&5E*^J(IXSLc~pCiTyf*=T@II3)%>oKaTZEBqA8Cx%h ze@s_<))!REy%+Ny%zH8Km3uZLk8}Z_T|jyUs(pUU`!MgvykG7M1!`r!Ca{4(x&>+podmw+jfIJgt&xE z6DfcN*j>@@u_x?7>dd-GT@C#I1uVc`d#ibsONckX55WTLv#*-pZ+|?45?Fu(kR8JO zfd@@34?z$FK@jD`vMk*Zl(3S?q?;><{I0H$FW}k=R(pH$?+UuZlmO4)e?C#ceVdTW z|IZ4#6HN^(**<{_3s@b=bsD%We@BNn>k|#!m7iIiow){u3NFjf8+3K$JGis}e+rt{ zJ-e;nJN$?vk2?C8V~;yNm0B>J-a6sL?rzbbv$N#ei_;ffe95JAmMl>4 zJl_<(HL$d=udn~I%aH{b>H&&%e3r?tAXN@BRlKeCXjv9vvJUd@Pk(KCPZve~&-0?8yP_0-7|t z%~L~9KeOW5;o;%uo?r38i!Z(W%JS*;yuquly^g*C-jJF%-+KFu`0}f-zxnpN?|=C5r=NeBZZ8_3@frKIh+`a0rGJ4y z5ClOG1o0mwW24Wjf07xo8P(-+MsvvYi03!Kh}?TI@4>tm@F=+*%*YG)>;i!IW8Q~( zKi~_DjY$L#Z$Jeyf!_sy4`M!m`5@r)jE$}SL$W}|Fbt@GW}idk|5LJnVXWpW$X`IS zw*m4qBb!KMv+}R+(d`9m*2wcS!!S+L0A4_|=VUq3{Dm)%e*s=Vujh=9uU#v*`30oc zpl&Z12l5v_2c%~}w@1Oge@M3{2!bF8f*=TjAc&IDJ)c*l^7Hu$W6$5c$b8=GEqy*; zY3%vCADPel{m$J1d;T6k=JSD|gA0^pKCh9o%;$Adj`_S+$}peTOBv?#dMU?zUMm%! z&sQ4d`F)0oQQspw_mdif-(s`;F6-c@Jp{vuCEQ&g6Uy@UxT_2B4RCV-BPJe|+*^Rv pW@<-kN8NiD;tg~MAc+4Ve*rPFHpj3#!hrw)002ovPDHLkV1i=!G{67= From bbae424f66211ff40a153f8eb1be3e9cf0d28799 Mon Sep 17 00:00:00 2001 From: Jarcolr Date: Wed, 13 Aug 2014 12:24:25 +0300 Subject: [PATCH 82/83] Diaper back on monkey. --- icons/mob/monkey.dmi | Bin 22349 -> 22415 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/monkey.dmi b/icons/mob/monkey.dmi index cde5a39f5ea64dceb14a5a29d61a193fbacc19f3..b00b4a08fa00b39d94177b620f8db13474ab34a4 100644 GIT binary patch delta 20532 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 delta 20472 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 WSNy-=Sz}`W0000 Date: Wed, 13 Aug 2014 20:15:07 -0500 Subject: [PATCH 83/83] Adds new hair. --- .../mob/new_player/sprite_accessories.dm | 30 ++++++++++++++++++ icons/mob/human_face.dmi | Bin 56147 -> 59058 bytes 2 files changed, 30 insertions(+) diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index b5086143972..1e5906eaef4 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -118,6 +118,11 @@ name = "Ponytail 3" icon_state = "hair_ponytail3" + ponytail4 + name = "Ponytail 4" + icon_state = "hair_ponytail4" + gender = FEMALE + sideponytail name = "Side Ponytail" icon_state = "hair_stail" @@ -156,6 +161,11 @@ gender = FEMALE species_allowed = list("Human","Unathi") + beehive2 + name = "Beehive 2" + icon_state = "hair_beehive2" + gender = FEMALE + bobcurl name = "Bobcurl" icon_state = "hair_bobcurl" @@ -189,6 +199,16 @@ icon_state = "hair_combover" gender = MALE + father + name = "Father" + icon_state = "hair_father" + gender = MALE + + reversemohawk + name = "Reverse Mohawk" + icon_state = "hair_reversemohawk" + gender = MALE + devillock name = "Devil Lock" icon_state = "hair_devilock" @@ -223,6 +243,11 @@ name = "Emo" icon_state = "hair_emo" + longemo + name = "Long Emo" + icon_state = "hair_emolong" + gender = FEMALE + shortovereye name = "Overeye Short" icon_state = "hair_shortovereye" @@ -286,6 +311,11 @@ icon_state = "hair_braid" gender = FEMALE + mbraid + name = "Medium Braid" + icon_state = "hair_shortbraid" + gender = FEMALE + braid2 name = "Long Braid" icon_state = "hair_hbraid" diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi index 474018847ac7b5f5b25a4a588c2c176e0d54cbf8..3a3a4fb3908f9e904715fd97339845c6baef3d18 100644 GIT binary patch delta 17258 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 delta 14325 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
 12345