From 4d920bef59c40100a7e417ebe1ee0b50b4d714d8 Mon Sep 17 00:00:00 2001 From: JimTheCactus Date: Tue, 29 Jul 2014 23:19:29 -0600 Subject: [PATCH 01/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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 zcmV+<3ETFGP)V=-0C=30jIj#BFcd}Sysx;lb0t;RERrG_+J7kInY_UWFQMY!J9Kdp-R^;N zZjZ}!4Ga7nXk)GNC~!C*ESaaomf>(ZlF2M7w;gI*8^fVfNp|3pq%f_h&Hv8`z<~N)-O>{JYy@T0Hz5=na33Mv)tf0G|K=2vtc$K~#90?V4L`6IU9? ze-2KZ8OKgy?3gqJV>v)JEVpv+C76~=WI|IZYtoq*cp4NyA)waFWxb^>aXHz1qN4ZF4^#}gkf6QQqB`W(=( zYfEy`v_V?$7O`{Jr^uz$Tc5Hiw z(dY~(d@|01(ay0|8%;e%;T5pO3Ki%3$ z>3j%X98^56;yoY|2@e+si>3`yX%zsdvPAMM-DB*O0Ll9 zbV!m!d1(>wp!kd325hrep%+psxxBOpNs`htMG2!CAc_K!NSM>}_u#q~1RxNUxqj&s zmZfVlW`OHjkkj+`3@;ZU>q4KTFUvAl?Qb(!SPek=)P+RDA+!b)(Qt_JsS5!ZEUf0L z{cU7fR;;gR2AE8fS%2?CzNp-nHsMiR*MfXexsUbtKE!02tVmobB?be_y1(Je&~iGu zVzl2lpAm1rah{H@7+;2#v#k3YN(=_YV`udsWLdfG51+oUtT*-FfE%MaIgnm} zX7kR5oIDI|-r1lzdHe`EosOyBZ=%V$jgGDu9^U{b+~DyI(9sp6$+?ZG-)};v({b|n z5ykq7p927FHXFR@;5w54SbKOn*8{0*)0>V|d;+mpEUKiP zqG$!;%3fcw0V7EOSSnJk+o#*Pedjg+Ql|tkA;nLm zepUuNoP<$dn7-E+j*m%vEaX~0YXcrlWURvDC0F`mHsF7S{J+H1PC#w)2B@8Y+T;yT zI{~%H8=!UqYLhoW?F7^&Z-Ckfs7>AgwG&XAtPE({`0i6rT}O+Lmx<6KwOr(BR=K{APF}8_a{9(@Aj3oSX z=JN57pIebwHp6AjMCfO=2OKS&%B@I@uZR4stJ342GnaK$dcGbOKUz37>jV@bqz+$> z8f|I)wKb)5)-PghP3Z%Dqb;Mq5=J#(WcsxT)od&5A~2NXr@klvOQWe5BYx_O5*SLd zt+0z0p*p9_plSQo=gO+76_b-L~IxRL*2%_wxllw8ofqFE1^i{@5A(-l3~J&yqLaj5vr+o zf5MI3`*|(iKBl4{gQzj+m}!a=a=WS6>?B|@BiqX;sL-Q9LqUZe*sHh=Z{3%x!+`hg<)KWjxR zng~fr65UZ4Opxe~5|WZ=MHBs>wW1#=qSxog{MG9(0NtbQ0a-lWt$zd(SY4Lg~bjB z$KodfeuYj*GZ zdrIGTpZ;hVy{4FC?+|)TaZ2BJKck;gvOXQ&vEh$N0JHJIt7u(){Q!LYx4%yKF?p`_ z$9z0KlE_$v$4jpC^X~_!oq*cp4NyA)waFWxb^>aXH$d$K)aJh(KG3jLwMeG`0000< KMNUMnLSTY>y=+S=M?002gig*!Vt_xJZHDJexoMVSBq%m4uY|Nq`fCFXTm zbX6xD92_E7LMI;#R7y6$z`$@Wn3g@tW&oK-VXQO&0004WQchCV=-0C=2@ki81SFc5=hfBPv+GPm?^?NSm#hUOhie6p$@eYms~|ga+vM2?g5(XZi4@`Z%sdS-+4b>e+y@@ zal^uS000HJNkl6ts{f>@6T%L!e||NlT0oAUhD;?lJxUKWj&V^kK`0 z;N;70Z%(i|gYW1{SISKAykGHS5FL$Zhx!Z`=F`qqIPV5w_*)nTU2er`=N&RIJpZmk zufTcG3rQH_w-;C$I+XSYRM0`6e_Ds=!n;9_hnS&|_kykkA4cN+ARf_CJa{jn;frz1 z5GP|y(U@@C91U;$NQ@@&D4vW&7K0RcL+Q)#kP}TX{(Yl+JUxh{;s-Le;xR-0%9s4whBD&?%tcR$fth9W}bIng9bUCXPl?Kz?y)HX!day3ENS22~MVC5|Z(>>A&q_zj1L&Tq`_$cV7SX_m7dwR1GfooFH0izzln|@At7^?QP`3(W<5bdyAST#3|FqiDPd>7mgN7j&Hnh>q z#Le+?1x}{ZDG!5?f{`?|Mm) z7xoPEg_IBMLCOX^Nmgs4|JN%U!)CcjRhF?VQz`Cic>b8n6E1OYBUr5xqyP0y4NZ}M zvD~I2-7XhkNGrHR{>AP|3i-5KfI-$WK>sJ}J@o&6omlk$e{ur?m2L7(ra-V+R`ACh z1S-pA4qWE>V=X`QKjsMfA2Vdp|BJ;UWy>v!-!55-cXeE{-P10|FOzlL=zmlI{f`PP z`hPH2^MTkb^W{dEdn=yrKSd;FEJz-B2^8@f>)raamnuqyLlD9{PX3O6vNbslro= ziENn(rj%Dy7-X(;gYOJ3i@Zvp^*<_r{znCM{XfVCtiZV0mZ6q{;eCZ*Ck_5&aEYb< znZW4(^?D8ckJq~X2ZK_DD$-?&Vw9@n_wwC?!R1aGfBa!rROV3Y|NVXq{lDJt@9%2< z0Ci`oDAG+@6u7Icfjr_emq)z5(SFkZ_jfg1WxxxSsseacZK7|uY{GRo{XtR8lzzDq zcj|v83gCsPoL})A^U;%N*Bh@C*Gxb~Szs|DT2hKE*tM}~$r{g&a}Jh*V9fB(-KfH|TK{ww~|QI@6g2e`gb{=>;1 z9NvbZJRC~n5A@9&T) zf1nY#n*aa+0d!JMQvg8b*k%9#0DXE?Sad{Xb7OL8aCB*JZU6vyoKseCa&`CgQ*iP1 z47HFg+bbYkL!hv&OWObc8z+b#ge1jhZJPV*C67*00vIOj3XBPV-$K%lsQAiPOEEb$Rx z=u+x=%$P^+Q|gWY6iB`q;#&k^LXRq}DXmgJZ$g6QA3W$72@1gUbt(Wr@d&`Y8bN5b zM(PdYx9|6P?-!Ae;2lV$T>Mc+f8>Vk;CRa$yFn)5$2|ZA4+g{tXn%b=^nhDNQO>#9 zInfjIobLgoj=&MML{54UOYZ@;JfrP~gc;q?*)!(m5nzfwgy7?(02svc#fo+#rew|K ze9-X90ConTF)-$QF{?`!ZE~wImt&e_l405zOris+!(6Pi0rg6Kktf0+tCPOiOK{an39NEPCn>cn>fEJj}o?IDaC4Fn(s%>)SF+z;f0oAP;t6 zL}eGv)d^vsIdG%E!%1GO6Od_?g^ExP{ee|xu(O@aqiRF3a%Z4hxSJ?j(8)$rjFc5B zI~{z*hINnA^-$}Vg<^;#OlSRO76!G{ex(D!^Q&DXs3Mf0ssn!_Jb{qAtTqI{5uTEe sovKda4dEGs^7HWbHl7F7=HMUWCzkjeQW9|me*gdg07*qoM6N<$g4Fy^ga7~l From 404a89aed63c439267efce99a54e35816bbc542b Mon Sep 17 00:00:00 2001 From: Walter0o Date: Thu, 31 Jul 2014 04:01:14 +0200 Subject: [PATCH 08/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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 f21ac595889c6f5a2cb767260077d81cba1ba468 Mon Sep 17 00:00:00 2001 From: Walter0o Date: Fri, 1 Aug 2014 21:59:48 +0200 Subject: [PATCH 32/65] 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 33/65] 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 34/65] 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 35/65] 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 36/65] 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 37/65] 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 38/65] 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 39/65] 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 40/65] 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 41/65] 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 42/65] 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 zcmcgwXH-+$w%(yhkuFVyAS%eANfAU!qJZ=wRgk6uDFGs)v=E9ST_B>y0<=x$nmsW3ILLo_ozTzd7eOSAwOv0Vn%Ob^ri4 zjSTgy000#Ad$6+5S4z5TTj`U>VKz7J>v;si?s?z6?~U*WfRNnhW9{ajFC1r?38bFj zo#OSK9p{*c2^x2~wP}UnG|4+3AUwOIAyKFwHCX;!r}Pje+oHyu)4hr>3!dB;u?~th zh1scN9y|z==YFNsukXycxF1b$Rc0*q9uSxn*1q5}X1ijg_N1Y-RG~e7ZMfjQ;&}`zYVpe_ z?0f@Y_t`@jSQtV*nZPL{JNNDw zr6_?003ih${lnVg>L=gUYK$sOs(wVkwc+F4FrnG)w;Ed6za#}2FhOUf=1A(8*pZzaM+_o z6aaRw06>%#69Amo|M!G3HIQ3!K$q}B6SurD!d+iD_U%WmuVv3;r;Y*qXjcajYR!I6 z-_{^s0gNxUh~sQtg2teucQ&p^T_{N(TXV)3_x8?9xqnzrZTV~S*-8~bgXWG$<0LB?|; zhPK@U%F;%mbLYF^nY5rZ|STC^)_~1611`MQ^|v z2`CBFsbCwGu1l_!Np^6402pC_`^~_aM|}Jk3Yl{`mpcLs&e;KpN+OFL0dYN#*~Yus zB~m7$Yt_0k0BELGCGeLg)B(=uV?CK^_4b5Z zR<4aLvYlA+%=nyQ_vxXDsxlz_qeLyX;!bh^->!G(%~gr@V5zd&AhF+J@%Z7piP!AR zh)HMwmaD8*9ukjDxMXq~0G=fJG0(s)Y+!ysJfmz>E|w+Au9J_RE)ITB001h(007S< z{}v&>H=){-vP%Ndh#R~70Ms;N`tBn-5U-1;LO?)=TQ3>6K>EeK(YvxC4Mb&`Ht+uQ zL{Wgq&5#2&pina%NpD)mYr5-Ikwg~5meW?fe2xK?{?41_@z~vp330p<QggK%s`e3gM^exMQeU_B+zgb=|GF1;3m{;yfv~Fc{twTTnWypU+I$-s+X;FnhB@G?5K}=P8k-wr8?%U>JSMD z&r7H1V_AImJE>F}E711a0V+5#uAkwi;EM{jM?b1k`yYYvQo~Ncmu^Jde@Pu6rS?-= z*1;~+zK1~&+8IQq(u*ygvkC5Kk5VgE*|6ye7prG7nhHddW5yKL68 z`U=Z_CXDvw#@Xr5FT1ptY%Nvybf&Av2ant{k&T{JrRt{_uE@zo(VcX;Ax!@i_n4*G zs^^qL`-TM$l}ghcT*&JZ99f@7I@v%t+U=)PV{J#euenr&9$1t;i%m6fEB9+CqJP}D zXJ477Qc2Sr9cM5s#X2ohNzxqoAwLr~IS{K8wFxO#Uevzx@ZeyLaQEOiZ_WgLw6jK7 zGtawxjzdV{*>WlzTh=?)o|^P(mb)f>T!En=lq?;fZS%^<7P*Qoj@Zu>Z^r{bxkTWPBBUZ~;sM}Z&&k=kJMN+^dvu1QVcoEr{`_MIkskyU z$~cTi^j+olW-FK?eUirDIH`1GdAh*mm)t*%e7BN$L#e&yof2KSQPI5axJElGUDDTB z8*#$s>>*p#htwJ$>Khql?e+|v2AOyrJA$;N6$;5`YG5#kb5-eYi)EPU=(8nF$8isa zJhY(51xZR`4u)%$_lIUTtI(PJVo|S=f=zES;+Jnam3> zHx%w$Uw@yIm6g`s-rkWP+0YU%ceBovOI+(b1|L?cMg3JRDf#sNp#!qZ()gKezo zYI?C&ZAKu&H@>6~2V4*n8_GL6FWRUVl$>A~n2r!sZDu}UwmVipeR>Bn*Lz2IOic70 z$>Ke&qa()D)U>Dl(J_5J;!OJ^zUhn|BA9$uQYh8vsntn@MAENsHkK=`cf@7iW4oqY zs47zTv39;7TU7b=7qGUF&v9kGpw5Kf#AjFL|FdTPlY2x-Il%L3v2iwX>ke+#qzzY=pO*NG&3dpW^rUyAyE)|Mlj zZJ4(I0P{=Rp1Fkz-7iy`Q_ro+z(I3l>6oK)>;D1X&XtN$Gxh0j>#!;YuXe+NfPQ?S zt=p&fKZyDfzfU-*O9}G;|IADA3lW|iAogll1m^USO@sReNY(qVQyJPy#ztf!!sHzOfL&>61y;_P*!gEQmc?4~_AmiIK%9JI;-`4A`tZaJc#c0S zkml;d_%F2RpDzA;g(wy}lUx)3dG)`Wo`LI{d51~y16$M3rVCy56%`61Cr`46Q~rz| z-iRPIF`DbSFV6{;z&5D#5Q!c3`%#Z+nC(t&+S^*_Crvk@Fnpp664zibSj$bzbE_LE zQZ(c-a9Zz2S3&e+<+VrMdV0i!?$>K3%B&Hzg2~+Yo;k&4NrQ;}-1vAoM`a6_oDh=; zH3uGEbn8AA62{q)>OYa=bqGeR1?lKgwzHX)p9Xzls$xD-Oy3zn{>@KVGp<5Y3X!KJ z(W(_@eA%x2+0j1DJ3Dgqk0n}9WncO|E1KWJa0%tBeecABZlY&8^Ab2L?!H_^>o)3# z^JZR)d$3eKl@vwY*dZk)YEh;^!D};&qlakM-f4{DGe-h{=I@^e6Iv`AA)B%d!RyiY z)@>p!$|q+>w)UuJ({OVW@Jhd&F&ABsrJSJR$?@A&i*(Pbbk#djy30Sby8Rj#4B|Dhf3u?p$Mwj2rYq9OaA zCW$>31?ff8(sQZS<7`dATa${7<(GNVu~j}V4>lKNLRW|&hbGc^ZdkIem(HsHQO6VI zNZNs(I3Y6@6P2tqKC0-C|CwsOi?6z=!<$lI_`0 zxf)?&cQn}2;W^W{nm1-kv5geNEUokJExyXeKz0_r8-lkULro{X6@A`ppTsM8rhuPz zi)%YqgV92_E0I)b|7TymT-Ufe1DzkH*;l%(&QEx{m7CRziPf{_Ds*XT{((V_*0ZG9 zl^fs0_&*3`kGkpKpubP0Dt?z0iiUk?F>&vH5p38Se8%_!{yTbJFZWKlacK5|z8=@9 zOFU&RA1BBZit8q_f%R0n7(Cf`9D%|VvCKZH@ttlQquK?l%#W&rc+xqk<-cyg!hb*F ztVw~>@J;FR<>jWw8ObRr5ngpv2N1pMFZ)|KJMb(~ z8%S14I0Vg|1&abTz0>SbJU~B^Qf=;PYupWIijUUNqsUBuXJ|BtSo1m7c+A8U2>R(l=`1W-oi~RVE|JrU_ z^1>q40@89bvL(p#b$tBso_b&O2-&n#C|0zix9!gWhekuEg^Z!i)v@SFp_EI!=prkN zUzKR`;mXuddFrt*-OE%xy?2PzuisS=iSa$_XBaO^?=RA>5!C>_0~c02ESXvqD0v0S z+Or*UD$u;d#<*rkX~Es%6HMGJqbO^WNvmb?Z06buX-X1;7W+z&R!lGzYglYJd)uIM0hVBkMyHH$$~CUjv0GBQ zLm`QQvv^YiE+gm7L?YbV^ueu^Z(ldFHFfM-6y*`QxrwV)C-Dq@eHkXb6B1?n=n++< zri>&^vzzGd$gHApGPT45HBen+U(iu!BrFy9q}budme9UYF~)1N{6KgiMk_~l-c`YV zpw&ryfB7z*nb4>Bb(mTW!+4!v&Ljp=@M{t??D3=ff{B2(%|S#|6Xda9kqi8hO!X)7 z9k){-Bu;W0?RFVPdj=%9B1C;*eY(hEW@l)7d`KIbkG5T z$-dFoeVJdVIrVcVh1=Ak=D~-E@NlQPW~@wr|B;jNCB8lnA~ z6mEcqELN!f_-$b4Yi=aB#ES#{4^)-i>#S3u3wckku|nhC!@`bQ@q#1cSv~t+rC#Aq zmofLd!jvwZVw?88359*w`Xo5AyW5Ea-9E8ewI&8m8^Yo3TTtO&Og_vVJV2k7Iue2ke9@X;w%KtjCXpnC=Y%KOQ!%uF?X!m~}xZK8I6N6Y!o zjy3H}6RnwtemMZ8N&qKo{Q4aiN_URop9P{QLQZSe%sAwn2BymL-kHa(cM(m^IDrjLkXt-yC&Jspt+{QjjaN_(*9w5<{=Yo!DcM3)P48&D=EEh zID`TREkgOY4rDJlnz~xywpr)gPE-#*H+4lKHFC*dZi9q+H&X|8kw>HlZXyjxrghuL z7y1gE)haPl7DW_f+0`f(Cafbto7g9tqt*bgL)ar@_jWTQh*;Dr<&h$7U7k`dy1?vu z&{@!kKrK$THx1!`n7eG)kh(hmfdvNO9WOAFoYeNe-$EQh%s6_)dniJ+J#Y=iGDO?;B@fc7^Mp;6VTYxC{;8 zRsaCP>^F`BOwEf{JdxQ!hhMb|g5L^s4e-1hw2cROHqloRN|JVLRJ< zOO5Z%O%M?y*)6W5;VP5&xUZZF=1VOKdes2ev~6EG73Tgk_z!`cy>=(N(KXXaG%b6e zKTz#_L#j|(_AE48W&YR0a)r3)-Wm6fAD1DxejlrP`K-~eRfYq434?P&b{jz+HbiAE z3r~7csvc_(7x!kTR0#BuupBZvhtHC7TEYXuc30F=xSiEaw3r)Z|a$zB_f_lKhDoQ>NC^po zcj`6Ww9bcG#W^4CJ#OsrA;BqVomHeVtnVKFxGa8x=l9!a!nNPe9uTN1Y`Z_SlGd-X z_y!$ZW49Y~EO?$cb&4xhn!w}j zEBcYWKl2SE>Rd~0^{;oN1D=G;;3j&3)mzp>wq-$m{b@!KhkA0;IwGii?!O%mVlJmO zC`l4-VnSY=KTFSBu53YyKD;q6|Ki73OrCIxVo6Z7MA&4s6x zn@_9mHMPGUMXwzE zU;uaw1pwW%|D+IOA$+bI$)!7X3<}^TKS7!yuDDLh$?9e#DEC~8hQFB!w}!XxM1$}P znL{3XEdpZ^2WNx(%G2q5fQT0PK&y|U#!srY#REfNv4V6UEFT>p0<;K7>6Ntt=QB1q zf%;k0AuL2RQb<5x*%_==$(-ZN`4hzkY!YsD9yh!AxRVlh1_S^`Y$S(qRRGYs&c^KU z0Kl_j``Uk6_y%&tDYs~h2a7u6F2vshZnN-WTyPfzSGJnwU-*Kbagm0b9fUT^SQcDI zEqer}BO4VoeX{`obHvV@1tEhm8<7Mwn}?p6;VyVpfGu$Cx>7Btpte%iMPx7>$&ZRb{NdqO z@lnrTw~nY;dEZkQ*<-%>J!URM6k* z9PTvbOaK14>&E&Yb9v{N>D0bP?dkG?p)m+Z}E|1i+uho@a z57~(MJ#wNAMV2@m!5q@o&T<6Vc{j2h^`&?T4gT@BS&ERbI40-J+C7|wE{%=`UGw#h zXtcjAbmr;D9pUB-Imh=gX-NcpR1ECj(aX}`}XwZMZf%=ruQ^5d3DUW^LGH1K6T_SASg{?zi(8eTauV2dbi zT2b@)k$hX^#gI*7i4W*Q67%yV4!GU>{8H>_%prca-U59qbOUO4+ldS1q>>1;5U+4% zZK8d-;IDn{)o{^99};QY&xa}5u*vjuXc0M+Y6lkWQm&BASsO6d9hMUJorWCKmt|%W zW@nQB!{2e!-HujGWGshQ(ffVI9Voj=)nW(^;F%~+>Fo}_y82@opMA+$2nQf~1&7z$ zb@NE{ZyEl+ch$X6Fw%&=#?J`?p53zN1W7WwxdGko?`BOVn0ZzZFq2%NCg8q$C6>7| zwnXWU$7RBeWCSaatc)Mgu^&pfqQktWhErn}U(0?^&R9;=mXCBb?|+w1u~R;zDPt(b z`>@+aTCa+#YE%V@TthC#47#_b~j|Arj-YeYlYCB@`py=eap)eHjiF<95;SJ4w3;gu4dU!2unw3 zfOABm7tZ+Y)qu_nIbP076(mhpoSnD+M~jx$Rx*uNjeGP+a(%maF`+GqFWz%yrNVZkXyD@lej)DcI)@k)F3vr#*a2Z4Ta6gfeaOzu7$(;b9t zU=XpW~DL zw)Au&5dSz9Cv>t(&tdVjqX3#5e{L@tPeO9lSwH@8C1PKpvbT>DzUW{7kMZ>X(+U3q z@omvoZ)c2Nre;$@i+k#xRi!TP`85T}+#$*>JG1wBB)&yW;PCI+50+h(uIugX6|FCY zNkXmA=%XfG^fJ<~fnrCLybW;b4CF-3)cOdR_o1AW!fK}jr362StMgrb4zGZxl`FLb zXP@@K`R^CB>uld%F^lwl*PJy^HykG%Ucw;*yy#X7E3aUCoVwjUZX+GJ$#=7Fu+>56 zv5|yFDVIC^vr8Q@x4q_?`ml?a2mS0j62X}p5GB?!iR(X(AOS#5kqIDGKgax=?L2u6 z&D~AF$}T(WS_-&2ArSev#6-3x@7`t)GMgB|Hg>9i@Lh($Y9#manr| zUtjOW*xPL~j^hGx7q+(>j!V2r4MAVwWhfUabkwoH_)_#MCz`CG(A8fG?nx3SSQ#tS zhFol$sYsN(6lyIRi_C3{1R5n-tQg6*oP43`G$gxyUj5Cj&0VAPedAGRlvC<(qO# z?d8^Kn-QC;@YJ&BCv1QPqXwdf4&A_IDA-ayS4Vndcfuy?e7H$d;2^XvX!{Lr5teVn zg|3?vahv+CiJOxcRG{n-1nI(PQ>1MR9c5@o3v^7%z@`C=v_|Gg+8A0{iL zmiN>)(VwF$i7W<-)MbX@Xc!9NFa~C_A0|JXLRKa+(@b4cQxN-=Lc^}&?UNXp?7JZEMh3x9OKKHB5T zBEej65a{zNCUxgtaLxlyJdYJlot&H$B6a9bJn{L(JJhfzWVPaqJxW6|i75{g7?!>_ z*@HrvHjj`>9p@g##`_qpk0zOsw_iv`oaH z&|gC=xzmCGppx>skr8fN#T^F)g2Cn55y$wX87jWX9R+4&N2bPkpkdJ_@) zVFZsEO!Q9*lq>jEp6IV2IV$2=&6D9Fl^y3Cvi?XXbqNz^r!|}0}`FuxVTJdsYM5xiF0s(vKEu9 zyW_4(#}NWM&WCAF>Lf{aT9^cb^Bi^zgYS)~pY0n&uB}{=jJRc;Z{X)wUVL@R83ccI z`Bl+kd1_amRCZD8fpBEog-YbQ|7u*@*EoucF?5|2shwpfW3_aI+%{EQj)23r1!3#W z-`i9t1zvY%qGYBOl4|GIGyQ}!^LJM654d`6{n|0{=^0o(Zec@kk|rIvK~8$`%6=q_ zCu>yw>|DQ>;&j2Dfdh%IWgM|)=#%~6#<@X_VLntSK2OCfL2`U}L_=z(Zgey_ZNK@@ zheE&26SEuccx|0`bO8MxYaBVH6>4!rSZls=+4V{KQ$a5jthq7yBjH;W>436(dW0Iw zZZexC+TbJ1W=AU9*3co!C96VDBWyMbAG*gtY~Gl6tNcR&rGGHG+okp`a)fwp1yRNK z{dq;lbw%!_yUdWeOASlf!&FrzE_AOO<&418k7is#c6o`P?wx7y3@sd4uUfh8*i{j- zKJFM?xcD-JkpFWx0_dGlNG0cgNV+)DdqpH&k`||-nU2RT(Ld$FqYU{1tM&$%_txZ`(%hS*gn54f>^)TkW`5w3`cCTv0OWSA5!sHhyW*%vf#yShRhYl~Dd?&(nm2T3 zmStZZ}DevxSOY4D67Eo)5 zv>f`c9b9BE>Q%UwC*C(I7 Date: Mon, 4 Aug 2014 13:04:34 -0400 Subject: [PATCH 43/65] 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 44/65] 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 45/65] 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 46/65] 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 47/65] 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 48/65] 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 49/65] 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 50/65] 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 51/65] 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 52/65] 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 53/65] 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 54/65] 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 aea4dc334487f4b3f34c399c3b92eb0b0d58ab45 Mon Sep 17 00:00:00 2001 From: Walter0o Date: Sat, 9 Aug 2014 21:46:44 +0200 Subject: [PATCH 55/65] 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 56/65] 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 57/65] 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 58/65] 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 59/65] 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 60/65] 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 61/65] 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 62/65] 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 63/65] 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 64/65] 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 65/65] 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.")
 12345