From f972199a156fc2838d032ff3a929009dab881ab0 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 29 Apr 2017 15:44:51 -0500 Subject: [PATCH 01/92] Fixed Dsay always causing a disk read --- code/modules/admin/verbs/deadsay.dm | 2 +- code/modules/admin/verbs/deadsay.dm.rej | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 code/modules/admin/verbs/deadsay.dm.rej diff --git a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm index 8703784fc6..3dabd99da1 100644 --- a/code/modules/admin/verbs/deadsay.dm +++ b/code/modules/admin/verbs/deadsay.dm @@ -19,7 +19,7 @@ if (!msg) return - var/nicknames = world.file2list("config/admin_nicknames.txt") + var/static/nicknames = world.file2list("config/admin_nicknames.txt") var/rendered = "DEAD: ADMIN([src.holder.fakekey ? pick(nicknames) : src.key]) says, \"[msg]\"" diff --git a/code/modules/admin/verbs/deadsay.dm.rej b/code/modules/admin/verbs/deadsay.dm.rej new file mode 100644 index 0000000000..2e48326069 --- /dev/null +++ b/code/modules/admin/verbs/deadsay.dm.rej @@ -0,0 +1,8 @@ +diff a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm (rejected hunks) +@@ -29,4 +29,4 @@ + if (M.stat == DEAD || (M.client && M.client.holder && (M.client.prefs.chat_toggles & CHAT_DEAD))) //admins can toggle deadchat on and off. This is a proc in admin.dm and is only give to Administrators and above + M.show_message(rendered, 2) + +- SSblackbox.add_details("admin_verb","Dsay") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +\ No newline at end of file ++ SSblackbox.add_details("admin_verb","Dsay") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! From ace93b6cfdd6d4aae413892fece1952ef8fcf0d1 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 1 May 2017 08:34:51 -0500 Subject: [PATCH 02/92] Buffs mercury and lithium --- code/modules/reagents/chemistry/reagents/other_reagents.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index c25a1d050d..47cb1e5d3a 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -658,7 +658,7 @@ taste_mult = 0 // apparently tasteless. /datum/reagent/mercury/on_mob_life(mob/living/M) - if(M.canmove && isspaceturf(M.loc)) + if(M.canmove && !isspaceturf(M.loc)) step(M, pick(GLOB.cardinal)) if(prob(5)) M.emote(pick("twitch","drool","moan")) @@ -738,7 +738,7 @@ taste_description = "metal" /datum/reagent/lithium/on_mob_life(mob/living/M) - if(M.canmove && isspaceturf(M.loc)) + if(M.canmove && !isspaceturf(M.loc)) step(M, pick(GLOB.cardinal)) if(prob(5)) M.emote(pick("twitch","drool","moan")) From 529125d3dd19143be27aa22d4f463923b58dc55a Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 1 May 2017 11:51:27 -0500 Subject: [PATCH 03/92] Moves tips from config to strings tree --- code/controllers/subsystem/ticker.dm | 4 ++-- code/modules/admin/verbs/deadsay.dm.rej | 10 ++++++++++ {config => strings}/admin_nicknames.txt | 0 {config => strings}/sillytips.txt | 0 {config => strings}/tips.txt | 0 5 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 code/modules/admin/verbs/deadsay.dm.rej rename {config => strings}/admin_nicknames.txt (100%) rename {config => strings}/sillytips.txt (100%) rename {config => strings}/tips.txt (100%) diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index f701c051da..67599e4f4c 100644 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -625,8 +625,8 @@ SUBSYSTEM_DEF(ticker) if(selected_tip) m = selected_tip else - var/list/randomtips = world.file2list("config/tips.txt") - var/list/memetips = world.file2list("config/sillytips.txt") + var/list/randomtips = world.file2list("strings/tips.txt") + var/list/memetips = world.file2list("strings/sillytips.txt") if(randomtips.len && prob(95)) m = pick(randomtips) else if(memetips.len) diff --git a/code/modules/admin/verbs/deadsay.dm.rej b/code/modules/admin/verbs/deadsay.dm.rej new file mode 100644 index 0000000000..7d0347427b --- /dev/null +++ b/code/modules/admin/verbs/deadsay.dm.rej @@ -0,0 +1,10 @@ +diff a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm (rejected hunks) +@@ -19,7 +19,7 @@ + + if (!msg) + return +- var/static/nicknames = world.file2list("strings/admin_nicknames.txt") ++ var/static/nicknames = world.file2list("config/admin_nicknames.txt") + + var/rendered = "DEAD: ADMIN([src.holder.fakekey ? pick(nicknames) : src.key]) says, \"[msg]\"" + diff --git a/config/admin_nicknames.txt b/strings/admin_nicknames.txt similarity index 100% rename from config/admin_nicknames.txt rename to strings/admin_nicknames.txt diff --git a/config/sillytips.txt b/strings/sillytips.txt similarity index 100% rename from config/sillytips.txt rename to strings/sillytips.txt diff --git a/config/tips.txt b/strings/tips.txt similarity index 100% rename from config/tips.txt rename to strings/tips.txt From 7afd85e3fce1e471316696ff35cc2925c7dbbd31 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 1 May 2017 12:47:22 -0500 Subject: [PATCH 04/92] PR announcement spam prevention --- code/world.dm.rej | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 code/world.dm.rej diff --git a/code/world.dm.rej b/code/world.dm.rej new file mode 100644 index 0000000000..70f208ed4d --- /dev/null +++ b/code/world.dm.rej @@ -0,0 +1,10 @@ +diff a/code/world.dm b/code/world.dm (rejected hunks) +@@ -184,7 +184,7 @@ + return + + #define CHAT_PULLR 64 //defined in preferences.dm, but not available here at compilation time +- for(var/client/C in clients) ++ for(var/client/C in GLOB.clients) + if(C.prefs && (C.prefs.chat_toggles & CHAT_PULLR)) + C << "PR: [announcement]" + #undef CHAT_PULLR From 36dfc5a4dbd5e762782beef40441b1ce900a0f5f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 1 May 2017 12:53:40 -0500 Subject: [PATCH 05/92] Holocalls --- code/controllers/subsystem/garbage.dm.rej | 9 + code/datums/holocall.dm | 154 ++++++++++++ code/game/machinery/hologram.dm | 149 +++++++++--- code/game/machinery/hologram.dm.rej | 226 ++++++++++++++++++ .../mob/living/silicon/ai/freelook/eye.dm | 2 +- tgstation.dme.rej | 9 + 6 files changed, 514 insertions(+), 35 deletions(-) create mode 100644 code/controllers/subsystem/garbage.dm.rej create mode 100644 code/datums/holocall.dm create mode 100644 code/game/machinery/hologram.dm.rej create mode 100644 tgstation.dme.rej diff --git a/code/controllers/subsystem/garbage.dm.rej b/code/controllers/subsystem/garbage.dm.rej new file mode 100644 index 0000000000..2075155c49 --- /dev/null +++ b/code/controllers/subsystem/garbage.dm.rej @@ -0,0 +1,9 @@ +diff a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm (rejected hunks) +@@ -725,7 +725,6 @@ var/datum/controller/subsystem/garbage_collector/SSgarbage + SearchVar(multiverse) + SearchVar(announcement_systems) + SearchVar(doppler_arrays) +- SearchVar(HOLOPAD_MODE) + SearchVar(holopads) + SearchVar(news_network) + SearchVar(allCasters) diff --git a/code/datums/holocall.dm b/code/datums/holocall.dm new file mode 100644 index 0000000000..0153e41414 --- /dev/null +++ b/code/datums/holocall.dm @@ -0,0 +1,154 @@ +#define HOLOPAD_MAX_DIAL_TIME 200 + +/mob/camera/aiEye/remote/holo/setLoc() + . = ..() + var/obj/machinery/holopad/H = origin + H.move_hologram(eye_user, loc) + +//this datum manages it's own references + +/datum/holocall + var/mob/living/user //the one that called + var/obj/machinery/holopad/calling_holopad //the one that sent the call + var/obj/machinery/holopad/connected_holopad //the one that answered the call (may be null) + var/list/dialed_holopads //all things called, will be cleared out to just connected_holopad once answered + + var/mob/camera/aiEye/remote/holo/eye //user's eye, once connected + var/obj/effect/overlay/holo_pad_hologram/hologram //user's hologram, once connected + + var/call_start_time + +//creates a holocall made by `caller` from `calling_pad` to `callees` +/datum/holocall/New(mob/living/caller, obj/machinery/holopad/calling_pad, list/callees) + call_start_time = world.time + user = caller + calling_pad.outgoing_call = src + calling_holopad = calling_pad + dialed_holopads = list() + + for(var/I in callees) + var/obj/machinery/holopad/H = I + if(!QDELETED(H) && H.is_operational()) + dialed_holopads += H + LAZYADD(H.holo_calls, src) + + if(!dialed_holopads.len) + calling_pad.say("Connection failure.") + qdel(src) + + testing("Holocall started") + +//cleans up ALL references :) +/datum/holocall/Destroy() + QDEL_NULL(eye) + + user.reset_perspective() + + user = null + hologram.HC = null + hologram = null + calling_holopad.outgoing_call = null + + for(var/I in dialed_holopads) + var/obj/machinery/holopad/H = I + LAZYREMOVE(H.holo_calls, src) + dialed_holopads.Cut() + + if(calling_holopad) + calling_holopad.SetLightsAndPower() + calling_holopad = null + if(connected_holopad) + connected_holopad.SetLightsAndPower() + connected_holopad = null + + testing("Holocall destroyed") + + return ..() + +//Gracefully disconnects a holopad `H` from a call. Pads not in the call are ignored. Notifies participants of the disconnection +/datum/holocall/proc/Disconnect(obj/machinery/holopad/H) + testing("Holocall disconnect") + if(H == connected_holopad) + calling_holopad.say("[usr] disconnected.") + else if(H == calling_holopad && connected_holopad) + connected_holopad.say("[usr] disconnected.") + + ConnectionFailure(H, TRUE) + +//Forcefully disconnects a holopad `H` from a call. Pads not in the call are ignored. +/datum/holocall/proc/ConnectionFailure(obj/machinery/holopad/H, graceful = FALSE) + testing("Holocall connection failure: graceful [graceful]") + if(H == connected_holopad || H == calling_holopad) + if(!graceful) + calling_holopad.say("Connection failure.") + qdel(src) + return + + LAZYREMOVE(H.holo_calls, src) + dialed_holopads -= H + if(!dialed_holopads.len) + if(graceful) + calling_holopad.say("Call rejected.") + testing("No recipients, terminating") + qdel(src) + +//Answers a call made to a holopad `H` which cannot be the calling holopad. Pads not in the call are ignored +/datum/holocall/proc/Answer(obj/machinery/holopad/H) + testing("Holocall answer") + if(H == calling_holopad) + CRASH("How cute, a holopad tried to answer itself.") + + if(!(H in dialed_holopads)) + return + + if(connected_holopad) + CRASH("Multi-connection holocall") + + connected_holopad = H + for(var/I in dialed_holopads) + if(I == H) + continue + var/obj/machinery/holopad/Holo = I + LAZYREMOVE(Holo.holo_calls, src) + dialed_holopads -= Holo + + if(!Check()) + return + + hologram = H.activate_holo(user) + hologram.HC = src + + //eyeobj code is horrid, this is the best copypasta I could make + eye = new + eye.origin = H + eye.eye_initialized = TRUE + eye.eye_user = user + eye.name = "Camera Eye ([user.name])" + user.remote_control = eye + user.reset_perspective(eye) + eye.setLoc(H.loc) + +//Checks the validity of a holocall and qdels itself if it's not. Returns TRUE if valid, FALSE otherwise +/datum/holocall/proc/Check() + for(var/I in dialed_holopads) + var/obj/machinery/holopad/H = I + if(!H.is_operational()) + ConnectionFailure(H) + + if(QDELETED(src)) + return FALSE + + . = !QDELETED(user) && !user.incapacitated() && !QDELETED(calling_holopad) && calling_holopad.is_operational() && user.loc == calling_holopad.loc + + if(.) + if(connected_holopad) + . = !QDELETED(connected_holopad) && connected_holopad.is_operational() + else + . = world.time < (call_start_time + HOLOPAD_MAX_DIAL_TIME) + if(!.) + calling_holopad.say("No answer recieved.") + calling_holopad.temp = "" + + if(!.) + testing("Holocall Check fail") + qdel(src) diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index ae8c1ac1c4..ca9cc23380 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -57,8 +57,16 @@ Possible to do for anyone motivated enough: holopads += src /obj/machinery/holopad/Destroy() - for (var/mob/living/silicon/ai/master in masters) - clear_holo(master) + if(outgoing_call) + LAZYADD(holo_calls, outgoing_call) + + for(var/I in holo_calls) + var/datum/holocall/HC = I + HC.ConnectionFailure(src) + LAZYCLEARLIST(holo_calls) + + for (var/I in masters) + clear_holo(I) holopads -= src return ..() @@ -128,12 +136,49 @@ Possible to do for anyone motivated enough: temp = "A request for AI presence was already sent recently.
" temp += "Main Menu" + else if(href_list["Holocall"]) + if(outgoing_call) + return + + temp = "You must stand on the holopad to make a call!
" + temp += "Main Menu" + if(usr.loc == loc) + var/list/callnames = list() + for(var/I in holopads) + var/area/A = get_area(I) + if(A) + LAZYADD(callnames[A], I) + callnames -= get_area(src) + + var/result = input(usr, "Choose an area to call", "Holocall") as null|anything in callnames + if(QDELETED(usr) || !result || outgoing_call) + return + + if(usr.loc == loc) + temp = "Dialing...
" + temp += "Main Menu" + new /datum/holocall(usr, src, callnames[result]) + + else if(href_list["connectcall"]) + var/datum/holocall/call_to_connect = locate(href_list["connectcall"]) + if(!QDELETED(call_to_connect)) + call_to_connect.Answer(src) + temp = "" + + else if(href_list["disconnectcall"]) + var/datum/holocall/call_to_disconnect = locate(href_list["disconnectcall"]) + if(!QDELETED(call_to_disconnect)) + call_to_disconnect.Disconnect(src) + temp = "" + else if(href_list["mainmenu"]) temp = "" + if(outgoing_call) + outgoing_call.Disconnect() updateDialog() - add_fingerprint(usr) +//do not allow AIs to answer calls or people will use it to meta the AI sattelite /obj/machinery/holopad/attack_ai(mob/living/silicon/ai/user) if (!istype(user)) return @@ -148,39 +193,75 @@ Possible to do for anyone motivated enough: clear_holo(user) /obj/machinery/holopad/process() - if(masters.len)//If there is a hologram. - for (var/mob/living/silicon/ai/master in masters) - if(master && !master.stat && master.client && master.eyeobj)//If there is an AI attached, it's not incapacitated, it has a client, and the client eye is centered on the projector. - if(!(stat & NOPOWER))//If the machine has power. - if(HOLOPAD_MODE == RANGE_BASED) - if(get_dist(master.eyeobj, src) <= holo_range) - return TRUE - else - var/obj/machinery/holopad/pad_close = get_closest_atom(/obj/machinery/holopad, holopads, master.eyeobj) - if(get_dist(pad_close, master.eyeobj) <= holo_range) - var/obj/effect/overlay/holo_pad_hologram/h = masters[master] - unset_holo(master) - pad_close.set_holo(master, h) - return TRUE - - else if (HOLOPAD_MODE == AREA_BASED) - - var/area/holo_area = get_area(src) - var/area/eye_area = get_area(master.eyeobj) - - if(eye_area in holo_area.related) - return TRUE - - clear_holo(master)//If not, we want to get rid of the hologram. - return TRUE - -/obj/machinery/holopad/proc/activate_holo(mob/living/silicon/ai/user) - if(!(stat & NOPOWER) && user.eyeobj.loc == src.loc)//If the projector has power and client eye is on it - if (istype(user.current, /obj/machinery/holopad)) + for(var/I in masters) + var/mob/living/master = I + var/mob/living/silicon/ai/AI = master + if(!istype(AI)) + AI = null + + if(!QDELETED(master) && !master.incapacitated() && master.client && (!AI || AI.eyeobj))//If there is an AI attached, it's not incapacitated, it has a client, and the client eye is centered on the projector. + if(is_operational())//If the machine has power. + if(AI) //ais are range based + if(get_dist(AI.eyeobj, src) <= holo_range) + continue + else + var/obj/machinery/holopad/pad_close = get_closest_atom(/obj/machinery/holopad, holopads, AI.eyeobj) + if(get_dist(pad_close, AI.eyeobj) <= holo_range) + var/obj/effect/overlay/holo_pad_hologram/h = masters[master] + unset_holo(master) + pad_close.set_holo(master, h) + continue + else + continue + clear_holo(master)//If not, we want to get rid of the hologram. + + if(outgoing_call) + outgoing_call.Check() + + for(var/I in holo_calls) + var/datum/holocall/HC = I + if(HC.connected_holopad != src) + if(force_answer_call && world.time > (HC.call_start_time + (HOLOPAD_MAX_DIAL_TIME / 2))) + HC.Answer(src) + break + if(outgoing_call) + HC.Disconnect(src)//can't answer calls while calling + else + playsound(src, 'sound/machines/twobeep.ogg', 100) //bring, bring! + +/obj/machinery/holopad/proc/activate_holo(mob/living/user) + var/mob/living/silicon/ai/AI = user + if(!istype(AI)) + AI = null + + if(is_operational() && (!AI || AI.eyeobj.loc == loc))//If the projector has power and client eye is on it + if (AI && istype(AI.current, /obj/machinery/holopad)) to_chat(user, "ERROR: \black Image feed in progress.") return - create_holo(user)//Create one. - src.visible_message("A holographic image of [user] flicks to life right before your eyes!") + + var/obj/effect/overlay/holo_pad_hologram/Hologram = new(loc)//Spawn a blank effect at the location. + if(AI) + Hologram.icon = AI.holo_icon + else //make it like real life + Hologram.icon = user.icon + Hologram.icon_state = user.icon_state + Hologram.copy_overlays(user, TRUE) + //codersprite some holo effects here + Hologram.alpha = 100 + Hologram.add_atom_colour("#77abff", FIXED_COLOUR_PRIORITY) + Hologram.Impersonation = user + + Hologram.languages_spoken = user.languages_spoken + Hologram.mouse_opacity = 0//So you can't click on it. + Hologram.layer = FLY_LAYER//Above all the other objects/mobs. Or the vast majority of them. + Hologram.anchored = 1//So space wind cannot drag it. + Hologram.name = "[user.name] (Hologram)"//If someone decides to right click. + Hologram.set_light(2) //hologram lighting + + set_holo(user, Hologram) + visible_message("A holographic image of [user] flicks to life right before your eyes!") + + return Hologram else to_chat(user, "ERROR: \black Unable to project hologram.") diff --git a/code/game/machinery/hologram.dm.rej b/code/game/machinery/hologram.dm.rej new file mode 100644 index 0000000000..5dcbcc9d54 --- /dev/null +++ b/code/game/machinery/hologram.dm.rej @@ -0,0 +1,226 @@ +diff a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm (rejected hunks) +@@ -26,16 +26,12 @@ Possible to do for anyone motivated enough: + + #define HOLOPAD_PASSIVE_POWER_USAGE 1 + #define HOLOGRAM_POWER_USAGE 2 +-#define RANGE_BASED 4 +-#define AREA_BASED 6 +- +-var/const/HOLOPAD_MODE = RANGE_BASED + + var/list/holopads = list() + + /obj/machinery/holopad +- name = "\improper AI holopad" +- desc = "It's a floor-mounted device for projecting holographic images. It is activated remotely." ++ name = "Holopad" ++ desc = "It's a floor-mounted device for projecting holographic images." + icon_state = "holopad0" + layer = LOW_OBJ_LAYER + flags = HEAR +@@ -48,10 +44,13 @@ var/list/holopads = list() + obj_integrity = 300 + max_integrity = 300 + armor = list(melee = 50, bullet = 20, laser = 20, energy = 20, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 0) +- var/list/masters = list()//List of AIs that use the holopad ++ var/list/masters = list()//List of living mobs that use the holopad + var/last_request = 0 //to prevent request spam. ~Carn + var/holo_range = 5 // Change to change how far the AI can move away from the holopad before deactivating. + var/temp = "" ++ var/list/holo_calls //array of /datum/holocalls ++ var/datum/holocall/outgoing_call //do not modify the datums only check and call the public procs ++ var/static/force_answer_call = FALSE //Calls will be automatically answered after a couple rings, here for debugging + + /obj/machinery/holopad/Initialize() + ..() +@@ -94,20 +101,60 @@ var/list/holopads = list() + return + return ..() + ++/obj/machinery/holopad/proc/CheckCallClose() ++ for(var/I in holo_calls) ++ var/datum/holocall/HC = I ++ if(usr == HC.eye) ++ HC.Disconnect(HC.calling_holopad) //disconnect via clicking the called holopad ++ return TRUE ++ return FALSE ++ ++/obj/machinery/holopad/Click(location,control,params) ++ if(!CheckCallClose()) ++ return ..() ++ + /obj/machinery/holopad/AltClick(mob/living/carbon/human/user) +- interact(user) ++ if(!CheckCallClose()) ++ interact(user) + + /obj/machinery/holopad/interact(mob/living/carbon/human/user) //Carn: Hologram requests. + if(!istype(user)) + return +- if(user.stat || stat & (NOPOWER|BROKEN)) ++ if(user.incapacitated() || !is_operational()) ++ return ++ ++ if(outgoing_call) //someone is making a call, leave them be + return ++ + user.set_machine(src) + var/dat + if(temp) + dat = temp + else +- dat = "request an AI's presence." ++ dat = "Request an AI's presence.
" ++ dat += "Call another holopad.
" ++ ++ if(LAZYLEN(holo_calls)) ++ dat += "=====================================================
" ++ ++ var/one_answered_call = FALSE ++ var/one_unanswered_call = FALSE ++ for(var/I in holo_calls) ++ var/datum/holocall/HC = I ++ if(HC.connected_holopad != src) ++ dat += "Answer call from [get_area(HC.calling_holopad)].
" ++ one_unanswered_call = TRUE ++ else ++ one_answered_call = TRUE ++ ++ if(one_answered_call && one_unanswered_call) ++ dat += "=====================================================
" ++ //we loop twice for formatting ++ for(var/I in holo_calls) ++ var/datum/holocall/HC = I ++ if(HC.connected_holopad == src) ++ dat += "Disconnect call from [HC.user].
" ++ + + var/datum/browser/popup = new(user, "holopad", name, 300, 130) + popup.set_content(dat) +@@ -115,7 +162,10 @@ var/list/holopads = list() + popup.open() + + /obj/machinery/holopad/Topic(href, href_list) +- if(..()) ++ if(..() || isAI(usr)) ++ return ++ add_fingerprint(usr) ++ if(!is_operational()) + return + if (href_list["AIrequest"]) + if(last_request + 200 < world.time) +@@ -194,59 +317,81 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ + for(var/mob/living/silicon/ai/master in masters) + if(masters[master] && speaker != master) + master.relay_speech(message, speaker, message_langs, raw_message, radio_freq, spans) ++ ++ for(var/I in holo_calls) ++ var/datum/holocall/HC = I ++ if(HC.connected_holopad == src && speaker != HC.hologram) ++ HC.user.Hear(message, speaker, message_langs, raw_message, radio_freq, spans) ++ ++ if(outgoing_call && speaker == outgoing_call.user) ++ outgoing_call.hologram.say(raw_message) ++ ++/obj/machinery/holopad/proc/SetLightsAndPower() ++ var/total_users = masters.len + LAZYLEN(holo_calls) ++ use_power = HOLOPAD_PASSIVE_POWER_USAGE + HOLOGRAM_POWER_USAGE * total_users ++ if(total_users) ++ set_light(2) ++ icon_state = "holopad1" ++ else ++ set_light(0) ++ icon_state = "holopad0" + +-/obj/machinery/holopad/proc/create_holo(mob/living/silicon/ai/A, turf/T = loc) +- var/obj/effect/overlay/holo_pad_hologram/h = new(T)//Spawn a blank effect at the location. +- h.icon = A.holo_icon +- h.mouse_opacity = 0//So you can't click on it. +- h.layer = FLY_LAYER//Above all the other objects/mobs. Or the vast majority of them. +- h.anchored = 1//So space wind cannot drag it. +- h.name = "[A.name] (Hologram)"//If someone decides to right click. +- h.set_light(2) //hologram lighting +- set_holo(A, h) +- return TRUE +- +-/obj/machinery/holopad/proc/set_holo(mob/living/silicon/ai/A, var/obj/effect/overlay/holo_pad_hologram/h) +- masters[A] = h +- set_light(2) // pad lighting +- icon_state = "holopad1" +- A.current = src +- use_power += HOLOGRAM_POWER_USAGE ++/obj/machinery/holopad/proc/set_holo(mob/living/user, var/obj/effect/overlay/holo_pad_hologram/h) ++ masters[user] = h ++ var/mob/living/silicon/ai/AI = user ++ if(istype(AI)) ++ AI.current = src ++ SetLightsAndPower() + return TRUE + +-/obj/machinery/holopad/proc/clear_holo(mob/living/silicon/ai/user) ++/obj/machinery/holopad/proc/clear_holo(mob/living/user) + qdel(masters[user]) // Get rid of user's hologram + unset_holo(user) + return TRUE + +-/obj/machinery/holopad/proc/unset_holo(mob/living/silicon/ai/user) +- if(user.current == src) +- user.current = null ++/obj/machinery/holopad/proc/unset_holo(mob/living/user) ++ var/mob/living/silicon/ai/AI = user ++ if(istype(AI) && AI.current == src) ++ AI.current = null + masters -= user // Discard AI from the list of those who use holopad +- use_power = max(HOLOPAD_PASSIVE_POWER_USAGE, use_power - HOLOGRAM_POWER_USAGE)//Reduce power usage +- if (!masters.len) // If no users left +- set_light(0) // pad lighting (hologram lighting will be handled automatically since its owner was deleted) +- icon_state = "holopad0" +- use_power = HOLOPAD_PASSIVE_POWER_USAGE ++ SetLightsAndPower() + return TRUE + +-/obj/machinery/holopad/proc/move_hologram(mob/living/silicon/ai/user) ++/obj/machinery/holopad/proc/move_hologram(mob/living/user, turf/new_turf) + if(masters[user]) +- step_to(masters[user], user.eyeobj) + var/obj/effect/overlay/holo_pad_hologram/H = masters[user] +- H.loc = get_turf(user.eyeobj) ++ step_to(H, new_turf) ++ H.loc = new_turf ++ var/area/holo_area = get_area(src) ++ var/area/eye_area = new_turf.loc ++ ++ if(!(eye_area in holo_area.related)) ++ clear_holo(user) + return TRUE + ++/obj/effect/overlay/holo_pad_hologram ++ var/mob/living/Impersonation ++ var/datum/holocall/HC ++ ++/obj/effect/overlay/holo_pad_hologram/Destroy() ++ Impersonation = null ++ if(HC) ++ HC.Disconnect(HC.calling_holopad) ++ return ..() ++ + /obj/effect/overlay/holo_pad_hologram/Process_Spacemove(movement_dir = 0) + return 1 + ++/obj/effect/overlay/holo_pad_hologram/examine(mob/user) ++ if(Impersonation) ++ return Impersonation.examine(user) ++ return ..() ++ + /obj/item/weapon/circuitboard/machine/holopad + name = "AI Holopad (Machine Board)" + build_path = /obj/machinery/holopad + origin_tech = "programming=1" + req_components = list(/obj/item/weapon/stock_parts/capacitor = 1) + +-#undef RANGE_BASED +-#undef AREA_BASED + #undef HOLOPAD_PASSIVE_POWER_USAGE +-#undef HOLOGRAM_POWER_USAGE ++#undef HOLOGRAM_POWER_USAGE +\ No newline at end of file diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm index dce38bd664..56c43211e4 100644 --- a/code/modules/mob/living/silicon/ai/freelook/eye.dm +++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm @@ -28,7 +28,7 @@ //Holopad if(istype(ai.current, /obj/machinery/holopad)) var/obj/machinery/holopad/H = ai.current - H.move_hologram(ai) + H.move_hologram(ai, T) /mob/camera/aiEye/Move() return 0 diff --git a/tgstation.dme.rej b/tgstation.dme.rej new file mode 100644 index 0000000000..0f29d8f023 --- /dev/null +++ b/tgstation.dme.rej @@ -0,0 +1,9 @@ +diff a/tgstation.dme b/tgstation.dme (rejected hunks) +@@ -206,6 +206,7 @@ + #include "code\datums\emotes.dm" + #include "code\datums\forced_movement.dm" + #include "code\datums\gas_overrides.dm" ++#include "code\datums\holocall.dm" + #include "code\datums\hud.dm" + #include "code\datums\map_config.dm" + #include "code\datums\martial.dm" From 00164a49a71928a38fbd3144b20c729e638141bb Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 1 May 2017 13:06:07 -0500 Subject: [PATCH 06/92] Subsystem change for the SM and TEG and slight QoL --- code/modules/power/generator.dm | 36 ++++++++++++++----- code/modules/power/generator.dm.rej | 13 +++++++ code/modules/power/supermatter/supermatter.dm | 5 ++- 3 files changed, 44 insertions(+), 10 deletions(-) create mode 100644 code/modules/power/generator.dm.rej diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm index dfbf3fe50b..70d4ea27a2 100644 --- a/code/modules/power/generator.dm +++ b/code/modules/power/generator.dm @@ -33,6 +33,7 @@ cold_circ = locate(circpath) in get_step(src, cold_dir) hot_circ = locate(circpath) in get_step(src, hot_dir) connect_to_network() + SSair.atmos_machinery += src if(cold_circ) switch(cold_dir) @@ -54,7 +55,10 @@ stat |= BROKEN update_icon() - + +/obj/machinery/power/generator/Destroy() + SSair.atmos_machinery -= src + return ..() /obj/machinery/power/generator/update_icon() @@ -104,7 +108,7 @@ var/energy_transfer = delta_temperature*hot_air_heat_capacity*cold_air_heat_capacity/(hot_air_heat_capacity+cold_air_heat_capacity) var/heat = energy_transfer*(1-efficiency) - lastgen = energy_transfer*efficiency + lastgen += energy_transfer*efficiency //to_chat(world, "lastgen = [lastgen]; heat = [heat]; delta_temperature = [delta_temperature]; hot_air_heat_capacity = [hot_air_heat_capacity]; cold_air_heat_capacity = [cold_air_heat_capacity];") @@ -113,7 +117,7 @@ //to_chat(world, "POWER: [lastgen] W generated at [efficiency*100]% efficiency and sinks sizes [cold_air_heat_capacity], [hot_air_heat_capacity]") - add_avail(lastgen) + //add_avail(lastgen) This is done in process now // update icon overlays only if displayed level has changed if(hot_air) @@ -123,15 +127,23 @@ if(cold_air) var/datum/gas_mixture/cold_circ_air1 = cold_circ.AIR1 cold_circ_air1.merge(cold_air) + + update_icon() - var/genlev = max(0, min( round(11*lastgen / 100000), 11)) var/circ = "[cold_circ && cold_circ.last_pressure_delta > 0 ? "1" : "0"][hot_circ && hot_circ.last_pressure_delta > 0 ? "1" : "0"]" - if((genlev != lastgenlev) || (circ != lastcirc)) - lastgenlev = genlev + if(circ != lastcirc) lastcirc = circ update_icon() src.updateDialog() + +/obj/machinery/power/generator/process() + //Setting this number higher just makes the change in power output slower, it doesnt actualy reduce power output cause **math** + var/power_output = round(lastgen / 10) + add_avail(power_output) + lastgenlev = power_output + lastgen -= power_output + ..() /obj/machinery/power/generator/attack_hand(mob/user) if(..()) @@ -150,9 +162,15 @@ var/datum/gas_mixture/hot_circ_air2 = hot_circ.AIR2 t += "
" - - t += "Output: [round(lastgen)] W" - + + var/displaygen = lastgenlev + if(displaygen < 1000000) //less than a MW + displaygen /= 1000 + t += "Output: [round(displaygen,0.01)] kW" + else + displaygen /= 1000000 + t += "Output: [round(displaygen,0.01)] MW" + t += "
" t += "Cold loop
" diff --git a/code/modules/power/generator.dm.rej b/code/modules/power/generator.dm.rej new file mode 100644 index 0000000000..9de6ba6b3a --- /dev/null +++ b/code/modules/power/generator.dm.rej @@ -0,0 +1,13 @@ +diff a/code/modules/power/generator.dm b/code/modules/power/generator.dm (rejected hunks) +@@ -64,9 +64,8 @@ + else + cut_overlays() + +- var/L = min(round(lastgenlev/100000),11) +- +- if(L != 0) ++ var/L = min(round(lastgenlev/100000),11) ++ if(L != 0) + add_overlay(image('icons/obj/power.dmi', "teg-op[L]")) + + add_overlay("teg-oc[lastcirc]") diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index fee8859de4..095a023fba 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -129,6 +129,7 @@ /obj/machinery/power/supermatter_shard/New() . = ..() + SSair.atmos_machinery += src countdown = new(src) countdown.start() GLOB.poi_list |= src @@ -139,6 +140,7 @@ /obj/machinery/power/supermatter_shard/Destroy() investigate_log("has been destroyed.", "supermatter") + SSair.atmos_machinery -= src QDEL_NULL(radio) GLOB.poi_list -= src QDEL_NULL(countdown) @@ -181,7 +183,7 @@ E.energy = power qdel(src) -/obj/machinery/power/supermatter_shard/process() +/obj/machinery/power/supermatter_shard/process_atmos() var/turf/T = loc if(isnull(T)) // We have a null turf...something is wrong, stop processing this entity. @@ -296,6 +298,7 @@ if(produces_gas) env.merge(removed) + air_update_turf() for(var/mob/living/carbon/human/l in view(src, HALLUCINATION_RANGE(power))) // If they can see it without mesons on. Bad on them. if(!istype(l.glasses, /obj/item/clothing/glasses/meson)) From b45d4ba6685f3bf705d62a3f65e26e2a47c41c38 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 1 May 2017 17:32:29 -0500 Subject: [PATCH 07/92] Makes admin sound announcement use the right span --- code/modules/admin/verbs/playsound.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm index ddc44592c0..613881281e 100644 --- a/code/modules/admin/verbs/playsound.dm +++ b/code/modules/admin/verbs/playsound.dm @@ -21,7 +21,7 @@ var/res = alert(usr, "Show the title of this song to the players?",, "No", "Yes", "Cancel") switch(res) if("Yes") - to_chat(world, "An admin played: [S]") + to_chat(world, "An admin played: [S]") if("Cancel") return From d29de62d697a87b6e6b1a124d663cde2ea643294 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 1 May 2017 17:34:34 -0500 Subject: [PATCH 08/92] Plants now react with turfs on squash() --- code/modules/hydroponics/grown.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 555df764b8..5104ab333a 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -111,6 +111,7 @@ for(var/datum/plant_gene/trait/trait in seed.genes) trait.on_squash(src, target) + reagents.reaction(T) for(var/A in T) reagents.reaction(A) From aa45f555e348415c6725f6cfc72ebe32cfd39a19 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 2 May 2017 04:57:29 -0500 Subject: [PATCH 09/92] Makes the cult Talisman of Horrors ranged --- code/game/gamemodes/cult/ritual.dm | 2 +- code/game/gamemodes/cult/talisman.dm | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index 2ed6840c91..cc8c97fb9b 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -133,7 +133,7 @@ This file contains the arcane tome files. text += "Talisman of Armaments
The Talisman of Arming will equip the user with armored robes, a backpack, an eldritch longsword, an empowered bola, and a pair of boots. Any items that cannot \ be equipped will not be summoned. Attacking a fellow cultist with it will instead equip them.

" - text += "Talisman of Horrors
The Talisman of Horror must be applied directly to the victim, it will shatter your victim's mind with visions of the endtimes that may incapitate them.

" + text += "Talisman of Horrors
The Talisman of Horror, unlike other talismans, can be applied at range, without the victim noticing. It will cause the victim to have severe hallucinations after a short while.

" text += "Talisman of Shackling
The Talisman of Shackling must be applied directly to the victim, it has 4 uses and cuffs victims with magic shackles that disappear when removed.

" diff --git a/code/game/gamemodes/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm index 2876e80373..d2e1fcaf10 100644 --- a/code/game/gamemodes/cult/talisman.dm +++ b/code/game/gamemodes/cult/talisman.dm @@ -309,12 +309,12 @@ invocation = "Lo'Nab Na'Dm!" creation_time = 80 -/obj/item/weapon/paper/talisman/horror/attack(mob/living/target, mob/living/user) - if(iscultist(user)) - to_chat(user, "You disturb [target] with visons of the end!") +/obj/item/weapon/paper/talisman/horror/afterattack(mob/living/target, mob/living/user) + if(iscultist(user) && (get_dist(user, target) < 7)) + to_chat(user, "You disturb [target] with visions of madness!") if(iscarbon(target)) var/mob/living/carbon/H = target - H.reagents.add_reagent("mindbreaker", 25) + H.reagents.add_reagent("mindbreaker", 12) if(is_servant_of_ratvar(target)) to_chat(target, "You see a brief but horrible vision of Ratvar, rusted and scrapped, being torn apart.") target.emote("scream") From d422b9bb39b441b5a8d6bbcdd78d19bff417f299 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 2 May 2017 09:57:25 -0500 Subject: [PATCH 10/92] The alien hivemind uses a mob's real_name --- code/modules/mob/living/carbon/alien/say.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/alien/say.dm b/code/modules/mob/living/carbon/alien/say.dm index 72162387ee..12c131b3cc 100644 --- a/code/modules/mob/living/carbon/alien/say.dm +++ b/code/modules/mob/living/carbon/alien/say.dm @@ -1,4 +1,4 @@ -/mob/living/proc/alien_talk(message, shown_name = name) +/mob/living/proc/alien_talk(message, shown_name = real_name) log_say("[key_name(src)] : [message]") message = trim(message) if(!message) return From 7baccb8b85ffca86c37cb905fe5ca281a656d268 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 2 May 2017 12:47:20 -0500 Subject: [PATCH 11/92] Removes vestigial list from minds. --- code/datums/mind.dm | 2 -- code/modules/admin/verbs/randomverbs.dm | 1 - code/modules/spells/spell_types/mind_transfer.dm | 15 --------------- 3 files changed, 18 deletions(-) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 0acd33ad69..9e764fb5e4 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -44,9 +44,7 @@ var/datum/job/assigned_job var/list/datum/objective/objectives = list() - var/list/datum/objective/special_verbs = list() - var/list/cult_words = list() var/list/spell_list = list() // Wizard mode & "Give Spell" badmin button. var/datum/faction/faction //associated faction diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 547e8e1d03..f1bf4d6969 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -350,7 +350,6 @@ Traitors and the like can also be revived with the previous role mostly intact. if(G_found.mind && !G_found.mind.active) G_found.mind.transfer_to(new_character) //be careful when doing stuff like this! I've already checked the mind isn't in use - new_character.mind.special_verbs = list() else new_character.mind_initialize() if(!new_character.mind.assigned_role) diff --git a/code/modules/spells/spell_types/mind_transfer.dm b/code/modules/spells/spell_types/mind_transfer.dm index 7ebafe6e24..052c1f1162 100644 --- a/code/modules/spells/spell_types/mind_transfer.dm +++ b/code/modules/spells/spell_types/mind_transfer.dm @@ -62,29 +62,14 @@ Also, you never added distance checking after target is selected. I've went ahea var/mob/caster = user//The wizard/whomever doing the body transferring. //MIND TRANSFER BEGIN - if(caster.mind.special_verbs.len)//If the caster had any special verbs, remove them from the mob verb list. - for(var/V in caster.mind.special_verbs)//Since the caster is using an object spell system, this is mostly moot. - caster.verbs -= V//But a safety nontheless. - - if(victim.mind.special_verbs.len)//Now remove all of the victim's verbs. - for(var/V in victim.mind.special_verbs) - victim.verbs -= V - var/mob/dead/observer/ghost = victim.ghostize(0) caster.mind.transfer_to(victim) - if(victim.mind.special_verbs.len)//To add all the special verbs for the original caster. - for(var/V in caster.mind.special_verbs)//Not too important but could come into play. - caster.verbs += V - ghost.mind.transfer_to(caster) if(ghost.key) caster.key = ghost.key //have to transfer the key since the mind was not active qdel(ghost) - if(caster.mind.special_verbs.len)//If they had any special verbs, we add them here. - for(var/V in caster.mind.special_verbs) - caster.verbs += V //MIND TRANSFER END //Here we paralyze both mobs and knock them out for a time. From 8a221b96376abb7916103e02bb71d0fb65b60f96 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 3 May 2017 05:55:15 -0500 Subject: [PATCH 12/92] Ports pastries to Initialize --- .../food_and_drinks/food/snacks_pastry.dm | 16 ++++++++-------- .../chemistry/machinery/reagentgrinder.dm | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/code/modules/food_and_drinks/food/snacks_pastry.dm b/code/modules/food_and_drinks/food/snacks_pastry.dm index 76ef327bb6..6081838669 100644 --- a/code/modules/food_and_drinks/food/snacks_pastry.dm +++ b/code/modules/food_and_drinks/food/snacks_pastry.dm @@ -13,8 +13,8 @@ filling_color = "#D2691E" tastes = list("donut" = 1) -/obj/item/weapon/reagent_containers/food/snacks/donut/New() - ..() +/obj/item/weapon/reagent_containers/food/snacks/donut/Initialize() + . = ..() if(prob(30)) icon_state = "donut2" name = "frosted donut" @@ -28,8 +28,8 @@ bitesize = 10 tastes = list("donut" = 3, "chaos" = 1) -/obj/item/weapon/reagent_containers/food/snacks/donut/chaos/New() - ..() +/obj/item/weapon/reagent_containers/food/snacks/donut/chaos/Initialize() + . = ..() extra_reagent = pick("nutriment", "capsaicin", "frostoil", "krokodil", "plasma", "cocoa", "slimejelly", "banana", "berryjuice", "omnizine") reagents.add_reagent("[extra_reagent]", 3) bonus_reagents = list("[extra_reagent]" = 3, "sugar" = 1) @@ -48,8 +48,8 @@ extra_reagent = "berryjuice" tastes = list("jelly" = 1, "donut" = 3) -/obj/item/weapon/reagent_containers/food/snacks/donut/jelly/New() - ..() +/obj/item/weapon/reagent_containers/food/snacks/donut/jelly/Initialize() + . = ..() if(extra_reagent) reagents.add_reagent("[extra_reagent]", 3) if(prob(30)) @@ -210,13 +210,13 @@ filling_color = "#F0E68C" tastes = list("mushroom" = 1, "biscuit" = 1) -/obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit/New() +/obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit/Initialize() var/fey = prob(10) if(fey) name = "exceptional plump helmet biscuit" desc = "Microwave is taken by a fey mood! It has cooked an exceptional plump helmet biscuit!" bonus_reagents = list("omnizine" = 5, "nutriment" = 1, "vitamin" = 1) - ..() + . = ..() if(fey) reagents.add_reagent("omnizine", 5) diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm index 2dbc0ff1c2..a8ab8fd426 100644 --- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm +++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm @@ -38,7 +38,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/wheat = list("flour" = -5), /obj/item/weapon/reagent_containers/food/snacks/grown/oat = list("flour" = -5), /obj/item/weapon/reagent_containers/food/snacks/grown/rice = list("rice" = -5), - /obj/item/weapon/reagent_containers/food/snacks/donut/New = list("sprinkles" = -2, "sugar" = 1), + /obj/item/weapon/reagent_containers/food/snacks/donut = list("sprinkles" = -2, "sugar" = 1), /obj/item/weapon/reagent_containers/food/snacks/grown/cherries = list("cherryjelly" = 0), /obj/item/weapon/reagent_containers/food/snacks/grown/bluecherries = list("bluecherryjelly" = 0), /obj/item/weapon/reagent_containers/food/snacks/egg = list("eggyolk" = -5), From bafafbadf22aaed0a09b5a4f19df046419ffacb8 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 3 May 2017 22:21:55 -0500 Subject: [PATCH 13/92] Clockwork component generation is twice as fast, but scriptures cost up to twice as much --- code/__DEFINES/clockcult.dm | 14 ++++++------- .../clock_cult/clock_items/clockwork_slab.dm | 10 ++++++++-- .../scripture_applications.dm | 18 ++++++++--------- .../clock_scriptures/scripture_drivers.dm | 2 +- .../clock_scriptures/scripture_revenant.dm | 8 ++++---- .../clock_scriptures/scripture_scripts.dm | 20 +++++++++---------- .../clock_structures/tinkerers_daemon.dm | 2 +- 7 files changed, 40 insertions(+), 34 deletions(-) diff --git a/code/__DEFINES/clockcult.dm b/code/__DEFINES/clockcult.dm index 9c86e031ab..acc0cdc9ab 100644 --- a/code/__DEFINES/clockcult.dm +++ b/code/__DEFINES/clockcult.dm @@ -37,15 +37,15 @@ GLOBAL_LIST_EMPTY(all_scripture) //a list containing scripture instances; not us #define JUDGEMENT_CV_REQ 300 //general component/cooldown things -#define SLAB_PRODUCTION_TIME 900 //how long(deciseconds) slabs require to produce a single component; defaults to 1 minute 30 seconds +#define SLAB_PRODUCTION_TIME 450 //how long(deciseconds) slabs require to produce a single component; defaults to 45 seconds -#define SLAB_SERVANT_SLOWDOWN 300 //how much each servant above 5 slows down slab-based generation; defaults to 30 seconds per sevant +#define SLAB_SERVANT_SLOWDOWN 150 //how much each servant above 5 slows down slab-based generation; defaults to 15 seconds per sevant -#define SLAB_SLOWDOWN_MAXIMUM 2700 //maximum slowdown from additional servants; defaults to 4 minutes 30 seconds +#define SLAB_SLOWDOWN_MAXIMUM 1350 //maximum slowdown from additional servants; defaults to 2 minutes 15 seconds -#define CACHE_PRODUCTION_TIME 600 //how long(deciseconds) caches require to produce a component; defaults to 1 minute +#define CACHE_PRODUCTION_TIME 300 //how long(deciseconds) caches require to produce a component; defaults to 30 seconds -#define ACTIVE_CACHE_SLOWDOWN 100 //how many additional deciseconds caches take to produce a component for each linked cache; defaults to 10 seconds +#define ACTIVE_CACHE_SLOWDOWN 50 //how many additional deciseconds caches take to produce a component for each linked cache; defaults to 5 seconds #define LOWER_PROB_PER_COMPONENT 10 //how much each component in the cache reduces the weight of getting another of that component type @@ -87,9 +87,9 @@ GLOBAL_LIST_EMPTY(all_scripture) //a list containing scripture instances; not us #define GATEWAY_RATVAR_ARRIVAL 300 //when progress is at or above this, game over ratvar's here everybody go home -#define ARK_SUMMON_COST 3 //how many of each component an Ark costs to summon +#define ARK_SUMMON_COST 5 //how many of each component an Ark costs to summon -#define ARK_CONSUME_COST 7 //how many of each component an Ark needs to consume to activate +#define ARK_CONSUME_COST 15 //how many of each component an Ark needs to consume to activate //Objective text define #define CLOCKCULT_OBJECTIVE "Construct the Ark of the Clockwork Justicar and free Ratvar." diff --git a/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm b/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm index 35caabab5a..8b3aa01533 100644 --- a/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm +++ b/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm @@ -326,13 +326,19 @@ if(production_time != SLAB_PRODUCTION_TIME+SLAB_SLOWDOWN_MAXIMUM) production_text_addon = ", which increases for each human or silicon servant above [SCRIPT_SERVANT_REQ]" production_time = production_time/600 - var/production_text = "[round(production_time)] minute\s" + var/list/production_text + if(round(production_time)) + production_text = list("[round(production_time)] minute\s") if(production_time != round(production_time)) production_time -= round(production_time) production_time *= 60 - production_text += " and [round(production_time, 1)] second\s" + if(!LAZYLEN(production_text)) + production_text = list("[round(production_time, 1)] second\s") + else + production_text += " and [round(production_time, 1)] second\s" production_text += "" production_text += production_text_addon + production_text = production_text.Join() textlist = list("
Chetr nyy hagehguf-naq-ubabe Ratvar.

\ \ diff --git a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm index 25576f5710..0941d332f1 100644 --- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm +++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm @@ -10,7 +10,7 @@ It will penetrate mindshield implants once before disappearing." invocations = list("Divinity, enslave...", "...all who trespass here!") channel_time = 70 - consumed_components = list(BELLIGERENT_EYE = 2, GEIS_CAPACITOR = 1, HIEROPHANT_ANSIBLE = 1) + consumed_components = list(BELLIGERENT_EYE = 3, GEIS_CAPACITOR = 2, HIEROPHANT_ANSIBLE = 2) whispered = TRUE object_path = /obj/effect/clockwork/sigil/submission/accession prevent_path = /obj/effect/clockwork/sigil/submission @@ -32,7 +32,7 @@ It grows faster to invoke with more adjacent Servants." invocations = list("Shield us...", "...with the...", "... fragments of Engine!") channel_time = 100 - consumed_components = list(VANGUARD_COGWHEEL = 2, REPLICANT_ALLOY = 1, HIEROPHANT_ANSIBLE = 1) + consumed_components = list(VANGUARD_COGWHEEL = 3, REPLICANT_ALLOY = 2, HIEROPHANT_ANSIBLE = 2) usage_tip = "This scripture will replace all weaker armor worn by affected Servants." tier = SCRIPTURE_APPLICATION multiple_invokers_used = TRUE @@ -99,7 +99,7 @@ If it remains close to you, you will gradually regain health up to a low amount, but it will die if it goes too far from you." invocations = list("Fright's will...", "...call forth...") channel_time = 100 - consumed_components = list(BELLIGERENT_EYE = 1, VANGUARD_COGWHEEL = 1, GEIS_CAPACITOR = 2) + consumed_components = list(BELLIGERENT_EYE = 2, VANGUARD_COGWHEEL = 2, GEIS_CAPACITOR = 3) usage_tip = "Marauders are useful as personal bodyguards and frontline warriors." tier = SCRIPTURE_APPLICATION primary_component = GEIS_CAPACITOR @@ -160,7 +160,7 @@ and exceptional speed, though taking damage will temporarily slow it down." invocations = list("Call forth...", "...the soldiers of Armorer.") channel_time = 80 - consumed_components = list(BELLIGERENT_EYE = 1, VANGUARD_COGWHEEL = 1, REPLICANT_ALLOY = 2) + consumed_components = list(BELLIGERENT_EYE = 2, VANGUARD_COGWHEEL = 2, REPLICANT_ALLOY = 3) object_path = /obj/structure/destructible/clockwork/shell/fragment creator_message = "You form an anima fragment, a powerful soul vessel receptacle." observer_message = "The slab disgorges a puddle of black metal that expands and forms into a strange shell!" @@ -179,7 +179,7 @@ desc = "Places a sigil that stores energy to power clockwork structures." invocations = list("Divinity...", "...power our creations!") channel_time = 70 - consumed_components = list(VANGUARD_COGWHEEL = 1, GEIS_CAPACITOR = 1, HIEROPHANT_ANSIBLE = 2) + consumed_components = list(VANGUARD_COGWHEEL = 2, GEIS_CAPACITOR = 2, HIEROPHANT_ANSIBLE = 3) whispered = TRUE object_path = /obj/effect/clockwork/sigil/transmission creator_message = "A sigil silently appears below you. It will automatically power clockwork structures near it." @@ -199,7 +199,7 @@ desc = "Creates a clockwork totem that sabotages nearby machinery and funnels drained power into nearby Sigils of Transmission or the area's APC." invocations = list("May this totem...", "...shroud the false suns!") channel_time = 80 - consumed_components = list(BELLIGERENT_EYE = 3, REPLICANT_ALLOY = 1, HIEROPHANT_ANSIBLE = 1) + consumed_components = list(BELLIGERENT_EYE = 5, REPLICANT_ALLOY = 2, HIEROPHANT_ANSIBLE = 2) object_path = /obj/structure/destructible/clockwork/powered/interdiction_lens creator_message = "You form an interdiction lens, which disrupts cameras and radios and drains power." observer_message = "A brass totem rises from the ground, a purple gem appearing in its center!" @@ -221,7 +221,7 @@ desc = "Creates a mania motor which will cause brain damage and hallucinations in nearby non-Servant humans. It will also try to convert humans directly adjecent to the motor." invocations = list("May this transmitter...", "...break the will of all who oppose us!") channel_time = 80 - consumed_components = list(GEIS_CAPACITOR = 3, REPLICANT_ALLOY = 1, HIEROPHANT_ANSIBLE = 1) + consumed_components = list(GEIS_CAPACITOR = 5, REPLICANT_ALLOY = 2, HIEROPHANT_ANSIBLE = 2) object_path = /obj/structure/destructible/clockwork/powered/mania_motor creator_message = "You form a mania motor which will cause brain damage and hallucinations in nearby humans while active." observer_message = "A two-pronged machine rises from the ground!" @@ -244,7 +244,7 @@ and there is at least one existing cache." invocations = list("May this generator...", "...collect Engine parts that yet hold greatness!") channel_time = 80 - consumed_components = list(BELLIGERENT_EYE = 1, GEIS_CAPACITOR = 1, REPLICANT_ALLOY = 3) + consumed_components = list(BELLIGERENT_EYE = 2, GEIS_CAPACITOR = 2, REPLICANT_ALLOY = 5) object_path = /obj/structure/destructible/clockwork/powered/tinkerers_daemon creator_message = "You form a tinkerer's daemon which can rapidly collect components at a power cost." invokers_required = 2 @@ -278,7 +278,7 @@ desc = "Creates a clockwork obelisk that can broadcast messages over the Hierophant Network or open a Spatial Gateway to any living Servant or clockwork obelisk." invocations = list("May this obelisk...", "...take us to all places!") channel_time = 80 - consumed_components = list(BELLIGERENT_EYE = 1, VANGUARD_COGWHEEL = 1, HIEROPHANT_ANSIBLE = 3) + consumed_components = list(BELLIGERENT_EYE = 2, VANGUARD_COGWHEEL = 2, HIEROPHANT_ANSIBLE = 5) object_path = /obj/structure/destructible/clockwork/powered/clockwork_obelisk creator_message = "You form a clockwork obelisk which can broadcast messages or produce Spatial Gateways." observer_message = "A brass obelisk appears hanging in midair!" diff --git a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm index 023cd50dd1..f246034884 100644 --- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm +++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm @@ -272,7 +272,7 @@ var/static/prev_cost = 0 /datum/clockwork_scripture/create_object/tinkerers_cache/creation_update() - var/cache_cost_increase = min(round(GLOB.clockwork_caches*0.25), 5) + var/cache_cost_increase = min(round(GLOB.clockwork_caches*0.4), 10) if(cache_cost_increase != prev_cost) prev_cost = cache_cost_increase consumed_components = list(BELLIGERENT_EYE = 0, VANGUARD_COGWHEEL = 0, GEIS_CAPACITOR = 0, REPLICANT_ALLOY = 1, HIEROPHANT_ANSIBLE = 0) diff --git a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_revenant.dm b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_revenant.dm index 0dbd2d46e8..25bedd79d3 100644 --- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_revenant.dm +++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_revenant.dm @@ -9,7 +9,7 @@ desc = "Taps the limitless power of Inath-neq, one of Ratvar's four generals. The benevolence of Inath-Neq will grant complete invulnerability to all Servants in range for fifteen seconds." invocations = list("I call upon you, Vanguard!!", "Let the Resonant Cogs turn once more!!", "Grant me and my allies the strength to vanquish our foes!!") channel_time = 100 - consumed_components = list(VANGUARD_COGWHEEL = 4, GEIS_CAPACITOR = 2, REPLICANT_ALLOY = 2, HIEROPHANT_ANSIBLE = 2) + consumed_components = list(VANGUARD_COGWHEEL = 10, GEIS_CAPACITOR = 3, REPLICANT_ALLOY = 3, HIEROPHANT_ANSIBLE = 3) usage_tip = "Servants affected by this scripture are only weak to things that outright destroy bodies, such as bombs or the singularity." tier = SCRIPTURE_REVENANT primary_component = VANGUARD_COGWHEEL @@ -44,7 +44,7 @@ for all non-servant humans on the same z-level as them. The power of this scripture falls off somewhat with distance, and certain things may reduce its effects." invocations = list("I call upon you, Fright!!", "Let your power shatter the sanity of the weak-minded!!", "Let your tendrils hold sway over all!!") channel_time = 150 - consumed_components = list(BELLIGERENT_EYE = 3, VANGUARD_COGWHEEL = 3, GEIS_CAPACITOR = 6, HIEROPHANT_ANSIBLE = 3) + consumed_components = list(BELLIGERENT_EYE = 6, VANGUARD_COGWHEEL = 6, GEIS_CAPACITOR = 10, HIEROPHANT_ANSIBLE = 6) usage_tip = "Causes brain damage, hallucinations, confusion, and dizziness in massive amounts." tier = SCRIPTURE_REVENANT sort_priority = 3 @@ -108,7 +108,7 @@ clockwork proselytizers will charge very rapidly." invocations = list("I call upon you, Armorer!!", "Let your machinations reign on this miserable station!!", "Let your power flow through the tools of your master!!") channel_time = 150 - consumed_components = list(BELLIGERENT_EYE = 3, VANGUARD_COGWHEEL = 3, GEIS_CAPACITOR = 3, REPLICANT_ALLOY = 6) + consumed_components = list(BELLIGERENT_EYE = 6, VANGUARD_COGWHEEL = 6, GEIS_CAPACITOR = 6, REPLICANT_ALLOY = 10) usage_tip = "Ocular wardens will become empowered, clockwork proselytizers will require no alloy, tinkerer's daemons will produce twice as quickly, \ and interdiction lenses, mania motors, tinkerer's daemons, and clockwork obelisks will all require no power." tier = SCRIPTURE_REVENANT @@ -153,7 +153,7 @@ will be struck by devastating lightning bolts." invocations = list("I call upon you, Amperage!!", "Let your energy flow through me!!", "Let your boundless power shatter stars!!") channel_time = 100 - consumed_components = list(BELLIGERENT_EYE = 2, GEIS_CAPACITOR = 2, REPLICANT_ALLOY = 2, HIEROPHANT_ANSIBLE = 4) + consumed_components = list(BELLIGERENT_EYE = 3, GEIS_CAPACITOR = 3, REPLICANT_ALLOY = 3, HIEROPHANT_ANSIBLE = 10) usage_tip = "Struck targets will also be knocked down for about sixteen seconds." tier = SCRIPTURE_REVENANT primary_component = HIEROPHANT_ANSIBLE diff --git a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_scripts.dm b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_scripts.dm index f7fcc8c299..01fc369c8f 100644 --- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_scripts.dm +++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_scripts.dm @@ -9,7 +9,7 @@ desc = "Forms an automatic short-range turret which will automatically attack nearby unrestrained non-Servants that can see it." invocations = list("Guardians...", "...of the Engine...", "...defend us!") channel_time = 120 - consumed_components = list(BELLIGERENT_EYE = 1, REPLICANT_ALLOY = 1) + consumed_components = list(BELLIGERENT_EYE = 2, REPLICANT_ALLOY = 1) object_path = /obj/structure/destructible/clockwork/ocular_warden creator_message = "You form an ocular warden, which will automatically attack nearby unrestrained non-Servants that can see it." observer_message = "A brass eye takes shape and slowly rises into the air, its red iris glaring!" @@ -36,7 +36,7 @@ desc = "Creates a small shell fitted for soul vessels. Adding an active soul vessel to it results in a small construct with tools and an inbuilt proselytizer." invocations = list("Call forth...", "...the workers of Armorer.") channel_time = 60 - consumed_components = list(BELLIGERENT_EYE = 1, HIEROPHANT_ANSIBLE = 1) + consumed_components = list(BELLIGERENT_EYE = 2, HIEROPHANT_ANSIBLE = 1) object_path = /obj/structure/destructible/clockwork/shell/cogscarab creator_message = "You form a cogscarab, a constructor soul vessel receptacle." observer_message = "The slab disgorges a puddle of black metal that contracts and forms into a strange shell!" @@ -56,7 +56,7 @@ Matrices have drained from non-Servants. Dead Servants can be revived by this sigil if there is vitality equal to the target Servant's non-oxygen damage." invocations = list("Divinity...", "...steal their life...", "...for these shells!") channel_time = 60 - consumed_components = list(BELLIGERENT_EYE = 1, VANGUARD_COGWHEEL = 1) + consumed_components = list(BELLIGERENT_EYE = 1, VANGUARD_COGWHEEL = 2) whispered = TRUE object_path = /obj/effect/clockwork/sigil/vitality creator_message = "A vitality matrix appears below you. It will drain life from non-Servants and heal Servants that cross it." @@ -77,7 +77,7 @@ chant_invocations = list("Mend our dents!", "Heal our scratches!", "Repair our gears!") chant_amount = 10 chant_interval = 20 - consumed_components = list(VANGUARD_COGWHEEL = 1, REPLICANT_ALLOY = 1) + consumed_components = list(VANGUARD_COGWHEEL = 2, REPLICANT_ALLOY = 1) usage_tip = "This is a very effective way to rapidly reinforce a base after an attack." tier = SCRIPTURE_SCRIPT primary_component = VANGUARD_COGWHEEL @@ -187,7 +187,7 @@ desc = "Places a luminous sigil that will enslave any valid beings standing on it after a time." invocations = list("Divinity, enlighten...", "...those who trespass here!") channel_time = 60 - consumed_components = list(BELLIGERENT_EYE = 1, GEIS_CAPACITOR = 1) + consumed_components = list(BELLIGERENT_EYE = 1, GEIS_CAPACITOR = 2) whispered = TRUE object_path = /obj/effect/clockwork/sigil/submission creator_message = "A luminous sigil appears below you. The next non-servant to cross it will be enslaved after a brief time if they do not move." @@ -207,7 +207,7 @@ desc = "Forms an ancient positronic brain with an overriding directive to serve Ratvar." invocations = list("Herd the souls of...", "...the blasphemous damned!") channel_time = 30 - consumed_components = list(VANGUARD_COGWHEEL = 1, GEIS_CAPACITOR = 1) + consumed_components = list(VANGUARD_COGWHEEL = 1, GEIS_CAPACITOR = 2) whispered = TRUE object_path = /obj/item/device/mmi/posibrain/soul_vessel creator_message = "You form a soul vessel, which can be used in-hand to attract spirits, or used on an unconscious or dead human to extract their consciousness." @@ -227,7 +227,7 @@ desc = "Forms a device that, when used on certain objects, converts them into their Ratvarian equivalents. It requires power to function." invocations = list("With this device...", "...his presence shall be made known.") channel_time = 20 - consumed_components = list(GEIS_CAPACITOR = 1, REPLICANT_ALLOY = 1) + consumed_components = list(GEIS_CAPACITOR = 1, REPLICANT_ALLOY = 2) whispered = TRUE object_path = /obj/item/clockwork/clockwork_proselytizer/preloaded creator_message = "You form a clockwork proselytizer." @@ -248,7 +248,7 @@ vanish three minutes after being summoned." invocations = list("Grant me...", "...the might of brass!") channel_time = 20 - consumed_components = list(REPLICANT_ALLOY = 1, HIEROPHANT_ANSIBLE = 1) + consumed_components = list(REPLICANT_ALLOY = 2, HIEROPHANT_ANSIBLE = 1) whispered = TRUE usage_tip = "You can impale human targets with the spear by pulling them, then attacking. Throwing the spear at a mob will do massive damage and stun them, but break the spear." tier = SCRIPTURE_SCRIPT @@ -307,7 +307,7 @@ Each servant assisting in the invocation adds one additional use and four additional seconds to the gateway's uses and duration." invocations = list("Spatial Gateway...", "...activate!") channel_time = 80 - consumed_components = list(VANGUARD_COGWHEEL = 1, HIEROPHANT_ANSIBLE = 1) + consumed_components = list(VANGUARD_COGWHEEL = 1, HIEROPHANT_ANSIBLE = 2) multiple_invokers_used = TRUE multiple_invokers_optional = TRUE usage_tip = "This gateway is strictly one-way and will only allow things through the invoker's portal." @@ -356,7 +356,7 @@ chant_invocations = list("Use charge to kill!", "Slay with power!", "Hunt with energy!") chant_amount = 4 chant_interval = 5 - consumed_components = list(GEIS_CAPACITOR = 1, HIEROPHANT_ANSIBLE = 1) + consumed_components = list(GEIS_CAPACITOR = 1, HIEROPHANT_ANSIBLE = 2) usage_tip = "Though it requires you to stand still, this scripture can do massive damage." tier = SCRIPTURE_SCRIPT primary_component = HIEROPHANT_ANSIBLE diff --git a/code/game/gamemodes/clock_cult/clock_structures/tinkerers_daemon.dm b/code/game/gamemodes/clock_cult/clock_structures/tinkerers_daemon.dm index 22ea9e2ce5..b0a17338ff 100644 --- a/code/game/gamemodes/clock_cult/clock_structures/tinkerers_daemon.dm +++ b/code/game/gamemodes/clock_cult/clock_structures/tinkerers_daemon.dm @@ -18,7 +18,7 @@ var/static/mutable_appearance/component_glow = mutable_appearance('icons/obj/clockwork_objects.dmi', "t_random_component") var/component_id_to_produce var/production_time = 0 //last time we produced a component - var/production_cooldown = 120 + var/production_cooldown = 60 /obj/structure/destructible/clockwork/powered/tinkerers_daemon/Initialize() . = ..() From 3deafbe39b878798b618f6d1ecc8cae7e00353c2 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 3 May 2017 22:21:58 -0500 Subject: [PATCH 14/92] Plasma vessels regenerate slowly off resin --- code/modules/mob/living/carbon/alien/organs.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/mob/living/carbon/alien/organs.dm b/code/modules/mob/living/carbon/alien/organs.dm index 8a9ee012d9..f9bd64153e 100644 --- a/code/modules/mob/living/carbon/alien/organs.dm +++ b/code/modules/mob/living/carbon/alien/organs.dm @@ -87,6 +87,8 @@ owner.adjustFireLoss(-heal_amt) owner.adjustOxyLoss(-heal_amt) owner.adjustCloneLoss(-heal_amt) + else + owner.adjustPlasma(plasma_rate * 0.1) /obj/item/organ/alien/plasmavessel/Insert(mob/living/carbon/M, special = 0) ..() From e3ebd661a88a865b5791044bf0d6d1efbdde5d61 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 3 May 2017 22:22:03 -0500 Subject: [PATCH 15/92] gives omega shuttle lights --- _maps/map_files/OmegaStation/OmegaStation.dmm | 52 +++++++++++++++++-- 1 file changed, 48 insertions(+), 4 deletions(-) diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm index 0e3fea852f..06533475dd 100644 --- a/_maps/map_files/OmegaStation/OmegaStation.dmm +++ b/_maps/map_files/OmegaStation/OmegaStation.dmm @@ -16523,6 +16523,9 @@ /obj/machinery/status_display{ pixel_x = -32 }, +/obj/machinery/light{ + dir = 8 + }, /turf/open/floor/mineral/plastitanium/brig, /area/shuttle/escape) "aAb" = ( @@ -16558,6 +16561,9 @@ "aAf" = ( /obj/structure/table/reinforced, /obj/item/weapon/storage/fancy/donut_box, +/obj/machinery/light{ + dir = 4 + }, /turf/open/floor/plasteel/vault{ dir = 8 }, @@ -24133,6 +24139,9 @@ }, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery, +/obj/machinery/light{ + dir = 8 + }, /turf/open/floor/plasteel, /area/shuttle/escape) "aME" = ( @@ -24187,6 +24196,9 @@ /obj/machinery/status_display{ pixel_x = 32 }, +/obj/machinery/light{ + dir = 4 + }, /turf/open/floor/plasteel/whiteblue/side{ dir = 5 }, @@ -41920,6 +41932,38 @@ /area/ruin/unpowered{ name = "Asteroid" }) +"bvO" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/neutral/side{ + dir = 1 + }, +/area/shuttle/escape) +"bvP" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/shuttle/escape) +"bvQ" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/shuttle/escape) +"bvR" = ( +/obj/machinery/light, +/turf/open/floor/plasteel/neutral/side, +/area/shuttle/escape) (1,1,1) = {" aaa @@ -94203,7 +94247,7 @@ aAb axY aDl aEi -aEi +bvP aEi aEi aEi @@ -94715,13 +94759,13 @@ axY aAc axY aCp -aDl +bvO aEk aEj aGd aEl aEk -aJf +bvR aKn aLz axY @@ -95231,7 +95275,7 @@ aAd aCq aDl aEm -aEm +bvQ aEm aEm aEm From b7d451cbe9538e631133d3e1afcb3f826d067a6a Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 3 May 2017 22:22:19 -0500 Subject: [PATCH 16/92] Gives ears, eyes, and vocal cords plural gender --- code/modules/surgery/organs/ears.dm | 1 + code/modules/surgery/organs/eyes.dm | 1 + code/modules/surgery/organs/vocal_cords.dm | 1 + 3 files changed, 3 insertions(+) diff --git a/code/modules/surgery/organs/ears.dm b/code/modules/surgery/organs/ears.dm index c91cb219af..e66346a2c8 100644 --- a/code/modules/surgery/organs/ears.dm +++ b/code/modules/surgery/organs/ears.dm @@ -4,6 +4,7 @@ desc = "There are three parts to the ear. Inner, middle and outer. Only one of these parts should be normally visible." zone = "head" slot = "ears" + gender = PLURAL // `deaf` measures "ticks" of deafness. While > 0, the person is unable // to hear anything. diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm index 672ac924ad..2cb2dd5dc6 100644 --- a/code/modules/surgery/organs/eyes.dm +++ b/code/modules/surgery/organs/eyes.dm @@ -4,6 +4,7 @@ desc = "I see you!" zone = "eyes" slot = "eye_sight" + gender = PLURAL var/sight_flags = 0 var/see_in_dark = 2 diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index a2048c2b71..e4ab2199ad 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -8,6 +8,7 @@ icon_state = "appendix" zone = "mouth" slot = "vocal_cords" + gender = PLURAL var/list/spans = null /obj/item/organ/vocal_cords/proc/can_speak_with() //if there is any limitation to speaking with these cords From 0dff1569a1164a75f9621a43b29fe99b2da264ba Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 3 May 2017 22:22:23 -0500 Subject: [PATCH 17/92] adds a safety catch to spin() --- code/modules/mob/mob.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 24b4d228cc..39d0f1b222 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -351,6 +351,8 @@ /mob/proc/spin(spintime, speed) set waitfor = 0 var/D = dir + if((spintime <= 1)||(speed <= 1)||!spintime||!speed) + return while(spintime >= speed) sleep(speed) switch(D) From 021f55a4d1cc5086dbfaa3a0f9346ae02816970c Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 3 May 2017 22:22:26 -0500 Subject: [PATCH 18/92] Fixes alien eggs --- code/game/objects/structures/aliens.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm index d46136a9ae..6212133b12 100644 --- a/code/game/objects/structures/aliens.dm +++ b/code/game/objects/structures/aliens.dm @@ -298,7 +298,7 @@ else for(var/mob/M in range(1,src)) if(CanHug(M)) - child.Attach(M) + child.Leap(M) break /obj/structure/alien/egg/obj_break(damage_flag) From 0639a543461e040d0c4a88bdf2584ee532770ff0 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 May 2017 06:01:53 -0500 Subject: [PATCH 19/92] Hopefully makes flightsuit processing less taxing on the server --- .../modules/clothing/spacesuits/flightsuit.dm | 25 +++++-------------- 1 file changed, 6 insertions(+), 19 deletions(-) diff --git a/code/modules/clothing/spacesuits/flightsuit.dm b/code/modules/clothing/spacesuits/flightsuit.dm index 275ad542b5..479ad77742 100644 --- a/code/modules/clothing/spacesuits/flightsuit.dm +++ b/code/modules/clothing/spacesuits/flightsuit.dm @@ -326,9 +326,6 @@ disable_flight(1) if(!suit) disable_flight(1) - if(!resync) - addtimer(CALLBACK(src, .proc/resync), 600) - resync = 1 if(!wearer) //Oh god our user fell off! disable_flight(1) if(!pressure && brake) @@ -340,12 +337,6 @@ stabilizer = FALSE usermessage("Warning: Sensor data is not being recieved from flight shoes. Stabilizers and airbrake modules OFFLINE!", 2) -//Resync the suit -/obj/item/device/flightpack/proc/resync() - resync = FALSE - suit.resync() - -//How fast should the wearer be? /obj/item/device/flightpack/proc/update_slowdown() if(!flight) suit.slowdown = slowdown_ground @@ -356,20 +347,11 @@ /obj/item/device/flightpack/process() if(!suit || (processing_mode == FLIGHTSUIT_PROCESSING_NONE)) return FALSE - update_slowdown() - update_icon() check_conditions() calculate_momentum_speed() momentum_drift() handle_boost() handle_damage() - handle_flight() - -/obj/item/device/flightpack/proc/handle_flight() - if(!flight) - return FALSE - if(wearer) - wearer.float(TRUE) /obj/item/device/flightpack/proc/handle_damage() if(crash_damage) @@ -424,7 +406,6 @@ if(boost_charge < boost_maxcharge) boost_charge = Clamp(boost_charge+boost_chargerate, 0, boost_maxcharge) - /obj/item/device/flightpack/proc/cycle_power() if(powersetting < powersetting_high) powersetting++ @@ -654,6 +635,8 @@ wearer.movement_type |= FLYING wearer.pass_flags |= flight_passflags usermessage("ENGAGING FLIGHT ENGINES.") + update_slowdown() + wearer.floating = TRUE wearer.visible_message("[wearer]'s flight engines activate as they lift into the air!") //I DONT HAVE SOUND EFFECTS YET playsound( flight = TRUE @@ -670,6 +653,8 @@ momentum_x = 0 momentum_y = 0 usermessage("DISENGAGING FLIGHT ENGINES.") + update_slowdown() + wearer.floating = FALSE wearer.visible_message("[wearer] drops to the ground as their flight engines cut out!") //NO SOUND YET playsound( ion_trail.stop() @@ -749,11 +734,13 @@ wearer.visible_message("[wearer.name]'s flightpack engines flare in intensity as they are rocketed forward by the immense thrust!") boost = TRUE update_slowdown() + update_icon() /obj/item/device/flightpack/proc/deactivate_booster() usermessage("Boosters disengaged!") boost = FALSE update_slowdown() + update_icon() /obj/item/device/flightpack/proc/enable_airbrake() if(wearer) From 8369ed376fb6706b12fdc680f472e7ea6132593a Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 May 2017 06:06:05 -0500 Subject: [PATCH 20/92] Revenant now goes into stasis until ectoplasm is destroyed [FINISHED] --- .../gamemodes/miniantags/revenant/revenant.dm | 67 +++++++++++++------ 1 file changed, 46 insertions(+), 21 deletions(-) diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm index 7260d8221f..265688a15b 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant.dm @@ -14,6 +14,7 @@ var/icon_reveal = "revenant_revealed" var/icon_stun = "revenant_stun" var/icon_drain = "revenant_draining" + var/stasis = 0 incorporeal_move = 3 invisibility = INVISIBILITY_REVENANT health = INFINITY //Revenants don't use health, they use essence instead @@ -94,6 +95,8 @@ //Life, Stat, Hud Updates, and Say /mob/living/simple_animal/revenant/Life() + if(stasis) + return if(revealed && essence <= 0) death() if(unreveal_time && world.time >= unreveal_time) @@ -200,9 +203,8 @@ death() /mob/living/simple_animal/revenant/death() - if(!revealed || stat == DEAD) //Revenants cannot die if they aren't revealed //or are already dead + if(!revealed || stasis) //Revenants cannot die if they aren't revealed //or are already dead return 0 - ..(1) to_chat(src, "NO! No... it's too late, you can feel your essence [pick("breaking apart", "drifting away")]...") notransform = TRUE revealed = TRUE @@ -217,9 +219,12 @@ var/reforming_essence = essence_regen_cap //retain the gained essence capacity var/obj/item/weapon/ectoplasm/revenant/R = new(get_turf(src)) R.essence = max(reforming_essence - 15 * perfectsouls, 75) //minus any perfect souls - R.client_to_revive = src.client //If the essence reforms, the old revenant is put back in the body - ghostize() - qdel(src) + R.client_to_revive = client //If the essence reforms, the old revenant is put back in the body + R.revenant = src + invisibility = INVISIBILITY_ABSTRACT + revealed = 0 + stasis = 1 + ghostize(0)//Don't re-enter invisible corpse return @@ -302,6 +307,18 @@ to_chat(src, "Lost [essence_amt]E[source ? " from [source]":""].") return 1 +/mob/living/simple_animal/revenant/proc/death_reset() + revealed = FALSE + unreveal_time = 0 + notransform = 0 + unstun_time = 0 + inhibited = FALSE + draining = FALSE + incorporeal_move = 3 + invisibility = INVISIBILITY_REVENANT + alpha=255 + stasis = 0 + //reforming /obj/item/weapon/ectoplasm/revenant @@ -314,11 +331,15 @@ var/reforming = TRUE var/inert = FALSE var/client/client_to_revive + var/mob/living/simple_animal/revenant/revenant /obj/item/weapon/ectoplasm/revenant/New() ..() addtimer(CALLBACK(src, .proc/try_reform), 600) +/obj/item/weapon/ectoplasm/revenant/proc/scatter() + qdel(src) + /obj/item/weapon/ectoplasm/revenant/proc/try_reform() if(reforming) reforming = FALSE @@ -333,14 +354,14 @@ user.visible_message("[user] scatters [src] in all directions.", \ "You scatter [src] across the area. The particles slowly fade away.") user.drop_item() - qdel(src) + scatter() /obj/item/weapon/ectoplasm/revenant/throw_impact(atom/hit_atom) ..() if(inert) return visible_message("[src] breaks into particles upon impact, which fade away to nothingness.") - qdel(src) + scatter() /obj/item/weapon/ectoplasm/revenant/examine(mob/user) ..() @@ -350,47 +371,51 @@ to_chat(user, "It is shifting and distorted. It would be wise to destroy this.") /obj/item/weapon/ectoplasm/revenant/proc/reform() - if(QDELETED(src) || inert) + if(QDELETED(src) || QDELETED(revenant) || inert) return var/key_of_revenant message_admins("Revenant ectoplasm was left undestroyed for 1 minute and is reforming into a new revenant.") loc = get_turf(src) //In case it's in a backpack or someone's hand - var/mob/living/simple_animal/revenant/R = new(get_turf(src)) + revenant.forceMove(loc) if(client_to_revive) for(var/mob/M in GLOB.dead_mob_list) if(M.client == client_to_revive) //Only recreates the mob if the mob the client is in is dead - R.client = client_to_revive + revenant.client = client_to_revive key_of_revenant = client_to_revive.key if(!key_of_revenant) message_admins("The new revenant's old client either could not be found or is in a new, living mob - grabbing a random candidate instead...") - var/list/candidates = get_candidates(ROLE_REVENANT) + var/list/candidates = pollCandidatesForMob("Do you want to be [revenant.name] (reforming)?", "revenant", null, ROLE_REVENANT, 50, revenant) if(!candidates.len) - qdel(R) + qdel(revenant) message_admins("No candidates were found for the new revenant. Oh well!") inert = TRUE visible_message("[src] settles down and seems lifeless.") return var/client/C = pick(candidates) + revenant.client = C key_of_revenant = C.key if(!key_of_revenant) - qdel(R) + qdel(revenant) message_admins("No ckey was found for the new revenant. Oh well!") inert = TRUE visible_message("[src] settles down and seems lifeless.") return - var/datum/mind/player_mind = new /datum/mind(key_of_revenant) - R.essence_regen_cap = essence - R.essence = R.essence_regen_cap - player_mind.active = 1 - player_mind.transfer_to(R) - player_mind.assigned_role = "revenant" - player_mind.special_role = "Revenant" - SSticker.mode.traitors |= player_mind + message_admins("[key_of_revenant] has been [client_to_revive ? "re":""]made into a revenant by reforming ectoplasm.") log_game("[key_of_revenant] was [client_to_revive ? "re":""]made as a revenant by reforming ectoplasm.") visible_message("[src] suddenly rises into the air before fading away.") + + revenant.essence = essence + revenant.essence_regen_cap = essence + revenant.death_reset() + revenant.key = key_of_revenant + revenant = null qdel(src) +/obj/item/weapon/ectoplasm/revenant/Destroy() + if(!QDELETED(revenant)) + qdel(revenant) + ..() //objectives /datum/objective/revenant From a54b541635ef6ef203a55bd486bc68806f059b73 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 May 2017 06:07:09 -0500 Subject: [PATCH 21/92] Turrets no longer target invisible creatures --- code/game/machinery/porta_turret/portable_turret.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index b8ba21fd35..727124276b 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -364,6 +364,10 @@ var/list/targets = list() var/turretview = view(scan_range, base) for(var/A in turretview) + var/atom/AA = A + if(AA.invisibility>SEE_INVISIBLE_LIVING) + continue + if(check_anomalies)//if it's set to check for simple animals if(istype(A, /mob/living/simple_animal)) var/mob/living/simple_animal/SA = A From 7c56c058b304700286f67f279220b8081e819696 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 May 2017 06:11:22 -0500 Subject: [PATCH 22/92] Adds examining mouths with flashlights --- code/game/objects/items/devices/flashlight.dm | 119 ++++++++++++++---- 1 file changed, 96 insertions(+), 23 deletions(-) diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 6955872c27..9131c02240 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -37,9 +37,9 @@ return 1 -/obj/item/device/flashlight/attack(mob/living/carbon/human/M, mob/living/carbon/human/user) +/obj/item/device/flashlight/attack(mob/living/carbon/M, mob/living/carbon/human/user) add_fingerprint(user) - if(on && user.zone_selected == "eyes") + if(istype(M) && on && user.zone_selected in list("eyes", "mouth")) if((user.disabilities & CLUMSY || user.getBrainLoss() >= 60) && prob(50)) //too dumb to use flashlight properly return ..() //just hit them in the head @@ -48,28 +48,101 @@ to_chat(user, "You don't have the dexterity to do this!") return - var/mob/living/carbon/human/H = M //mob has protective eyewear - if(ishuman(M) && ((H.head && H.head.flags_cover & HEADCOVERSEYES) || (H.wear_mask && H.wear_mask.flags_cover & MASKCOVERSEYES) || (H.glasses && H.glasses.flags_cover & GLASSESCOVERSEYES))) - to_chat(user, "You're going to need to remove that [(H.head && H.head.flags_cover & HEADCOVERSEYES) ? "helmet" : (H.wear_mask && H.wear_mask.flags_cover & MASKCOVERSEYES) ? "mask": "glasses"] first.") + if(!M.get_bodypart("head")) + to_chat(user, "[M] doesn't have a head!") return - if(M == user) //they're using it on themselves - if(M.flash_act(visual = 1)) - M.visible_message("[M] directs [src] to [M.p_their()] eyes.", "You wave the light in front of your eyes! Trippy!") - else - M.visible_message("[M] directs [src] to [M.p_their()] eyes.", "You wave the light in front of your eyes.") - else - user.visible_message("[user] directs [src] to [M]'s eyes.", \ - "You direct [src] to [M]'s eyes.") - var/mob/living/carbon/C = M - if(istype(C)) - if(C.stat == DEAD || (C.disabilities & BLIND)) //mob is dead or fully blind - to_chat(user, "[C] pupils don't react to the light!") - else if(C.dna.check_mutation(XRAY)) //mob has X-RAY vision - to_chat(user, "[C] pupils give an eerie glow!") - else //they're okay! - if(C.flash_act(visual = 1)) - to_chat(user, "[C]'s pupils narrow.") + switch(user.zone_selected) + if("eyes") + if((M.head && M.head.flags_cover & HEADCOVERSEYES) || (M.wear_mask && M.wear_mask.flags_cover & MASKCOVERSEYES) || (M.glasses && M.glasses.flags_cover & GLASSESCOVERSEYES)) + to_chat(user, "You're going to need to remove that [(M.head && M.head.flags_cover & HEADCOVERSEYES) ? "helmet" : (M.wear_mask && M.wear_mask.flags_cover & MASKCOVERSEYES) ? "mask": "glasses"] first.") + return + + var/obj/item/organ/eyes/E = M.getorganslot("eye_sight") + if(!E) + to_chat(user, "[M] doesn't have any eyes!") + return + + if(M == user) //they're using it on themselves + if(M.flash_act(visual = 1)) + M.visible_message("[M] directs [src] to [M.p_their()] eyes.", "You wave the light in front of your eyes! Trippy!") + else + M.visible_message("[M] directs [src] to [M.p_their()] eyes.", "You wave the light in front of your eyes.") + else + user.visible_message("[user] directs [src] to [M]'s eyes.", \ + "You direct [src] to [M]'s eyes.") + if(M.stat == DEAD || (M.disabilities & BLIND) || !M.flash_act(visual = 1)) //mob is dead or fully blind + to_chat(user, "[M]'s pupils don't react to the light!") + else if(M.dna && M.dna.check_mutation(XRAY)) //mob has X-RAY vision + to_chat(user, "[M]'s pupils give an eerie glow!") + else //they're okay! + to_chat(user, "[M]'s pupils narrow.") + + if("mouth") + + if((M.head && M.head.flags_cover & HEADCOVERSMOUTH) || (M.wear_mask && M.wear_mask.flags_cover & MASKCOVERSMOUTH)) + to_chat(user, "You're going to need to remove that [(M.head && M.head.flags_cover & HEADCOVERSMOUTH) ? "helmet" : "mask"] first.") + return + + var/their = M.p_their() + + var/list/mouth_organs = new + for(var/obj/item/organ/O in M.internal_organs) + if(O.zone == "mouth") + mouth_organs.Add(O) + var/organ_list = "" + var/organ_count = LAZYLEN(mouth_organs) + if(organ_count) + for(var/I in 1 to organ_count) + if(I > 1) + if(I == mouth_organs.len) + organ_list += ", and " + else + organ_list += ", " + var/obj/item/organ/O = mouth_organs[I] + organ_list += (O.gender == "plural" ? O.name : "\an [O.name]") + + var/pill_count = 0 + for(var/datum/action/item_action/hands_free/activate_pill/AP in M.actions) + pill_count++ + + if(M == user) + var/can_use_mirror = FALSE + if(isturf(user.loc)) + var/obj/structure/mirror/mirror = locate(/obj/structure/mirror, user.loc) + if(mirror) + switch(user.dir) + if(NORTH) + can_use_mirror = mirror.pixel_y > 0 + if(SOUTH) + can_use_mirror = mirror.pixel_y < 0 + if(EAST) + can_use_mirror = mirror.pixel_x > 0 + if(WEST) + can_use_mirror = mirror.pixel_x < 0 + + M.visible_message("[M] directs [src] to [their] mouth.", \ + "You point [src] into your mouth.") + if(!can_use_mirror) + to_chat(user, "You can't see anything without a mirror.") + return + if(organ_count) + to_chat(user, "Inside your mouth [organ_count > 1 ? "are" : "is"] [organ_list].") + else + to_chat(user, "There's nothing inside your mouth.") + if(pill_count) + to_chat(user, "You have [pill_count] implanted pill[pill_count > 1 ? "s" : ""].") + + else + user.visible_message("[user] directs [src] to [M]'s mouth.",\ + "You direct [src] to [M]'s mouth.") + if(organ_count) + to_chat(user, "Inside [their] mouth [organ_count > 1 ? "are" : "is"] [organ_list].") + else + to_chat(user, "[M] doesn't have any organs in [their] mouth.") + if(pill_count) + to_chat(user, "[M] has [pill_count] pill[pill_count > 1 ? "s" : ""] implanted in [their] teeth.") + else return ..() @@ -280,7 +353,7 @@ return TRUE /obj/item/device/flashlight/emp/attack(mob/living/M, mob/living/user) - if(on && user.zone_selected == "eyes") // call original attack proc only if aiming at the eyes + if(on && user.zone_selected in list("eyes", "mouth")) // call original attack when examining organs ..() return From 36b517d2bae7004e10df5c248a3a72c7171f3e38 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 May 2017 13:32:01 -0500 Subject: [PATCH 23/92] Fixes runtime with null nutriment taste data --- code/modules/reagents/chemistry/reagents/food_reagents.dm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 442772fea8..56a89fe389 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -60,7 +60,10 @@ // data for nutriment is one or more (flavour -> ratio) // where all the ratio values adds up to 1 - var/list/taste_amounts = data.Copy() + var/list/taste_amounts = list() + if(data) + taste_amounts = data.Copy() + counterlist_scale(taste_amounts, volume) var/list/other_taste_amounts = newdata.Copy() From 44df31d399e91e8266a19a56b2d0fb7494c4a20e Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 May 2017 14:43:18 -0500 Subject: [PATCH 24/92] Fixes Set Round End Sound. --- code/world.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/world.dm b/code/world.dm index 9023ac47f3..84c267615a 100644 --- a/code/world.dm +++ b/code/world.dm @@ -226,7 +226,7 @@ /world/proc/RoundEndAnimation(round_end_sound_sent) set waitfor = FALSE var/round_end_sound - if(!SSticker && SSticker.round_end_sound) + if(SSticker.round_end_sound) round_end_sound = SSticker.round_end_sound if (!round_end_sound_sent) for(var/thing in GLOB.clients) From 34bf3e41136ceb5a922bfe639fa2a073b9b1829b Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 May 2017 17:50:32 -0500 Subject: [PATCH 25/92] Fixes dropped cyborg repair modules --- code/game/objects/items/robot/robot_upgrades.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 2aee5acdd9..29463b5a5c 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -237,6 +237,7 @@ /obj/item/borg/upgrade/selfrepair/proc/check_dropped() if(loc != cyborg) toggle_action.Remove(cyborg) + QDEL_NULL(toggle_action) cyborg = null deactivate() @@ -399,4 +400,4 @@ return R.make_shell(src) - return TRUE \ No newline at end of file + return TRUE From af41e21623c2d11e52271cd0002ae1ed818b0d22 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 May 2017 17:52:37 -0500 Subject: [PATCH 26/92] Increases pixel projectile angles/accuracy --- code/modules/projectiles/projectile.dm | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index dceed5b438..9835b1df21 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -179,6 +179,8 @@ return if(setAngle) Angle = setAngle + var/old_pixel_x = pixel_x + var/old_pixel_y = pixel_y if(!legacy) //new projectiles set waitfor = 0 var/next_run = world.time @@ -201,29 +203,30 @@ var/Pixel_x=round((sin(Angle)+16*sin(Angle)*2), 1) //round() is a floor operation when only one argument is supplied, we don't want that here var/Pixel_y=round((cos(Angle)+16*cos(Angle)*2), 1) - var/pixel_x_offset = pixel_x + Pixel_x - var/pixel_y_offset = pixel_y + Pixel_y + var/pixel_x_offset = old_pixel_x + Pixel_x + var/pixel_y_offset = old_pixel_y + Pixel_y var/new_x = x var/new_y = y while(pixel_x_offset > 16) pixel_x_offset -= 32 - pixel_x -= 32 + old_pixel_x -= 32 new_x++// x++ while(pixel_x_offset < -16) pixel_x_offset += 32 - pixel_x += 32 + old_pixel_x += 32 new_x-- - while(pixel_y_offset > 16) pixel_y_offset -= 32 - pixel_y -= 32 + old_pixel_y -= 32 new_y++ while(pixel_y_offset < -16) pixel_y_offset += 32 - pixel_y += 32 + old_pixel_y += 32 new_y-- - + + pixel_x = old_pixel_x + pixel_y = old_pixel_y step_towards(src, locate(new_x, new_y, z)) next_run += max(world.tick_lag, speed) var/delay = next_run - world.time @@ -232,7 +235,9 @@ pixel_y = pixel_y_offset else animate(src, pixel_x = pixel_x_offset, pixel_y = pixel_y_offset, time = max(1, (delay <= 3 ? delay - 1 : delay)), flags = ANIMATION_END_NOW) - + old_pixel_x = pixel_x_offset + old_pixel_y = pixel_y_offset + if(original && (original.layer>=2.75) || ismob(original)) if(loc == get_turf(original)) if(!(original in permutated)) From 46d7976488ae36c3041808890e4e9e41abecaf9d Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 May 2017 17:53:42 -0500 Subject: [PATCH 27/92] Adds spewium toxin in traitor kits --- code/game/machinery/pipe/construction.dm | 2 ++ .../items/weapons/storage/uplink_kits.dm | 3 +- code/modules/mob/living/carbon/carbon.dm | 12 +++++++- .../chemistry/reagents/medicine_reagents.dm | 3 +- .../chemistry/reagents/toxin_reagents.dm | 28 +++++++++++++++++++ .../reagents/reagent_containers/bottle.dm | 6 ++++ 6 files changed, 50 insertions(+), 4 deletions(-) diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 6735aa7609..2d3765a934 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -251,6 +251,8 @@ GLOBAL_LIST_INIT(pipeID2State, list( var/mob/living/carbon/C = user for(var/i=1 to 20) C.vomit(0,1,0,4,0) + if(prob(20)) + C.spew_organ() sleep(5) C.blood_volume = 0 return(OXYLOSS|BRUTELOSS) diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index 335545e8c9..9cf806f6b3 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -219,7 +219,8 @@ new /obj/item/weapon/reagent_containers/glass/bottle/polonium(src) new /obj/item/weapon/reagent_containers/glass/bottle/venom(src) new /obj/item/weapon/reagent_containers/glass/bottle/neurotoxin2(src) - new /obj/item/weapon/reagent_containers/glass/bottle/formaldehyde(src) + new /obj/item/weapon/reagent_containers/glass/bottle/formaldehyde(src) + new /obj/item/weapon/reagent_containers/glass/bottle/spewium(src) new /obj/item/weapon/reagent_containers/glass/bottle/cyanide(src) new /obj/item/weapon/reagent_containers/glass/bottle/histamine(src) new /obj/item/weapon/reagent_containers/glass/bottle/initropidril(src) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 87cf246717..06145235a0 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -484,7 +484,7 @@ adjustBruteLoss(3) else if(T) - T.add_vomit_floor(src, 0)//toxic barf looks different + T.add_vomit_floor(src, toxic)//toxic barf looks different nutrition -= lost_nutrition adjustToxLoss(-3) T = get_step(T, dir) @@ -492,6 +492,16 @@ break return 1 +/mob/living/carbon/proc/spew_organ(power = 5) + if(!internal_organs.len) + return //Guess we're out of organs + var/obj/item/organ/guts = pick(internal_organs) + var/turf/T = get_turf(src) + guts.Remove(src) + guts.forceMove(T) + var/atom/throw_target = get_edge_target_turf(guts, dir) + guts.throw_at(throw_target, power, 4, src) + /mob/living/carbon/fully_replace_character_name(oldname,newname) ..() diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 500147d233..434161fa51 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -962,8 +962,7 @@ /datum/reagent/medicine/antitoxin/on_mob_life(mob/living/M) M.adjustToxLoss(-2*REM, 0) for(var/datum/reagent/toxin/R in M.reagents.reagent_list) - if(R != src) - M.reagents.remove_reagent(R.id,1) + M.reagents.remove_reagent(R.id,1) ..() . = 1 diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index 528124f84c..cedec9941b 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -648,6 +648,34 @@ M.losebreath += 5 return ..() +/datum/reagent/toxin/spewium + name = "Spewium" + id = "spewium" + description = "A powerful emetic, causes uncontrollable vomiting. May result in vomiting organs at high doses." + reagent_state = LIQUID + color = "#2f6617" //A sickly green color + metabolization_rate = REAGENTS_METABOLISM + overdose_threshold = 29 + toxpwr = 0 + taste_description = "vomit" + +/datum/reagent/toxin/spewium/on_mob_life(mob/living/M) + .=..() + if(current_cycle >=11 && prob(min(50,current_cycle)) && ishuman(M)) + var/mob/living/carbon/human/H = M + H.vomit(lost_nutrition = 10, blood = prob(10), stun = prob(50), distance = rand(0,4), message = TRUE, toxic = prob(30)) + for(var/datum/reagent/toxin/R in M.reagents.reagent_list) + if(R != src) + H.reagents.remove_reagent(R.id,1) + +/datum/reagent/toxin/spewium/overdose_process(mob/living/M) + . = ..() + if(current_cycle >=33 && prob(15) && ishuman(M)) + var/mob/living/carbon/human/H = M + H.spew_organ() + H.vomit(lost_nutrition = 0, blood = 1, stun = 1, distance = 4) + to_chat(H, "You feel something lumpy come up as you vomit.") + /datum/reagent/toxin/curare name = "Curare" id = "curare" diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm index a92c52abf4..37074b6d12 100644 --- a/code/modules/reagents/reagent_containers/bottle.dm +++ b/code/modules/reagents/reagent_containers/bottle.dm @@ -58,6 +58,12 @@ icon_state = "bottle12" list_reagents = list("cyanide" = 30) +/obj/item/weapon/reagent_containers/glass/bottle/spewium + name = "spewium bottle" + desc = "A small bottle of spewium." + icon_state = "bottle12" + list_reagents = list("spewium" = 30) + /obj/item/weapon/reagent_containers/glass/bottle/morphine name = "morphine bottle" desc = "A small bottle of morphine." From 82ff7ed19f62646a170282f9eec4a6a4c618b00d Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 May 2017 17:54:47 -0500 Subject: [PATCH 28/92] Fixes detective scanner not being able to ranged scan, adds range/viewcheck vars --- code/modules/detectivework/scanner.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/detectivework/scanner.dm b/code/modules/detectivework/scanner.dm index 92437a34c1..562f59290a 100644 --- a/code/modules/detectivework/scanner.dm +++ b/code/modules/detectivework/scanner.dm @@ -13,6 +13,8 @@ var/scanning = 0 var/list/log = list() origin_tech = "engineering=4;biotech=2;programming=5" + var/range = 8 + var/view_check = TRUE /obj/item/device/detective_scanner/attack_self(mob/user) if(log.len && !scanning) @@ -43,7 +45,7 @@ log = list() scanning = 0 -/obj/item/device/detective_scanner/pre_attackby(atom/A, mob/user, params) +/obj/item/device/detective_scanner/afterattack(atom/A, mob/user, params) scan(A, user) return FALSE @@ -51,9 +53,7 @@ set waitfor = 0 if(!scanning) // Can remotely scan objects and mobs. - if(!in_range(A, user) && !(A in view(world.view, user))) - return - if(loc != user) + if((get_dist(A, user) > range) || (!(A in view(range, user)) && view_check) || (loc != user)) return scanning = 1 From 4a142759a095f2055046e19e2bfb2b78e9f4789c Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 May 2017 17:58:58 -0500 Subject: [PATCH 29/92] New Tree Sprites --- code/game/objects/structures/flora.dm | 2 +- icons/obj/flora/jungletrees.dmi | Bin 27406 -> 65117 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index cdd706e5df..c00348a2c6 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -88,7 +88,7 @@ pixel_y = -20 /obj/structure/flora/tree/jungle/Initialize() - icon_state = "[icon_state][rand(1, 3)]" + icon_state = "[icon_state][rand(1, 6)]" ..() //grass diff --git a/icons/obj/flora/jungletrees.dmi b/icons/obj/flora/jungletrees.dmi index 461ac0b265fb246cf7e6683131be6cd24d9123af..67c7e0f463c70287d59a550b40918b7c5b716ff3 100644 GIT binary patch literal 65117 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 z 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 z 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 MJk(SyQLqgBKdwp}1poj5 literal 27406 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%0A_%<0lk=iZY?B ziL%_0dJ#Hzok>_^jIZ)Q4YLm2efYYF1o89R6CfLNj=!3b`}l=y5xZwC?X6zZy&s=z zI7fJK%i|@j(@Ow8L%uD0y5PLlZkkjMctAl8*u^fqOv9>9TPf?01Oxe@tN_ zqdK5gru}#WNe`l6MrV$~Q6G4%szBqQ@H`$QTSAb6+G5XsbVBIFodtw=Bg`N} zvyE003Y-l3^BXo_@?juF-8Qv9BJPVZZ_*ZUji^z8C*iLmp#qkUEyEM5+oZ|wX!C(< zZ38)j8$y7Mes(K-#(vD58G)_b5B{Q?$8QfCj`z+CKsAd>0Mz=lLPwpg^Wpm<8qk>w z1WY6LXAt$XRIZ774j^x;0=BYPJek`aU;KQ)FB0s{`U1`9zG8Z7%agsdWY+O7Nmmw#c$h=YC{Q#I_#^C z-10l`1_p&$kp#;6BY@RZ;QJ-H+})<w_Qr%4} zBm(Zupx`}J5`9{}ZxvaeJ`{dw7KBHD?1_Q6r2sHm-i}a-?Vx=Ye>85jL{CBpE|fUD z+a5`KGR-EgK>~dnO1cnSH~+)eR3Qw{r#~>tMC01 z({Xqu{z5kpk~s{rRK>=fC;i$Q5KWi>Dv>dR-+CkUl+2`9+lU z(3Ev|wZ{8+9qM^i$A)grpf#@_?&GHy6zW9}AU~uxUYy%aice8g$CBxII2;+YmBO0P zCI%bM{FR^;Ki|wAd1aUkgF8nHxd#VDQpN#pEUdi{lfTfNOhLcLdjTU9T^sX&NcU|a|!P3MV z#&c|~T^E=8HmDW(2TC&8x$Az)vOd^?ZTk$ndp_W}=wxTJ&Wm!@F%h>*mS1Bc-S6kf zbgFJ$75+TNxxiv!IWBmThBwC!g)_X>}{t+8#w zyOARdOsKj#+we)Y@7`|F<6L+N$r`01`+^4f7p4_m=ke3(d-#|Hk zc=+(r#byAfbF*?KjZO2_TOSg3Z-LTJMOP83f}v`a`pnHd>`@ zhepIZZ%=B-ME%!9QQD zFJi1Z`dyOz)+?$lXWP*8p1|+EtC<+LG$seaJKJP*WIXl1r~BPZG&WT-t8n+ycyTQ`zZTpy#U7q28`pOr7W5mBwNw|Sf+qvUx|qCyfdHWsI%#) z$x1vDCw7n!YQ8xRn=ef*StYX1=!kJNksCiryl1ow;sj;pqSuxK6-xHd)4RwSPG1Ka z_V(Dy&6oDeds{f@jdniJKes5Ex#|*+7uN^Pg{J4d53pG?_Z(cZz^veY0o$q%l%t1IBKBma*LYbIbm(5Q(Oi;{3%FR=A!Z1 zGwm00Ve&SY{D^H7$)%6G^W!^vjG5m(Rej%Ic)j}P3j{T;x^0~qr2mXHiL~Lr{*?N_ zjQQ`e&yKaJqns_S*y5Efh9e!81ie+dR|gIKnXmrIbC-20=(?I>VYmZBja_tChhyf)U1a; zw~N}XZu#~ZD{p0msm1p{$#U`2(<6^!ecsG-bzY7Nn;kAA|Hpg8j~Qe-Rf6%#^4qxx zNdd-ac+3$>28sykP#W*YjN@Q2^3Z@(I!qJeBQyW0-eZSN{~%8}+ni34wq(qz56Ez}BlQyg{IFHm zmD&i(UcS+uZCn!mCxbCL(1#0UFmXZvMirVqMnq6PBPjbEKqu(u`u}NXLV*5u_y8#! z#M@W5Lg)k}^yrY$PPjb9=izVPaXLsc8;oZsk~E^u#6971q6J(6LdA-PDB%j0Avgyc zByb`C(^Rb;aFz#cQ$JKn>iKF{e+U378!~lQwfp|0Bp?&}I@^(h8j;LrN93AD?u>}u ze&8z@HNQ6?Q6(|HGeH3V1`1RF|B@*?I7!+`T#z0~8*1>xj_6Htmr3CPSHUDHE?)1M zf9z1*}24m7L?o=pnANG0?NmKg+~X06tiDs>b?xtwg6DyPRyRtJNUE= z1&Y~@JtX~CM7>JU0Z>NsEm>Wvr331d^~+!LxeDqvPp=NZYS1>XZiU^AaTe?VSCYX*YC&S-nBGEf29Eg&sF{dhAQu0B zWkAetIKS*K916+?RMY^)hOf006$_|e%}LpJ!7T->;UW#G9%CwzJ%*h&wQ_6oV0#`9 zp!u8^Ys*4-A9kTS`Mm8Tf~{~(R@@+A%FVg%vPjm#=rP6UbyvM^gqJm>n)btNzc<+3 z*G&OFZe<18pT@KF!Ixuo2Z||(NmIq}{2~z?_b-2qbKv+vah1QkUTJd+Ph*$bx~N62 zRXe(d)47eU;-F}7A(9nHtrxj{m3h~dYyn!R$yT?^mV;Xo z0)fKeFqhIS_y46Yuncr4u?IC#^&v`a)L$O>X^61FV;%(uauM&1?zDww2HW1RzmC8H zO<;BD=IU4MUwsFgRq~>fz_;2n!!{;+@AQ-YSg4|YNp)NwEPHd0Vv2DMzXi$Zgkf%& zYH)_&Xi^a<4_X+8q#{^yVfXM-@*gB7d_0HDmKiJo^ zj=N0ciqgT~&0m$Z-1Im{B)=)o17%+ZL_9e=3o~1J@CyPxRWK797XvLd6am}@NXUf3 z6d*{Iiqc8PFkAgmUeMG|-*&sHwlEC6FgIb?&xCyg!vCiTcPr~mdN0$GpR z^rT5c8yOD|E5mr{TL|9R{?_iTc?hbd6z6ZRz;iEe#Y=^Gx9FY^>##pq5{XeaLQ_^@ ztc#21o!5%F_G81pDojdsmY9)&<%A-__a&MYtT`MX6CRU!vB7?(p;JdKrG?U|w-#6%n&Uw&0;I+Dg`NbX*&uDr=DW?MES^^aYF+ zV5>~Rgg2Egqi4kVl|!+FaJ;qNvST7hk^Kt|z84kE%gvPhVYSKp@$94yKA+M7S zhHx>?tR6R8vUST>a2umcIRd35(pG#S-5|L&e;QwdaT}3X9LTHT{pfwEH#PL^mpHt4 z1@$VF^OtTKNlCc$Rc>GawT$&QCJ60Ih|sGKA}IC{l?ep4-?QUemjb+1aDfqb&6N1M zl&0Zgj)zVke)S6#=A71b${?3^d$^PV-BV9|>lZTZRPd(jdCe3nATlHsQFesEM%F5R zG-az@u%xn?>RWpLLcJl+8xv3}cUJnNp`6`2o)gl;s~#U9VFpfubK(f4&?6Z7$WGW| z+}3L}9a95z;iTkUt423d>X&cR)tyumt>VG+$Y!QKfhTP+Q6`9yVUWhIf_yURhzRw8 zh`y6W3JUgqkj)FwB?Vw4&SV7kSEQVRhYNii7D9d?gv1&)LQQP* zyl5?Qd+Ljb31qUEOs{G)n@nKM)p9YQEu%H3molb(QlqNBW!5$rR3iKqQ4%vng{Pjz z>fCN;|BiU`BAN1sgNQ1=i#u;$Ax+B`t3?`hnVsP=vOI8j+|u|A*aeLDwT3Oc9)gEG z$+Jk_r&utu`$zn<*;CGX=+G0v%lMmZ!SWjCnn{>^?0vwG*!@k<06IHM+Wut+6sSaS z?1_ky;#=M94_SjuZi$Feeqi>scQVVNsL6j>^n4)yZ{q1n3sfQJtwhVhxUG2@;Nh66 z5)?n`IX^@wJPk^8;l`*H|L%CR&mj#l#6vF8rKtKd6CyG*Ao=4F%m{y2&=DdoM>LdI z;S+{VCA%ZopL**bPU`39B*1bY7MtoXX_!v*_>6hE9E!hKR%&Fre3@7dIsx*&t&$KA zDWrZ|0)o3n6I_X~$E}KBjwEyijoYY61{GL|>jmqUU@a;lE!Tf?4ANPskR&H18W*nKwaA>CR<~?=7*cMz#!RC8GTJ<$m7R%gM?#L`2hLW(f0O>b0 zH@1mG_EoCXI;31h%7A)(r5Dp;g}b_&ZHR^i*umKu%nv01o1gsUXJ=9^7a4b0*DJAGQ}tIsUbC2FwN`kQo8J0d z@ovaRodKg9GY^~~`)+tiUFf1q+%*8&MNKNJllA@&l#Q1avLfcASt`^Eo zVhz4{08pcS8=no_>K-C4l=HnJtp`TKDjrxb?`AZoedyy8VPI@xA9ona2T>M3=RHdM zc_KLYhvVneZp}0=P(I6GS^256=n`dovpIN3?YtS*IfpWCR=`YmtqY23fYr@XPoHMZ zN1`ELHnUt#azf##q*kzI0!2q%=n!;K*%qdL#@QQIQpUp?o+iCgBXF{Y)-rz|gO8jV zxk9!O1t6{Ul+EPL7_SQnQ5U4BlP-Z8UFjnLD1*rF-P8nEZ(ow+m=Rx>^S>g^2UMV_ z3}0yvVp!6H?;M4?j{ zL=P~wH+`kD2P(%nTXZ7!|53Mg{2OD+TWTP|?TM2>sK9OS`Z|d3{LaRea>9R1buCin z&1pd~hk4V9%KAr@fb34CCY1Bro7EZ-?Kg33NQv9&xJ6W92+H4Vz+~@e-iRE+la(GG z_skbP1uU}gNop~ohu)u)O=}_xq(fo`35)L^R)DCaC}vE!J{A@jKT-7lSgVDal3Fq7 zjNj$$y2(qqrW978ytk|8d-|Fd&!h`v*>am=G=lMTL<>iPB+TF3R@fa1wrL)#dlfA2Z+l<@vKiWFW zxF+AQ?{C29Mn;E9C@n1@3`C?GWVAG+TckEh5D)}ZQc|Rw(Io;(cb9~8cluoWKllCa ze!YFJT|0N~IFI;!e^+n3SY?tm-z)CP;)M4@uyp2*{g2&kzeGU!>{;jeR&2L^0qjq| zwywJ^s|iJG$;bITKf=1%QvC37AjJEV-`SfrnFC*Y(MO4oml@4ZOa~pNGy0lN;;DNc z+!}mERjPx7q#eFE%r4o`?zEvAKnThN!rz%1YoQuMf88dUZ26!EYAm=&p!#;NkFUmC zdHxothX&tyMg;|oN1YT#+VW!43Q)X1(ODV}ny?E3Xl0aoO7B=GS0?Q(fQ?Mc*{&zm%pw!->Pak(j~$AhZRD|(Aln$oouLtw3J{57BJ zU}OOTAsA@v*~13$z7LuYJ;1}CmXEVwt5xIcKL>>$wm;QQ)u17Qt9Si}V%3`HM>u~C z06;7$=ldg+`(CulMP@rQ5KWyigqjzgVgtNs&tlR+fbgy8$d9766`oc*VP2dN@1 z;(9uD36~t6!mM}`B%)K5-H4cwaK>H|`L-lN1#kXWokkbISz{W~MJt~CQtd$nglB?! zDQWg-5lBSmys!hmrW?lENOVU=g%W+zY+tAFG1N6qS=v&b0LUln771^(4tYlNw`i)f zYs7sUFV|%ut>7=z@;AKOrW?Mv6jW1sDn%YbLgYX0Ae-u$I`_o$wMGTNhsrJG-8DYVd zS@pjVnk3>yom~ziT$(k(`1^D<#mK#v-z7b%u`}~*O&1BVrODGhXEae{${}x0EJa{H zx=7!XCx?7I0uoM>8Tl0uvUMG);O0fiyzo`-cI-F$d=K*1Fd=;qLwABKXkMy~78}>| z1+q@yzvX!fMkpf$xY=&(0yh0}5CWL42&EdciNS6=yhInuFc zE2Ljd!6*%MreJAA)ioE7dj{B=lZ0(%zsH~d3}&Z(OV8shnyNl+cc8h>QIFLy`)Suv zMA4HSq_}G>yhsRU-CXI)V=&zPiB~*4UmRg$NnMbcQSxC08*N3JZcGnf>tKt~6(ULH zw;*t=Y1Ix{Ob?RzG!UH~E{4*Z@jC^REoMf(!L)OWrD?rw)>L7yToe?w}F zlrM8&Mndqq=4eF1W3|6_b&Do-t~2&bd^{pLD62ykG)Lh=5hAhwRPSG)QCWJPJpnU9 zU@$|^qjFjvKnqQ_90B^Aql(TOS#+BFEE$1s0&AkV<%3{HeYaDX@wV$w`1Ky_-{1YD z8Srm826}aVV-9MmaPG+Ub3p>i?yPMq9Y3iLZYjW!e~(V)YL6NytX+V^sSHM-C`3FS zmV5nzh7E9Zk%SIse0R78^wEu6*UY#L-ryN6zap=HHlW2pYzdcDf{U8@&l11i3HvpL z1KmrPEO>&(G^(fFwyYVrbbf|JB%mK(tik2RA!W5>PQwS7S`vdAQ?L2=y7+|$%g2?z zp6d5VqK9`(fTKScHTcaiHfI|{FT=5_ZMv-exQsGd0X@2wf7Qk1O=%4LKq|%P`*i;T z7Sc?p%~;Y5J5Y!ov4epg+HFeQGy@5BMsXk*1CB;!uIQ?Di&v;QvbDQ+TyQ#FspDZ; z(B=XJ-MW@J`~?43=OW*)oLL0;;0_I@>zy0@P~y$WSn{z9xMyH~M6q>4n0s75V+p$z zxw-*nTUW%~N@`eld z!W1ZQt}omLZ5h^l4bgH%`_KOunc`<{1_&Yo;TW?g(xU}CMn%x%ztz@@9rU$dlacpF zX%t7boGexPziHcPHo(1;QuL*|ym#3pYAmxQ-A{)0L2NT-t&62udFUscj7q%AO*J%%ELwp z2f(x1HGG2Bl;xH_>aW2@#v>+sBGYPi=}f-!=xFvPKc9}%RIsj{)gi$`F#A1;g;vK! zLTRxxVNDx!LdpFbl%1X#c`DDN7DfNAx@^{rXxI+Z4ITp9cVTX5vRdM|`Zq{k6X;8i zaF_)K%}lJRk1`ZDtg@gB50NwLguVR(4=JhHN6Jj$uo#GOJPbo!>8EUSkYxcLLMfq| zvwferlb-nxsd4?aJ)Hr!vM1omnE1elr<6%-5Su^?8zAq#Sj^n38c}%>IbJ>6BjAPY zDSI+fU=ugg;t%V+{b-Wl2&UdQT9M_#SEe(`PTE_M>5`~()#Cals1tfuVrW{$<*8Cr z&O?Oux)|=j1Ed`zRaTy9vs%?o9rRp=-c-)l2iI+-?@^BTW1|XF=HKvIi`;A8AGfM5 z1&merEQciWrX4K+1(EIDwsT`O^GQQuRLL|+iPHKxN?u@y9f)gmMvRoxlY2jV$Z8Wu zhD66o1ywgH;S9#)Z~6FVQGa$tS5DXbzUFRMUO_h|7R~|`&YetJ{rJKw9f(S$#5BLE z*sb69QBT(4x+i`oQMS{3I3wr94$_{C7s2(^k&xO#W$nA0H^vCXoh(?UOS*)zmyM;+ zfBK8F+iA6$J>Gn+>rpBdxb@LY`I~mn`DFX}F_vQXaAgk3(n~8Rv&Q@iaH4V&@2jRx zjgs6LmYVx^Wov!a&W=w#Chj0(b{&PBwV7UP!tSY}`kv=<>{WAYU1tPiwx#P8hDjx3 zpgP~SKAhH^?pND-vB5>h4--FXou7`cJl0ro==t*VfuXh5Lq5-5#5d6%pdbDN3!ggs z4HF6r92K|uTuC)@Hi~+9S5zZ$4!Ia;81g}ipWKKTrb>nm0Q?!IkufBuhYimg$&RJw z6NSovv6WG{wUfrTa~dvDI&auxB6vy*(~fB{a#3v^u)7<=Nwc;kiYlfi$mOO$8CZI> z&os3J+glledOGp#19+A8bRSKuSuzp=)+EB5MJ>&wl$S&ILvgU!H(g5PqD+hNy>SWM zHk1mi_A>q%nQ5&M0=`RdV%QX8?@VJ0(CpuLdoXu1YnJ+w?3T2j<|8*wGViM)N72Kr z!$g`nD}f#aQ@5}X_=o0q`evE3WDbFNq&C#}_zN@60ET8RXk)9Sw+dhQP7Na^BIj@0 ze5e$S6|s(6rnSz`izWS>iy}3CB9k4d%Vkg|Q>5uwHuMS7miR>wYjb7VhCp77USS@e zeXA)ca5RDX^&GGvNaR&PrZa76wAD6R8Ay$$z+)km52 znHV6c^kz2*XI^z+9FLn}K@P`4_5jE{oTU*j&1&Sc6-Gi8`hDk4CrMJj9rz?ped-h& z4llyYO`)_KNu=h9yj9uB2!egRC_@I0OU+~$Z8`(BGPJHsv1$F^TI0LERf8*!E;An&U(_UBP$2{H*0;` z;l&9VrBRe{ga@86Qg!ru0#+ACKFKWZ37O z^onqA#m%Y+Gm)+x<63ag0A!={prAra&!esQ!@_wAWXJ)K1zY8o>;XmPcfiw|lu6K^P&Yb2PpEhRn{n!R$L`hl^yyK*ebWNmMDp#Sq!-t2n-Y4V-2T(6<8ATmjPV}6;PjhWYi8l;%j%|x-yd?W}4Jv$5aVkTW1%OXP zv>b8=k+m0I<+Dy&xNNAW+X)T=WQw*=m%5!o-uu1f_MX+oCEEV29hLb;^U7h>x{{1fU$P`rAA2I0PONFAPWY$O_zTQ#5$CJ-QS!? zRnwGUJ;<~C8p>|?K7)Fm0)07w-n!4NJpXBk_3e0ANvl1?)seHEP*V&bd$BxP{8nYi zxVX6rG`R)cw@)t*fwZ*S|3B)(;#nw8eK5)-Mr5-IM0vlBZzL@zYZ2eNKAhww&Q=Zl zA?Q`+5im@Ld>!~&)Np0Ti(7dzpFdoWo+ZsKnn9ej^p65}2cTB&-Jh5EADP^6eqidf z8H+GdxNp2ba3RYeEmTQU|Ik&e@k%gi*#4j<#2x4_3(~{p%FM6qMl6wGsw*(@O(^%g;M}08nYWQPMNf(1@NwD(yEcSY_v;j%T6|3G{lq3Tj9~Er z)`o)@#!6u^LuAe$X9YIQi`YxUW=qJpt5$dYEXT#JhpkJfykzRoNIkbPivCG>8R^Nt zk+YdO(AQTtv-1e?CZie9yT?14XSbN=i<)hs3%rL>JjxOC6MVRF5I#^1V-v}9qjTKo zfiy;3$M$5W-+3M->8)fJ!*@W^T!uy;OsLNNw5bvy!vHt`s11|Ckwp2H;IG6d#ouu->$>yu5^n{EyYr{9m|b)k>QmCoY#{_P%<|0w(9b0L1+V0KTsLyc=JK8j5E#zgUj!C&&VMLu@VuHg9er*A7c+Un zNk=1sf3WwJIX)gB6G-u4@HKllL`f8F-(pwK8@pI0qwx(l367>0QV_@ zc>9!prI8hc*e}aM1FLRoM}O{ZEd8hTs>wl>Z}COF7{&{F<5(XrczH<&|13O6_irSS z0&vhXmg3ayQ6GA+ZJYKka_j^4ZrzzEJ~o@pIS}jkNUX(*R-ZcRdLLftO)ft*9J!E9 zDl2>H8PgDs_N^=f|7<=ndRztIL#2rcVofz`Q~|pAn+vC8EdjxZ<}Dtk+1a?oC=5pM z>RA!UPRlU%N_b6{Z|b)Cf*P*n8^a4$O7$GjQo+s1(4YYU&V2_$a@_+fF-b9QPDZ}B zErhFX45_6(s7rE3g1nS@bSGd7=^290t^-m^2VaBS2W8f_N7HOVjaYJb&j@qp<7?iz z%#}(3ik|eJi_!FMxT}LMuWf9)NTeC;^2>(<=4vyV57Fy3WmpT6HTu8UURB9(o9nTX zcnStLUJja4k7sy~j}YY)I}~;z{!qyFyOM{RQtrYW*lqmL5IDOhU)|2t=!pmeor&)~RUgRQFLS3@bzGw-YR`(?pZ7f$sS8d_AM2?(XR8vzO?1`Yi6J2LIYJ_;>S)WcXxs}cS1iSuZ z0r8P5ZcJgj8V1T7^Lmd%{o^)jagB*2r=${wNS;mWAoph*0@QH@J863}VeY7}P@=vG z@6jK>5Z3zU0_BbCxri<9Ksw1PY_huyHIN&UpL-cVzLFCf5;XI}7rVMRC<1CBEW-KU z9+xDmuUwDe>?kBEAA$#DCg=U@VtmJ@T!#bEpRq=?-s~~wMppq-y*ZnV9{x-S%*QhA zsPUQ(9wR&Zu|1JMIn)?@b~RaQF#c9*ph0Xk@Q+b+3}_>aU6Dnz@ycD&*5#j9Bmqcn z-bo87G9~1ZuLpUQj&Y|080Nff(y}#uhAO#hGP0~CH%Y;yJPRjCKJ?vx|I?ia^UN}L ztjG5Sa%UOoy5vBiS8X+x1Y87>0cY9ye_mX9$)GX&f5C-*chNZZmcWMA)XAxyuOjwt zz11YVZ6x;7gF++aS<*65A7k_L@^;Gy^0>V{$`z!@B?rRLA@PJ93x;CVEAjn$&=6z8 zt7(oCOV+HAnbMYqiVZ+}((r73=Z7^Uhns@$l`CK!($~kRTo3+Cj}ZB=dw{@(?Hnj? zTWWK5*FDJf<)!0MkxalA5q_q)`6@NbS!yAn-+BxpF{&TsmUNSS6)rjEWcr13M>|59CUxN+HTRG$f@ zB134`Q>skB6AOAk!nPESlAr5oH>⋙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 Date: Thu, 4 May 2017 16:07:53 -0700 Subject: [PATCH 30/92] Update flightpacks.dm --- code/controllers/subsystem/processing/flightpacks.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/controllers/subsystem/processing/flightpacks.dm b/code/controllers/subsystem/processing/flightpacks.dm index 1d85811878..0639f64810 100644 --- a/code/controllers/subsystem/processing/flightpacks.dm +++ b/code/controllers/subsystem/processing/flightpacks.dm @@ -5,7 +5,7 @@ PROCESSING_SUBSYSTEM_DEF(flightpacks) stat_tag = "FM" flags = SS_NO_INIT|SS_TICKER|SS_KEEP_TIMING - var/flightsuit_processing = FLIGHTSUIT_PROCESSING_FULL + var/flightsuit_processing = FLIGHTSUIT_PROCESSING_NONE /datum/controller/subsystem/processing/flightpacks/Initialize() sync_flightsuit_processing() From 4140cffc984a4a5a927b338a632e95ccdd4febf4 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 May 2017 18:08:14 -0500 Subject: [PATCH 31/92] Nuke op TC consoles can donate all TCs at once, and other small changes. --- .../machinery/computer/telecrystalconsoles.dm | 42 +++++++++++-------- 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/code/game/machinery/computer/telecrystalconsoles.dm b/code/game/machinery/computer/telecrystalconsoles.dm index 4bb872b347..fd026e4686 100644 --- a/code/game/machinery/computer/telecrystalconsoles.dm +++ b/code/game/machinery/computer/telecrystalconsoles.dm @@ -58,7 +58,12 @@ GLOBAL_LIST_INIT(possible_uplinker_IDs, list("Alfa","Bravo","Charlie","Delta","E /obj/machinery/computer/telecrystals/uplinker/proc/donateTC(amt, addLog = 1) if(uplinkholder && linkedboss) - if(amt <= uplinkholder.hidden_uplink.telecrystals) + if(amt < 0) + linkedboss.storedcrystals += uplinkholder.hidden_uplink.telecrystals + if(addLog) + linkedboss.logTransfer("[src] donated [uplinkholder.hidden_uplink.telecrystals] telecrystals to [linkedboss].") + uplinkholder.hidden_uplink.telecrystals = 0 + else if(amt <= uplinkholder.hidden_uplink.telecrystals) uplinkholder.hidden_uplink.telecrystals -= amt linkedboss.storedcrystals += amt if(addLog) @@ -66,7 +71,12 @@ GLOBAL_LIST_INIT(possible_uplinker_IDs, list("Alfa","Bravo","Charlie","Delta","E /obj/machinery/computer/telecrystals/uplinker/proc/giveTC(amt, addLog = 1) if(uplinkholder && linkedboss) - if(amt <= linkedboss.storedcrystals) + if(amt < 0) + uplinkholder.hidden_uplink.telecrystals += linkedboss.storedcrystals + if(addLog) + linkedboss.logTransfer("[src] received [linkedboss.storedcrystals] telecrystals from [linkedboss].") + linkedboss.storedcrystals = 0 + else if(amt <= linkedboss.storedcrystals) uplinkholder.hidden_uplink.telecrystals += amt linkedboss.storedcrystals -= amt if(addLog) @@ -89,7 +99,7 @@ GLOBAL_LIST_INIT(possible_uplinker_IDs, list("Alfa","Bravo","Charlie","Delta","E if(uplinkholder) dat += "[uplinkholder.hidden_uplink.telecrystals] telecrystals remain in this uplink.
" if(linkedboss) - dat += "Donate TC: 1 | 5" + dat += "Donate TC: 1 | 5 | All" dat += "
Eject Uplink" @@ -103,11 +113,9 @@ GLOBAL_LIST_INIT(possible_uplinker_IDs, list("Alfa","Bravo","Charlie","Delta","E if(..()) return - if(href_list["donate1"]) - donateTC(1) - - if(href_list["donate5"]) - donateTC(5) + if(href_list["donate"]) + var/tcamt = text2num(href_list["donate"]) + donateTC(tcamt) if(href_list["eject"]) ejectuplink() @@ -162,7 +170,7 @@ GLOBAL_LIST_INIT(possible_uplinker_IDs, list("Alfa","Bravo","Charlie","Delta","E var/dat = "" dat += "Scan for TC stations.
" - dat += "This [src] has [storedcrystals] telecrystals available for distribution.
" + dat += "[storedcrystals] telecrystals are available for distribution.
" dat += "

" @@ -171,10 +179,10 @@ GLOBAL_LIST_INIT(possible_uplinker_IDs, list("Alfa","Bravo","Charlie","Delta","E if(A.uplinkholder) dat += "[A.uplinkholder.hidden_uplink.telecrystals] telecrystals." if(storedcrystals) - dat+= "
Add TC: 1 | 5" + dat+= "
Add TC: 1 | 5 | 10 | All" dat += "
" - if(TCstations.len) + if(TCstations.len && storedcrystals) dat += "

Evenly distribute remaining TC.

" @@ -195,13 +203,11 @@ GLOBAL_LIST_INIT(possible_uplinker_IDs, list("Alfa","Bravo","Charlie","Delta","E if(href_list["scan"]) scanUplinkers() - if(href_list["give1"]) - var/obj/machinery/computer/telecrystals/uplinker/A = locate(href_list["give1"]) - A.giveTC(1) - - if(href_list["give5"]) - var/obj/machinery/computer/telecrystals/uplinker/A = locate(href_list["give5"]) - A.giveTC(5) + if(href_list["give"]) + var/tcamt = text2num(href_list["give"]) + if(TCstations.len) // sanity + var/obj/machinery/computer/telecrystals/uplinker/A = locate(href_list["target"]) in TCstations + A.giveTC(tcamt) if(href_list["distrib"]) var/sanity = 0 From 95495ffbcb97b92a343a541bc40f97b8ead3a86a Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 May 2017 18:21:36 -0500 Subject: [PATCH 32/92] Makes dental implants move through dismemberment --- code/modules/surgery/bodyparts/dismemberment.dm | 16 ++++++++++++++++ code/modules/surgery/bodyparts/head.dm | 5 ++++- code/modules/surgery/dental_implant.dm | 5 ++--- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm index de8c2b79ac..60edac1977 100644 --- a/code/modules/surgery/bodyparts/dismemberment.dm +++ b/code/modules/surgery/bodyparts/dismemberment.dm @@ -218,6 +218,14 @@ for(var/X in list(owner.glasses, owner.ears, owner.wear_mask, owner.head)) var/obj/item/I = X owner.dropItemToGround(I, TRUE) + + //Handle dental implants + for(var/datum/action/item_action/hands_free/activate_pill/AP in owner.actions) + AP.Remove(owner) + var/obj/pill = AP.target + if(pill) + pill.forceMove(src) + name = "[owner.real_name]'s head" ..() @@ -300,6 +308,14 @@ C.real_name = real_name real_name = "" name = initial(name) + + //Handle dental implants + for(var/obj/item/weapon/reagent_containers/pill/P in src) + for(var/datum/action/item_action/hands_free/activate_pill/AP in P.actions) + P.forceMove(C) + AP.Grant(C) + break + ..() diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm index 909f83e4d7..dd63506086 100644 --- a/code/modules/surgery/bodyparts/head.dm +++ b/code/modules/surgery/bodyparts/head.dm @@ -48,7 +48,10 @@ brain = null update_icon_dropped() else - I.loc = T + if(istype(I, /obj/item/weapon/reagent_containers/pill)) + for(var/datum/action/item_action/hands_free/activate_pill/AP in I.actions) + qdel(AP) + I.forceMove(T) /obj/item/bodypart/head/update_limb(dropping_limb, mob/living/carbon/source) var/mob/living/carbon/C diff --git a/code/modules/surgery/dental_implant.dm b/code/modules/surgery/dental_implant.dm index eef88e4a5f..c51a49081c 100644 --- a/code/modules/surgery/dental_implant.dm +++ b/code/modules/surgery/dental_implant.dm @@ -18,10 +18,10 @@ user.drop_item() tool.loc = target - var/datum/action/item_action/hands_free/activate_pill/P = new + var/datum/action/item_action/hands_free/activate_pill/P = new(tool) P.button.name = "Activate [tool.name]" P.target = tool - P.Grant(target) + P.Grant(target) //The pill never actually goes in an inventory slot, so the owner doesn't inherit actions from it user.visible_message("[user] wedges \the [tool] into [target]'s [parse_zone(target_zone)]!", "You wedge [tool] into [target]'s [parse_zone(target_zone)].") return 1 @@ -37,6 +37,5 @@ if(target.reagents.total_volume) target.reagents.reaction(owner, INGEST) target.reagents.trans_to(owner, target.reagents.total_volume) - Remove(owner) qdel(target) return 1 \ No newline at end of file From b5a14bb6ab1f35ad03dacf2c249a83bf22236c46 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 May 2017 18:38:58 -0500 Subject: [PATCH 33/92] New dirt sprites and jungle chasms --- code/game/turfs/simulated/chasm.dm | 18 ++++++++++++++++-- .../turfs/simulated/floor/plating/dirt.dm | 14 ++------------ icons/turf/floors.dmi | Bin 439536 -> 441455 bytes icons/turf/floors/junglechasm.dmi | Bin 0 -> 2461 bytes 4 files changed, 18 insertions(+), 14 deletions(-) create mode 100644 icons/turf/floors/junglechasm.dmi diff --git a/code/game/turfs/simulated/chasm.dm b/code/game/turfs/simulated/chasm.dm index 8890c50129..8b24a4c816 100644 --- a/code/game/turfs/simulated/chasm.dm +++ b/code/game/turfs/simulated/chasm.dm @@ -143,14 +143,14 @@ qdel(S.mmi) qdel(AM) - + if(AM && !QDELETED(AM)) //It's indestructible visible_message("[src] spits out the [AM]!") AM.alpha = oldalpha AM.color = oldcolor AM.transform = oldtransform AM.throw_at(get_edge_target_turf(src,pick(GLOB.alldirs)),rand(1, 10),rand(1, 10)) - + /turf/open/chasm/straight_down/lava_land_surface/normal_air initial_gas_mix = "o2=22;n2=82;TEMP=293.15" @@ -158,3 +158,17 @@ /turf/open/chasm/CanPass(atom/movable/mover, turf/target, height=0) return 1 + + + +//Jungle + +/turf/open/chasm/jungle + icon = 'icons/turf/floors/junglechasm.dmi' + planetary_atmos = TRUE + initial_gas_mix = "o2=14;n2=23;TEMP=300" + +/turf/open/chasm/straight_down/jungle + icon = 'icons/turf/floors/junglechasm.dmi' + planetary_atmos = TRUE + initial_gas_mix = "o2=14;n2=23;TEMP=300" \ No newline at end of file diff --git a/code/game/turfs/simulated/floor/plating/dirt.dm b/code/game/turfs/simulated/floor/plating/dirt.dm index 580aadc85f..0d13b93432 100644 --- a/code/game/turfs/simulated/floor/plating/dirt.dm +++ b/code/game/turfs/simulated/floor/plating/dirt.dm @@ -3,19 +3,9 @@ desc = "Upon closer examination, it's still dirt." icon = 'icons/turf/floors.dmi' icon_state = "dirt" - var/smooth_icon = 'icons/turf/floors/dirt.dmi' - canSmoothWith = list(/turf/closed, /turf/open/floor/plating/dirt) - smooth = SMOOTH_MORE|SMOOTH_BORDER - baseturf = /turf/open/chasm/straight_down/lava_land_surface + baseturf = /turf/open/chasm/straight_down/jungle initial_gas_mix = "o2=14;n2=23;TEMP=300" planetary_atmos = TRUE -/turf/open/floor/plating/dirt/Initialize() - pixel_y = -2 - pixel_x = -2 - icon = smooth_icon - ..() - /turf/open/floor/plating/dirt/dark - icon_state = "darkdirt" - smooth_icon = 'icons/turf/floors/darkdirt.dmi' + icon_state = "greenerdirt" diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi index a1cd8fb2f980a81ea68f596698beb96aac6a162e..28bc9e28d372f5b9d4e6bfb19608765fe1ef8add 100644 GIT binary patch delta 21149 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 diff --git a/icons/turf/floors/junglechasm.dmi b/icons/turf/floors/junglechasm.dmi new file mode 100644 index 0000000000000000000000000000000000000000..699a3b667cd9046522b9d291b823e059564e7b07 GIT binary patch literal 2461 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 Date: Thu, 4 May 2017 18:41:04 -0500 Subject: [PATCH 34/92] Fixes say verbs not working --- code/game/gamemodes/clock_cult/clock_mobs.dm | 1 + code/game/machinery/hologram.dm.rej | 44 +++++++++++++++++++ code/game/say.dm | 6 +-- code/modules/mob/dead/observer/say.dm | 2 +- .../mob/living/silicon/ai/freelook/eye.dm | 2 +- .../friendly/drone/extra_drone_types.dm | 1 + .../hostile/megafauna/colossus.dm | 2 +- .../mob/living/simple_animal/slime/say.dm | 2 +- 8 files changed, 53 insertions(+), 7 deletions(-) create mode 100644 code/game/machinery/hologram.dm.rej diff --git a/code/game/gamemodes/clock_cult/clock_mobs.dm b/code/game/gamemodes/clock_cult/clock_mobs.dm index a5e7dee4cb..a86c00e4f6 100644 --- a/code/game/gamemodes/clock_cult/clock_mobs.dm +++ b/code/game/gamemodes/clock_cult/clock_mobs.dm @@ -13,6 +13,7 @@ speak_emote = list("clanks", "clinks", "clunks", "clangs") verb_ask = "requests" verb_exclaim = "proclaims" + verb_whisper = "imparts" verb_yell = "harangues" initial_languages = list(/datum/language/common, /datum/language/ratvar) only_speaks_language = /datum/language/ratvar diff --git a/code/game/machinery/hologram.dm.rej b/code/game/machinery/hologram.dm.rej new file mode 100644 index 0000000000..c1334f9646 --- /dev/null +++ b/code/game/machinery/hologram.dm.rej @@ -0,0 +1,44 @@ +diff a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm (rejected hunks) +@@ -152,7 +152,7 @@ GLOBAL_LIST_EMPTY(holopads) + var/datum/holocall/HC = I + if(HC.connected_holopad == src) + dat += "Disconnect call from [HC.user].
" +- ++ + + var/datum/browser/popup = new(user, "holopad", name, 300, 130) + popup.set_content(dat) +@@ -192,7 +192,7 @@ GLOBAL_LIST_EMPTY(holopads) + if(A) + LAZYADD(callnames[A], I) + callnames -= get_area(src) +- ++ + var/result = input(usr, "Choose an area to call", "Holocall") as null|anything in callnames + if(QDELETED(usr) || !result || outgoing_call) + return +@@ -201,7 +201,7 @@ GLOBAL_LIST_EMPTY(holopads) + temp = "Dialing...
" + temp += "Main Menu" + new /datum/holocall(usr, src, callnames[result]) +- ++ + else if(href_list["connectcall"]) + var/datum/holocall/call_to_connect = locate(href_list["connectcall"]) + if(!QDELETED(call_to_connect)) +@@ -315,12 +315,12 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ + for(var/mob/living/silicon/ai/master in masters) + if(masters[master] && speaker != master) + master.relay_speech(message, speaker, message_language, raw_message, radio_freq, spans, message_mode) +- ++ + for(var/I in holo_calls) + var/datum/holocall/HC = I + if(HC.connected_holopad == src && speaker != HC.hologram) +- HC.user.Hear(message, speaker, message_language, raw_message, radio_freq, spans) +- ++ HC.user.Hear(message, speaker, message_language, raw_message, radio_freq, spans, message_mode) ++ + if(outgoing_call && speaker == outgoing_call.user) + outgoing_call.hologram.say(raw_message) + diff --git a/code/game/say.dm b/code/game/say.dm index deab83ad10..4bcc289be1 100644 --- a/code/game/say.dm +++ b/code/game/say.dm @@ -35,10 +35,10 @@ GLOBAL_LIST_INIT(freqtospan, list( return 1 /atom/movable/proc/send_speech(message, range = 7, obj/source = src, bubble_type, list/spans, datum/language/message_language = null, message_mode) - var/rendered = compose_message(src, message_language, message, , spans) + var/rendered = compose_message(src, message_language, message, , spans, message_mode) for(var/_AM in get_hearers_in_view(range, source)) var/atom/movable/AM = _AM - AM.Hear(rendered, src, message_language, message, , spans) + AM.Hear(rendered, src, message_language, message, , spans, message_mode) //To get robot span classes, stuff like that. /atom/movable/proc/get_spans() @@ -58,7 +58,7 @@ GLOBAL_LIST_INIT(freqtospan, list( var/endspanpart = "
" //Message - var/messagepart = " [lang_treat(speaker, message_language, raw_message, spans)]" + var/messagepart = " [lang_treat(speaker, message_language, raw_message, spans, message_mode)]" var/languageicon = "" var/datum/language/D = get_language_instance(message_language) diff --git a/code/modules/mob/dead/observer/say.dm b/code/modules/mob/dead/observer/say.dm index 8675049cee..0e7f5fcc1e 100644 --- a/code/modules/mob/dead/observer/say.dm +++ b/code/modules/mob/dead/observer/say.dm @@ -20,6 +20,6 @@ to_follow = V.source var/link = FOLLOW_LINK(src, to_follow) // Recompose the message, because it's scrambled by default - message = compose_message(speaker, message_language, raw_message, radio_freq, spans) + message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode) to_chat(src, "[link] [message]") diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm index dce38bd664..2d9cf4ec6f 100644 --- a/code/modules/mob/living/silicon/ai/freelook/eye.dm +++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm @@ -106,4 +106,4 @@ /mob/camera/aiEye/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode) if(relay_speech && speaker && ai && !radio_freq && speaker != ai && near_camera(speaker)) - ai.relay_speech(message, speaker, message_language, raw_message, radio_freq, spans) + ai.relay_speech(message, speaker, message_language, raw_message, radio_freq, spans, message_mode) diff --git a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm index 7cd6567ecb..1507c43912 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm @@ -108,6 +108,7 @@ speak_emote = list("clanks", "clinks", "clunks", "clangs") verb_ask = "requests" verb_exclaim = "proclaims" + verb_whisper = "imparts" verb_yell = "harangues" bubble_icon = "clock" initial_languages = list(/datum/language/common, /datum/language/ratvar) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index d822a05886..ec76c2176f 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -401,7 +401,7 @@ Difficulty: Very Hard to_chat(user, observer_desc) to_chat(user, "It is activated by [activation_method].") -/obj/machinery/anomalous_crystal/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans) +/obj/machinery/anomalous_crystal/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, message_mode) ..() if(isliving(speaker)) ActivationReaction(speaker, ACTIVATE_SPEECH) diff --git a/code/modules/mob/living/simple_animal/slime/say.dm b/code/modules/mob/living/simple_animal/slime/say.dm index ae7c14068f..60a25f90b7 100644 --- a/code/modules/mob/living/simple_animal/slime/say.dm +++ b/code/modules/mob/living/simple_animal/slime/say.dm @@ -1,4 +1,4 @@ -/mob/living/simple_animal/slime/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans) +/mob/living/simple_animal/slime/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, message_mode) if(speaker != src && !radio_freq && !stat) if (speaker in Friends) speech_buffer = list() From 067e0b46edadc59a733dcc46bd815231a7ab6688 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 May 2017 19:45:08 -0500 Subject: [PATCH 35/92] Removes changeling genetic damage --- .../gamemodes/changeling/changeling_power.dm | 11 +---------- .../gamemodes/changeling/powers/absorb.dm | 1 - .../gamemodes/changeling/powers/biodegrade.dm | 3 --- .../changeling/powers/chameleon_skin.dm | 3 --- .../gamemodes/changeling/powers/fakedeath.dm | 2 -- .../gamemodes/changeling/powers/humanform.dm | 3 --- .../gamemodes/changeling/powers/lesserform.dm | 1 - .../gamemodes/changeling/powers/linglink.dm | 1 - .../gamemodes/changeling/powers/mutations.dm | 19 +++---------------- .../gamemodes/changeling/powers/tiny_prick.dm | 10 +++------- .../gamemodes/changeling/powers/transform.dm | 1 - 11 files changed, 7 insertions(+), 48 deletions(-) diff --git a/code/game/gamemodes/changeling/changeling_power.dm b/code/game/gamemodes/changeling/changeling_power.dm index 67eb216d58..489228a30c 100644 --- a/code/game/gamemodes/changeling/changeling_power.dm +++ b/code/game/gamemodes/changeling/changeling_power.dm @@ -13,8 +13,6 @@ var/req_dna = 0 //amount of dna needed to use this ability. Changelings always have atleast 1 var/req_human = 0 //if you need to be human to use this ability var/req_stat = CONSCIOUS // CONSCIOUS, UNCONSCIOUS or DEAD - var/genetic_damage = 0 // genetic damage caused by using the sting. Nothing to do with cloneloss. - var/max_genetic_damage = 100 // hard counter for spamming abilities. Not used/balanced much yet. var/always_keep = 0 // important for abilities like revive that screw you if you lose them. var/ignores_fakedeath = FALSE // usable with the FAKEDEATH flag @@ -39,7 +37,7 @@ if(sting_action(user, target)) SSblackbox.add_details("changeling_powers",name) sting_feedback(user, target) - take_chemical_cost(c) + c.chem_charges -= chemical_cost /obj/effect/proc_holder/changeling/proc/sting_action(mob/user, mob/target) return 0 @@ -47,10 +45,6 @@ /obj/effect/proc_holder/changeling/proc/sting_feedback(mob/user, mob/target) return 0 -/obj/effect/proc_holder/changeling/proc/take_chemical_cost(datum/changeling/changeling) - changeling.chem_charges -= chemical_cost - changeling.geneticdamage += genetic_damage - //Fairly important to remember to return 1 on success >.< /obj/effect/proc_holder/changeling/proc/can_sting(mob/user, mob/target) if(!ishuman(user) && !ismonkey(user)) //typecast everything from mob to carbon from this point onwards @@ -71,9 +65,6 @@ if((user.status_flags & FAKEDEATH) && (!ignores_fakedeath)) to_chat(user, "We are incapacitated.") return 0 - if(c.geneticdamage > max_genetic_damage) - to_chat(user, "Our genomes are still reassembling. We need time to recover first.") - return 0 return 1 //used in /mob/Stat() diff --git a/code/game/gamemodes/changeling/powers/absorb.dm b/code/game/gamemodes/changeling/powers/absorb.dm index 6a52ab9312..b6b3372ae3 100644 --- a/code/game/gamemodes/changeling/powers/absorb.dm +++ b/code/game/gamemodes/changeling/powers/absorb.dm @@ -4,7 +4,6 @@ chemical_cost = 0 dna_cost = 0 req_human = 1 - max_genetic_damage = 100 /obj/effect/proc_holder/changeling/absorbDNA/can_sting(mob/living/carbon/user) if(!..()) diff --git a/code/game/gamemodes/changeling/powers/biodegrade.dm b/code/game/gamemodes/changeling/powers/biodegrade.dm index 453dec9375..6e2d6b0ddd 100644 --- a/code/game/gamemodes/changeling/powers/biodegrade.dm +++ b/code/game/gamemodes/changeling/powers/biodegrade.dm @@ -5,9 +5,6 @@ chemical_cost = 30 //High cost to prevent spam dna_cost = 2 req_human = 1 - genetic_damage = 10 - max_genetic_damage = 0 - /obj/effect/proc_holder/changeling/biodegrade/sting_action(mob/living/carbon/human/user) var/used = FALSE // only one form of shackles removed per use diff --git a/code/game/gamemodes/changeling/powers/chameleon_skin.dm b/code/game/gamemodes/changeling/powers/chameleon_skin.dm index 1f18f628a8..3be5103105 100644 --- a/code/game/gamemodes/changeling/powers/chameleon_skin.dm +++ b/code/game/gamemodes/changeling/powers/chameleon_skin.dm @@ -5,9 +5,6 @@ dna_cost = 2 chemical_cost = 25 req_human = 1 - genetic_damage = 10 - max_genetic_damage = 50 - /obj/effect/proc_holder/changeling/chameleon_skin/sting_action(mob/user) var/mob/living/carbon/human/H = user //SHOULD always be human, because req_human = 1 diff --git a/code/game/gamemodes/changeling/powers/fakedeath.dm b/code/game/gamemodes/changeling/powers/fakedeath.dm index 798f8030e0..e35f04d9e7 100644 --- a/code/game/gamemodes/changeling/powers/fakedeath.dm +++ b/code/game/gamemodes/changeling/powers/fakedeath.dm @@ -5,8 +5,6 @@ dna_cost = 0 req_dna = 1 req_stat = DEAD - max_genetic_damage = 100 - //Fake our own death and fully heal. You will appear to be dead but regenerate fully after a short delay. /obj/effect/proc_holder/changeling/fakedeath/sting_action(mob/living/user) diff --git a/code/game/gamemodes/changeling/powers/humanform.dm b/code/game/gamemodes/changeling/powers/humanform.dm index 743dbc91e9..d92e622c2d 100644 --- a/code/game/gamemodes/changeling/powers/humanform.dm +++ b/code/game/gamemodes/changeling/powers/humanform.dm @@ -2,10 +2,7 @@ name = "Human Form" desc = "We change into a human." chemical_cost = 5 - genetic_damage = 3 req_dna = 1 - max_genetic_damage = 3 - //Transform into a human. /obj/effect/proc_holder/changeling/humanform/sting_action(mob/living/carbon/user) diff --git a/code/game/gamemodes/changeling/powers/lesserform.dm b/code/game/gamemodes/changeling/powers/lesserform.dm index 538803de00..06824f9bed 100644 --- a/code/game/gamemodes/changeling/powers/lesserform.dm +++ b/code/game/gamemodes/changeling/powers/lesserform.dm @@ -3,7 +3,6 @@ desc = "We debase ourselves and become lesser. We become a monkey." chemical_cost = 5 dna_cost = 1 - genetic_damage = 3 req_human = 1 //Transform into a monkey. diff --git a/code/game/gamemodes/changeling/powers/linglink.dm b/code/game/gamemodes/changeling/powers/linglink.dm index fc4b91b650..232774c937 100644 --- a/code/game/gamemodes/changeling/powers/linglink.dm +++ b/code/game/gamemodes/changeling/powers/linglink.dm @@ -4,7 +4,6 @@ chemical_cost = 0 dna_cost = 0 req_human = 1 - max_genetic_damage = 100 /obj/effect/proc_holder/changeling/linglink/can_sting(mob/living/carbon/user) if(!..()) diff --git a/code/game/gamemodes/changeling/powers/mutations.dm b/code/game/gamemodes/changeling/powers/mutations.dm index 54e8ea1e38..aef9b6f1d2 100644 --- a/code/game/gamemodes/changeling/powers/mutations.dm +++ b/code/game/gamemodes/changeling/powers/mutations.dm @@ -16,7 +16,6 @@ helptext = "Yell at Miauw and/or Perakp" chemical_cost = 1000 dna_cost = -1 - genetic_damage = 1000 var/silent = FALSE var/weapon_type @@ -67,7 +66,6 @@ helptext = "Yell at Miauw and/or Perakp" chemical_cost = 1000 dna_cost = -1 - genetic_damage = 1000 var/helmet_type = /obj/item var/suit_type = /obj/item @@ -89,7 +87,7 @@ return 1 var/mob/living/carbon/human/H = user if(istype(H.wear_suit, suit_type) || istype(H.head, helmet_type)) - H.visible_message("[H] casts off their [suit_name_simple]!", "We cast off our [suit_name_simple][genetic_damage > 0 ? ", temporarily weakening our genomes." : "."]", "You hear the organic matter ripping and tearing!") + H.visible_message("[H] casts off their [suit_name_simple]!", "We cast off our [suit_name_simple].", "You hear the organic matter ripping and tearing!") H.temporarilyRemoveItemFromInventory(H.head, TRUE) //The qdel on dropped() takes care of it H.temporarilyRemoveItemFromInventory(H.wear_suit, TRUE) H.update_inv_wear_suit() @@ -100,7 +98,6 @@ H.add_splatter_floor() playsound(H.loc, 'sound/effects/splat.ogg', 50, 1) //So real sounds - changeling.geneticdamage += genetic_damage //Casting off a space suit leaves you weak for a few seconds. changeling.chem_recharge_slowdown -= recharge_slowdown return 1 @@ -139,9 +136,7 @@ helptext = "We may retract our armblade in the same manner as we form it. Cannot be used while in lesser form." chemical_cost = 20 dna_cost = 2 - genetic_damage = 10 req_human = 1 - max_genetic_damage = 20 weapon_type = /obj/item/weapon/melee/arm_blade weapon_name_simple = "blade" @@ -217,9 +212,7 @@ and Harm will stun it, and stab it if we're also holding a sharp weapon. Cannot be used while in lesser form." chemical_cost = 10 dna_cost = 2 - genetic_damage = 5 req_human = 1 - max_genetic_damage = 10 weapon_type = /obj/item/weapon/gun/magic/tentacle weapon_name_simple = "tentacle" silent = TRUE @@ -381,9 +374,7 @@ helptext = "Organic tissue cannot resist damage forever; the shield will break after it is hit too much. The more genomes we absorb, the stronger it is. Cannot be used while in lesser form." chemical_cost = 20 dna_cost = 1 - genetic_damage = 12 req_human = 1 - max_genetic_damage = 20 weapon_type = /obj/item/weapon/shield/changeling weapon_name_simple = "shield" @@ -430,12 +421,10 @@ /obj/effect/proc_holder/changeling/suit/organic_space_suit name = "Organic Space Suit" desc = "We grow an organic suit to protect ourselves from space exposure." - helptext = "We must constantly repair our form to make it space-proof, reducing chemical production while we are protected. Retreating the suit damages our genomes. Cannot be used in lesser form." + helptext = "We must constantly repair our form to make it space-proof, reducing chemical production while we are protected. Cannot be used in lesser form." chemical_cost = 20 dna_cost = 2 - genetic_damage = 8 req_human = 1 - max_genetic_damage = 20 suit_type = /obj/item/clothing/suit/space/changeling helmet_type = /obj/item/clothing/head/helmet/space/changeling @@ -477,12 +466,10 @@ /obj/effect/proc_holder/changeling/suit/armor name = "Chitinous Armor" desc = "We turn our skin into tough chitin to protect us from damage." - helptext = "Upkeep of the armor requires a low expenditure of chemicals. The armor is strong against brute force, but does not provide much protection from lasers. Retreating the armor damages our genomes. Cannot be used in lesser form." + helptext = "Upkeep of the armor requires a low expenditure of chemicals. The armor is strong against brute force, but does not provide much protection from lasers. Cannot be used in lesser form." chemical_cost = 20 dna_cost = 1 - genetic_damage = 11 req_human = 1 - max_genetic_damage = 20 recharge_slowdown = 0.25 suit_type = /obj/item/clothing/suit/armor/changeling diff --git a/code/game/gamemodes/changeling/powers/tiny_prick.dm b/code/game/gamemodes/changeling/powers/tiny_prick.dm index c44a32c24d..ad6bf81e7c 100644 --- a/code/game/gamemodes/changeling/powers/tiny_prick.dm +++ b/code/game/gamemodes/changeling/powers/tiny_prick.dm @@ -40,10 +40,9 @@ return if(!AStar(user, target.loc, /turf/proc/Distance, user.mind.changeling.sting_range, simulated_only = 0)) return - if(target.mind && target.mind.changeling) - sting_feedback(user,target) - take_chemical_cost(user.mind.changeling) - return + if(target.mind && target.mind.changeling) + sting_feedback(user, target) + user.mind.changeling.chem_charges -= chemical_cost return 1 /obj/effect/proc_holder/changeling/sting/sting_feedback(mob/user, mob/target) @@ -62,7 +61,6 @@ sting_icon = "sting_transform" chemical_cost = 40 dna_cost = 3 - genetic_damage = 100 var/datum/changelingprofile/selected_dna = null /obj/effect/proc_holder/changeling/sting/transformation/Click() @@ -117,8 +115,6 @@ sting_icon = "sting_armblade" chemical_cost = 20 dna_cost = 1 - genetic_damage = 20 - max_genetic_damage = 10 /obj/item/weapon/melee/arm_blade/false desc = "A grotesque mass of flesh that used to be your arm. Although it looks dangerous at first, you can tell it's actually quite dull and useless." diff --git a/code/game/gamemodes/changeling/powers/transform.dm b/code/game/gamemodes/changeling/powers/transform.dm index f9aca83d04..9d0b095cc2 100644 --- a/code/game/gamemodes/changeling/powers/transform.dm +++ b/code/game/gamemodes/changeling/powers/transform.dm @@ -5,7 +5,6 @@ dna_cost = 0 req_dna = 1 req_human = 1 - max_genetic_damage = 3 /obj/item/clothing/glasses/changeling name = "flesh" From 5de94c22e7c8dae66d7a3ea3b1a37e179d796a09 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 May 2017 20:25:46 -0500 Subject: [PATCH 36/92] Fixes grammar error on spawner grenades --- code/game/objects/items/weapons/grenades/spawnergrenade.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/weapons/grenades/spawnergrenade.dm b/code/game/objects/items/weapons/grenades/spawnergrenade.dm index 2d5c4707a6..86c01d745e 100644 --- a/code/game/objects/items/weapons/grenades/spawnergrenade.dm +++ b/code/game/objects/items/weapons/grenades/spawnergrenade.dm @@ -1,5 +1,5 @@ /obj/item/weapon/grenade/spawnergrenade - desc = "It will unleash unleash an unspecified anomaly into the vicinity." + desc = "It will unleash an unspecified anomaly into the vicinity." name = "delivery grenade" icon = 'icons/obj/grenade.dmi' icon_state = "delivery" From 01d80a0cc073bfd5dbc709256e8a7fd37319bfc9 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 May 2017 20:40:05 -0500 Subject: [PATCH 37/92] Takes out an airlock in xenobiology's kill room [Pubby] --- _maps/map_files/PubbyStation/PubbyStation.dmm | 4 ---- 1 file changed, 4 deletions(-) diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index e0e721840d..8310ff2f50 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -32850,10 +32850,6 @@ /turf/open/floor/plasteel/white, /area/toxins/xenobiology) "bnU" = ( -/obj/machinery/door/airlock/research{ - name = "Kill Room Access"; - req_access_txt = "55" - }, /obj/structure/disposalpipe/segment{ dir = 4 }, From d67618815c77a0f90fb3efefb4b72399a72266a8 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 May 2017 20:59:29 -0500 Subject: [PATCH 38/92] Mobs that are faking death won't bleed. --- code/modules/mob/living/blood.dm | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index ca380170f7..ca8b8f2d9d 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -35,22 +35,21 @@ blood_volume += 0.1 // regenerate blood VERY slowly //Effects of bloodloss + var/word = pick("dizzy","woozy","faint") switch(blood_volume) if(BLOOD_VOLUME_OKAY to BLOOD_VOLUME_SAFE) if(prob(5)) - to_chat(src, "You feel [pick("dizzy","woozy","faint")].") + to_chat(src, "You feel [word].") adjustOxyLoss(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.01, 1)) if(BLOOD_VOLUME_BAD to BLOOD_VOLUME_OKAY) adjustOxyLoss(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.02, 1)) if(prob(5)) blur_eyes(6) - var/word = pick("dizzy","woozy","faint") to_chat(src, "You feel very [word].") if(BLOOD_VOLUME_SURVIVE to BLOOD_VOLUME_BAD) adjustOxyLoss(5) if(prob(15)) Paralyse(rand(1,3)) - var/word = pick("dizzy","woozy","faint") to_chat(src, "You feel extremely [word].") if(0 to BLOOD_VOLUME_SURVIVE) death() @@ -70,7 +69,7 @@ bleed_rate = max(bleed_rate - 0.5, temp_bleed)//if no wounds, other bleed effects (heparin) naturally decreases - if(bleed_rate && !bleedsuppress) + if(bleed_rate && !bleedsuppress && !(status_flags & FAKEDEATH)) bleed(bleed_rate) //Makes a blood drop, leaking amt units of blood from the mob From 1da6f676f0965c00f9c588bc90e6adf7ffb8552b Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 May 2017 20:59:33 -0500 Subject: [PATCH 39/92] Fixes SM Tesla admin log spam, adds containment field count to investigate logs. --- code/modules/power/tesla/energy_ball.dm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm index fbb82cb36a..df3fcdcfe2 100644 --- a/code/modules/power/tesla/energy_ball.dm +++ b/code/modules/power/tesla/energy_ball.dm @@ -54,6 +54,11 @@ GLOBAL_LIST_INIT(blacklisted_tesla_types, typecacheof(list(/obj/machinery/atmosp . = ..() +/obj/singularity/energy_ball/admin_investigate_setup() + if(istype(loc, /obj/singularity/energy_ball)) + return + ..() + /obj/singularity/energy_ball/process() if(!orbiting) handle_energy() From aa13c4f148a50f9bb806b333c93bec00e085d43b Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 May 2017 23:16:48 -0500 Subject: [PATCH 40/92] Corrects docking port name for escape pods --- _maps/map_files/Cerestation/cerestation.dmm | 18 +++++++------- .../map_files/Deltastation/DeltaStation2.dmm | 18 +++++++------- _maps/map_files/MetaStation/MetaStation.dmm | 24 +++++++++---------- _maps/map_files/TgStation/tgstation.2.1.3.dmm | 24 +++++++++---------- 4 files changed, 42 insertions(+), 42 deletions(-) diff --git a/_maps/map_files/Cerestation/cerestation.dmm b/_maps/map_files/Cerestation/cerestation.dmm index f10211f5b1..860ff65d60 100644 --- a/_maps/map_files/Cerestation/cerestation.dmm +++ b/_maps/map_files/Cerestation/cerestation.dmm @@ -7034,8 +7034,8 @@ "anI" = ( /obj/docking_port/stationary/random{ dir = 1; - id = "pod_asteroid1"; - name = "asteroid" + id = "pod_lavaland1"; + name = "lavaland" }, /turf/open/space, /area/space) @@ -8103,7 +8103,7 @@ /obj/machinery/computer/shuttle/pod{ pixel_x = -32; pixel_y = 0; - possible_destinations = "pod_asteroid1"; + possible_destinations = "pod_lavaland1"; shuttleId = "pod1" }, /obj/machinery/light/small{ @@ -40738,7 +40738,7 @@ /obj/machinery/computer/shuttle/pod{ pixel_x = 0; pixel_y = 32; - possible_destinations = "pod_asteroid3"; + possible_destinations = "pod_lavaland3"; shuttleId = "pod3" }, /obj/item/device/radio/intercom{ @@ -40760,8 +40760,8 @@ "btw" = ( /obj/docking_port/stationary/random{ dir = 4; - id = "pod_asteroid3"; - name = "asteroid" + id = "pod_lavaland3"; + name = "lavaland" }, /turf/open/space, /area/space) @@ -68963,8 +68963,8 @@ "crd" = ( /obj/docking_port/stationary/random{ dir = 8; - id = "pod_asteroid2"; - name = "asteroid" + id = "pod_lavaland2"; + name = "lavaland" }, /turf/open/space, /area/space) @@ -68979,7 +68979,7 @@ /obj/machinery/computer/shuttle/pod{ pixel_x = 0; pixel_y = -32; - possible_destinations = "pod_asteroid2"; + possible_destinations = "pod_lavaland2"; shuttleId = "pod2" }, /obj/structure/chair{ diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index c46f6ea830..db3e3e780d 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -142,15 +142,15 @@ /area/solar/auxstarboard) "aap" = ( /obj/docking_port/stationary/random{ - id = "pod_asteroid1"; - name = "asteroid" + id = "pod_lavaland1"; + name = "lavaland" }, /turf/open/space, /area/space) "aaq" = ( /obj/docking_port/stationary/random{ - id = "pod_asteroid2"; - name = "asteroid" + id = "pod_lavaland2"; + name = "lavaland" }, /turf/open/space, /area/space) @@ -203,7 +203,7 @@ }, /obj/machinery/computer/shuttle/pod{ pixel_x = -32; - possible_destinations = "pod_asteroid1"; + possible_destinations = "pod_lavaland1"; shuttleId = "pod1" }, /obj/effect/turf_decal/stripes/line{ @@ -226,7 +226,7 @@ }, /obj/machinery/computer/shuttle/pod{ pixel_x = -32; - possible_destinations = "pod_asteroid2"; + possible_destinations = "pod_lavaland2"; shuttleId = "pod2" }, /obj/effect/turf_decal/stripes/line{ @@ -25977,7 +25977,7 @@ }, /obj/machinery/computer/shuttle/pod{ pixel_y = -32; - possible_destinations = "pod_asteroid3"; + possible_destinations = "pod_lavaland3"; shuttleId = "pod3" }, /obj/effect/turf_decal/stripes/line{ @@ -25996,8 +25996,8 @@ "aXK" = ( /obj/docking_port/stationary/random{ dir = 4; - id = "pod_asteroid4"; - name = "asteroid" + id = "pod_lavaland4"; + name = "lavaland" }, /turf/open/space, /area/space) diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 320823a490..9d5c5ac3f0 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -1910,8 +1910,8 @@ /area/shuttle/pod_3) "adG" = ( /obj/docking_port/stationary/random{ - id = "pod_asteroid2"; - name = "asteroid" + id = "pod_lavaland2"; + name = "lavaland" }, /turf/open/space, /area/space) @@ -1927,7 +1927,7 @@ }, /obj/machinery/computer/shuttle/pod{ pixel_x = -32; - possible_destinations = "pod_asteroid2"; + possible_destinations = "pod_lavaland2"; shuttleId = "pod2" }, /turf/open/floor/mineral/titanium/blue, @@ -23696,7 +23696,7 @@ }, /obj/machinery/computer/shuttle/pod{ pixel_y = -32; - possible_destinations = "pod_asteroid3"; + possible_destinations = "pod_lavaland3"; shuttleId = "pod3" }, /turf/open/floor/mineral/titanium/blue, @@ -34140,8 +34140,8 @@ "bii" = ( /obj/docking_port/stationary/random{ dir = 4; - id = "pod_asteroid3"; - name = "asteroid" + id = "pod_lavaland3"; + name = "lavaland" }, /turf/open/space, /area/space) @@ -86084,8 +86084,8 @@ /area/toxins/xenobiology) "cSP" = ( /obj/docking_port/stationary/random{ - id = "pod_asteroid1"; - name = "asteroid" + id = "pod_lavaland1"; + name = "lavaland" }, /turf/open/space, /area/space) @@ -86175,7 +86175,7 @@ }, /obj/machinery/computer/shuttle/pod{ pixel_x = -32; - possible_destinations = "pod_asteroid1"; + possible_destinations = "pod_lavaland1"; shuttleId = "pod1" }, /turf/open/floor/mineral/titanium/blue, @@ -86368,7 +86368,7 @@ }, /obj/machinery/computer/shuttle/pod{ pixel_y = -32; - possible_destinations = "pod_asteroid4"; + possible_destinations = "pod_lavaland4"; shuttleId = "pod4" }, /turf/open/floor/mineral/titanium/blue, @@ -87162,8 +87162,8 @@ "cUL" = ( /obj/docking_port/stationary/random{ dir = 4; - id = "pod_asteroid4"; - name = "asteroid" + id = "pod_lavaland4"; + name = "lavaland" }, /turf/open/space, /area/space) diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm index f2bf5eb504..799d9530cb 100644 --- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm +++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm @@ -2501,7 +2501,7 @@ "afq" = ( /obj/machinery/computer/shuttle/pod{ pixel_y = -32; - possible_destinations = "pod_asteroid3"; + possible_destinations = "pod_lavaland3"; shuttleId = "pod3" }, /obj/structure/chair{ @@ -7787,8 +7787,8 @@ "aqG" = ( /obj/docking_port/stationary/random{ dir = 4; - id = "pod_asteroid3"; - name = "asteroid" + id = "pod_lavaland3"; + name = "lavaland" }, /turf/open/space, /area/space) @@ -53823,8 +53823,8 @@ "cpe" = ( /obj/docking_port/stationary/random{ dir = 8; - id = "pod_asteroid2"; - name = "asteroid" + id = "pod_lavaland2"; + name = "lavaland" }, /turf/open/space, /area/space) @@ -54079,7 +54079,7 @@ /obj/machinery/computer/shuttle/pod{ pixel_x = 0; pixel_y = -32; - possible_destinations = "pod_asteroid2"; + possible_destinations = "pod_lavaland2"; shuttleId = "pod2" }, /obj/structure/chair{ @@ -57394,8 +57394,8 @@ "cwV" = ( /obj/docking_port/stationary/random{ dir = 8; - id = "pod_asteroid1"; - name = "asteroid" + id = "pod_lavaland1"; + name = "lavaland" }, /turf/open/space, /area/space) @@ -57508,7 +57508,7 @@ /obj/machinery/computer/shuttle/pod{ pixel_x = 0; pixel_y = -32; - possible_destinations = "pod_asteroid1"; + possible_destinations = "pod_lavaland1"; shuttleId = "pod1" }, /obj/structure/chair{ @@ -58424,7 +58424,7 @@ "czL" = ( /obj/machinery/computer/shuttle/pod{ pixel_y = -32; - possible_destinations = "pod_asteroid4"; + possible_destinations = "pod_lavaland4"; shuttleId = "pod4" }, /obj/structure/chair{ @@ -58455,8 +58455,8 @@ "czN" = ( /obj/docking_port/stationary/random{ dir = 4; - id = "pod_asteroid4"; - name = "asteroid" + id = "pod_lavaland4"; + name = "lavaland" }, /turf/open/space, /area/space) From 745c74c18bf9759e4f53cf86712c87d1a63c20b2 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 5 May 2017 00:04:35 -0500 Subject: [PATCH 41/92] Fixes spinning (Woops I used a <= instead of a <) --- code/modules/mob/mob.dm.rej | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 code/modules/mob/mob.dm.rej diff --git a/code/modules/mob/mob.dm.rej b/code/modules/mob/mob.dm.rej new file mode 100644 index 0000000000..6cfe50706e --- /dev/null +++ b/code/modules/mob/mob.dm.rej @@ -0,0 +1,10 @@ +diff a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm (rejected hunks) +@@ -350,7 +350,7 @@ + /mob/proc/spin(spintime, speed) + set waitfor = 0 + var/D = dir +- if((spintime <= 1)||(speed <= 1)||!spintime||!speed) ++ if((spintime < 1)||(speed < 1)||!spintime||!speed) + return + while(spintime >= speed) + sleep(speed) From 933a8646bae7db35d8b3ab5affdcc9942bcf040e Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 5 May 2017 06:05:05 -0500 Subject: [PATCH 42/92] Only one successful Gang Tool recall per gang --- code/game/gamemodes/gang/gang_datum.dm | 3 ++- code/game/gamemodes/gang/recaller.dm | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/code/game/gamemodes/gang/gang_datum.dm b/code/game/gamemodes/gang/gang_datum.dm index 3c54d5436b..805cac552f 100644 --- a/code/game/gamemodes/gang/gang_datum.dm +++ b/code/game/gamemodes/gang/gang_datum.dm @@ -13,6 +13,7 @@ var/list/territory = list() var/list/territory_new = list() var/list/territory_lost = list() + var/recalls = 1 var/dom_attempts = 2 var/points = 15 var/datum/atom_hud/antag/gang/ganghud @@ -262,4 +263,4 @@ ganghud = new() /datum/gang/multiverse/income() - return \ No newline at end of file + return diff --git a/code/game/gamemodes/gang/recaller.dm b/code/game/gamemodes/gang/recaller.dm index 0885b32612..f67bcad50a 100644 --- a/code/game/gamemodes/gang/recaller.dm +++ b/code/game/gamemodes/gang/recaller.dm @@ -168,6 +168,9 @@ if(recalling) to_chat(usr, "Error: Recall already in progress.") return 0 + + if(!gang.recalls) + to_chat(usr, "Error: Unable to access communication arrays. Firewall has logged our signature and is blocking all further attempts.") gang.message_gangtools("[usr] is attempting to recall the emergency shuttle.") recalling = 1 @@ -209,6 +212,7 @@ userturf = get_turf(user) if(userturf.z == 1) //Check one more time that they are on station. if(SSshuttle.cancelEvac(user)) + gang.recalls -= 1 return 1 to_chat(loc, "\icon[src]No response recieved. Emergency shuttle cannot be recalled at this time.") From 9b3aaa45261a6a3b90ee30d48dbadd82d382511b Mon Sep 17 00:00:00 2001 From: LetterJay Date: Fri, 5 May 2017 09:36:27 -0500 Subject: [PATCH 43/92] merge --- code/world.dm | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/code/world.dm b/code/world.dm index 7af27a1504..4f89299b6f 100644 --- a/code/world.dm +++ b/code/world.dm @@ -136,11 +136,7 @@ if(!key_valid) return "Bad Key" else -#define CHAT_PULLR 64 //defined in preferences.dm, but not available here at compilation time - for(var/client/C in GLOB.clients) - if(C.prefs && (C.prefs.chat_toggles & CHAT_PULLR)) - to_chat(C, "PR: [input["announce"]]") -#undef CHAT_PULLR + AnnouncePR(input["announce"], json_decode(input["payload"])) else if("crossmessage" in input) if(!key_valid) @@ -176,6 +172,25 @@ else if("server_hop" in input) show_server_hop_transfer_screen(input["server_hop"]) +#define PR_ANNOUNCEMENTS_PER_ROUND 5 //The number of unique PR announcements allowed per round + //This makes sure that a single person can only spam 3 reopens and 3 closes before being ignored + +/world/proc/AnnouncePR(announcement, list/payload) + var/static/list/PRcounts = list() //PR id -> number of times announced this round + var/id = "[payload["pull_request"]["id"]]" + if(!PRcounts[id]) + PRcounts[id] = 1 + else + ++PRcounts[id] + if(PRcounts[id] > PR_ANNOUNCEMENTS_PER_ROUND) + return + +#define CHAT_PULLR 64 //defined in preferences.dm, but not available here at compilation time + for(var/client/C in GLOB.clients) + if(C.prefs && (C.prefs.chat_toggles & CHAT_PULLR)) + C << "PR: [announcement]" +#undef CHAT_PULLR + #define WORLD_REBOOT(X) log_world("World rebooted at [time_stamp()]"); ..(X); return; /world/Reboot(var/reason, var/feedback_c, var/feedback_r, var/time) if (reason == 1) //special reboot, do none of the normal stuff From c3f2e0830480c15245d55b3c402a38329188bbbb Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 5 May 2017 09:39:20 -0500 Subject: [PATCH 44/92] Automatic changelog generation for PR #708 [ci skip] --- html/changelogs/AutoChangeLog-pr-708.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-708.yml diff --git a/html/changelogs/AutoChangeLog-pr-708.yml b/html/changelogs/AutoChangeLog-pr-708.yml new file mode 100644 index 0000000000..6cb7c07312 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-708.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - bugfix: "Squishy plants will now affect walls and other turfs they get squished on" From 5d82e4e729fe4ed9c42efca757547748fe55a54a Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 5 May 2017 09:39:55 -0500 Subject: [PATCH 45/92] Automatic changelog generation for PR #714 [ci skip] --- html/changelogs/AutoChangeLog-pr-714.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-714.yml diff --git a/html/changelogs/AutoChangeLog-pr-714.yml b/html/changelogs/AutoChangeLog-pr-714.yml new file mode 100644 index 0000000000..d5e4582f40 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-714.yml @@ -0,0 +1,4 @@ +author: "XDTM" +delete-after: True +changes: + - tweak: "Blood Cult's talisman of Horrors now works at range. It will still give no warning to the victim." From f902c11f3be28daa0ee88f31dd6948d7214266fe Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 5 May 2017 09:40:09 -0500 Subject: [PATCH 46/92] Automatic changelog generation for PR #717 [ci skip] --- html/changelogs/AutoChangeLog-pr-717.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-717.yml diff --git a/html/changelogs/AutoChangeLog-pr-717.yml b/html/changelogs/AutoChangeLog-pr-717.yml new file mode 100644 index 0000000000..fbb98e0039 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-717.yml @@ -0,0 +1,5 @@ +author: "coiax" +delete-after: True +changes: + - rscadd: "When talking on the alien hivemind, a person will be identified by +their real name, rather than who they are disguised as." From fbdbd67f1d7c8de1909f3c78a9ef6407949d7055 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 5 May 2017 09:45:32 -0500 Subject: [PATCH 47/92] Automatic changelog generation for PR #771 [ci skip] --- html/changelogs/AutoChangeLog-pr-771.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-771.yml diff --git a/html/changelogs/AutoChangeLog-pr-771.yml b/html/changelogs/AutoChangeLog-pr-771.yml new file mode 100644 index 0000000000..031ec64151 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-771.yml @@ -0,0 +1,4 @@ +author: "BeeSting12" +delete-after: True +changes: + - bugfix: "Pubbystation no longer has two airlocks stacked on top of each other leading into xenobiology's kill room." From 20f3280c96db8a9a263b370d0b8f66edb91105b4 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Fri, 5 May 2017 09:52:47 -0500 Subject: [PATCH 48/92] this one time i ate boiled peanuts --- code/game/machinery/hologram.dm | 381 +++++++++++++++++++------------- tgstation.dme | 1 + 2 files changed, 224 insertions(+), 158 deletions(-) diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index ca9cc23380..bc73c41f08 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -26,14 +26,13 @@ Possible to do for anyone motivated enough: #define HOLOPAD_PASSIVE_POWER_USAGE 1 #define HOLOGRAM_POWER_USAGE 2 -#define RANGE_BASED 4 -#define AREA_BASED 6 +GLOBAL_LIST_EMPTY(holopads) #define HOLOPAD_MODE RANGE_BASED /obj/machinery/holopad - name = "\improper AI holopad" - desc = "It's a floor-mounted device for projecting holographic images. It is activated remotely." + name = "Holopad" + desc = "It's a floor-mounted device for projecting holographic images." icon_state = "holopad0" layer = LOW_OBJ_LAYER flags = HEAR @@ -44,29 +43,32 @@ Possible to do for anyone motivated enough: obj_integrity = 300 max_integrity = 300 armor = list(melee = 50, bullet = 20, laser = 20, energy = 20, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 0) - var/list/masters = list()//List of AIs that use the holopad + var/list/masters = list()//List of living mobs that use the holopad var/last_request = 0 //to prevent request spam. ~Carn var/holo_range = 5 // Change to change how far the AI can move away from the holopad before deactivating. var/temp = "" + var/list/holo_calls //array of /datum/holocalls + var/datum/holocall/outgoing_call //do not modify the datums only check and call the public procs + var/static/force_answer_call = FALSE //Calls will be automatically answered after a couple rings, here for debugging var/static/list/holopads = list() -/obj/machinery/holopad/New() +/obj/machinery/holopad/Initialize() ..() var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/holopad(null) B.apply_default_parts(src) holopads += src /obj/machinery/holopad/Destroy() - if(outgoing_call) - LAZYADD(holo_calls, outgoing_call) - - for(var/I in holo_calls) - var/datum/holocall/HC = I - HC.ConnectionFailure(src) - LAZYCLEARLIST(holo_calls) - - for (var/I in masters) - clear_holo(I) + if(outgoing_call) + LAZYADD(holo_calls, outgoing_call) + + for(var/I in holo_calls) + var/datum/holocall/HC = I + HC.ConnectionFailure(src) + LAZYCLEARLIST(holo_calls) + + for (var/I in masters) + clear_holo(I) holopads -= src return ..() @@ -99,20 +101,58 @@ Possible to do for anyone motivated enough: return return ..() +/obj/machinery/holopad/proc/CheckCallClose() + for(var/I in holo_calls) + var/datum/holocall/HC = I + if(usr == HC.eye) + HC.Disconnect(HC.calling_holopad) //disconnect via clicking the called holopad + return TRUE + return FALSE + +/obj/machinery/holopad/Click(location,control,params) + if(!CheckCallClose()) + return ..() + /obj/machinery/holopad/AltClick(mob/living/carbon/human/user) - interact(user) + if(!CheckCallClose()) + interact(user) /obj/machinery/holopad/interact(mob/living/carbon/human/user) //Carn: Hologram requests. if(!istype(user)) return - if(user.stat || !is_operational()) + + if(outgoing_call || user.incapacitated() || !is_operational()) return + user.set_machine(src) var/dat if(temp) dat = temp else - dat = "request an AI's presence." + dat = "Request an AI's presence.
" + dat += "Call another holopad.
" + + if(LAZYLEN(holo_calls)) + dat += "=====================================================
" + + var/one_answered_call = FALSE + var/one_unanswered_call = FALSE + for(var/I in holo_calls) + var/datum/holocall/HC = I + if(HC.connected_holopad != src) + dat += "Answer call from [get_area(HC.calling_holopad)].
" + one_unanswered_call = TRUE + else + one_answered_call = TRUE + + if(one_answered_call && one_unanswered_call) + dat += "=====================================================
" + //we loop twice for formatting + for(var/I in holo_calls) + var/datum/holocall/HC = I + if(HC.connected_holopad == src) + dat += "Disconnect call from [HC.user].
" + var/datum/browser/popup = new(user, "holopad", name, 300, 130) popup.set_content(dat) @@ -120,7 +160,10 @@ Possible to do for anyone motivated enough: popup.open() /obj/machinery/holopad/Topic(href, href_list) - if(..() || !is_operational()) + if(..() || isAI(usr)) + return + add_fingerprint(usr) + if(!is_operational()) return if (href_list["AIrequest"]) if(last_request + 200 < world.time) @@ -128,7 +171,7 @@ Possible to do for anyone motivated enough: temp = "You requested an AI's presence.
" temp += "Main Menu" var/area/area = get_area(src) - for(var/mob/living/silicon/ai/AI in GLOB.living_mob_list) + for(var/mob/living/silicon/ai/AI in GLOB.silicon_mobs) if(!AI.client) continue to_chat(AI, "Your presence is requested at \the [area].") @@ -136,49 +179,49 @@ Possible to do for anyone motivated enough: temp = "A request for AI presence was already sent recently.
" temp += "Main Menu" - else if(href_list["Holocall"]) - if(outgoing_call) - return - - temp = "You must stand on the holopad to make a call!
" - temp += "Main Menu" - if(usr.loc == loc) - var/list/callnames = list() - for(var/I in holopads) - var/area/A = get_area(I) - if(A) - LAZYADD(callnames[A], I) - callnames -= get_area(src) - - var/result = input(usr, "Choose an area to call", "Holocall") as null|anything in callnames - if(QDELETED(usr) || !result || outgoing_call) - return - - if(usr.loc == loc) - temp = "Dialing...
" - temp += "Main Menu" - new /datum/holocall(usr, src, callnames[result]) - - else if(href_list["connectcall"]) - var/datum/holocall/call_to_connect = locate(href_list["connectcall"]) - if(!QDELETED(call_to_connect)) - call_to_connect.Answer(src) - temp = "" - - else if(href_list["disconnectcall"]) - var/datum/holocall/call_to_disconnect = locate(href_list["disconnectcall"]) - if(!QDELETED(call_to_disconnect)) - call_to_disconnect.Disconnect(src) - temp = "" - + else if(href_list["Holocall"]) + if(outgoing_call) + return + + temp = "You must stand on the holopad to make a call!
" + temp += "Main Menu" + if(usr.loc == loc) + var/list/callnames = list() + for(var/I in holopads) + var/area/A = get_area(I) + if(A) + LAZYADD(callnames[A], I) + callnames -= get_area(src) + + var/result = input(usr, "Choose an area to call", "Holocall") as null|anything in callnames + if(QDELETED(usr) || !result || outgoing_call) + return + + if(usr.loc == loc) + temp = "Dialing...
" + temp += "Main Menu" + new /datum/holocall(usr, src, callnames[result]) + + else if(href_list["connectcall"]) + var/datum/holocall/call_to_connect = locate(href_list["connectcall"]) + if(!QDELETED(call_to_connect)) + call_to_connect.Answer(src) + temp = "" + + else if(href_list["disconnectcall"]) + var/datum/holocall/call_to_disconnect = locate(href_list["disconnectcall"]) + if(!QDELETED(call_to_disconnect)) + call_to_disconnect.Disconnect(src) + temp = "" + else if(href_list["mainmenu"]) temp = "" - if(outgoing_call) - outgoing_call.Disconnect() + if(outgoing_call) + outgoing_call.Disconnect() updateDialog() -//do not allow AIs to answer calls or people will use it to meta the AI sattelite +//do not allow AIs to answer calls or people will use it to meta the AI sattelite /obj/machinery/holopad/attack_ai(mob/living/silicon/ai/user) if (!istype(user)) return @@ -193,75 +236,75 @@ Possible to do for anyone motivated enough: clear_holo(user) /obj/machinery/holopad/process() - for(var/I in masters) - var/mob/living/master = I - var/mob/living/silicon/ai/AI = master - if(!istype(AI)) - AI = null - - if(!QDELETED(master) && !master.incapacitated() && master.client && (!AI || AI.eyeobj))//If there is an AI attached, it's not incapacitated, it has a client, and the client eye is centered on the projector. - if(is_operational())//If the machine has power. - if(AI) //ais are range based - if(get_dist(AI.eyeobj, src) <= holo_range) - continue - else - var/obj/machinery/holopad/pad_close = get_closest_atom(/obj/machinery/holopad, holopads, AI.eyeobj) - if(get_dist(pad_close, AI.eyeobj) <= holo_range) - var/obj/effect/overlay/holo_pad_hologram/h = masters[master] - unset_holo(master) - pad_close.set_holo(master, h) - continue - else - continue - clear_holo(master)//If not, we want to get rid of the hologram. - - if(outgoing_call) - outgoing_call.Check() - - for(var/I in holo_calls) - var/datum/holocall/HC = I - if(HC.connected_holopad != src) - if(force_answer_call && world.time > (HC.call_start_time + (HOLOPAD_MAX_DIAL_TIME / 2))) - HC.Answer(src) - break - if(outgoing_call) - HC.Disconnect(src)//can't answer calls while calling - else - playsound(src, 'sound/machines/twobeep.ogg', 100) //bring, bring! - -/obj/machinery/holopad/proc/activate_holo(mob/living/user) - var/mob/living/silicon/ai/AI = user - if(!istype(AI)) - AI = null - - if(is_operational() && (!AI || AI.eyeobj.loc == loc))//If the projector has power and client eye is on it - if (AI && istype(AI.current, /obj/machinery/holopad)) + for(var/I in masters) + var/mob/living/master = I + var/mob/living/silicon/ai/AI = master + if(!istype(AI)) + AI = null + + if(!QDELETED(master) && !master.incapacitated() && master.client && (!AI || AI.eyeobj))//If there is an AI attached, it's not incapacitated, it has a client, and the client eye is centered on the projector. + if(is_operational())//If the machine has power. + if(AI) //ais are range based + if(get_dist(AI.eyeobj, src) <= holo_range) + continue + else + var/obj/machinery/holopad/pad_close = get_closest_atom(/obj/machinery/holopad, holopads, AI.eyeobj) + if(get_dist(pad_close, AI.eyeobj) <= holo_range) + var/obj/effect/overlay/holo_pad_hologram/h = masters[master] + unset_holo(master) + pad_close.set_holo(master, h) + continue + else + continue + clear_holo(master)//If not, we want to get rid of the hologram. + + if(outgoing_call) + outgoing_call.Check() + + for(var/I in holo_calls) + var/datum/holocall/HC = I + if(HC.connected_holopad != src) + if(force_answer_call && world.time > (HC.call_start_time + (HOLOPAD_MAX_DIAL_TIME / 2))) + HC.Answer(src) + break + if(outgoing_call) + HC.Disconnect(src)//can't answer calls while calling + else + playsound(src, 'sound/machines/twobeep.ogg', 100) //bring, bring! + +/obj/machinery/holopad/proc/activate_holo(mob/living/user) + var/mob/living/silicon/ai/AI = user + if(!istype(AI)) + AI = null + + if(is_operational() && (!AI || AI.eyeobj.loc == loc))//If the projector has power and client eye is on it + if (AI && istype(AI.current, /obj/machinery/holopad)) to_chat(user, "ERROR: \black Image feed in progress.") return - - var/obj/effect/overlay/holo_pad_hologram/Hologram = new(loc)//Spawn a blank effect at the location. - if(AI) - Hologram.icon = AI.holo_icon - else //make it like real life - Hologram.icon = user.icon - Hologram.icon_state = user.icon_state - Hologram.copy_overlays(user, TRUE) - //codersprite some holo effects here - Hologram.alpha = 100 - Hologram.add_atom_colour("#77abff", FIXED_COLOUR_PRIORITY) - Hologram.Impersonation = user - - Hologram.languages_spoken = user.languages_spoken - Hologram.mouse_opacity = 0//So you can't click on it. - Hologram.layer = FLY_LAYER//Above all the other objects/mobs. Or the vast majority of them. - Hologram.anchored = 1//So space wind cannot drag it. - Hologram.name = "[user.name] (Hologram)"//If someone decides to right click. - Hologram.set_light(2) //hologram lighting - - set_holo(user, Hologram) - visible_message("A holographic image of [user] flicks to life right before your eyes!") - - return Hologram + + var/obj/effect/overlay/holo_pad_hologram/Hologram = new(loc)//Spawn a blank effect at the location. + if(AI) + Hologram.icon = AI.holo_icon + else //make it like real life + Hologram.icon = user.icon + Hologram.icon_state = user.icon_state + Hologram.copy_overlays(user, TRUE) + //codersprite some holo effects here + Hologram.alpha = 100 + Hologram.add_atom_colour("#77abff", FIXED_COLOUR_PRIORITY) + Hologram.Impersonation = user + + Hologram.languages = user.languages + Hologram.mouse_opacity = 0//So you can't click on it. + Hologram.layer = FLY_LAYER//Above all the other objects/mobs. Or the vast majority of them. + Hologram.anchored = 1//So space wind cannot drag it. + Hologram.name = "[user.name] (Hologram)"//If someone decides to right click. + Hologram.set_light(2) //hologram lighting + + set_holo(user, Hologram) + visible_message("A holographic image of [user] flicks to life right before your eyes!") + + return Hologram else to_chat(user, "ERROR: \black Unable to project hologram.") @@ -273,58 +316,80 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ if(masters[master] && speaker != master) master.relay_speech(message, speaker, message_language, raw_message, radio_freq, spans, message_mode) -/obj/machinery/holopad/proc/create_holo(mob/living/silicon/ai/A, turf/T = loc) - var/obj/effect/overlay/holo_pad_hologram/h = new(T)//Spawn a blank effect at the location. - h.icon = A.holo_icon - h.mouse_opacity = 0//So you can't click on it. - h.layer = FLY_LAYER//Above all the other objects/mobs. Or the vast majority of them. - h.anchored = 1//So space wind cannot drag it. - h.name = "[A.name] (Hologram)"//If someone decides to right click. - h.set_light(2) //hologram lighting - set_holo(A, h) + for(var/I in holo_calls) + var/datum/holocall/HC = I + if(HC.connected_holopad == src && speaker != HC.hologram) + HC.user.Hear(message, speaker, message_language, raw_message, radio_freq, spans) + + if(outgoing_call && speaker == outgoing_call.user) + outgoing_call.hologram.say(raw_message) + +/obj/machinery/holopad/proc/SetLightsAndPower() + var/total_users = masters.len + LAZYLEN(holo_calls) + use_power = HOLOPAD_PASSIVE_POWER_USAGE + HOLOGRAM_POWER_USAGE * total_users + if(total_users) + set_light(2) + icon_state = "holopad1" + else + set_light(0) + icon_state = "holopad0" + +/obj/machinery/holopad/proc/set_holo(mob/living/user, var/obj/effect/overlay/holo_pad_hologram/h) + masters[user] = h + var/mob/living/silicon/ai/AI = user + if(istype(AI)) + AI.current = src + SetLightsAndPower() return TRUE -/obj/machinery/holopad/proc/set_holo(mob/living/silicon/ai/A, var/obj/effect/overlay/holo_pad_hologram/h) - masters[A] = h - set_light(2) // pad lighting - icon_state = "holopad1" - A.current = src - use_power += HOLOGRAM_POWER_USAGE - return TRUE - -/obj/machinery/holopad/proc/clear_holo(mob/living/silicon/ai/user) +/obj/machinery/holopad/proc/clear_holo(mob/living/user) qdel(masters[user]) // Get rid of user's hologram unset_holo(user) return TRUE -/obj/machinery/holopad/proc/unset_holo(mob/living/silicon/ai/user) - if(user.current == src) - user.current = null +/obj/machinery/holopad/proc/unset_holo(mob/living/user) + var/mob/living/silicon/ai/AI = user + if(istype(AI) && AI.current == src) + AI.current = null masters -= user // Discard AI from the list of those who use holopad - use_power = max(HOLOPAD_PASSIVE_POWER_USAGE, use_power - HOLOGRAM_POWER_USAGE)//Reduce power usage - if (!masters.len) // If no users left - set_light(0) // pad lighting (hologram lighting will be handled automatically since its owner was deleted) - icon_state = "holopad0" - use_power = HOLOPAD_PASSIVE_POWER_USAGE + SetLightsAndPower() return TRUE -/obj/machinery/holopad/proc/move_hologram(mob/living/silicon/ai/user) +/obj/machinery/holopad/proc/move_hologram(mob/living/user, turf/new_turf) if(masters[user]) - step_to(masters[user], user.eyeobj) var/obj/effect/overlay/holo_pad_hologram/H = masters[user] - H.loc = get_turf(user.eyeobj) + step_to(H, new_turf) + H.loc = new_turf + var/area/holo_area = get_area(src) + var/area/eye_area = new_turf.loc + + if(!(eye_area in holo_area.related)) + clear_holo(user) return TRUE +/obj/effect/overlay/holo_pad_hologram + var/mob/living/Impersonation + var/datum/holocall/HC + +/obj/effect/overlay/holo_pad_hologram/Destroy() + Impersonation = null + if(HC) + HC.Disconnect(HC.calling_holopad) + return ..() + /obj/effect/overlay/holo_pad_hologram/Process_Spacemove(movement_dir = 0) return 1 +/obj/effect/overlay/holo_pad_hologram/examine(mob/user) + if(Impersonation) + return Impersonation.examine(user) + return ..() + /obj/item/weapon/circuitboard/machine/holopad name = "AI Holopad (Machine Board)" build_path = /obj/machinery/holopad origin_tech = "programming=1" req_components = list(/obj/item/weapon/stock_parts/capacitor = 1) -#undef RANGE_BASED -#undef AREA_BASED #undef HOLOPAD_PASSIVE_POWER_USAGE -#undef HOLOGRAM_POWER_USAGE +#undef HOLOGRAM_POWER_USAGE \ No newline at end of file diff --git a/tgstation.dme b/tgstation.dme index 8f80e4e005..6c0ff5f987 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -243,6 +243,7 @@ #include "code\datums\dog_fashion.dm" #include "code\datums\emotes.dm" #include "code\datums\forced_movement.dm" +#include "code\datums\holocall.dm" #include "code\datums\hud.dm" #include "code\datums\map_config.dm" #include "code\datums\martial.dm" From bbf43a464a26591ac39b49f72b59eb2ce4a5ac71 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Fri, 5 May 2017 10:00:17 -0500 Subject: [PATCH 49/92] yey --- code/modules/power/generator.dm | 67 ++++++++++++++++----------------- 1 file changed, 33 insertions(+), 34 deletions(-) diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm index 70d4ea27a2..9fe043a4a0 100644 --- a/code/modules/power/generator.dm +++ b/code/modules/power/generator.dm @@ -28,12 +28,12 @@ /obj/machinery/power/generator/Initialize(mapload) - . = ..() + . = ..() var/obj/machinery/atmospherics/components/binary/circulator/circpath = /obj/machinery/atmospherics/components/binary/circulator cold_circ = locate(circpath) in get_step(src, cold_dir) hot_circ = locate(circpath) in get_step(src, hot_dir) connect_to_network() - SSair.atmos_machinery += src + SSair.atmos_machinery += src if(cold_circ) switch(cold_dir) @@ -55,10 +55,10 @@ stat |= BROKEN update_icon() - -/obj/machinery/power/generator/Destroy() - SSair.atmos_machinery -= src - return ..() + +/obj/machinery/power/generator/Destroy() + SSair.atmos_machinery -= src + return ..() /obj/machinery/power/generator/update_icon() @@ -67,21 +67,20 @@ else cut_overlays() - if(lastgenlev != 0) - add_overlay("teg-op[lastgenlev]") + var/L = min(round(lastgenlev/100000),11) + if(L != 0) + add_overlay(image('icons/obj/power.dmi', "teg-op[L]")) - add_overlay("teg-oc[lastcirc]") + add_overlay("teg-oc[lastcirc]") #define GENRATE 800 // generator output coefficient from Q -/obj/machinery/power/generator/process() +/obj/machinery/power/generator/process_atmos() if(!cold_circ || !hot_circ) return - lastgen = 0 - if(powernet) //to_chat(world, "cold_circ and hot_circ pass") @@ -108,7 +107,7 @@ var/energy_transfer = delta_temperature*hot_air_heat_capacity*cold_air_heat_capacity/(hot_air_heat_capacity+cold_air_heat_capacity) var/heat = energy_transfer*(1-efficiency) - lastgen += energy_transfer*efficiency + lastgen += energy_transfer*efficiency //to_chat(world, "lastgen = [lastgen]; heat = [heat]; delta_temperature = [delta_temperature]; hot_air_heat_capacity = [hot_air_heat_capacity]; cold_air_heat_capacity = [cold_air_heat_capacity];") @@ -117,7 +116,7 @@ //to_chat(world, "POWER: [lastgen] W generated at [efficiency*100]% efficiency and sinks sizes [cold_air_heat_capacity], [hot_air_heat_capacity]") - //add_avail(lastgen) This is done in process now + //add_avail(lastgen) This is done in process now // update icon overlays only if displayed level has changed if(hot_air) @@ -127,23 +126,23 @@ if(cold_air) var/datum/gas_mixture/cold_circ_air1 = cold_circ.AIR1 cold_circ_air1.merge(cold_air) - - update_icon() + + update_icon() var/circ = "[cold_circ && cold_circ.last_pressure_delta > 0 ? "1" : "0"][hot_circ && hot_circ.last_pressure_delta > 0 ? "1" : "0"]" - if(circ != lastcirc) + if(circ != lastcirc) lastcirc = circ update_icon() src.updateDialog() - -/obj/machinery/power/generator/process() - //Setting this number higher just makes the change in power output slower, it doesnt actualy reduce power output cause **math** - var/power_output = round(lastgen / 10) - add_avail(power_output) - lastgenlev = power_output - lastgen -= power_output - ..() + +/obj/machinery/power/generator/process() + //Setting this number higher just makes the change in power output slower, it doesnt actualy reduce power output cause **math** + var/power_output = round(lastgen / 10) + add_avail(power_output) + lastgenlev = power_output + lastgen -= power_output + ..() /obj/machinery/power/generator/attack_hand(mob/user) if(..()) @@ -162,15 +161,15 @@ var/datum/gas_mixture/hot_circ_air2 = hot_circ.AIR2 t += "
" - - var/displaygen = lastgenlev - if(displaygen < 1000000) //less than a MW - displaygen /= 1000 - t += "Output: [round(displaygen,0.01)] kW" - else - displaygen /= 1000000 - t += "Output: [round(displaygen,0.01)] MW" - + + var/displaygen = lastgenlev + if(displaygen < 1000000) //less than a MW + displaygen /= 1000 + t += "Output: [round(displaygen,0.01)] kW" + else + displaygen /= 1000000 + t += "Output: [round(displaygen,0.01)] MW" + t += "
" t += "Cold loop
" From a873459fa4b06730f4fa4286dc3cd7104c448fc7 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 5 May 2017 10:19:29 -0500 Subject: [PATCH 50/92] Automatic changelog generation for PR #698 [ci skip] --- html/changelogs/AutoChangeLog-pr-698.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-698.yml diff --git a/html/changelogs/AutoChangeLog-pr-698.yml b/html/changelogs/AutoChangeLog-pr-698.yml new file mode 100644 index 0000000000..40e55644b5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-698.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - rscadd: "You can now make holocalls! Simply stand on a pad, bring up the menu, and select the holopad you wish to call. Remain still until someone answers. When they do, you'll be able to act just like an AI hologram until the call ends" From d2612eaaafca74cf6de4a3b5e338fe13dd99caa5 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 5 May 2017 10:20:13 -0500 Subject: [PATCH 51/92] Automatic changelog generation for PR #701 [ci skip] --- html/changelogs/AutoChangeLog-pr-701.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-701.yml diff --git a/html/changelogs/AutoChangeLog-pr-701.yml b/html/changelogs/AutoChangeLog-pr-701.yml new file mode 100644 index 0000000000..8848bcb450 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-701.yml @@ -0,0 +1,7 @@ +author: "ninjanomnom" +delete-after: True +changes: + - tweak: "TEG displays power in kw or MW now" + - tweak: "TEG power bar only maxes over 1MW now" + - experiment: "Moves TEG to SSair" + - experiment: "Moves SM to SSair" From 1bb43eb7aea5a4b7991f527e454f79b948a55c33 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Fri, 5 May 2017 10:21:53 -0500 Subject: [PATCH 52/92] woo --- code/controllers/subsystem/garbage.dm.rej | 9 - code/datums/antagonists/datum_cult.dm.rej | 25 -- code/game/machinery/hologram.dm.rej | 226 ------------------ code/modules/admin/topic.dm.rej | 10 - code/modules/admin/verbs/deadsay.dm.rej | 10 - .../mob/living/carbon/human/death.dm.rej | 10 - code/modules/power/generator.dm.rej | 13 - tgstation.dme.rej | 9 - 8 files changed, 312 deletions(-) delete mode 100644 code/controllers/subsystem/garbage.dm.rej delete mode 100644 code/datums/antagonists/datum_cult.dm.rej delete mode 100644 code/game/machinery/hologram.dm.rej delete mode 100644 code/modules/admin/topic.dm.rej delete mode 100644 code/modules/admin/verbs/deadsay.dm.rej delete mode 100644 code/modules/mob/living/carbon/human/death.dm.rej delete mode 100644 code/modules/power/generator.dm.rej delete mode 100644 tgstation.dme.rej diff --git a/code/controllers/subsystem/garbage.dm.rej b/code/controllers/subsystem/garbage.dm.rej deleted file mode 100644 index 2075155c49..0000000000 --- a/code/controllers/subsystem/garbage.dm.rej +++ /dev/null @@ -1,9 +0,0 @@ -diff a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm (rejected hunks) -@@ -725,7 +725,6 @@ var/datum/controller/subsystem/garbage_collector/SSgarbage - SearchVar(multiverse) - SearchVar(announcement_systems) - SearchVar(doppler_arrays) -- SearchVar(HOLOPAD_MODE) - SearchVar(holopads) - SearchVar(news_network) - SearchVar(allCasters) diff --git a/code/datums/antagonists/datum_cult.dm.rej b/code/datums/antagonists/datum_cult.dm.rej deleted file mode 100644 index 0fc846a73c..0000000000 --- a/code/datums/antagonists/datum_cult.dm.rej +++ /dev/null @@ -1,25 +0,0 @@ -diff a/code/datums/antagonists/datum_cult.dm b/code/datums/antagonists/datum_cult.dm (rejected hunks) -@@ -5,13 +5,20 @@ - qdel(communion) - return ..() - -+/datum/antagonist/cult/can_be_owned(datum/mind/new_owner) -+ . = ..() -+ if(.) -+ . = is_convertable_to_cult(new_owner.current) -+ - /datum/antagonist/cult/on_gain() - . = ..() -- if(!owner) -- return -+ SSticker.mode.cult += owner -+ SSticker.mode.update_cult_icons_added(owner) -+ if(istype(SSticker.mode, /datum/game_mode/cult)) -+ var/datum/game_mode/cult/C = SSticker.mode -+ C.memorize_cult_objectives(owner) - if(jobban_isbanned(owner.current, ROLE_CULTIST)) - addtimer(CALLBACK(SSticker.mode, /datum/game_mode.proc/replace_jobbaned_player, owner.current, ROLE_CULTIST, ROLE_CULTIST), 0) -- SSticker.mode.update_cult_icons_added(owner) - owner.current.log_message("Has been converted to the cult of Nar'Sie!", INDIVIDUAL_ATTACK_LOG) - - /datum/antagonist/cult/apply_innate_effects(mob/living/mob_override) diff --git a/code/game/machinery/hologram.dm.rej b/code/game/machinery/hologram.dm.rej deleted file mode 100644 index 5dcbcc9d54..0000000000 --- a/code/game/machinery/hologram.dm.rej +++ /dev/null @@ -1,226 +0,0 @@ -diff a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm (rejected hunks) -@@ -26,16 +26,12 @@ Possible to do for anyone motivated enough: - - #define HOLOPAD_PASSIVE_POWER_USAGE 1 - #define HOLOGRAM_POWER_USAGE 2 --#define RANGE_BASED 4 --#define AREA_BASED 6 -- --var/const/HOLOPAD_MODE = RANGE_BASED - - var/list/holopads = list() - - /obj/machinery/holopad -- name = "\improper AI holopad" -- desc = "It's a floor-mounted device for projecting holographic images. It is activated remotely." -+ name = "Holopad" -+ desc = "It's a floor-mounted device for projecting holographic images." - icon_state = "holopad0" - layer = LOW_OBJ_LAYER - flags = HEAR -@@ -48,10 +44,13 @@ var/list/holopads = list() - obj_integrity = 300 - max_integrity = 300 - armor = list(melee = 50, bullet = 20, laser = 20, energy = 20, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 0) -- var/list/masters = list()//List of AIs that use the holopad -+ var/list/masters = list()//List of living mobs that use the holopad - var/last_request = 0 //to prevent request spam. ~Carn - var/holo_range = 5 // Change to change how far the AI can move away from the holopad before deactivating. - var/temp = "" -+ var/list/holo_calls //array of /datum/holocalls -+ var/datum/holocall/outgoing_call //do not modify the datums only check and call the public procs -+ var/static/force_answer_call = FALSE //Calls will be automatically answered after a couple rings, here for debugging - - /obj/machinery/holopad/Initialize() - ..() -@@ -94,20 +101,60 @@ var/list/holopads = list() - return - return ..() - -+/obj/machinery/holopad/proc/CheckCallClose() -+ for(var/I in holo_calls) -+ var/datum/holocall/HC = I -+ if(usr == HC.eye) -+ HC.Disconnect(HC.calling_holopad) //disconnect via clicking the called holopad -+ return TRUE -+ return FALSE -+ -+/obj/machinery/holopad/Click(location,control,params) -+ if(!CheckCallClose()) -+ return ..() -+ - /obj/machinery/holopad/AltClick(mob/living/carbon/human/user) -- interact(user) -+ if(!CheckCallClose()) -+ interact(user) - - /obj/machinery/holopad/interact(mob/living/carbon/human/user) //Carn: Hologram requests. - if(!istype(user)) - return -- if(user.stat || stat & (NOPOWER|BROKEN)) -+ if(user.incapacitated() || !is_operational()) -+ return -+ -+ if(outgoing_call) //someone is making a call, leave them be - return -+ - user.set_machine(src) - var/dat - if(temp) - dat = temp - else -- dat = "request an AI's presence." -+ dat = "Request an AI's presence.
" -+ dat += "Call another holopad.
" -+ -+ if(LAZYLEN(holo_calls)) -+ dat += "=====================================================
" -+ -+ var/one_answered_call = FALSE -+ var/one_unanswered_call = FALSE -+ for(var/I in holo_calls) -+ var/datum/holocall/HC = I -+ if(HC.connected_holopad != src) -+ dat += "Answer call from [get_area(HC.calling_holopad)].
" -+ one_unanswered_call = TRUE -+ else -+ one_answered_call = TRUE -+ -+ if(one_answered_call && one_unanswered_call) -+ dat += "=====================================================
" -+ //we loop twice for formatting -+ for(var/I in holo_calls) -+ var/datum/holocall/HC = I -+ if(HC.connected_holopad == src) -+ dat += "Disconnect call from [HC.user].
" -+ - - var/datum/browser/popup = new(user, "holopad", name, 300, 130) - popup.set_content(dat) -@@ -115,7 +162,10 @@ var/list/holopads = list() - popup.open() - - /obj/machinery/holopad/Topic(href, href_list) -- if(..()) -+ if(..() || isAI(usr)) -+ return -+ add_fingerprint(usr) -+ if(!is_operational()) - return - if (href_list["AIrequest"]) - if(last_request + 200 < world.time) -@@ -194,59 +317,81 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ - for(var/mob/living/silicon/ai/master in masters) - if(masters[master] && speaker != master) - master.relay_speech(message, speaker, message_langs, raw_message, radio_freq, spans) -+ -+ for(var/I in holo_calls) -+ var/datum/holocall/HC = I -+ if(HC.connected_holopad == src && speaker != HC.hologram) -+ HC.user.Hear(message, speaker, message_langs, raw_message, radio_freq, spans) -+ -+ if(outgoing_call && speaker == outgoing_call.user) -+ outgoing_call.hologram.say(raw_message) -+ -+/obj/machinery/holopad/proc/SetLightsAndPower() -+ var/total_users = masters.len + LAZYLEN(holo_calls) -+ use_power = HOLOPAD_PASSIVE_POWER_USAGE + HOLOGRAM_POWER_USAGE * total_users -+ if(total_users) -+ set_light(2) -+ icon_state = "holopad1" -+ else -+ set_light(0) -+ icon_state = "holopad0" - --/obj/machinery/holopad/proc/create_holo(mob/living/silicon/ai/A, turf/T = loc) -- var/obj/effect/overlay/holo_pad_hologram/h = new(T)//Spawn a blank effect at the location. -- h.icon = A.holo_icon -- h.mouse_opacity = 0//So you can't click on it. -- h.layer = FLY_LAYER//Above all the other objects/mobs. Or the vast majority of them. -- h.anchored = 1//So space wind cannot drag it. -- h.name = "[A.name] (Hologram)"//If someone decides to right click. -- h.set_light(2) //hologram lighting -- set_holo(A, h) -- return TRUE -- --/obj/machinery/holopad/proc/set_holo(mob/living/silicon/ai/A, var/obj/effect/overlay/holo_pad_hologram/h) -- masters[A] = h -- set_light(2) // pad lighting -- icon_state = "holopad1" -- A.current = src -- use_power += HOLOGRAM_POWER_USAGE -+/obj/machinery/holopad/proc/set_holo(mob/living/user, var/obj/effect/overlay/holo_pad_hologram/h) -+ masters[user] = h -+ var/mob/living/silicon/ai/AI = user -+ if(istype(AI)) -+ AI.current = src -+ SetLightsAndPower() - return TRUE - --/obj/machinery/holopad/proc/clear_holo(mob/living/silicon/ai/user) -+/obj/machinery/holopad/proc/clear_holo(mob/living/user) - qdel(masters[user]) // Get rid of user's hologram - unset_holo(user) - return TRUE - --/obj/machinery/holopad/proc/unset_holo(mob/living/silicon/ai/user) -- if(user.current == src) -- user.current = null -+/obj/machinery/holopad/proc/unset_holo(mob/living/user) -+ var/mob/living/silicon/ai/AI = user -+ if(istype(AI) && AI.current == src) -+ AI.current = null - masters -= user // Discard AI from the list of those who use holopad -- use_power = max(HOLOPAD_PASSIVE_POWER_USAGE, use_power - HOLOGRAM_POWER_USAGE)//Reduce power usage -- if (!masters.len) // If no users left -- set_light(0) // pad lighting (hologram lighting will be handled automatically since its owner was deleted) -- icon_state = "holopad0" -- use_power = HOLOPAD_PASSIVE_POWER_USAGE -+ SetLightsAndPower() - return TRUE - --/obj/machinery/holopad/proc/move_hologram(mob/living/silicon/ai/user) -+/obj/machinery/holopad/proc/move_hologram(mob/living/user, turf/new_turf) - if(masters[user]) -- step_to(masters[user], user.eyeobj) - var/obj/effect/overlay/holo_pad_hologram/H = masters[user] -- H.loc = get_turf(user.eyeobj) -+ step_to(H, new_turf) -+ H.loc = new_turf -+ var/area/holo_area = get_area(src) -+ var/area/eye_area = new_turf.loc -+ -+ if(!(eye_area in holo_area.related)) -+ clear_holo(user) - return TRUE - -+/obj/effect/overlay/holo_pad_hologram -+ var/mob/living/Impersonation -+ var/datum/holocall/HC -+ -+/obj/effect/overlay/holo_pad_hologram/Destroy() -+ Impersonation = null -+ if(HC) -+ HC.Disconnect(HC.calling_holopad) -+ return ..() -+ - /obj/effect/overlay/holo_pad_hologram/Process_Spacemove(movement_dir = 0) - return 1 - -+/obj/effect/overlay/holo_pad_hologram/examine(mob/user) -+ if(Impersonation) -+ return Impersonation.examine(user) -+ return ..() -+ - /obj/item/weapon/circuitboard/machine/holopad - name = "AI Holopad (Machine Board)" - build_path = /obj/machinery/holopad - origin_tech = "programming=1" - req_components = list(/obj/item/weapon/stock_parts/capacitor = 1) - --#undef RANGE_BASED --#undef AREA_BASED - #undef HOLOPAD_PASSIVE_POWER_USAGE --#undef HOLOGRAM_POWER_USAGE -+#undef HOLOGRAM_POWER_USAGE -\ No newline at end of file diff --git a/code/modules/admin/topic.dm.rej b/code/modules/admin/topic.dm.rej deleted file mode 100644 index 041ae92107..0000000000 --- a/code/modules/admin/topic.dm.rej +++ /dev/null @@ -1,10 +0,0 @@ -diff a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm (rejected hunks) -@@ -8,7 +8,7 @@ - if(href_list["ahelp"]) - if(!check_rights(R_ADMIN)) - return -- -+ - var/ahelp_ref = href_list["ahelp"] - var/datum/admin_help/AH = locate(ahelp_ref) - if(AH) diff --git a/code/modules/admin/verbs/deadsay.dm.rej b/code/modules/admin/verbs/deadsay.dm.rej deleted file mode 100644 index 7d0347427b..0000000000 --- a/code/modules/admin/verbs/deadsay.dm.rej +++ /dev/null @@ -1,10 +0,0 @@ -diff a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm (rejected hunks) -@@ -19,7 +19,7 @@ - - if (!msg) - return -- var/static/nicknames = world.file2list("strings/admin_nicknames.txt") -+ var/static/nicknames = world.file2list("config/admin_nicknames.txt") - - var/rendered = "DEAD: ADMIN([src.holder.fakekey ? pick(nicknames) : src.key]) says, \"[msg]\"" - diff --git a/code/modules/mob/living/carbon/human/death.dm.rej b/code/modules/mob/living/carbon/human/death.dm.rej deleted file mode 100644 index a4a1fc5a7c..0000000000 --- a/code/modules/mob/living/carbon/human/death.dm.rej +++ /dev/null @@ -1,10 +0,0 @@ -diff a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm (rejected hunks) -@@ -32,7 +32,7 @@ - - dna.species.spec_death(gibbed, src) - -- if(SSticker && SSticker.mode) -+ if(SSticker.HasRoundStarted()) - SSblackbox.ReportDeath(src) - if(mind && mind.devilinfo) - INVOKE_ASYNC(mind.devilinfo, /datum/devilinfo.proc/beginResurrectionCheck, src) diff --git a/code/modules/power/generator.dm.rej b/code/modules/power/generator.dm.rej deleted file mode 100644 index 9de6ba6b3a..0000000000 --- a/code/modules/power/generator.dm.rej +++ /dev/null @@ -1,13 +0,0 @@ -diff a/code/modules/power/generator.dm b/code/modules/power/generator.dm (rejected hunks) -@@ -64,9 +64,8 @@ - else - cut_overlays() - -- var/L = min(round(lastgenlev/100000),11) -- -- if(L != 0) -+ var/L = min(round(lastgenlev/100000),11) -+ if(L != 0) - add_overlay(image('icons/obj/power.dmi', "teg-op[L]")) - - add_overlay("teg-oc[lastcirc]") diff --git a/tgstation.dme.rej b/tgstation.dme.rej deleted file mode 100644 index 0f29d8f023..0000000000 --- a/tgstation.dme.rej +++ /dev/null @@ -1,9 +0,0 @@ -diff a/tgstation.dme b/tgstation.dme (rejected hunks) -@@ -206,6 +206,7 @@ - #include "code\datums\emotes.dm" - #include "code\datums\forced_movement.dm" - #include "code\datums\gas_overrides.dm" -+#include "code\datums\holocall.dm" - #include "code\datums\hud.dm" - #include "code\datums\map_config.dm" - #include "code\datums\martial.dm" From 55c71ff5a93fbb1b258ee9beed4e066cade9fd4d Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 5 May 2017 10:27:18 -0500 Subject: [PATCH 53/92] Tesla light --- code/modules/power/singularity/narsie.dm | 4 ++-- code/modules/power/singularity/singularity.dm | 4 ++-- code/modules/power/tesla/energy_ball.dm | 7 ++++++- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm index 9deebdfe10..7d0d4fdbb5 100644 --- a/code/modules/power/singularity/narsie.dm +++ b/code/modules/power/singularity/narsie.dm @@ -26,8 +26,8 @@ grav_pull = 10 consume_range = 12 //How many tiles out do we eat -/obj/singularity/narsie/large/New() - ..() +/obj/singularity/narsie/large/Initialize() + . = ..() send_to_playing_players("NAR-SIE HAS RISEN") send_to_playing_players(pick('sound/hallucinations/im_here1.ogg', 'sound/hallucinations/im_here2.ogg')) diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index 3b0bc3087b..1a308ed471 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -29,12 +29,12 @@ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF dangerous_possession = TRUE -/obj/singularity/New(loc, var/starting_energy = 50, var/temp = 0) +/obj/singularity/Initialize(mapload, starting_energy = 50) //CARN: admin-alert for chuckle-fuckery. admin_investigate_setup() src.energy = starting_energy - ..() + . = ..() START_PROCESSING(SSobj, src) GLOB.poi_list |= src GLOB.singularities |= src diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm index fbb82cb36a..f23b58b1ab 100644 --- a/code/modules/power/tesla/energy_ball.dm +++ b/code/modules/power/tesla/energy_ball.dm @@ -40,6 +40,11 @@ GLOBAL_LIST_INIT(blacklisted_tesla_types, typecacheof(list(/obj/machinery/atmosp var/energy_to_raise = 32 var/energy_to_lower = -20 +/obj/singularity/energy_ball/Initialize(mapload, starting_energy = 50, is_miniball = FALSE) + . = ..() + if(!is_miniball) + set_light(10, 7, "#EEEEFF") + /obj/singularity/energy_ball/ex_act(severity, target) return @@ -117,7 +122,7 @@ GLOBAL_LIST_INIT(blacklisted_tesla_types, typecacheof(list(/obj/machinery/atmosp /obj/singularity/energy_ball/proc/new_mini_ball() if(!loc) return - var/obj/singularity/energy_ball/EB = new(loc) + var/obj/singularity/energy_ball/EB = new(loc, 0, TRUE) EB.transform *= pick(0.3, 0.4, 0.5, 0.6, 0.7) var/icon/I = icon(icon,icon_state,dir) From 426430369ef1777766f0cfbadc7d4f5164f0b5c9 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 5 May 2017 10:28:22 -0500 Subject: [PATCH 54/92] Sigils of Transgression are slightly more visible and glow very faintly --- code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm b/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm index 6c56295c05..3c9a0d5d99 100644 --- a/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm +++ b/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm @@ -54,8 +54,11 @@ clockwork_desc = "A sigil that will stun the next non-Servant to cross it." icon_state = "sigildull" layer = HIGH_SIGIL_LAYER - alpha = 60 + alpha = 75 color = "#FAE48C" + light_range = 1.4 + light_power = 0.4 + light_color = "#FAE48C" sigil_name = "Sigil of Transgression" /obj/effect/clockwork/sigil/transgression/sigil_effects(mob/living/L) From 684c4a52449f94e8a1c17a2b5aebfc0a4a049dd0 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 5 May 2017 10:28:26 -0500 Subject: [PATCH 55/92] Fixes answering a holocall not disconnecting other calls --- code/datums/holocall.dm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/code/datums/holocall.dm b/code/datums/holocall.dm index 0153e41414..6d6b1104dc 100644 --- a/code/datums/holocall.dm +++ b/code/datums/holocall.dm @@ -111,6 +111,11 @@ var/obj/machinery/holopad/Holo = I LAZYREMOVE(Holo.holo_calls, src) dialed_holopads -= Holo + + for(var/I in H.holo_calls) + var/datum/holocall/HC = I + if(HC != src) + HC.Disconnect(H) if(!Check()) return From c489186c3f2228c175dfd7abddcdadd55d24397b Mon Sep 17 00:00:00 2001 From: LetterJay Date: Fri, 5 May 2017 10:38:03 -0500 Subject: [PATCH 56/92] message code --- code/game/machinery/hologram.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index bc73c41f08..30ff4c23a0 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -319,7 +319,7 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ for(var/I in holo_calls) var/datum/holocall/HC = I if(HC.connected_holopad == src && speaker != HC.hologram) - HC.user.Hear(message, speaker, message_language, raw_message, radio_freq, spans) + HC.user.Hear(message, speaker, message_language, raw_message, radio_freq, spans, message_mode) if(outgoing_call && speaker == outgoing_call.user) outgoing_call.hologram.say(raw_message) From 39876074ca95af22949cc0ac72754dbb241f1419 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 5 May 2017 15:37:22 -0500 Subject: [PATCH 57/92] Automatic changelog generation for PR #781 [ci skip] --- html/changelogs/AutoChangeLog-pr-781.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-781.yml diff --git a/html/changelogs/AutoChangeLog-pr-781.yml b/html/changelogs/AutoChangeLog-pr-781.yml new file mode 100644 index 0000000000..08a5c148ff --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-781.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - tweak: "Teslas now give off light" From 7288549decf377cd6e0fe34454677666ec5e0c10 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 5 May 2017 18:08:56 -0500 Subject: [PATCH 58/92] Players may no longer commite suicide --- code/modules/client/verbs/suicide.dm.rej | 10 ++++++++++ code/modules/mob/living/carbon/human/examine.dm | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 code/modules/client/verbs/suicide.dm.rej diff --git a/code/modules/client/verbs/suicide.dm.rej b/code/modules/client/verbs/suicide.dm.rej new file mode 100644 index 0000000000..a2e5063fd6 --- /dev/null +++ b/code/modules/client/verbs/suicide.dm.rej @@ -0,0 +1,10 @@ +diff a/code/modules/client/verbs/suicide.dm b/code/modules/client/verbs/suicide.dm (rejected hunks) +@@ -12,7 +12,7 @@ + return + if(confirm == "Yes") + suiciding = 1 +- log_game("[key_name(src)] (job: [job ? "[job]" : "None"]) commited suicide at [get_area(src)].") ++ log_game("[key_name(src)] (job: [job ? "[job]" : "None"]) committed suicide at [get_area(src)].") + var/obj/item/held_item = get_active_held_item() + if(held_item) + var/damagetype = held_item.suicide_act(src) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 9081591395..a3bb2fefde 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -134,7 +134,7 @@ if(stat == DEAD || (status_flags & FAKEDEATH)) appears_dead = 1 if(suiciding) - msg += "[t_He] appear[p_s()] to have commited suicide... there is no hope of recovery.\n" + msg += "[t_He] appear[p_s()] to have committed suicide... there is no hope of recovery.\n" if(hellbound) msg += "[t_His] soul seems to have been ripped out of [t_his] body. Revival is impossible.\n" msg += "[t_He] [t_is] limp and unresponsive; there are no signs of life" From 0fb29b2650f77cd8001b426472f85c4a63b7b98e Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 5 May 2017 18:10:01 -0500 Subject: [PATCH 59/92] Improves vending machine user feedback --- code/game/machinery/vending.dm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 7d02e70671..e7a90ce9c2 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -307,7 +307,10 @@ if(panel_open) attack_hand(user) return - else if(istype(W, /obj/item/weapon/coin) && premium.len > 0) + else if(istype(W, /obj/item/weapon/coin)) + if(!premium.len) + to_chat(user, "[src] doesn't have a coin slot.") + return if(!user.drop_item()) return W.loc = src From b993d9ad2304e89915b91c5105bc23bb84de44ce Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 5 May 2017 18:33:34 -0500 Subject: [PATCH 60/92] Holy water will now properly make you jittery --- code/modules/reagents/chemistry/reagents/other_reagents.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index c25a1d050d..53c2d1b0ec 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -189,7 +189,7 @@ /datum/reagent/water/holywater/on_mob_life(mob/living/M) if(!data) data = 1 data++ - M.jitteriness = max(M.jitteriness-5,0) + M.jitteriness = min(M.jitteriness+4,10) if(data >= 30) // 12 units, 54 seconds @ metabolism 0.4 units & tick rate 1.8 sec if(!M.stuttering) M.stuttering = 1 @@ -212,9 +212,9 @@ SSticker.mode.remove_cultist(M.mind, 1, 1) else if(is_servant_of_ratvar(M)) remove_servant_of_ratvar(M) - holder.remove_reagent(id, volume) // maybe this is a little too perfect and a max() cap on the statuses would be better?? M.jitteriness = 0 M.stuttering = 0 + holder.remove_reagent(id, volume) // maybe this is a little too perfect and a max() cap on the statuses would be better?? return holder.remove_reagent(id, 0.4) //fixed consumption to prevent balancing going out of whack From 358046709f72047a4224c834f9cdf6b211dd8cf7 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 5 May 2017 20:08:03 -0500 Subject: [PATCH 61/92] Various Deltastation Map Fixes/Edits --- .../map_files/Deltastation/DeltaStation2.dmm | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index c46f6ea830..a7df9a5154 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -79512,8 +79512,13 @@ name = "Medbay Central" }) "cUf" = ( -/obj/machinery/smartfridge/chemistry, -/turf/closed/wall, +/obj/structure/grille, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "chemisttop"; + name = "Chemisty Lobby Shutters" + }, +/obj/structure/window/reinforced/fulltile, +/turf/open/floor/plating, /area/medical/medbay{ name = "Medbay Central" }) @@ -79536,14 +79541,9 @@ name = "Medbay Central" }) "cUh" = ( -/obj/structure/grille, -/obj/structure/window/reinforced/fulltile, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "chemisttop"; - name = "Chemisty Lobby Shutters" - }, /obj/structure/disposalpipe/segment, -/turf/open/floor/plating, +/obj/machinery/smartfridge/chemistry, +/turf/closed/wall, /area/medical/medbay{ name = "Medbay Central" }) @@ -82189,6 +82189,7 @@ /obj/item/weapon/grenade/chem_grenade, /obj/item/weapon/grenade/chem_grenade, /obj/item/weapon/grenade/chem_grenade, +/obj/item/weapon/screwdriver, /turf/open/floor/plasteel/whiteyellow/corner{ icon_state = "whiteyellowcorner"; dir = 8 @@ -96353,7 +96354,6 @@ }, /area/medical/morgue) "dAn" = ( -/turf/open/floor/plating, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ icon_state = "manifold"; From a084031dc4ddf4d8b5d8586b3350439737a0c6c1 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 6 May 2017 05:12:36 -0500 Subject: [PATCH 62/92] hm --- code/modules/power/singularity/narsie.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm index 7d0d4fdbb5..fb2df4deeb 100644 --- a/code/modules/power/singularity/narsie.dm +++ b/code/modules/power/singularity/narsie.dm @@ -14,6 +14,7 @@ light_power = 0.7 light_range = 15 light_color = rgb(255, 0, 0) + gender = FEMALE var/clashing = FALSE //If Nar-Sie is fighting Ratvar /obj/singularity/narsie/large From d0335b6d07c5b04e480e811060396c4a610b6fac Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 6 May 2017 05:12:39 -0500 Subject: [PATCH 63/92] Blorble --- code/modules/mob/living/simple_animal/slime/slime.dm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm index 8971d33b28..f9bcfe1b6f 100644 --- a/code/modules/mob/living/simple_animal/slime/slime.dm +++ b/code/modules/mob/living/simple_animal/slime/slime.dm @@ -16,7 +16,7 @@ response_disarm = "shoos" response_harm = "stomps on" emote_see = list("jiggles", "bounces in place") - speak_emote = list("telepathically chirps") + speak_emote = list("blorbles") bubble_icon = "slime" initial_languages = list(/datum/language/common, /datum/language/slime) @@ -31,10 +31,10 @@ see_in_dark = 8 - verb_say = "telepathically chirps" - verb_ask = "telepathically asks" - verb_exclaim = "telepathically cries" - verb_yell = "telephatically cries" + verb_say = "blorbles" + verb_ask = "inquisitively blorbles" + verb_exclaim = "loudly blorbles" + verb_yell = "loudly blorbles" // canstun and canweaken don't affect slimes because they ignore stun and weakened variables // for the sake of cleanliness, though, here they are. From 2922a9fee8f554e50471bbf94be6af01b46da4fa Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 6 May 2017 08:09:25 -0500 Subject: [PATCH 64/92] Seed vault lavaland ruin can only spawn once --- code/datums/ruins/lavaland.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/datums/ruins/lavaland.dm b/code/datums/ruins/lavaland.dm index 3a54db4e0a..011363f001 100644 --- a/code/datums/ruins/lavaland.dm +++ b/code/datums/ruins/lavaland.dm @@ -42,6 +42,7 @@ However, all the inhabitants seem to do is grow drugs and guns." suffix = "lavaland_surface_seed_vault.dmm" cost = 10 + allow_duplicates = FALSE /datum/map_template/ruin/lavaland/ash_walker name = "Ash Walker Nest" From 8a3b280ede7a62e4c841b53931df184c16cdedb8 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 6 May 2017 10:42:51 -0500 Subject: [PATCH 65/92] Preliminary tesla projectile refactor (also insults vcordie because I'm mean.) --- code/game/mecha/equipment/weapons/weapons.dm | 2 +- code/modules/projectiles/ammunition/energy.dm | 2 +- code/modules/projectiles/projectile/energy.dm | 38 +++++++------------ 3 files changed, 16 insertions(+), 26 deletions(-) diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index 7a9d01bb7f..658a6a7692 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -107,7 +107,7 @@ icon_state = "mecha_ion" origin_tech = "materials=4;engineering=4;combat=6;magnets=6" energy_drain = 500 - projectile = /obj/item/projectile/energy/tesla_cannon + projectile = /obj/item/projectile/energy/tesla/cannon fire_sound = 'sound/magic/lightningbolt.ogg' diff --git a/code/modules/projectiles/ammunition/energy.dm b/code/modules/projectiles/ammunition/energy.dm index a6440e32ed..b1fd49779f 100644 --- a/code/modules/projectiles/ammunition/energy.dm +++ b/code/modules/projectiles/ammunition/energy.dm @@ -191,7 +191,7 @@ fire_sound = 'sound/magic/lightningbolt.ogg' e_cost = 200 select_name = "stun" - projectile_type = /obj/item/projectile/energy/tesla_revolver + projectile_type = /obj/item/projectile/energy/tesla/revolver /obj/item/ammo_casing/energy/gravityrepulse projectile_type = /obj/item/projectile/gravityrepulse diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm index c1a67f4c81..974ea935f2 100644 --- a/code/modules/projectiles/projectile/energy.dm +++ b/code/modules/projectiles/projectile/energy.dm @@ -159,44 +159,34 @@ /obj/item/projectile/energy/bolt/large damage = 20 -/obj/item/projectile/energy/tesla_revolver +/obj/item/projectile/energy/tesla name = "tesla bolt" icon_state = "tesla_projectile" impact_effect_type = /obj/effect/overlay/temp/impact_effect/blue_laser var/chain -/obj/item/projectile/energy/tesla_revolver/fire(setAngle) +/obj/item/projectile/energy/tesla/fire(setAngle) if(firer) chain = firer.Beam(src, icon_state = "lightning[rand(1, 12)]", time = INFINITY, maxdistance = INFINITY) ..() -/obj/item/projectile/energy/tesla_revolver/on_hit(atom/target) - . = ..() - if(isliving(target)) - tesla_zap(src, 3, 10000) - qdel(src) - -/obj/item/projectile/energy/tesla_revolver/Destroy() +/obj/item/projectile/energy/tesla/Destroy() qdel(chain) return ..() +/obj/item/projectile/energy/tesla/revolver + name = "energy orb" -/obj/item/projectile/energy/tesla_cannon - name = "tesla bolt" - icon_state = "tesla_projectile" - impact_effect_type = /obj/effect/overlay/temp/impact_effect/blue_laser - var/chain +/obj/item/projectile/energy/tesla/revolver/on_hit(atom/target) + . = ..() + if(isliving(target)) + tesla_zap(target, 3, 10000) + qdel(src) -/obj/item/projectile/energy/tesla_cannon/fire(setAngle) - if(firer) - chain = firer.Beam(src, icon_state = "lightning[rand(1, 12)]", time = INFINITY, maxdistance = INFINITY) - ..() +/obj/item/projectile/energy/tesla/cannon + name = "tesla orb" -/obj/item/projectile/energy/tesla_cannon/on_hit(atom/target) +/obj/item/projectile/energy/tesla/cannon/on_hit(atom/target) . = ..() - tesla_zap(src, 3, 10000, explosive = FALSE, stun_mobs = FALSE) + tesla_zap(target, 3, 10000, explosive = FALSE, stun_mobs = FALSE) qdel(src) - -/obj/item/projectile/energy/tesla_cannon/Destroy() - qdel(chain) - return ..() From 310f23db5c3fcdb61f8068fd9b7a07e8684d2573 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 6 May 2017 10:46:00 -0500 Subject: [PATCH 66/92] Fixes HTTPSGet being unprotected --- code/__HELPERS/unsorted.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 1da1b50aa3..d0fcb3bcbe 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1342,6 +1342,7 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) //This prevents RCEs from badmins //kevinz000 if you touch this I will hunt you down GLOBAL_VAR_INIT(valid_HTTPSGet, FALSE) +GLOBAL_PROTECT(valid_HTTPSGet) /proc/HTTPSGet(url) if(findtext(url, "\"")) GLOB.valid_HTTPSGet = FALSE From 10846d5d37d84546c54f583ad54555474757cd40 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 6 May 2017 10:48:07 -0500 Subject: [PATCH 67/92] Replaces stun/weaken from Miner's salve --- .../modules/reagents/chemistry/reagents/medicine_reagents.dm | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 500147d233..e91c35b974 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -347,10 +347,9 @@ /datum/reagent/medicine/mine_salve/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1) if(iscarbon(M) && M.stat != DEAD) if(method in list(INGEST, VAPOR, INJECT)) - M.Stun(4) - M.Weaken(4) + M.nutrition -= 5 if(show_message) - to_chat(M, "Your stomach agonizingly cramps!") + to_chat(M, "Your stomach feels empty and cramps!") else var/mob/living/carbon/C = M for(var/s in C.surgeries) From 5af090a9d0ab5a0d05bed68b58b6355104f96f7f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 6 May 2017 13:35:30 -0500 Subject: [PATCH 68/92] Automatic changelog generation for PR #745 [ci skip] --- html/changelogs/AutoChangeLog-pr-745.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-745.yml diff --git a/html/changelogs/AutoChangeLog-pr-745.yml b/html/changelogs/AutoChangeLog-pr-745.yml new file mode 100644 index 0000000000..b9aa3fddd2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-745.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - bugfix: "revenants now properly resurrect from ectoplasm, as opposed to ectoplasm merely spawning a new grief ghost" From 6b0daad4ebbf6b034e3ad824ff9338533a76d6bc Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 6 May 2017 13:39:02 -0500 Subject: [PATCH 69/92] Automatic changelog generation for PR #746 [ci skip] --- html/changelogs/AutoChangeLog-pr-746.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-746.yml diff --git a/html/changelogs/AutoChangeLog-pr-746.yml b/html/changelogs/AutoChangeLog-pr-746.yml new file mode 100644 index 0000000000..ddeea1d732 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-746.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - bugfix: "Turrets can no longer see invisible things, such as unrevealed revenants" From 231e87ee2e3f6e32851ce17bd1720359ead1d383 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 6 May 2017 13:41:37 -0500 Subject: [PATCH 70/92] Automatic changelog generation for PR #747 [ci skip] --- html/changelogs/AutoChangeLog-pr-747.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-747.yml diff --git a/html/changelogs/AutoChangeLog-pr-747.yml b/html/changelogs/AutoChangeLog-pr-747.yml new file mode 100644 index 0000000000..583f6b5e56 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-747.yml @@ -0,0 +1,4 @@ +author: "QualityVan" +delete-after: True +changes: + - rscadd: "Point flashlights at mouths to see what's inside them" From c5f764445241153050e6e90e6f2844799f461982 Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Sat, 6 May 2017 11:48:24 -0700 Subject: [PATCH 71/92] Update suicide.dm --- code/modules/client/verbs/suicide.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/client/verbs/suicide.dm b/code/modules/client/verbs/suicide.dm index 6847a7c1f4..1f50a697c2 100644 --- a/code/modules/client/verbs/suicide.dm +++ b/code/modules/client/verbs/suicide.dm @@ -13,8 +13,8 @@ return if(confirm == "Yes") suiciding = 1 - log_game("[key_name(src)] (job: [job ? "[job]" : "None"]) commited suicide at [get_area(src)].") - message_admins("[key_name(src)] (job: [job ? "[job]" : "None"]) commited suicide at [get_area(src)].") + log_game("[key_name(src)] (job: [job ? "[job]" : "None"]) committed suicide at [get_area(src)].") + message_admins("[key_name(src)] (job: [job ? "[job]" : "None"]) committed suicide at [get_area(src)].") var/obj/item/held_item = get_active_held_item() if(held_item) var/damagetype = held_item.suicide_act(src) From b440ba70b074c53fbc44bdc2bdc31139ab474773 Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Sat, 6 May 2017 11:49:26 -0700 Subject: [PATCH 72/92] Delete suicide.dm.rej --- code/modules/client/verbs/suicide.dm.rej | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 code/modules/client/verbs/suicide.dm.rej diff --git a/code/modules/client/verbs/suicide.dm.rej b/code/modules/client/verbs/suicide.dm.rej deleted file mode 100644 index a2e5063fd6..0000000000 --- a/code/modules/client/verbs/suicide.dm.rej +++ /dev/null @@ -1,10 +0,0 @@ -diff a/code/modules/client/verbs/suicide.dm b/code/modules/client/verbs/suicide.dm (rejected hunks) -@@ -12,7 +12,7 @@ - return - if(confirm == "Yes") - suiciding = 1 -- log_game("[key_name(src)] (job: [job ? "[job]" : "None"]) commited suicide at [get_area(src)].") -+ log_game("[key_name(src)] (job: [job ? "[job]" : "None"]) committed suicide at [get_area(src)].") - var/obj/item/held_item = get_active_held_item() - if(held_item) - var/damagetype = held_item.suicide_act(src) From 30f7e170a387b53313bfd2cddfb3ab98a1e88f04 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 6 May 2017 13:52:12 -0500 Subject: [PATCH 73/92] Makes medbay vending machines buildable --- code/game/machinery/vending.dm | 11 ++++++++--- .../objects/items/weapons/vending_items.dm | 6 ++++++ code/modules/cargo/packs.dm | 8 ++++++++ icons/obj/vending_restock.dmi | Bin 1224 -> 1343 bytes 4 files changed, 22 insertions(+), 3 deletions(-) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 7d02e70671..28b5a56af0 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -56,6 +56,7 @@ var/dish_quants = list() //used by the snack machine's custom compartment to count dishes. var/obj/item/weapon/vending_refill/refill_canister = null //The type of refill canisters used by this machine. + var/refill_count = 3 //The number of canisters the vending machine uses /obj/machinery/vending/Initialize() ..() @@ -88,7 +89,9 @@ /obj/machinery/vending/cola = "Robust Softdrinks", /obj/machinery/vending/cigarette = "ShadyCigs Deluxe", /obj/machinery/vending/autodrobe = "AutoDrobe", - /obj/machinery/vending/clothing = "ClothesMate") + /obj/machinery/vending/clothing = "ClothesMate", + /obj/machinery/vending/medical = "NanoMed Plus", + /obj/machinery/vending/wallmed = "NanoMed") /obj/item/weapon/circuitboard/machine/vendor/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/weapon/screwdriver)) @@ -104,7 +107,7 @@ /obj/item/weapon/circuitboard/machine/vendor/proc/set_type(var/obj/machinery/vending/typepath) build_path = typepath name = "[names_paths[build_path]] Vendor (Machine Board)" - req_components = list(initial(typepath.refill_canister) = 3) + req_components = list(initial(typepath.refill_canister) = initial(typepath.refill_count)) /obj/item/weapon/circuitboard/machine/vendor/apply_default_parts(obj/machinery/M) for(var/typepath in names_paths) @@ -113,7 +116,6 @@ break ..() - /obj/machinery/vending/Destroy() qdel(wires) wires = null @@ -874,6 +876,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C premium = list(/obj/item/weapon/storage/box/hug/medical = 1,/obj/item/weapon/reagent_containers/hypospray/medipen = 3, /obj/item/weapon/storage/belt/medical = 3, /obj/item/weapon/wrench/medical = 1) armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50) resistance_flags = FIRE_PROOF + refill_canister = /obj/item/weapon/vending_refill/medical //This one's from bay12 /obj/machinery/vending/plasmaresearch @@ -896,6 +899,8 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C contraband = list(/obj/item/weapon/reagent_containers/pill/tox = 2,/obj/item/weapon/reagent_containers/pill/morphine = 2) armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50) resistance_flags = FIRE_PROOF + refill_canister = /obj/item/weapon/vending_refill/medical + refill_count = 1 /obj/machinery/vending/security name = "\improper SecTech" diff --git a/code/game/objects/items/weapons/vending_items.dm b/code/game/objects/items/weapons/vending_items.dm index 74ab7be4b6..c93dcaca3b 100644 --- a/code/game/objects/items/weapons/vending_items.dm +++ b/code/game/objects/items/weapons/vending_items.dm @@ -71,3 +71,9 @@ icon_state = "refill_clothes" charges = list(31, 4, 4)// of 101 standard, 12 contraband, 10 premium(?) init_charges = list(31, 4, 4) + +/obj/item/weapon/vending_refill/medical + machine_name = "NanoMed" + icon_state = "refill_medical" + charges = list(26, 5, 3)// of 76 standard, 13 contraband, 8 premium + init_charges = list(26, 5, 3) \ No newline at end of file diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index b7c7a7e377..5d9f29a374 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -828,6 +828,14 @@ /obj/item/weapon/defibrillator/loaded) crate_name = "defibrillator crate" +/datum/supply_pack/medical/vending + name = "Medical Vending Crate" + cost = 2000 + contains = list(/obj/item/weapon/vending_refill/medical, + /obj/item/weapon/vending_refill/medical, + /obj/item/weapon/vending_refill/medical) + crate_name = "medical vending crate" + ////////////////////////////////////////////////////////////////////////////// //////////////////////////// Science ///////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// diff --git a/icons/obj/vending_restock.dmi b/icons/obj/vending_restock.dmi index aa9f2873f02222c6b42c0e2b6865252e4d146553..eac7b8a266846d2499b22b5b6e97f7af561cf82d 100644 GIT binary patch delta 1163 zcmV;61a$kz3BL-EBmv%$C8K}Dm0+@qQtVzh|7QQl4L8HTui_3W+1c5vtE)afKCKHe zDJdyhT3TJ1z8pAjy}i9BKaUnHR>na97Z(>WFfighTFU?c00DGTPE!Ct=GbNc005wR zR9JLGWpiV4X>fFDZ*Bkpc$}5dO$x#=5C!0Ma*ELI#lNi^X(?UUD@cD#re1stCYQ@@D}@8Ry0jEdIzf(Agb}?z z^Q_HONntT^K5wKLqYkj-FC1usQhXtL6=OqQm)aZsG0W*5%DJcHfJ=D*i$?ojyjJbd ze17u=$c=q5u@Yk`004gjV@X6oRA_Bsx|ko|v+Xt=u*_#`KQe+t*U zoB+;|jdKDxcXvPlsb<8MKy(~oq~*R_1p)QVFHk3Ri-?Y68)>;8xGjyE zAO*X-f=e@i2JkN8{5#buK*bxrE3T(As7L``jo+Z`1Mn^q0gkf@z(~RUoxtVXhtB~F zfOio$p!dHcw$Ohr2!PK43{YKP@Rx1IrN8*I=p^szWvL-fEyVZ85#XE+V+)i0ZG@d zi>1dD=J)%kiKAu&xV7f3_QAnH)yloTlPV1Jc(;eUy>5Rq8vy;=?Q8((_tgLJP{W&1 zFUoXJE6b^WOMgD_!t547-t6L>0M6SjtUn)k;i0zwM>x{*7CzFS4=|X4#Jf%X`QhkT zS>MA@)NeQgSnuHsAU`@jQ3X)fa1{{B<@WUK?Cg|tIs--d?NbZRk591Nu4%vScpm=% zoq=pHI6r?szYr_Hk<9!3ewgk-ot)sIGGOG5ME{p&zydC)1P9LnOa=?e~TuNJgRqC7BpbN1MtI>9FU|+Ie84q2e3U#cZeE1JUwdz9)p*%0haZ;A78}# zuW7%3dRFy+D@nxpAb2S`1J>`C@!Rq(UZ(y2S>6AWMD+i%{=DBWnLgP63j?<8|Ahgj d{~P_!`U6O3qMDlEUw{Ar002ovPDHLkV1nmrKHC5Q delta 1044 zcmV+v1nc|13djkNBmu^eC8K}H4L9NrD%siDtE;O%K0d7rF)1l2T3T8hIBzFEj}|Oe z7Z(>WFfimCL+1bh00DGTPE!Ct=GbNc005YJR9JLGWpiV4X>fFDZ*Bkpc$`yKaB_9` z^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*x*Fl2jm5sVFrq zGbbm$I4?0dTZxM^C9|j)C~U~ZnO2mTn+joLD9+8#P9;`xQht6F(TbDva}tSFo0U(3 zvBf2&xx_2a$uG%BEykr>S;5uM1svD_%9w8F=VtAf0009FNkl({_yuFblzFMW+^*lmIIrq5?<3EEs0d19W;(4y?l2RUaxqQUGY~*l3{o+4B zoDlabGjM;u8?q7u@f7U@B?f{MmzEd^?(ZW5)-H%oftfg=#K?a`zl{ufyMLg^V2PNC zQ#3C zTUl9IS^YDr`^tBal=0hO8E{4A`94l)oWzJbTizd>oSd|s((%JwQB=l9V>%j-lA-~w zKNu7ZP`-!yr>6#<#N)V-J)I(l`hD~LAc%@fgn2TeB?f|7h)qe#YY+yfl%aSt#*JHOBwK-Fkt5UJtzax$4*3JyKcgx?fO z2!4J+)pQN{dKd)a0qB8RU^<)4uH+18tnxHXqkIi|?1Elv4d%gI=6|IJ+~5i%IXVZN zr|HH4`1OB{&R{;A2ZkQ(&S0#cK`Li(eRHe3AMhm-`Cjb-{~abE?+?jHcR%0;g5TWg z^ZhW8`5t|>11l>lE33bzs(fF&{x(=HmUnk|i-sL= z{pGS*1C;Nf{(@DH`Yi+DvRu$+4RF3+(EElBaK3-Pe`wkOA|-qL@wgJ%^Zwzfd4qMf zdR%4e+~DDfHk)m@!79u6CpUPa&ws#R1qLf&K%ZZlH{ffOuMikKzq~eW;5cu`*;RJ@ zmgoDIS2e%Z63_SR?0x;7t@C`}bbXQU*IXs}zP3SCzOQXy^S#yote*%ThjW>s+o%8l O000O{MNUMnLSTZRdHLr6 From e9ff2203cf8fd4834203322900bcbcd0cc3db18f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 6 May 2017 15:13:33 -0500 Subject: [PATCH 74/92] Fixes really long Ratvar shuttle calls --- .../clock_structures/ratvar_the_clockwork_justicar.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/gamemodes/clock_cult/clock_structures/ratvar_the_clockwork_justicar.dm b/code/game/gamemodes/clock_cult/clock_structures/ratvar_the_clockwork_justicar.dm index 614a22a6f5..4beaf226d6 100644 --- a/code/game/gamemodes/clock_cult/clock_structures/ratvar_the_clockwork_justicar.dm +++ b/code/game/gamemodes/clock_cult/clock_structures/ratvar_the_clockwork_justicar.dm @@ -28,7 +28,7 @@ var/mutable_appearance/alert_overlay = mutable_appearance('icons/effects/clockwork_effects.dmi', "ratvar_alert") var/area/A = get_area(src) notify_ghosts("The Justiciar's light calls to you! Reach out to Ratvar in [A.name] to be granted a shell to spread his glory!", null, source = src, alert_overlay = alert_overlay) - INVOKE_ASYNC(SSshuttle.emergency, /obj/docking_port/mobile/emergency..proc/request, null, 0) + INVOKE_ASYNC(SSshuttle.emergency, /obj/docking_port/mobile/emergency..proc/request, null, 0, 0) /obj/structure/destructible/clockwork/massive/ratvar/Destroy() GLOB.ratvar_awakens-- From 8af1d05cc43341d3368fc7444775787c50eb426e Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Sat, 6 May 2017 14:02:42 -0700 Subject: [PATCH 75/92] Delete mob.dm.rej --- code/modules/mob/mob.dm.rej | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 code/modules/mob/mob.dm.rej diff --git a/code/modules/mob/mob.dm.rej b/code/modules/mob/mob.dm.rej deleted file mode 100644 index 6cfe50706e..0000000000 --- a/code/modules/mob/mob.dm.rej +++ /dev/null @@ -1,10 +0,0 @@ -diff a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm (rejected hunks) -@@ -350,7 +350,7 @@ - /mob/proc/spin(spintime, speed) - set waitfor = 0 - var/D = dir -- if((spintime <= 1)||(speed <= 1)||!spintime||!speed) -+ if((spintime < 1)||(speed < 1)||!spintime||!speed) - return - while(spintime >= speed) - sleep(speed) From d3d335d83581217f83cc05415e1d5da713324cdb Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Sat, 6 May 2017 14:03:52 -0700 Subject: [PATCH 76/92] Update mob.dm --- code/modules/mob/mob.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 24b4d228cc..39d0f1b222 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -351,6 +351,8 @@ /mob/proc/spin(spintime, speed) set waitfor = 0 var/D = dir + if((spintime <= 1)||(speed <= 1)||!spintime||!speed) + return while(spintime >= speed) sleep(speed) switch(D) From bf5a9a5037cd3bdba07fee9c7205ba081631b9dc Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Sat, 6 May 2017 14:04:17 -0700 Subject: [PATCH 77/92] Update mob.dm --- code/modules/mob/mob.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 39d0f1b222..819f7f3db2 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -351,7 +351,7 @@ /mob/proc/spin(spintime, speed) set waitfor = 0 var/D = dir - if((spintime <= 1)||(speed <= 1)||!spintime||!speed) + if((spintime < 1)||(speed < 1)||!spintime||!speed) return while(spintime >= speed) sleep(speed) From abb5e2d016534ea9bda822707ba1b4ff2e4e091c Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 6 May 2017 16:04:57 -0500 Subject: [PATCH 78/92] Automatic changelog generation for PR #805 [ci skip] --- html/changelogs/AutoChangeLog-pr-805.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-805.yml diff --git a/html/changelogs/AutoChangeLog-pr-805.yml b/html/changelogs/AutoChangeLog-pr-805.yml new file mode 100644 index 0000000000..be4a17ddf7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-805.yml @@ -0,0 +1,5 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - rscadd: "Reduction to nutrition when consuming Miner's salve." + - rscdel: "Stun/weaken that bypasses bugged chemical protection when consuming Miner's salve." From 8fd36540efa56c2262922f3d0bfe9d69b39afa76 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 6 May 2017 16:08:52 -0500 Subject: [PATCH 79/92] Automatic changelog generation for PR #682 [ci skip] --- html/changelogs/AutoChangeLog-pr-682.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-682.yml diff --git a/html/changelogs/AutoChangeLog-pr-682.yml b/html/changelogs/AutoChangeLog-pr-682.yml new file mode 100644 index 0000000000..c55c645e6e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-682.yml @@ -0,0 +1,4 @@ +author: "Swindly" +delete-after: True +changes: + - tweak: "Mercury and Lithium make people move when not in space instead of when in space." From f605aae61eccd7a19b9c4e89fea933463108546f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 6 May 2017 16:12:59 -0500 Subject: [PATCH 80/92] Automatic changelog generation for PR #733 [ci skip] --- html/changelogs/AutoChangeLog-pr-733.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-733.yml diff --git a/html/changelogs/AutoChangeLog-pr-733.yml b/html/changelogs/AutoChangeLog-pr-733.yml new file mode 100644 index 0000000000..ef779f70a1 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-733.yml @@ -0,0 +1,4 @@ +author: "BeeSting12" +delete-after: True +changes: + - bugfix: "Omega shuttle now has lighting." From d7bdb492839e46016254d89cfd2b2fe822568e82 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 6 May 2017 16:20:39 -0500 Subject: [PATCH 81/92] ORM fixes --- code/modules/mining/machine_redemption.dm | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/code/modules/mining/machine_redemption.dm b/code/modules/mining/machine_redemption.dm index d93bcb5028..f3b66d9172 100644 --- a/code/modules/mining/machine_redemption.dm +++ b/code/modules/mining/machine_redemption.dm @@ -84,7 +84,7 @@ if(D.make_reagents.len) return 0 - var/build_amount = 1 + var/build_amount = 0 for(var/mat_id in D.materials) var/M = D.materials[mat_id] @@ -93,7 +93,15 @@ if(!M || !redemption_mat) return 0 - build_amount = min(build_amount, round(redemption_mat.amount / M)) + var/smeltable_sheets = round(redemption_mat.amount / M) + + if(!smeltable_sheets) + return 0 + + if(!build_amount) + build_amount = smeltable_sheets + + build_amount = min(build_amount, smeltable_sheets) return build_amount @@ -152,6 +160,7 @@ if(exchange_parts(user, W)) return if(default_pry_open(W)) + materials.retrieve_all() return if(default_unfasten_wrench(user, W)) return From 9035100cf4925b1481a843091dce520b647432f9 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 6 May 2017 16:22:09 -0500 Subject: [PATCH 82/92] Automatic changelog generation for PR #809 [ci skip] --- html/changelogs/AutoChangeLog-pr-809.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-809.yml diff --git a/html/changelogs/AutoChangeLog-pr-809.yml b/html/changelogs/AutoChangeLog-pr-809.yml new file mode 100644 index 0000000000..06fb6139cc --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-809.yml @@ -0,0 +1,5 @@ +author: "QualityVan" +delete-after: True +changes: + - rscadd: "Cargo can order restocking units for NanoMed vending machines" + - rscadd: "NanoMed vending machines can be build and unbuilt" From 8e3b375bae1c1d023d648d1e9913b9b06d4ed0b2 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 6 May 2017 16:23:04 -0500 Subject: [PATCH 83/92] Automatic changelog generation for PR #764 [ci skip] --- html/changelogs/AutoChangeLog-pr-764.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-764.yml diff --git a/html/changelogs/AutoChangeLog-pr-764.yml b/html/changelogs/AutoChangeLog-pr-764.yml new file mode 100644 index 0000000000..87210fcb7a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-764.yml @@ -0,0 +1,4 @@ +author: "QualityVan" +delete-after: True +changes: + - bugfix: "Dental implants stay with the head they're in" From df204497cd529bc36162a33070c718e8e01a957e Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 6 May 2017 16:29:50 -0500 Subject: [PATCH 84/92] Elevators --- code/modules/shuttle/elevator.dm | 10 ++++++++++ code/modules/shuttle/on_move.dm | 6 +++--- code/modules/shuttle/shuttle.dm | 9 ++++----- tgstation.dme | 1 + 4 files changed, 18 insertions(+), 8 deletions(-) create mode 100644 code/modules/shuttle/elevator.dm diff --git a/code/modules/shuttle/elevator.dm b/code/modules/shuttle/elevator.dm new file mode 100644 index 0000000000..12f9c24f9a --- /dev/null +++ b/code/modules/shuttle/elevator.dm @@ -0,0 +1,10 @@ +/obj/docking_port/mobile/elevator + name = "elevator" + id = "elevator" + dwidth = 3 + width = 7 + height = 7 + knockdown = FALSE + +/obj/docking_port/mobile/elevator/request(obj/docking_port/stationary/S) //No transit, no ignition, just a simple up/down platform + dock(S, TRUE) \ No newline at end of file diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm index 756fad25b3..b5571164ff 100644 --- a/code/modules/shuttle/on_move.dm +++ b/code/modules/shuttle/on_move.dm @@ -3,7 +3,7 @@ return // Called when shuttle attempts to move an atom. -/atom/movable/proc/onShuttleMove(turf/T1, rotation) +/atom/movable/proc/onShuttleMove(turf/T1, rotation, knockdown = TRUE) if(rotation) shuttleRotate(rotation) loc = T1 @@ -47,11 +47,11 @@ else shake_camera(src, 7, 1) -/mob/living/carbon/onShuttleMove() +/mob/living/carbon/onShuttleMove(turf/T1, rotation, knockdown = TRUE) . = ..() if(!.) return - if(!buckled) + if(!buckled && knockdown) Weaken(3) /obj/effect/abstract/proximity_checker/onShuttleMove() diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index 00ddecb7f8..656ba24da6 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -217,6 +217,8 @@ var/launch_status = NOLAUNCH + var/knockdown = TRUE //Will it knock down mobs when it docks? + // A timid shuttle will not register itself with the shuttle subsystem // All shuttle templates are timid var/timid = FALSE @@ -517,7 +519,7 @@ //move mobile to new location for(var/atom/movable/AM in T0) - if(AM.onShuttleMove(T1, rotation)) + if(AM.onShuttleMove(T1, rotation, knockdown)) moved_atoms += AM if(rotation) @@ -578,10 +580,7 @@ if(M.pulledby) M.pulledby.stop_pulling() M.stop_pulling() - M.visible_message("[M] is hit by \ - a hyperspace ripple!", - "You feel an immense \ - crushing pressure as the space around you ripples.") + M.visible_message("[src] slams into [M]!") if(M.key || M.get_ghost(TRUE)) SSblackbox.add_details("shuttle_gib", "[type]") else diff --git a/tgstation.dme b/tgstation.dme index bff0d9a902..e10d48ca49 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -2013,6 +2013,7 @@ #include "code\modules\shuttle\arrivals.dm" #include "code\modules\shuttle\assault_pod.dm" #include "code\modules\shuttle\computer.dm" +#include "code\modules\shuttle\elevator.dm" #include "code\modules\shuttle\emergency.dm" #include "code\modules\shuttle\ferry.dm" #include "code\modules\shuttle\manipulator.dm" From fc7be7e32b72cf2bdb0083e8b3b6eb2ea4fca618 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 6 May 2017 20:48:44 -0500 Subject: [PATCH 85/92] Remove empty description tag from right-most tiles of Space Station 13 sign --- _maps/map_files/Deltastation/DeltaStation2.dmm | 2 -- _maps/map_files/MetaStation/MetaStation.dmm | 2 -- _maps/map_files/OmegaStation/OmegaStation.dmm | 2 -- _maps/map_files/TgStation/tgstation.2.1.3.dmm | 2 -- 4 files changed, 8 deletions(-) diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index db3e3e780d..85ed049c0c 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -34793,7 +34793,6 @@ dir = 4 }, /turf/open/floor/plasteel{ - desc = ""; icon_state = "L14" }, /area/hallway/primary/central) @@ -70986,7 +70985,6 @@ "cDW" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden, /turf/open/floor/plasteel{ - desc = ""; icon_state = "L13"; name = "floor" }, diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 9d5c5ac3f0..a26ea928ec 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -27963,7 +27963,6 @@ dir = 4 }, /turf/open/floor/plasteel{ - desc = ""; icon_state = "L13"; name = "floor" }, @@ -28813,7 +28812,6 @@ icon_state = "4-8" }, /turf/open/floor/plasteel{ - desc = ""; icon_state = "L14" }, /area/hallway/primary/central) diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm index 06533475dd..dae6f8e837 100644 --- a/_maps/map_files/OmegaStation/OmegaStation.dmm +++ b/_maps/map_files/OmegaStation/OmegaStation.dmm @@ -7303,7 +7303,6 @@ icon_state = "1-2" }, /turf/open/floor/plasteel{ - desc = ""; icon_state = "L14" }, /area/hallway/primary/central{ @@ -25976,7 +25975,6 @@ icon_state = "4-8" }, /turf/open/floor/plasteel{ - desc = ""; icon_state = "L13"; name = "floor" }, diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm index 799d9530cb..da42611e13 100644 --- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm +++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm @@ -17330,7 +17330,6 @@ /area/hallway/primary/central) "aMf" = ( /turf/open/floor/plasteel{ - desc = ""; icon_state = "L13"; name = "floor" }, @@ -17836,7 +17835,6 @@ /area/hallway/primary/central) "aNB" = ( /turf/open/floor/plasteel{ - desc = ""; icon_state = "L14" }, /area/hallway/primary/central) From d31caa18706eaa0a5e28613c35959871833038fc Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 6 May 2017 23:19:34 -0500 Subject: [PATCH 86/92] Automatic changelog generation for PR #815 [ci skip] --- html/changelogs/AutoChangeLog-pr-815.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-815.yml diff --git a/html/changelogs/AutoChangeLog-pr-815.yml b/html/changelogs/AutoChangeLog-pr-815.yml new file mode 100644 index 0000000000..6472c7a13d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-815.yml @@ -0,0 +1,4 @@ +author: "Penguaro" +delete-after: True +changes: + - bugfix: "Adjusted the Examine description of the right-most tiles of the Space Station 13 sign to be consistent with the rest of the tiles." From f5aab140bf04458e1bda9d0a0e81baf136338630 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 6 May 2017 23:23:47 -0500 Subject: [PATCH 87/92] Automatic changelog generation for PR #760 [ci skip] --- html/changelogs/AutoChangeLog-pr-760.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-760.yml diff --git a/html/changelogs/AutoChangeLog-pr-760.yml b/html/changelogs/AutoChangeLog-pr-760.yml new file mode 100644 index 0000000000..b0296b2330 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-760.yml @@ -0,0 +1,4 @@ +author: "bgobandit" +delete-after: True +changes: + - tweak: "The Syndicate has added basic functionality to their state-of-the-art equipment. Nuke ops can now donate all TCs at once." From fb0aa3597f51a2bf1d1e2fa7f86bb09e979e494c Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 6 May 2017 23:24:47 -0500 Subject: [PATCH 88/92] Automatic changelog generation for PR #800 [ci skip] --- html/changelogs/AutoChangeLog-pr-800.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-800.yml diff --git a/html/changelogs/AutoChangeLog-pr-800.yml b/html/changelogs/AutoChangeLog-pr-800.yml new file mode 100644 index 0000000000..798c98c64b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-800.yml @@ -0,0 +1,4 @@ +author: "coiax" +delete-after: True +changes: + - tweak: "The lavaland Seed Vault ruin can spawn only once." From 102b28b1c122f199f531101f0788fcb729a37e5a Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Sat, 6 May 2017 21:28:23 -0700 Subject: [PATCH 89/92] Delete deadsay.dm.rej --- code/modules/admin/verbs/deadsay.dm.rej | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 code/modules/admin/verbs/deadsay.dm.rej diff --git a/code/modules/admin/verbs/deadsay.dm.rej b/code/modules/admin/verbs/deadsay.dm.rej deleted file mode 100644 index 7320e8d285..0000000000 --- a/code/modules/admin/verbs/deadsay.dm.rej +++ /dev/null @@ -1,8 +0,0 @@ -diff a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm (rejected hunks) -@@ -29,4 +29,4 @@ - if (M.stat == DEAD || (M.client && M.client.holder && (M.client.prefs.chat_toggles & CHAT_DEAD))) //admins can toggle deadchat on and off. This is a proc in admin.dm and is only give to Administrators and above - M.show_message(rendered, 2) - -- SSblackbox.add_details("admin_verb","Dsay") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -\ No newline at end of file -+ SSblackbox.add_details("admin_verb","Dsay") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! From 48f9fa62c98c7187d9fa528897e49065f3ede290 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 6 May 2017 23:35:16 -0500 Subject: [PATCH 90/92] Automatic changelog generation for PR #792 [ci skip] --- html/changelogs/AutoChangeLog-pr-792.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-792.yml diff --git a/html/changelogs/AutoChangeLog-pr-792.yml b/html/changelogs/AutoChangeLog-pr-792.yml new file mode 100644 index 0000000000..9d2ccfebde --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-792.yml @@ -0,0 +1,6 @@ +author: "BeeSting12" +delete-after: True +changes: + - rscadd: "Deltastation's chemistry now has a screwdriver." + - bugfix: "Deltastation's morgue no longer has a blue tile." + - bugfix: "Deltastation's chemistry smart fridge is no longer blocked by a disposal unit." From 7fa53c5ce44451fcdacd79632c2416e9dddbaf7c Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Sat, 6 May 2017 21:36:15 -0700 Subject: [PATCH 91/92] Delete world.dm.rej --- code/world.dm.rej | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 code/world.dm.rej diff --git a/code/world.dm.rej b/code/world.dm.rej deleted file mode 100644 index 70f208ed4d..0000000000 --- a/code/world.dm.rej +++ /dev/null @@ -1,10 +0,0 @@ -diff a/code/world.dm b/code/world.dm (rejected hunks) -@@ -184,7 +184,7 @@ - return - - #define CHAT_PULLR 64 //defined in preferences.dm, but not available here at compilation time -- for(var/client/C in clients) -+ for(var/client/C in GLOB.clients) - if(C.prefs && (C.prefs.chat_toggles & CHAT_PULLR)) - C << "PR: [announcement]" - #undef CHAT_PULLR From f7937b2f7e74772c9020261fffc36e2bf916cd11 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 6 May 2017 23:43:09 -0500 Subject: [PATCH 92/92] Automatic changelog generation for PR #756 [ci skip] --- html/changelogs/AutoChangeLog-pr-756.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-756.yml diff --git a/html/changelogs/AutoChangeLog-pr-756.yml b/html/changelogs/AutoChangeLog-pr-756.yml new file mode 100644 index 0000000000..7ef015b31c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-756.yml @@ -0,0 +1,6 @@ +author: "lordpidey" +delete-after: True +changes: + - rscadd: "There is a new traitor poison, spewium. It will cause uncontrollable vomiting, which gets worse the longer it's in your system. An overdose can cause vomiting of organs." + - tweak: "Committing suicide with a gas pump can now shoot out random organs." + - bugfix: "Toxic vomit now shows up as intended."