From 1eb7c176d6290e1182bcd60c3c1565acf7397aba Mon Sep 17 00:00:00 2001 From: izzy Date: Thu, 30 Aug 2018 05:45:33 -0500 Subject: [PATCH 01/29] add electric_stimulator integrated circuit part --- .../subtypes/manipulation.dm | 29 +++++++++++++++++++ tgstation.dme | 1 + 2 files changed, 30 insertions(+) create mode 100644 modular_citadel/code/modules/integrated_electronics/subtypes/manipulation.dm diff --git a/modular_citadel/code/modules/integrated_electronics/subtypes/manipulation.dm b/modular_citadel/code/modules/integrated_electronics/subtypes/manipulation.dm new file mode 100644 index 0000000000..12f0858304 --- /dev/null +++ b/modular_citadel/code/modules/integrated_electronics/subtypes/manipulation.dm @@ -0,0 +1,29 @@ +/obj/item/integrated_circuit/manipulation/electric_stimulator + name = "electronic stimulation module" + desc = "Used to induce sexual stimulation with electricity." + icon_state = "power_relay" + extended_desc = "The circuit accepts a reference to a person and upon activation, attempts to stimulate them to orgasm." + complexity = 10 + size = 3 + inputs = list("target" = IC_PINTYPE_REF) + outputs = list() + activators = list("fire" = IC_PINTYPE_PULSE_IN) + spawn_flags = IC_SPAWN_RESEARCH + power_draw_per_use = 800 + cooldown_per_use = 50 + +/obj/item/integrated_circuit/manipulation/electric_stimulator/do_work() + ..() + var/mob/living/M = get_pin_data_as_type(IC_INPUT, 1, /mob/living) + if(!check_target(M)) + return + if(ismob(M) && M.canbearoused) + if(M.getArousalLoss() >= 100 && ishuman(M) && M.has_dna()) + var/mob/living/carbon/human/H = M + var/orgasm_message = pick("A sharp pulse of electricity pushes you to orgasm!", "You feel a jolt of electricity force you into orgasm!") + to_chat(H, "[orgasm_message]") + H.mob_climax(forced_climax=TRUE) + else + M.adjustArousalLoss(35) + var/stimulate_message = pick("You feel a sharp warming tingle of electricity through your body!", "A burst of arousing electricity flows through your body!") + to_chat(M, "[stimulate_message]") diff --git a/tgstation.dme b/tgstation.dme index 2e2ff0408b..bd12a4406d 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -2811,6 +2811,7 @@ #include "modular_citadel\code\modules\events\blob.dm" #include "modular_citadel\code\modules\events\wizard\magicarp.dm" #include "modular_citadel\code\modules\food_and_drinks\snacks\meat.dm" +#include "modular_citadel\code\modules\integrated_electronics\subtypes\manipulation.dm" #include "modular_citadel\code\modules\jobs\jobs.dm" #include "modular_citadel\code\modules\jobs\job_types\captain.dm" #include "modular_citadel\code\modules\jobs\job_types\cargo_service.dm" From 8d0b2966b848732fe5edfae23af48f8f0fc61e05 Mon Sep 17 00:00:00 2001 From: nik707 <38332985+nik707@users.noreply.github.com> Date: Fri, 31 Aug 2018 11:17:08 -0500 Subject: [PATCH 02/29] changes starting armory loadout --- .../map_files/Deltastation/DeltaStation2.dmm | 35 +++++-------------- _maps/map_files/MetaStation/MetaStation.dmm | 16 ++------- _maps/map_files/OmegaStation/OmegaStation.dmm | 33 ----------------- _maps/map_files/PubbyStation/PubbyStation.dmm | 32 +---------------- 4 files changed, 12 insertions(+), 104 deletions(-) diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 0540a2f1d8..9fb3d0e9fc 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -43117,7 +43117,6 @@ pixel_x = -3; pixel_y = 3 }, -/obj/item/gun/ballistic/shotgun/riot, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/bot, /obj/item/gun/ballistic/shotgun/riot, @@ -43151,14 +43150,16 @@ pixel_x = -3; pixel_y = 3 }, -/obj/item/clothing/head/helmet{ - layer = 3.00001 - }, /obj/item/clothing/head/helmet{ layer = 3.00001; pixel_x = 3; pixel_y = -3 }, +/obj/item/clothing/head/helmet{ + layer = 3.00001; + pixel_x = -3; + pixel_y = 3 + }, /turf/open/floor/plasteel/vault{ dir = 8 }, @@ -44015,7 +44016,6 @@ pixel_y = 3 }, /obj/item/storage/box/rubbershot, -/obj/item/storage/box/rubbershot, /obj/item/storage/box/rubbershot{ pixel_x = 3; pixel_y = -3 @@ -44038,7 +44038,6 @@ pixel_x = -3; pixel_y = 3 }, -/obj/item/gun/energy/laser, /obj/item/gun/energy/laser{ pixel_x = 3; pixel_y = -3 @@ -44057,18 +44056,11 @@ pixel_y = 3 }, /obj/item/clothing/suit/armor/bulletproof, -/obj/item/clothing/suit/armor/bulletproof{ - pixel_x = 3; - pixel_y = -3 - }, /obj/item/clothing/head/helmet/alt{ layer = 3.00001; pixel_x = -3; pixel_y = 3 }, -/obj/item/clothing/head/helmet/alt{ - layer = 3.00001 - }, /obj/item/clothing/head/helmet/alt{ layer = 3.00001; pixel_x = 3; @@ -45304,6 +45296,10 @@ /obj/structure/window/reinforced{ dir = 4 }, +/obj/item/gun/energy/e_gun/advtaser{ + pixel_x = 3; + pixel_y = -3 + }, /turf/open/floor/plasteel, /area/ai_monitored/security/armory) "bVr" = ( @@ -45313,23 +45309,11 @@ pixel_y = 3 }, /obj/item/clothing/suit/armor/riot, -/obj/item/clothing/suit/armor/riot{ - pixel_x = 3; - pixel_y = -3 - }, /obj/item/clothing/head/helmet/riot{ pixel_x = -3; pixel_y = 3 }, /obj/item/clothing/head/helmet/riot, -/obj/item/clothing/head/helmet/riot{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/shield/riot{ - pixel_x = -3; - pixel_y = 3 - }, /obj/item/shield/riot, /obj/item/shield/riot{ pixel_x = 3; @@ -46637,7 +46621,6 @@ pixel_x = -3; pixel_y = 3 }, -/obj/item/gun/energy/e_gun, /obj/item/gun/energy/e_gun{ pixel_x = 3; pixel_y = -3 diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 680bc711fc..29da426707 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -2783,16 +2783,14 @@ /area/ai_monitored/security/armory) "agb" = ( /obj/structure/rack, -/obj/item/gun/energy/e_gun/advtaser{ - pixel_x = -3; - pixel_y = 3 - }, /obj/item/gun/energy/e_gun/advtaser, /obj/item/gun/energy/e_gun/advtaser{ pixel_x = 3; pixel_y = -3 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/item/gun/energy/e_gun/advtaser, +/obj/item/gun/energy/e_gun/advtaser, /turf/open/floor/plasteel/vault{ dir = 1 }, @@ -3188,14 +3186,11 @@ /obj/item/storage/box/rubbershot, /obj/item/storage/box/rubbershot, /obj/item/storage/box/rubbershot, -/obj/item/storage/box/rubbershot, -/obj/item/storage/box/rubbershot, /obj/item/gun/ballistic/shotgun/riot{ pixel_x = -3; pixel_y = 3 }, /obj/item/gun/ballistic/shotgun/riot, -/obj/item/gun/ballistic/shotgun/riot, /turf/open/floor/plasteel/vault{ dir = 1 }, @@ -3206,7 +3201,6 @@ pixel_x = -3; pixel_y = 3 }, -/obj/item/gun/energy/e_gun, /obj/item/gun/energy/e_gun{ pixel_x = 3; pixel_y = -3 @@ -3448,8 +3442,6 @@ /obj/structure/rack, /obj/item/clothing/suit/armor/riot, /obj/item/clothing/suit/armor/riot, -/obj/item/clothing/suit/armor/riot, -/obj/item/clothing/head/helmet/riot, /obj/item/clothing/head/helmet/riot, /obj/item/clothing/head/helmet/riot, /obj/machinery/firealarm{ @@ -3528,10 +3520,6 @@ pixel_y = 3 }, /obj/item/shield/riot, -/obj/item/shield/riot{ - pixel_x = 3; - pixel_y = -3 - }, /obj/machinery/button/door{ id = "armory"; name = "Armory Shutters"; diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm index 79c28f5947..5b38b12171 100644 --- a/_maps/map_files/OmegaStation/OmegaStation.dmm +++ b/_maps/map_files/OmegaStation/OmegaStation.dmm @@ -4086,10 +4086,6 @@ /obj/structure/rack, /obj/item/storage/box/rubbershot, /obj/item/storage/box/rubbershot, -/obj/item/storage/box/rubbershot{ - pixel_x = 3; - pixel_y = -3 - }, /obj/item/storage/box/rubbershot{ pixel_x = 3; pixel_y = -3 @@ -4125,24 +4121,11 @@ pixel_x = -3; pixel_y = 3 }, -/obj/item/clothing/suit/armor/bulletproof, -/obj/item/clothing/suit/armor/bulletproof{ - pixel_x = 3; - pixel_y = -3 - }, /obj/item/clothing/head/helmet/alt{ layer = 3.00001; pixel_x = -3; pixel_y = 3 }, -/obj/item/clothing/head/helmet/alt{ - layer = 3.00001 - }, -/obj/item/clothing/head/helmet/alt{ - layer = 3.00001; - pixel_x = 3; - pixel_y = -3 - }, /obj/structure/sign/warning/nosmoking{ pixel_y = 32 }, @@ -4967,10 +4950,6 @@ pixel_y = 3 }, /obj/item/gun/energy/e_gun, -/obj/item/gun/energy/e_gun{ - pixel_x = 3; - pixel_y = -3 - }, /obj/item/radio/intercom{ name = "Station Intercom"; pixel_x = -26 @@ -5000,28 +4979,16 @@ pixel_y = 3 }, /obj/item/clothing/suit/armor/riot, -/obj/item/clothing/suit/armor/riot{ - pixel_x = 3; - pixel_y = -3 - }, /obj/item/clothing/head/helmet/riot{ pixel_x = -3; pixel_y = 3 }, /obj/item/clothing/head/helmet/riot, -/obj/item/clothing/head/helmet/riot{ - pixel_x = 3; - pixel_y = -3 - }, /obj/item/shield/riot{ pixel_x = -3; pixel_y = 3 }, /obj/item/shield/riot, -/obj/item/shield/riot{ - pixel_x = 3; - pixel_y = -3 - }, /obj/structure/cable/white{ icon_state = "4-8" }, diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index e00b845e55..949f1599d0 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -2859,24 +2859,15 @@ pixel_x = -3; pixel_y = 3 }, -/obj/item/clothing/suit/armor/riot, /obj/item/clothing/suit/armor/riot{ pixel_x = 3; pixel_y = -3 }, -/obj/item/clothing/head/helmet/riot{ - pixel_x = -3; - pixel_y = 3 - }, /obj/item/clothing/head/helmet/riot, /obj/item/clothing/head/helmet/riot{ pixel_x = 3; pixel_y = -3 }, -/obj/item/shield/riot{ - pixel_x = -3; - pixel_y = 3 - }, /obj/item/shield/riot, /obj/item/shield/riot{ pixel_x = 3; @@ -2902,10 +2893,6 @@ }, /obj/item/storage/box/rubbershot, /obj/item/storage/box/rubbershot, -/obj/item/storage/box/rubbershot{ - pixel_x = 3; - pixel_y = -3 - }, /obj/item/storage/box/rubbershot{ pixel_x = 3; pixel_y = -3 @@ -3155,10 +3142,6 @@ pixel_y = 3 }, /obj/item/gun/energy/e_gun, -/obj/item/gun/energy/e_gun{ - pixel_x = 3; - pixel_y = -3 - }, /obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/machinery/firealarm{ dir = 8; @@ -3177,15 +3160,6 @@ pixel_y = 3 }, /obj/item/clothing/suit/armor/bulletproof, -/obj/item/clothing/suit/armor/bulletproof{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/clothing/head/helmet/alt{ - layer = 3.00001; - pixel_x = -3; - pixel_y = 3 - }, /obj/item/clothing/head/helmet/alt{ layer = 3.00001 }, @@ -3209,7 +3183,6 @@ pixel_x = -3; pixel_y = 3 }, -/obj/item/gun/energy/laser, /obj/item/gun/energy/laser{ pixel_x = 3; pixel_y = -3 @@ -3633,6 +3606,7 @@ pixel_x = 3; pixel_y = -3 }, +/obj/item/gun/energy/e_gun/advtaser, /turf/open/floor/plasteel/dark, /area/security/armory) "akM" = ( @@ -3661,10 +3635,6 @@ /area/security/armory) "akP" = ( /obj/structure/rack, -/obj/item/gun/ballistic/shotgun/riot{ - pixel_x = -3; - pixel_y = 3 - }, /obj/item/gun/ballistic/shotgun/riot, /obj/item/gun/ballistic/shotgun/riot{ pixel_x = 3; From d3af78793847a459d27bab5b4d0e07c961a7ea9f Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Sat, 1 Sep 2018 20:22:19 -0400 Subject: [PATCH 03/29] Fixes core DA and add slime core DA --- code/controllers/subsystem/research.dm | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/code/controllers/subsystem/research.dm b/code/controllers/subsystem/research.dm index 253975fb34..fe4f2676bd 100644 --- a/code/controllers/subsystem/research.dm +++ b/code/controllers/subsystem/research.dm @@ -17,10 +17,26 @@ SUBSYSTEM_DEF(research) var/list/techweb_boost_items = list() //associative double-layer path = list(id = list(point_type = point_discount)) var/list/techweb_nodes_hidden = list() //Nodes that should be hidden by default. var/list/techweb_point_items = list( //path = list(point type = value) - /obj/item/assembly/signaler/anomaly = list(TECHWEB_POINT_TYPE_GENERIC = 10000), // Cit three more anomalys anomalys - /obj/item/assembly/signaler/anomaly = list(TECHWEB_POINT_TYPE_GENERIC = 7500), - /obj/item/assembly/signaler/anomaly = list(TECHWEB_POINT_TYPE_GENERIC = 5000), - /obj/item/assembly/signaler/anomaly = list(TECHWEB_POINT_TYPE_GENERIC = 2500) // End of Cit changes + /obj/item/assembly/signaler/anomaly = list(TECHWEB_POINT_TYPE_GENERIC = 10000), // Adds in slime core deconing + /obj/item/slime_extract/grey = (TECHWEB_POINT_TYPE_GENERIC = 500), + /obj/item/slime_extract/metal = (TECHWEB_POINT_TYPE_GENERIC = 750), + /obj/item/slime_extract/purple = (TECHWEB_POINT_TYPE_GENERIC = 750), + /obj/item/slime_extract/orange = (TECHWEB_POINT_TYPE_GENERIC = 750), + /obj/item/slime_extract/blue = (TECHWEB_POINT_TYPE_GENERIC = 750), + /obj/item/slime_extract/yellow = (TECHWEB_POINT_TYPE_GENERIC = 1000), + /obj/item/slime_extract/silver = (TECHWEB_POINT_TYPE_GENERIC = 1000), + /obj/item/slime_extract/darkblue = (TECHWEB_POINT_TYPE_GENERIC = 1000), + /obj/item/slime_extract/darkpurple = (TECHWEB_POINT_TYPE_GENERIC = 1000), + /obj/item/slime_extract/bluespace = (TECHWEB_POINT_TYPE_GENERIC = 1250), + /obj/item/slime_extract/cerulean = (TECHWEB_POINT_TYPE_GENERIC = 1250), + /obj/item/slime_extract/pyrite = (TECHWEB_POINT_TYPE_GENERIC = 1250), + /obj/item/slime_extract/green = (TECHWEB_POINT_TYPE_GENERIC = 1250), + /obj/item/slime_extract/pink = (TECHWEB_POINT_TYPE_GENERIC = 1250), + /obj/item/slime_extract/gold = (TECHWEB_POINT_TYPE_GENERIC = 1250), + /obj/item/slime_extract/black = (TECHWEB_POINT_TYPE_GENERIC = 1500), + /obj/item/slime_extract/adamantine = (TECHWEB_POINT_TYPE_GENERIC = 1500), + /obj/item/slime_extract/lightpink = (TECHWEB_POINT_TYPE_GENERIC = 1500), + /obj/item/slime_extract/rainbow = (TECHWEB_POINT_TYPE_GENERIC = 2500) // End of Cit changes ) var/list/errored_datums = list() var/list/point_types = list() //typecache style type = TRUE list From 384d76033802242b92baae46731761c5436f7a0d Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Sat, 1 Sep 2018 20:27:47 -0400 Subject: [PATCH 04/29] adds oil slime core --- code/controllers/subsystem/research.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/controllers/subsystem/research.dm b/code/controllers/subsystem/research.dm index fe4f2676bd..5ae0a6535b 100644 --- a/code/controllers/subsystem/research.dm +++ b/code/controllers/subsystem/research.dm @@ -35,6 +35,7 @@ SUBSYSTEM_DEF(research) /obj/item/slime_extract/gold = (TECHWEB_POINT_TYPE_GENERIC = 1250), /obj/item/slime_extract/black = (TECHWEB_POINT_TYPE_GENERIC = 1500), /obj/item/slime_extract/adamantine = (TECHWEB_POINT_TYPE_GENERIC = 1500), + /obj/item/slime_extract/oil = (TECHWEB_POINT_TYPE_GENERIC = 1500), /obj/item/slime_extract/lightpink = (TECHWEB_POINT_TYPE_GENERIC = 1500), /obj/item/slime_extract/rainbow = (TECHWEB_POINT_TYPE_GENERIC = 2500) // End of Cit changes ) From c59bac3116a6cd0f4e647b99f4342a01539a9d4b Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Sat, 1 Sep 2018 20:39:37 -0400 Subject: [PATCH 05/29] list --- code/controllers/subsystem/research.dm | 40 +++++++++++++------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/code/controllers/subsystem/research.dm b/code/controllers/subsystem/research.dm index 5ae0a6535b..b441c3f02e 100644 --- a/code/controllers/subsystem/research.dm +++ b/code/controllers/subsystem/research.dm @@ -18,26 +18,26 @@ SUBSYSTEM_DEF(research) var/list/techweb_nodes_hidden = list() //Nodes that should be hidden by default. var/list/techweb_point_items = list( //path = list(point type = value) /obj/item/assembly/signaler/anomaly = list(TECHWEB_POINT_TYPE_GENERIC = 10000), // Adds in slime core deconing - /obj/item/slime_extract/grey = (TECHWEB_POINT_TYPE_GENERIC = 500), - /obj/item/slime_extract/metal = (TECHWEB_POINT_TYPE_GENERIC = 750), - /obj/item/slime_extract/purple = (TECHWEB_POINT_TYPE_GENERIC = 750), - /obj/item/slime_extract/orange = (TECHWEB_POINT_TYPE_GENERIC = 750), - /obj/item/slime_extract/blue = (TECHWEB_POINT_TYPE_GENERIC = 750), - /obj/item/slime_extract/yellow = (TECHWEB_POINT_TYPE_GENERIC = 1000), - /obj/item/slime_extract/silver = (TECHWEB_POINT_TYPE_GENERIC = 1000), - /obj/item/slime_extract/darkblue = (TECHWEB_POINT_TYPE_GENERIC = 1000), - /obj/item/slime_extract/darkpurple = (TECHWEB_POINT_TYPE_GENERIC = 1000), - /obj/item/slime_extract/bluespace = (TECHWEB_POINT_TYPE_GENERIC = 1250), - /obj/item/slime_extract/cerulean = (TECHWEB_POINT_TYPE_GENERIC = 1250), - /obj/item/slime_extract/pyrite = (TECHWEB_POINT_TYPE_GENERIC = 1250), - /obj/item/slime_extract/green = (TECHWEB_POINT_TYPE_GENERIC = 1250), - /obj/item/slime_extract/pink = (TECHWEB_POINT_TYPE_GENERIC = 1250), - /obj/item/slime_extract/gold = (TECHWEB_POINT_TYPE_GENERIC = 1250), - /obj/item/slime_extract/black = (TECHWEB_POINT_TYPE_GENERIC = 1500), - /obj/item/slime_extract/adamantine = (TECHWEB_POINT_TYPE_GENERIC = 1500), - /obj/item/slime_extract/oil = (TECHWEB_POINT_TYPE_GENERIC = 1500), - /obj/item/slime_extract/lightpink = (TECHWEB_POINT_TYPE_GENERIC = 1500), - /obj/item/slime_extract/rainbow = (TECHWEB_POINT_TYPE_GENERIC = 2500) // End of Cit changes + /obj/item/slime_extract/grey = list(TECHWEB_POINT_TYPE_GENERIC = 500), + /obj/item/slime_extract/metal = list(TECHWEB_POINT_TYPE_GENERIC = 750), + /obj/item/slime_extract/purple = list(TECHWEB_POINT_TYPE_GENERIC = 750), + /obj/item/slime_extract/orange = list(TECHWEB_POINT_TYPE_GENERIC = 750), + /obj/item/slime_extract/blue = list(TECHWEB_POINT_TYPE_GENERIC = 750), + /obj/item/slime_extract/yellow = list(TECHWEB_POINT_TYPE_GENERIC = 1000), + /obj/item/slime_extract/silver = list(TECHWEB_POINT_TYPE_GENERIC = 1000), + /obj/item/slime_extract/darkblue = list(TECHWEB_POINT_TYPE_GENERIC = 1000), + /obj/item/slime_extract/darkpurple = list(TECHWEB_POINT_TYPE_GENERIC = 1000), + /obj/item/slime_extract/bluespace = list(TECHWEB_POINT_TYPE_GENERIC = 1250), + /obj/item/slime_extract/cerulean = list(TECHWEB_POINT_TYPE_GENERIC = 1250), + /obj/item/slime_extract/pyrite = list(TECHWEB_POINT_TYPE_GENERIC = 1250), + /obj/item/slime_extract/green = list(TECHWEB_POINT_TYPE_GENERIC = 1250), + /obj/item/slime_extract/pink = list(TECHWEB_POINT_TYPE_GENERIC = 1250), + /obj/item/slime_extract/gold = list(TECHWEB_POINT_TYPE_GENERIC = 1250), + /obj/item/slime_extract/black = list(TECHWEB_POINT_TYPE_GENERIC = 1500), + /obj/item/slime_extract/adamantine =list (TECHWEB_POINT_TYPE_GENERIC = 1500), + /obj/item/slime_extract/oil = list(TECHWEB_POINT_TYPE_GENERIC = 1500), + /obj/item/slime_extract/lightpink = list(TECHWEB_POINT_TYPE_GENERIC = 1500), + /obj/item/slime_extract/rainbow = list(TECHWEB_POINT_TYPE_GENERIC = 2500) // End of Cit changes ) var/list/errored_datums = list() var/list/point_types = list() //typecache style type = TRUE list From 3f5b75e4359cd5538cab3b171818e6f6cade3f12 Mon Sep 17 00:00:00 2001 From: nik707 <38332985+nik707@users.noreply.github.com> Date: Sun, 2 Sep 2018 18:04:13 -0500 Subject: [PATCH 06/29] makes this less misleading --- code/modules/mob/living/simple_animal/friendly/drone/_drone.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm index 613d348016..0c297e2c70 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm @@ -69,7 +69,7 @@ var/visualAppearence = MAINTDRONE //What we appear as var/hacked = FALSE //If we have laws to destroy the station var/flavortext = \ - "\nDO NOT INTERFERE WITH THE ROUND AS A DRONE OR YOU WILL BE DRONE BANNED\n"+\ + "\nUNLESS YOU ARE A FREE DRONE, DO NOT INTERFERE WITH THE ROUND AS A DRONE OR YOU WILL BE DRONE BANNED\n"+\ "Drones are a ghost role that are allowed to fix the station and build things. Interfering with the round as a drone is against the rules.\n"+\ "Actions that constitute interference include, but are not limited to:\n"+\ " - Interacting with round critical objects (IDs, weapons, contraband, powersinks, bombs, etc.)\n"+\ From 20eca82aeddc8f298aba4679756e08890cf2ca84 Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Sun, 2 Sep 2018 19:11:30 -0400 Subject: [PATCH 07/29] Re adds in cores, Poojawa is correct here --- code/controllers/subsystem/research.dm | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/code/controllers/subsystem/research.dm b/code/controllers/subsystem/research.dm index b441c3f02e..d60c8336fa 100644 --- a/code/controllers/subsystem/research.dm +++ b/code/controllers/subsystem/research.dm @@ -17,8 +17,11 @@ SUBSYSTEM_DEF(research) var/list/techweb_boost_items = list() //associative double-layer path = list(id = list(point_type = point_discount)) var/list/techweb_nodes_hidden = list() //Nodes that should be hidden by default. var/list/techweb_point_items = list( //path = list(point type = value) - /obj/item/assembly/signaler/anomaly = list(TECHWEB_POINT_TYPE_GENERIC = 10000), // Adds in slime core deconing - /obj/item/slime_extract/grey = list(TECHWEB_POINT_TYPE_GENERIC = 500), + /obj/item/assembly/signaler/anomaly = list(TECHWEB_POINT_TYPE_GENERIC = 2500), + /obj/item/assembly/signaler/anomaly = list(TECHWEB_POINT_TYPE_GENERIC = 5000), // Cit three more anomalys anomalys + /obj/item/assembly/signaler/anomaly = list(TECHWEB_POINT_TYPE_GENERIC = 7500), + /obj/item/assembly/signaler/anomaly = list(TECHWEB_POINT_TYPE_GENERIC = 10000), + /obj/item/slime_extract/grey = list(TECHWEB_POINT_TYPE_GENERIC = 500), // Adds in slime core deconing /obj/item/slime_extract/metal = list(TECHWEB_POINT_TYPE_GENERIC = 750), /obj/item/slime_extract/purple = list(TECHWEB_POINT_TYPE_GENERIC = 750), /obj/item/slime_extract/orange = list(TECHWEB_POINT_TYPE_GENERIC = 750), From 9b301505710494ac1a1be3b423c1ba831e9f0065 Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Mon, 3 Sep 2018 02:32:04 -0400 Subject: [PATCH 08/29] Fixing placement and nerfing of Adv Illegal node --- .../boxes_magazines/external/pistol.dm | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/modular_citadel/code/modules/projectiles/boxes_magazines/external/pistol.dm b/modular_citadel/code/modules/projectiles/boxes_magazines/external/pistol.dm index 9f5a0afbaf..735d162ba5 100644 --- a/modular_citadel/code/modules/projectiles/boxes_magazines/external/pistol.dm +++ b/modular_citadel/code/modules/projectiles/boxes_magazines/external/pistol.dm @@ -14,9 +14,9 @@ desc = "A gun magazine." id = "10mm" build_type = PROTOLATHE - materials = list(MAT_METAL = 18000) + materials = list(MAT_METAL = 55000) build_path = /obj/item/ammo_box/magazine/m10mm - category = list("Weapons") + category = list("Ammo") departmental_flags = DEPARTMENTAL_FLAG_SECURITY /datum/design/m10mm/hp @@ -24,10 +24,10 @@ desc = "A gun magazine. Loaded with hollow-point rounds, extremely effective against unarmored targets, but nearly useless against protective clothing." id = "10mmhp" build_type = PROTOLATHE - materials = list(MAT_METAL = 18000, MAT_GLASS = 25000) + materials = list(MAT_METAL = 40000, MAT_GLASS = 50000) reagents_list = list("sonic_powder" = 280) build_path = /obj/item/ammo_box/magazine/m10mm/hp - category = list("Weapons") + category = list("Ammo") departmental_flags = DEPARTMENTAL_FLAG_SECURITY /datum/design/m10mm/ap @@ -35,9 +35,9 @@ desc = "A gun magazine. Loaded with rounds which penetrate armour, but are less effective against normal targets." id = "10mmap" build_type = PROTOLATHE - materials = list(MAT_METAL = 18000, MAT_TITANIUM = 22000) + materials = list(MAT_METAL = 40000, MAT_TITANIUM = 60000) build_path = /obj/item/ammo_box/magazine/m10mm/ap - category = list("Weapons") + category = list("Ammo") departmental_flags = DEPARTMENTAL_FLAG_SECURITY /datum/design/bolt_clip @@ -47,16 +47,16 @@ build_type = PROTOLATHE materials = list(MAT_METAL = 8000) build_path = /obj/item/ammo_box/a762 - category = list("Weapons") + category = list("Ammo") departmental_flags = DEPARTMENTAL_FLAG_SECURITY /datum/design/m45 //Kinda NT in throey name = "handgun magazine (.45)" id = "m45" build_type = PROTOLATHE - materials = list(MAT_METAL = 8000) + materials = list(MAT_METAL = 80000) build_path = /obj/item/ammo_box/magazine/m45 - category = list("Weapons") + category = list("Ammo") departmental_flags = DEPARTMENTAL_FLAG_SECURITY /datum/design/pistolm9mm @@ -64,7 +64,7 @@ desc = "A gun magazine." id = "pistolm9mm" build_type = PROTOLATHE - materials = list(MAT_METAL = 16000) + materials = list(MAT_METAL = 80000) build_path = /obj/item/ammo_box/magazine/pistolm9mm - category = list("Weapons") + category = list("Ammo") departmental_flags = DEPARTMENTAL_FLAG_SECURITY From 14be1a02d92c3855247e2e8da87cb405006c1a2d Mon Sep 17 00:00:00 2001 From: izzy Date: Mon, 3 Sep 2018 11:52:04 -0500 Subject: [PATCH 09/29] adds better chat messages and sound, lowers power draw --- .../integrated_electronics/subtypes/manipulation.dm | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/modular_citadel/code/modules/integrated_electronics/subtypes/manipulation.dm b/modular_citadel/code/modules/integrated_electronics/subtypes/manipulation.dm index 12f0858304..79d229c757 100644 --- a/modular_citadel/code/modules/integrated_electronics/subtypes/manipulation.dm +++ b/modular_citadel/code/modules/integrated_electronics/subtypes/manipulation.dm @@ -9,7 +9,7 @@ outputs = list() activators = list("fire" = IC_PINTYPE_PULSE_IN) spawn_flags = IC_SPAWN_RESEARCH - power_draw_per_use = 800 + power_draw_per_use = 500 cooldown_per_use = 50 /obj/item/integrated_circuit/manipulation/electric_stimulator/do_work() @@ -21,9 +21,13 @@ if(M.getArousalLoss() >= 100 && ishuman(M) && M.has_dna()) var/mob/living/carbon/human/H = M var/orgasm_message = pick("A sharp pulse of electricity pushes you to orgasm!", "You feel a jolt of electricity force you into orgasm!") - to_chat(H, "[orgasm_message]") + H.visible_message("\The [assembly] electrodes shock [H]!", "[orgasm_message]") + playsound(src, "sound/effects/light_flicker.ogg", 30, 1) H.mob_climax(forced_climax=TRUE) else M.adjustArousalLoss(35) var/stimulate_message = pick("You feel a sharp warming tingle of electricity through your body!", "A burst of arousing electricity flows through your body!") - to_chat(M, "[stimulate_message]") + M.visible_message("\The [assembly] electrodes shock [M]!", "[stimulate_message]") + playsound(src, "sound/effects/light_flicker.ogg", 30, 1) + else + visible_message("\The [assembly] electrodes fail to shock [M]!") From 2bf5e6af58f2b28321c7c201ea042ec83e6ad76b Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Mon, 3 Sep 2018 10:35:47 -0700 Subject: [PATCH 10/29] Initial Commit --- code/__DEFINES/flags.dm | 1 + code/__HELPERS/type2type.dm | 22 +++ code/game/objects/items/devices/scanners.dm | 37 +++- .../atmospherics/gasmixtures/gas_mixture.dm | 7 +- .../atmospherics/gasmixtures/gas_types.dm | 6 +- .../atmospherics/gasmixtures/reactions.dm | 180 ++++++------------ .../projectile/energy/nuclear_particle.dm | 46 +++++ 7 files changed, 170 insertions(+), 129 deletions(-) create mode 100644 code/modules/projectiles/projectile/energy/nuclear_particle.dm diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index 3ed28c4693..6fff7e7017 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -71,6 +71,7 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define TESLA_MOB_STUN (1<<4) #define TESLA_DEFAULT_FLAGS ALL +#define TESLA_FUSION_FLAGS TESLA_OBJ_DAMAGE | TESLA_MOB_DAMAGE | TESLA_MOB_STUN //EMP protection #define EMP_PROTECT_SELF (1<<0) diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm index b474915e10..d6942f1c40 100644 --- a/code/__HELPERS/type2type.dm +++ b/code/__HELPERS/type2type.dm @@ -143,6 +143,17 @@ if(337.5 to 360) return NORTH +/proc/angle2dir_cardinal(angle) + switch(round(angle, 0.1)) + if(315.5 to 360, 0 to 45.5) + return NORTH + if(45.6 to 135.5) + return EAST + if(135.6 to 225.5) + return SOUTH + if(225.6 to 315.5) + return WEST + //returns the north-zero clockwise angle in degrees, given a direction /proc/dir2angle(D) switch(D) @@ -437,6 +448,17 @@ else . = max(0, min(255, 138.5177312231 * log(temp - 10) - 305.0447927307)) +/proc/fusionpower2text(power) //used when displaying fusion power on analyzers + switch(power) + if(0 to 5) + return "low" + if(5 to 20) + return "mid" + if(20 to 50) + return "high" + if(50 to INFINITY) + return "super" + /proc/color2hex(color) //web colors if(!color) return "#000000" diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 6acff297c9..c01aa04386 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -42,7 +42,7 @@ SLIME SCANNER /obj/item/t_scanner/proc/scan() t_ray_scan(loc) -/proc/t_ray_scan(mob/viewer, flick_time = 8, distance = 2) +/proc/t_ray_scan(mob/viewer, flick_time = 8, distance = 3) if(!ismob(viewer) || !viewer.client) return var/list/t_ray_images = list() @@ -328,6 +328,7 @@ SLIME SCANNER if(cyberimp_detect) to_chat(user, "Detected cybernetic modifications:") to_chat(user, "[cyberimp_detect]") + SEND_SIGNAL(M, COMSIG_NANITE_SCAN, user, FALSE) /proc/chemscan(mob/living/user, mob/living/M) if(istype(M)) @@ -527,6 +528,7 @@ SLIME SCANNER var/pressure = air_contents.return_pressure() var/volume = air_contents.return_volume() //could just do mixture.volume... but safety, I guess? var/temperature = air_contents.temperature + var/cached_scan_results = air_contents.analyzer_results if(total_moles > 0) to_chat(user, "Moles: [round(total_moles, 0.01)] mol") @@ -544,6 +546,12 @@ SLIME SCANNER to_chat(user, "This node is empty!") else to_chat(user, "[target] is empty!") + + if(cached_scan_results && cached_scan_results["fusion"]) //notify the user if a fusion reaction was detected + var/fusion_power = round(cached_scan_results["fusion"], 0.01) + var/tier = fusionpower2text(fusion_power) + to_chat(user, "Large amounts of free neutrons detected in the air indicate that a fusion reaction took place.") + to_chat(user, "Power of the last fusion reaction: [fusion_power]\n This power indicates it was a [tier]-tier fusion reaction.") return //slime scanner @@ -603,3 +611,30 @@ SLIME SCANNER to_chat(user, "Core mutation in progress: [T.effectmod]") to_chat(user, "Progress in core mutation: [T.applied] / [SLIME_EXTRACT_CROSSING_REQUIRED]") to_chat(user, "========================") + + +/obj/item/nanite_scanner + name = "nanite scanner" + icon = 'icons/obj/device.dmi' + icon_state = "nanite_scanner" + item_state = "nanite_remote" + lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' + desc = "A hand-held body scanner able to detect nanites and their programming." + flags_1 = CONDUCT_1 + item_flags = NOBLUDGEON + slot_flags = ITEM_SLOT_BELT + throwforce = 3 + w_class = WEIGHT_CLASS_TINY + throw_speed = 3 + throw_range = 7 + materials = list(MAT_METAL=200) + +/obj/item/nanite_scanner/attack(mob/living/M, mob/living/carbon/human/user) + user.visible_message("[user] has analyzed [M]'s nanites.") + + add_fingerprint(user) + + var/response = SEND_SIGNAL(M, COMSIG_NANITE_SCAN, user, TRUE) + if(!response) + to_chat(user, "No nanites detected in the subject.") diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm index f2bb51159c..6e01181447 100644 --- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm +++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm @@ -28,6 +28,7 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) var/volume = CELL_VOLUME //liters var/last_share = 0 var/list/reaction_results + var/list/analyzer_results //used for analyzer feedback - not initialized until its used /datum/gas_mixture/New(volume) gases = new @@ -427,14 +428,14 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) for(var/r in SSair.gas_reactions) var/datum/gas_reaction/reaction = r - var/list/min_reqs = reaction.min_requirements.Copy() + var/list/min_reqs = reaction.min_requirements if((min_reqs["TEMP"] && temp < min_reqs["TEMP"]) \ || (min_reqs["ENER"] && ener < min_reqs["ENER"])) continue - min_reqs -= "TEMP" - min_reqs -= "ENER" for(var/id in min_reqs) + if (id == "TEMP" || id == "ENER") + continue if(!cached_gases[id] || cached_gases[id][MOLES] < min_reqs[id]) continue reaction_loop //at this point, all minimum requirements for the reaction are satisfied. diff --git a/code/modules/atmospherics/gasmixtures/gas_types.dm b/code/modules/atmospherics/gasmixtures/gas_types.dm index 9d0b5dd8a4..0787871ca4 100644 --- a/code/modules/atmospherics/gasmixtures/gas_types.dm +++ b/code/modules/atmospherics/gasmixtures/gas_types.dm @@ -74,7 +74,7 @@ GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(/datum/gas/oxygen, /datum/g name = "Water Vapor" gas_overlay = "water_vapor" moles_visible = MOLES_GAS_VISIBLE - fusion_power = 4 + fusion_power = 8 /datum/gas/hypernoblium id = "nob" @@ -99,7 +99,7 @@ GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(/datum/gas/oxygen, /datum/g gas_overlay = "nitryl" moles_visible = MOLES_GAS_VISIBLE dangerous = TRUE - fusion_power = 10 + fusion_power = 15 /datum/gas/tritium id = "tritium" @@ -115,7 +115,7 @@ GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(/datum/gas/oxygen, /datum/g specific_heat = 20 name = "BZ" dangerous = TRUE - fusion_power = 15 + fusion_power = 8 /datum/gas/stimulum id = "stim" diff --git a/code/modules/atmospherics/gasmixtures/reactions.dm b/code/modules/atmospherics/gasmixtures/reactions.dm index 67836746fa..92a151623a 100644 --- a/code/modules/atmospherics/gasmixtures/reactions.dm +++ b/code/modules/atmospherics/gasmixtures/reactions.dm @@ -1,57 +1,4 @@ -//Plasma fire properties -#define OXYGEN_BURN_RATE_BASE 1.4 -#define PLASMA_BURN_RATE_DELTA 9 -#define PLASMA_MINIMUM_OXYGEN_NEEDED 2 -#define PLASMA_MINIMUM_OXYGEN_PLASMA_RATIO 30 -#define FIRE_CARBON_ENERGY_RELEASED 100000 //Amount of heat released per mole of burnt carbon into the tile -#define FIRE_HYDROGEN_ENERGY_RELEASED 280000 //Amount of heat released per mole of burnt hydrogen and/or tritium(hydrogen isotope) -#define FIRE_PLASMA_ENERGY_RELEASED 3000000 //Amount of heat released per mole of burnt plasma into the tile -//General assmos defines. -#define WATER_VAPOR_FREEZE 200 -#define NITRYL_FORMATION_ENERGY 100000 -#define TRITIUM_BURN_OXY_FACTOR 100 -#define TRITIUM_BURN_TRIT_FACTOR 10 -#define TRITIUM_BURN_RADIOACTIVITY_FACTOR 50000 //The neutrons gotta go somewhere. Completely arbitrary number. -#define TRITIUM_MINIMUM_RADIATION_ENERGY 0.1 //minimum 0.01 moles trit or 10 moles oxygen to start producing rads -#define SUPER_SATURATION_THRESHOLD 96 -#define STIMULUM_HEAT_SCALE 100000 -#define STIMULUM_FIRST_RISE 0.65 -#define STIMULUM_FIRST_DROP 0.065 -#define STIMULUM_SECOND_RISE 0.0009 -#define STIMULUM_ABSOLUTE_DROP 0.00000335 -#define REACTION_OPPRESSION_THRESHOLD 5 -#define NOBLIUM_FORMATION_ENERGY 2e9 //1 Mole of Noblium takes the planck energy to condense. -//Plasma fusion properties -#define FUSION_ENERGY_THRESHOLD 3e9 //Amount of energy it takes to start a fusion reaction -#define FUSION_TEMPERATURE_THRESHOLD 1000 //Temperature required to start a fusion reaction -#define FUSION_MOLE_THRESHOLD 250 //Mole count required (tritium/plasma) to start a fusion reaction -#define FUSION_RELEASE_ENERGY_SUPER 3e9 //Amount of energy released in the fusion process, super tier -#define FUSION_RELEASE_ENERGY_HIGH 1e9 //Amount of energy released in the fusion process, high tier -#define FUSION_RELEASE_ENERGY_MID 5e8 //Amount of energy released in the fusion process, mid tier -#define FUSION_RELEASE_ENERGY_LOW 1e8 //Amount of energy released in the fusion process, low tier -#define FUSION_MEDIATION_FACTOR 80 //Arbitrary -#define FUSION_SUPER_TIER 50 //anything above this is super tier -#define FUSION_HIGH_TIER 20 //anything above this and below 50 is high tier -#define FUSION_MID_TIER 5 //anything above this and below 20 is mid tier - below this is low tier, but that doesnt need a define -#define FUSION_ENERGY_DIVISOR_SUPER 25 -#define FUSION_ENERGY_DIVISOR_HIGH 20 -#define FUSION_ENERGY_DIVISOR_MID 10 -#define FUSION_ENERGY_DIVISOR_LOW 2 -#define FUSION_GAS_CREATION_FACTOR_SUPER 0.20 //stimulum and pluoxium - 40% in total -#define FUSION_GAS_CREATION_FACTOR_HIGH 0.60 //trit - one gas, so its higher than the other two - 60% in total -#define FUSION_GAS_CREATION_FACTOR_MID 0.45 //BZ and N2O - 90% in total -#define FUSION_GAS_CREATION_FACTOR_LOW 0.48 //O2 and CO2 - 96% in total -#define FUSION_MID_TIER_RAD_PROB_FACTOR 2 //probability of radpulse is power ratio * this for whatever tier -#define FUSION_LOW_TIER_RAD_PROB_FACTOR 5 -#define FUSION_EFFICIENCY_BASE 60 //used in the fusion efficiency calculations -#define FUSION_EFFICIENCY_DIVISOR 0.6 //ditto -#define FUSION_RADIATION_FACTOR 15000 //horizontal asymptote -#define FUSION_RADIATION_CONSTANT 30 //equation is form of (ax) / (x + b), where a = radiation factor and b = radiation constant (https://www.desmos.com/calculator/4i1f296phl) -#define FUSION_VOLUME_SUPER 100 //volume of the sound the fusion noises make -#define FUSION_VOLUME_HIGH 50 -#define FUSION_VOLUME_MID 25 -#define FUSION_VOLUME_LOW 10 - +//All defines used in reactions are located in ..\__DEFINES\reactions.dm /proc/init_gas_reactions() var/list/reaction_types = list() @@ -249,7 +196,10 @@ return cached_results["fire"] ? REACTING : NO_REACTION -//fusion: a terrible idea that was fun but broken. Now reworked to be less broken and more interesting. Again (and again). +//fusion: a terrible idea that was fun but broken. Now reworked to be less broken and more interesting. Again (and again, and again) +//Fusion Rework Counter: Please increment this if you make a major overhaul to this system again. +//5 reworks + /datum/gas_reaction/fusion exclude = FALSE priority = 2 @@ -268,6 +218,9 @@ /datum/gas_reaction/fusion/react(datum/gas_mixture/air, datum/holder) var/list/cached_gases = air.gases var/temperature = air.temperature + if(!air.analyzer_results) + air.analyzer_results = new + var/list/cached_scan_results = air.analyzer_results var/turf/open/location if (istype(holder,/datum/pipeline)) //Find the tile the reaction is occuring on, or a random part of the network if it's a pipenet. var/datum/pipeline/fusion_pipenet = holder @@ -280,70 +233,70 @@ var/mediation = FUSION_MEDIATION_FACTOR*(air.heat_capacity()-(cached_gases[/datum/gas/plasma][MOLES]*cached_gases[/datum/gas/plasma][GAS_META][META_GAS_SPECIFIC_HEAT]))/(air.total_moles()-cached_gases[/datum/gas/plasma][MOLES]) //This is the average specific heat of the mixture,not including plasma. - var/moles_excluding_plasma = air.total_moles() - cached_gases[/datum/gas/plasma][MOLES] - var/plasma_differential = (cached_gases[/datum/gas/plasma][MOLES] - moles_excluding_plasma) / air.total_moles() + var/gases_fused = air.total_moles() - cached_gases[/datum/gas/plasma][MOLES] + var/plasma_differential = (cached_gases[/datum/gas/plasma][MOLES] - gases_fused) / air.total_moles() var/reaction_efficiency = FUSION_EFFICIENCY_BASE ** -((plasma_differential ** 2) / FUSION_EFFICIENCY_DIVISOR) //https://www.desmos.com/calculator/6jjx3vdrvx - var/gases_fused = air.total_moles() var/gas_power = 0 - for (var/id in cached_gases) - gas_power += reaction_efficiency * (cached_gases[id][GAS_META][META_GAS_FUSION_POWER]*cached_gases[id][MOLES]) + for (var/gas_id in cached_gases) + gas_power += reaction_efficiency * (cached_gases[gas_id][GAS_META][META_GAS_FUSION_POWER]*cached_gases[gas_id][MOLES]) var/power_ratio = gas_power/mediation + cached_scan_results[id] = power_ratio //used for analyzer feedback + + for (var/gas_id in cached_gases) //and now we fuse + cached_gases[gas_id][MOLES] = 0 + var/radiation_power = (FUSION_RADIATION_FACTOR * power_ratio) / (power_ratio + FUSION_RADIATION_CONSTANT) //https://www.desmos.com/calculator/4i1f296phl + var/zap_power = ((FUSION_ZAP_POWER_ASYMPTOTE * power_ratio) / (power_ratio + FUSION_ZAP_POWER_CONSTANT)) + FUSION_ZAP_POWER_BASE //https://www.desmos.com/calculator/n0zkdpxnrr + var/do_explosion = FALSE + var/zap_range //these ones are set later + var/fusion_prepare_to_die_edition_rng - if (power_ratio > FUSION_SUPER_TIER) //power ratio 50+: SUPER TIER. The gases become so energized that they fuse into stimulum and pluoxium, which is pretty nice! IF you can salvage them, which is going to be hard because this reaction is ridiculously dangerous. + if (power_ratio > FUSION_SUPER_TIER_THRESHOLD) //power ratio 50+: SUPER TIER. The gases become so energized that they fuse into a ton of tritium, which is pretty nice! Until you consider the fact that everything just exploded, the canister is probably going to break and you're irradiated. reaction_energy += gases_fused * FUSION_RELEASE_ENERGY_SUPER * (power_ratio / FUSION_ENERGY_DIVISOR_SUPER) - for (var/id in cached_gases) - cached_gases[id][MOLES] = 0 - air.assert_gases(/datum/gas/stimulum,/datum/gas/pluoxium) - cached_gases[/datum/gas/stimulum][MOLES] += gases_fused * FUSION_GAS_CREATION_FACTOR_SUPER //60% of the gas is converted to energy, 40% to stimulum and pluoxium - cached_gases[/datum/gas/pluoxium][MOLES] += gases_fused * FUSION_GAS_CREATION_FACTOR_SUPER - if (location) //It's going to happen regardless of whether you want it to or not - radiation_pulse(location, radiation_power * 2) - explosion(location,0,0,10,power_ratio,TRUE,TRUE)//A decent explosion with a huge shockwave. People WILL know you're doing fusion. - playsound(location, "sound/effects/supermatter.ogg", FUSION_VOLUME_SUPER, 0) + cached_gases[/datum/gas/tritium][MOLES] += gases_fused * FUSION_GAS_CREATION_FACTOR_TRITIUM //60% of the gas is converted to energy, 40% to trit + fusion_prepare_to_die_edition_rng = 100 //Wait a minute.. + do_explosion = TRUE + zap_range = FUSION_ZAP_RANGE_SUPER - else if (power_ratio > FUSION_HIGH_TIER) //power ratio 20-50; High tier. Fuses into one big atom which then turns to tritium instantly. Very dangerous, but super cool. + else if (power_ratio > FUSION_HIGH_TIER_THRESHOLD) //power ratio 20-50; High tier. The reaction is so energized that it fuses into a small amount of stimulum, and some pluoxium. Very dangerous, but super cool and super useful. reaction_energy += gases_fused * FUSION_RELEASE_ENERGY_HIGH * (power_ratio / FUSION_ENERGY_DIVISOR_HIGH) - for (var/id in cached_gases) - cached_gases[id][MOLES] = 0 - cached_gases[/datum/gas/tritium][MOLES] += gases_fused * FUSION_GAS_CREATION_FACTOR_HIGH //40% of the gas is converted to energy, 60% to tritium - if (location) - if(prob(power_ratio)) //You really don't want this to happen. - radiation_pulse(location, radiation_power) - explosion(location,0,0,3,power_ratio * 0.5,TRUE,TRUE)//A tiny explosion with a large shockwave. People will know you're doing fusion. - playsound(location, "sound/effects/supermatter.ogg", FUSION_VOLUME_HIGH, 0) - else - playsound(location, "sound/effects/phasein.ogg", FUSION_VOLUME_HIGH, 0) + air.assert_gases(/datum/gas/stimulum, /datum/gas/pluoxium) + cached_gases[/datum/gas/stimulum][MOLES] += gases_fused * FUSION_GAS_CREATION_FACTOR_STIM //40% of the gas is converted to energy, 60% to stim and pluox + cached_gases[/datum/gas/pluoxium][MOLES] += gases_fused * FUSION_GAS_CREATION_FACTOR_PLUOX + fusion_prepare_to_die_edition_rng = power_ratio //Now we're getting into dangerous territory + do_explosion = TRUE + zap_range = FUSION_ZAP_RANGE_HIGH - else if (power_ratio > FUSION_MID_TIER) //power_ratio 5 to 20; Mediation is overpowered, fusion reaction starts to break down. + else if (power_ratio > FUSION_MID_TIER_THRESHOLD) //power_ratio 5 to 20; Mediation is overpowered, fusion reaction starts to break down. reaction_energy += gases_fused * FUSION_RELEASE_ENERGY_MID * (power_ratio / FUSION_ENERGY_DIVISOR_MID) - for (var/id in cached_gases) - cached_gases[id][MOLES] = 0 - air.assert_gases(/datum/gas/bz,/datum/gas/nitrous_oxide) - cached_gases[/datum/gas/bz][MOLES] += gases_fused * FUSION_GAS_CREATION_FACTOR_MID //10% of the gas is converted to energy, 90% to BZ and N2O - cached_gases[/datum/gas/nitrous_oxide][MOLES] += gases_fused * FUSION_GAS_CREATION_FACTOR_MID - if (location) - if(prob(power_ratio * FUSION_MID_TIER_RAD_PROB_FACTOR)) //Still weak, but don't stand next to it unprotected - radiation_pulse(location, radiation_power * 0.5) - playsound(location, "sound/effects/supermatter.ogg", FUSION_VOLUME_MID, 0) - else - playsound(location, "sound/effects/phasein.ogg", FUSION_VOLUME_MID, 0) + air.assert_gases(/datum/gas/nitryl,/datum/gas/nitrous_oxide) + cached_gases[/datum/gas/nitryl][MOLES] += gases_fused * FUSION_GAS_CREATION_FACTOR_NITRYL //20% of the gas is converted to energy, 80% to nitryl and N2O + cached_gases[/datum/gas/nitrous_oxide][MOLES] += gases_fused * FUSION_GAS_CREATION_FACTOR_N2O + fusion_prepare_to_die_edition_rng = power_ratio * FUSION_MID_TIER_RAD_PROB_FACTOR //Still unlikely, but don't stand next to the reaction unprotected + zap_range = FUSION_ZAP_RANGE_MID else //power ratio 0 to 5; Gas power is overpowered. Fusion isn't nearly as powerful. reaction_energy += gases_fused * FUSION_RELEASE_ENERGY_LOW * (power_ratio / FUSION_ENERGY_DIVISOR_LOW) - for (var/gas in cached_gases) - cached_gases[gas][MOLES] = 0 - air.assert_gases(/datum/gas/oxygen, /datum/gas/carbon_dioxide) - cached_gases[/datum/gas/oxygen][MOLES] += gases_fused * FUSION_GAS_CREATION_FACTOR_LOW //4% of the gas is converted to energy, 94% to oxygen and CO2 - cached_gases[/datum/gas/carbon_dioxide][MOLES] += gases_fused * FUSION_GAS_CREATION_FACTOR_LOW - if (location) - if(prob(power_ratio * FUSION_LOW_TIER_RAD_PROB_FACTOR)) //Weak, but still something to look out for - radiation_pulse(location, radiation_power * 0.25) - playsound(location, "sound/effects/supermatter.ogg", FUSION_VOLUME_LOW, 0) - else - playsound(location, "sound/effects/phasein.ogg", FUSION_VOLUME_LOW, 0) + air.assert_gases(/datum/gas/bz, /datum/gas/carbon_dioxide) + cached_gases[/datum/gas/bz][MOLES] += gases_fused * FUSION_GAS_CREATION_FACTOR_BZ //10% of the gas is converted to energy, 90% to BZ and CO2 + cached_gases[/datum/gas/carbon_dioxide][MOLES] += gases_fused * FUSION_GAS_CREATION_FACTOR_CO2 + fusion_prepare_to_die_edition_rng = power_ratio * FUSION_LOW_TIER_RAD_PROB_FACTOR //Low, but still something to look out for + zap_range = FUSION_ZAP_RANGE_LOW + + //All the deadly consequences of fusion, consolidated for your viewing pleasure + if (location) + if(prob(fusion_prepare_to_die_edition_rng)) //Some.. permanent effects + if(do_explosion) + explosion(location, 0, 0, 5, power_ratio, TRUE, TRUE) //large shockwave, the actual radius is quite small - people will recognize that you're doing fusion + radiation_pulse(location, radiation_power) //You mean causing a super-tier fusion reaction in the halls is a bad idea? + playsound(location, 'sound/effects/supermatter.ogg', 100, 0) + else + playsound(location, 'sound/effects/phasein.ogg', 75, 0) + //These will always happen, so be prepared + tesla_zap(location, zap_range, zap_power, TESLA_FUSION_FLAGS) //larpers beware + location.fire_nuclear_particles(power_ratio) //see code/modules/projectile/energy/nuclear_particle.dm if(reaction_energy > 0) var/new_heat_capacity = air.heat_capacity() @@ -480,21 +433,4 @@ var/new_heat_capacity = air.heat_capacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) air.temperature = max(((air.temperature*old_heat_capacity - energy_taken)/new_heat_capacity),TCMB) - -#undef OXYGEN_BURN_RATE_BASE -#undef PLASMA_BURN_RATE_DELTA -#undef PLASMA_MINIMUM_OXYGEN_NEEDED -#undef PLASMA_MINIMUM_OXYGEN_PLASMA_RATIO -#undef FIRE_CARBON_ENERGY_RELEASED -#undef FIRE_PLASMA_ENERGY_RELEASED -#undef WATER_VAPOR_FREEZE -#undef NITRYL_FORMATION_ENERGY -#undef TRITIUM_BURN_OXY_FACTOR -#undef SUPER_SATURATION_THRESHOLD -#undef STIMULUM_HEAT_SCALE -#undef STIMULUM_FIRST_RISE -#undef STIMULUM_FIRST_DROP -#undef STIMULUM_SECOND_RISE -#undef STIMULUM_ABSOLUTE_DROP -#undef REACTION_OPPRESSION_THRESHOLD -#undef NOBLIUM_FORMATION_ENERGY + \ No newline at end of file diff --git a/code/modules/projectiles/projectile/energy/nuclear_particle.dm b/code/modules/projectiles/projectile/energy/nuclear_particle.dm new file mode 100644 index 0000000000..1753587ad3 --- /dev/null +++ b/code/modules/projectiles/projectile/energy/nuclear_particle.dm @@ -0,0 +1,46 @@ +//Nuclear particle projectile - a deadly side effect of fusion +/obj/item/projectile/energy/nuclear_particle + name = "nuclear particle" + icon_state = "nuclear_particle" + pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE + damage = 20 + damage_type = TOX + irradiate = 2500 //enough to knockdown and induce vomiting + speed = 0.4 + hitsound = 'sound/weapons/emitter2.ogg' + impact_type = /obj/effect/projectile/impact/xray + var/static/list/particle_colors = list( + "red" = "#FF0000", + "blue" = "#00FF00", + "green" = "#0000FF", + "yellow" = "#FFFF00", + "cyan" = "#00FFFF", + "purple" = "#FF00FF" + ) + +/obj/item/projectile/energy/nuclear_particle/Initialize() + . = ..() + //Random color time! + var/our_color = pick(particle_colors) + add_atom_colour(particle_colors[our_color], FIXED_COLOUR_PRIORITY) + set_light(4, 3, particle_colors[our_color]) //Range of 4, brightness of 3 - Same range as a flashlight + +/atom/proc/fire_nuclear_particles(power_ratio) //used by fusion to fire random # of nuclear particles - power ratio determines about how many are fired + var/random_particles = rand(3,6) + var/particles_to_fire + var/particles_fired + switch(power_ratio) //multiply random_particles * factor for whatever tier + if(0 to FUSION_MID_TIER_THRESHOLD) + particles_to_fire = random_particles * FUSION_PARTICLE_FACTOR_LOW + if(FUSION_MID_TIER_THRESHOLD to FUSION_HIGH_TIER_THRESHOLD) + particles_to_fire = random_particles * FUSION_PARTICLE_FACTOR_MID + if(FUSION_HIGH_TIER_THRESHOLD to FUSION_SUPER_TIER_THRESHOLD) + particles_to_fire = random_particles * FUSION_PARTICLE_FACTOR_HIGH + if(FUSION_SUPER_TIER_THRESHOLD to INFINITY) + particles_to_fire = random_particles * FUSION_PARTICLE_FACTOR_SUPER + while(particles_to_fire) + particles_fired++ + var/angle = rand(0,360) + var/obj/item/projectile/energy/nuclear_particle/P = new /obj/item/projectile/energy/nuclear_particle(src) + addtimer(CALLBACK(P, /obj/item/projectile.proc/fire, angle), particles_fired) //multiply particles fired * delay so the particles end up stagnated (once every decisecond) + particles_to_fire-- \ No newline at end of file From e10c477847221539e634003954851921d1ff0bc4 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Mon, 3 Sep 2018 10:36:44 -0700 Subject: [PATCH 11/29] Stuff --- code/__DEFINES/reactions.dm | 65 +++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 code/__DEFINES/reactions.dm diff --git a/code/__DEFINES/reactions.dm b/code/__DEFINES/reactions.dm new file mode 100644 index 0000000000..b72a14468f --- /dev/null +++ b/code/__DEFINES/reactions.dm @@ -0,0 +1,65 @@ +//Defines used in atmos gas reactions. Used to be located in ..\modules\atmospherics\gasmixtures\reactions.dm, but were moved here because fusion added so fucking many. + +//Plasma fire properties +#define OXYGEN_BURN_RATE_BASE 1.4 +#define PLASMA_BURN_RATE_DELTA 9 +#define PLASMA_MINIMUM_OXYGEN_NEEDED 2 +#define PLASMA_MINIMUM_OXYGEN_PLASMA_RATIO 30 +#define FIRE_CARBON_ENERGY_RELEASED 100000 //Amount of heat released per mole of burnt carbon into the tile +#define FIRE_HYDROGEN_ENERGY_RELEASED 280000 //Amount of heat released per mole of burnt hydrogen and/or tritium(hydrogen isotope) +#define FIRE_PLASMA_ENERGY_RELEASED 3000000 //Amount of heat released per mole of burnt plasma into the tile +//General assmos defines. +#define WATER_VAPOR_FREEZE 200 +#define NITRYL_FORMATION_ENERGY 100000 +#define TRITIUM_BURN_OXY_FACTOR 100 +#define TRITIUM_BURN_TRIT_FACTOR 10 +#define TRITIUM_BURN_RADIOACTIVITY_FACTOR 50000 //The neutrons gotta go somewhere. Completely arbitrary number. +#define TRITIUM_MINIMUM_RADIATION_ENERGY 0.1 //minimum 0.01 moles trit or 10 moles oxygen to start producing rads +#define SUPER_SATURATION_THRESHOLD 96 +#define STIMULUM_HEAT_SCALE 100000 +#define STIMULUM_FIRST_RISE 0.65 +#define STIMULUM_FIRST_DROP 0.065 +#define STIMULUM_SECOND_RISE 0.0009 +#define STIMULUM_ABSOLUTE_DROP 0.00000335 +#define REACTION_OPPRESSION_THRESHOLD 5 +#define NOBLIUM_FORMATION_ENERGY 2e9 //1 Mole of Noblium takes the planck energy to condense. +//Plasma fusion properties +#define FUSION_ENERGY_THRESHOLD 3e9 //Amount of energy it takes to start a fusion reaction +#define FUSION_TEMPERATURE_THRESHOLD 1000 //Temperature required to start a fusion reaction +#define FUSION_MOLE_THRESHOLD 250 //Mole count required (tritium/plasma) to start a fusion reaction +#define FUSION_RELEASE_ENERGY_SUPER 3e9 //Amount of energy released in the fusion process, super tier +#define FUSION_RELEASE_ENERGY_HIGH 1e9 //Amount of energy released in the fusion process, high tier +#define FUSION_RELEASE_ENERGY_MID 5e8 //Amount of energy released in the fusion process, mid tier +#define FUSION_RELEASE_ENERGY_LOW 1e8 //Amount of energy released in the fusion process, low tier +#define FUSION_MEDIATION_FACTOR 80 //Arbitrary +#define FUSION_SUPER_TIER_THRESHOLD 50 //anything above this is super tier +#define FUSION_HIGH_TIER_THRESHOLD 20 //anything above this and below 50 is high tier +#define FUSION_MID_TIER_THRESHOLD 5 //anything above this and below 20 is mid tier - below this is low tier, but that doesnt need a define +#define FUSION_ENERGY_DIVISOR_SUPER 25 //power_ratio is divided by this during energy calculations +#define FUSION_ENERGY_DIVISOR_HIGH 20 +#define FUSION_ENERGY_DIVISOR_MID 10 +#define FUSION_ENERGY_DIVISOR_LOW 2 +#define FUSION_GAS_CREATION_FACTOR_TRITIUM 0.40 //trit - one gas rather than two, so think about that when calculating stuff - 40% in total +#define FUSION_GAS_CREATION_FACTOR_STIM 0.05 //stim percentage creation from high tier - 5%, 60% in total with pluox +#define FUSION_GAS_CREATION_FACTOR_PLUOX 0.55 //pluox percentage creation from high tier - 55%, 60% in total with stim +#define FUSION_GAS_CREATION_FACTOR_NITRYL 0.20 //nitryl and N2O - 80% in total +#define FUSION_GAS_CREATION_FACTOR_N2O 0.60 //nitryl and N2O - 80% in total +#define FUSION_GAS_CREATION_FACTOR_BZ 0.05 //BZ - 5% - 90% in total with CO2 +#define FUSION_GAS_CREATION_FACTOR_CO2 0.85 //CO2 - 85% - 90% in total with BZ +#define FUSION_MID_TIER_RAD_PROB_FACTOR 2 //probability of radpulse is power ratio * this for whatever tier +#define FUSION_LOW_TIER_RAD_PROB_FACTOR 5 +#define FUSION_EFFICIENCY_BASE 60 //used in the fusion efficiency calculations +#define FUSION_EFFICIENCY_DIVISOR 0.6 //ditto +#define FUSION_RADIATION_FACTOR 15000 //horizontal asymptote +#define FUSION_RADIATION_CONSTANT 30 //equation is form of (ax) / (x + b), where a = radiation factor and b = radiation constant and x = power ratio (https://www.desmos.com/calculator/4i1f296phl) +#define FUSION_ZAP_POWER_ASYMPTOTE 50000 //maximum value - not enough to instacrit but it'll still hurt like shit +#define FUSION_ZAP_POWER_CONSTANT 75 //equation is of from [ax / (x + b)] + c, where a = zap power asymptote, b = zap power constant, c = zap power base and x = power ratio +#define FUSION_ZAP_POWER_BASE 1000 //(https://www.desmos.com/calculator/vvbmhf4unm) +#define FUSION_ZAP_RANGE_SUPER 9 //range of the tesla zaps that occur from fusion +#define FUSION_ZAP_RANGE_HIGH 7 +#define FUSION_ZAP_RANGE_MID 5 +#define FUSION_ZAP_RANGE_LOW 3 +#define FUSION_PARTICLE_FACTOR_SUPER 4 //# of particles fired out is equal to rand(3,6) * this for whatever tier +#define FUSION_PARTICLE_FACTOR_HIGH 3 +#define FUSION_PARTICLE_FACTOR_MID 2 +#define FUSION_PARTICLE_FACTOR_LOW 1 From 0ea74e0198b199d44d7c0ea117d9a1151d9c6a71 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Mon, 3 Sep 2018 10:39:54 -0700 Subject: [PATCH 12/29] LETS GOOO --- icons/obj/projectiles.dmi | Bin 116665 -> 116854 bytes tgstation.dme | 3 ++- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/icons/obj/projectiles.dmi b/icons/obj/projectiles.dmi index 84e9f78adde3dbd9dd6434e89a2ee6b7df7679d2..93e42e48467dad8ef911c3b90f5af4bd901917e5 100644 GIT binary patch delta 1344 zcmV-G1;6^aj|cXU2aqHIy|E>w0wB&GND~zyuynvdtMtjd7te1`;_3CJ`UiiJIJiO8 z=cR++0=M4+0gu3cyv9++aU6d?GrK#}ttMMdx*<&~Qvb5cLjV8-%t=H+R1nGpFDWPp zCV1AP^%%W~7f(Hjf=BVti(V|nLoRAt{{aQd2CoUC?6kB(OHKMCBsNVu-E8*9JRWv7 zG%5Mfn52&Lc|k}*mVNe=58vl`=KEzfb}(OBc;MjvY-ullEwi-xPvX1ER~zn8oErPk z`1B6sIndY3z)udj!wqWJBj%fn%${fv8Gt+oC^3YC!xDG!=p2ss@$y`O;^9SRzBM@4 z!2AmK)-p?Xn=G3Pm9v}fkGwzjNxsD3doHv3}OyMpXI9RyGYl=!8&_zN0U2?0QV|cY}MZ#=XmR9=}@KunVw_sMerpPtClwjR$f=kablV(~|V^NWFhR+Gl%N6g27xmY>3VE`nRsPi1< zHw~u$5JNvSsNJd)U4Ovb>yMZ(IJoq4oP)f`A~V#9l1UJTLk!+8P;~Bd`*R2Ps(}S? zZq|wJt?Y%_F!ov5()L~QLp_ww$F%zmX8szN*7WgwiPyNtOjOLb45Q`#3rt>m7l4mG-r4%!e4V`6TNfwi z=1)ECXUKxF#|FBJi0r3yOf3`<5!q!5KoJpt$s`4!h=^p80#HOmGD!g_A|jcj02C3C zOi}=fh)5=F*bH0#d;0qNY%n~&XhcM0QwqS8=>}Xk2%*!W&96>> z5Cp-t+qH>^WSzD^Q^xOBeo6Rsw?9Qh2u-f{pq9_8uT1zgMTMa`Iku*>Rm_lK7f{`HT z{2Yd?eK>w^AA)GLTC0^`x7xGT(r7ejwOY8YyQk}mi0l?sfGN^_2tF7d@0|C4Jzo9o z(^VMPb!jvjG@DJ@?Kak0;y7kyWd+akwErn0si6umCAw|Ux-l07!D<+Gjab{+8r@sQ z7_$;ZQNeXxthKaSEsDjW!cRm}MHOI5EG#TM5is4>XsZ`u_CEXoa9!8)ec$Bsc~dA9 zjKWVu(nu9xN==)SjMyoHB=r1$Y84*q4kIEWn^OR$j9;A~1bmVUFm`J7B1~AFV8l)- z1Vu!)K>?T|la(`Oba?!UXAOex_vAcKH@dw0s)V} zfBdvv$8j8ge!g9yFdaUO5AYw*#HGY5jnVYGWiw%!urX2u%1SA8?bpNi`z63aTM)&s-`68) zprPsKd*YS%_x<_4KP=sO73u`QVWpM6-`5C+iTT~u3 z*fP_FskZk=-kJC?Imqza3C_F;&ddH#?N;v}{4!Ew#hfKegPPZ%YI-?Gf+PbBe>2E1 zi~L5K%btPTHP*fX9vPf_26Ly%pGz$oW{``mslrG9!vRC`PwMvI*^>&tgKHl=>+dip z6@CZS|McKle}_@!C!MqnK=4DTpY+A&xHR9Q@v9+msmAK9I*(r}^ZQVO9-3@3gr!A; z8tWwKBgMI@N7L)&*{vkK_cmGkf8OByWZ+4Iom-ofTY#A<+&DA#7x)Tz#Iu>9&K#p?sjhCb z;Q_7b!c^N`Mek00ob_m?5+p~?k^QbkGh;C2yWHG2$MXeVVU_zNNYZ4Rf2Q9LtqqV} zs8P9QaGn^Be`l$}977>X8Re%vB_FAyjiJ^m*m(k)eh5#*Ngvhq}eFC2}wyCG&zMJOU7?WqSCQAIOG&YQyqp_eL^V9#_I5fN!m0T?l< zQXUsb5p00*=5{y2xTQQfZ%!d7BGLr~V1&#TuAA}E$)_59Q#Sk=^aFJql88uW3c!d_ zxQU3I3~hoD5s_F@0E&o6EGYm*L?o6JfFdFiOA0^{5s4)QpooaXk^)dfL}KYLCj~TP T)1=r&00000NkvXXu0mjfjVC0Z diff --git a/tgstation.dme b/tgstation.dme index 2e2ff0408b..5c62d256a2 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -2347,6 +2347,7 @@ #include "code\modules\projectiles\projectile\energy\ebow.dm" #include "code\modules\projectiles\projectile\energy\misc.dm" #include "code\modules\projectiles\projectile\energy\net_snare.dm" +#include "code\modules\projectiles\projectile\energy\nuclear_particle.dm" #include "code\modules\projectiles\projectile\energy\stun.dm" #include "code\modules\projectiles\projectile\energy\tesla.dm" #include "code\modules\projectiles\projectile\magic\spellcard.dm" @@ -2855,9 +2856,9 @@ #include "modular_citadel\code\modules\projectiles\ammunition\caseless.dm" #include "modular_citadel\code\modules\projectiles\ammunition\ballistic\smg\smg.dm" #include "modular_citadel\code\modules\projectiles\boxes_magazines\ammo_boxes.dm" +#include "modular_citadel\code\modules\projectiles\boxes_magazines\external\pistol.dm" #include "modular_citadel\code\modules\projectiles\boxes_magazines\external\smg\smg.dm" #include "modular_citadel\code\modules\projectiles\bullets\bullets\smg.dm" -#include "modular_citadel\code\modules\projectiles\boxes_magazines\external\pistol.dm" #include "modular_citadel\code\modules\projectiles\guns\pumpenergy.dm" #include "modular_citadel\code\modules\projectiles\guns\toys.dm" #include "modular_citadel\code\modules\projectiles\guns\ballistic\flechette.dm" From f8a0ac8574476937f3b6e7ae0ae0cd50aad71a26 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Mon, 3 Sep 2018 10:43:49 -0700 Subject: [PATCH 13/29] work damnit, work. --- code/game/objects/items/devices/scanners.dm | 8 ++++---- code/modules/atmospherics/gasmixtures/reactions.dm | 3 +-- tgstation.dme | 1 + 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index c01aa04386..7db06336fa 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -328,7 +328,7 @@ SLIME SCANNER if(cyberimp_detect) to_chat(user, "Detected cybernetic modifications:") to_chat(user, "[cyberimp_detect]") - SEND_SIGNAL(M, COMSIG_NANITE_SCAN, user, FALSE) + //SEND_SIGNAL(M, COMSIG_NANITE_SCAN, user, FALSE) /proc/chemscan(mob/living/user, mob/living/M) if(istype(M)) @@ -635,6 +635,6 @@ SLIME SCANNER add_fingerprint(user) - var/response = SEND_SIGNAL(M, COMSIG_NANITE_SCAN, user, TRUE) - if(!response) - to_chat(user, "No nanites detected in the subject.") + //var/response = SEND_SIGNAL(M, COMSIG_NANITE_SCAN, user, TRUE) + //if(!response) + // to_chat(user, "No nanites detected in the subject.") diff --git a/code/modules/atmospherics/gasmixtures/reactions.dm b/code/modules/atmospherics/gasmixtures/reactions.dm index 92a151623a..0524783b05 100644 --- a/code/modules/atmospherics/gasmixtures/reactions.dm +++ b/code/modules/atmospherics/gasmixtures/reactions.dm @@ -257,7 +257,7 @@ reaction_energy += gases_fused * FUSION_RELEASE_ENERGY_SUPER * (power_ratio / FUSION_ENERGY_DIVISOR_SUPER) cached_gases[/datum/gas/tritium][MOLES] += gases_fused * FUSION_GAS_CREATION_FACTOR_TRITIUM //60% of the gas is converted to energy, 40% to trit fusion_prepare_to_die_edition_rng = 100 //Wait a minute.. - do_explosion = TRUE + do_explosion = TRUE zap_range = FUSION_ZAP_RANGE_SUPER else if (power_ratio > FUSION_HIGH_TIER_THRESHOLD) //power ratio 20-50; High tier. The reaction is so energized that it fuses into a small amount of stimulum, and some pluoxium. Very dangerous, but super cool and super useful. @@ -433,4 +433,3 @@ var/new_heat_capacity = air.heat_capacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) air.temperature = max(((air.temperature*old_heat_capacity - energy_taken)/new_heat_capacity),TCMB) - \ No newline at end of file diff --git a/tgstation.dme b/tgstation.dme index 5c62d256a2..2dd31936d3 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -69,6 +69,7 @@ #include "code\__DEFINES\qdel.dm" #include "code\__DEFINES\radiation.dm" #include "code\__DEFINES\radio.dm" +#include "code\__DEFINES\reactions.dm" #include "code\__DEFINES\reagents.dm" #include "code\__DEFINES\reagents_specific_heat.dm" #include "code\__DEFINES\research.dm" From df1018949deb0817db756f3c8e92f26b828b3d05 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 6 Sep 2018 12:31:40 -0500 Subject: [PATCH 14/29] Automatic changelog generation for PR #7516 [ci skip] --- html/changelogs/AutoChangeLog-pr-7516.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7516.yml diff --git a/html/changelogs/AutoChangeLog-pr-7516.yml b/html/changelogs/AutoChangeLog-pr-7516.yml new file mode 100644 index 0000000000..9152511d58 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7516.yml @@ -0,0 +1,4 @@ +author: "izzyinbox" +delete-after: True +changes: + - rscadd: "Added an integrated circuit part that interacts with the arousal system" From 55db1281990a0eb689b68818d2623bc949680ae7 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Fri, 7 Sep 2018 08:23:42 -0400 Subject: [PATCH 15/29] [EXPERIMENTAL] Let's give active turf processing it's own bloody subsystem. With blackjack! And hookers! (#7509) * HOW ABOUT WE TAKE THE AIR PROCESSING AND MOVE IT OVER THERE!!!! * makes gas reactions happen in the original atmos subsystem so gas reactions run at the original atmos speed --- code/__DEFINES/subsystems.dm | 2 + code/controllers/subsystem/air.dm | 64 +++++++++++-------- code/controllers/subsystem/air_turfs.dm | 27 ++++++++ .../environmental/LINDA_turf_tile.dm | 13 +++- tgstation.dme | 1 + 5 files changed, 78 insertions(+), 29 deletions(-) create mode 100644 code/controllers/subsystem/air_turfs.dm diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 4ef681d5da..06a70a4f49 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -67,6 +67,7 @@ #define INIT_ORDER_TIMER 1 #define INIT_ORDER_DEFAULT 0 #define INIT_ORDER_AIR -1 +#define INIT_ORDER_AIR_TURFS -2 #define INIT_ORDER_MINIMAP -3 #define INIT_ORDER_ASSETS -4 #define INIT_ORDER_ICON_SMOOTHING -5 @@ -100,6 +101,7 @@ #define FIRE_PRIORITY_OBJ 40 #define FIRE_PRIORITY_ACID 40 #define FIRE_PRIOTITY_BURNING 40 +#define FIRE_PRIORITY_AIR_TURFS 40 #define FIRE_PRIORITY_DEFAULT 50 #define FIRE_PRIORITY_PARALLAX 65 #define FIRE_PRIORITY_FLIGHTPACKS 80 diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm index 17c04982fb..464a5d305f 100644 --- a/code/controllers/subsystem/air.dm +++ b/code/controllers/subsystem/air.dm @@ -1,6 +1,6 @@ #define SSAIR_PIPENETS 1 #define SSAIR_ATMOSMACHINERY 2 -#define SSAIR_ACTIVETURFS 3 +#define SSAIR_REACTQUEUE 3 #define SSAIR_EXCITEDGROUPS 4 #define SSAIR_HIGHPRESSURE 5 #define SSAIR_HOTSPOTS 6 @@ -14,7 +14,7 @@ SUBSYSTEM_DEF(air) flags = SS_BACKGROUND runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME - var/cost_turfs = 0 + var/cost_turf_reactions = 0 var/cost_groups = 0 var/cost_highpressure = 0 var/cost_hotspots = 0 @@ -24,6 +24,7 @@ SUBSYSTEM_DEF(air) var/list/excited_groups = list() var/list/active_turfs = list() + var/list/turf_react_queue = list() var/list/hotspots = list() var/list/networks = list() var/list/obj/machinery/atmos_machinery = list() @@ -45,7 +46,7 @@ SUBSYSTEM_DEF(air) /datum/controller/subsystem/air/stat_entry(msg) msg += "C:{" - msg += "AT:[round(cost_turfs,1)]|" + msg += "RQ:[round(cost_turf_reactions,1)]|" msg += "EG:[round(cost_groups,1)]|" msg += "HP:[round(cost_highpressure,1)]|" msg += "HS:[round(cost_hotspots,1)]|" @@ -54,6 +55,7 @@ SUBSYSTEM_DEF(air) msg += "AM:[round(cost_atmos_machinery,1)]" msg += "} " msg += "AT:[active_turfs.len]|" + msg += "RQ:[turf_react_queue.len]|" msg += "EG:[excited_groups.len]|" msg += "HS:[hotspots.len]|" msg += "PN:[networks.len]|" @@ -90,12 +92,12 @@ SUBSYSTEM_DEF(air) if(state != SS_RUNNING) return resumed = 0 - currentpart = SSAIR_ACTIVETURFS + currentpart = SSAIR_REACTQUEUE - if(currentpart == SSAIR_ACTIVETURFS) + if(currentpart == SSAIR_REACTQUEUE) timer = TICK_USAGE_REAL - process_active_turfs(resumed) - cost_turfs = MC_AVERAGE(cost_turfs, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) + process_react_queue(resumed) + cost_turf_reactions = MC_AVERAGE(cost_turf_reactions, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) if(state != SS_RUNNING) return resumed = 0 @@ -170,6 +172,19 @@ SUBSYSTEM_DEF(air) return +/datum/controller/subsystem/air/proc/process_react_queue(resumed = 0) + if(!resumed) + src.currentrun = turf_react_queue.Copy() + var/list/currentrun = src.currentrun + while(currentrun.len) + var/turf/open/T = currentrun[currentrun.len] + currentrun.len-- + if(T) + T.process_cell_reaction() + if(MC_TICK_CHECK) + return + + /datum/controller/subsystem/air/proc/process_super_conductivity(resumed = 0) if (!resumed) src.currentrun = active_super_conductivity.Copy() @@ -207,21 +222,6 @@ SUBSYSTEM_DEF(air) if(MC_TICK_CHECK) return -/datum/controller/subsystem/air/proc/process_active_turfs(resumed = 0) - //cache for sanic speed - var/fire_count = times_fired - if (!resumed) - src.currentrun = active_turfs.Copy() - //cache for sanic speed (lists are references anyways) - var/list/currentrun = src.currentrun - while(currentrun.len) - var/turf/open/T = currentrun[currentrun.len] - currentrun.len-- - if (T) - T.process_cell(fire_count) - if (MC_TICK_CHECK) - return - /datum/controller/subsystem/air/proc/process_excited_groups(resumed = 0) if (!resumed) src.currentrun = excited_groups.Copy() @@ -242,8 +242,7 @@ SUBSYSTEM_DEF(air) /datum/controller/subsystem/air/proc/remove_from_active(turf/open/T) active_turfs -= T - if(currentpart == SSAIR_ACTIVETURFS) - currentrun -= T + SSair_turfs.currentrun -= T #ifdef VISUALIZE_ACTIVE_TURFS T.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, "#00ff00") #endif @@ -251,6 +250,7 @@ SUBSYSTEM_DEF(air) T.excited = 0 if(T.excited_group) T.excited_group.garbage_collect() + remove_from_react_queue(T) /datum/controller/subsystem/air/proc/add_to_active(turf/open/T, blockchanges = 1) if(istype(T) && T.air) @@ -259,10 +259,10 @@ SUBSYSTEM_DEF(air) #endif T.excited = 1 active_turfs |= T - if(currentpart == SSAIR_ACTIVETURFS) - currentrun |= T + SSair_turfs.currentrun |= T if(blockchanges && T.excited_group) T.excited_group.garbage_collect() + add_to_react_queue(T) else if(T.flags_1 & INITIALIZED_1) for(var/turf/S in T.atmos_adjacent_turfs) add_to_active(S) @@ -273,6 +273,18 @@ SUBSYSTEM_DEF(air) else T.requires_activation = TRUE +/datum/controller/subsystem/air/proc/add_to_react_queue(turf/open/T) + if(istype(T) && T.air) + turf_react_queue |= T + if(currentpart == SSAIR_REACTQUEUE) + currentrun |= T + return + +/datum/controller/subsystem/air/proc/remove_from_react_queue(turf/open/T) + turf_react_queue -= T + if(currentpart == SSAIR_REACTQUEUE) + currentrun -= T + /datum/controller/subsystem/air/StartLoadingMap() LAZYINITLIST(queued_for_activation) map_loading = TRUE diff --git a/code/controllers/subsystem/air_turfs.dm b/code/controllers/subsystem/air_turfs.dm new file mode 100644 index 0000000000..96e6e05f6f --- /dev/null +++ b/code/controllers/subsystem/air_turfs.dm @@ -0,0 +1,27 @@ +//WHAT IF WE TAKE THE ACTIVE TURF PROCESSING AND PUSH IT SOMEWHERE ELSE!!! + +SUBSYSTEM_DEF(air_turfs) + name = "Atmospherics - Turfs" + init_order = INIT_ORDER_AIR_TURFS + priority = FIRE_PRIORITY_AIR_TURFS + wait = 1 + flags = SS_BACKGROUND + runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME + var/list/currentrun = list() + +/datum/controller/subsystem/air_turfs/fire(resumed = 0) + var/fire_count = times_fired + //cache for sanic speed + if (!resumed) + src.currentrun = SSair.active_turfs.Copy() + //cache for sanic speed (lists are references anyways) + var/list/currentrun = src.currentrun + while(currentrun.len) + var/turf/open/T = currentrun[currentrun.len] + currentrun.len-- + if (T) + T.process_cell(fire_count) + if (MC_TICK_CHECK) + return + resumed = 0 + return diff --git a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm index 104879b168..0a90520424 100644 --- a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm +++ b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm @@ -223,9 +223,7 @@ our_air.share(G, adjacent_turfs_length) LAST_SHARE_CHECK - our_air.react(src) - - update_visuals() + SSair.add_to_react_queue(src) if((!our_excited_group && !(our_air.temperature > MINIMUM_TEMPERATURE_START_SUPERCONDUCTION && consider_superconductivity(starting = TRUE))) \ || (cached_atmos_cooldown > (EXCITED_GROUP_DISMANTLE_CYCLES * 2))) @@ -233,6 +231,15 @@ atmos_cooldown = cached_atmos_cooldown +/turf/proc/process_cell_reaction() + SSair.remove_from_react_queue(src) + +/turf/open/process_cell_reaction() + air.react(src) + update_visuals() + SSair.remove_from_react_queue(src) + return + //////////////////////////SPACEWIND///////////////////////////// /turf/open/proc/consider_pressure_difference(turf/T, difference) diff --git a/tgstation.dme b/tgstation.dme index f04bc62db7..e2504f75b8 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -208,6 +208,7 @@ #include "code\controllers\configuration\entries\general.dm" #include "code\controllers\subsystem\acid.dm" #include "code\controllers\subsystem\air.dm" +#include "code\controllers\subsystem\air_turfs.dm" #include "code\controllers\subsystem\assets.dm" #include "code\controllers\subsystem\atoms.dm" #include "code\controllers\subsystem\augury.dm" From 7f9df0de931d77597f23a55e256b459c103b5a87 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 7 Sep 2018 07:23:44 -0500 Subject: [PATCH 16/29] Automatic changelog generation for PR #7509 [ci skip] --- html/changelogs/AutoChangeLog-pr-7509.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7509.yml diff --git a/html/changelogs/AutoChangeLog-pr-7509.yml b/html/changelogs/AutoChangeLog-pr-7509.yml new file mode 100644 index 0000000000..f8bea90627 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7509.yml @@ -0,0 +1,4 @@ +author: "deathride58" +delete-after: True +changes: + - tweak: "Active turf processing is now its own subsystem." From 6fa011c1beee78f601ef5f474f6b9d5be42500f1 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Fri, 7 Sep 2018 08:40:35 -0400 Subject: [PATCH 17/29] INTRODUCING KITCHEN GUN (#7508) --- .../game/objects/items/storage/uplink_kits.dm | 8 ++++ .../projectiles/ammunition/ballistic/smg.dm | 4 ++ .../boxes_magazines/external/pistol.dm | 5 +++ .../projectiles/guns/ballistic/pistol.dm | 7 +++- .../projectiles/projectile/bullets/smg.dm | 36 +++++++++++++++++- code/modules/uplink/uplink_items.dm | 16 ++++++++ icons/obj/guns/projectile.dmi | Bin 34134 -> 35103 bytes 7 files changed, 74 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index 39a4f14eed..9acd5e9846 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -339,3 +339,11 @@ new /obj/item/stamp/chameleon/broken(src) new /obj/item/pda/chameleon/broken(src) // No chameleon laser, they can't randomise for //REASONS// + +/obj/item/storage/box/syndie_kit/kitchen_gun + name = "Kitchen Gun (TM) package" + +/obj/item/storage/box/syndie_kit/kitchen_gun/PopulateContents() + new /obj/item/gun/ballistic/automatic/pistol/m1911/kitchengun(src) + new /obj/item/ammo_box/magazine/m45/kitchengun(src) + new /obj/item/ammo_box/magazine/m45/kitchengun(src) diff --git a/code/modules/projectiles/ammunition/ballistic/smg.dm b/code/modules/projectiles/ammunition/ballistic/smg.dm index 3be419c933..758be46344 100644 --- a/code/modules/projectiles/ammunition/ballistic/smg.dm +++ b/code/modules/projectiles/ammunition/ballistic/smg.dm @@ -26,3 +26,7 @@ /obj/item/ammo_casing/c45/nostamina projectile_type = /obj/item/projectile/bullet/c45_nostamina + +/obj/item/ammo_casing/c45/kitchengun + desc = "A .45 bullet casing. It has a small sponge attached to it." + projectile_type = /obj/item/projectile/bullet/c45_cleaning diff --git a/code/modules/projectiles/boxes_magazines/external/pistol.dm b/code/modules/projectiles/boxes_magazines/external/pistol.dm index d70b20c65c..fb3771a5c4 100644 --- a/code/modules/projectiles/boxes_magazines/external/pistol.dm +++ b/code/modules/projectiles/boxes_magazines/external/pistol.dm @@ -36,6 +36,11 @@ ..() icon_state = "45-[ammo_count() ? "8" : "0"]" +/obj/item/ammo_box/magazine/m45/kitchengun + name = "handgun magazine (.45 cleaning)" + desc = "BANG! BANG! BANG!" + ammo_type = /obj/item/ammo_casing/c45/kitchengun + /obj/item/ammo_box/magazine/pistolm9mm name = "pistol magazine (9mm)" icon_state = "9x19p-8" diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm index 24ef2a2604..cf6a856030 100644 --- a/code/modules/projectiles/guns/ballistic/pistol.dm +++ b/code/modules/projectiles/guns/ballistic/pistol.dm @@ -26,6 +26,12 @@ mag_type = /obj/item/ammo_box/magazine/m45 can_suppress = FALSE +/obj/item/gun/ballistic/automatic/pistol/m1911/kitchengun + name = "\improper Kitchen Gun (TM)" + desc = "Say goodbye to dirt with Kitchen Gun (TM)! Laser sight and night vision accessories sold separately." + icon_state = "kitchengun" + mag_type = /obj/item/ammo_box/magazine/m45/kitchengun + /obj/item/gun/ballistic/automatic/pistol/deagle name = "\improper Desert Eagle" desc = "A robust .50 AE handgun." @@ -78,4 +84,3 @@ else to_chat(user, "..and falls into view. Whew, that was a close one.") user.dropItemToGround(src) - diff --git a/code/modules/projectiles/projectile/bullets/smg.dm b/code/modules/projectiles/projectile/bullets/smg.dm index 4044a9629c..dfc6df537d 100644 --- a/code/modules/projectiles/projectile/bullets/smg.dm +++ b/code/modules/projectiles/projectile/bullets/smg.dm @@ -9,6 +9,40 @@ name = ".45 bullet" damage = 30 +/obj/item/projectile/bullet/c45_cleaning + name = ".45 bullet" + damage = 24 + stamina = 10 + +/obj/item/projectile/bullet/c45_cleaning/on_hit(atom/target, blocked = FALSE) + . = ..() + var/turf/T = get_turf(target) + + //section shamelessly copypasta'd from the clean component + SEND_SIGNAL(T, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + for(var/A in T) + if(is_cleanable(A)) + qdel(A) + else if(istype(A, /obj/item)) + var/obj/item/I = A + SEND_SIGNAL(I, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + if(ismob(I.loc)) + var/mob/M = I.loc + M.regenerate_icons() + else if(ishuman(A)) + var/mob/living/carbon/human/cleaned_human = A + if(cleaned_human.head) + SEND_SIGNAL(cleaned_human.head, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + if(cleaned_human.wear_suit) + SEND_SIGNAL(cleaned_human.wear_suit, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + else if(cleaned_human.w_uniform) + SEND_SIGNAL(cleaned_human.w_uniform, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + if(cleaned_human.shoes) + SEND_SIGNAL(cleaned_human.shoes, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + SEND_SIGNAL(cleaned_human, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + cleaned_human.wash_cream() + cleaned_human.regenerate_icons() + // 4.6x30mm (Autorifles) /obj/item/projectile/bullet/c46x30mm @@ -23,4 +57,4 @@ /obj/item/projectile/bullet/incendiary/c46x30mm name = "4.6x30mm incendiary bullet" damage = 10 - fire_stacks = 1 \ No newline at end of file + fire_stacks = 1 diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index 01ec1477d1..1eac811971 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -1332,6 +1332,22 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) surplus = 20 restricted_roles = list("Janitor") +/datum/uplink_item/role_restricted/kitchen_gun + name = "Kitchen Gun (TM)" + desc = "A revolutionary .45 caliber cleaning solution! Say goodbye to daily stains and dirty surfaces with Kitchen Gun (TM)! Just five shots from Kitchen Gun (TM), and it'll sparkle like new! Includes two extra ammunition clips!" + cost = 10 + surplus = 40 + restricted_roles = list("Cook", "Janitor") + item = /obj/item/storage/box/syndie_kit/kitchen_gun + +/datum/uplink_item/role_restricted/kitchen_gun_ammo + name = "Kitchen Gun (TM) .45 Magazine" + desc = "An extra eight bullets for an extra eight uses of Kitchen Gun (TM)!" + cost = 1 + surplus = 0 + restricted_roles = list("Cook", "Janitor") + item = /obj/item/ammo_box/magazine/m45/kitchengun + /datum/uplink_item/role_restricted/explosive_hot_potato name = "Exploding Hot Potato" desc = "A potato rigged with explosives. On activation, a special mechanism is activated that prevents it from being dropped. The only way to get rid of it if you are holding it is to attack someone else with it, causing it to latch to that person instead." diff --git a/icons/obj/guns/projectile.dmi b/icons/obj/guns/projectile.dmi index 6309e5c084f3879142963254cb621224a67b6a39..0ee0e3d2d1f3f5ba589bb498fd320dc5872738ef 100644 GIT binary patch delta 15270 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 delta 14294 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 Xq9bd+C@rX}gKiXj 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 OkGk?>r7wzB;r|1HafSW> From 5368b363975832f5d5963dd13ed83cf77f733364 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 7 Sep 2018 07:40:37 -0500 Subject: [PATCH 18/29] Automatic changelog generation for PR #7508 [ci skip] --- html/changelogs/AutoChangeLog-pr-7508.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7508.yml diff --git a/html/changelogs/AutoChangeLog-pr-7508.yml b/html/changelogs/AutoChangeLog-pr-7508.yml new file mode 100644 index 0000000000..4f2072509a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7508.yml @@ -0,0 +1,4 @@ +author: "deathride58" +delete-after: True +changes: + - rscadd: "Introducing the Kitchen Gun (TM)! Say goodbye to daily stains and dirty surfaces with Kitchen Gun (TM)! Just five shots from Kitchen Gun (TM), and it'll sparkle like new! Includes two extra ammunition clips for the low, low price of just 10 TC! Laser sight and night vision accessories sold separately! Magazines can be purchased individually for 1 TC a pop!" From b604390f334343be80045d955705cf48ee056c61 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Fri, 7 Sep 2018 08:40:53 -0400 Subject: [PATCH 19/29] Ports tgstation/tgstation#39302 with adjustments, see desc of commit (#7424) Instead of the box being 100% invisible at all times, the box will steadily become more and more visible as you move. The faster you move, the more visible the box becomes. The box will slowly become invisible again every process() cycle. This also makes the box inherit the movement delay of it's user, meaning you're able to sprint while moving inside boxes, or walk to slow yourself down. --- code/datums/action.dm | 21 ++++++++++ .../objects/items/implants/implant_stealth.dm | 38 ++++++++++++++++++ code/game/objects/items/implants/implanter.dm | 4 ++ .../crates_lockers/closets/cardboardbox.dm | 3 +- code/modules/uplink/uplink_items.dm | 6 +++ icons/mob/actions/actions_items.dmi | Bin 8401 -> 8842 bytes icons/mob/actions/backgrounds.dmi | Bin 2937 -> 5866 bytes icons/obj/closet.dmi | Bin 28456 -> 28606 bytes icons/obj/library.dmi | Bin 25195 -> 25377 bytes sound/misc/box_deploy.ogg | Bin 0 -> 16791 bytes tgstation.dme | 1 + 11 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 code/game/objects/items/implants/implant_stealth.dm create mode 100644 sound/misc/box_deploy.ogg diff --git a/code/datums/action.dm b/code/datums/action.dm index 593e81ff01..aaa337bd46 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -487,6 +487,27 @@ else to_chat(owner, "Your hands are full!") +/datum/action/item_action/agent_box + name = "Deploy Box" + desc = "Find inner peace, here, in the box." + check_flags = AB_CHECK_RESTRAINED | AB_CHECK_STUN | AB_CHECK_CONSCIOUS + background_icon_state = "bg_agent" + icon_icon = 'icons/mob/actions/actions_items.dmi' + button_icon_state = "deploy_box" + var/cooldown = 0 + var/obj/structure/closet/cardboard/agent/box + +/datum/action/item_action/agent_box/Trigger() + if(!box) + if(cooldown < world.time - 30) + box = new(get_turf(owner)) + owner.forceMove(box) + cooldown = world.time + owner.playsound_local(box, 'sound/misc/box_deploy.ogg', 50, TRUE) + else + owner.forceMove(get_turf(box)) + owner.playsound_local(box, 'sound/misc/box_deploy.ogg', 50, TRUE) + QDEL_NULL(box) //Preset for spells /datum/action/spell_action diff --git a/code/game/objects/items/implants/implant_stealth.dm b/code/game/objects/items/implants/implant_stealth.dm new file mode 100644 index 0000000000..f514b8e21a --- /dev/null +++ b/code/game/objects/items/implants/implant_stealth.dm @@ -0,0 +1,38 @@ +/obj/item/implant/stealth + name = "S3 implant" + desc = "Allows you to be hidden in plain sight." + actions_types = list(/datum/action/item_action/agent_box) + +//Box Object + +/obj/structure/closet/cardboard/agent + name = "inconspicious box" + desc = "It's so normal that you didn't notice it before." + icon_state = "agentbox" + use_mob_movespeed = TRUE + +/obj/structure/closet/cardboard/agent/proc/go_invisible() + animate(src, , alpha = 0, time = 5) + START_PROCESSING(SSobj, src) + +/obj/structure/closet/cardboard/agent/Initialize() + . = ..() + go_invisible() + + +/obj/structure/closet/cardboard/agent/open() + . = ..() + qdel(src) + +/obj/structure/closet/cardboard/agent/process() + animate(src, , alpha = alpha - 50, time = 3) + +/obj/structure/closet/cardboard/agent/Move() + . = ..() + if(.) + alpha = min(alpha + 5, 255) + +/obj/structure/closet/cardboard/agent/Bump(atom/movable/A) + . = ..() + if(isliving(A)) + alpha = 255 diff --git a/code/game/objects/items/implants/implanter.dm b/code/game/objects/items/implants/implanter.dm index 528905be1e..a0aa5fc960 100644 --- a/code/game/objects/items/implants/implanter.dm +++ b/code/game/objects/items/implants/implanter.dm @@ -71,3 +71,7 @@ /obj/item/implanter/emp name = "implanter (EMP)" imp_type = /obj/item/implant/emp + +/obj/item/implanter/stealth + name = "implanter (stealth)" + imp_type = /obj/item/implant/stealth diff --git a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm index a22ea805ea..63286076bd 100644 --- a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm +++ b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm @@ -14,6 +14,7 @@ delivery_icon = "deliverybox" anchorable = FALSE var/move_speed_multiplier = 1 + var/use_mob_movespeed = FALSE var/move_delay = FALSE var/egged = 0 @@ -22,7 +23,7 @@ return move_delay = TRUE if(step(src, direction)) - addtimer(CALLBACK(src, .proc/ResetMoveDelay), CONFIG_GET(number/walk_delay) * move_speed_multiplier) + addtimer(CALLBACK(src, .proc/ResetMoveDelay), (use_mob_movespeed ? user.movement_delay() : CONFIG_GET(number/walk_delay)) * move_speed_multiplier) else ResetMoveDelay() diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index 1eac811971..a58d8a6269 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -1293,6 +1293,12 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) cost = 40 cant_discount = TRUE +/datum/uplink_item/cyber_implants/stealthimplant + name = "Stealth Implant" + desc = "This one-of-a-kind implant will make you almost invisible if you play your cards right." + item = /obj/item/implanter/stealth + cost = 8 + // Role-specific items /datum/uplink_item/role_restricted category = "Role-Restricted" diff --git a/icons/mob/actions/actions_items.dmi b/icons/mob/actions/actions_items.dmi index ce7d000409cfba451534c97ca7479bdcd33ef293..ca380a5376e57388c4bcce2153b8b9be6b432b35 100644 GIT binary patch literal 8842 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 M07*qoM6N<$f^em4Qvd(} literal 8401 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 Lb=4|Wtit{S4!Ut# literal 2937 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 diff --git a/icons/obj/closet.dmi b/icons/obj/closet.dmi index 3d1d7c406dfed4840358158cc799884bbfcccafb..53bed2d5bb2255ad664601a8ef5a64e2fd4c39f9 100644 GIT binary patch delta 5720 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 delta 4691 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 Ht~dV&zyX)9 diff --git a/sound/misc/box_deploy.ogg b/sound/misc/box_deploy.ogg new file mode 100644 index 0000000000000000000000000000000000000000..3fbe895950e1eaa65193efcb199a6b7b8a0e1da7 GIT binary patch literal 16791 zcmch;c|4Tg`#*kTFc=!!G?p^PE^0;yrR-bC-ViZk$-a{%Ax!qYl8}Ah##$uAAZvD! zh$2f#k`R8kdcEG?_xJOAJigz@@1Ng!+;g0BpY?iP*LBWyuKT!l>y{xv3H%dEmH#H< zFPN%RoTl(~^CUQU9lxSfDgRsIl1=+3@r>fyam)XNn$Jr zEn9gXR~s2HZ;yAiakllebj5?+XnMKn*xESYQECp(wkSPMHya;oTN@O?AEoZ*cFWmT z3?(Iw#fpQYVR^u|wyxH0HnyJf+IU}UsS9VZ(r2+4>@f|0DT5!+0PhISfZz#^BJbiZ zDZvT8vvzZF2j@<3w*6b+CGX(n=5kz0LH!RVO3Ee_02Hi?)kcv+-Xt0W0N9%qzX(%` zou)`ZYL2jfTB^ozij0X$ON}BUtz)rW|3)ZD8+HJI03pJ3@p(&{j)StdkV5gE*|HA0 zGDRrbX#IIvx>wtR)~VaM-|=pvT=uiWH`Kf?fS33k8ILWCH3*Y?>stJ`(r9F#omhV*0F7!{=2EjdYB` z;A3&!*LKp^XVN#wG%e!Bvmn!F5jUnHEOsLBNa8=wub{b|RyuFUYEc}-CN~# zs`kJS?Gyhp;h60Jpn&BjdvL!7(J&An^_05qB|qtyGVivthVa~MgdEqRLr+nT;fUn+ji z2BxA?p9s}IH~QP(KVngGGh?t__5;`=YWj)Ob2PDcLGyNHnvA3|8!iunpR1eo&kqYf%m;Xl%oJ39R5d&|Be2L@?R;= zPmUJt6|U`<=o34R$~y+-)~Y+;$}lV_#bQ#R6vx#sWqDP~YB&|tPnex4NHx$BDfp{V zAX8B`iHbBFf0Trn=GiM!1Zu^9GwvJz5c8?w|9XZtx%F8Dz-L%O-0-}-v61n0Ul-Fy zJ~NFG7E?ZRlR`*jlk z)f#@C5wU^qlGnB*hgntiC3OthEr!{BMiI7#(iWpqwxh#w*Jy6 zKMVrut$Omm82|uniLk4G))9RJ@o@vGaRYHzhvC9W|sPv-)TVehu>+PluJp= z!;;`ONx=mE5K1|`XDCBtD1aD#|I?b^FC~Kwbl7;K9~MTP9%5C^5{y0{dF9$GANgS;A%_Q55Oz{giz1|ApmQy0tg{Rh%f-efC6mmf4Un~jjc9Uyec_?|c9~H~7c-O)8E%`&bARG=LDY$8q(6EtO$Oos^Fn$%Xz|%OHHE zqMFAdcnNGiYGnM-#uV%~*FL?pw5j^|HK=#sj%A--7?mrWURc_6R#In6MW0Q_(AeVS zKQ&jIYG9YH{dqO%b8I2~ZvkAFxk1YWf>adZFh=0>=uVyv`B$Jqu#s4D8lGNDL_jiH zQA8jWs-#hppQ@=LUOyorECMcA0tIy@X1)3O69!I?Q^(AlDgdCGiWdAa7FIAL`^cvLHdO(PkT^26T!gi&3r5b>iMZc_8 zNop*1i5pxHj|~lQRRm2AK>#RjqX1BCYDoihYWL_FP3eGqN^ln2f@`Qqw!<3jmQ5B6$)UUjtNkpmM)KXH;_c& z?0d8T6crGHrQx-KDfJ-3kIjm3I12z^=0PjTN{K^Q(nbJCqz4p`d2H5$nwljNY9h<1 z)Dbh=M1w&^;evWQk%Ek{WCN!G11(u0fr5#25solDEv*Wv2NE)dJq#kMQrQ2m-;E3&7$}p^~M_3Pl2AH{%c$XOipkVI~02izAKH(|3 zq&ARUlz=|~BpQGKBCWMW3XV;)!qj8j(+ssh+(A5xK-{rQ8Gj5nufadoo9yx*6As)2 zkF(%Tc$@{TspDp#Q9^kv;9RQGLP$E%V;bS$l7Z|<^#X|!ctFqFh4Mb8!Ward6AsQ( z95no(ys03e!(bKYF=a8O5qhBP6ik?Ti+dYrX_nL@^HR~_;5;kpk(nU1$zU^(yx4;L zF|$~#^sf z5NJk&ZF7z*=NxbMAbQ6U92^MjPxw#4aR*?QMd?q$@j%DfzoY$0fl;^~*y+Co!UEwe z#{(VL`&00Dpg+?92hRcd3F>7Cz$Yr+se8Wi5~VtugtkHiu^a-7fa{TRIjGDaCGoKORz04{t0g-P|9+B(O)XC)~wK8Ljld3V~`^b{EN ze^hzHCpAV8n95;)H&1PKyy*cF0MKbVAlsdB=3{>Sl%p8C0TZ~a`}Uwd@srIYY~W#I zgjF_)NJYmIZx{zepvy=u0v2X&eJ016$*hc2z#<2pJwi}Gn?iU$gpyj%3S4KI;4Jw- z$SX?aZg*yQ;?*8uj4(Irpk@&xpa4goS3wi78rsD)(a|e_l}9Kq4$1;Y1=li8+}ig*BB8G}9FRI2Qo80zgR#DhwEo zw^B;VzfOn{hCi=>V<*IMse48DFZMU1gAEPOo{x67G&Iy4yCb5qa~t!?2JrQ83mRj* zX{?H1xXOJz&lSJl-@h#{PCn%t3g&8cbNju2?qTpI^V&*~e9=Jp(zB|Ap^?LhqXWwf z&nrJ~J>+VmLk{MyuO z52Ve{t#mGbR1x3%J^LtZ@Sbd1NqkOVj11<|fnd_dEVr97I@l*7;zrLJo%e6{4L-kx zJ&ZmdM7qUB5?ZCU%<^aAN_*tGFVlB++*x?NL6q@@+b9PsMAW{=EBZPwwXtM_=ugv7=yb!=u?FDxL$Wo6l!G^*1cb9 zG!kSym(?px9jbn`FWFnVU(PAR`dT6?%{;X#RZMPWCQ6?C{rcucp=9&7gspy`tG7># z%tn^U40h=RO|Dx;vl{H4Y`hb>>aztX4pa*(_gB8T<)gqlG1n4v)o*G&z z05Gq3@!&cGUjJ1sPf;=vYR#G)Z+7*{-onzx;ggBh;PDqvmfIdT3>nB@czU#N^4W09 zG|!wrAmGYF{N2n)F%G|eq;sbHc>liZ%eFVwtt*QXmik8@csCzDOq8=d3H9DH(-?G= zKlj~u{PX&L|2wfJgF6G;hR^-Z@GPI$2=Gkbk9_`73mzb#GQ@b{OK)^Bf4UN7<}ygR_U!}ZwP!!c=y&vy3Z_)3q# zzMN0@deHktY^8T)^SIP0~Q(Aa`Cb?B(%gWmQW zn;q|3+VI^UaRu%%9%1^-cTWu>QCv~+;}92>-QnveEvcM8H4!e{cuN0tjWSKn^$55HWxwq0+w)=0Z%a!}~m zdgA>qmxuha=WhPy@3EZ~+l&vI{{7W7D~#Kiz~?7)b;lO5X+aIQn?0*U&(Rf~;-E(H z7e3t!Y>qlQ{6)2I%~knJA0K?LIJGIoO>$`GSv=_(%bg80dE|oA=RV=XX!mD#EM-zm z&~5Uq&${2AJyC-C5;v!&-|ka9S21~NHNf>_d&b-Rm8>}RqnpPISANc$P=U7|7*u?V z)hh?HTu;H`xxjaai>teDw-bCVTHJZTT-oS@ zTgGDT?fxpuxO_XjqhCvf+(~uaNA!ja%;7EIY3#;juEVQR8;YBcvLhH%q4g5G2X_Y1 z)E2@W!5%*@&iT=<-H^Slu{U^~YHx5(XC=T*>u`;Ij=Q5n@y7?5Q>MRN7C#kH23?gu zrIvrQ;Dta@casq z-yeSB>&E!{Y+m?fGVVRLinH+$i-siZneWoq?^C&ao3T90A}Vwlx6PIl7`U1gGuzrj zJG&7LxlK`$akR5d4u~?B;&ReHyYMn|!c7cor1gvCukG@JSyR0G<;J>E6pA^VOnwVfJT@+IA6ZY9G?p0Uzo__v{OE3X*fii#|J_t5Fx^~``+SHs)ptikrSh6KY4YDSZF8-*XvXpR};TMiWVtMM;8*Lt}?R5R3LTNiR1;~yNTGF^;g*Drrf^acTGGOgU;?{ z2%6YEcsjvUyyfK?s=D`<`n!GB!dmmGsm>hu>4bJ(6>erh1wZ5oR7iWSAMEtiPG&e7 zkU?5ug%M}~Ey2W%GzigEhH;Lcr3U)tc`NFYNRJd=D|%c@wdz3{ z2072fCQ4IzlS_1Aqwy&s3BLNWJgUaQW@lMr}t`_a{VR-Kq3FPJ$W_P|pcj8cjMJP0l78-38%gRe3 z#vHalf~av*$Y_@6n_dSb3j6e6@dS$d74u^SeTuN0XyeX@qfc9&Up?B%yX(q0N8GEr zkbamaed`A4fh6O$VRP)=gU!!;r)6)-UhY+TNS}A-5ki0$R)!aL!(yGq8+>8NXusUb zUq5ZrU;Z{yU|zdX4kbiKi$sn~>W#{!^GFl6ZJQbj_QRYA+iUqw_i~VqIFb7!Mg5YU zrJrteHk8-POV!joDKvxdaNSU5WOXz54=h6!k~?#!0v(<{n<~Eb3-!Tx@=ix%(zsxk zx#alv7a@~T*D6I-M#I=pPuWThQ-{8lDlgMA@?GIOVuDun9nr_KCmwt>{|H&H+j*$*&2zGr#ZLZOKry7X4j@SW*#X#{Z7;{5*wlY;6{SH^O0bF^ZaBwvJ5rppm!Y0;v- zq&MVT-%&lPQ9`5Xu*HwjPnjxkBu?Z`G;n|-xc0u4>jpITvFG?gPAQ) zrAI5fU!+J@7gm27)ORH^PIc^*wz|DFN9A4XEB;`pgffLx7_W<#QmbANb~Z3LO|9r1 zFbmg$XSFj|!zrk!*mwy(ka{%hi{CZ9X5PO=Bh?*9g$9Rn=kCAuT^aZ~O`S4HZA*TN}a-!M$%b|e!F>E0zv#neNQ6cWKp z*#>9kj^-nvkYOwsOmw%kKD1562HGjR*n?b-Jx|jE2SRxP-o>^M4@zQB2oM5#Q$F@k zAiJ%+g~L^&klf4(9ShYE?(hy}+$9*)52h5t!OLq6?Fog$1r=~?R2}fs%76-NKK6VU z2MaG%SE7ds0VYFb6ALcr${#~Q!egl-h!~n=D^U$PD8lhtjFMiOBu&bP9Ljq+i6*N> zRq^yW<9v0TudRx^KGQ&eaJnEs!+|dOhk#fcfKqfgc+0%JTaZY~ve1sP7!+5=zQw#V zp1C5s>;Lt!qZ+;R6^T?!Q)?pC#4GqHI-5`{OynpGi=1Lsb~cGADSYgbbe|uHmsl(P z@gZ@Y?mcg`y=9;y&*tggC0l29i}zGluEm^GdU`IZ{NB8s|IKqJ6lHE@uu|LszHy7r zjR&IF)mD+L-uE<%P?X=VzZsXz1i~rg6<{n-h=!%&IRF8L2!8>x+~zLlezxQE`8KJa z6Xu#K@$snD=jIDDamV6p6P~)lvHqJjyLLTwb_QQVl?>H&E8NvDOVy#>uW40+ zR(I)*l3U&gGWIoaI^5}Kuz44_gVs&ry;0P51|g^a}WT@-0(tds~x zNU4kekV}f)=1y>kijqvK)HZ-Cya|n&GBu5tCg_Q%IuYr&G)R03Xp`T%td-b4k4u)XtCR(iK+B`&@GP~Y^2_LSOJT2G;ffC(SAj+t0=xK(?j6|SaF$DMk+>3~UhASq?EQTm&o~P2ee?LA7h|ohjZnwEyUA3pK z^FrnC2TQ2c-q4A$fSp;rYTKH2cS@gJcVYbe1*w`wCjf1EwY(i2s+7^IN(A3fwi&X}=>0o)Uw6fzBFWxzO z@q{VaI-;o~3W#Nl(G##B9x4WKT|}U@SG12bR<@3g?mwyGs-CH4H54~FwH{~}>}69R z8G$9l-mG-g)W1=N=PX1zZtCb$a5?qRoA%UT$J$h2qu$ltvcg>qSEeVcIOWo1BM~P9PtCxJktX`}^`n$`n~KdKqq#JNnZ%yLQ%H0% zj$BuqX3HsRqR+KnimP}U9+ZlURb~5TeEaQ=?!k(#4_DHwW;VCL(%x8G5=_c0{UpFi*VA9t*W2mG!+v^uBRlq`$IL*MbJYEz_CcAkm^{c-h>J7 zFrP`pEJ2zspF)bpeC;vIZ>KA9z_D&H6;M(x3ap9?w2D@0CO$T9m>X+Md#A}_n zCvzjW#A{EoQ|Cq(XUg{(c-YpImY|8QMa4N&<7|4^bFU>$R*7*U1Zz$cV|J-} zn3Px{PE}mDLON!kMit)4#yVQf9s$%%e4QC}eSgbR-0;-ZYqJb3(s=SFcj+gdp8S@V zSx?q1?nSsjw;@wCP}zP+DpsgW2zgNt%{*TXjptodX#?UF_~CRwOg1Jy z5-^|(176e%%csR^4gWXUj+nI5%$3Ltwt|yV}I))32r(n|VYFm#c z1~x8Jgw7*Z=7v>2>)tx`e&!k1L}B-XnG9DsPLslo!B2a}_$BR*XY><4#X!D`)?U{YrmN$3Od^gv)XYPid_`#}O zUCJCqYU+6({d@1DUyt-as(gtp3nlifIWaOc5~3n(RH7V5AE!c)O8c$O!on-B*Qkbi z2>Vz9u|Iw548N^zLHGM|ZR-36z^$*mGDf0n?bX5Ed=u-=;w;+-2HyGH0_CYJ9+D~} z)i)Sp7Oc>OXw|qeIcJ^#ldEdyLSW|xld1-PzUYPt4*0lQ?5&#Ly(7YfV13#v=Nb9% z(-ObHRb?hozhx_E2n94=ciEdhLYGQz#VD^PL@SRnPHXwJH#MaXtoZHp(6mcJW5?=k z(Pdduc7V7yLu?DYw+FTSgjJxU#v}m3HhV6>;PKut{$=Zhe&)gtZn&GDpSnozPr2QA zuh)VtUz)dGOOSOr4e5(i((8G5qQfXAI?jykq8P!3W9O2c3p2^Ajg2G@e$m9nNyXF* z)h2)%0plxK9-KeWz=Ob5XJ{J45Fy)A-^%8;DpLe%@$ERCO8&o5a;m>6T8fb%S zDSEH%dQ!ACgu)-hn}qy0;z)bYVM=;fDf=~uXAgDCEUflo?YnbNuW2VL11$=n??8DEcZ`qf+CyK(xf z^on0Csk>v`c%#a7#@;CCT)&TrgWKK@&AmEY?1?gb2?BTlo;>+?vf&SE@@XkvN3>;c zTP(Tc6zh?VZ6vRnI-eSCR&#M{Ja{(L!KJ;=*}?V0HquAs`t|YEv68&eimZfjN2mJZ zi(7no>t??7qopCK=iF{Mc`z<}H>5V=GQ_1j2-eojp;VVnJ)P>i`LdhgyjV^5ujz7b zQ`dEwgnmn^YHv5#>7nP6XWpNku-d!Pynn~%B3WIHP6g#$<(BgPzDi?Wu{(cG;A`Yg z#8!(&$=VltJS8);$6lxNQ+8&cPA4c0NzIqRd%>Ke9;nH)k`n&dwNImaM+ zW3|i$L7F+wXi311)R}4b)=>>%oXZjFqfxVHr#n<-73q4#H*;k2^av#VvAX&wYk7oW z0~t-k3+MVOGC~`p@ukoZOFeexJGQLwAiui{0d-zkFab}-Qts0iZV#gr)5tuY+AX>f z!(+UFB6--|T@=RaxZdjf!R4jd{h0ec=4#mGxr^DGm8D^PGb&uyRIo^06(uADNL6GY zF}FeFoL%&;P*5N!KUddPcDdtjO83u{7#0yt3)g90YENQ<8b9n#;fw+vQj^(j9gt~6 zGjWC~2V8|oS!OOmY>7}z*FaPqH!}9Zt}Bp?nLABF-7n^%fyyj)-%Fuqhy7q2IOe^^;kmfSpc2NkPd+2jew4P{+luib5t6O$ zljA2W4@X4!8ZJvuFt_+`IsfjVReH#0oyf<)VOn1vb3#@R5gmPX(xNNA=b`wC9yBqR z=zxVNVh2vPf|d)i&{$uUk&9WIdDIAl;ThGtf`#cDH|wM-1aaL}9qX!|PA_$vN}EDP zmPiw)r;rH!vJw+1GN#ipy{Z(U{HnDMr!WRl){(0B<;-3BZ9TnDd0kIRdsOHZ2Buus z_idA6=>4HBEXaYng64_BTmEfDcK0BaG4#(#ydpne4az#7m+-45{iXigPpeWMw`k6v zD8MmqY6>U}jmDP|s+|e7X}ZQ4G88a%YM8bvV_VzVDxxTYA&p3`ld6csM?#6A>_%?% zrifl86GL-hc6By%&GdqjjZu-7?Y4fBn^RBotM=^|4 zqk5fyalNsjg0sSy3C}3Jys!d=;4;#|s(^P{#H2&wr!%Kv9g<>^)19st#G>&Xb(|(; zqLR|NJ|WZ9_Z*^mtsY>-a}gvoaTYTUXI55OID^w}9v>sg$V@?CQpQF`m@kE=m`QIj z<+-QC3N0#3+TmEN%Nlq0i56Sd4kOl4xG`3{ERvo$Ud`#Nia~lTjJ20clbO)O@wzBH z4#vtlN{F;SRmTs}1aJGuzYK274NRK0-njGfccSY+3j5QK8tNUL_FhrVQDSa$edp3+ z%xqibku^hGd%%Ub1dd;A6`x3@zVgp7tNLq+NbP`Yi~;_`H%Ux5BBd zQ_#8AzL~3L96E_dACj&Lud-u#$*9Pf2oX8P5kD>AB3z+fV%Jdn;$u?qs;KR(;N^~m z)P#~iQHHBigvZahANG`!v{Bb|+Q{=EoS|gU%Ls+B0R z!uo<=(^FL1{dNk8qaJe0?5?npc7(k1N{EESvz0;hYP>~iU>GF zfHI_;Dumpj0^mKM2r?@kngAdvphQmI_T*eYPf>z|BU%Yf5EG|HzEgloiKqcU`Q#MwdJd6;Dhg;8 zIEEP6!{I&{N!xEQ2S2TenI*6Fajp5EX)o7L1J7hYGM@py9j#l(H*?8BO&u1oSH`hxEwsF||Pj z3x`V}aTJhDwKr*zN=3r}Z@8w)h(>-fJ&qntVPBm}4}LKKKVN4}E(j+mSfQvDEMjia z!zj4`wYQeeWvV3zpP5Uwf=Vpx=s2lTrk^QG_k>q(=X0y*D;ArYT8l|-Up!N0ZB>3l zUxaQgX1u+wQp!b;P#P+nM%*Q!3xQ(PuPL1B4Y-Obbr(TO+lN8BGdgn1+LSu4T=5a? z=l4(X1CFNR8=pJtF5;N6ajJE996Ch>P1x%qUY@YH?JeDBx>$J@(LF83ZSpupDb;|0 zyN>Wk`0_p*S@!Ar>`nQHmv7bgT~ZbQsexb*Sn-*Cx$k;~U|es7EF?R&S2IMWNjEzb z;|U}K`R7e>D;nn=(}*Ra@k}N$4y0TnP(0w6mW!6kl-#=vdIjom#;TZg>E;1fEcF<{ z$-2JSSQ}63H%^O38IGfOpVnDB8Uf8%E>lj8nKGGj%h*2FU zNC9L$F_U^z#%9(tL=o#!@-Rh*q#iW`bi1*^2T>L(;%FBAC2uWcr6w=eio|K6ufI}j zaiQztPlkFNV>8*2WTqhYBWEoZX`;;B$p&wx4iRRWczSJzt&UN_2*79y5ey%Yrny}T za|qyCHQp{+PDG>A(s0^0o{afeJc>4hvtLAjE>iG=Q5qKm13I+`7?aFg@=}K;KYXt1uZjrXsl~FV-JRg zf$vZ=cq-`2@Yc6P{t^LsgWj?^w`ICY=d;8Oy{eRHkF)r@UbluQ*j_E1+58UCpnNmW z!e$yR>HOeJxj_Nfd07$CFVo6lK||;7n+e}z`DT==wk(vhRE&qdT~++G+hzAYa_Z+$ zgUaMrggqyN_>8ZVadl}8Ys?Df8_s|GvY+c1o0*pTi45!@@)TcD%9re^vp|d{hFhDZ zc}4f0rnO#(E}n&!62;UBAZaOedy@D77OFuT%FIv^By*(hNQpNkRx>%@(4Id+D~}?M zN|{o(Erf!PC@{~94vmECb2F){P*BZ76u3F~Ao0AfATUbnNMUA055H7i)GZjDECsKG zl1;{W6vQev4+3fbUZQH0sxbNdk)G{+!|zOf{a_3Rs+kgqnIh%_{q6& zdQRX$6kH9N#MY#2l2;qj3($nbYDmP3C}!ND)e?;{dOkwQIjSRTp(>0%6Uzqx%Seip zS9+L|^auQO5GgjgP#Fo`SO92uxuUE)w7Li##V8geLh<+bF-twNl%P&35PFi3o=o6E zv(OWjBm`ODh9<^C;^i%#3G=dg=abT{QQX?R#jA&R(HHCKcorcq|^p}4OwwV2y2Hp{=Rm~fTxm& zQNvSHn1g-HPqTe7`2DxW<@@0#Fm_eRaZb-Zb_zuqpPxqh3P#3bgdQ|v@($hTb0dqd zo0tVRGshEMZ=y%OW3>3MI!IMIR8C0TU%vTdtER5N`6O@X*UA;x&Pw~`2+|=}Qtq(9 zaO^V8TPMj?Id;dG%7^4Pmk9GO9@C1~;Kj$Esq72e?pwaBGdIe*(z7eknsv>%WTtVs zShhLltv^507q$|ZC}-(F6?N9ot(T?d5@k-898K$sJus?cBbxp(BZFr@>2&0u(YuNy z7N<+6Sbge>r=&;R&^NNVC=!@Q5T)_uf)X8=$3T^@#<`dXSx<}SnmieZcjzb?&?DUt zqnDO|KIu<)q5v_f9sNH>sD^9YYk66KVj=kS$;9s{t=Zi#)i&l>%L?*^dHNJ~os$-~x(q z5C+HENcJbVrgZ6;&=3mI!eJejrc0XIk6-{WLQZ4e^H?{s=FwtMTQtN!T^F*bahWxC zj=jM5>Zlt1sR$j&E4I+VW=MlbD%Gfy=~_D%_1*ty=fEMu@xp>i59aIrw&va(yh(TG zeW|IHAKda^<6VW^WnT9wO_j)1-hDY)zON(WX7WH7Ih#-i6jPY{?hrwah(N%htDF85Vz-8Cznr`SM%j-xY3XGJO$(X6j8Rxw#Je z3B)tuw^%)m5`TJ~4(5=^KB^69`yup3)1agca!+k4c~SrlQB*;93TSy}B<g(2z)Y zhyaus9zwAkqMF3a41?tq-$XIPU&N!($~GCSEGZ_l??mWiDZ%Ss4^%SV{XljCQRmSM zk#N@y!I3wy-?Qf4@jp5B-p&S1LEH0e9#2-~R3caf2#f zb)}2ed=Xd1p3o)xO&_KD2t&K@`ll=>-e=~Q4##bur_jD^V(Pd2z@sZEB0lf zuh$S(4RL_5_I;h{1{WnXv(Rc> zRSb$H4f1RWac4EEZU#kaSU!7ItFDJpOP_j6XTrXSq3KXkF)U2)k7kC2Ng68Bh1I7w z(E@%WnLAnXvlsOwTkmcy&0YDSy)Nv!ucqcSyrGu*<9w|HjnVF01TvTH)< zrRxE{Gl1y=_97Qi@-zE>NnT4!^Nm7>D*x%nd(Dg2Pn@&suYOh$j;?)xA_^Dq!q?l2*(u~b; zt|=lX49)G-;TXwTN<8@JFXo|FW@V;5incbUic8*JzvqyxI+clIv=z~0mnx5?cZBAa z7USzhP|=aIxw(YX)T+!zUmBzo+Ta*tn2&*pwYj(=MdB*o&0d5elO0vWACoaHb#;7}v@p5ah!6QDL zZO+NH&JzPSk^U|3*j6({KEq#g@fDmiQm%4eak$_9J<2P&(%d2@Skrd$R;8uR4k>1x zF_$h~BRescT4ZlA=oBqqPbq6n-P%|q?naqXLU*$=kDF(9EVbs2ViWB_${7#Qer4=I zQmrT7gWZJMM@yRiT&%9w-0U_#?A(M4nZKK&BE(c?u|@UgrQQ)-N$)+|c3%f}x=QS_ z(Yirv?B$1NFV`+LH&B_P@b~?h8oxY_<~W!=L+|+9;7aBzC%U7X3zc`Kf*vIcWWKtz ztcdH^GLT4Qx^yNZ5?^ADFcDW(w4r1gW+g!yiVQcI-n@D(W1ZpUZhk+5k}XuZ!U-=& zypz??>MWolwFRXh3UlRs>D-xp;EFgm_T%NOJ+rL&fQzo<&F{ut!>jS@@qQ0#h1kd` z%Qfe0sm(3v9;GB!tddCTyruX@nr~?Lhvc+?$GB6P!yd0e!TXDj3OY!jP~V_ava?ABt_b2bz_ zl1@d7C@QQOQP~01SXznb}{@y|1DxctCm#fha zWka2-;DK^%;}dgCT21*G^SmBgbswbu(KNx@So!1FDMPvN$XbIkU*D$kE5(^tTcBBt z=6iYTUesUs+c%w{m)NlH`*vbtLi6HYx^4&lye$)Yqj)>N>HC|6r_S&hr$H^}kLhlw zi#kX`8$ZsmYg#|*P{wj}YOJ3rD(@_BRX022T-^cxx3j=o!7Q(Q(zB?XnXW9|cMn@y|i{>foM2b|~Dru%;{Rh{+XsvdADA-!SQ8@(=P5ho61j8!b8fQoET^l)~hXIjc_BSzFr6bPwqe7rJQtFo*mVx zYKU&Xy{aVk6K(XS+B)#BR5_q6H_lgqr?HM-v_8{{V!pMBI0Q38OB z0!ZagR0?WFl8xSBNSZ4Zv$At-t?Kmh_+fK?0SU=>VfWYMhk6@-jy>E$$DslD(4qUl zg{m+e<5A2b&r^dwHwp+9CLUY$HucUi+jSO=Qiip5+T+!g6Dn%_^PHg+^i@^QpQrF8 zygGXA=si!4XEZN~#|M$BciyLtTYz1#}pwauvmzaoi34194ie)*DR z*GMg~&vC$~%C2(qFh_CnxhepZ=fEiej#Ls`o@TP(d5Gzp^~5#H>yKZKeMy@Q_}Zl( zJpS&@3yqFU$8WK{D;@zqwWC$FL><+C%}5M7HTYaaIpRHw*n@@k;VjwDAtDVDmcid>TudE&&w9P68;%nNcs(yVxa&0TB z|K(h+>Dh&=-*0-$^MqUlXAwnwEiFzh;Ki*eS4W&R`p{Qi+)Q z^1x$%6w^0TvzKg;Z)xK$9&=%(di#b?)n=2|w;%JFXPge-Yl!S1$y*-gT2D9boc%gE zQsgffgT0<*Hy0-CC4)WCO-fZR5EbUa`5&BHwm-#SVKV$JvwWiD_4$0=Bf^6q=gB|u;#kh_lpL~ef zs%>7pa7b@`ekgIdR-{xe150>zw@%)ZX{Bj&JJI&r*>kT()ps^~tmPZmdPdxKn=)gB z@@U6Xa;tS*D~S={W`-iy~edrnlzVeX8b84bGHU}pJcBggl5;d`d4 zII3q&D|;h>tg*5h(ZsW2HyMX!tIwW%*L~IsZ}9X*X4t$2V(Y2eZ3qH0rO*r5RM=DV zYpNTq5_q{a()#uD4!^JWox9wy%XQmnkF&qxb?d<$$%~CI%Qx1fue{u=EWgn2Npi&p z%QMs1HP>1uKP+8CXZij}xvqQD?^AmKa_NQn^7ebv^K6!3c0E%RmqusH3oiCqTP_HF zT$aC_yD9|R%A01pGv{j?5Z+wH5(8VZvqUdzKG9%feez5w-Ro4xZFC33-{M8!@CU~- zx(@+PxU8lf?zc~aS1qzVe;AhL>_k}aTp1YQE)oHN7i|d2e%t(Z@NPn1vI)L^D0Xb9 z@x$_yz$+e3hHKj~8)bV<2es!eT#FOVs(-E~yWqrnVNyAB@5fS*zg?Zvm7}Vj(;XRG za|dcUdoyMuu~ql=n7V<)k+qg+%CH|llM~OWY2JCV#aCmm)e`ZO$GnI0lguaKpyiuc zI}LQF9zmC8b$Dj0-fWj~4nT~D_FG1hgHJ?^-EA83?<;(Et}~$Ws@Jozt+#$Kx39qe E13TZhyZ`_I literal 0 HcmV?d00001 diff --git a/tgstation.dme b/tgstation.dme index e2504f75b8..af5c44c7a0 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -875,6 +875,7 @@ #include "code\game\objects\items\implants\implant_mindshield.dm" #include "code\game\objects\items\implants\implant_misc.dm" #include "code\game\objects\items\implants\implant_spell.dm" +#include "code\game\objects\items\implants\implant_stealth.dm" #include "code\game\objects\items\implants\implant_storage.dm" #include "code\game\objects\items\implants\implant_track.dm" #include "code\game\objects\items\implants\implantcase.dm" From 813a077e3f601ba3e9204b8c6c86ce61da272e7f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 7 Sep 2018 07:40:54 -0500 Subject: [PATCH 20/29] Automatic changelog generation for PR #7424 [ci skip] --- html/changelogs/AutoChangeLog-pr-7424.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7424.yml diff --git a/html/changelogs/AutoChangeLog-pr-7424.yml b/html/changelogs/AutoChangeLog-pr-7424.yml new file mode 100644 index 0000000000..b79113ac9f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7424.yml @@ -0,0 +1,4 @@ +author: "deathride58 (Original PR by Basilman/Militaires)" +delete-after: True +changes: + - rscadd: "Ported TGstation's Agent Stealth Box! You can the implanter in the syndicate uplink for 8 TC. Credit goes to Basilman/Militaires. This port includes minor adjustments, see the GitHub for details." From 20661110267931494288a72cf85b6cbe0df6ff73 Mon Sep 17 00:00:00 2001 From: Poojawa Date: Fri, 7 Sep 2018 07:43:00 -0500 Subject: [PATCH 21/29] Fixes an noticed in Musician.dm (#7548) --- code/game/objects/structures/musician.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/structures/musician.dm b/code/game/objects/structures/musician.dm index 99e0b3c6e6..3a01b27d08 100644 --- a/code/game/objects/structures/musician.dm +++ b/code/game/objects/structures/musician.dm @@ -176,7 +176,7 @@ Notes are played by the names of the note, and optionally, the accidental, and/or the octave number.
By default, every note is natural and in octave 3. Defining otherwise is remembered for each note.
Example: C,D,E,F,G,A,B will play a C major scale.
- After a note has an accidental placed, it will be remembered: C,C4,C,C3 is C3,C4,C4,C3

+ After a note has an accidental placed, it will be remembered: C,C4,C,C3 is C3,C4,C4,C3
Chords can be played simply by seperating each note with a hyphon: A-C#,Cn-E,E-G#,Gn-B
A pause may be denoted by an empty chord: C,E,,C,G
To make a chord be a different time, end it with /x, where the chord length will be length
From 1bc8b3530c1be5c0e442e41eb8294506bfcc8df9 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Fri, 7 Sep 2018 10:22:44 -0400 Subject: [PATCH 22/29] Adds spawn text when spawning in as a miner. (#7555) * adds spawn text when spawning in as a miner * fixes compiling error --- code/controllers/subsystem/job.dm | 2 ++ code/modules/jobs/job_types/cargo_service.dm | 1 + code/modules/jobs/job_types/job.dm | 3 +++ 3 files changed, 6 insertions(+) diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index 744845e6ed..5897889510 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -433,6 +433,8 @@ SUBSYSTEM_DEF(job) to_chat(M, "To speak on your departments radio, use the :h button. To see others, look closely at your headset.") if(job.req_admin_notify) to_chat(M, "You are playing a job that is important for Game Progression. If you have to disconnect, please notify the admins via adminhelp.") + if(job.custom_spawn_text) + to_chat(M, "[job.custom_spawn_text]") if(CONFIG_GET(number/minimal_access_threshold)) to_chat(M, "As this station was initially staffed with a [CONFIG_GET(flag/jobs_have_minimal_access) ? "full crew, only your job's necessities" : "skeleton crew, additional access may"] have been added to your ID card.") diff --git a/code/modules/jobs/job_types/cargo_service.dm b/code/modules/jobs/job_types/cargo_service.dm index 98cdccf4ee..3a3c59cbfe 100644 --- a/code/modules/jobs/job_types/cargo_service.dm +++ b/code/modules/jobs/job_types/cargo_service.dm @@ -71,6 +71,7 @@ Shaft Miner spawn_positions = 3 supervisors = "the quartermaster and the head of personnel" selection_color = "#dcba97" + custom_spawn_text = "Remember, you are a miner, not a hunter. Hunting monsters is not a requirement of your job, the only requirement of your job is to provide materials for the station. Don't be afraid to run away if you're inexperienced with fighting the mining area's locals." outfit = /datum/outfit/job/miner diff --git a/code/modules/jobs/job_types/job.dm b/code/modules/jobs/job_types/job.dm index 5d4802f93a..92f4ccbdd9 100644 --- a/code/modules/jobs/job_types/job.dm +++ b/code/modules/jobs/job_types/job.dm @@ -38,6 +38,9 @@ //If this is set to 1, a text is printed to the player when jobs are assigned, telling him that he should let admins know that he has to disconnect. var/req_admin_notify + //Allows defining arbitrary spawn text for the job + var/custom_spawn_text + //If you have the use_age_restriction_for_jobs config option enabled and the database set up, this option will add a requirement for players to be at least minimal_player_age days old. (meaning they first signed in at least that many days before.) var/minimal_player_age = 0 From 07a5b8fda2e338a6a969c7464b97a8f14e87e88e Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 7 Sep 2018 09:22:46 -0500 Subject: [PATCH 23/29] Automatic changelog generation for PR #7555 [ci skip] --- html/changelogs/AutoChangeLog-pr-7555.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7555.yml diff --git a/html/changelogs/AutoChangeLog-pr-7555.yml b/html/changelogs/AutoChangeLog-pr-7555.yml new file mode 100644 index 0000000000..dde53c6efd --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7555.yml @@ -0,0 +1,4 @@ +author: "deathride58" +delete-after: True +changes: + - rscadd: "When you spawn as a miner, you'll get text clarifying your job description. You might not think it's necessary, but believe me, it is." From b34b53193f122395de6a43ce57d41e109d057801 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Fri, 7 Sep 2018 10:24:39 -0400 Subject: [PATCH 24/29] tgstation/tgstation#39287 - Makes rapid fire mobs more configurable (#7549) --- .../mob/living/simple_animal/hostile/hivebot.dm | 2 +- .../mob/living/simple_animal/hostile/hostile.dm | 10 +++++----- .../mob/living/simple_animal/hostile/nanotrasen.dm | 2 +- .../modules/mob/living/simple_animal/hostile/pirate.dm | 4 ++-- .../living/simple_animal/hostile/retaliate/spaceman.dm | 2 +- .../mob/living/simple_animal/hostile/russian.dm | 2 +- .../mob/living/simple_animal/hostile/syndicate.dm | 2 +- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/code/modules/mob/living/simple_animal/hostile/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebot.dm index 1a92e0b69f..3f0c468d26 100644 --- a/code/modules/mob/living/simple_animal/hostile/hivebot.dm +++ b/code/modules/mob/living/simple_animal/hostile/hivebot.dm @@ -48,7 +48,7 @@ icon_living = "ranged" icon_dead = "ranged" ranged = 1 - rapid = 1 + rapid = 3 retreat_distance = 5 minimum_distance = 5 diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 017af381f0..acb3550454 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -5,7 +5,8 @@ environment_smash = ENVIRONMENT_SMASH_STRUCTURES //Bitflags. Set to ENVIRONMENT_SMASH_STRUCTURES to break closets,tables,racks, etc; ENVIRONMENT_SMASH_WALLS for walls; ENVIRONMENT_SMASH_RWALLS for rwalls var/atom/target var/ranged = 0 - var/rapid = 0 + var/rapid = 0 //How many shots per volley. + var/rapid_fire_delay = 2 //Time between rapid fire shots var/projectiletype //set ONLY it and NULLIFY casingtype var, if we have ONLY projectile var/projectilesound var/casingtype //set ONLY it and NULLIFY projectiletype, if we have projectile IN CASING @@ -330,11 +331,10 @@ return visible_message("[src] [ranged_message] at [A]!") - if(rapid) + if(rapid > 1) var/datum/callback/cb = CALLBACK(src, .proc/Shoot, A) - addtimer(cb, 1) - addtimer(cb, 4) - addtimer(cb, 6) + for(var/i in 1 to rapid) + addtimer(cb, (i - 1)*rapid_fire_delay) else Shoot(A) ranged_cooldown = world.time + ranged_cooldown_time diff --git a/code/modules/mob/living/simple_animal/hostile/nanotrasen.dm b/code/modules/mob/living/simple_animal/hostile/nanotrasen.dm index c02b9259b8..b170ae0574 100644 --- a/code/modules/mob/living/simple_animal/hostile/nanotrasen.dm +++ b/code/modules/mob/living/simple_animal/hostile/nanotrasen.dm @@ -53,7 +53,7 @@ /mob/living/simple_animal/hostile/nanotrasen/ranged/smg icon_state = "nanotrasenrangedsmg" icon_living = "nanotrasenrangedsmg" - rapid = 1 + rapid = 3 casingtype = /obj/item/ammo_casing/c46x30mm projectilesound = 'sound/weapons/gunshot_smg.ogg' loot = list(/obj/item/gun/ballistic/automatic/wt550, diff --git a/code/modules/mob/living/simple_animal/hostile/pirate.dm b/code/modules/mob/living/simple_animal/hostile/pirate.dm index 714d2c7e33..f76357de1b 100644 --- a/code/modules/mob/living/simple_animal/hostile/pirate.dm +++ b/code/modules/mob/living/simple_animal/hostile/pirate.dm @@ -47,7 +47,7 @@ icon_dead = "piratemelee_dead" projectilesound = 'sound/weapons/laser.ogg' ranged = 1 - rapid = 1 + rapid = 3 retreat_distance = 5 minimum_distance = 5 projectiletype = /obj/item/projectile/beam/laser @@ -72,7 +72,7 @@ icon_living = "piratespaceranged" projectilesound = 'sound/weapons/laser.ogg' ranged = 1 - rapid = 1 + rapid = 3 retreat_distance = 5 minimum_distance = 5 projectiletype = /obj/item/projectile/beam/laser diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/spaceman.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/spaceman.dm index 4e4849297c..a132503786 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/spaceman.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/spaceman.dm @@ -64,7 +64,7 @@ icon_state = "nanotrasenrangedsmg" icon_living = "nanotrasenrangedsmg" vision_range = 9 - rapid = 1 + rapid = 3 ranged = 1 retreat_distance = 3 minimum_distance = 5 diff --git a/code/modules/mob/living/simple_animal/hostile/russian.dm b/code/modules/mob/living/simple_animal/hostile/russian.dm index 30924d5519..c083b8fdd5 100644 --- a/code/modules/mob/living/simple_animal/hostile/russian.dm +++ b/code/modules/mob/living/simple_animal/hostile/russian.dm @@ -62,7 +62,7 @@ icon_living = "russianofficer" maxHealth = 65 health = 65 - rapid = 1 + rapid = 3 casingtype = /obj/item/ammo_casing/c9mm loot = list(/obj/effect/mob_spawn/human/corpse/russian/ranged/officer, /obj/item/gun/ballistic/automatic/pistol/APS) diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm index 73283468f6..8efa3e4d35 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm @@ -109,7 +109,7 @@ /mob/living/simple_animal/hostile/syndicate/ranged ranged = 1 - rapid = 1 + rapid = 3 retreat_distance = 5 minimum_distance = 5 icon_state = "syndicateranged" From c0389e4fff0711eb4df1a81ad0c835d2f956210b Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 7 Sep 2018 09:24:41 -0500 Subject: [PATCH 25/29] Automatic changelog generation for PR #7549 [ci skip] --- html/changelogs/AutoChangeLog-pr-7549.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7549.yml diff --git a/html/changelogs/AutoChangeLog-pr-7549.yml b/html/changelogs/AutoChangeLog-pr-7549.yml new file mode 100644 index 0000000000..4f3ab404b4 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7549.yml @@ -0,0 +1,4 @@ +author: "deathride58" +delete-after: True +changes: + - code_imp: "Ports tgstation/tgstation#39287 - You can now configure how fast a mob fires, and how many shots they fire in a single burst" From 7650bac441a81738a2a1121100afc4dc7e3d4365 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Fri, 7 Sep 2018 10:25:42 -0400 Subject: [PATCH 26/29] Upstream bugfix mirror spree (#7541) * tgstation/tgstation#40061 - Fixes mobs getting stuck at min/max body temperature * tgstation/tgstation#40043 - fixes beam rifles opening lockers * tgstation/tgstation#40041 - Pictures of asses are properly sized now * tgstation/tgstation#40084 - fixes lastattacker not including unarmed attacks * tgstation/tgstation#39968 - Fixes plastic golems ventcrawling with items in pockets * tgstation/tgstation#39885 - Fix overcharging energy guns crashing the server --- code/modules/mob/living/carbon/human/species.dm | 3 +++ code/modules/mob/living/ventcrawling.dm | 3 +-- code/modules/mob/status_procs.dm | 2 +- code/modules/paperwork/photocopier.dm | 2 ++ code/modules/projectiles/guns/energy.dm | 2 +- code/modules/projectiles/guns/misc/beam_rifle.dm | 2 +- 6 files changed, 9 insertions(+), 5 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 54f6e3e952..cb0e754450 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1381,6 +1381,9 @@ GLOBAL_LIST_EMPTY(roundstart_races) target.visible_message("[user] has [atk_verb]ed [target]!", \ "[user] has [atk_verb]ed [target]!", null, COMBAT_MESSAGE_RANGE) + target.lastattacker = user.real_name + target.lastattackerckey = user.ckey + if(user.limb_destroyer) target.dismembering_strike(user, affecting.body_zone) target.apply_damage(damage, BRUTE, affecting, armor_block) diff --git a/code/modules/mob/living/ventcrawling.dm b/code/modules/mob/living/ventcrawling.dm index 2d3ed3d669..600fa581cb 100644 --- a/code/modules/mob/living/ventcrawling.dm +++ b/code/modules/mob/living/ventcrawling.dm @@ -57,7 +57,7 @@ GLOBAL_LIST_INIT(ventcrawl_machinery, typecacheof(list( if(iscarbon(src) && ventcrawler < 2)//It must have atleast been 1 to get this far var/failed = 0 - var/list/items_list = get_equipped_items() + var/list/items_list = get_equipped_items(include_pockets = TRUE) if(items_list.len) failed = 1 for(var/obj/item/I in held_items) @@ -120,4 +120,3 @@ GLOBAL_LIST_INIT(ventcrawl_machinery, typecacheof(list( . = new_loc remove_ventcrawl() add_ventcrawl(.) - diff --git a/code/modules/mob/status_procs.dm b/code/modules/mob/status_procs.dm index f031f77351..4c23279a9a 100644 --- a/code/modules/mob/status_procs.dm +++ b/code/modules/mob/status_procs.dm @@ -256,5 +256,5 @@ /////////////////////////////////// TEMPERATURE //////////////////////////////////// /mob/proc/adjust_bodytemperature(amount,min_temp=0,max_temp=INFINITY) - if(bodytemperature > min_temp && bodytemperature < max_temp) + if(bodytemperature >= min_temp && bodytemperature <= max_temp) bodytemperature = CLAMP(bodytemperature + amount,min_temp,max_temp) diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 2a880b670c..b8fac81df8 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -135,6 +135,8 @@ p.pixel_x = rand(-10, 10) p.pixel_y = rand(-10, 10) p.picture = new(null, "You see [ass]'s ass on the photo.", temp_img) + p.picture.psize_x = 128 + p.picture.psize_y = 128 p.update_icon() toner -= 5 busy = TRUE diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index be25a13734..6020a0b945 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -135,7 +135,7 @@ ..() if(!automatic_charge_overlays) return - var/ratio = CEILING((cell.charge / cell.maxcharge) * charge_sections, 1) + var/ratio = CEILING(CLAMP(cell.charge / cell.maxcharge, 0, 1) * charge_sections, 1) if(ratio == old_ratio && !force_update) return old_ratio = ratio diff --git a/code/modules/projectiles/guns/misc/beam_rifle.dm b/code/modules/projectiles/guns/misc/beam_rifle.dm index e00d5263e0..98469ebc31 100644 --- a/code/modules/projectiles/guns/misc/beam_rifle.dm +++ b/code/modules/projectiles/guns/misc/beam_rifle.dm @@ -539,7 +539,7 @@ if(check_pierce(target)) permutated += target trajectory_ignore_forcemove = TRUE - forceMove(target) + forceMove(target.loc) trajectory_ignore_forcemove = FALSE return FALSE if(!QDELETED(target)) From 6fc3df1c91430a6158cbbbdfab54ddb76bb2196a Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 7 Sep 2018 09:25:44 -0500 Subject: [PATCH 27/29] Automatic changelog generation for PR #7541 [ci skip] --- html/changelogs/AutoChangeLog-pr-7541.yml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7541.yml diff --git a/html/changelogs/AutoChangeLog-pr-7541.yml b/html/changelogs/AutoChangeLog-pr-7541.yml new file mode 100644 index 0000000000..1011fdeac0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7541.yml @@ -0,0 +1,9 @@ +author: "TGstation contributors" +delete-after: True +changes: + - bugfix: "(tgstation/tgstation#40043) - Beam rifles no longer open lockers" + - bugfix: "(tgstation/tgstation#40061) - Mobs can no longer get stuck at min/max body temperature" + - bugfix: "(tgstation/tgstation#40041) - Pictures of asses are now properly sized" + - bugfix: "(tgstation/tgstation#40084) - The lastattacker var now includes unarmed attacks" + - bugfix: "(tgstation/tgstation#39968) - Plastic golems can no longer ventcrawl with items in their pockets" + - bugfix: "(tgstation/tgstation#39885) - You can no longer crash the server by overcharging energy guns." From b89203acc7a7adabfd89e6a04a5bd3bd2fbf4df1 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Fri, 7 Sep 2018 10:26:29 -0400 Subject: [PATCH 28/29] reduces stam buffer regen time to 1 second (#7504) --- modular_citadel/code/modules/mob/living/carbon/damage_procs.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_citadel/code/modules/mob/living/carbon/damage_procs.dm b/modular_citadel/code/modules/mob/living/carbon/damage_procs.dm index 8f1d0baff1..217eb9d749 100644 --- a/modular_citadel/code/modules/mob/living/carbon/damage_procs.dm +++ b/modular_citadel/code/modules/mob/living/carbon/damage_procs.dm @@ -5,7 +5,7 @@ if(directstamloss > 0) adjustStaminaLoss(directstamloss) bufferedstam = CLAMP(bufferedstam + amount, 0, stambuffer) - stambufferregentime = world.time + 2 SECONDS + stambufferregentime = world.time + 10 if(updating_stamina) update_health_hud() From 9246537b1fa7168dbf93631cce418bf1513d33ff Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 7 Sep 2018 09:26:31 -0500 Subject: [PATCH 29/29] Automatic changelog generation for PR #7504 [ci skip] --- html/changelogs/AutoChangeLog-pr-7504.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7504.yml diff --git a/html/changelogs/AutoChangeLog-pr-7504.yml b/html/changelogs/AutoChangeLog-pr-7504.yml new file mode 100644 index 0000000000..40dd556956 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7504.yml @@ -0,0 +1,4 @@ +author: "deathride58" +delete-after: True +changes: + - balance: "The stamina buffer now only takes 1 second to start regenerating."