From f972199a156fc2838d032ff3a929009dab881ab0 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 29 Apr 2017 15:44:51 -0500 Subject: [PATCH 001/122] 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 002/122] 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 de997bba41ddcc37005b4f121359108a5b31bfef Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 1 May 2017 08:37:09 -0500 Subject: [PATCH 003/122] Fixes the 'stuffed legion' recipie --- .../recipes/tablecraft/recipes_misc.dm | 2 +- icons/obj/food/food.dmi | Bin 51075 -> 51075 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm index 6d14d13254..708f49628a 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm @@ -264,7 +264,7 @@ time = 40 reqs = list( /obj/item/weapon/reagent_containers/food/snacks/meat/steak/goliath = 1, - /obj/item/weapon/legion_skull = 1, + /obj/item/organ/hivelord_core/legion = 1, /datum/reagent/consumable/ketchup = 2, /datum/reagent/consumable/capsaicin = 2 ) diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi index c0af32afea9b848042cea80a4f0b5b864bda79ce..c4713bd08688afc0a55ac8fb50dccf354a665018 100644 GIT binary patch delta 29 lcmZqfXKwCi-tdN*(QWcu=5UT%K}j3qelNed*@wmaFaWrs4F~`L delta 29 lcmZqfXKwCi-tdN*(Pi>m=5UVWElEWix8L8q*@wmaFaWj!4ATGr From 529125d3dd19143be27aa22d4f463923b58dc55a Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 1 May 2017 11:51:27 -0500 Subject: [PATCH 004/122] 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 005/122] 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 006/122] 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 3e80105ffb962857aeed64e9b0d3e418ab5c3833 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 1 May 2017 12:55:45 -0500 Subject: [PATCH 007/122] Saline-glucose changes --- .../chemistry/reagents/medicine_reagents.dm | 37 +++++++++++++------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index aa913ba8f0..500147d233 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -288,30 +288,43 @@ /datum/reagent/medicine/salglu_solution name = "Saline-Glucose Solution" id = "salglu_solution" - description = "Has a 33% chance per metabolism cycle to heal brute and burn damage. Can be used as a blood substitute on an IV drip." + description = "Has a 33% chance per metabolism cycle to heal brute and burn damage. Can be used as a temporary blood substitute." reagent_state = LIQUID color = "#DCDCDC" metabolization_rate = 0.5 * REAGENTS_METABOLISM + overdose_threshold = 60 taste_description = "sweetness and salt" + var/last_added = 0 + var/maximum_reachable = BLOOD_VOLUME_NORMAL - 10 //So that normal blood regeneration can continue with salglu active /datum/reagent/medicine/salglu_solution/on_mob_life(mob/living/M) + if(last_added) + M.blood_volume -= last_added + last_added = 0 + if(M.blood_volume < maximum_reachable) //Can only up to double your effective blood level. + var/amount_to_add = min(M.blood_volume, volume*5) + var/new_blood_level = min(M.blood_volume + amount_to_add, maximum_reachable) + last_added = new_blood_level - M.blood_volume + M.blood_volume = new_blood_level if(prob(33)) M.adjustBruteLoss(-0.5*REM, 0) M.adjustFireLoss(-0.5*REM, 0) - if(iscarbon(M)) - var/mob/living/carbon/C = M - C.blood_volume += 0.2 . = 1 ..() -/datum/reagent/medicine/salglu_solution/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1) - if(ishuman(M) && method == INJECT) - var/mob/living/carbon/human/H = M - if(H.dna && !(NOBLOOD in H.dna.species.species_traits)) - var/efficiency = (BLOOD_VOLUME_NORMAL-H.blood_volume)/700 + 0.2//The lower the blood of the patient, the better it is as a blood substitute. - efficiency = Clamp(efficiency, 0.1, 0.75) - //As it's designed for an IV drip, make large injections not as effective as repeated small injections. - H.blood_volume += round(efficiency * min(5,reac_volume), 0.1) +/datum/reagent/medicine/salglu_solution/overdose_process(mob/living/M) + if(prob(3)) + to_chat(M, "You feel salty.") + holder.add_reagent("sodiumchloride", 1) + holder.remove_reagent("salglu_solution", 0.5) + else if(prob(3)) + to_chat(M, "You feel sweet.") + holder.add_reagent("sugar", 1) + holder.remove_reagent("salglu_solution", 0.5) + if(prob(33)) + M.adjustBruteLoss(0.5*REM, 0) + M.adjustFireLoss(0.5*REM, 0) + . = 1 ..() /datum/reagent/medicine/mine_salve From 00164a49a71928a38fbd3144b20c729e638141bb Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 1 May 2017 13:06:07 -0500 Subject: [PATCH 008/122] 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 875879127842cbb46cbe2f848039040bf9d8d553 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 1 May 2017 17:28:18 -0500 Subject: [PATCH 009/122] Fixes Biogenerator --- code/modules/research/research.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/research/research.dm b/code/modules/research/research.dm index 25b3a98980..dfd64c3101 100644 --- a/code/modules/research/research.dm +++ b/code/modules/research/research.dm @@ -185,7 +185,7 @@ research holder datum. if((D.build_type & SMELTER) && ("initial" in D.category)) AddDesign2Known(D) -/datum/research/biogenerator/AddDesign2Known(datum/design/D) +/datum/research/smelter/AddDesign2Known(datum/design/D) if(!(D.build_type & SMELTER)) return ..() From ea3ee7accc1decdd12a228248fdd6e39ae9ef291 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 1 May 2017 17:31:24 -0500 Subject: [PATCH 010/122] Adds persistent trophy cases --- code/_globalvars/lists/objects.dm | 1 + code/controllers/subsystem/persistence.dm | 57 +++++++++- code/game/objects/structures/displaycase.dm | 109 ++++++++++++++++++-- 3 files changed, 157 insertions(+), 10 deletions(-) diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index be771e0676..e82976d4a3 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -29,6 +29,7 @@ GLOBAL_LIST_EMPTY(zombie_infection_list) // A list of all zombie_infection org GLOBAL_LIST_EMPTY(meteor_list) // List of all meteors. GLOBAL_LIST_EMPTY(active_jammers) // List of active radio jammers GLOBAL_LIST_EMPTY(ladders) +GLOBAL_LIST_EMPTY(trophy_cases) GLOBAL_LIST_EMPTY(wire_color_directory) GLOBAL_LIST_EMPTY(wire_name_directory) \ No newline at end of file diff --git a/code/controllers/subsystem/persistence.dm b/code/controllers/subsystem/persistence.dm index e1cf992e8b..6b3e47054c 100644 --- a/code/controllers/subsystem/persistence.dm +++ b/code/controllers/subsystem/persistence.dm @@ -11,10 +11,14 @@ SUBSYSTEM_DEF(persistence) var/list/saved_messages = list() var/savefile/chisel_messages_sav + var/savefile/trophy_sav + var/list/saved_trophies = list() + /datum/controller/subsystem/persistence/Initialize() LoadSatchels() LoadPoly() LoadChiselMessages() + LoadTrophies() ..() /datum/controller/subsystem/persistence/proc/LoadSatchels() @@ -105,10 +109,49 @@ SUBSYSTEM_DEF(persistence) M.persists = FALSE qdel(M) +/datum/controller/subsystem/persistence/proc/LoadTrophies() + trophy_sav = new /savefile("data/npc_saves/TrophyItems.sav") + var/saved_json + trophy_sav >> saved_json + + var/decoded_json = json_decode(saved_json) + + if(!islist(decoded_json)) + return + + saved_trophies = decoded_json + + SetUpTrophies(saved_trophies.Copy()) + +/datum/controller/subsystem/persistence/proc/SetUpTrophies(list/trophy_items) + for(var/A in GLOB.trophy_cases) + var/obj/structure/displaycase/trophy/T = A + T.added_roundstart = TRUE + + var/trophy_data = pick_n_take(trophy_items) + + if(!islist(trophy_data)) + continue + + var/list/chosen_trophy = trophy_data + + if(!chosen_trophy || isemptylist(chosen_trophy)) //Malformed + continue + + var/path = text2path(chosen_trophy["path"]) //If the item no longer exist, this returns null + if(!path) + continue + + T.showpiece = new /obj/item/showpiece_dummy(T, path) + T.trophy_message = chosen_trophy["message"] + T.placer_key = chosen_trophy["placer_key"] + T.update_icon() + /datum/controller/subsystem/persistence/proc/CollectData() CollectChiselMessages() CollectSecretSatchels() + CollectTrophies() /datum/controller/subsystem/persistence/proc/CollectSecretSatchels() for(var/A in new_secret_satchels) @@ -135,4 +178,16 @@ SUBSYSTEM_DEF(persistence) chisel_messages_sav[SSmapping.config.map_name] << json_encode(saved_messages) /datum/controller/subsystem/persistence/proc/SaveChiselMessage(obj/structure/chisel_message/M) - saved_messages += list(M.pack()) // dm eats one list. + saved_messages += list(M.pack()) // dm eats one list + + +/datum/controller/subsystem/persistence/proc/CollectTrophies() + trophy_sav << json_encode(saved_trophies) + +/datum/controller/subsystem/persistence/proc/SaveTrophy(obj/structure/displaycase/trophy/T) + if(!T.added_roundstart && T.showpiece) + var/list/data = list() + data["path"] = T.showpiece.type + data["message"] = T.trophy_message + data["placer_key"] = T.placer_key + saved_trophies += list(data) \ No newline at end of file diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index be1b49074d..3817a16685 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -16,27 +16,25 @@ var/obj/item/weapon/electronics/airlock/electronics var/start_showpiece_type = null //add type for items on display -/obj/structure/displaycase/New() - ..() +/obj/structure/displaycase/Initialize() + . = ..() if(start_showpiece_type) showpiece = new start_showpiece_type (src) update_icon() /obj/structure/displaycase/Destroy() if(electronics) - qdel(electronics) - electronics = null + QDEL_NULL(electronics) if(showpiece) - qdel(showpiece) - showpiece = null + QDEL_NULL(showpiece) return ..() /obj/structure/displaycase/examine(mob/user) ..() - if(showpiece) - to_chat(user, "There's [showpiece] inside.") if(alert) to_chat(user, "Hooked up with an anti-theft system.") + if(showpiece) + to_chat(user, "There's [showpiece] inside.") /obj/structure/displaycase/proc/dump() @@ -176,8 +174,8 @@ /obj/structure/displaycase/attack_hand(mob/user) user.changeNext_move(CLICK_CD_MELEE) if (showpiece && (broken || open)) - dump() to_chat(user, "You deactivate the hover field built into the case.") + dump() src.add_fingerprint(user) update_icon() return @@ -249,3 +247,96 @@ desc = "A glass lab container for storing interesting creatures." start_showpiece_type = /obj/item/clothing/mask/facehugger/lamarr req_access = list(GLOB.access_rd) + + + +/obj/structure/displaycase/trophy + name = "trophy display case" + desc = "Store your trophies of accomplishment in here, and they will stay forever." + var/trophy_message = "" + var/placer_key = "" + var/added_roundstart = TRUE + alert = TRUE + integrity_failure = 0 + +/obj/structure/displaycase/trophy/Initialize() + . = ..() + GLOB.trophy_cases += src + +/obj/structure/displaycase/trophy/Destroy() + GLOB.trophy_cases -= src + return ..() + +/obj/structure/displaycase/trophy/examine(mob/user) + ..() + if(trophy_message) + to_chat(user, "The plaque reads:") + to_chat(user, trophy_message) + +/obj/structure/displaycase/trophy/attackby(obj/item/weapon/W, mob/user, params) + + if(!user.Adjacent(src)) //no TK museology + return + + if(!added_roundstart) + to_chat(user, "You've already put something new in this case.") + return + + if(is_type_in_typecache(W, GLOB.blacklisted_cargo_types)) + to_chat(user, "The case rejects the [W].") + return + + for(var/a in W.GetAllContents()) + if(is_type_in_typecache(a, GLOB.blacklisted_cargo_types)) + to_chat(user, "The case rejects the [W].") + return + + if(user.drop_item()) + + if(showpiece) + to_chat(user, "You press a button, and [showpiece] descends into the floor of the case.") + QDEL_NULL(showpiece) + + to_chat(user, "You insert [W] into the case.") + W.forceMove(src) + showpiece = W + added_roundstart = FALSE + update_icon() + + placer_key = user.ckey + + trophy_message = W.desc //default value + + var/chosen_plaque = stripped_input(user, "What would you like the plaque to say? Default value is item's description.", "Trophy Plaque") + if(chosen_plaque) + if(user.Adjacent(src)) + trophy_message = chosen_plaque + to_chat(user, "You set the plaque's text.") + else + to_chat(user, "You are too far to set the plaque's text.") + + SSpersistence.SaveTrophy(src) + + else + to_chat(user, "\The [W] is stuck to your hand, you can't put it in the [src.name]!") + + return + +/obj/structure/displaycase/trophy/dump() + if (showpiece) + if(added_roundstart) + visible_message("The [showpiece] crumbles to dust!") + new /obj/effect/decal/cleanable/ash(loc) + QDEL_NULL(showpiece) + else + ..() + +/obj/item/showpiece_dummy + name = "Cheap replica" + +/obj/item/showpiece_dummy/Initialize(mapload, path) + . = ..() + var/obj/item/I = path + name = initial(I.name) + icon = initial(I.icon) + icon_state = initial(I.icon_state) From b45d4ba6685f3bf705d62a3f65e26e2a47c41c38 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 1 May 2017 17:32:29 -0500 Subject: [PATCH 011/122] 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 012/122] 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 3fff6d4a1d36706e15adc3c4002123de4cf52718 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 1 May 2017 20:27:03 -0500 Subject: [PATCH 013/122] Fixes cult datum giving the action button to the mind instead of mob --- code/datums/antagonists/datum_clockcult.dm | 2 +- code/datums/antagonists/datum_cult.dm | 26 +++++++++++++--------- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/code/datums/antagonists/datum_clockcult.dm b/code/datums/antagonists/datum_clockcult.dm index ba18e76f02..85ff6f8930 100644 --- a/code/datums/antagonists/datum_clockcult.dm +++ b/code/datums/antagonists/datum_clockcult.dm @@ -16,7 +16,7 @@ if(!istype(current)) return if(jobban_isbanned(current, ROLE_SERVANT_OF_RATVAR)) - addtimer(CALLBACK(SSticker.mode, /datum/game_mode.proc/replace_jobbaned_player, owner, ROLE_SERVANT_OF_RATVAR, ROLE_SERVANT_OF_RATVAR), 0) + addtimer(CALLBACK(SSticker.mode, /datum/game_mode.proc/replace_jobbaned_player, current, ROLE_SERVANT_OF_RATVAR, ROLE_SERVANT_OF_RATVAR), 0) owner.current.log_message("Has been converted to the cult of Ratvar!", INDIVIDUAL_ATTACK_LOG) if(issilicon(current)) var/mob/living/silicon/S = owner diff --git a/code/datums/antagonists/datum_cult.dm b/code/datums/antagonists/datum_cult.dm index 69c9849782..e6db239241 100644 --- a/code/datums/antagonists/datum_cult.dm +++ b/code/datums/antagonists/datum_cult.dm @@ -10,24 +10,30 @@ if(!owner) return if(jobban_isbanned(owner.current, ROLE_CULTIST)) - addtimer(CALLBACK(SSticker.mode, /datum/game_mode.proc/replace_jobbaned_player, owner, ROLE_CULTIST, ROLE_CULTIST), 0) + addtimer(CALLBACK(SSticker.mode, /datum/game_mode.proc/replace_jobbaned_player, owner.current, ROLE_CULTIST, ROLE_CULTIST), 0) owner.current.log_message("Has been converted to the cult of Nar'Sie!", INDIVIDUAL_ATTACK_LOG) -/datum/antagonist/cult/apply_innate_effects() +/datum/antagonist/cult/apply_innate_effects(mob/living/mob_override) . = ..() - owner.current.faction |= "cult" - owner.current.verbs += /mob/living/proc/cult_help - communion.Grant(owner) + var/mob/living/current = owner.current + if(mob_override) + current = mob_override + current.faction |= "cult" + current.verbs += /mob/living/proc/cult_help + communion.Grant(current) -/datum/antagonist/cult/remove_innate_effects() +/datum/antagonist/cult/remove_innate_effects(mob/living/mob_override) . = ..() - owner.current.faction -= "cult" - owner.current.verbs -= /mob/living/proc/cult_help - + var/mob/living/current = owner.current + if(mob_override) + current = mob_override + current.faction -= "cult" + current.verbs -= /mob/living/proc/cult_help + communion.Remove(current) /datum/antagonist/cult/on_removal() . = ..() to_chat(owner, "An unfamiliar white light flashes through your mind, cleansing the taint of the Dark One and all your memories as its servant.") owner.current.log_message("Has renounced the cult of Nar'Sie!", INDIVIDUAL_ATTACK_LOG) if(!silent) - owner.current.visible_message("[owner] looks like [owner.current.p_they()] just reverted to their old faith!") \ No newline at end of file + owner.current.visible_message("[owner] looks like [owner.current.p_they()] just reverted to their old faith!") From 22f6aecdf7df4c25b3a79eabccaa76b017d6b092 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 1 May 2017 21:03:40 -0500 Subject: [PATCH 014/122] Fixes cult and clockcult icons --- code/datums/antagonists/datum_clockcult.dm | 3 ++- code/datums/antagonists/datum_cult.dm | 1 + code/datums/antagonists/datum_cult.dm.rej | 9 +++++++++ 3 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 code/datums/antagonists/datum_cult.dm.rej diff --git a/code/datums/antagonists/datum_clockcult.dm b/code/datums/antagonists/datum_clockcult.dm index ba18e76f02..f30c6505c5 100644 --- a/code/datums/antagonists/datum_clockcult.dm +++ b/code/datums/antagonists/datum_clockcult.dm @@ -29,6 +29,7 @@ else if(isbrain(current) || isclockmob(current)) to_chat(current, "You can communicate with other servants by using the Hierophant Network action button in the upper left.") ..() + SSticker.mode.update_servant_icons_added(owner) if(istype(SSticker.mode, /datum/game_mode/clockwork_cult)) var/datum/game_mode/clockwork_cult/C = SSticker.mode C.present_tasks(owner) //Memorize the objectives @@ -39,7 +40,6 @@ if(istype(mob_override)) current = mob_override GLOB.all_clockwork_mobs += current - SSticker.mode.update_servant_icons_added(owner) current.faction |= "ratvar" current.grant_language(/datum/language/ratvar) current.update_action_buttons_icon() //because a few clockcult things are action buttons and we may be wearing/holding them for whatever reason, we need to update buttons @@ -117,6 +117,7 @@ /datum/antagonist/clockcult/on_removal() . = ..() + SSticker.mode.update_servant_icons_removed(owner) if(!silent) owner.current.visible_message("[owner] seems to have remembered their true allegiance!", \ "A cold, cold darkness flows through your mind, extinguishing the Justiciar's light and all of your memories as his servant.") diff --git a/code/datums/antagonists/datum_cult.dm b/code/datums/antagonists/datum_cult.dm index 69c9849782..691494568c 100644 --- a/code/datums/antagonists/datum_cult.dm +++ b/code/datums/antagonists/datum_cult.dm @@ -27,6 +27,7 @@ /datum/antagonist/cult/on_removal() . = ..() + SSticker.mode.update_cult_icons_removed(owner) to_chat(owner, "An unfamiliar white light flashes through your mind, cleansing the taint of the Dark One and all your memories as its servant.") owner.current.log_message("Has renounced the cult of Nar'Sie!", INDIVIDUAL_ATTACK_LOG) if(!silent) diff --git a/code/datums/antagonists/datum_cult.dm.rej b/code/datums/antagonists/datum_cult.dm.rej new file mode 100644 index 0000000000..991ad512c9 --- /dev/null +++ b/code/datums/antagonists/datum_cult.dm.rej @@ -0,0 +1,9 @@ +diff a/code/datums/antagonists/datum_cult.dm b/code/datums/antagonists/datum_cult.dm (rejected hunks) +@@ -11,6 +11,7 @@ + return + 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) From aa45f555e348415c6725f6cfc72ebe32cfd39a19 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 2 May 2017 04:57:29 -0500 Subject: [PATCH 015/122] 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 913a0c7c7f91a694d2f94ab85aef5f7a5179c53a Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 2 May 2017 09:55:15 -0500 Subject: [PATCH 016/122] Fixes proximity sensors not tracking correctly --- code/game/objects/effects/proximity.dm | 50 +++++++++++++------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/code/game/objects/effects/proximity.dm b/code/game/objects/effects/proximity.dm index 8a6893c887..bfa6cd8fa9 100644 --- a/code/game/objects/effects/proximity.dm +++ b/code/game/objects/effects/proximity.dm @@ -9,10 +9,12 @@ host = _host last_host_loc = _host.loc ignore_if_not_on_turf = _ignore_if_not_on_turf + checkers = list() SetRange(range) /datum/proximity_monitor/Destroy() host = null + last_host_loc = null QDEL_LIST(checkers) return ..() @@ -34,46 +36,47 @@ current_range = range - var/list/old_checkers = checkers - var/old_checkers_len = LAZYLEN(old_checkers) + var/list/checkers_local = checkers + var/old_checkers_len = checkers_local.len - var/atom/host_loc = host.loc + var/atom/_host = host - var/atom/loc_to_use = ignore_if_not_on_turf ? host_loc : get_turf(host) + var/atom/loc_to_use = ignore_if_not_on_turf ? _host.loc : get_turf(_host) if(!isturf(loc_to_use)) //only check the host's loc if(range) var/obj/effect/abstract/proximity_checker/pc if(old_checkers_len) - pc = old_checkers[old_checkers_len] - --old_checkers.len + pc = checkers_local[old_checkers_len] + --checkers_local.len + QDEL_LIST(checkers_local) else - pc = new(host_loc, src) + pc = new(loc_to_use, src) - checkers = list(pc) //only check the host's loc + checkers_local += pc //only check the host's loc return var/list/turfs = RANGE_TURFS(range, loc_to_use) - var/old_checkers_used = min(turfs.len, old_checkers_len) + var/turfs_len = turfs.len + var/old_checkers_used = min(turfs_len, old_checkers_len) //reuse what we can for(var/I in 1 to old_checkers_len) if(I <= old_checkers_used) - var/obj/effect/abstract/proximity_checker/pc = old_checkers[I] + var/obj/effect/abstract/proximity_checker/pc = checkers_local[I] pc.loc = turfs[I] else - qdel(old_checkers[I]) //delete the leftovers + qdel(checkers_local[I]) //delete the leftovers - LAZYCLEARLIST(old_checkers) - - //create what we lack - var/list/checkers_local = list() - for(var/I in (old_checkers_used + 1) to turfs.len) - checkers_local += new /obj/effect/abstract/proximity_checker(turfs[I], src) - - checkers = checkers_local + if(old_checkers_len < turfs_len) + //create what we lack + for(var/I in (old_checkers_used + 1) to turfs_len) + checkers_local += new /obj/effect/abstract/proximity_checker(turfs[I], src) + else + checkers_local.Cut(old_checkers_used + 1, old_checkers_len) /obj/effect/abstract/proximity_checker invisibility = INVISIBILITY_ABSTRACT + anchored = TRUE var/datum/proximity_monitor/monitor /obj/effect/abstract/proximity_checker/Initialize(mapload, datum/proximity_monitor/_monitor) @@ -81,8 +84,8 @@ if(_monitor) monitor = _monitor else - stack_trace("proximity_checker created without proximity_monitor") - qdel(src) + stack_trace("proximity_checker created without host") + return INITIALIZE_HINT_QDEL /obj/effect/abstract/proximity_checker/Destroy() monitor = null @@ -90,9 +93,6 @@ /obj/effect/abstract/proximity_checker/Crossed(atom/movable/AM) set waitfor = FALSE - var/datum/proximity_monitor/M = monitor - if(!M.current_range) - return - var/atom/H = M.host + var/atom/H = monitor.host testing("HasProx: [H] -> [AM]") H.HasProximity(AM) From d422b9bb39b441b5a8d6bbcdd78d19bff417f299 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 2 May 2017 09:57:25 -0500 Subject: [PATCH 017/122] 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 018/122] 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 8a5c180dd3b4ad022881615476c4134eac737dc4 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 2 May 2017 13:41:10 -0500 Subject: [PATCH 019/122] Update recipes_misc.dm --- code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm index 708f49628a..fff76d630f 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm @@ -325,3 +325,5 @@ ) result = /obj/item/weapon/reagent_containers/food/snacks/branrequests category = CAT_MISCFOOD + + From c6f4d299f295b18672cc7dd87a621cf1d560424f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 2 May 2017 18:44:55 -0500 Subject: [PATCH 020/122] Automatic changelog generation for PR #699 [ci skip] --- html/changelogs/AutoChangeLog-pr-699.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-699.yml diff --git a/html/changelogs/AutoChangeLog-pr-699.yml b/html/changelogs/AutoChangeLog-pr-699.yml new file mode 100644 index 0000000000..68fca1b6ac --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-699.yml @@ -0,0 +1,4 @@ +author: "QualityVan" +delete-after: True +changes: + - tweak: "Saline glucose now acts as temporary blood instead of increasing blood regeneration" From 5edd88cd076886a3f37e8edb08527ee320888ac1 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 2 May 2017 18:47:24 -0500 Subject: [PATCH 021/122] Automatic changelog generation for PR #705 [ci skip] --- html/changelogs/AutoChangeLog-pr-705.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-705.yml diff --git a/html/changelogs/AutoChangeLog-pr-705.yml b/html/changelogs/AutoChangeLog-pr-705.yml new file mode 100644 index 0000000000..a4861ed8f6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-705.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - bugfix: "The biogenerator will now show its recipes again." From 8ab3f4fe39329f9a997802b6d2de15f61916aefb Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 2 May 2017 18:51:06 -0500 Subject: [PATCH 022/122] Travis --- Test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Test.txt b/Test.txt index f052ebb735..68db24f630 100644 --- a/Test.txt +++ b/Test.txt @@ -1 +1 @@ -Ignore this again \ No newline at end of file +~~ \ No newline at end of file From 007281a51c74ac8b35db3563501ed32404fbacba Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 2 May 2017 18:53:59 -0500 Subject: [PATCH 023/122] Revert "[MIRROR] You can no longer queue up ahelps by queing up prompts" --- code/modules/admin/verbs/adminhelp.dm | 4 ---- 1 file changed, 4 deletions(-) diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index b8df3c147d..6b642d4fdd 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -485,10 +485,6 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) current_ticket.AddInteraction("[key_name_admin(usr)] opened a new ticket.") current_ticket.Close() - if(!(/client/verb/adminhelp in verbs)) - to_chat(usr, "Nice try!") - return - new /datum/admin_help(msg, src, FALSE) //admin proc From 121df4527bb1626873843eaf4c767e63b19e0ae1 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 2 May 2017 19:04:29 -0500 Subject: [PATCH 024/122] Automatic changelog generation for PR #685 [ci skip] --- html/changelogs/AutoChangeLog-pr-685.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-685.yml diff --git a/html/changelogs/AutoChangeLog-pr-685.yml b/html/changelogs/AutoChangeLog-pr-685.yml new file mode 100644 index 0000000000..16311e93ff --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-685.yml @@ -0,0 +1,5 @@ +author: "Moonlighting Mac says" +delete-after: True +changes: + - bugfix: "Due to a clerical error in the chef's cookbooks now being resolved, you can now make the pristine cookery dish \"Stuffed Legion\" out of exotic ingredients from Lavaland." + - experiment: "After being found again you will now be able to enjoy its special blend of flavors with your tastebuds. Mmm." From 6a365857d1e5e16adea878688690d6417ebb521a Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 2 May 2017 20:44:34 -0500 Subject: [PATCH 025/122] Should fix all of the cult/clockcult issues --- code/datums/antagonists/antag_datum.dm | 21 +++++-- code/datums/antagonists/datum_clockcult.dm | 69 ++++++++++++++++------ code/datums/antagonists/datum_cult.dm | 4 +- code/datums/antagonists/datum_cult.dm.rej | 22 ++++++- code/datums/mind.dm | 32 ++++------ 5 files changed, 103 insertions(+), 45 deletions(-) diff --git a/code/datums/antagonists/antag_datum.dm b/code/datums/antagonists/antag_datum.dm index deee1111c0..396c185961 100644 --- a/code/datums/antagonists/antag_datum.dm +++ b/code/datums/antagonists/antag_datum.dm @@ -8,13 +8,26 @@ var/can_coexist_with_others = TRUE //Whether or not the person will be able to have more than one datum var/list/typecache_datum_blacklist = list() //List of datums this type can't coexist with - /datum/antagonist/New(datum/mind/new_owner) - . = ..() typecache_datum_blacklist = typecacheof(typecache_datum_blacklist) if(new_owner) owner = new_owner +/datum/antagonist/Destroy() + if(owner) + LAZYREMOVE(owner.antag_datums, src) + owner = null + return ..() + +/datum/antagonist/proc/can_be_owned(datum/mind/new_owner) + . = TRUE + if(owner.has_antag_datum(type)) + return FALSE + for(var/i in owner.antag_datums) + var/datum/antagonist/A = i + if(is_type_in_typecache(src, A.typecache_datum_blacklist)) + return FALSE + /datum/antagonist/proc/on_body_transfer(mob/living/old_body, mob/living/new_body) remove_innate_effects(old_body) apply_innate_effects(new_body) @@ -37,7 +50,7 @@ /datum/antagonist/proc/on_removal() remove_innate_effects() if(owner) - owner.antag_datums -= src + LAZYREMOVE(owner.antag_datums, src) if(!silent && owner.current) farewell() qdel(src) @@ -46,4 +59,4 @@ return /datum/antagonist/proc/farewell() - return \ No newline at end of file + return diff --git a/code/datums/antagonists/datum_clockcult.dm b/code/datums/antagonists/datum_clockcult.dm index 3084b9ba82..b8dfa00f23 100644 --- a/code/datums/antagonists/datum_clockcult.dm +++ b/code/datums/antagonists/datum_clockcult.dm @@ -9,27 +9,52 @@ qdel(hierophant_network) return ..() +/datum/antagonist/clockcult/can_be_owned(datum/mind/new_owner) + . = ..() + if(.) + if(iscyborg(new_owner.current)) + var/mob/living/silicon/robot/R = new_owner.current + if(R.deployed) + var/mob/living/silicon/ai/AI = R.mainframe + R.undeploy() + to_chat(AI, "Anomaly Detected. Returned to core!") //The AI needs to be in its core to properly be converted + . = is_eligible_servant(new_owner.current) + if(!silent && new_owner.current) + if(issilicon(new_owner.current)) + to_chat(new_owner.current, "You are unable to compute this truth. Your vision glows a brilliant yellow, and all at once it comes to you. Ratvar, the \ + Clockwork Justiciar, lies in exile, derelict and forgotten in an unseen realm.") + else + to_chat(new_owner.current, "[iscarbon(new_owner.current) ? "Your mind is racing! Your body feels incredibly light! ":""]Your world glows a brilliant \ + yellow! All at once it comes to you. Ratvar, the Clockwork Justiciar, lies in exile, derelict and forgotten in an unseen realm.") + if(!.) + new_owner.current.visible_message("[new_owner.current] seems to resist an unseen force!") + to_chat(new_owner.current, "And yet, you somehow push it all away.") + +/datum/antagonist/clockcult/greet() + if(!owner.current || silent) + return + owner.current.visible_message("[owner.current]'s eyes glow a blazing yellow!") + to_chat(owner.current, "Assist your new companions in their righteous efforts. Your goal is theirs, and theirs yours. You serve the Clockwork \ + Justiciar above all else. Perform his every whim without hesitation.") + /datum/antagonist/clockcult/on_gain() - if(!owner) - return var/mob/living/current = owner.current - if(!istype(current)) - return + SSticker.mode.servants_of_ratvar += owner + SSticker.mode.update_servant_icons_added(owner) if(jobban_isbanned(current, ROLE_SERVANT_OF_RATVAR)) addtimer(CALLBACK(SSticker.mode, /datum/game_mode.proc/replace_jobbaned_player, current, ROLE_SERVANT_OF_RATVAR, ROLE_SERVANT_OF_RATVAR), 0) + owner.special_role = "Servant of Ratvar" owner.current.log_message("Has been converted to the cult of Ratvar!", INDIVIDUAL_ATTACK_LOG) if(issilicon(current)) - var/mob/living/silicon/S = owner - if(iscyborg(S) && !silent) - to_chat(S, "You have been desynced from your master AI.") - to_chat(S, "In addition, your onboard camera is no longer active and you have gained additional equipment, including a limited clockwork slab.") - if(isAI(S)) - to_chat(S, "You are able to use your cameras to listen in on conversations.") - to_chat(S, "You can communicate with other servants by using the Hierophant Network action button in the upper left.") + if(iscyborg(current) && !silent) + to_chat(current, "You have been desynced from your master AI.") + to_chat(current, "In addition, your onboard camera is no longer active and you have gained additional equipment, including a limited clockwork slab.") + if(isAI(current)) + to_chat(current, "You are able to use your cameras to listen in on conversations.") + to_chat(current, "You can communicate with other servants by using the Hierophant Network action button in the upper left.") else if(isbrain(current) || isclockmob(current)) to_chat(current, "You can communicate with other servants by using the Hierophant Network action button in the upper left.") ..() - SSticker.mode.update_servant_icons_added(owner) if(istype(SSticker.mode, /datum/game_mode/clockwork_cult)) var/datum/game_mode/clockwork_cult/C = SSticker.mode C.present_tasks(owner) //Memorize the objectives @@ -47,11 +72,17 @@ var/mob/living/silicon/S = current if(iscyborg(S)) var/mob/living/silicon/robot/R = S - R.UnlinkSelf() + if(!R.shell) + R.UnlinkSelf() R.module.rebuild_modules() else if(isAI(S)) var/mob/living/silicon/ai/A = S + A.can_be_carded = FALSE A.requires_power = POWER_REQ_CLOCKCULT + var/list/AI_frame = list(mutable_appearance('icons/mob/clockwork_mobs.dmi', "aiframe")) //make the AI's cool frame + for(var/d in GLOB.cardinal) + AI_frame += image('icons/mob/clockwork_mobs.dmi', A, "eye[rand(1, 10)]", dir = d) //the eyes are randomly fast or slow + A.add_overlay(AI_frame) if(!A.lacks_power()) A.ai_restore_power() if(A.eyeobj) @@ -84,8 +115,6 @@ current.throw_alert("clockinfo", /obj/screen/alert/clockwork/infodump) if(!GLOB.clockwork_gateway_activated) current.throw_alert("scripturereq", /obj/screen/alert/clockwork/scripture_reqs) - update_slab_info() - /datum/antagonist/clockcult/remove_innate_effects(mob/living/mob_override) var/mob/living/current = owner.current @@ -102,7 +131,9 @@ var/mob/living/silicon/S = current if(isAI(S)) var/mob/living/silicon/ai/A = S + A.can_be_carded = initial(A.can_be_carded) A.requires_power = initial(A.requires_power) + A.cut_overlays() S.make_laws() S.update_icons() S.show_laws() @@ -113,14 +144,16 @@ R.module.rebuild_modules() if(temp_owner) temp_owner.update_action_buttons_icon() //because a few clockcult things are action buttons and we may be wearing/holding them, we need to update buttons - update_slab_info() /datum/antagonist/clockcult/on_removal() - . = ..() + SSticker.mode.servants_of_ratvar -= owner SSticker.mode.update_servant_icons_removed(owner) if(!silent) owner.current.visible_message("[owner] seems to have remembered their true allegiance!", \ "A cold, cold darkness flows through your mind, extinguishing the Justiciar's light and all of your memories as his servant.") owner.current.log_message("Has renounced the cult of Ratvar!", INDIVIDUAL_ATTACK_LOG) + owner.wipe_memory() + owner.special_role = null if(iscyborg(owner.current)) - to_chat(owner.current, "Despite your freedom from Ratvar's influence, you are still irreparably damaged and no longer possess certain functions such as AI linking.") \ No newline at end of file + to_chat(owner.current, "Despite your freedom from Ratvar's influence, you are still irreparably damaged and no longer possess certain functions such as AI linking.") + . = ..() diff --git a/code/datums/antagonists/datum_cult.dm b/code/datums/antagonists/datum_cult.dm index 719f0efec0..1fe344aedd 100644 --- a/code/datums/antagonists/datum_cult.dm +++ b/code/datums/antagonists/datum_cult.dm @@ -32,9 +32,11 @@ communion.Remove(current) /datum/antagonist/cult/on_removal() - . = ..() + owner.wipe_memory() + SSticker.mode.cult -= owner SSticker.mode.update_cult_icons_removed(owner) to_chat(owner, "An unfamiliar white light flashes through your mind, cleansing the taint of the Dark One and all your memories as its servant.") owner.current.log_message("Has renounced the cult of Nar'Sie!", INDIVIDUAL_ATTACK_LOG) if(!silent) owner.current.visible_message("[owner] looks like [owner.current.p_they()] just reverted to their old faith!") + . = ..() diff --git a/code/datums/antagonists/datum_cult.dm.rej b/code/datums/antagonists/datum_cult.dm.rej index 991ad512c9..0fc846a73c 100644 --- a/code/datums/antagonists/datum_cult.dm.rej +++ b/code/datums/antagonists/datum_cult.dm.rej @@ -1,9 +1,25 @@ diff a/code/datums/antagonists/datum_cult.dm b/code/datums/antagonists/datum_cult.dm (rejected hunks) -@@ -11,6 +11,7 @@ - return +@@ -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) +- 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/datums/mind.dm b/code/datums/mind.dm index 0acd33ad69..421cecc95b 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -54,7 +54,7 @@ var/linglink var/miming = 0 // Mime's vow of silence - var/list/antag_datums = list() + var/list/antag_datums var/antag_hud_icon_state = null //this mind's ANTAG_HUD should have this icon_state var/datum/atom_hud/antag/antag_hud = null //this mind's antag HUD var/datum/gang/gang_datum //Which gang this mind belongs to, if any @@ -71,6 +71,10 @@ /datum/mind/Destroy() SSticker.minds -= src + if(islist(antag_datums)) + for(var/i in antag_datums) + qdel(i) + antag_datums = null return ..() /datum/mind/proc/transfer_to(mob/new_character, var/force_key_move = 0) @@ -110,15 +114,16 @@ memory = null // Datum antag mind procs -/datum/mind/proc/add_antag_datum(datum_type, on_gain = TRUE) +/datum/mind/proc/add_antag_datum(datum_type) if(!datum_type) return - if(!can_hold_antag_datum(datum_type)) - return var/datum/antagonist/A = new datum_type(src) - antag_datums += A - if(on_gain) - A.on_gain() + if(!A.can_be_owned(src)) + qdel(A) + return + LAZYADD(antag_datums, A) + A.on_gain() + return A /datum/mind/proc/remove_antag_datum(datum_type) if(!datum_type) @@ -126,6 +131,7 @@ var/datum/antagonist/A = has_antag_datum(datum_type) if(A) A.on_removal() + return TRUE /datum/mind/proc/remove_all_antag_datums() //For the Lazy amongst us. for(var/a in antag_datums) @@ -143,18 +149,6 @@ else if(A.type == datum_type) return A -/datum/mind/proc/can_hold_antag_datum(datum_type) - if(!datum_type) - return - . = TRUE - if(has_antag_datum(datum_type)) - return FALSE - for(var/i in antag_datums) - var/datum/antagonist/A = i - if(is_type_in_typecache(A, A.typecache_datum_blacklist)) - return FALSE - - /* Removes antag type's references from a mind. objectives, uplinks, powers etc are all handled. From 4141b6549f4b5bb44bba2e4d305713ce30c2ca17 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 3 May 2017 01:42:35 -0500 Subject: [PATCH 026/122] Adds eyeball soup and spaghetti to the game: it's now been 8 days edition --- .../food_and_drinks/food/snacks_soup.dm | 9 +++++++-- .../food_and_drinks/food/snacks_spaghetti.dm | 2 +- .../recipes/tablecraft/recipes_soup.dm | 12 ++++++++++++ icons/obj/food/soupsalad.dmi | Bin 18041 -> 18570 bytes 4 files changed, 20 insertions(+), 3 deletions(-) diff --git a/code/modules/food_and_drinks/food/snacks_soup.dm b/code/modules/food_and_drinks/food/snacks_soup.dm index 79df428ebb..e11231fdfc 100644 --- a/code/modules/food_and_drinks/food/snacks_soup.dm +++ b/code/modules/food_and_drinks/food/snacks_soup.dm @@ -128,6 +128,13 @@ list_reagents = list("nutriment" = 5, "tomatojuice" = 10, "vitamin" = 3) tastes = list("tomato" = 1) +/obj/item/weapon/reagent_containers/food/snacks/soup/tomato/eyeball + name = "eyeball soup" + desc = "It looks back at you..." + icon_state = "eyeballsoup" + bonus_reagents = list("nutriment" = 1, "liquidgibs" = 3) + tastes = list("tomato" = 1, "squirming" = 1) + /obj/item/weapon/reagent_containers/food/snacks/soup/milo name = "milosoup" desc = "The universes best soup! Yum!!!" @@ -196,5 +203,3 @@ icon_state = "redbeetsoup" bonus_reagents = list("nutriment" = 4, "vitamin" = 6) tastes = list("beet" = 1) - - diff --git a/code/modules/food_and_drinks/food/snacks_spaghetti.dm b/code/modules/food_and_drinks/food/snacks_spaghetti.dm index fd17c0ebd5..dc3aa60115 100644 --- a/code/modules/food_and_drinks/food/snacks_spaghetti.dm +++ b/code/modules/food_and_drinks/food/snacks_spaghetti.dm @@ -83,5 +83,5 @@ icon = 'icons/obj/food/pizzaspaghetti.dmi' icon_state = "beefnoodle" trash = /obj/item/weapon/reagent_containers/glass/bowl - bonus_reagents = list("nutriment" = 5, "vitamin" = 6) + bonus_reagents = list("nutriment" = 5, "vitamin" = 6, "liquidgibs" = 3) tastes = list("noodle" = 1, "meat" = 1) diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm index 050beb8478..8ab865f65d 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm @@ -91,6 +91,18 @@ result = /obj/item/weapon/reagent_containers/food/snacks/soup/tomato category = CAT_SOUP +/datum/crafting_recipe/food/eyeballsoup + name = "Eyeball soup" + reqs = list( + /datum/reagent/water = 10, + /obj/item/weapon/reagent_containers/glass/bowl = 1, + /obj/item/weapon/reagent_containers/food/snacks/grown/tomato = 2, + /obj/item/organ/eyes = 1 + ) + result = /obj/item/weapon/reagent_containers/food/snacks/soup/tomato/eyeball + category = CAT_SOUP + + /datum/crafting_recipe/food/milosoup name = "Milo soup" reqs = list( diff --git a/icons/obj/food/soupsalad.dmi b/icons/obj/food/soupsalad.dmi index fe4c07362af1de60863c06136e4b6b5edf9d54bc..c6df0a26039a75e9e460ba81307807b3e8d3ddf2 100644 GIT binary patch literal 18570 zcmb@ubyQrz*DctMLvRSL!9BQJAh-n$1b0Y~;Mz12T!IHD!QCCYad&qK?(R07-}m0w zn>F8>wdS8*eQ#CQy>(8>K6Uo)Ff|of3^Won004j?FDI=I003cM0qZD8u+JmOMm5-t zC@;;=F47jxW==MaE;bJK0Dwn&RN{yVEj4!E*ovy;mF@6e`Rapd?=QhUmT$$sNfh4f zNpNO>ys<3jM#_WH2<1SU&xdc=N4hqr_It>(R5ytg^U{aSL57sQCNvBkN;`eW0tmE} zTbpW#2qWg~-z=@*ISnEMbJR!7?R!m_u+Pn2L(p|yjHQ1P|N3hGl~9GTv+x6du_R*V zL{57tU)mGgz|#1`@9nE#Z`b~g zjn{3bT9rpadEL#dlIe=&2)n%$Xj)(NF!mnWA}q?=#~FYuZ^^xo=nJI$8cr&H{9?KX z#a{N>HkKQ^=MzU9m9q`;6Jlr>jqz!gbVOT>{A`xSm9wn9uF>g`061XO@ytZ z-ROR543PnKgaJ>WbP(h*kF&(3m}D~g)91T}q_6hL zMf#JY6j9K6wggIl8~|7yhh1Hf@zbRlBF?O}f8r8nABUYc=4;SY+)}I}u2nGlnC@K6 z@@!lGZ6QE{%2B!Y*%tukpZ$uBM1|e>z7v1|M<_!CmRRpZfyYMCCo+K*zM(;f)ienL zq9CwGz6bcX|G@b_D(^&+w38RbPNq!P(6RH@8C@e<@w2^p>)YP1ZB8~56296mrtB!a za*rz)DNiDQ5#hDcoDRsJ)*NsiN&-#2wyCE;I*Me-6MU)^XTA@;QY4dfy#o>nni4sP z+=|wm_&x9&A$wW5xz*xa&Gc0CukQT>osIAN{>iE@=-;4{Bj(SZi}}szP|@{Z_}$Dq z*TK8YYNa6|HI?M)`ME4fBE74eLtz z@o*AAW`_W)x91|{3gyW1>ptm8E&wz|XG(=ch&^(|2sgF8o6>L~PJXAC=$XLmvI~4brDK5NG0n=O6l7qeEFB)npIJ;hLsE|7@bcVbc;oj0BIvXy8AatIT<9b~p6*POzqPD` zjUr60gGmIE%Nqrl?b71na9i8jJlBmt+DionCpnPv zay}gF?1JV+1PKYSNcPf|Ynv9aqSWWtj*<+%?u@K9n&<1R3bjw4ewWu+!5Nc3DU7o) z`a9SFsM6Y7UQa3LM_XpfK_72qDtdvZyDD`3OI~|Kgv=QY2uM6DM97+T*$B|Jg&yES3ujEZwFFK?X#}Nf!D6CbzzZNsdA|Y3pQ2udAbQ$5jJOx59zq+a_mB^bmBgEgc_lZ#gEip23OmBsnx4?4~xz5SMjEn_j2HG>^V8-}0yDZ66WW!fp8`CeHDt2fT8PeD|; zAH9&lkH4EeP4y*UTf4)rjrRPgiyv2{R?!pfBDzS_SEJv$bysXa3h#B;Y;2frb1Lx6 zNbrt>lpn3g2THb;CT?*UFm~rQ2FzTzN0cW_8ApdE1&?G6F7dNz%OW9q_8BjORjwlx z6quNpOa@qDX_c>Q(L8>VuAWU?xQ2zg?T&+JfIzQze^!73wQKXghc8ZB`|pavEL7$3 z6BFXFt&F_?wtnHYIc=i?MyC3510*G@Cl*QkEyh_yAsxoqt*xzHyO47;)(G6W_?y)Z zl|ZA8wY99%(>c70noRNhma1_(mSi6n8}D&h%S|^ec#c>F~c`peuqlOZa z#vlOTFO8^UOR>MOw#wg01L3Btk9aTxHn+aiyPn4LrYJIaO%M@;>FlFI{4DWnjFOdQ ziyVfU8+hOmWe*J{ZTu>X=t###Bk;n$T(bbiRm5uzm)q7eF91>svcv^ zRzBghpEqT5A$%da=M0LZhk4DXWfu@5%AK5tRkl<8Jx8wD3t^Q|U%6{X6?jyxGbAdI zPN<@fEWnR=cQG!i@8060Lib}tTDqk~amZBynTC<+o3<=U8l-$Te4_%ef+dxu>lju0 z)buDPuFqES{*cJE2ZQ`(sme^&y};l7JD>ITD!=Dvz$K+mSV)rZ-|?%l=k|Em#K~q0 z?K`jb=8LF!%`6aa#+M*R1+YS1ya`0ye?N$A-g{}Uie@IS)ZB0E+NR11f}Rtb*BW>5 zc<&l~;-wBKktYP4$p5`X^HShL?#bJP8=Z%a*H|6Ta5If}L{HAB01LhG7tW-0*Ly&B zZ}WHE0}05AQ~DDh9ty8i536Su7aJ|I2e#W36o8x$FoxoYcv}lijgs0n>^2xAiRg5R zXRQ>2R)eN-SQ}038wiay_K_dYP=&O8)D#-icKDy~>pE2_gFdjlAwrJeY!BmlW z3zE&OWfm4;3foN<>sS^ha4&&g*0|?>wQu?8n*}k6c>1tp3k9=T-Un-5^b{QwtF9VO z*qvhCRESDwF4WLs+|a{J98m785oo{(2OIg;_c8ppd{`EGQ!XXdqxyb%Co#{p>KHHk z&gCYXsj5Wv>pHjyp*-ltP?`G0mLP4fXI$c(v}rm+T7&!AA(Q@l&$yXKEHQ%~ z44w4TGfuJ<$fxGBP{T~~( zU%(0ZgGqi7G%)NvG9dMA@h@x2D!v$vX3s5?Gdj^9H~A@w-1teL=PCxTu(#4a&1id( zZE#31RTk%Fq)SY%WuqN_*(EOX7H~eU7((`k!5deGZBpDpuOF}$RbV}1uI5)5D4Lp< z$!2~2V4ksfVanSNbZz@!=gGPMg)iggw)2MlgO%c!cU@aedtsBd1+bMW6V;`@wg;PW zO@dcjD_t8t=%&c{q7qPY=uj7=(!fO1Kh^Ydqm*5f$Ch-w=`u{Yh3t)#mwVCcyym>y zd2iKvvN2o>wa-FuDa4uA&41N#J6iPun0MYugpdT<#Y{|veE0^9z=$FG+R({X<$91Q zf^YuldsXRS)Dks{yR=%|K#As*unM}9wShM<5mpyiIfS0{^h}at84i+;`Ho!)&HP=D7Q^8R8o>jv7DHa|!6y-|z4^+ea%>zLX0)@x6 z*#5n@p%BfSDp9)w(GoaDJ{3da^XFeH&x(qQGsi6uza`r*su;h2^Gumso@0_OI6(VL z$CsePNBtadELU5}{)y`iyg(}%q%VAB1W>f)C4t4q8=0{Z>jfkq8ylvSHNPJNYDn#V zeBV0OP1Yf#C+|FrS+!F7LKRhZ%oR(tQsVyTrz+kEy86@uv$!tlVF1U*+Pbo(cB^H^ zL9b2RK&leMW2m&LUNJ+(N=sWlq>KU@A8br|wmZ`FQTeUCgH2c*rhbR6l*fAFW3Itr zG`GpDgj<;~CfJhpCKG=1Ql z&Kned6cvYi2hcSF$$isj{S=FXpT*e0;exVMUr=TLs#l)s&Qc=o6T+XR`|;xmXDd>$ ziTx}t5w?Ve)LZCD+>~ygYRU)sPwapZy2oY_db%^K(Y6)lejRZNRo#@>aW(kW)zw@) z1#3eBi|BS--=(vb9VPXmc9y?YM}oXrcqm5 zh)g@FN4p3PM#^l2h-%#pJLk;1mZqZyN)hpHny&hpy~RTcd4HKD?tZ7#gH2|Wte`3m zGk|^5p0@VWE&1f!k>&nmUQkd__MH2x)M|Zx<+@vw@*;PD3P!d#d8PPuV!O`8^cOzJ zKWsl__|El;5!MWE0QuosB73?wq41g~LZBa<*;rdp{sZn61;iuhqgt&MR@ciJvY6g2 zEra4^{{XAiO`T57%Oj=d-;G@x5yNoV&j`G-(b&o9=n~HZ`j})w(K_E~b;bRrY>G>R zCzWh=mY0}VSh|egpY3F9*tUCpTuSkt zxTfX@A?>ml*zFt+sSrbY{no3@OOr-HdcrkvS>KZd0&)@ZC*aDkigMFjeq*;rFIKS7l z<&iYiFVJ`1Ik{I?HvytmY?qEl)%Vi|w{Q?j4qCqsr&^6b#&6d7_U_(hl$d02>|7}T z80N+eQI_EReRpPlbG$Y%en%9kRYwH(OvH7gj~26iG5YWtQt>GFx6AZ%)rJ{vmu&S} zG4wA5L39C>Lm5NM!wY$GTJ1*>BsH+f8(bd6$nPBCvar15>Gw$_mo^T~Jov|jr8P6a z(^FTZ@xkpw&0iGw$#`ygB`i9Q2{~;i;=J#92|bD5b#)1<61b{sBU_(DE-uVzJYGlo z!YES~EyzosoJy{a%-kzYEy=24?QPXq$VBxd4hnCmPmddO*jx5hlGgmh0Q=sDp;1>q;a>>_U$ajay;b z(;t;L5KGHwl74q6J{|$R6(;DL7T>AZrFF6=oQ8%5oqU|fe}7Yv$hbU}cWq+zt?VdM4)ccrWYZJoDW4?wvJj>}5U{B~PeN z&L`iBvmq@V!BXhI?X?UGqU7cHzDrVBwmg??jBI;gxW#^J+Q=|Bx7Ob>C$>2J-E3>! zuePSXyW3g30|+cIDO@s8C3gI;U_>ZAchWHYXluaPy11x|Th9JzWMt&2@_{Yi$O~gn znTSV7L3MV0_fRpA0uCNdZVi&()*8rEoya7y;~qie>5Ufgmz~Bf0(fS*<^G#CKPISK zNoGefof99-mbahK6P3$~>9(3KuWL=5oL525$DU9Ma(WsZE2JuNsR9cwyRtE5kI@}1A}z(KEuHIS zH^zrpR8uAPW$FYeKl(Pm*)Y0p?+weeFXW{PhM2##sH`Xh@sWM(t!ZgojwQ<~ixBPY zDE-ezIX$!Phz@V-Eimf`WyUk$nIDow+i>RrQFL@3AEgT`-m=ay<*&cRku2?K|D8@I z!546H^}Fp>+3-GzI8Z3_s%1$ksDioc|8Pcp%vt`o```6;}_ z=!qBl5G61jN;t0TbyYRsd@iE(qw23fb13!tMlhuppTnwBP)EFE4pNm_g}z@w{JZCx z+pI(iA7gf1U73<={&*EGZd7lm|5kM@Pj^RusQ_0zH>xtFysjyQ?tq1PzU4)X$YEMQ z*ua3u?Vb29_se%72kSd6l*t6*Pb3VAH+p_5iw3#TXf>oqgI~9wn}Jw*iEYLgwD$Ur zq^Hp4+#$2i&%INVox;1{1sX+pEg^P_1z?&-yP`3$u`Djt#pz{ zP}Kilz_bIPs7QUdUl*V3p~v>Qp<<5HIrDmCrqhU0ZA6m#A$@luNYuP;t#qO0bHmOG zW}CPRC*r)voM`KK5(;mF1g4XPO%tXNiKM;cBg)1#{jZlr7O=AhxKFgJ%*$hlic-uP zJH*N92nn(+*Us`Tppyf#UYCmya(#Rak-yB+jG}T*V1V9r`m{+N@0X-0Yt#IQtj|X7 z^EUKmq<3uIpGfpgSB}k0Yx=059ENxrJN^@Om1aOe)%~s!Z|Ovo@!S1Li+#vT{k&q7 zUD|a$3;Qn-*doKtw0N9n(J=C`^tLNLu5?v6?VUcSzcXx&JKW$JB_&pt$a3)Y53)|P0+rvYgom67zyu|?_h&+lT?KiNOGr`s*+hR z=Cb-IG`N4&YCx{onN3tMm7`eKa({K%MvERUSXM!QoFY-6NZQ)A?P)6&cwQUuKM*e+ z7b^gamp7w=2n`U$+xun{L9GVyGcPT66uNtRlp+B`$$$TBM{`zG<_@igs6Y_+9FUJ3 ze18_e!2q^O%dKceW&_K=NTMwz?mc7v)N}L>eqn{TsmS=bF1TAda0T4Z?Up+}6%z0* z3lRkdfBDzhs>qqrPoyO4*Q7BbZtFunM?A^C51 zwgDE_PqOGMqWIJMbKvJ=@N*f~@hyD%v2P+y*TRiJIgKj(&5Q;ZEm{O)en}O`EO5c9 zU?c*cLnJwT=6rl}mn1-Phh`v#GQEa5zxIGODiVlgWwibVL@ID0P{|zw42+L~yG@3F z(Y`_qsEInsVyVrB29`jtVOJRE-v8YJ@qY(^|1YP>|4Ze~X%4t+{?R8sBcmtwtdhf9 zhRn=Nbq$U973c8qaP`By#>Tr+p;Jij?=^&{weyHv+Nn2g4Wg}^6xY`p@nouizbHu< zt6XN~aSwWuUs|wg)`%4TLFBx=Jbd#~ty{qi@EzOUoPE6Cw(IoDsatV{TJwgl=VK55 zZTO4B+aYksO?FIpc-(A-k*cvV)x^YvuM=d`mcZ4f)B7pwc*^U<&bOcjKBi^m;j%$Y zBch^$L(+_wRX=yvk3ne}&o+aoTUSaAP8C%sucJaq(RiC4uNSX!-Ai;xjB5i2MOJM2 zaNoy>yW;Dj7NLQ;~tdV-?!fLME##GaC$<06R?%WYr`!vjmOv6lsW zcQ=jigN_293RUyPM^}S0h@@?>Zq)^xVj}PIa#Ly(SP!C3F*05 zs{{oN&9pa?xYP)m8HUGzi;v$8yGbPC@jjkj`QUn@y)pG;T$UvU!Y&w^?h%w~TWCFm zRC<{+d*$bA30M7M`U@BCf$urVR$wL{+VD$nDg^e#6mpN{W0IRzCLA8^KvjH%KB>1bBBb4_Q#ENe6cmlKko=d;HXVR z61K7-x2Qjjc6~13^e<6OdRjt7RSgNru%eU;JGf>~%>b|v#g!N#>0y`RDU0kZk%5X4 z*GJ?xWZ=P9lAVn-f2!7r8p09npL>~2MQHkW8;iC7qu*GM&pv;<%`+vYipkWgjiBLL zfJ>Nkr^lVuxHzD32l}cuM!9v_mdEuYHJE;t@7UPp&YI=&pD{7_S)@OHlut}dB%jsM z(sH!{`1|{7YH6A9kZ_VLUB1b*k2%`kX9C(fvPfdh(yQs}4vc093x7K-`!74n*IY-0dh9VQWR6>!MRe)+ac0I~ays4sHuN4H%OX4kfdhZdlXnItrMQRCI^ z^V$J@c3j47y5i0!9fpD(k{3e3J6V-Lma!=fBUWV44n2xuoKYaz6Nd=Pt%`}fem=1^c}_C^G5 zV;*cpB<+1h=+hQ)wTue(S%!_`^Y&yNU0;yHm!Dx{<2geZcgHfu6nC$x`Sp6x57Rz<6_;IXlMtOBZg-z zhY8n7{uOGUKksSUBmN8&XJib`&ZdGTCT75^RZ^o*&c}6g#WdjS!?}_UDCpVC6?OpF z$H>Z>fKMYx-aEq@=Vn`9MJj+<+j}S3$WXxSI*lVox1ouv(kvJrSQc1x-dw))ySe6p zeuR%1wJ(&T8$ILkXSh1HM7C!Z?~NpUm9Rm&lO6zibn$rh z3p%BeJze)4Fa5<6Ch<2V8QjZua=2aaf15yk*7h~C8=L9&FF;T!o4PX_^ZK%3pl^L* z_Jx`2H;*y}29Gq6-1VZu$8r%kB9jE}d?9Xx*UKfRGnNiR_b#skJhhMqO>HUP#N{O& zZ7F+tHgEesHrpQ#@Te|Upd~cmS0a}5*#=QRDcWWG1n+y^3E}=VB#!8sll`pOlRl3R z6gYqa*O&3{nJWv{5*^k&rtgUuIXD^~JqxDZupnhyQwlmEfaT-qt6(;p!NBR_)l9Z$!7alf>fvtWrv|R z=hnBqb2(%Ek#|gNAW}n5Y@$+XQ*bb_N>51(Hwt;A_VeB;l24r=!olsvZVQ&wJ=V&B zyAYy>N1v$X)?idQj}*lLi$7%&Eh$`o+hM@rc9WmI_Tx|QZTfgylA#K>lb!4~^tRh_ zPxXv|&zP@?u2hGHg5sf}o?T&UZHewDB5kZ~H&29ippQ^V{c2&Ia630JU{xmprGxeD)EV;`# z48OYXXvx2U%X()wd)Q7CFu?^!UYDq*$+mHtM_sUtP9gy()9_a(OG@q<)Jl4b=i&%I zR7_!Ms=sbSuGj)<0Y-(6o3h3;GR2);&#C=1)4pxsp*jV>3&1Qt&|cd(Y9CyAVHt}L z)Z>J+NXTyG&y>LMK(wm4{4mCS^XN2;QFY@ZLLGw1%%4c1|PeJ~OeUY;3wK-aw2v=PkGN?7cr{tuLKUn$hJEY!7x=LjN-+CG(+pV}S`m&Cn@ zxS}HkN@9F~=JrfuTCXvXpOta+m3+eViP5+QFv>4o&-Co2W!HODkoc@O0_P97zkWxC zzbFy^P4ZJG4cPPvL&DgV(;v)P;QhSj;%2OvJ~IBM?eQ$4Qdy(r_!@CLxWwjV=m+@o$VRSXROo04s$xrhoZ#L^>3_59`)~v_b7B zT?;FO(wG8@>8LNDMJyBadV{Mq}0*VyRr z4XhJ3Uy={~jQtkWIcW^fPw&Kp5%$+p8t zeOJ3br=hHs_Of+gs@HH+26`y%@!*8>LkCP7=fVj_ErJg+Xs@b3i=}g@J7iB2wfl;; zsm1FDb&-n?A1DtU=mcbApgL)w9O)mQ;7|i{Zn z`LV)Hzr&@&ik04OV+Ub_Y`#169lMN5_$9w?+B^_hRhPq3C@);^-5(DBN zFjawDPg@bcnSoNufK27z9;v3B34unjPkkm1Pa>8#wzlRh&$&H!GqgYD0D&lU{-1;4 z2kiV-XIAepPK147{S(1O`TfIjIgAFNI{4m^48D)}U?b}B4l<>hRrkxpXRW4HZ_J;*bL{Cv^cn^oUtTC=E0xJ-Zv-G$8e$b87+l8d?Dr`5!vLu z>$46eE8WmU;OQL-<4lu5P#1Xd7n@oWvL?lm*HgK(c^_>3)0Bq{cvJg4BaNs*bZ@+7 z;CIY7xLHT^9AJ%lp2OQa#w>adWcr1RwR=U*1rWTOquQm80ot*8$VhymGpE_5TgCWQ zAazK2cG>)A?lR}mh9HO5`j)5X4+C6T)#M`h=1~fS0y5O_G7`7p1btlBg-7ki{eWPv zsYm=%HBUTKnfk8h3L;iR5FeQiVvYuMqGl(>Ya{Ut4rKwws6C?he4np$BRCz&_-#XB zR;txhkInp@_99MNabd^`K$A@Gyn+_$H2*ZAZM4_0L1->{k?9aPz z?-Nbt1WVVB@&9c+HU*ZXo4^KRj1zbsk8a!F#l)Di#a&onh0X~ZXUD129LWYOEVJAD zffloW13Gs>2AhF;9v;a&Fbv4B388x89 z8Kp!lRCctY?GMy-mbBd(wpjt#IQI&<6v%{Z>PK-!6jW3x^xLx55A2AX>fKA$woxSR zQUCS|G}&3fD}zW>w$qA)3%m9xb1}u4QLXqLQ3Nn~?t(u1_U>mVtVDfdcSSJ0;FbWv zlko(;5^a47d(x2?;6*U&PL5YU-Pgfg&F6%B`a>m-YKvM3Bx_a!- z2GZZmFq$8nNYGklPtSO>EkI6~;3MYtJ+h%hF+>g`eMNX+%MOH7h+M{ zU>xvLMLK4CT9!jX`asMma4{W&WMX1|cCq+k%NIjWcTH-_jq_c50dELFyQoBf7b>%N z{u&XMT%|CUHFw6j-I~PS;#Hm9gDlV}!{_A$V$A1X|J&-JWob5sfovNNffI!YVKM#! zP5CXr6|ACzaHlRw4(XR_&D?|83B~kJ@z|K~c3yqHG8AGb2|4P%*VkubAg6kluekxABxWedX6Pr9DD;<-D3;ZtMG)Z` zrO1tLrPoyLO_f4z=hi+7BB@Qqd)Mz{!Pj12h@D^@?7J5^+zJA6CPHCk51(m<+|rg{ z*pj#Op($#@?5t$0qvad{U^pm0HzZ4{pAiu)bM@n~^deq3yzb>bcf^ZaCgxKE|DUe0 zgus@j5%6#|#Ol|D>pVz6D+1!^J$8+iE(=52JbyGAPDkO5>@W@Okk*UrrmzACs2VLO z@8tHJLHkuN-SE4y1W;wZY`)%xm9G;vUxDMc7VrZ8t?1LoT_b?Si_F6iG6Af63bn>& zQMsnMKXzXg^%jVtG=Y#k*T+J55fZQRF@M4STQGh7>CY++$lM>IpYE$I1>s^}$7O`w27@a_kWCsIHg zcVDfq&ibIM%lTPW8tRxRQlmFwlSXnmvM4Wt)#VN)Q4pi0+X+F^2O04TNs>Bh1fBjI zbjq?iP|1@uT<`_ugEX{zQ!;g!8r_C;d+*y-;?1tf5vgxmU*NA1>bt$0Az|B?FNt4e zGT-rD$3n9D)+Epnj-&aW71H7^`YT~;cg&Slz!v-`J97J)C=jpR15~JVtq9nt0CM@w zab=(jovHvD(1|yX6F!ueu5CL5%70QC?7i{TnRUPO1CGut=`$KyGHWuN^*b8silUddFMC#6sI9J+>4hD8ylNEQ9%h3M;YX6$O zxFCStxVsoiBFIo#g_a%dV-5sC#!pp!b+RA50o2s?_BB?gh)Qf<=jgxRRbJmv^ z*A878M=~=cwce&5A;SNU{yGVf1C^S#2?p$DOIZy;g0XpuHHF2tM;Gy?rmfRWpY6)R zV4c7u=K|J}iKTCqzIo&OdoAnX#(H?^&@qX!qOl4Z@kw@$27GamR6pndq+(X6SoJ9? z;nqF=%2ikC<4GVU=JoQRbN}Z@NSfDHC(NI>Ij}Tz7XK~*2?@#B&CN;W)%A59a|?_Q zSvGhROr3kohi&;42rol^ufn_O&X|Cy0#&OU(m7z|O?1pcGDNf_iS@BX4(qIN%wG;YR8o7xc*8eCoeTfj^K8MVXSApmPBG` zwoKms`*-j2TX$!@*Ru`QlNOFDm>>Fz+Xig*YFt^A()-Uls#Ny-KzGzf%c$edzA4=# zH7W6BWd=#8bNgp=wi`Jy30iG=Yt(?1S5{=nOTxFaz`NNmpRZ=y{y3CioIS@JZj+z> zoU>bQjCCFr3`u@{aUU{sR9IuNFWs4=6pPRH9j(YF@`pmj#VrR?)Hz6qmB1}6LRUKQ zYmB#@+lac;_($8uUhxn22K$6t?1W{Iqx5M zbQa`;tQ0%4o@HU~Dnv~E!bqD)g-b$8z=VytiKJdy10RuQAiQ;1QP0v!gmw*ahPGmf z?&wItlx-|J((=>OI1is`ePOAd8M%<3xL!oK^~eZa#|TSTtjVvkmv&{F>0cwiDw+qG zeD^nF&gX0e#n|#>A0VXs@aq*bf0Y2Uwd7_iS8u$O*HQpSZ=TtPl8P3=T3G0XeLtIx zCA0Qf7H_T+&Gy2?`lrAq=Mb{dI=-jNo#jb`Pl{$m;_$CZ8WUgzPPzz)?0jpoCdu>fIF9AF6ipq(brV zB{kpzvJ>uSDxoq@0uLj*;qtRLMkRb#EUhh-0gNrXX4KZNW?V=Hj_x6h-U=_GBJ<;?0!a)#Hc@) z+}=?02b!E;C=1f<*#*9;$@DE@6kMXW!w7s8y7${8sEf+$0R!=x+?584xWx1Y%;KN) zR&34!Gra%PVT8*1)fHP`J89`;EV>dQPd$YcCRoG7* zu3zTLzL2{a{il~}iF;RB{znEuqe(YssHn)P z-py-^q`$N({^yzQh-3;_<@zYHSYg4|c@{NI*X@Ujr9@gH2n zE^YXK(}(=`i01z!Ci$P01r+7wb@v?K$#-$PWZ9)XQ>NkL?JbASq-zbn;O>68Iz)jP!k4@_?mF zxD3dw0SVZmy^nT;e!HHbf4MDU+qryeanD-&ErFAt9!XVI)zVS>;1ES{%?P)*b<()VRw!Up;x$T`<;b-|txzZ9OEQ~u5U zSEQY9@L4yUPPmJeeMvI;LM)wQqRir zbI;Aql>^-0-*0ViU*CVfa!39g+xDsX=r1b3y7iBBnHZSe7+>A2$`)bGettUvva$xR zrouyS!w2|8ZPKVX!t-@GEIf?P`IcQKI;)-h`*)GddYqim48oV6oplovJfi0a=YgC3 zqDis}3TQ2E1seaAU@X8K=39qJW~S|J&D-spw_G_yEw4Rcf)*y!Qw8OZpk?kVM6RSu zhbZCHvl8Pu+u@JO)>don0YJl_Rp}Nu{1VR!XR&hzX>N8gBoYeabd!S(0ZawI6kpva z1OM#&rEntjfrj)dVYO1oA!IYUQr5};MsK`#xZ4s9zPYGhchKwPt`HgA8mP#;`Ob*s za&9M%CvJ^?`U+JQsQi;MLFj49Zu@7yFzJG2_xtJEEe;9J2q2IHCmEz-+`b+3gX1V3 za949h8`5jn%gvf8|M+*FlRjqtv*503_Z*1=d-CVYo18XWa6S2Y(D{Jv(%9ITjxc0? z{&V=7iz4P^;r4*ddsw!0atd=?+t0-@wpkg~%feSleIr)Unwzx1>B?M!_U7KthI9eqfb}0%VQJ*x z6$WmZf9^6&(BkhqwzqzAfDYEV(Q#o+g9(4KOPuCW)C1UKl_r_43M7~V8>~imXDilZ zO6JCYlVV%|_$By(Z_%~%r(*kquH2md)}tYMdCBzb+tIV^N-bO4WvSDD`KXsR14`tTEA z(G6^3VnU>sX49TAKYxSy9yU-r1D|KE?PzfR{{7oOG^7#JweZgi3Dj*<#>ii}-)9v| zAL0bvYtn6Z@Vk_(bpZZD$96n1P$J4w@_fOmn|s}Ey}YX}3=OHzFOtOinUvJ~^G;wn z&r(Hu`n}T=!sO(noV>hA-*gc`>0zG%0J(qQt_HmX%X1$gfBYw1+TTA$Y%vu6)6xvz zZZ0-&l3|K=Xy{e?1y2p`>=dbHxdwhxm1V+_E-}g*wb`S3dFiw%4pB!A#aGWRC8*a zluuyyzIHaiGL3@1V`oP?f8;xjl?~EHV918s0NOGOjOafaT%kbmT>wQB{vzr9X;844 z&{Ld}`L`fRKcdbuzX7Yst54k?r#cvg7IV)YvlEN6@GN%Ya#zvpN@c36D|@H9lZM?5^sr zA?pB-aP;2l5-wom1lOsK8s*{jGJ%B!sF%#tEY!?{1=yoysMUTq5K(FI-&I zd?&4KmnMa-71?$|^8n@XaON9^*Z{mL-{rWt8@Gex8^a-XS?IHmQv7RFwDnnQp!f*6 z@=^Bb{B0X$j!g9Wifrchy{AN>Q2EpmvP&R+q^jj-C+1A#3VI$l5vHIm${GY*l>Xyro;F=@rmKmUZ5`;WY8#+UR(( z%}$=nv*8Dy$8d8%XHCGJ=YE;h}5TCXZPx98s(gxU=R9^$wutb&k(cf0v}xI zU#smi+TuRETmM=nQ6r4HLlIQFujZAGxNFA%tM|!B^>Fst9mdo0Itz#?A|($qIz|nB z4o5yo>xpLqdOYn*o%xVqT2=ausMTJdbZ3P3Jk~o1`s4}wXZePYV*ASs(leg$dNKok ziMIwU?vI^A;o+Ofe3^E|*&d0X9PBLacTXCTGymKPh~QU9@>}wW&+?s3JbHVcMyrE- zB*#L5>-)buILZ-^<=FOIVL?QAx$9fy2aclUYYy}-D^rmx@)qR=SML`Ea(#hYc6txh zAhsG4|7G|SkR&8}lQ2~<9rC03!Qg<=cx;F2-61oZED+s5IHYhR5iG*Heqz*2?yols z-@c`2U(>vs#|oRyKT~v+^!3xdUL}dC88eJvUT{?ypPvt{I`jL-1r%%$1se0Bsr>^V zvo!s-2-&|7z_58uHhFp_D|u`oQK$*saKdcpmsJT^((opL{9NnI+%wbc9AnO@#d zlY}%BGJ`z)V7D`4%? zUB`rIld(E5>8}!GHU0w--_gqO-n>BYiSJa=WkYEo?Fd76in9QZJ$F}}#&*=uOOQ;B zwxRn02xSGni}oF4_KXtBmMfjxiFFaWE^WxSP%|e$4i?=9Bu=zLMhfPDZUv`||Fpx@ z&+LA08=;dlr%y-Z`>9LzpVkT-tc82)jZX+_(&hQ?|7yCWU zWQ-Omu1w%fij#$2jXC=V)xq?4-RSL+G{qfQnXT^mdnkCj-W?f&2M7YHV7t z)BfJm{B>GG75JWg@Uix={eo!J1=%D2y5(8dap_y(proseL!NB8(i#<=5f26$HCH{sH+Hh4yoAYL8w(}HxEN3W?&;Pj(|dWw%ui_Tr$UV=j? zsr?^RF!m}La$7%Cq(isAU+Dnc+|aH5z>CB`sO%yN#P7!@J^}~2;7Z{ZZBaAqHS%#r z#o*TuqD~teUoy!1QqU!~iCEXNiZIWV_Fvg?0|g%Ovp=Y2BDq}m-hL7A+ZKQo?gNfa zJRZ~!mG)lQ(X*kB|B8hDy!)o-ysU&f0qN~Cq**0dudwLo6=Uz9(F@-F`cj+}2a5dv zqP2%0VqdYqb};6yra%AyDf{350zCVoutyR7KkD!QXUO#5iS-Mvp#YewRb5+~AS^8G zpqcmUEH)V#D~MBu>W+LP0jT+pVdwG@R#vK86D;Vw^D{BACtc7Pkjv{Jj&`LCx;g>H zkH*!U@0RF4KOwfMCX1ula)>tv*nwOWy;#JX?E=LeM%j3Hc-D`PS4{Q~55H>7^6^fd za#HDUJoWg&-*C8Lv>Sr1e)-=7l9!HT^Izn!V7$U8Yp&Ku7>{Co-)#Rne!_s9SpM;8 zL!lH2?)@VwCnj`YtA~OaN^5m8C_diA~n!p z0tAnDXm3Ya^a+(}?3G=f+64ixILOi4`NW&(U`T`fBIgT9K%V4$>PM^l0Xv)FB^D-8 z18Hf5k2V$AmuS1@-`UF;s)}h6`*sWfqp^{Y*ijhE zj?q$@iT}u19ZX^U2d|!XmL7ZSSHJWz=jQKZ;LGjlz?9Gb@Sa7|x%oR8^3|43^@IWR zFCFdy9L*^pCaFF6l|W8QOCu#Er9pNSgl>g)9^Z4fL&p4V>Kyc@|B>>dm-?Q?5 zBBMv5)0-I@GmJ8~Mt=Ho6&}9c7#qjq>+V7Bx6hGVc8b5un+C%#gZ&>c_n}89+PjPF zgGVuzSCBe$7EOCs;XC$Phbty3DoO$f3JSv31ndRB67 z`9Lgwx&~?+pt3NF*u+V=4f_*rK;^!#@b!R}pwVb+j$$nH0-#zGj^XfE5Hy+4HhU7fnTcj`sF{L_E!O+Td7FMZ71`>q47b4pimX6bSYaJbx?haY~} zZo#y)G^_mR$~q8hgNLV{(8PMo*1o!e66j_RIeg zQ-I$X-6jX^?+mg1t>53A>GNOx#?#WmJLmoXF-*>%!{AmB&cMLHz;N=LFoSee3`2@C z1H+uVkd}d>972ys+I5Eb5>19)H3o+Jj~Ezkc27hxQ^VMpVNz@vga3p!#*GD4|B(xV z(E?y#0m-)m5A+SO18x661A6%X&WYXsuddk7khi#tD&3F0TemZ)Sh!+jeg=lo0$`xQ z==I>E00V3+sQRxR;mF`*sZ4SA1D5%5*)>`K3@jME7-SSMFfc$C?ZEo!AOHVhP_b}j zym|lPe}?!3f)NZx3xH8D3Pvyh0Kc$! UZxbhPqyPW_07*qoM6N<$f_^i8$^ZZW literal 18041 zcmb5WbyS;k>c)B!KJtrcXtR-in}|(-JOt-oBqCY z&N}O^bMHFeKS|ybI=2Z4P$bTWfG`V-O82pVw8#3Dc$qxB2^mKL^B*WEDO=F z1D9{i2l`isSS|?C&s$<`eR831;knZ&S)R6&SU5L&?}`>7hNWM6Fp13}NC9bg4`lnR zGIakllV7*j9j%>vOy9!O;p6kyO%6P~Hy+$+E9`+4v5FBg$krC?a5i^%)eY=|?JF=c zgpB^aw2itaY!K#A;pjNV`SQ& zcFqpthv~6EBbuK^JfSjS&)3T4x{pvQHwVg`*u4ig(m*6SeOw334-!cL05w2SMpDNs z^EAuTOXtJ-fVlQFLnnzsK2bUW^0%Mg-~MQcNGA4O`>@!^^5fx%g{8dO-mtIDRFXt? zAq1N*Ocs+3lMaa)i-0;jjzEjSpDN)HFz3BdG zYg&%g_1+jJD)PO|3K)Z$026|520#ubqs5V+b~X<~!bEk9;s6A9N54d;CTQXO13*RQ zmjeb#Z1iKI5MZtX|F<8Hmm#fYy=Ki)74;>Yo`!rdadw=6fQt*};bQcau&3W9s-iQQ zr-A5gyphFGCe#IwHNG0?|F6Y4dgzc*krq%%d!L7N?yVdOmkoun% z%EJ}#@eM|bhM}RdscG)mtAm>N92{|t?BcfCpkntwOTPI2uJHEuJ0CR+kox2I^VO7hvw9b3$p8e_fuZ26{RU5;N@DbG% zmwVcjMAr=hz+P~dd4KoJlYln27}@Q_Cc%aq{ev_{EmmHd5v5z6+s8;tc6PSUhlGMR zqdFH;dy8!B-(0R|0^k}Lu+hm$wp;c@p>&IQxlqCfVu>&O(tzDRVAqjRJcu!wV?+%n zz#`BkXh(VU%5PW9{mA!}pW?1{C;3B=t6Z*5W?J*Qwe}P#8QI4Up0@U__r6Wry!!V& zm@STFA|1WiRrl7R@q_j*i%HsRaa5kB;nA7>F1W6^+E~=ie7vPZnaixt}+S z5)aqNP+h%9pDhjHg0B=3IygA+J$<@f|J*G|>wLTXw5z5W8hE|%*wL_8jJG1-dRlo{ z_Ppl2;8vu|TX#K8x7D@WM{J8S1Sw6(N@3u%^=AX9I}RS#OpG6yV4&1gp~i%WLOi5X zFakgK9cBc;6KTI7!yETAu+n%MRyOoj*EMSxRk3@n@?V}d5CA?qwWa@l9GOzX&TFX+ zhZx}=HPLo6T;PsSoi`C$oUp}LWHmiry8-Ip`HYW*+#uH+vk_>YU%jvRPq0yln=^6x zOMX)z_lp@2IiSuMuCvy3SwG-_V>ZN6-o_JL^hb1h)bKpNq5{Xn#Dwy>3y^U;Q+=Z? zzA&4L^&mN#ShL0b15m6xB#m@w73g#@5oLe}`d0JS4}@1&itWoulBj-Wa0kt9Rr5VYRK7TyVl zhgfC)OXylGr}y+^)p!o=m4IIO%s2zF3D5T~1Ryls-STAyo0t z!KEmqOv`AOBYT=Wfvu_+U^+z+_#$f<-mzA;dAR)CFOc9D9K<4RPAPWn5AE+Iz=n_> zV#%R;QB=`7t?GDJsyQ{5&&B`NZ{idhf>3uGxmAhnBK4hHGLll!P(&MM&>*#2<>6sw z78di%X&Z!CR!~I-iJkreA3-vGJ}%BV-*c%&HEXj05-rQzW> z2^;#p)4ZNGTzMSdec@^P-7fnR8kgr%irBn)&ZErOjmAAh+XtQKlQ zgK$shl+#2_suND!qWT-P;Ui)lP`63>{mriqwAE0SSPX-Ruh-@63IY0JCb9Nptx?nf z!u-yQmZtc2J+-~7imXr1p4{?RvF_gR)9Ox>vsY|6JJJXzDz?k`aMn6C8eqgnvFl@K z;%m>X;e5Bu!gPCnYj3%|vfh^130>jEy02>wE6Z|M{D-af@weF;3C$q;X8*}8RGF4RXqwlx31qf5qH+kGLyng}U3J@_eLzo*z zCKdKOqZ+g+D#=A)ow#5(fBXIQj;rg(s{`v#oB=#T3(QzB{Bu2L=-7VmfwE>O2VeQUvKiobl0EAtB*VOym@YtYx(i1`qL9`xw!6s zTv!3jgFrQZzV5Od-LZqEK)tFnL<>GF{y_C2x>!Jn_eamlFrZ{IlAio{>Gf$v;ke7sJJ%98lVQD>c^zo=7Z^&qF}%OtaX0A=TY0=f9^IGM?97jH{z(pveFmTMB%kcf@dq%J zwuZh1X9@x zFJS7vjAl+I-e_pl7)}~&q2A|o^JK1z%>>n@iEuV2iAsTKgc#9co8NV1>F^45VS%b1 zOE4EMW}-V{PIJ^4v%4?clM5{z*S-3|*urgCS*oYsW8wyWGY;E-!V5r?XP8`?rIfCL z0_Jp#+~tS~)bP;|X0x;!n8EDUrgkWqJp}W#Kt?=OTSaC4`I)+FksC1@e&dH2-`AtU z#|xC>YOv!wRf*zv!J)Q$fffU2l_U}jYM35nT#L;>QGe#Y&+UtYC13H_TX^r())G@f zPP$?#vk%T|razj44Q}t0CC8^%*x^j>xhyBXFRXpw3(x-XZU~HY-H#3CG#|f}fPZ=d zRRyYby;ucThqPTW0B_D$g8VOE=Z0`Qq1-i0!?eB@;oZ#p>lvS}LES+RrE~Vp<$Dj9 z@G%^lngBXod-e<`UEe>)VuP_G;4YqDb3K+v_EQi3Zv;wi;oZWJ{QpM6|1H@3zka+y zBC&ka3QN$`N8szpi2~Ie7KinRv?6g8iT~VS>H$+RPzSs`(31%)9(;Yn`U6X(<3{qZ z@5w}rpdMA8JWBN2<~*KuPTn1)X&~-czlqHI%+nt&^2`2Wr8tGQLSjh-t5e*$96DLAQYeirMawj)ZZnK2p=j|;h2!@f>=OG6LR)V8? zM!G}!!O92SUS+N^32_O3hUWP)xGd?>8j?=k4yRqh+PFwE4 zq6kx}i}{bPr^P~9<3$w-c!r_@B)C0d8|PtWY*7RZ@g9_?n(@8pExkRHoo-ju7f%L0NS7eA zm^m0f?rB&2yZSdq2B9C*M3$&w_?E|aIP+(Qy^Ra2J=So)Nd6o{*$+LMe&}+hwo`=U zuVh@!dBv@V4l9U?)e0*L071X%I*lk32_NeB)-8#4azv9AWW&E-IHQ0-APYh@FEch` zEEmwUdD>1lNps=?Eg)t(>l z4(YukqxT={!fI+bZXjoYgDdN=_Q3QDit=)krARl$D0jsm!Uv^npX1?_H>As!OCtp_ zl!d^Mdbt|&wf5;g*K^B#;aGD_@;@!t?D?&EIGrit#xFIKPS(dRz|aW%1+m_tE2%5j zcWM5;?iEjG7})_Qvgt7?+r%$rPd9t%3JL&|&UHaBjM!}=D%G>5YGKvnIsI(fv23{#KpLq@x-`C z&t0&SF-KKubI~roo$a>^8EUyQHMTQvj`emO z;*x&-3ndz@DPs^Y6+&k62cD1iYRn|Y!vM1{nsxSE$Y@C(fDx=bY6Y0@XkN4>(okXI z=|0uxUD3IVbWaCTXoiD$tQhiCz*;T@3>867+zd5htsH5c8aHPnKwg0?W zMSUAInna$!)yu5H6`!Fc=`AHlj79uOGhSI_H|kw=ZcRztAE_nG^}uUpLis{>Z(Lo( zCg$@z)c%o^CHTPxpSOfKhFnl?`C!Iqb?j;64HsQZ@cJ0v^_}GpwT3!VUkXo=iv_jo z9f~E8WZTxfum1C7IKbkplu>M184sGX15KFc@^oy`e2yK z>q8BG)=`oP%M^SV`rzI1v`S>Ohoz#doJgm*HO3DvsH;mT`qRgET&#L!HOdhxMCH5w zlkfOvU_dIrIL|V|yv)`+ylr?$`4FcEtw@W)8z$(eizg?P(9k1u`aiOO^MKI3eMa#SiXD-7goFP z_S!G$Q2m^F+Tovu;!yX}Z9nJ-$X&S_l}|$Z;~T{499g3sTmE2vkdb}q#No^#P8AoO zE9@_@1}UoWQ^xh_L#?WI*n4Y&9oTvLI_A?I2S6GW7(XHo`LR3A{9c??5c5I(0);wI z4<%wZ7NtrY`{2DOq$R1%)`%{?|M>mzliiEe``Zj8#sIwIJy9YT$Gx1912xND&uzNl zWwpx4mh$kO483NprhP>uFmrP-%vV*Uz&^P2zOb-A^qk3N6bY=kV`U}ezp8jTLHUX= z@X4XsDA1R@u)k@-XN8zVHSG)cxzZ00dE2Ga`e%>6Z#xzl-g??$EDX-;7tR4v^)n88!q@@MrhqKLjZ2KP{g|GZP|+#7!4J+jc%3z~MHMV~i)o-n8iDkF zG90@Nc1JPqe#oTv@$q}>=_?QS_tNNnt(lZYWh;G*Ip=1Bxh>ofyXkl=H=)Mf1wG1Q zKECvErUzp3Gzn{M-`}($00B+oZLJFy0j}WjqB~&7?!J7{(YusTlODt~e2t7Wx{g5X zpCfHJ0S7yVLC+rD&+{1GOmPW(uqZk=YclQxkzS2x9)9g@lf-l{cIqq;9a!pw>D*$&9jJF7eI77UH$}6j<%>@>W2i*4@x7$K|r3u zb9ziBa8Sqd^ooxxJmrUbckf|t?Dy~S^Oc73&dwaQwYB~(ply2+58FTOC^_dd$Ezz4 zHfs#Zz?9SHW)Z!}t}bz!ZJzh~CHq~BqpMVo8Nk0Eq&1M$v4jf$RF4Ax3`bk3Fq%HA z`uy^@>1P4r!MT4f3sY^~DmPs|>T>IuiU|aiQ+8MUBsIX_?Z# zc5goF?RG2YSDTKy3DQo0qSI6Y&u|00wv+&W0^niFkgTcMSvn+CjFC6K<>loRj{Do& zGxn0X4bVHuF1xvRQc_Z>g02k5^Ofe)1&U!|VKs=G==hYQJ41=So%|dikGxm8A93>@ z378lu^P14hmg|v@kxRJY>N#ma6sy655-5(*41kjE?>SB+ijM z(VSlT4p40h`XjTb)hZs;Bz9bnOK{QwThF8BI%?}kJz;(9JZUZ&E^vxGf8^cM^} zgD)Gg>Fcdn)?Gi0EtE}M6d=kL> z(}BHmSI2kl`b9)OO13#caVUII@1wR=s@k9AW@$kc@(ou`f&nwQ&P%S7v65LG;yKHbQ%a$E{bxaVSL$RBvz*wIy=$*6wj3W09A zkqFb#74!(lKT3!R=Jf}0`EC4jsT&&9Hh~966cFF*3Ye*5oEKJ-EHp2 zvl}MOj#+JI2UGd4NJx}_#Ajk5ELusJ*Ki4q9AkM4nR+@yTaMxu)truyHr~SEv%n-@ zszDA}`)OHwnbZ82J_R}kD2*ekj9joLMieRoQX+>zzt(~WWj5P^@F?EuC-0=RKsfI1 z(gq1F#>UvpF57;|q00q-QnqnQ>g*Kes~HU+jDFEIYYbhDwr>220Ceew)gLH3-0}TP zq04jZ%kQW{^?YIF!@*ZLt^AWfOX@Le>0+}Nppq?;=6*b1 zT9lg#Ff~V3af6n z%c&Cpt_&!a4jS-SRsRtD>2SDyw+a#Zz8tEf30iF%?^2|EBH774bE#gn(N#5nbgvR6 zcT38<51yMSktR4k>#D=CSS#NTCvYFbB=mIH%<>(7uUt**PsUwy^h}h(q>coGrPR$l z5KKu^L#k^1F2(ik(gXDNsi4t}17rrRw;w2SoOp?N75H|zMFV|L#sC_In^gy=7+;6K z>NnqIO_6QGv%=@5p&Qmi3V{?rWhMi;-}&R1^t^<@Vx(6rthq>ZrYdAexQ}6TC%w(K zR5Td#^%W3K271(-soKnWaR&+7{D#zbbi+z?P!wMBk>-*WL$Ww04J;ZAUH9^HHxJWY zTlgHwpkyU5cv@LwPnA&v#kgngq+{|Lr*pFYedk%#`S{8EieG>|3~^;E$XkF44&5vG z9V@zac%if)xJdP2*#NVAh_R*=vn%3VLtmu6E({nnBWGI4o`KJVjw%8ARVK%x?#NFK zrWu%O@2Q8rz*n+SmV2TBKd=HF)2VJq3PIOX^LOk=#Y~4q1zj!W`WUP z69eUijX)l0oO(Nww+4!Yvnq2>5ObF=%mg7?`%hz&*qu*TKiiMniIhlIix>f@I3V(y zfXu5T6!istOKmmqd-Y?b`@!Q%17l}@Ow;Of!A%!BcJX0S3nOu1|J`<=Hs~7CRd&*i z+_PkAZPxgTKq#uMOeACXIyA?Q41l?GqH4|Ej(s<1 zo&=GW7YHVdx~r^%>0otm<3j2y+5hG4k&bnjUUpJE`2W|X`CoQqtpEF5{(lRW-Bi66 zSh&i^_Rl*Xhp@rkPChJ$YjyvXP5u05^6frjvqtC}L2kwFc&#HBqY?G97ytZg0s9uF z*+b(ozlOAX`*Tvd)^gKLWdK5P{eX(p=m0xT&G1Y)2Z=GYh@08~ImmIC3uUm)@-02D z>Ia)KQaLB@(%9Q(g7j*}$zr1}#oxnp!Kit)zQ9g|TbNT{RZ{6hhf93?4bs&jawA1Q zF~7MKzdeO5I9h6zpc@6fpVDP4#S+4He*#V~H$$vWb)}^2sk^0(^%u&D7^`QJLw`cl z@R4?)J3n)MFe8?!J2HAN`3B5O!h#4NW2Hf;USmgdvx9t)p`Vx~6jFqeIBzp){&FKL z*ut+XFX>I4!H0>UZ`eR7V5Q8KBC@2Hc5v`EP+**c-9&`(ChOlcBeqqk88P#N1q_1o zyNw?wMr1xx9a$H2jZ>=;3MjmNPrCJ+mtzn)e+A(-#*B$yskh|e-!^mD;CM0GVMfgm zi0b#2GTA645t;MF;uLxP>Gdz_vYgcYozR$xIcfT0hPuyI0O!OJULK8AC;*8EwZoSy zbr|e8(ZVK4UrQK%3R3mCf@v{X8dn_(TLN4zs^!L|DKVD4E@DCmX?JM$>DSTptt3{Q zFfUrm7OwL#Y+mQl+1&FD|yQ82C~J(DA3606PM8nZxA=x%&g!DT7xTVYAM=GQRo=Eb-Dw9lQ_VdO$l zziNkkYQ7HI1K<|_ct1-uY4!p~vzM$Bh+cn~ox(Guefq zyv8K|xylj`kCM?+W@3N}GT&x{;s-sV;|T~*WW(ch(Oi3pZxd zhh)z004m`J?_4=%(MvmXf)eh`1%mug3M4y=yOh_v@(4u?k!|t_@Ld$%DxAU!sGYVA z+3pic?oN4OL4@9L+8`!mro1?04#F@TTtrIgC(G||aLJt(1_yE&Vy5~fL(_s}6wi{G0#DHJPzqB!-P8_+ zPmmV(7{PDZSBq(9_4tUYxn?og=WWcDrxeE!sAh{yM@m9k46=19Iua{p!=kY957oF_ zn&pal)$Zjsy`mUHJ-*+1qpuVsNY!~+OnG=d`vpzIR|4>?vvTA2%C6Btf*YZCI=0G} z3w!wvCuyKoBa>4kBIg5t%k`NENB@885pyAZ9Ab{edWqJ z`R+cbVLg|%sEV^Z65`_Xr4ge5Nt=mJlqx*vk3mhtuxReI!KAL{f>(((glMM{&I!iShagUKP1kt7qi!m{m7R{8b*(}_9IV&KWLLWm>FvoC_((otkhLJ&Xerh`OA3g{;a8 zxD8U%Lw?Yf6@4Bw>c~DA>7>FmODLOY%DU1qT&V(2icw&-nM;U_&F0GoXszWxP0)Gw zRb@?5xD63BwF2yx%63J;kcdL4U$+5p} zYs*jlv*Mg0&yS)BUu`areSO^(1|x}!2Zb}Z9YKu3H>$@5iq`-g2=UNNz6fhNLlejH ze^wWr&uM@oa}hQVqtA|q-C45=IZyx$D!%|2kglX4oF&)Nj1ujn9+qXtC=z%#zdZc=f?}GTa#_$+3EZP2eX4TYMUj>VmT?uVK1V?-WI3r- z+mXDQsqj<_HBj7(&TiYukr($F*)yC4i#wnfj&YTJU6%!_f)uI%uhzJn)t6a^B_19`Ep%sqDv)=A}c7hCr&UE|AkrK2@F~nVe1X>d3{+ z@=^0pHG^ph6r_GL(m|QGMA$!hXB;!GW>OkxTm+h0@D&Z|BaFy#%<0IxYf)`|y+fnr zN_B|g1;Z*ZojkKy;9pKo@{MpW8uKp@$EFkiX6xi^cyeQJvjAVRg{k3o8~snrgE(qC zV0)Yj2Tgif!`Q$m&XLdqDU*Ztde96U+qr5_o&+KV&bl>H!w;z1{ht?nfM5ydGwJ{W zng1@)^1r~@Oj@v(wl=K+2CmQ&>{pFL-w)$JDuV-T*z>Ho-r+nT2^;*vYiGZAgneJj za7D>9H&V#|qK9tXpFcK%ko&dr@$8CIN?dd7=-?pJ`4G|z|2%LGWM60v59wc%hw(YF z1C`Btm)$6>SAd!s?m}1K0a0Q0b=7qO_L;$E*+R_ z78{(*`RKG+nNqv>%yzBGfjmh5>sP*%Psn+BK7am*VB*c!dtGu+dQqng59=asJY0>; z>t?B~gE~*rJchzRlL*?RXYP|Vz|4%2vfla}X|&RQp3e0k?i7MA22jx2cNY?|niwx? zBUQT#K|)~8f1?)2x&sug2ej|RXJ?PFRMXX3D6-AXsT!RzvyIDB{G6Lh6ZEJ^4#gM) zR7T>_w;%mMtj>Kgh&KJjy+GFP0HfJz_3wo#cl_MCx<=SmGco~Dz8)25b|J%|i8sUW zBS?fqTwF8|n(sIBmUc|k#Vn8g=1CL$pB%PubaXT#=k1XSd3st&GD5H+`7C{V3Aj8` z1RNwvw=o0?7aEatKBNsz@Dq{0pTI!(;czl097);tXhFKYwK_T;dw4qbe%$@^{+F&b z{=6+rGru2+!`XCU_n$0+5kW5EBqv%m4h7K(mxB#}#yA_O-gvQXCP*TS;FpeF<&1nW z|G@y)c{%Tg=Z3X~L>M$^yXmWs&yAw+c+@x1IU! zelyamA-p|75j(WqL3hR#sRJ1P*XuU<%eOJU?je^V3luJ08C@*OTB>82yVIQ$MU*hZhuvXIeAyKJhxmqo;o?YDt0arQ<(L*gEc ztpC2U1M1=^Y57sh(BD6DE*o8aYj13O5u9CAxaZbCOY>dY)%!xy`#rj~4w6Ch7sWdT zg+*zE(T+eO@pi8^LKQ3TSGm<3RL3Q9SPf05>0JQc;CbKqeJCb3Tyd!mkgt#e&v zZ`+ViY|1Np7iJ>)exhaRDrd-!j}_0@ z#p9rhAR|xm@S4@O>AM&CxCJ9MBqvSkYIGCe=X|klGrNPJ@LOrv*P6E88Km44#)`ew zDBpd!nWa2@a#}={$kqMHf~3C^5OvGVcEszihg`#c!_RJ5WQW4X%8^Scy$pTyFRHc? zp4N-WV}wxSqeL)5TuZv=FAxM3Ur*T&O;yHb+z5VFTIkY}nkb4!1YjV$Jrs<0g`TTG zrP9%AkcHeK#Bowub;gWd;{_q4DMdbq>ldexBB65@6auwB_O)hKtVo zPcORLSgH%u1Y;-{*j%!Bh6j6j74D|>N}@Z5GsG~$KnaARFzDt z?mVgn#t}93BO%guqpa8Gbnej4WULvK-LCiROqI451um1+ZbB4VU*1#p^fc(|<(F2= z7oYq6&Beu(AOe2VG5lFrHSS^A=;w@tfzP#49WHP3G`JZ~0FmlKMD3bB$n*b$Z?-DT z{Xwtw74!v5*Xr9sl{9Is5dPNiF*-b%epZrMoz`nUOC$dBKucuqaPra zOha>EXD6_GUfl#W%EQ8;J7_yD`3U;dxdE6R6#R)YJe(=!_0OYgn@ApFX-qz2=22&C ze!r3yq(3+fg`0W|4B%Q{;dPJc8I^o|+_l3}%jlNXW+=BZ6>nq|l2ZE+@VldEW&;Cb z0+8K)FNbBS8d^Md)mBo%hObXX9>qY1I%M-#%V=#gWa7>q>0sU;ffLTvVP^+t4&Cbk zD3i}dLI0?3DC?w8*;0D!Xo4q5QDiUwo`mx9jm*34=VpC!4!>sWh|8(WX7UV2?6a^^ zFtPO$vB}fM*kY%=(9&3;^Bt?i!H#V1{#mCcDgRqc)xY`$SDiL*``i33$J;NYG9Gi9 zzkFT(ub%xqf6oM>ySNbvWeELYe@_?`F`Q`acKM%C`FrM#fKfF1&G(JG@@DvZp8xcw z#kT*CUAepTW@9+oc|P9v>CgYzc)8Tx1ckWJw&ho|b^K>!foxj|h@z1YSL}Ea#3|H& zuY%(mSeIiNml74<7va+%~Iv+Uf{>c3J@uQ^VT}q5)wdVbt zwls%TmFLi*los1*;*T8CWQI*o?!879&Zoy3+Ou{sY>xB$>bQQ`BVPv!xH|zO9Vz?7 z1j(H3^3RnO-6EMI|2~ZE(&^|gkAy=6L8>tnnH_~vwQa;dL!fZBio@cR1~l)gO~>j0nzK= z;#sMm{fVh9UM?P%oQRR1sVQufM&YKqWp~_U=s13hE_^&JRwU1q=$Vp2;K!lmWW|q) zNUWB=MnW7VD>`elutpXACETz)x$?3|-ErD7r7VP^}r0P8J3sUpe z`bz0jf@b4J3X+||wG^3C;D?gveWQKcC&mws z{HlV+4lM+v=eoL6!#So{c2lTUlV9jW`j#CnpLtFte^GNHR2X00fY^ZdGp z-<#i6+n9~guOm9N75iOyb!6|gG2x39`@=G*C#PgYoKfIF>FryR8$|%r*e4=%n}3rc zesHG~>jY@1;Mb9P&3MFuYpJJH5%Bcg7)#;_-FYkQRpS|gz*dTDf>`9jfgdGRNo3vT z13#JA*^7&D5nQ3vNkaE5!kgjQ^u)GH#EB6{P+13V0^x(04UkvTBlC%fu!V;2_0PUP zkA}@!J{6b}qKCu3d&xTw@gG?IKeE=FFZ1XUlU#SbAzK7_@&gdkZSMf~kKPhG^c1W= zM&bqg!&4{Es@?#U??1RRWnA9*=9YUbV`@pWC5}!r-xN!f1vOibZO2rv%at#5Q)54@ z;h2zHJ^Gsup|3A$N*PJNiAA$a%oK^We<4S()0z=Q8|e1fZvu45r<=#q zuH3p8!C_+@b-9ferXq^doA~%p)>+Wi^cw$M;znFGIkd~0(@VVX?mWlhA`bP>*!CdP z%1PVfQkHlRX@Sz@5iifK*VlnM&5l}#C(ruREBB#IoK7ndcU()q8qu5)_SWwu-(-II zLjq!P2894}S)N#cUhQd{_m3~ToY-X28GFk2iIQ8g5*a1zvZeZ4y5a={^5l_hzyLWJ z8B-hkyqD@*+v@y5g6(zRaBy`}n(t*46clo6YBWUg^vEQ9VN(&KYM~Tg#=2dGzs<9t zjxf_E=ka@%gL?oT6~20HUT2*unQ>BXv0TNYG1wGNrP+-tHaXm&k+X(zY5#u$=^m@K@HPmyWzd zUD^pQ#{s`|>o&fuN;YS@0NB3_snJR_Y#~nRCSB#bED6ZNk^R`{;>k z@BnZ=!Oimf;A6nIuEMAaRd%kgbF?yr(o4yNtEIus^bhB#T+7DupA1tNvP6)yroHNL zMi7u=oU}XB=%da&|Mcwa-_bN~=64BX5|)dGAKg;rL>wY|Kn(=1#gh=4uf`uV48R5hHa_MsYLzI|}KIP;14fJi4Kh6!l?p8g%FZWk;}H3bf>G)!xT zxPIQ+`i_H3M@t(@F;i3vnK%6Y{pY^L2iD}$yil>`2m-0%+j5Jhzq`)WcQfib#aEIf~Sr1&-AZ#kwQ^HDKKzi{KsV=zDmnZ~z+iu_{xx|Ws4THVV6brhcR-^8J#eJPAt|uD zxani4jz!Uf1m^@yFeB{p;+Z*%9NL>m6ToT-QND;GJ)Q-69N*hcdy0R!ZkK2E>)e;3 z`x$mF!AhDR^G)1%;MZiL2vh|-_SuqTVbrP5dMWv!+2ot|u=wOl>~+uU_Ez(6R5z@? zUD&2KCGj0k53XuiT`ss=3D(>LbvfUOw1C+O5s3B1jLpI8u1aZ8={PXMV;|kN?;;Vn z)L@EALzd7yN%^!>E5exxY%i=wkJHGf`5DV6M?Vy1-HeXu=04C3q)Uj>+C6 z6Z8(o(+({q%OYIn<>e(pDaty{=pVS3bAD!3locX&tD1*A=-sgWm%H;Qv0U^vuJr|< zaDdAO%LLM^qz$L?rP%v#?Xw#gLUW!EIJxyVg9x%gEJD3dBg40uht7(k{NGBWVEv>T zuHC-s8(eGYN7PIn#wXXpmkUjhIU1&}-md4=hEUUSbmgS*N^tZJN%73dj^Sab9BrdLLCavfs6P+pFL5ZfJB&r!wc!?=t?H2k|;x_AHw_aKSZLcs;Z{`fMd7tp{Ba-&j9#30pSSCw&|4m z;sf}h2=MBIk2Ay60$G`H(AG3o#{ntUDrpG0{pGQeDTBAvgp z83S=v*2V5{OJwfR(a>&9I+is8P8wt zR2@f20V#;G43oon&j3h_8!W52{5tJ;CAL;HwY~4Hb%JUukE+ql;krQGx&H!pfp6Luw*;>+9J(7|!z@jC5s3~INp*Tt*q zhqAe<=~48a7@T4O9G?Y#9Z3zpDF3!Z7kk^N$54M3YWQWiP3!Rl_n@hG^!-rzZoPEn z!>7}p1Jz|b^qbS?cUI5RkyiQ{KF{tnv`czAgR8+Nt!~doMxiwVg5VtaL7e_*G7O0+ z;n43nzwmo^vtjiUV%XgeKrlB5eSW~XiLAT65_~!lvSKa$0k4ePhefoG)3r0nWyp{ko|v7NJZ{MVg}&nFA0Cks>AwooN7695m8ve8Xzw1M zKyhP5#|cPD+gKSuW&3z&TqDl8mR|0ZadQ-30-68+-KA^aU-Xba?Zu9W&Zy4(Hmy|O^yu0X~9 zga^RGQ^dd2o$n@)7=6;D#dr6qFsm!y{K&r3mBI|bwsDp`u{Ht!^tTX>?&i7L8Pfjr znDg@+`2Sr)|G!5-VB{7-TU%Qgp`!Ln001@N-~R&mV}=CC-2DF(;s5Uq{2wd!Q@J4~ zL5Ki@nV&zUpn%SO>1eJT3m2ET3rI@<{oy#^2{>knrE&mrr@BUEVaNmNEXV&ZMQoyk;dpg$%Y`yPlY@ypxW zQ;ysF`(|eQ9MZ!DAc6HZv@Z~)jUNxUTQlIMB{=3Ey36Ii%4Z>lcZ^gWYAli62gLNP zj^-s8Kt);qK0FZ!dc9YrZ;yw%%`P+%lD<+MY!F{M(Z>3gO)9Caorp?6PL3nt?%vpY z>gVU@12uez83!*ckQliN0wOMY_;yu@<%QpCADlqLky`jEaJt3BTY2BSc|&oPZ%7u> zD7ly+YyCKMYWr@LmYLN^N9Ps&8|A4-8JD_-pe7=3oNS?=FY>=XAW8Z?9TtxUY|-+u zwq_Ph#`EaDa=k2ceb@w3<=K~Zb65!V%E!`OM^?954Rw`NS6d$+5v%<_o9*D^)01K% zWv#P*-MV*|7@C@!SFT%kEX63%Xy%otz_p`(Gv^om^9^=Vdhi-`UqD7)l&s zPhMrg)o}8POT?cHpz||z&np&$RIvwxHrks#*XKE~_vHuOhT6I!)eFXuX6=&`6B)AV zzV!6)Y+WPt!K<$1^`~>s+}W=@xWD(4V#y?VtG%s>g@-x2yPqD{4-eds&CK2>bM*e@ z?xy^>1q&XDY+mM{{x055`O5y*o&9#_o_v}8;gU(xsx?ZvVOD3W!%APMmAeAH!Xh9f zbSZJ};s@c=G*7PuE)w3c92YKbr z?|hq{-wYS7$pxNW;3n+(TG4WCN#Hv^pvSJ3GBr9)cW!W=y3gj@jbuLVw3L(^Pu#<& zEnT*3)#vnC^06v-+Y?I{?*CWEh<{hTl*91hxoSrODREa4$F3HO%A{_8yjroEEqnQR0JRxCWWjD^v zyarqYH+5cv|5ZO5CAUJOeCx)4`zqW|>(&FEcIfb7h7+f6dE9B>*t7U}0Z@{KSJ6nR zXY$jjSLALxM^+juv@tM6%Sbtt|2#Rr_FLpti8c1xpD%3wawhg=e&y#nHh%8qA1Wjt z))n$d+jiC0{bt^NX4i~c!D>ePeskSlD1P}?K>4v>eH+Y~8$cV6Bacm8uzlI)&+>MK zM$BK;Gk7JPU0qcbXK`uuZWSIJN-=Us80;C3 Date: Wed, 3 May 2017 04:07:38 -0500 Subject: [PATCH 027/122] Fixes the Slimecore HUD's neck slot --- icons/mob/screen_slimecore.dmi | Bin 28022 -> 28030 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/screen_slimecore.dmi b/icons/mob/screen_slimecore.dmi index bc33ad6e376e1d811c7745c3acd61a9cd3d136b5..63d67e6fbac8156d15f9ce1e1b0c58cc9b668314 100644 GIT binary patch delta 11296 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 From 8a221b96376abb7916103e02bb71d0fb65b60f96 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 3 May 2017 05:55:15 -0500 Subject: [PATCH 028/122] 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 3f77a1026689c725bd32db9509fd02169a08477e Mon Sep 17 00:00:00 2001 From: TalkingCactus Date: Wed, 3 May 2017 07:16:20 -0400 Subject: [PATCH 029/122] Update ISSUE_TEMPLATE.md makes issues less intimidating by removing unnecessary information. --- .github/ISSUE_TEMPLATE.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index f5fa86a76d..5ea13b991f 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,3 +1,3 @@ -[Note]: # (Please enter the commit hash and active testmerge numbers from the "Show Server Revision" verb if you can. If you believe the issue to be caused by a testmerge, please report it in its relative PR thread. State what the issue is from a "whats wrong" prospective. Issue reports should clearly allow maintainers to understand whats wrong and how to test/reproduce if that is not obvious. Avoid ambiguity. Start your issue report below both of these lines (or remove them)) +[Note]: # (State what the issue is from a "whats wrong" prospective. Issue reports should clearly allow maintainers to understand whats wrong and how to test/reproduce if that is not obvious. Avoid ambiguity. Please enter the commit hash from the "Show Server Revision" verb if you can. Remove these notes before submitting your report.) -[Admins]: # (If you are reporting a bug that occured AFTER you used varedit/admin buttons to alter an object out of normal operating conditions, please verify that you can re-create the bug without the varedit usage/admin buttons before reporting the issue.) +[GameAdmins]: # (If you are reporting a bug that occured AFTER you used varedit/admin buttons to alter an object out of normal operating conditions, please verify that you can re-create the bug without the varedit usage/admin buttons before reporting the issue.) From f5fce8eeee0da35f346683aa5a9e95e1bdaeb3b2 Mon Sep 17 00:00:00 2001 From: TalkingCactus Date: Wed, 3 May 2017 07:22:08 -0400 Subject: [PATCH 030/122] typo fix --- .github/ISSUE_TEMPLATE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 5ea13b991f..fce6ab5acf 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,3 +1,3 @@ [Note]: # (State what the issue is from a "whats wrong" prospective. Issue reports should clearly allow maintainers to understand whats wrong and how to test/reproduce if that is not obvious. Avoid ambiguity. Please enter the commit hash from the "Show Server Revision" verb if you can. Remove these notes before submitting your report.) -[GameAdmins]: # (If you are reporting a bug that occured AFTER you used varedit/admin buttons to alter an object out of normal operating conditions, please verify that you can re-create the bug without the varedit usage/admin buttons before reporting the issue.) +[GameAdmins]: # (If you are reporting a bug that occurred AFTER you used varedit/admin buttons to alter an object out of normal operating conditions, please verify that you can re-create the bug without the varedit usage/admin buttons before reporting the issue.) From 4c92b2c6cec8ad72cb1435cf6c2e62b051df623e Mon Sep 17 00:00:00 2001 From: TalkingCactus Date: Wed, 3 May 2017 07:46:23 -0400 Subject: [PATCH 031/122] another typo caught --- .github/ISSUE_TEMPLATE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index fce6ab5acf..a1c37bc290 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,3 +1,3 @@ -[Note]: # (State what the issue is from a "whats wrong" prospective. Issue reports should clearly allow maintainers to understand whats wrong and how to test/reproduce if that is not obvious. Avoid ambiguity. Please enter the commit hash from the "Show Server Revision" verb if you can. Remove these notes before submitting your report.) +[Note]: # (State what the issue is from a "whats wrong" perspective. Issue reports should clearly allow maintainers to understand whats wrong and how to test/reproduce if that is not obvious. Avoid ambiguity. Please enter the commit hash from the "Show Server Revision" verb if you can. Remove these notes before submitting your report.) [GameAdmins]: # (If you are reporting a bug that occurred AFTER you used varedit/admin buttons to alter an object out of normal operating conditions, please verify that you can re-create the bug without the varedit usage/admin buttons before reporting the issue.) From f333944be010f5c02a2b36a619705c34bc60c0fe Mon Sep 17 00:00:00 2001 From: LetterJay Date: Wed, 3 May 2017 09:02:19 -0500 Subject: [PATCH 032/122] le fix --- code/datums/antagonists/datum_cult.dm | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/code/datums/antagonists/datum_cult.dm b/code/datums/antagonists/datum_cult.dm index 1fe344aedd..30c0aa8450 100644 --- a/code/datums/antagonists/datum_cult.dm +++ b/code/datums/antagonists/datum_cult.dm @@ -5,10 +5,18 @@ 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) owner.current.log_message("Has been converted to the cult of Nar'Sie!", INDIVIDUAL_ATTACK_LOG) From bafafbadf22aaed0a09b5a4f19df046419ffacb8 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 3 May 2017 22:21:55 -0500 Subject: [PATCH 033/122] 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 034/122] 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 035/122] 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 036/122] 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 037/122] 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 038/122] 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 a2dacb5893bffd1605575a201fc41632a3487bfa Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 3 May 2017 22:45:59 -0500 Subject: [PATCH 039/122] Automatic changelog generation for PR #727 [ci skip] --- html/changelogs/AutoChangeLog-pr-727.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-727.yml diff --git a/html/changelogs/AutoChangeLog-pr-727.yml b/html/changelogs/AutoChangeLog-pr-727.yml new file mode 100644 index 0000000000..2eaec0638a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-727.yml @@ -0,0 +1,4 @@ +author: "deathride58" +delete-after: True +changes: + - tweak: "Fixed the slimecore HUD's neck slot sprite." From 4ef516ca2432ef7b19459a6ff7b9694ab4d0700c Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 3 May 2017 22:49:51 -0500 Subject: [PATCH 040/122] Automatic changelog generation for PR #706 [ci skip] --- html/changelogs/AutoChangeLog-pr-706.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-706.yml diff --git a/html/changelogs/AutoChangeLog-pr-706.yml b/html/changelogs/AutoChangeLog-pr-706.yml new file mode 100644 index 0000000000..bef4ff2c24 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-706.yml @@ -0,0 +1,4 @@ +author: "Kor, Goof and Plizzard" +delete-after: True +changes: + - rscadd: "Adds persistent trophy cases. They are not on any map yet." From 0639a543461e040d0c4a88bdf2584ee532770ff0 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 May 2017 06:01:53 -0500 Subject: [PATCH 041/122] 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 042/122] 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 043/122] 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 044/122] 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 da781e0d76f3249d529298965b8d8da099834342 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 May 2017 06:12:26 -0500 Subject: [PATCH 045/122] Adds aesthetic basalt floor tiles --- .../objects/items/stacks/sheets/mineral.dm | 1 + .../objects/items/stacks/tiles/tile_types.dm | 8 ++++++ .../game/turfs/simulated/floor/fancy_floor.dm | 23 ++++++++++++++++-- icons/obj/tiles.dmi | Bin 11236 -> 11741 bytes 4 files changed, 30 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 611ef76eb4..f32fc2cea4 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -29,6 +29,7 @@ Mineral Sheets GLOBAL_LIST_INIT(sandstone_recipes, list ( \ new/datum/stack_recipe("pile of dirt", /obj/machinery/hydroponics/soil, 3, time = 10, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("sandstone door", /obj/structure/mineral_door/sandstone, 10, one_per_turf = 1, on_floor = 1), \ + new/datum/stack_recipe("aesthetic volcanic floor tile", /obj/item/stack/tile/basalt, 2, 2, 4, 20), \ new/datum/stack_recipe("Assistant Statue", /obj/structure/statue/sandstone/assistant, 5, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("Breakdown into sand", /obj/item/weapon/ore/glass, 1, one_per_turf = 0, on_floor = 1), \ /* new/datum/stack_recipe("sandstone wall", ???), \ diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index f2432cee3d..1737699e5b 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -88,6 +88,14 @@ turf_type = /turf/open/floor/wood resistance_flags = FLAMMABLE +//Basalt +/obj/item/stack/tile/basalt + name = "basalt tile" + singular_name = "basalt floor tile" + desc = "Artificially made ashy soil themed on a hostile enviroment." + icon_state = "tile_basalt" + origin_tech = "materials=1" + turf_type = /turf/open/floor/grass/fakebasalt //Carpets /obj/item/stack/tile/carpet diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/simulated/floor/fancy_floor.dm index eaba3d50eb..cce7756892 100644 --- a/code/game/turfs/simulated/floor/fancy_floor.dm +++ b/code/game/turfs/simulated/floor/fancy_floor.dm @@ -1,6 +1,7 @@ /* In this file: * Wood floor * Grass floor + * Fake Basalt * Carpet floor * Fake pits * Fake space @@ -67,6 +68,7 @@ broken_states = list("sand") flags = NONE var/ore_type = /obj/item/weapon/ore/glass + var/turfverb = "uproot" /turf/open/floor/grass/Initialize() ..() @@ -76,7 +78,7 @@ if(istype(C, /obj/item/weapon/shovel) && params) new ore_type(src) new ore_type(src) //Make some sand if you shovel grass - user.visible_message("[user] digs up [src].", "You uproot [src].") + user.visible_message("[user] digs up [src].", "You [src.turfverb] [src].") playsound(src, 'sound/effects/shovel_dig.ogg', 50, 1) make_plating() if(..()) @@ -93,7 +95,6 @@ initial_gas_mix = "o2=22;n2=82;TEMP=180" slowdown = 2 - /turf/open/floor/grass/snow/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/weapon/crowbar))//You need to dig this turf out instead of crowbarring it return @@ -113,6 +114,24 @@ icon_state = "basalt[rand(0, 12)]" set_basalt_light(src) + +/turf/open/floor/grass/fakebasalt //Heart is not a real planeteer power + name = "aesthetic volcanic flooring" + desc = "Safely recreated turf for your hellplanet-scaping" + icon = 'icons/turf/floors.dmi' + icon_state = "basalt" + floor_tile = /obj/item/stack/tile/basalt + ore_type = /obj/item/weapon/ore/glass/basalt + turfverb = "dig up" + slowdown = 0 + +/turf/open/floor/grass/fakebasalt/Initialize() + ..() + if(prob(15)) + icon_state = "basalt[rand(0, 12)]" + set_basalt_light(src) + + /turf/open/floor/carpet name = "carpet" desc = "Soft velvet carpeting. Feels good between your toes." diff --git a/icons/obj/tiles.dmi b/icons/obj/tiles.dmi index d629cfe24d48dd006e6dc2df315be4748182db8c..5a8afeee510bc271ab7b5ba3d4df813951a581d0 100644 GIT binary patch literal 11741 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 literal 11236 zcmb7qcQjm4xbG;5(Tx&>=-mWC)F{z=7epDoMu{3miy9GxsG}1ldKX3)(SjgabkPmN zXc=wZ@2axRgjUXuabk0owtjZuZyP#0PrR!ZMyS)zYqyvO)`{da$M%fbIkj5D#;-~ z9jE^z{Xwym<&Hbj=tZ*Bu^3&IFxkEdwD5}c*Tn5TGal~U_3OiBUxv1Jd2&d8srj?$ zk}d&*`k>u)J>ILxJ;r)@a^_OFNX?z!onk->p9yae1D&$bnJ7Cg#Ls_pVULmroad3S_aqj_tP6DY}URJt6Js&WAB?Qz=Iq z-dydKg^WTDSG#|s^8apl4t=k#utVnGK~_<^NJKhdkNWdeg{X4SN$+D_JYIte!fa;g zS-r0E44|~vS~%lE6QTATDE!-9-u_hD3QW>A1-0S%Son*fU4pMK-&6NZ^l-^=67%L2sUq2wc5uhcEq)w2(2i7 z1AE`Ln9b@`DId(XNr{qzayPRikX6vwyDuDu3=K=ZrAb-bWx=<1cm!lag>9n+%6t6d z!e5k=@AW=3+YACfH=0wUrUkkP@!Fnki-4o-&PEwO1w|MJj%M6&cl~7$erSFKFZ_5} zhF=!oKWfCcMIo&XOC9qr`&JUnH&)nG#*yZYWZ-?i3}T@sD%_I-tb5ThqKGX6)Okyk zU|i{`nd#9kupwKJ=z2Gf_4zHtGIIO>)a4Ot%6t914*l&1MJ=wTz*Q!I|GQk?Ce4 zqauucr^2Sh24Y(mDpZT|;!rT1Bixf(SNryYdfgMh2|Rk2!h~{z#niY&`94|>blI

Ai)4Am5unY=3(`T>s@!vd{fq&zP{ti! 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 I3f2+-1DQMO^8f$< From 36b517d2bae7004e10df5c248a3a72c7171f3e38 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 May 2017 13:32:01 -0500 Subject: [PATCH 046/122] 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 047/122] 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 61563241db0f9a49ab7792aaca4aac9605093ec6 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 May 2017 16:06:46 -0500 Subject: [PATCH 048/122] Tweaks the cost of some of the Application scriptures affected by the previous cost tweak --- .../scripture_applications.dm.rej | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm.rej diff --git a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm.rej b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm.rej new file mode 100644 index 0000000000..06673bf754 --- /dev/null +++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm.rej @@ -0,0 +1,46 @@ +diff a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm (rejected hunks) +@@ -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 = 3, GEIS_CAPACITOR = 2, HIEROPHANT_ANSIBLE = 2) ++ consumed_components = list(BELLIGERENT_EYE = 4, 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 = 3, REPLICANT_ALLOY = 2, HIEROPHANT_ANSIBLE = 2) ++ consumed_components = list(VANGUARD_COGWHEEL = 4, 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 = 2, VANGUARD_COGWHEEL = 2, GEIS_CAPACITOR = 3) ++ consumed_components = list(BELLIGERENT_EYE = 2, VANGUARD_COGWHEEL = 2, GEIS_CAPACITOR = 4) + 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 = 2, VANGUARD_COGWHEEL = 2, REPLICANT_ALLOY = 3) ++ consumed_components = list(BELLIGERENT_EYE = 2, VANGUARD_COGWHEEL = 2, REPLICANT_ALLOY = 4) + 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 = 2, GEIS_CAPACITOR = 2, HIEROPHANT_ANSIBLE = 3) ++ consumed_components = list(VANGUARD_COGWHEEL = 2, GEIS_CAPACITOR = 2, HIEROPHANT_ANSIBLE = 4) + 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." From 827bbb13c225a666df3e85bbcca9ea78c13bdcb4 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 May 2017 17:49:28 -0500 Subject: [PATCH 049/122] Adds an effect to Mending Mantra to show who is chanting it --- .../clock_scriptures/scripture_scripts.dm | 1 + code/game/objects/effects/overlays.dm | 20 +++++++++++++++++- icons/effects/clockwork_effects.dmi | Bin 103207 -> 103452 bytes 3 files changed, 20 insertions(+), 1 deletion(-) 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..6f9627bf09 100644 --- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_scripts.dm +++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_scripts.dm @@ -177,6 +177,7 @@ new /obj/effect/overlay/temp/heal(T, "#1E8CE1") else break + new /obj/effect/overlay/temp/ratvar/mending_mantra(get_turf(invoker)) return TRUE diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm index 3935b86c92..a6517ccdb5 100644 --- a/code/game/objects/effects/overlays.dm +++ b/code/game/objects/effects/overlays.dm @@ -323,11 +323,30 @@ /obj/effect/overlay/temp/ratvar/grille/broken icon_state = "ratvarbrokengrilleglow" +/obj/effect/overlay/temp/ratvar/mending_mantra + layer = ABOVE_MOB_LAYER + duration = 20 + alpha = 200 + icon_state = "mending_mantra" + light_range = 1.5 + light_color = "#1E8CE1" + +/obj/effect/overlay/temp/ratvar/mending_mantra/Initialize(mapload) + . = ..() + transform = matrix()*2 + var/matrix/M = transform + M.Turn(90) + animate(src, alpha = 20, time = duration, easing = BOUNCE_EASING, flags = ANIMATION_PARALLEL) + animate(src, transform = M, time = duration, flags = ANIMATION_PARALLEL) + /obj/effect/overlay/temp/ratvar/volt_hit name = "volt blast" layer = ABOVE_MOB_LAYER duration = 5 icon_state = "volt_hit" + light_range = 1.5 + light_power = 2 + light_color = LIGHT_COLOR_ORANGE var/mob/user var/damage = 20 @@ -336,7 +355,6 @@ damage *= multiplier duration = max(round(damage * 0.2), 1) . = ..() - set_light(1.5, 2, LIGHT_COLOR_ORANGE) /obj/effect/overlay/temp/ratvar/volt_hit/true/Initialize(mapload, caster, multiplier) . = ..() diff --git a/icons/effects/clockwork_effects.dmi b/icons/effects/clockwork_effects.dmi index 8bbf24a7ef1dfaaabbe672650d934d6c3fe2aae7..b2e15da1d0d1cca180d099ce1dd94c708a9b5ae7 100644 GIT binary patch delta 25549 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 E0jR)9)c^nh From 34bf3e41136ceb5a922bfe639fa2a073b9b1829b Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 4 May 2017 17:50:32 -0500 Subject: [PATCH 050/122] 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 051/122] 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 052/122] 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 053/122] 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 054/122] 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 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⋙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 Date: Thu, 4 May 2017 16:07:53 -0700 Subject: [PATCH 055/122] 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 056/122] 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 057/122] 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 058/122] 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 059/122] 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 060/122] 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 061/122] 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 062/122] 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 063/122] 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 064/122] 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 065/122] 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 066/122] 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 067/122] 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 068/122] 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 069/122] 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 070/122] 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 071/122] 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 072/122] 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 073/122] 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 074/122] 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 075/122] 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 076/122] 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 077/122] 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 078/122] 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 079/122] 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 080/122] 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 081/122] 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 082/122] 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 083/122] 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 084/122] 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 085/122] 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 086/122] 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 087/122] 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 088/122] 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 089/122] 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 b72f4102a1463377b75e03cc7fec64b8720dd578 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 6 May 2017 10:16:24 -0500 Subject: [PATCH 090/122] Internal affairs upgrades [READY] --- code/datums/status_effects/status_effect.dm | 2 + code/game/gamemodes/nuclear/pinpointer.dm | 8 +- code/game/gamemodes/objective.dm | 31 ++- code/game/gamemodes/traitor/double_agents.dm | 207 ++++++++++++++++++- 4 files changed, 225 insertions(+), 23 deletions(-) diff --git a/code/datums/status_effects/status_effect.dm b/code/datums/status_effects/status_effect.dm index 51b4f8fc5f..ec725885a9 100644 --- a/code/datums/status_effects/status_effect.dm +++ b/code/datums/status_effects/status_effect.dm @@ -10,6 +10,7 @@ var/status_type = STATUS_EFFECT_UNIQUE //How many of the effect can be on one mob, and what happens when you try to add another var/on_remove_on_mob_delete = FALSE //if we call on_remove() when the mob is deleted var/alert_type = /obj/screen/alert/status_effect //the alert thrown by the status effect, contains name and description + var/obj/screen/alert/status_effect/linked_alert = null //the alert itself, if it exists /datum/status_effect/New(mob/living/new_owner) if(new_owner) @@ -40,6 +41,7 @@ if(alert_type) var/obj/screen/alert/status_effect/A = owner.throw_alert(id, alert_type) A.attached_effect = src //so the alert can reference us, if it needs to + linked_alert = A //so we can reference the alert, if we need to START_PROCESSING(SSfastprocess, src) /datum/status_effect/process() diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm index c66b48a6c8..f3ddb6d4be 100644 --- a/code/game/gamemodes/nuclear/pinpointer.dm +++ b/code/game/gamemodes/nuclear/pinpointer.dm @@ -17,6 +17,7 @@ var/atom/movable/constant_target = null //The thing we're always focused on, if we're in the right mode var/target_x = 0 //The target coordinates if we're tracking those var/target_y = 0 + var/minimum_range = 0 //at what range the pinpointer declares you to be at your destination var/nuke_warning = FALSE // If we've set off a miniature alarm about an armed nuke var/mode = TRACK_NUKE_DISK //What are we looking for? @@ -111,7 +112,7 @@ var/mob/living/closest_operative = get_closest_atom(/mob/living/carbon/human, possible_targets, here) if(closest_operative) target = closest_operative - if(TRACK_ATOM) + if(TRACK_ATOM) if(constant_target) target = constant_target if(TRACK_COORDINATES) @@ -129,7 +130,7 @@ if(here.z != there.z) icon_state = "pinon[nuke_warning ? "alert" : ""]null" return - if(here == there) + if(get_dist_euclidian(here,there)<=minimum_range) icon_state = "pinon[nuke_warning ? "alert" : ""]direct" else setDir(get_dir(here, there)) @@ -171,3 +172,6 @@ desc = "An integrated tracking device, jury-rigged to search for living Syndicate operatives." mode = TRACK_OPERATIVES flags = NODROP + + + diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 6ac0ab8c7c..039b4cc3a4 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -67,7 +67,14 @@ /datum/objective/proc/update_explanation_text() //Default does nothing, override where needed -/datum/objective/proc/give_special_equipment() +/datum/objective/proc/give_special_equipment(special_equipment) + if(owner && owner.current) + if(ishuman(owner.current)) + var/mob/living/carbon/human/H = owner.current + var/list/slots = list ("backpack" = slot_in_backpack) + for(var/eq_path in special_equipment) + var/obj/O = new eq_path + H.equip_in_one_of_slots(O, slots) /datum/objective/assassinate var/target_role_type=0 @@ -94,6 +101,14 @@ else explanation_text = "Free Objective" +/datum/objective/assassinate/internal + var/stolen = 0 //Have we already eliminated this target? + +/datum/objective/assassinate/internal/update_explanation_text() + ..() + if(target && !target.current) + explanation_text = "Assassinate [target.name], who was obliterated" + /datum/objective/mutiny var/target_role_type=0 @@ -468,7 +483,7 @@ GLOBAL_LIST_EMPTY(possible_items) steal_target = targetinfo.targetitem explanation_text = "Steal [targetinfo.name]." dangerrating = targetinfo.difficulty - give_special_equipment() + give_special_equipment(targetinfo.special_equipment) return steal_target else explanation_text = "Free objective" @@ -511,15 +526,6 @@ GLOBAL_LIST_EMPTY(possible_items) return 1 return 0 -/datum/objective/steal/give_special_equipment() - if(owner && owner.current && targetinfo) - if(ishuman(owner.current)) - var/mob/living/carbon/human/H = owner.current - var/list/slots = list ("backpack" = slot_in_backpack) - for(var/eq_path in targetinfo.special_equipment) - var/obj/O = new eq_path - H.equip_in_one_of_slots(O, slots) - GLOBAL_LIST_EMPTY(possible_items_special) /datum/objective/steal/special //ninjas are so special they get their own subtype good for them @@ -695,6 +701,9 @@ GLOBAL_LIST_EMPTY(possible_items_special) explanation_text = "Destroy [target.name], the experimental AI." else explanation_text = "Free Objective" + +/datum/objective/destroy/internal + var/stolen = FALSE //Have we already eliminated this target? /datum/objective/steal_five_of_type explanation_text = "Steal at least five items!" diff --git a/code/game/gamemodes/traitor/double_agents.dm b/code/game/gamemodes/traitor/double_agents.dm index cb6609ebe6..2ee546c7aa 100644 --- a/code/game/gamemodes/traitor/double_agents.dm +++ b/code/game/gamemodes/traitor/double_agents.dm @@ -1,9 +1,13 @@ +#define PINPOINTER_MINIMUM_RANGE 15 +#define PINPOINTER_EXTRA_RANDOM_RANGE 10 +#define PINPOINTER_PING_TIME 40 + /datum/game_mode/traitor/internal_affairs name = "Internal Affairs" config_tag = "internal_affairs" employer = "Internal Affairs" - required_players = 25 - required_enemies = 5 + required_players = 25 + required_enemies = 5 recommended_enemies = 8 reroll_friendly = 0 traitor_name = "Nanotrasen Internal Affairs Agent" @@ -18,15 +22,189 @@ var/list/target_list = list() var/list/late_joining_list = list() + /datum/game_mode/traitor/internal_affairs/post_setup() var/i = 0 for(var/datum/mind/traitor in traitors) i++ if(i + 1 > traitors.len) i = 0 - target_list[traitor] = traitors[i + 1] + target_list[traitor] = traitors[i+1] ..() + +/datum/status_effect/agent_pinpointer + id = "agent_pinpointer" + duration = -1 + tick_interval = PINPOINTER_PING_TIME + alert_type = /obj/screen/alert/status_effect/agent_pinpointer + var/minimum_range = PINPOINTER_MINIMUM_RANGE + var/mob/scan_target = null + +/obj/screen/alert/status_effect/agent_pinpointer + name = "Internal Affairs Integrated Pinpointer" + desc = "Even stealthier than a normal implant." + icon = 'icons/obj/device.dmi' + icon_state = "pinon" + +/datum/status_effect/agent_pinpointer/proc/point_to_target() //If we found what we're looking for, show the distance and direction + if(!scan_target) + linked_alert.icon_state = "pinonnull" + return + var/turf/here = get_turf(owner) + var/turf/there = get_turf(scan_target) + if(here.z != there.z) + linked_alert.icon_state = "pinonnull" + return + if(get_dist_euclidian(here,there)<=minimum_range + rand(0, PINPOINTER_EXTRA_RANDOM_RANGE)) + linked_alert.icon_state = "pinondirect" + else + linked_alert.setDir(get_dir(here, there)) + switch(get_dist(here, there)) + if(1 to 8) + linked_alert.icon_state = "pinonclose" + if(9 to 16) + linked_alert.icon_state = "pinonmedium" + if(16 to INFINITY) + linked_alert.icon_state = "pinonfar" + + +/datum/status_effect/agent_pinpointer/proc/scan_for_target() + scan_target = null + if(owner) + if(owner.mind) + if(owner.mind.objectives) + for(var/datum/objective/objective_ in owner.mind.objectives) + if(!is_internal_objective(objective_)) + continue + var/datum/objective/assassinate/internal/objective = objective_ + var/mob/current = objective.target.current + if(current&¤t.stat!=DEAD) + scan_target = current + break + + +/datum/status_effect/agent_pinpointer/tick() + if(!owner) + qdel(src) + return + scan_for_target() + point_to_target() + +/proc/give_pinpointer(datum/mind/owner) + if(owner && owner.current) + owner.current.apply_status_effect(/datum/status_effect/agent_pinpointer) + + +/datum/internal_agent_state + var/traitored = FALSE + var/datum/mind/owner = null + var/list/datum/mind/targets_stolen = list() + +/proc/is_internal_objective(datum/objective/O) + return (istype(O, /datum/objective/assassinate/internal)||istype(O, /datum/objective/destroy/internal)) + +/proc/replace_escape_objective(datum/mind/owner) + if(!owner||!owner.objectives) + return + for (var/objective_ in owner.objectives) + if(!(istype(objective_, /datum/objective/escape)||istype(objective_,/datum/objective/survive))) + continue + owner.objectives -= objective_ + var/datum/objective/martyr/martyr_objective = new + martyr_objective.owner = owner + owner.objectives += martyr_objective + +/proc/reinstate_escape_objective(datum/mind/owner) + if(!owner||!owner.objectives) + return + for (var/objective_ in owner.objectives) + if(!istype(objective_, /datum/objective/martyr)) + continue + owner.objectives -= objective_ + if(issilicon(owner)) + var/datum/objective/survive/survive_objective = new + survive_objective.owner = owner + owner.objectives += survive_objective + else + var/datum/objective/escape/escape_objective = new + escape_objective.owner = owner + owner.objectives += escape_objective + +/datum/internal_agent_state/proc/steal_targets(datum/mind/victim) + if(!owner.current||owner.current.stat==DEAD) //Should already be guaranteed if this is only called from steal_targets_timer_func, but better to be safe code than sorry code + return + var/already_traitored = traitored + to_chat(owner.current, " Target eliminated: [victim.name]") + for(var/objective_ in victim.objectives) + if(istype(objective_, /datum/objective/assassinate/internal)) + var/datum/objective/assassinate/internal/objective = objective_ + if(objective.target==owner) + traitored = TRUE + else if(targets_stolen.Find(objective.target) == 0) + var/datum/objective/assassinate/internal/new_objective = new + new_objective.owner = owner + new_objective.target = objective.target + new_objective.update_explanation_text() + owner.objectives += new_objective + targets_stolen += objective.target + var/status_text = objective.check_completion() ? "neutralised" : "active" + to_chat(owner.current, " New target added to database: [objective.target.name] ([status_text]) ") + else if(istype(objective_, /datum/objective/destroy/internal)) + var/datum/objective/destroy/internal/objective = objective_ + var/datum/objective/destroy/internal/new_objective = new + if(objective.target==owner) + traitored = TRUE + else if(targets_stolen.Find(objective.target) == 0) + new_objective.owner = owner + new_objective.target = objective.target + new_objective.update_explanation_text() + owner.objectives += new_objective + targets_stolen += objective.target + var/status_text = objective.check_completion() ? "neutralised" : "active" + to_chat(owner.current, " New target added to database: [objective.target.name] ([status_text]) ") + if(traitored&&!already_traitored) + for(var/objective_ in owner.objectives) + if(!is_internal_objective(objective_)) + continue + var/datum/objective/assassinate/internal/objective = objective_ + if(!objective.check_completion()) + traitored = FALSE + return + to_chat(owner.current," All the other agents are dead, and you're the last loose end. Stage a Syndicate terrorist attack to cover up for today's events. You no longer have any limits on collateral damage.") + replace_escape_objective(owner) + + + +/datum/internal_agent_state/proc/steal_targets_timer_func() + if(owner&&owner.current&&owner.current.stat!=DEAD) + for(var/objective_ in owner.objectives) + if(!is_internal_objective(objective_)) + continue + var/datum/objective/assassinate/internal/objective = objective_ + if(!objective.target) + continue + if(objective.check_completion()) + if(objective.stolen) + continue + else + steal_targets(objective.target) + objective.stolen = TRUE + else + if(objective.stolen) + var/fail_msg = "Your sensors tell you that [objective.target.current.real_name], one of the targets you were meant to have killed, pulled one over on you, and is still alive - do the job properly this time! " + if(traitored) + fail_msg += " The truth could still slip out! Cease any terrorist actions as soon as possible, unneeded property damage or loss of employee life will lead to your contract being terminated." + reinstate_escape_objective(owner) + traitored = FALSE + to_chat(owner.current, fail_msg) + objective.stolen = FALSE + add_steal_targets_timer(owner) + +/datum/internal_agent_state/proc/add_steal_targets_timer() + var/datum/callback/C = new(src, .steal_targets_timer_func) + addtimer(C, 30) + /datum/game_mode/traitor/internal_affairs/forge_traitor_objectives(datum/mind/traitor) if(target_list.len && target_list[traitor]) // Is a double agent @@ -34,13 +212,13 @@ // Assassinate var/datum/mind/target_mind = target_list[traitor] if(issilicon(target_mind.current)) - var/datum/objective/destroy/destroy_objective = new + var/datum/objective/destroy/internal/destroy_objective = new destroy_objective.owner = traitor destroy_objective.target = target_mind destroy_objective.update_explanation_text() traitor.objectives += destroy_objective else - var/datum/objective/assassinate/kill_objective = new + var/datum/objective/assassinate/internal/kill_objective = new kill_objective.owner = traitor kill_objective.target = target_mind kill_objective.update_explanation_text() @@ -55,6 +233,11 @@ var/datum/objective/escape/escape_objective = new escape_objective.owner = traitor traitor.objectives += escape_objective + var/datum/internal_agent_state/state = new + state.owner=traitor + state.add_steal_targets_timer() + if(!issilicon(traitor.current)) + give_pinpointer(traitor) else ..() // Give them standard objectives. @@ -106,14 +289,18 @@ /datum/game_mode/traitor/internal_affairs/greet_traitor(datum/mind/traitor) var/crime = pick("distribution of contraband" , "unauthorized erotic action on duty", "embezzlement", "piloting under the influence", "dereliction of duty", "syndicate collaboration", "mutiny", "multiple homicides", "corporate espionage", "recieving bribes", "malpractice", "worship of prohbited life forms", "possession of profane texts", "murder", "arson", "insulting their manager", "grand theft", "conspiracy", "attempting to unionize", "vandalism", "gross incompetence") - to_chat(traitor.current, "You are the [traitor_name].") - to_chat(traitor.current, "Your target is suspected of [crime], and you have been tasked with eliminating them by any means necessary to avoid a costly and embarrassing public trial.") + to_chat(traitor.current, "You are the [traitor_name].") + to_chat(traitor.current, "Your target is suspected of [crime], and you have been tasked with eliminating them by any means necessary to avoid a costly and embarrassing public trial.") to_chat(traitor.current, "While you have a license to kill, unneeded property damage or loss of employee life will lead to your contract being terminated.") - to_chat(traitor.current, "For the sake of plausible deniability, you have been equipped with an array of captured Syndicate weaponry available via uplink.") - to_chat(traitor.current, "Finally, watch your back. Your target has friends in high places, and intel suggests someone may have taken out a contract of their own to protect them.") + to_chat(traitor.current, "For the sake of plausible deniability, you have been equipped with an array of captured Syndicate weaponry available via uplink.") + to_chat(traitor.current, "Finally, watch your back. Your target has friends in high places, and intel suggests someone may have taken out a contract of their own to protect them.") traitor.announce_objectives() /datum/game_mode/traitor/internal_affairs/give_codewords(mob/living/traitor_mob) - return \ No newline at end of file + return + +#undef PINPOINTER_EXTRA_RANDOM_RANGE +#undef PINPOINTER_MINIMUM_RANGE +#undef PINPOINTER_PING_TIME From 8a3b280ede7a62e4c841b53931df184c16cdedb8 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 6 May 2017 10:42:51 -0500 Subject: [PATCH 091/122] 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 092/122] 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 093/122] 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 094/122] 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 095/122] 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 096/122] 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 097/122] 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 098/122] 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 099/122] 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 100/122] 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 101/122] 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 102/122] 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 103/122] 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 104/122] 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 105/122] 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 106/122] 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 107/122] 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 108/122] 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 109/122] 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 110/122] 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 111/122] 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 112/122] 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 113/122] 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 114/122] 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 115/122] 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 116/122] 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 117/122] 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 118/122] 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." From c1a9bb586489801ab7e895eae67ffc8e12af5865 Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Sat, 6 May 2017 22:08:00 -0700 Subject: [PATCH 119/122] Update scripture_applications.dm --- .../clock_scriptures/scripture_applications.dm | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) 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..c1b5c0cfff 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 = 4, 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 = 4, 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 = 4) 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 = 4) 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 = 4) 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!" From 2f2c8509376af49d4d1d73fe04161f4f597a7f68 Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Sat, 6 May 2017 22:09:58 -0700 Subject: [PATCH 120/122] Delete scripture_applications.dm.rej --- .../scripture_applications.dm.rej | 46 ------------------- 1 file changed, 46 deletions(-) delete mode 100644 code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm.rej diff --git a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm.rej b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm.rej deleted file mode 100644 index 06673bf754..0000000000 --- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm.rej +++ /dev/null @@ -1,46 +0,0 @@ -diff a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm (rejected hunks) -@@ -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 = 3, GEIS_CAPACITOR = 2, HIEROPHANT_ANSIBLE = 2) -+ consumed_components = list(BELLIGERENT_EYE = 4, 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 = 3, REPLICANT_ALLOY = 2, HIEROPHANT_ANSIBLE = 2) -+ consumed_components = list(VANGUARD_COGWHEEL = 4, 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 = 2, VANGUARD_COGWHEEL = 2, GEIS_CAPACITOR = 3) -+ consumed_components = list(BELLIGERENT_EYE = 2, VANGUARD_COGWHEEL = 2, GEIS_CAPACITOR = 4) - 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 = 2, VANGUARD_COGWHEEL = 2, REPLICANT_ALLOY = 3) -+ consumed_components = list(BELLIGERENT_EYE = 2, VANGUARD_COGWHEEL = 2, REPLICANT_ALLOY = 4) - 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 = 2, GEIS_CAPACITOR = 2, HIEROPHANT_ANSIBLE = 3) -+ consumed_components = list(VANGUARD_COGWHEEL = 2, GEIS_CAPACITOR = 2, HIEROPHANT_ANSIBLE = 4) - 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." From ab8dfe3b6d2515bd01338bfccee40b5c3d05339e Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 7 May 2017 08:24:00 -0500 Subject: [PATCH 121/122] Automatic changelog generation for PR #801 [ci skip] --- html/changelogs/AutoChangeLog-pr-801.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-801.yml diff --git a/html/changelogs/AutoChangeLog-pr-801.yml b/html/changelogs/AutoChangeLog-pr-801.yml new file mode 100644 index 0000000000..756cf33927 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-801.yml @@ -0,0 +1,6 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - rscadd: "Internal Affairs Agents now obtain the kill objectives of their targets when they die." + - rscadd: "Internal Affairs Agents now have an integrated nanotrasen pinpointer that tracks their target at distances further than ten squares." + - rscadd: "Internal Affairs Agents will now lose any restrictions on collateral damage and gain a \"Die a glorious death\" objective upon becoming the last man standing, and revert if any of their targets are cloned." From 086ea817851845fc7cf7dad4ad21af0284cc168f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 7 May 2017 08:24:51 -0500 Subject: [PATCH 122/122] Automatic changelog generation for PR #748 [ci skip] --- html/changelogs/AutoChangeLog-pr-748.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-748.yml diff --git a/html/changelogs/AutoChangeLog-pr-748.yml b/html/changelogs/AutoChangeLog-pr-748.yml new file mode 100644 index 0000000000..7ad62adec8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-748.yml @@ -0,0 +1,5 @@ +author: "Moonlighting Mac says" +delete-after: True +changes: + - rscadd: "Courtesy of the art & crafts division, imitation basalt tiles themed on the rough volcanic terrain of lavaland are now available to be made out of sandstone." + - experiment: "The manufacturer even managed to replicate the way that it lights up with volcanic energy, it is the perfect accompaniment to other fake (or real) lava-land tiles or a independent piece."