From 2cd045b8feb3391535dc6f972ad7b77360dca675 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Tue, 19 Jun 2018 10:10:30 -0400 Subject: [PATCH 01/54] [s] Fixes direct sql datum call exploit. --- code/controllers/subsystem/dbcore.dm | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/code/controllers/subsystem/dbcore.dm b/code/controllers/subsystem/dbcore.dm index 0e1f1fb8fd..4692826a9c 100644 --- a/code/controllers/subsystem/dbcore.dm +++ b/code/controllers/subsystem/dbcore.dm @@ -237,6 +237,22 @@ Delayed insert mode was removed in mysql 7 and only works with MyISAM type table item = list() _db_query = _dm_db_new_query() +<<<<<<< HEAD +======= +/datum/DBQuery/Destroy() + Close() + SSdbcore.active_queries -= src + return ..() + +/datum/DBQuery/CanProcCall(proc_name) + //fuck off kevinz + return FALSE + +/datum/DBQuery/proc/Activity(activity) + last_activity = activity + last_activity_time = world.time + +>>>>>>> 1a22d45... [s] Fixes stack overflow (#38592) /datum/DBQuery/proc/warn_execute() . = Execute() if(!.) From 8115f0acdadd87991f5d4d472ec835c01373c4f5 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Tue, 19 Jun 2018 10:19:10 -0400 Subject: [PATCH 02/54] Merge pull request #38576 from AnturK/runtimeL Fixes alternative method of removing legcuffs. --- code/modules/surgery/bodyparts/dismemberment.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm index aa0b714cc8..c806a68867 100644 --- a/code/modules/surgery/bodyparts/dismemberment.dm +++ b/code/modules/surgery/bodyparts/dismemberment.dm @@ -199,7 +199,7 @@ /obj/item/bodypart/r_leg/drop_limb(special) if(owner && !special) if(owner.legcuffed) - owner.legcuffed.forceMove(drop_location()) + owner.legcuffed.forceMove(owner.drop_location()) //At this point bodypart is still in nullspace owner.legcuffed.dropped(owner) owner.legcuffed = null owner.update_inv_legcuffed() @@ -210,7 +210,7 @@ /obj/item/bodypart/l_leg/drop_limb(special) //copypasta if(owner && !special) if(owner.legcuffed) - owner.legcuffed.forceMove(drop_location()) + owner.legcuffed.forceMove(owner.drop_location()) owner.legcuffed.dropped(owner) owner.legcuffed = null owner.update_inv_legcuffed() From 02744c59a590af1e9e68e6bfe1d8d5c4b025e8da Mon Sep 17 00:00:00 2001 From: JStheguy Date: Tue, 19 Jun 2018 09:22:59 -0500 Subject: [PATCH 04/54] [READY] Helps data disks stop being unemployed (#38319) * data cards actually have a function now * Adds data cards to the IC printer for real rea * more cards, less shitty code * how the fuck did I miss that adds a missing ..() * wait wrong use of ..() fuck --- .../subsystem/processing/circuit.dm | 5 +- code/game/objects/items/cards_ids.dm | 49 ++++++++++++------ .../integrated_electronics/subtypes/access.dm | 6 ++- .../integrated_electronics/subtypes/input.dm | 40 ++++++++++++++ icons/obj/card.dmi | Bin 4301 -> 5371 bytes 5 files changed, 83 insertions(+), 17 deletions(-) diff --git a/code/controllers/subsystem/processing/circuit.dm b/code/controllers/subsystem/processing/circuit.dm index db1bf1ff5f..dad71a005a 100644 --- a/code/controllers/subsystem/processing/circuit.dm +++ b/code/controllers/subsystem/processing/circuit.dm @@ -78,5 +78,8 @@ PROCESSING_SUBSYSTEM_DEF(circuit) /obj/item/integrated_electronics/wirer, /obj/item/integrated_electronics/debugger, /obj/item/integrated_electronics/analyzer, - /obj/item/integrated_electronics/detailer + /obj/item/integrated_electronics/detailer, + /obj/item/card/data, + /obj/item/card/data/full_color, + /obj/item/card/data/disk ) diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index 4c96bf3b84..2d30a015e2 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -9,7 +9,7 @@ /* - * DATA CARDS - Used for the teleporter + * DATA CARDS - Used for the IC data card reader */ /obj/item/card name = "card" @@ -24,30 +24,49 @@ return BRUTELOSS /obj/item/card/data - name = "data disk" - desc = "A disk of data." - icon_state = "data" + name = "data card" + desc = "A plastic magstripe card for simple and speedy data storage and transfer. This one has a stripe running down the middle." + icon_state = "data_1" + obj_flags = UNIQUE_RENAME var/function = "storage" var/data = "null" var/special = null item_state = "card-id" lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi' + var/detail_color = COLOR_ASSEMBLY_ORANGE -/obj/item/card/data/verb/label(t as text) - set name = "Label Disk" - set category = "Object" - set src in usr +/obj/item/card/data/Initialize() + .=..() + update_icon() - if(usr.stat || !usr.canmove || usr.restrained()) +/obj/item/card/data/update_icon() + cut_overlays() + if(detail_color == COLOR_FLOORTILE_GRAY) return + var/mutable_appearance/detail_overlay = mutable_appearance('icons/obj/card.dmi', "[icon_state]-color") + detail_overlay.color = detail_color + add_overlay(detail_overlay) - if (t) - src.name = "data disk- '[t]'" - else - src.name = "data disk" - src.add_fingerprint(usr) - return +/obj/item/card/data/attackby(obj/item/I, mob/living/user) + if(istype(I, /obj/item/integrated_electronics/detailer)) + var/obj/item/integrated_electronics/detailer/D = I + detail_color = D.detail_color + update_icon() + return ..() + +/obj/item/proc/GetCard() + +/obj/item/card/data/GetCard() + return src + +/obj/item/card/data/full_color + desc = "A plastic magstripe card for simple and speedy data storage and transfer. This one has the entire card colored." + icon_state = "data_2" + +/obj/item/card/data/disk + desc = "A plastic magstripe card for simple and speedy data storage and transfer. This one inexplicibly looks like a floppy disk." + icon_state = "data_3" /* * ID CARDS diff --git a/code/modules/integrated_electronics/subtypes/access.dm b/code/modules/integrated_electronics/subtypes/access.dm index bf710be0e2..9012cd1089 100644 --- a/code/modules/integrated_electronics/subtypes/access.dm +++ b/code/modules/integrated_electronics/subtypes/access.dm @@ -1,5 +1,5 @@ /obj/item/integrated_circuit/input/card_reader - name = "card reader" + name = "ID card reader" //To differentiate it from the data card reader desc = "A circuit that can read the registred name, assignment, and PassKey string from an ID card." icon_state = "card_reader" @@ -14,6 +14,10 @@ "on read" = IC_PINTYPE_PULSE_OUT ) +/obj/item/integrated_circuit/input/card_reader/old + name = "card reader" + spawn_flags = 0 + /obj/item/integrated_circuit/input/card_reader/attackby_react(obj/item/I, mob/living/user, intent) var/obj/item/card/id/card = I.GetID() var/list/access = I.GetAccess() diff --git a/code/modules/integrated_electronics/subtypes/input.dm b/code/modules/integrated_electronics/subtypes/input.dm index b780762cd4..02500e5ed6 100644 --- a/code/modules/integrated_electronics/subtypes/input.dm +++ b/code/modules/integrated_electronics/subtypes/input.dm @@ -1104,3 +1104,43 @@ else activate_pin(3) +/obj/item/integrated_circuit/input/data_card_reader + name = "data card reader" + desc = "A circuit that can read from and write to data cards." + extended_desc = "Setting the \"write mode\" boolean to true will cause any data cards that are used on the assembly to replace\ + their existing function and data strings with the given strings, if it is set to false then using a data card on the assembly will cause\ + the function and data strings stored on the card to be written to the output pins." + icon_state = "card_reader" + complexity = 4 + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + inputs = list( + "function" = IC_PINTYPE_STRING, + "data to store" = IC_PINTYPE_STRING, + "write mode" = IC_PINTYPE_BOOLEAN + ) + outputs = list( + "function" = IC_PINTYPE_STRING, + "stored data" = IC_PINTYPE_STRING + ) + activators = list( + "on write" = IC_PINTYPE_PULSE_OUT, + "on read" = IC_PINTYPE_PULSE_OUT + ) + +/obj/item/integrated_circuit/input/data_card_reader/attackby_react(obj/item/I, mob/living/user, intent) + var/obj/item/card/data/card = I.GetCard() + var/write_mode = get_pin_data(IC_INPUT, 3) + if(card) + if(write_mode == TRUE) + card.function = get_pin_data(IC_INPUT, 1) + card.data = get_pin_data(IC_INPUT, 2) + push_data() + activate_pin(1) + else + set_pin_data(IC_OUTPUT, 1, card.function) + set_pin_data(IC_OUTPUT, 2, card.data) + push_data() + activate_pin(2) + else + return FALSE + return TRUE diff --git a/icons/obj/card.dmi b/icons/obj/card.dmi index e6778c51af5ee819852370af8d27098c02862a26..507801844cc5e861e73e4a44a8eed74cae88c019 100644 GIT binary patch literal 5371 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 kb(!+J|Gl>8IAS|JY5rh*tN;K2 literal 4301 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 From 1ee84bb7d291a5ba4a7a2b1a6c630cef332f43e2 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Tue, 19 Jun 2018 10:49:27 -0400 Subject: [PATCH 06/54] Merge pull request #38580 from Hyacinth-OR/pinkscarf Adds a pink scarf --- code/modules/clothing/neck/_neck.dm | 9 +++++++-- code/modules/vending/clothesmate.dm | 5 +++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm index cb797c34d4..8245148096 100644 --- a/code/modules/clothing/neck/_neck.dm +++ b/code/modules/clothing/neck/_neck.dm @@ -100,6 +100,11 @@ icon_state = "scarf" color = "#4A4A4B" //Grey but it looks black +/obj/item/clothing/neck/scarf/pink + name = "pink scarf" + icon_state = "scarf" + color = "#F699CD" //Pink + /obj/item/clothing/neck/scarf/red name = "red scarf" icon_state = "scarf" @@ -118,7 +123,7 @@ /obj/item/clothing/neck/scarf/purple name = "purple scarf" icon_state = "scarf" - color = "#9557C5" //purple + color = "#9557C5" //Purple /obj/item/clothing/neck/scarf/yellow name = "yellow scarf" @@ -128,7 +133,7 @@ /obj/item/clothing/neck/scarf/orange name = "orange scarf" icon_state = "scarf" - color = "#C67A4B" //orange + color = "#C67A4B" //Orange /obj/item/clothing/neck/scarf/cyan name = "cyan scarf" diff --git a/code/modules/vending/clothesmate.dm b/code/modules/vending/clothesmate.dm index f3ab636fb0..ad5b38575c 100644 --- a/code/modules/vending/clothesmate.dm +++ b/code/modules/vending/clothesmate.dm @@ -35,6 +35,7 @@ /obj/item/clothing/neck/tie/red = 1, /obj/item/clothing/neck/tie/black = 1, /obj/item/clothing/neck/tie/horrible = 1, + /obj/item/clothing/neck/scarf/pink = 1, /obj/item/clothing/neck/scarf/red = 1, /obj/item/clothing/neck/scarf/green = 1, /obj/item/clothing/neck/scarf/darkblue = 1, @@ -118,5 +119,5 @@ /obj/item/vending_refill/clothing machine_name = "ClothesMate" icon_state = "refill_clothes" - charges = list(37, 4, 4)// of 111 standard, 12 contraband, 10 premium(?) - init_charges = list(37, 4, 4) + charges = list(38, 4, 4)// of 112 standard, 12 contraband, 10 premium(?) + init_charges = list(38, 4, 4) From 75335cb30b04d597ee7bd90893fab9f2ef9efbbc Mon Sep 17 00:00:00 2001 From: Irafas Date: Tue, 19 Jun 2018 15:49:04 +0100 Subject: [PATCH 08/54] PDA can be ctrl-clicked to remove the item in its pen slot (#38577) * Makes pens ez to remove from pda Players can now ctrl click on the PDA to remove the pen without having to remove the ID first. * added instructions when examined. Like how it tells the user they can use alt-click to remove contents, it now says they can use ctrl-click to remove items from the pen slot. * PDA can now be dragged without dropping the pen. When ctrl-clicked it now checks to see if the PDA is on a turf and will only output the pen if its not. * quick change to examine text. * comma * Improved the examine --- code/game/objects/items/devices/PDA/PDA.dm | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 5ab8000402..6731caffd7 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -92,8 +92,12 @@ GLOBAL_LIST_EMPTY(PDAs) ..() if(!id && !inserted_item) return - else - to_chat(user, "Alt-click to remove contents.") + + if(id) + to_chat(user, "Alt-click to remove the id.") + + if(inserted_item && (!isturf(loc))) + to_chat(user, "Ctrl-click to remove [inserted_item].") /obj/item/pda/Initialize() . = ..() @@ -712,6 +716,15 @@ GLOBAL_LIST_EMPTY(PDAs) else remove_pen() +/obj/item/pda/CtrlClick() + ..() + + if(issilicon(usr)) + return + + if(usr.canUseTopic(src) && !isturf(loc)) + remove_pen() + /obj/item/pda/verb/verb_remove_id() set category = "Object" set name = "Eject ID" From fcfdf968d19d205049e6e9fb098703727c3d99a4 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Wed, 20 Jun 2018 03:18:23 -0400 Subject: [PATCH 10/54] Adds /datum/DBQuery/proc/SetQuery (#38584) * Adds /datum/DBQuery/proc/SetQuery * Needful newness --- code/controllers/subsystem/dbcore.dm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/code/controllers/subsystem/dbcore.dm b/code/controllers/subsystem/dbcore.dm index 0e1f1fb8fd..50eeaf087c 100644 --- a/code/controllers/subsystem/dbcore.dm +++ b/code/controllers/subsystem/dbcore.dm @@ -242,6 +242,11 @@ Delayed insert mode was removed in mysql 7 and only works with MyISAM type table if(!.) to_chat(usr, "A SQL error occurred during this operation, check the server logs.") +/datum/DBQuery/proc/SetQuery(new_sql) + Activity("SetQuery") + Close() + sql = new_sql + /datum/DBQuery/proc/Execute(sql_query = sql, cursor_handler = default_cursor, log_error = TRUE) var/start_time var/timeout = CONFIG_GET(number/query_debug_log_timeout) From 2fefc185d34c2069215bcab7277e8bbb61ac8bf6 Mon Sep 17 00:00:00 2001 From: Grandmother of 50 <11748095+ExcessiveUseOfCobblestone@users.noreply.github.com> Date: Wed, 20 Jun 2018 03:43:10 -0400 Subject: [PATCH 12/54] Equalizes Roundstart Mining Options (Removes some Advanced Scanners and Explorer Webbings) (#38153) --- code/modules/mining/machine_vending.dm | 4 ---- 1 file changed, 4 deletions(-) diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm index e13a8e5c39..03a93a6a52 100644 --- a/code/modules/mining/machine_vending.dm +++ b/code/modules/mining/machine_vending.dm @@ -171,8 +171,6 @@ if("Survival Capsule and Explorer's Webbing") new /obj/item/storage/belt/mining/vendor(drop_location) if("Resonator Kit") - new /obj/item/storage/belt/mining/alt(drop_location) - new /obj/item/t_scanner/adv_mining_scanner(drop_location) new /obj/item/extinguisher/mini(drop_location) new /obj/item/resonator(drop_location) if("Minebot Kit") @@ -185,8 +183,6 @@ new /obj/item/fulton_core(drop_location) new /obj/item/stack/marker_beacon/thirty(drop_location) if("Crusher Kit") - new /obj/item/storage/belt/mining/alt(drop_location) - new /obj/item/t_scanner/adv_mining_scanner(drop_location) new /obj/item/extinguisher/mini(drop_location) new /obj/item/twohanded/required/kinetic_crusher(drop_location) if("Mining Conscription Kit") From 05995f577407cce9fa9f9116595a43185ebae35b Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Wed, 20 Jun 2018 10:24:04 -0400 Subject: [PATCH 14/54] Merge pull request #38605 from vuonojenmustaturska/tinylight Micro-optimization to update_corners() --- code/modules/lighting/lighting_source.dm | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/code/modules/lighting/lighting_source.dm b/code/modules/lighting/lighting_source.dm index a6c28b4146..59ce11baeb 100644 --- a/code/modules/lighting/lighting_source.dm +++ b/code/modules/lighting/lighting_source.dm @@ -56,10 +56,10 @@ if (top_atom) LAZYREMOVE(top_atom.light_sources, src) - + if (needs_update) GLOB.lighting_update_lights -= src - + . = ..() // Yes this doesn't align correctly on anything other than 4 width tabs. @@ -116,7 +116,6 @@ . = LUM_FALLOFF(C, pixel_turf); \ . *= light_power; \ var/OLD = effect_str[C]; \ - \ effect_str[C] = .; \ \ C.update_lumcount \ @@ -126,7 +125,6 @@ (. * lum_b) - (OLD * applied_lum_b) \ ); - #define REMOVE_CORNER(C) \ . = -effect_str[C]; \ C.update_lumcount \ @@ -167,8 +165,9 @@ /datum/light_source/proc/update_corners() var/update = FALSE + var/atom/source_atom = src.source_atom - if (!source_atom || QDELETED(source_atom)) + if (QDELETED(source_atom)) qdel(src) return From aee94ac728e0bd06df8e6df60192e748771310df Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Wed, 20 Jun 2018 20:05:32 -0400 Subject: [PATCH 16/54] Trims down apt dependencies (#38619) * :thinking: * More --- .travis.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 0eccf6708e..56fa54f58d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -27,7 +27,6 @@ matrix: addons: apt: packages: - - libc6-i386 - libstdc++6:i386 cache: directories: @@ -39,7 +38,6 @@ matrix: mariadb: '10.2' apt: packages: - - libc6-i386 - libstdc++6:i386 - libssl-dev:i386 - gcc-multilib From 5e156e7a07090784bd4441f018f06f81b6d6df3b Mon Sep 17 00:00:00 2001 From: AnturK Date: Thu, 21 Jun 2018 02:38:51 +0200 Subject: [PATCH 18/54] Fixes AI's being unable to call shuttle using comm console. (#38534) * Fixes AI's being unable to call shuttle using comm console. * Lets get rid of double negatives * viewvers for --- .../game/machinery/computer/communications.dm | 5 ++-- code/game/objects/objs.dm | 23 +++++++++++-------- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 445ed389b7..d1e3de1248 100755 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -45,8 +45,9 @@ /obj/machinery/computer/communications/process() if(..()) - if(state != STATE_STATUSDISPLAY && state != STATE_CALLSHUTTLE && state != STATE_PURCHASE && state != STATE_VIEWMESSAGE) - updateDialog() + var/ai_autoupdate = aistate != STATE_STATUSDISPLAY && aistate != STATE_CALLSHUTTLE && aistate != STATE_PURCHASE && aistate != STATE_VIEWMESSAGE + var/machine_user_autoupdate = state != STATE_STATUSDISPLAY && state != STATE_CALLSHUTTLE && state != STATE_PURCHASE && state != STATE_VIEWMESSAGE + updateDialog(machine_user_autoupdate,ai_autoupdate) /obj/machinery/computer/communications/Topic(href, href_list) if(..()) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 02e1cc9bd0..664cdbf383 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -138,19 +138,22 @@ else obj_flags &= ~IN_USE -/obj/proc/updateDialog() +/obj/proc/updateDialog(update_viewers = TRUE,update_ais = TRUE) // Check that people are actually using the machine. If not, don't update anymore. if(obj_flags & IN_USE) - var/list/nearby = viewers(1, src) - var/is_in_use = 0 - for(var/mob/M in nearby) - if ((M.client && M.machine == src)) - is_in_use = 1 - src.interact(M) - var/ai_in_use = AutoUpdateAI(src) + var/is_in_use = FALSE + if(update_viewers) + for(var/mob/M in viewers(1, src)) + if ((M.client && M.machine == src)) + is_in_use = TRUE + src.interact(M) + var/ai_in_use = FALSE + if(update_ais) + ai_in_use = AutoUpdateAI(src) - if(!ai_in_use && !is_in_use) - obj_flags &= ~IN_USE + if(update_viewers && update_ais) //State change is sure only if we check both + if(!ai_in_use && !is_in_use) + obj_flags &= ~IN_USE /obj/attack_ghost(mob/user) From a6cfd22b791ed3178e1ccd1132c790639cfa2b24 Mon Sep 17 00:00:00 2001 From: YPOQ <30683121+YPOQ@users.noreply.github.com> Date: Thu, 21 Jun 2018 15:30:13 -0600 Subject: [PATCH 20/54] Fixes gulag stacker not giving points after RPG loot event (#38570) * Fixes gulag stacker not giving points after RPG loot event * Moves point values to type vars * cleanup --- code/game/objects/items/stacks/bscrystal.dm | 1 + .../game/objects/items/stacks/sheets/glass.dm | 3 ++ .../objects/items/stacks/sheets/mineral.dm | 8 +++++ .../items/stacks/sheets/sheet_types.dm | 2 ++ .../objects/items/stacks/sheets/sheets.dm | 3 +- code/modules/mining/laborcamp/laborstacker.dm | 31 ++++++++++--------- code/modules/mining/machine_stacking.dm | 2 +- 7 files changed, 34 insertions(+), 16 deletions(-) diff --git a/code/game/objects/items/stacks/bscrystal.dm b/code/game/objects/items/stacks/bscrystal.dm index 936accce39..4da0fd8a44 100644 --- a/code/game/objects/items/stacks/bscrystal.dm +++ b/code/game/objects/items/stacks/bscrystal.dm @@ -67,6 +67,7 @@ attack_verb = list("bluespace polybashed", "bluespace polybattered", "bluespace polybludgeoned", "bluespace polythrashed", "bluespace polysmashed") novariants = TRUE grind_results = list("bluespace" = 20) + point_value = 30 var/crystal_type = /obj/item/stack/ore/bluespace_crystal/refined /obj/item/stack/sheet/bluespace_crystal/attack_self(mob/user)// to prevent the construction menu from ever happening diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 3264deae88..996576d8e5 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -24,6 +24,7 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \ resistance_flags = ACID_PROOF merge_type = /obj/item/stack/sheet/glass grind_results = list("silicon" = 20) + point_value = 1 /obj/item/stack/sheet/glass/suicide_act(mob/living/carbon/user) user.visible_message("[user] begins to slice [user.p_their()] neck with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!") @@ -138,6 +139,7 @@ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \ resistance_flags = ACID_PROOF merge_type = /obj/item/stack/sheet/rglass grind_results = list("silicon" = 20, "iron" = 10) + point_value = 4 /obj/item/stack/sheet/rglass/attackby(obj/item/W, mob/user, params) add_fingerprint(user) @@ -180,6 +182,7 @@ GLOBAL_LIST_INIT(prglass_recipes, list ( \ resistance_flags = ACID_PROOF merge_type = /obj/item/stack/sheet/plasmarglass grind_results = list("silicon" = 20, "plasma" = 10, "iron" = 10) + point_value = 23 /obj/item/stack/sheet/plasmarglass/Initialize(mapload, new_amount, merge = TRUE) recipes = GLOB.prglass_recipes diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 300f18cbeb..87d1985b18 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -104,6 +104,7 @@ GLOBAL_LIST_INIT(sandbag_recipes, list ( \ materials = list(MAT_DIAMOND=MINERAL_MATERIAL_AMOUNT) novariants = TRUE grind_results = list("carbon" = 20) + point_value = 25 GLOBAL_LIST_INIT(diamond_recipes, list ( \ new/datum/stack_recipe("diamond door", /obj/structure/mineral_door/transparent/diamond, 10, one_per_turf = 1, on_floor = 1), \ @@ -129,6 +130,7 @@ GLOBAL_LIST_INIT(diamond_recipes, list ( \ materials = list(MAT_URANIUM=MINERAL_MATERIAL_AMOUNT) novariants = TRUE grind_results = list("uranium" = 20) + point_value = 20 GLOBAL_LIST_INIT(uranium_recipes, list ( \ new/datum/stack_recipe("uranium door", /obj/structure/mineral_door/uranium, 10, one_per_turf = 1, on_floor = 1), \ @@ -154,6 +156,7 @@ GLOBAL_LIST_INIT(uranium_recipes, list ( \ max_integrity = 100 materials = list(MAT_PLASMA=MINERAL_MATERIAL_AMOUNT) grind_results = list("plasma" = 20) + point_value = 20 /obj/item/stack/sheet/mineral/plasma/suicide_act(mob/living/carbon/user) user.visible_message("[user] begins licking \the [src]! It looks like [user.p_theyre()] trying to commit suicide!") @@ -193,6 +196,7 @@ GLOBAL_LIST_INIT(plasma_recipes, list ( \ sheettype = "gold" materials = list(MAT_GOLD=MINERAL_MATERIAL_AMOUNT) grind_results = list("gold" = 20) + point_value = 20 GLOBAL_LIST_INIT(gold_recipes, list ( \ new/datum/stack_recipe("golden door", /obj/structure/mineral_door/gold, 10, one_per_turf = 1, on_floor = 1), \ @@ -220,6 +224,7 @@ GLOBAL_LIST_INIT(gold_recipes, list ( \ sheettype = "silver" materials = list(MAT_SILVER=MINERAL_MATERIAL_AMOUNT) grind_results = list("silver" = 20) + point_value = 20 GLOBAL_LIST_INIT(silver_recipes, list ( \ new/datum/stack_recipe("silver door", /obj/structure/mineral_door/silver, 10, one_per_turf = 1, on_floor = 1), \ @@ -247,6 +252,7 @@ GLOBAL_LIST_INIT(silver_recipes, list ( \ materials = list(MAT_BANANIUM=MINERAL_MATERIAL_AMOUNT) novariants = TRUE grind_results = list("banana" = 20) + point_value = 50 GLOBAL_LIST_INIT(bananium_recipes, list ( \ new/datum/stack_recipe("bananium tile", /obj/item/stack/tile/mineral/bananium, 1, 4, 20), \ @@ -272,6 +278,7 @@ GLOBAL_LIST_INIT(bananium_recipes, list ( \ throw_range = 3 sheettype = "titanium" materials = list(MAT_TITANIUM=MINERAL_MATERIAL_AMOUNT) + point_value = 20 GLOBAL_LIST_INIT(titanium_recipes, list ( \ new/datum/stack_recipe("titanium tile", /obj/item/stack/tile/mineral/titanium, 1, 4, 20), \ @@ -300,6 +307,7 @@ GLOBAL_LIST_INIT(titanium_recipes, list ( \ throw_range = 3 sheettype = "plastitanium" materials = list(MAT_TITANIUM=MINERAL_MATERIAL_AMOUNT, MAT_PLASMA=MINERAL_MATERIAL_AMOUNT) + point_value = 45 GLOBAL_LIST_INIT(plastitanium_recipes, list ( \ new/datum/stack_recipe("plas-titanium tile", /obj/item/stack/tile/mineral/plastitanium, 1, 4, 20), \ diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 52fdf558ee..014e4738b0 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -106,6 +106,7 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \ resistance_flags = FIRE_PROOF merge_type = /obj/item/stack/sheet/metal grind_results = list("iron" = 20) + point_value = 2 /obj/item/stack/sheet/metal/ratvar_act() new /obj/item/stack/tile/brass(loc, amount) @@ -166,6 +167,7 @@ GLOBAL_LIST_INIT(plasteel_recipes, list ( \ resistance_flags = FIRE_PROOF merge_type = /obj/item/stack/sheet/plasteel grind_results = list("iron" = 20, "plasma" = 20) + point_value = 23 /obj/item/stack/sheet/plasteel/Initialize(mapload, new_amount, merge = TRUE) recipes = GLOB.plasteel_recipes diff --git a/code/game/objects/items/stacks/sheets/sheets.dm b/code/game/objects/items/stacks/sheets/sheets.dm index 315cc94b66..21b43eba20 100644 --- a/code/game/objects/items/stacks/sheets/sheets.dm +++ b/code/game/objects/items/stacks/sheets/sheets.dm @@ -11,4 +11,5 @@ attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "smashed") novariants = FALSE var/perunit = MINERAL_MATERIAL_AMOUNT - var/sheettype = null //this is used for girders in the creation of walls/false walls \ No newline at end of file + var/sheettype = null //this is used for girders in the creation of walls/false walls + var/point_value = 0 //turn-in value for the gulag stacker - loosely relative to its rarity. \ No newline at end of file diff --git a/code/modules/mining/laborcamp/laborstacker.dm b/code/modules/mining/laborcamp/laborstacker.dm index a8d94e9ce4..765f9d92e0 100644 --- a/code/modules/mining/laborcamp/laborstacker.dm +++ b/code/modules/mining/laborcamp/laborstacker.dm @@ -1,3 +1,5 @@ +GLOBAL_LIST(labor_sheet_values) + /**********************Prisoners' Console**************************/ /obj/machinery/mineral/labor_claim_console @@ -20,6 +22,18 @@ Radio.listening = FALSE locate_stacking_machine() + if(!GLOB.labor_sheet_values) + var/sheet_list = list() + for(var/sheet_type in subtypesof(/obj/item/stack/sheet)) + var/obj/item/stack/sheet/sheet = sheet_type + if(!initial(sheet.point_value) || (initial(sheet.merge_type) && initial(sheet.merge_type) != sheet_type)) //ignore no-value sheets and x/fifty subtypes + continue + sheet_list += list(list("ore" = initial(sheet.name), "value" = initial(sheet.point_value))) + GLOB.labor_sheet_values = sortList(sheet_list, /proc/cmp_sheet_list) + +/proc/cmp_sheet_list(list/a, list/b) + return a["value"] - b["value"] + /obj/machinery/mineral/labor_claim_console/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/card/id/prisoner)) if(!inserted_id) @@ -52,16 +66,10 @@ if(check_auth()) can_go_home = TRUE - var/list/ores = list() if(stacking_machine) data["unclaimed_points"] = stacking_machine.points - for(var/ore in stacking_machine.ore_values) - var/list/O = list() - O["ore"] = ore - O["value"] = stacking_machine.ore_values[ore] - ores += list(O) - data["ores"] = ores + data["ores"] = GLOB.labor_sheet_values data["can_go_home"] = can_go_home return data @@ -127,15 +135,10 @@ /obj/machinery/mineral/stacking_machine/laborstacker - var/points = 0 //The unclaimed value of ore stacked. Value for each ore loosely relative to its rarity. - var/list/ore_values = list("glass" = 1, "metal" = 2, "reinforced glass" = 4, "gold" = 20, "silver" = 20, "uranium" = 20, "titanium" = 20, "solid plasma" = 20, "plasteel" = 23, "plasma glass" = 23, "diamond" = 25, "bluespace polycrystal" = 30, "plastitanium" = 45, "bananium" = 50) + var/points = 0 //The unclaimed value of ore stacked. /obj/machinery/mineral/stacking_machine/laborstacker/process_sheet(obj/item/stack/sheet/inp) - if(istype(inp)) - var/n = inp.name - var/a = inp.amount - if(n in ore_values) - points += ore_values[n] * a + points += inp.point_value * inp.amount ..() diff --git a/code/modules/mining/machine_stacking.dm b/code/modules/mining/machine_stacking.dm index f0a06429c5..dcc9034e2d 100644 --- a/code/modules/mining/machine_stacking.dm +++ b/code/modules/mining/machine_stacking.dm @@ -105,8 +105,8 @@ stack_list[inp.type] = s var/obj/item/stack/sheet/storage = stack_list[inp.type] storage.amount += inp.amount //Stack the sheets - qdel(inp) //Let the old sheet garbage collect while(storage.amount > stack_amt) //Get rid of excessive stackage var/obj/item/stack/sheet/out = new inp.type(null, stack_amt) unload_mineral(out) storage.amount -= stack_amt + qdel(inp) //Let the old sheet garbage collect From 16bd86e4cb2fa5ae65082033fa1d18efbcbd5110 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Thu, 21 Jun 2018 17:54:21 -0400 Subject: [PATCH 22/54] Merge pull request #38633 from ExcessiveUseOfCobblestone/patch-46 potency gene disks now clarify what the % means on examine --- code/modules/hydroponics/gene_modder.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/modules/hydroponics/gene_modder.dm b/code/modules/hydroponics/gene_modder.dm index e9ffb9e450..7e541f2471 100644 --- a/code/modules/hydroponics/gene_modder.dm +++ b/code/modules/hydroponics/gene_modder.dm @@ -427,7 +427,7 @@ /obj/item/disk/plantgene/proc/update_name() if(gene) - name = "[gene.get_name()] (Plant Data Disk)" + name = "[gene.get_name()] (plant data disk)" else name = "plant data disk" @@ -437,4 +437,6 @@ /obj/item/disk/plantgene/examine(mob/user) ..() + if(gene && (istype(gene, /datum/plant_gene/core/potency))) + to_chat(user,"Percent is relative to potency, not maximum volume of the plant.") to_chat(user, "The write-protect tab is set to [src.read_only ? "protected" : "unprotected"].") From 4e89973d0b0f4254be7f4ba740c6da0f056a3c3b Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Thu, 21 Jun 2018 19:18:41 -0400 Subject: [PATCH 24/54] Merge pull request #38637 from DaxDupont/create-antag Makes create antags check for on station. --- code/modules/admin/verbs/one_click_antag.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index 410e976b85..daa1ce473a 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -57,7 +57,7 @@ var/mob/living/carbon/human/H = null for(var/mob/living/carbon/human/applicant in GLOB.player_list) - if(isReadytoRumble(applicant, ROLE_TRAITOR, FALSE)) + if(isReadytoRumble(applicant, ROLE_TRAITOR)) if(temp.age_check(applicant.client)) if(!(applicant.job in temp.restricted_jobs)) candidates += applicant From 561c2179f8279c8f9a220131e66b240a0f1727e0 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Thu, 21 Jun 2018 16:38:29 -0700 Subject: [PATCH 26/54] Fixes and adds blast cannons to traitor science uplink items (#38093) rscadd: Blast cannons have been fixed and are now available for purchase by traitorous scientists for a low low price of 14TC. rscadd: Blast cannons take the explosive power of a TTV bomb and ejects a linear projectile that will apply what the bomb would do to a certain tile at that distance to that tile. However, this will not cause breaches, or gib mobs, unless the gods (admins) so will it. experimental: Blast cannons do not respect maxcap. (Unless the admins so will it.) --- .../objects/items/devices/transfer_valve.dm | 17 ++++-- code/game/objects/items/tanks/tanks.dm | 1 - .../projectiles/guns/misc/blastcannon.dm | 52 +++++++++++++++---- code/modules/uplink/uplink_items.dm | 10 ++++ 4 files changed, 66 insertions(+), 14 deletions(-) diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index 0ef20dea19..fca7f9bc6d 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -160,11 +160,22 @@ if(sensor.on && sensor.visible) add_overlay("proxy_beam") -/obj/item/transfer_valve/proc/merge_gases() - tank_two.air_contents.volume += tank_one.air_contents.volume +/obj/item/transfer_valve/proc/merge_gases(datum/gas_mixture/target, change_volume = TRUE) + var/target_self = FALSE + if(!target || (target == tank_one.air_contents)) + target = tank_two.air_contents + if(target == tank_two.air_contents) + target_self = TRUE + if(change_volume) + if(!target_self) + target.volume += tank_two.volume + target.volume += tank_one.air_contents.volume var/datum/gas_mixture/temp temp = tank_one.air_contents.remove_ratio(1) - tank_two.air_contents.merge(temp) + target.merge(temp) + if(!target_self) + temp = tank_two.air_contents.remove_ratio(1) + target.merge(temp) /obj/item/transfer_valve/proc/split_gases() if (!valve_open || !tank_one || !tank_two) diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm index 447a83422b..74aea29768 100644 --- a/code/game/objects/items/tanks/tanks.dm +++ b/code/game/objects/items/tanks/tanks.dm @@ -226,7 +226,6 @@ air_contents.react() check_status() - /obj/item/tank/proc/check_status() //Handle exploding, leaking, and rupturing of the tank diff --git a/code/modules/projectiles/guns/misc/blastcannon.dm b/code/modules/projectiles/guns/misc/blastcannon.dm index e7b628653f..df1f9fdfbd 100644 --- a/code/modules/projectiles/guns/misc/blastcannon.dm +++ b/code/modules/projectiles/guns/misc/blastcannon.dm @@ -11,8 +11,21 @@ clumsy_check = FALSE randomspread = FALSE + var/hugbox = TRUE + var/max_power = INFINITY + var/reaction_volume_mod = 0 + var/reaction_cycles = 3 //How many times gases react() before calculation. Very finnicky value, do not mess with without good reason. + var/prereaction = TRUE + + var/bombcheck = TRUE + var/debug_power = 0 + var/obj/item/transfer_valve/bomb +/obj/item/gun/blastcannon/debug + debug_power = 80 + bombcheck = FALSE + /obj/item/gun/blastcannon/Initialize() . = ..() if(!pin) @@ -56,27 +69,33 @@ return TRUE return ..() +//returns the third value of a bomb blast /obj/item/gun/blastcannon/proc/calculate_bomb() if(!istype(bomb) || !istype(bomb.tank_one) || !istype(bomb.tank_two)) return 0 - var/datum/gas_mixture/temp = new(60) //directional buff. - temp.merge(bomb.tank_one.air_contents.remove_ratio(1)) - temp.merge(bomb.tank_two.air_contents.remove_ratio(2)) - for(var/i in 1 to 6) + var/datum/gas_mixture/temp = new(max(reaction_volume_mod, 0)) + bomb.merge_gases(temp) + if(prereaction) + temp.react(src) + var/prereaction_pressure = temp.return_pressure() + if(prereaction_pressure < TANK_FRAGMENT_PRESSURE) + return 0 + for(var/i in 1 to reaction_cycles) temp.react(src) var/pressure = temp.return_pressure() qdel(temp) if(pressure < TANK_FRAGMENT_PRESSURE) return 0 - return (pressure / TANK_FRAGMENT_SCALE) + return ((pressure - TANK_FRAGMENT_PRESSURE) / TANK_FRAGMENT_SCALE) /obj/item/gun/blastcannon/afterattack(atom/target, mob/user, flag, params) - if((!bomb) || (!target) || (get_dist(get_turf(target), get_turf(user)) <= 2)) + if((!bomb && bombcheck) || (!target) || (get_dist(get_turf(target), get_turf(user)) <= 2)) return ..() - var/power = calculate_bomb() + var/power = bomb? calculate_bomb() : debug_power + power = min(power, max_power) QDEL_NULL(bomb) update_icon() - var/heavy = power * 0.2 + var/heavy = power * 0.25 var/medium = power * 0.5 var/light = power user.visible_message("[user] opens [bomb] on [user.p_their()] [name] and fires a blast wave at [target]!","You open [bomb] on your [name] and fire a blast wave at [target]!") @@ -87,7 +106,8 @@ message_admins(log_str) log_game(log_str) var/obj/item/projectile/blastwave/BW = new(loc, heavy, medium, light) - BW.preparePixelProjectile(target, get_turf(target), user, params, 0) + BW.hugbox = hugbox + BW.preparePixelProjectile(target, get_turf(src), params, 0) BW.fire() /obj/item/projectile/blastwave @@ -99,6 +119,7 @@ var/heavyr = 0 var/mediumr = 0 var/lightr = 0 + var/hugbox = TRUE range = 150 /obj/item/projectile/blastwave/Initialize(mapload, _h, _m, _l) @@ -110,14 +131,25 @@ /obj/item/projectile/blastwave/Range() ..() var/amount_destruction = EXPLODE_NONE + var/wallbreak_chance = 0 if(heavyr) amount_destruction = EXPLODE_DEVASTATE + wallbreak_chance = 99 else if(mediumr) amount_destruction = EXPLODE_HEAVY + wallbreak_chance = 66 else if(lightr) amount_destruction = EXPLODE_LIGHT + wallbreak_chance = 33 if(amount_destruction) - loc.ex_act(amount_destruction) + if(hugbox) + loc.contents_explosion(EXPLODE_HEAVY, loc) + if(istype(loc, /turf/closed/wall)) + var/turf/closed/wall/W = loc + if(prob(wallbreak_chance)) + W.dismantle_wall(TRUE, TRUE) + else + loc.ex_act(amount_destruction) else qdel(src) diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index 89197a7f07..619e2c8193 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -1412,6 +1412,16 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) limited_stock = 2 //you can't use more than two! restricted_roles = list("Shaft Miner") +/datum/uplink_item/role_restricted/blastcannon + name = "Blast Cannon" + desc = "A highly specialized weapon, the Blast Cannon is actually relatively simple. It contains an attachment for a tank transfer valve mounted to an angled pipe specially constructed \ + withstand extreme pressure and temperatures, and has a mechanical trigger for triggering the transfer valve. Essentially, it turns the explosive force of a bomb into a narrow-angle \ + blast wave \"projectile\". Aspiring scientists may find this highly useful, as forcing the pressure shockwave into a narrow angle seems to be able to bypass whatever quirk of physics \ + disallows explosive ranges above a certain distance, allowing for the device to use the theoretical yield of a transfer valve bomb, instead of the factual yield." + item = /obj/item/gun/blastcannon + cost = 14 //High cost because of the potential for extreme damage in the hands of a skilled scientist. + restricted_roles = list("Research Director", "Scientist") + /datum/uplink_item/device_tools/clown_bomb name = "Clown Bomb" desc = "The Clown bomb is a hilarious device capable of massive pranks. It has an adjustable timer, \ From 01eb1bc7fef7531aff386956af7c920bb68e5635 Mon Sep 17 00:00:00 2001 From: Tlaltecuhtli <33834933+Tlaltecuhtli@users.noreply.github.com> Date: Fri, 22 Jun 2018 01:51:29 +0200 Subject: [PATCH 28/54] [READY] better contraband crates (#38321) feature: NT reports that the local contraband market has expanded, experts say that the Syndicate is involved. --- code/game/objects/items/storage/firstaid.dm | 32 +++++++++++++++++++ code/modules/cargo/packs.dm | 20 +++++++++--- .../reagents/reagent_containers/pill.dm | 26 +++++++++++++-- 3 files changed, 72 insertions(+), 6 deletions(-) diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm index fe46141614..c338f24d26 100644 --- a/code/game/objects/items/storage/firstaid.dm +++ b/code/game/objects/items/storage/firstaid.dm @@ -231,3 +231,35 @@ new /obj/item/reagent_containers/pill/patch/silver_sulf(src) for(var/i in 1 to 3) new /obj/item/reagent_containers/pill/patch/styptic(src) + +/obj/item/storage/pill_bottle/zoom + name = "suspicious pill bottle" + desc = "The label is pretty old and almost unreadable, you recognize some chemical compounds." + +/obj/item/storage/pill_bottle/zoom/PopulateContents() + for(var/i in 1 to 5) + new /obj/item/reagent_containers/pill/zoom(src) + +/obj/item/storage/pill_bottle/happy + name = "suspicious pill bottle" + desc = "There is a smiley on the top." + +/obj/item/storage/pill_bottle/happy/PopulateContents() + for(var/i in 1 to 5) + new /obj/item/reagent_containers/pill/happy(src) + +/obj/item/storage/pill_bottle/lsd + name = "suspicious pill bottle" + desc = "There is a badly drawn thing with the shape of a mushroom." + +/obj/item/storage/pill_bottle/lsd/PopulateContents() + for(var/i in 1 to 5) + new /obj/item/reagent_containers/pill/lsd(src) + +/obj/item/storage/pill_bottle/aranesp + name = "suspicious pill bottle" + desc = "The label says 'gotta go fast'." + +/obj/item/storage/pill_bottle/aranesp/PopulateContents() + for(var/i in 1 to 5) + new /obj/item/reagent_containers/pill/aranesp(src) diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index e6b4a29502..cffd954b0e 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -1746,14 +1746,26 @@ /datum/supply_pack/costumes_toys/randomised/contraband name = "Contraband Crate" - desc = "Psst.. bud... want some contraband? I can get you a poster, some nice cigs, bling, even some ambrosia deus...you know, the good stuff. Just keep it away from the cops, kay?" + desc = "Psst.. bud... want some contraband? I can get you a poster, some nice cigs, dank, even some sponsored items...you know, the good stuff. Just keep it away from the cops, kay?" contraband = TRUE cost = 3000 - num_contained = 5 + num_contained = 7 contains = list(/obj/item/poster/random_contraband, + /obj/item/poster/random_contraband, + /obj/item/reagent_containers/food/snacks/grown/cannabis, + /obj/item/reagent_containers/food/snacks/grown/cannabis/rainbow, + /obj/item/reagent_containers/food/snacks/grown/cannabis/white, + /obj/item/storage/pill_bottle/zoom, + /obj/item/storage/pill_bottle/happy, + /obj/item/storage/pill_bottle/lsd, + /obj/item/storage/pill_bottle/aranesp, + /obj/item/storage/pill_bottle/stimulant, + /obj/item/toy/cards/deck/syndicate, + /obj/item/reagent_containers/food/drinks/bottle/absinthe, + /obj/item/clothing/under/syndicate/tacticool, + /obj/item/storage/fancy/cigarettes/cigpack_syndicate, /obj/item/storage/fancy/cigarettes/cigpack_shadyjims, - /obj/item/storage/fancy/cigarettes/cigpack_midori, - /obj/item/seeds/ambrosia/deus, + /obj/item/clothing/mask/gas/syndicate, /obj/item/clothing/neck/necklace/dope) crate_name = "crate" diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index f5d46a240e..d2f840cda3 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -151,10 +151,32 @@ icon_state = "pill18" list_reagents = list("insulin" = 50) roundstart = 1 - +///////////////////////////////////////// this pill is used only in a legion mob drop /obj/item/reagent_containers/pill/shadowtoxin name = "black pill" desc = "I wouldn't eat this if I were you." icon_state = "pill9" color = "#454545" - list_reagents = list("shadowmutationtoxin" = 1) \ No newline at end of file + list_reagents = list("shadowmutationtoxin" = 1) +//////////////////////////////////////// drugs +/obj/item/reagent_containers/pill/zoom + name = "zoom pill" + list_reagents = list("synaptizine" = 10, "nicotine" = 10, "methamphetamine" = 1) + + +/obj/item/reagent_containers/pill/happy + name = "happy pill" + list_reagents = list("sugar" = 10, "space_drugs" = 10) + + +/obj/item/reagent_containers/pill/lsd + name = "hallucinogen pill" + list_reagents = list("mushroomhallucinogen" = 15, "mindbreaker" = 15) + + +/obj/item/reagent_containers/pill/aranesp + name = "speedy pill" + list_reagents = list("aranesp" = 10) + + + From fa06a729a2cb7baeff52f8a8e96d76e331686462 Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Thu, 21 Jun 2018 18:55:48 -0500 Subject: [PATCH 30/54] Bubblegum is scarier again (#38306) Miners are able to kill him roundstart by just walking backwards while shooting. Weaker than an ash drake. Easiest way to change this was to give him his original attacks back which required you to avoid/manage blood. --- .../hostile/megafauna/bubblegum.dm | 312 +++++------------- 1 file changed, 74 insertions(+), 238 deletions(-) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm index e5425573b4..d6746ff1a6 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm @@ -1,3 +1,5 @@ +#define MEDAL_PREFIX "Bubblegum" + /* BUBBLEGUM @@ -7,15 +9,15 @@ Bubblegum's footsteps are heralded by shaking booms, proving its tremendous size It acts as a melee creature, chasing down and attacking its target while also using different attacks to augment its power that increase as it takes damage. -It tries to strike at its target through any bloodpools under them; if it fails to do that, it will spray blood and then attempt to warp to a bloodpool near the target. -If it fails to warp to a target, it may summon up to 6 slaughterlings from the blood around it. -If it does not summon all 6 slaughterlings, it will instead charge at its target, dealing massive damage to anything it hits and spraying a stream of blood. -At half health, it will either charge three times or warp, then charge, instead of doing a single charge. +It often charges, dealing massive damage to anything unfortunate enough to be standing where it's aiming. +Whenever it isn't chasing something down, it will sink into nearby blood pools (if possible) and springs out of the closest one to its target. +To make this possible, it sprays streams of blood at random. +From these blood pools Bubblegum may summon slaughterlings - weak, low-damage minions designed to impede the target's progress. -When Bubblegum dies, it leaves behind a H.E.C.K. mining suit as well as a chest that can contain three things: - 1. A bottle that, when activated, drives everyone nearby into a frenzy - 2. A contract that marks for death the chosen target - 3. A spellblade that can slice off limbs at range +When Bubblegum dies, it leaves behind a chest that can contain three things: + 1. A spellblade that can slice off limbs at range + 2. A bottle that, when activated, drives everyone nearby into a frenzy + 3. A contract that marks for death the chosen target Difficulty: Hard @@ -44,8 +46,7 @@ Difficulty: Hard del_on_death = 1 crusher_loot = list(/obj/structure/closet/crate/necropolis/bubblegum/crusher) loot = list(/obj/structure/closet/crate/necropolis/bubblegum) - blood_volume = BLOOD_VOLUME_MAXIMUM //BLEED FOR ME - var/charging = FALSE + var/charging = 0 medal_type = BOSS_MEDAL_BUBBLEGUM score_type = BUBBLEGUM_SCORE deathmessage = "sinks into a pool of blood, fleeing the battle. You've won, for now... " @@ -57,54 +58,33 @@ Difficulty: Hard desc = "You're not quite sure how a signal can be bloody." invisibility = 100 -/mob/living/simple_animal/hostile/megafauna/bubblegum/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE) - . = ..() - if(. > 0 && prob(25)) - var/obj/effect/decal/cleanable/blood/gibs/bubblegum/B = new /obj/effect/decal/cleanable/blood/gibs/bubblegum(loc) - if(prob(40)) - step(B, pick(GLOB.cardinals)) - else - B.setDir(pick(GLOB.cardinals)) - -/obj/effect/decal/cleanable/blood/gibs/bubblegum - name = "thick blood" - desc = "Thick, splattered blood." - random_icon_states = list("gib3", "gib5", "gib6") - bloodiness = 20 - -/obj/effect/decal/cleanable/blood/gibs/bubblegum/can_bloodcrawl_in() - return TRUE - /mob/living/simple_animal/hostile/megafauna/bubblegum/Life() ..() - move_to_delay = CLAMP((health/maxHealth) * 10, 5, 10) + move_to_delay = CLAMP(round((health/maxHealth) * 10), 5, 10) /mob/living/simple_animal/hostile/megafauna/bubblegum/OpenFire() - anger_modifier = CLAMP(((maxHealth - health)/60),0,20) + anger_modifier = CLAMP(((maxHealth - health)/50),0,20) if(charging) return ranged_cooldown = world.time + ranged_cooldown_time - var/warped = FALSE - if(!try_bloodattack()) - INVOKE_ASYNC(src, .proc/blood_spray) - warped = blood_warp() - if(warped && prob(100 - anger_modifier)) - return + blood_warp() - if(prob(90 - anger_modifier) || slaughterlings()) - if(health > maxHealth * 0.5) + if(prob(25)) + INVOKE_ASYNC(src, .proc/blood_spray) + + else if(prob(5+anger_modifier/2)) + slaughterlings() + else + if(health > maxHealth/2 && !client) INVOKE_ASYNC(src, .proc/charge) else - if(prob(70) || warped) - INVOKE_ASYNC(src, .proc/charge, 2) - else - INVOKE_ASYNC(src, .proc/warp_charge) + INVOKE_ASYNC(src, .proc/triple_charge) /mob/living/simple_animal/hostile/megafauna/bubblegum/Initialize() . = ..() - for(var/mob/living/simple_animal/hostile/megafauna/bubblegum/B in GLOB.mob_living_list) + for(var/mob/living/simple_animal/hostile/megafauna/bubblegum/B in GLOB.mob_list) if(B != src) return INITIALIZE_HINT_QDEL //There can be only one var/obj/effect/proc_holder/spell/bloodcrawl/bloodspell = new @@ -118,56 +98,53 @@ Difficulty: Hard if(.) SSshuttle.shuttle_purchase_requirements_met |= "bubblegum" -/mob/living/simple_animal/hostile/megafauna/bubblegum/do_attack_animation(atom/A, visual_effect_icon) - if(!charging) - ..() +/mob/living/simple_animal/hostile/megafauna/bubblegum/do_attack_animation(atom/A) + if(charging) + return + ..() /mob/living/simple_animal/hostile/megafauna/bubblegum/AttackingTarget() - if(!charging) - return ..() + if(charging) + return + ..() /mob/living/simple_animal/hostile/megafauna/bubblegum/Goto(target, delay, minimum_distance) - if(!charging) - ..() + if(charging) + return + ..() /mob/living/simple_animal/hostile/megafauna/bubblegum/Move() + if(!stat) + playsound(src.loc, 'sound/effects/meteorimpact.ogg', 200, 1, 2, 1) if(charging) - new /obj/effect/temp_visual/decoy/fading(loc,src) + new/obj/effect/temp_visual/decoy/fading(loc,src) DestroySurroundings() . = ..() - if(!stat && .) - playsound(src, 'sound/effects/meteorimpact.ogg', 200, 1, 2, 1) if(charging) DestroySurroundings() -/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/warp_charge() - blood_warp() +/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/triple_charge() + charge() + sleep(10) + charge() + sleep(10) charge() -/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/charge(bonus_charges) +/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/charge() var/turf/T = get_turf(target) if(!T || T == loc) return - new /obj/effect/temp_visual/dragon_swoop/bubblegum(T) - charging = TRUE + new /obj/effect/temp_visual/dragon_swoop(T) + charging = 1 DestroySurroundings() walk(src, 0) setDir(get_dir(src, T)) var/obj/effect/temp_visual/decoy/D = new /obj/effect/temp_visual/decoy(loc,src) - animate(D, alpha = 0, color = "#FF0000", transform = matrix()*2, time = 3) - sleep(3) - throw_at(T, get_dist(src, T), 1, src, 0, callback = CALLBACK(src, .charge_end, bonus_charges)) - -/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/charge_end(bonus_charges, list/effects_to_destroy) - charging = FALSE - try_bloodattack() - if(target) - if(bonus_charges) - bonus_charges-- - charge(bonus_charges) - else - Goto(target, move_to_delay, minimum_distance) - SetRecoveryTime(MEGAFAUNA_DEFAULT_RECOVERY_TIME) + animate(D, alpha = 0, color = "#FF0000", transform = matrix()*2, time = 5) + sleep(5) + throw_at(T, get_dist(src, T), 1, src, 0) + charging = 0 + Goto(target, move_to_delay, minimum_distance) /mob/living/simple_animal/hostile/megafauna/bubblegum/Collide(atom/A) @@ -191,142 +168,20 @@ Difficulty: Hard var/throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(L, src))) L.throw_at(throwtarget, 3) - charging = FALSE + charging = 0 -/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/get_mobs_on_blood() - var/list/targets = ListTargets() - . = list() - for(var/mob/living/L in targets) - var/list/bloodpool = get_pools(get_turf(L), 0) - if(bloodpool.len && (!faction_check_mob(L) || L.stat == DEAD)) - . += L - -/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/try_bloodattack() - var/list/targets = get_mobs_on_blood() - if(targets.len) - INVOKE_ASYNC(src, .proc/bloodattack, targets, prob(50)) - - return TRUE - return FALSE - -/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/bloodattack(list/targets, handedness) - var/mob/living/target_one = pick_n_take(targets) - var/turf/target_one_turf = get_turf(target_one) - var/mob/living/target_two - if(targets.len) - target_two = pick_n_take(targets) - var/turf/target_two_turf = get_turf(target_two) - if(target_two.stat != CONSCIOUS || prob(10)) - bloodgrab(target_two_turf, handedness) - else - bloodsmack(target_two_turf, handedness) - - if(target_one) - var/list/pools = get_pools(get_turf(target_one), 0) - if(pools.len) - target_one_turf = get_turf(target_one) - if(target_one_turf) - if(target_one.stat != CONSCIOUS || prob(10)) - bloodgrab(target_one_turf, !handedness) - else - bloodsmack(target_one_turf, !handedness) - - if(!target_two && target_one) - var/list/poolstwo = get_pools(get_turf(target_one), 0) - if(poolstwo.len) - target_one_turf = get_turf(target_one) - if(target_one_turf) - if(target_one.stat != CONSCIOUS || prob(10)) - bloodgrab(target_one_turf, handedness) - else - bloodsmack(target_one_turf, handedness) - -/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/bloodsmack(turf/T, handedness) - if(handedness) - new /obj/effect/temp_visual/bubblegum_hands/rightsmack(T) - else - new /obj/effect/temp_visual/bubblegum_hands/leftsmack(T) - sleep(2.5) - for(var/mob/living/L in T) - if(!faction_check_mob(L)) - to_chat(L, "[src] rends you!") - playsound(T, attack_sound, 100, 1, -1) - var/limb_to_hit = L.get_bodypart(pick(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG)) - L.apply_damage(25, BRUTE, limb_to_hit, L.run_armor_check(limb_to_hit, "melee", null, null, armour_penetration)) - sleep(3) - -/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/bloodgrab(turf/T, handedness) - if(handedness) - new /obj/effect/temp_visual/bubblegum_hands/rightpaw(T) - new /obj/effect/temp_visual/bubblegum_hands/rightthumb(T) - else - new /obj/effect/temp_visual/bubblegum_hands/leftpaw(T) - new /obj/effect/temp_visual/bubblegum_hands/leftthumb(T) - sleep(6) - for(var/mob/living/L in T) - if(!faction_check_mob(L)) - to_chat(L, "[src] drags you through the blood!") - playsound(T, 'sound/magic/enter_blood.ogg', 100, 1, -1) - var/turf/targetturf = get_step(src, dir) - L.forceMove(targetturf) - playsound(targetturf, 'sound/magic/exit_blood.ogg', 100, 1, -1) - if(L.stat != CONSCIOUS) - addtimer(CALLBACK(src, .proc/devour, L), 2) - sleep(1) - -/obj/effect/temp_visual/dragon_swoop/bubblegum - duration = 10 - -/obj/effect/temp_visual/bubblegum_hands - icon = 'icons/effects/bubblegum.dmi' - duration = 9 - -/obj/effect/temp_visual/bubblegum_hands/rightthumb - icon_state = "rightthumbgrab" - -/obj/effect/temp_visual/bubblegum_hands/leftthumb - icon_state = "leftthumbgrab" - -/obj/effect/temp_visual/bubblegum_hands/rightpaw - icon_state = "rightpawgrab" - layer = BELOW_MOB_LAYER - -/obj/effect/temp_visual/bubblegum_hands/leftpaw - icon_state = "leftpawgrab" - layer = BELOW_MOB_LAYER - -/obj/effect/temp_visual/bubblegum_hands/rightsmack - icon_state = "rightsmack" - -/obj/effect/temp_visual/bubblegum_hands/leftsmack - icon_state = "leftsmack" - /mob/living/simple_animal/hostile/megafauna/bubblegum/proc/blood_warp() - if(Adjacent(target)) - return FALSE - var/list/can_jaunt = get_pools(get_turf(src), 1) - if(!can_jaunt.len) - return FALSE - - var/list/pools = get_pools(get_turf(target), 2) - var/list/pools_to_remove = get_pools(get_turf(target), 1) - pools -= pools_to_remove - if(!pools.len) - return FALSE - - var/obj/effect/temp_visual/decoy/DA = new /obj/effect/temp_visual/decoy(loc,src) - DA.color = "#FF0000" - var/oldtransform = DA.transform - DA.transform = matrix()*2 - animate(DA, alpha = 255, color = initial(DA.color), transform = oldtransform, time = 3) - sleep(3) - qdel(DA) - var/obj/effect/decal/cleanable/blood/found_bloodpool - pools = get_pools(get_turf(target), 2) - pools_to_remove = get_pools(get_turf(target), 1) - pools -= pools_to_remove + var/list/pools = list() + var/can_jaunt = FALSE + for(var/obj/effect/decal/cleanable/blood/nearby in view(src,2)) + can_jaunt = TRUE + break + if(!can_jaunt) + return + for(var/obj/effect/decal/cleanable/blood/nearby in view(get_turf(target),2)) + pools += nearby if(pools.len) shuffle_inplace(pools) found_bloodpool = pick(pools) @@ -336,51 +191,30 @@ Difficulty: Hard forceMove(get_turf(found_bloodpool)) playsound(get_turf(src), 'sound/magic/exit_blood.ogg', 100, 1, -1) visible_message("And springs back out!") - return TRUE - return FALSE -/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/get_pools(turf/T, range) - . = list() - for(var/obj/effect/decal/cleanable/nearby in view(T, range)) - if(nearby.can_bloodcrawl_in()) - . += nearby /mob/living/simple_animal/hostile/megafauna/bubblegum/proc/blood_spray() visible_message("[src] sprays a stream of gore!") - var/range = 6 + round(anger_modifier * 0.4) + var/turf/E = get_edge_target_turf(src, src.dir) + var/range = 10 var/turf/previousturf = get_turf(src) - var/turf/J = previousturf - var/targetdir = get_dir(src, target) - if(target.loc == loc) - targetdir = dir - face_atom(target) - new /obj/effect/decal/cleanable/blood/bubblegum(J) - for(var/i in 1 to range) - J = get_step(previousturf, targetdir) - new /obj/effect/temp_visual/dir_setting/bloodsplatter(previousturf, get_dir(previousturf, J)) - playsound(previousturf,'sound/effects/splat.ogg', 100, 1, -1) - if(!J || !previousturf.atmos_adjacent_turfs || !previousturf.atmos_adjacent_turfs[J]) + for(var/turf/J in getline(src,E)) + if(!range) break - new /obj/effect/decal/cleanable/blood/bubblegum(J) + new /obj/effect/temp_visual/dir_setting/bloodsplatter(previousturf, get_dir(previousturf, J)) + if(!previousturf.CanAtmosPass(J)) + break + playsound(J,'sound/effects/splat.ogg', 100, 1, -1) + new /obj/effect/decal/cleanable/blood(J) + range-- previousturf = J sleep(1) -/obj/effect/decal/cleanable/blood/bubblegum - bloodiness = 0 - -/obj/effect/decal/cleanable/blood/bubblegum/can_bloodcrawl_in() - return TRUE - /mob/living/simple_animal/hostile/megafauna/bubblegum/proc/slaughterlings() visible_message("[src] summons a shoal of slaughterlings!") - var/max_amount = 6 - for(var/H in get_pools(get_turf(src), 1)) - if(!max_amount) - break - max_amount-- - var/obj/effect/decal/cleanable/blood/B = H - new /mob/living/simple_animal/hostile/asteroid/hivelordbrood/slaughter(B.loc) - return max_amount + for(var/obj/effect/decal/cleanable/blood/H in range(src, 10)) + if(prob(25)) + new /mob/living/simple_animal/hostile/asteroid/hivelordbrood/slaughter(H.loc) /mob/living/simple_animal/hostile/asteroid/hivelordbrood/slaughter name = "slaughterling" @@ -398,3 +232,5 @@ Difficulty: Hard if(istype(mover, /mob/living/simple_animal/hostile/megafauna/bubblegum)) return 1 return 0 + +#undef MEDAL_PREFIX \ No newline at end of file From 6e9451171856a4708f907d69cab9352782805125 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Fri, 22 Jun 2018 03:04:37 -0400 Subject: [PATCH 32/54] Removes unused defines (#38650) --- code/modules/atmospherics/gasmixtures/reactions.dm | 6 ------ 1 file changed, 6 deletions(-) diff --git a/code/modules/atmospherics/gasmixtures/reactions.dm b/code/modules/atmospherics/gasmixtures/reactions.dm index 2bfe1cec71..5bd8c548f7 100644 --- a/code/modules/atmospherics/gasmixtures/reactions.dm +++ b/code/modules/atmospherics/gasmixtures/reactions.dm @@ -496,10 +496,4 @@ #undef STIMULUM_SECOND_RISE #undef STIMULUM_ABSOLUTE_DROP #undef REACTION_OPPRESSION_THRESHOLD -#undef PLASMA_BINDING_ENERGY -#undef MAX_CATALYST_EFFICENCY -#undef PLASMA_FUSED_COEFFICENT -#undef CATALYST_COEFFICENT -#undef FUSION_PURITY_THRESHOLD -#undef FUSION_HEAT_DROPOFF #undef NOBLIUM_FORMATION_ENERGY From 843c05aa8261e3884290dcbf52d15848cb826979 Mon Sep 17 00:00:00 2001 From: AnturK Date: Sat, 23 Jun 2018 23:30:16 +0200 Subject: [PATCH 34/54] Fixes antag logs (#38658) * Fixes roundstart antag logging. * Fixes roundend antag logging. * Handles blown up minds. * whoops * total antag cleanup --- code/__HELPERS/roundend.dm | 19 +++++++++---------- code/__HELPERS/unsorted.dm | 24 +++++++++++++++++++----- 2 files changed, 28 insertions(+), 15 deletions(-) diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index 13fcc94b4b..a0051c3b1e 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -203,21 +203,20 @@ //Print a list of antagonists to the server log var/list/total_antagonists = list() //Look into all mobs in world, dead or alive - for(var/datum/mind/Mind in minds) - var/temprole = Mind.special_role - if(temprole) //if they are an antagonist of some sort. - if(temprole in total_antagonists) //If the role exists already, add the name to it - total_antagonists[temprole] += ", [Mind.name]([Mind.key])" - else - total_antagonists.Add(temprole) //If the role doesnt exist in the list, create it and add the mob - total_antagonists[temprole] += ": [Mind.name]([Mind.key])" + for(var/datum/antagonist/A in GLOB.antagonists) + if(!A.owner) + continue + if(!(A.name in total_antagonists)) + total_antagonists[A.name] = list() + total_antagonists[A.name] += "[key_name(A.owner)]" CHECK_TICK //Now print them all into the log! log_game("Antagonists at round end were...") - for(var/i in total_antagonists) - log_game("[i]s[total_antagonists[i]].") + for(var/antag_name in total_antagonists) + var/list/L = total_antagonists[antag_name] + log_game("[antag_name]s :[L.Join(", ")].") CHECK_TICK SSdbcore.SetRoundEnd() diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index bb2cb98cd2..5b9bb8c184 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -375,6 +375,7 @@ Turf and target are separate in case you want to teleport some distance from a t var/client/C var/key var/ckey + var/fallback_name if(!whom) return "*null*" @@ -394,6 +395,16 @@ Turf and target are separate in case you want to teleport some distance from a t C = GLOB.directory[ckey] if(C) M = C.mob + else if(istype(whom,/datum/mind)) + var/datum/mind/mind = whom + key = mind.key + ckey = ckey(key) + if(mind.current) + M = mind.current + if(M.client) + C = M.client + else + fallback_name = mind.name else return "*invalid*" @@ -419,11 +430,14 @@ Turf and target are separate in case you want to teleport some distance from a t else . += "*no key*" - if(include_name && M) - if(M.real_name) - . += "/([M.real_name])" - else if(M.name) - . += "/([M.name])" + if(include_name) + if(M) + if(M.real_name) + . += "/([M.real_name])" + else if(M.name) + . += "/([M.name])" + else if(fallback_name) + . += "/([fallback_name])" return . From 4ffe025624439fd1acf29ebd15026607cf865991 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Sat, 23 Jun 2018 12:03:36 -0700 Subject: [PATCH 36/54] Cyborgs now drop radio keys on detonation/destruction (#38617) * Cyborgs now drop radio keys on detonation/destruction * Woops! * Update robot.dm * Use atom rather than turf --- code/modules/mob/living/silicon/robot/robot.dm | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 40ec50d67e..a469bf5258 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -164,8 +164,8 @@ //If there's an MMI in the robot, have it ejected when the mob goes away. --NEO /mob/living/silicon/robot/Destroy() + var/atom/T = drop_location()//To hopefully prevent run time errors. if(mmi && mind)//Safety for when a cyborg gets dust()ed. Or there is no MMI inside. - var/turf/T = get_turf(loc)//To hopefully prevent run time errors. if(T) mmi.forceMove(T) if(mmi.brainmob) @@ -184,6 +184,10 @@ connected_ai.connected_robots -= src if(shell) GLOB.available_ai_shells -= src + else + if(T && istype(radio) && istype(radio.keyslot)) + radio.keyslot.forceMove(T) + radio.keyslot = null qdel(wires) qdel(module) qdel(eye_lights) From 1a53b59b1215edfb7b7f312f32abd0d61bde8f20 Mon Sep 17 00:00:00 2001 From: Time-Green Date: Sat, 23 Jun 2018 20:30:36 +0200 Subject: [PATCH 38/54] Fixes closed soda cans transferring (#38668) --- code/modules/food_and_drinks/drinks/drinks.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm index 29be63a2bb..dc903dce85 100644 --- a/code/modules/food_and_drinks/drinks/drinks.dm +++ b/code/modules/food_and_drinks/drinks/drinks.dm @@ -59,7 +59,7 @@ if(!proximity) return - if(target.is_refillable()) //Something like a glass. Player probably wants to transfer TO it. + if(target.is_refillable() && is_drainable()) //Something like a glass. Player probably wants to transfer TO it. if(!reagents.total_volume) to_chat(user, "[src] is empty.") return From f2d665b1b1e1e79aa4c380633e8bdee0371530fe Mon Sep 17 00:00:00 2001 From: NikNakFlak Date: Fri, 22 Jun 2018 16:57:00 -0700 Subject: [PATCH 40/54] Fixes fireplace sound (rogue crackle) (#38657) --- sound/effects/comfyfire.ogg | Bin 50332 -> 49938 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/sound/effects/comfyfire.ogg b/sound/effects/comfyfire.ogg index 9b796219b3b5df4a495d267c11edf0546edd5992..1bc7fc02d026588fc75eb87380445fb53538fdd3 100644 GIT binary patch delta 48282 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 delta 48422 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 Date: Fri, 22 Jun 2018 19:56:09 -0400 Subject: [PATCH 42/54] Ports more things to Initialize (#38653) --- code/game/objects/effects/bump_teleporter.dm | 4 ++-- code/game/objects/effects/countdown.dm | 4 ++-- code/game/objects/effects/effect_system/effect_system.dm | 6 +++--- .../objects/effects/effect_system/effects_explosion.dm | 8 ++++---- code/game/objects/effects/effect_system/effects_foam.dm | 4 ++-- code/game/objects/effects/effect_system/effects_smoke.dm | 4 ++-- code/game/objects/effects/effect_system/effects_sparks.dm | 4 ++-- code/game/objects/effects/effect_system/effects_water.dm | 8 ++++---- code/game/objects/effects/forcefields.dm | 4 ++-- code/game/objects/effects/manifest.dm | 5 +++-- code/game/objects/effects/mines.dm | 4 ++-- code/game/objects/effects/overlays.dm | 4 ++-- code/game/objects/items/airlock_painter.dm | 4 ++-- code/game/objects/items/candle.dm | 4 ++-- code/modules/admin/fun_balloon.dm | 2 +- 15 files changed, 35 insertions(+), 34 deletions(-) diff --git a/code/game/objects/effects/bump_teleporter.dm b/code/game/objects/effects/bump_teleporter.dm index 42f59cc535..307a912fe3 100644 --- a/code/game/objects/effects/bump_teleporter.dm +++ b/code/game/objects/effects/bump_teleporter.dm @@ -11,8 +11,8 @@ var/static/list/AllTeleporters -/obj/effect/bump_teleporter/New() - ..() +/obj/effect/bump_teleporter/Initialize() + . = ..() LAZYADD(AllTeleporters, src) /obj/effect/bump_teleporter/Destroy() diff --git a/code/game/objects/effects/countdown.dm b/code/game/objects/effects/countdown.dm index d62146be5e..1165ee50a0 100644 --- a/code/game/objects/effects/countdown.dm +++ b/code/game/objects/effects/countdown.dm @@ -14,9 +14,9 @@ anchored = TRUE layer = GHOST_LAYER -/obj/effect/countdown/New(atom/A) +/obj/effect/countdown/Initialize() . = ..() - attach(A) + attach(loc) /obj/effect/countdown/examine(mob/user) . = ..() diff --git a/code/game/objects/effects/effect_system/effect_system.dm b/code/game/objects/effects/effect_system/effect_system.dm index 8c31847f78..eb4c562c36 100644 --- a/code/game/objects/effects/effect_system/effect_system.dm +++ b/code/game/objects/effects/effect_system/effect_system.dm @@ -12,13 +12,13 @@ would spawn and follow the beaker, even if it is carried or thrown. pass_flags = PASSTABLE | PASSGRILLE anchored = TRUE -/obj/effect/particle_effect/New() - ..() +/obj/effect/particle_effect/Initialize() + . = ..() GLOB.cameranet.updateVisibility(src) /obj/effect/particle_effect/Destroy() GLOB.cameranet.updateVisibility(src) - . = ..() + return ..() /datum/effect_system var/number = 3 diff --git a/code/game/objects/effects/effect_system/effects_explosion.dm b/code/game/objects/effects/effect_system/effects_explosion.dm index 33ecd308d1..d208510e86 100644 --- a/code/game/objects/effects/effect_system/effects_explosion.dm +++ b/code/game/objects/effects/effect_system/effects_explosion.dm @@ -4,8 +4,8 @@ opacity = 1 anchored = TRUE -/obj/effect/particle_effect/expl_particles/New() - ..() +/obj/effect/particle_effect/expl_particles/Initialize() + . = ..() QDEL_IN(src, 15) /datum/effect_system/expl_particles @@ -29,8 +29,8 @@ pixel_x = -32 pixel_y = -32 -/obj/effect/explosion/New() - ..() +/obj/effect/explosion/Initialize() + . = ..() QDEL_IN(src, 10) /datum/effect_system/explosion diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm index d9a7d6fb7b..e7b7472e86 100644 --- a/code/game/objects/effects/effect_system/effects_foam.dm +++ b/code/game/objects/effects/effect_system/effects_foam.dm @@ -270,8 +270,8 @@ max_integrity = 20 CanAtmosPass = ATMOS_PASS_DENSITY -/obj/structure/foamedmetal/New() - ..() +/obj/structure/foamedmetal/Initialize() + . = ..() air_update_turf(1) diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm index 5618ca9a91..472261003f 100644 --- a/code/game/objects/effects/effect_system/effects_smoke.dm +++ b/code/game/objects/effects/effect_system/effects_smoke.dm @@ -30,8 +30,8 @@ set_opacity(0) //if we were blocking view, we aren't now because we're fading out stoplag() -/obj/effect/particle_effect/smoke/New() - ..() +/obj/effect/particle_effect/smoke/Initialize() + . = ..() create_reagents(500) START_PROCESSING(SSobj, src) diff --git a/code/game/objects/effects/effect_system/effects_sparks.dm b/code/game/objects/effects/effect_system/effects_sparks.dm index 695c835a89..8453b6438d 100644 --- a/code/game/objects/effects/effect_system/effects_sparks.dm +++ b/code/game/objects/effects/effect_system/effects_sparks.dm @@ -22,8 +22,8 @@ anchored = TRUE light_range = 1 -/obj/effect/particle_effect/sparks/New() - ..() +/obj/effect/particle_effect/sparks/Initialize() + . = ..() flick("sparks", src) // replay the animation playsound(src.loc, "sparks", 100, 1) var/turf/T = loc diff --git a/code/game/objects/effects/effect_system/effects_water.dm b/code/game/objects/effects/effect_system/effects_water.dm index 4c84c97650..469b05176a 100644 --- a/code/game/objects/effects/effect_system/effects_water.dm +++ b/code/game/objects/effects/effect_system/effects_water.dm @@ -7,8 +7,8 @@ mouse_opacity = MOUSE_OPACITY_TRANSPARENT -/obj/effect/particle_effect/water/New() - ..() +/obj/effect/particle_effect/water/Initialize() + . = ..() QDEL_IN(src, 70) /obj/effect/particle_effect/water/Move(turf/newloc) @@ -45,8 +45,8 @@ steam.start() -- spawns the effect icon_state = "extinguish" density = FALSE -/obj/effect/particle_effect/steam/New() - ..() +/obj/effect/particle_effect/steam/Initialize() + . = ..() QDEL_IN(src, 20) /datum/effect_system/steam_spread diff --git a/code/game/objects/effects/forcefields.dm b/code/game/objects/effects/forcefields.dm index ef074f4cec..6aab4f386a 100644 --- a/code/game/objects/effects/forcefields.dm +++ b/code/game/objects/effects/forcefields.dm @@ -8,8 +8,8 @@ CanAtmosPass = ATMOS_PASS_DENSITY var/timeleft = 300 //Set to 0 for permanent forcefields (ugh) -/obj/effect/forcefield/New() - ..() +/obj/effect/forcefield/Initialize() + . = ..() if(timeleft) QDEL_IN(src, timeleft) diff --git a/code/game/objects/effects/manifest.dm b/code/game/objects/effects/manifest.dm index 2082f2b495..fbf403a765 100644 --- a/code/game/objects/effects/manifest.dm +++ b/code/game/objects/effects/manifest.dm @@ -3,8 +3,9 @@ icon = 'icons/mob/screen_gen.dmi' icon_state = "x" -/obj/effect/manifest/New() - src.invisibility = INVISIBILITY_ABSTRACT +/obj/effect/manifest/Initialize() + . = ..() + invisibility = INVISIBILITY_ABSTRACT /obj/effect/manifest/proc/manifest() var/dat = "Crew Manifest:
" diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index 8f256f1102..2ae4f5e5c5 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -98,8 +98,8 @@ density = FALSE var/duration = 0 -/obj/effect/mine/pickup/New() - ..() +/obj/effect/mine/pickup/Initialize() + . = ..() animate(src, pixel_y = 4, time = 20, loop = -1) /obj/effect/mine/pickup/triggermine(mob/victim) diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm index c1abc2c02e..a0634928ce 100644 --- a/code/game/objects/effects/overlays.dm +++ b/code/game/objects/effects/overlays.dm @@ -13,8 +13,8 @@ icon_state="b_beam" var/atom/BeamSource -/obj/effect/overlay/beam/New() - ..() +/obj/effect/overlay/beam/Initialize() + . = ..() QDEL_IN(src, 10) /obj/effect/overlay/palmtree_r diff --git a/code/game/objects/items/airlock_painter.dm b/code/game/objects/items/airlock_painter.dm index be9cb0b89a..82c272e7f9 100644 --- a/code/game/objects/items/airlock_painter.dm +++ b/code/game/objects/items/airlock_painter.dm @@ -15,8 +15,8 @@ var/obj/item/toner/ink = null -/obj/item/airlock_painter/New() - ..() +/obj/item/airlock_painter/Initialize() + . = ..() ink = new /obj/item/toner(src) //This proc doesn't just check if the painter can be used, but also uses it. diff --git a/code/game/objects/items/candle.dm b/code/game/objects/items/candle.dm index a0ec648a1a..b660801f90 100644 --- a/code/game/objects/items/candle.dm +++ b/code/game/objects/items/candle.dm @@ -14,8 +14,8 @@ var/start_lit = FALSE heat = 1000 -/obj/item/candle/New() - ..() +/obj/item/candle/Initialize() + . = ..() if(start_lit) // No visible message light(show_message = FALSE) diff --git a/code/modules/admin/fun_balloon.dm b/code/modules/admin/fun_balloon.dm index b5dfbf7817..85feb3026c 100644 --- a/code/modules/admin/fun_balloon.dm +++ b/code/modules/admin/fun_balloon.dm @@ -6,7 +6,7 @@ anchored = TRUE var/popped = FALSE -/obj/effect/fun_balloon/New() +/obj/effect/fun_balloon/Initialize() . = ..() SSobj.processing |= src From 6685bfcc8ba2814a22933b2449cb50d3125644ea Mon Sep 17 00:00:00 2001 From: LetterJay Date: Sun, 24 Jun 2018 15:04:24 -0500 Subject: [PATCH 44/54] Update dbcore.dm --- code/controllers/subsystem/dbcore.dm | 3 --- 1 file changed, 3 deletions(-) diff --git a/code/controllers/subsystem/dbcore.dm b/code/controllers/subsystem/dbcore.dm index 4692826a9c..dbca802036 100644 --- a/code/controllers/subsystem/dbcore.dm +++ b/code/controllers/subsystem/dbcore.dm @@ -237,8 +237,6 @@ Delayed insert mode was removed in mysql 7 and only works with MyISAM type table item = list() _db_query = _dm_db_new_query() -<<<<<<< HEAD -======= /datum/DBQuery/Destroy() Close() SSdbcore.active_queries -= src @@ -252,7 +250,6 @@ Delayed insert mode was removed in mysql 7 and only works with MyISAM type table last_activity = activity last_activity_time = world.time ->>>>>>> 1a22d45... [s] Fixes stack overflow (#38592) /datum/DBQuery/proc/warn_execute() . = Execute() if(!.) From 06fe4991897b0e1e951e66f9f4496220baeb744b Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 24 Jun 2018 15:07:16 -0500 Subject: [PATCH 45/54] Automatic changelog generation for PR #7188 [ci skip] --- html/changelogs/AutoChangeLog-pr-7188.yml | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7188.yml diff --git a/html/changelogs/AutoChangeLog-pr-7188.yml b/html/changelogs/AutoChangeLog-pr-7188.yml new file mode 100644 index 0000000000..d27aee5b1b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7188.yml @@ -0,0 +1,8 @@ +author: "JStheguy" +delete-after: True +changes: + - rscadd: "Added the data card reader circuit, a circuit that is able to read data cards, as well as write to them." + - tweak: "Data cards are now longer inexplicably called data disks despite clearly being cards, and can be printed from the \"tools\" section of the integrated circuit printer." + - tweak: "Data cards no longer have a special \"label card\" verb and instead can have their names and descriptions changed with a pen." + - rscadd: "Also, some aesthetically different variants of the data cards, because why not." + - imageadd: "Data cards have new sprites, with support for coloring them via the assembly detailer." From 4c0b6e464288cf561c6aa3ef4c66b930b89b6718 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 24 Jun 2018 15:07:37 -0500 Subject: [PATCH 46/54] Automatic changelog generation for PR #7189 [ci skip] --- html/changelogs/AutoChangeLog-pr-7189.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7189.yml diff --git a/html/changelogs/AutoChangeLog-pr-7189.yml b/html/changelogs/AutoChangeLog-pr-7189.yml new file mode 100644 index 0000000000..f0718609b9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7189.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - rscadd: "Added a pink scarf to vendomats" From 56df9b0ac3b79e75b7ffa43d361a4d6b073e532f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 24 Jun 2018 15:07:56 -0500 Subject: [PATCH 47/54] Automatic changelog generation for PR #7190 [ci skip] --- html/changelogs/AutoChangeLog-pr-7190.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7190.yml diff --git a/html/changelogs/AutoChangeLog-pr-7190.yml b/html/changelogs/AutoChangeLog-pr-7190.yml new file mode 100644 index 0000000000..ac2f2cf485 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7190.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - rscadd: "Players can now ctrl-click the PDA to remove the item in its pen slot" From 3d393bc8c43580923cdb7d4645e8c6e83e78d3d6 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 24 Jun 2018 15:11:46 -0500 Subject: [PATCH 48/54] Automatic changelog generation for PR #7201 [ci skip] --- html/changelogs/AutoChangeLog-pr-7201.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7201.yml diff --git a/html/changelogs/AutoChangeLog-pr-7201.yml b/html/changelogs/AutoChangeLog-pr-7201.yml new file mode 100644 index 0000000000..562c8e4190 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7201.yml @@ -0,0 +1,5 @@ +author: "Cobby" +delete-after: True +changes: + - rscdel: "Removed Advanced Mining Scanner from roundstart voucher kits." + - rscdel: "Removed Explorer Webbing from all voucher kits besides the shelter capsule pack." From 60b0ac583f44e614e752c4d8c30f0135c2108a37 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 24 Jun 2018 15:16:54 -0500 Subject: [PATCH 49/54] Automatic changelog generation for PR #7218 [ci skip] --- html/changelogs/AutoChangeLog-pr-7218.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7218.yml diff --git a/html/changelogs/AutoChangeLog-pr-7218.yml b/html/changelogs/AutoChangeLog-pr-7218.yml new file mode 100644 index 0000000000..6bb568d088 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7218.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - spellcheck: "Plant disks with potency genes clarify the percent is for potency scaling and not relative to max volume on examine." From 9f160ef0459c2632d2b4c936e9dd08392fdead78 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 24 Jun 2018 15:22:03 -0500 Subject: [PATCH 50/54] Automatic changelog generation for PR #7219 [ci skip] --- html/changelogs/AutoChangeLog-pr-7219.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7219.yml diff --git a/html/changelogs/AutoChangeLog-pr-7219.yml b/html/changelogs/AutoChangeLog-pr-7219.yml new file mode 100644 index 0000000000..b50be06a75 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7219.yml @@ -0,0 +1,4 @@ +author: "Dax Dupont" +delete-after: True +changes: + - admin: "Create antags now checks for people being on station before applying." From df31333299080379b30eb718879c4331c65258f9 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 24 Jun 2018 15:32:51 -0500 Subject: [PATCH 51/54] Automatic changelog generation for PR #7220 [ci skip] --- html/changelogs/AutoChangeLog-pr-7220.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7220.yml diff --git a/html/changelogs/AutoChangeLog-pr-7220.yml b/html/changelogs/AutoChangeLog-pr-7220.yml new file mode 100644 index 0000000000..ba87335d1e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7220.yml @@ -0,0 +1,6 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - rscadd: "Blast cannons have been fixed and are now available for purchase by traitorous scientists for a low low price of 14TC." + - rscadd: "Blast cannons take the explosive power of a TTV bomb and ejects a linear projectile that will apply what the bomb would do to a certain tile at that distance to that tile. However, this will not cause breaches, or gib mobs, unless the gods (admins) so will it. +experimental: Blast cannons do not respect maxcap. (Unless the admins so will it.)" From e6b56284cef40adb2f92aa84aaa98c7a1fd844e7 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 24 Jun 2018 16:37:52 -0500 Subject: [PATCH 52/54] Automatic changelog generation for PR #7222 [ci skip] --- html/changelogs/AutoChangeLog-pr-7222.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7222.yml diff --git a/html/changelogs/AutoChangeLog-pr-7222.yml b/html/changelogs/AutoChangeLog-pr-7222.yml new file mode 100644 index 0000000000..1fb99a2d63 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7222.yml @@ -0,0 +1,4 @@ +author: "Kor" +delete-after: True +changes: + - rscadd: "Bubblegum has regained his original (deadlier) move set." From 7c28a43f7550fca4520c61066cb1f2803d438152 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 24 Jun 2018 16:40:46 -0500 Subject: [PATCH 53/54] Automatic changelog generation for PR #7230 [ci skip] --- html/changelogs/AutoChangeLog-pr-7230.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7230.yml diff --git a/html/changelogs/AutoChangeLog-pr-7230.yml b/html/changelogs/AutoChangeLog-pr-7230.yml new file mode 100644 index 0000000000..b1674293b5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7230.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - rscadd: "Cyborgs now drop keys on deconstruction/detonation" From ec5c5d0aecef3842061cac8caaa9848dba9d9478 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 24 Jun 2018 18:11:20 -0500 Subject: [PATCH 54/54] Automatic changelog generation for PR #7231 [ci skip] --- html/changelogs/AutoChangeLog-pr-7231.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7231.yml diff --git a/html/changelogs/AutoChangeLog-pr-7231.yml b/html/changelogs/AutoChangeLog-pr-7231.yml new file mode 100644 index 0000000000..4bd894c04e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7231.yml @@ -0,0 +1,4 @@ +author: "Time-Green" +delete-after: True +changes: + - bugfix: "Soda is no longer intangible to the laws of physics"