From b2336bcfe54f542f15c457521c36a12d83bf08a6 Mon Sep 17 00:00:00 2001 From: Lularian Date: Wed, 12 Apr 2017 03:43:33 -0500 Subject: [PATCH 01/28] kevinz-meme #000 --- _maps/shuttles/emergency_pubby.dmm | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/_maps/shuttles/emergency_pubby.dmm b/_maps/shuttles/emergency_pubby.dmm index dfcd18a724f..e1823034341 100644 --- a/_maps/shuttles/emergency_pubby.dmm +++ b/_maps/shuttles/emergency_pubby.dmm @@ -177,6 +177,9 @@ /obj/item/weapon/twohanded/required/kirbyplants{ icon_state = "plant-22" }, +/obj/machinery/light{ + dir = 1 + }, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "aG" = ( @@ -421,11 +424,11 @@ ab ab ab ab -aI +ao aL aL aL -aT +ao ab ab ab @@ -445,7 +448,7 @@ ao ao ao ao -ao +aT ab aV aY @@ -525,7 +528,7 @@ ao ao ao ao -ao +aT ab aW aZ @@ -541,11 +544,11 @@ ab ab ab ab -aI +ao aK aK aK -aT +ao ab ab ab From c3fd7c5b57d442f5b3cb16bc8d5f0a4fc2a43d9f Mon Sep 17 00:00:00 2001 From: David Jatczak Date: Wed, 12 Apr 2017 22:20:54 -0400 Subject: [PATCH 02/28] Disabled monkey AI if inside mob --- code/modules/mob/living/carbon/monkey/combat.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/modules/mob/living/carbon/monkey/combat.dm b/code/modules/mob/living/carbon/monkey/combat.dm index 7eed766eaab..c6c50252d75 100644 --- a/code/modules/mob/living/carbon/monkey/combat.dm +++ b/code/modules/mob/living/carbon/monkey/combat.dm @@ -132,6 +132,10 @@ return 0 /mob/living/carbon/monkey/proc/handle_combat() + // Don't do any AI if inside another mob (devoured) + if (ismob(loc)) + // Really no idea what needs to be returned but everything else is TRUE + return TRUE if(on_fire || buckled || restrained()) if(!resisting && prob(MONKEY_RESIST_PROB)) From 7db828644c8cbcc9aa5c617d33bcf0268df4aa2c Mon Sep 17 00:00:00 2001 From: Robustin Date: Thu, 13 Apr 2017 17:31:43 -0400 Subject: [PATCH 03/28] EngiMarket Part Four - Ranged RCD and Rapid Lighting Device (RLD) (#25263) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two new items, one brand new, the other an RCD that works at range without any other bells and whistles. The RLD allows you to create floor and wall lighting along with temporary (they use fuel like flares) glowsticks at range. It can also deconstruct lights. The best part of this feature (besides the visual "ammo" updating icons) is the ability to select absolutely any color you desire. 🆑 Robustin add: Ranged RCD added to the game add: Rapid Lighting Device (also ranged) has been added. It can create wall, floor, and temporary lights of any color you desire. /🆑 --- .../lavaland_surface_ash_walker1.dmm | 2 +- _maps/map_files/debug/runtimestation.dmm | 2861 ++++++++++++++++- code/datums/action.dm | 3 + code/game/atoms.dm | 4 +- .../gamemodes/malfunction/Malf_Modules.dm | 4 +- code/game/gamemodes/sandbox/h_sandbox.dm | 2 +- code/game/machinery/doors/airlock.dm | 4 +- code/game/machinery/vending.dm | 2 +- code/game/objects/items/weapons/RCD.dm | 403 ++- .../structures/crates_lockers/crates.dm | 2 +- code/game/objects/structures/girders.dm | 4 +- code/game/objects/structures/grille.dm | 4 +- code/game/objects/structures/window.dm | 4 +- code/game/turfs/simulated/floor.dm | 4 +- code/game/turfs/simulated/wall/reinf_walls.dm | 4 +- code/game/turfs/simulated/walls.dm | 4 +- code/game/turfs/space/space.dm | 5 +- code/modules/cargo/exports/tools.dm | 2 +- code/modules/clothing/outfits/ert.dm | 4 +- code/modules/clothing/spacesuits/hardsuit.dm | 2 +- code/modules/clothing/suits/miscellaneous.dm | 2 +- code/modules/flufftext/Hallucination.dm | 3 +- code/modules/mining/aux_base_camera.dm | 8 +- .../mob/living/silicon/robot/robot_modules.dm | 2 +- code/modules/power/lighting.dm | 11 + .../research/designs/autolathe_designs.dm | 2 +- code/modules/research/experimentor.dm | 2 +- icons/obj/tools.dmi | Bin 10864 -> 15004 bytes 28 files changed, 3164 insertions(+), 190 deletions(-) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm index f219cfcc992..a6c92c7610c 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm @@ -145,7 +145,7 @@ /area/ruin/unpowered) "u" = ( /obj/structure/closet/crate/engineering, -/obj/item/weapon/rcd/loaded, +/obj/item/weapon/construction/rcd/loaded, /turf/open/floor/engine/cult{ baseturf = /turf/open/floor/plating/lava/smooth }, diff --git a/_maps/map_files/debug/runtimestation.dmm b/_maps/map_files/debug/runtimestation.dmm index b3facda8d26..2c90bf7f22f 100644 --- a/_maps/map_files/debug/runtimestation.dmm +++ b/_maps/map_files/debug/runtimestation.dmm @@ -1,3 +1,4 @@ + "aa" = (/turf/open/space/basic,/area/space) "ab" = (/obj/structure/lattice,/turf/open/space,/area/space) "ac" = (/turf/open/space,/area/space/nearstation) @@ -87,7 +88,7 @@ "bI" = (/obj/structure/table,/turf/open/floor/plasteel,/area/bridge) "bJ" = (/obj/structure/table,/obj/item/weapon/card/id/captains_spare,/turf/open/floor/plasteel,/area/bridge) "bK" = (/obj/structure/table,/obj/item/weapon/storage/backpack/holding,/turf/open/floor/plasteel,/area/bridge) -"bL" = (/obj/structure/table,/obj/item/weapon/rcd_ammo/large,/obj/item/weapon/rcd_ammo/large,/obj/item/weapon/rcd_ammo/large,/obj/item/weapon/rcd,/turf/open/floor/plasteel,/area/bridge) +"bL" = (/obj/structure/table,/obj/item/weapon/rcd_ammo/large,/obj/item/weapon/rcd_ammo/large,/obj/item/weapon/rcd_ammo/large,/obj/item/weapon/construction/rcd,/turf/open/floor/plasteel,/area/bridge) "bM" = (/obj/structure/closet/secure_closet/hop,/turf/open/floor/plasteel/blue/side{dir = 4},/area/bridge) "bN" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/open/floor/plasteel,/area/hallway/primary/central) "bO" = (/obj/structure/cable{d1 = 1;d2 = 2;icon_state = "1-2"},/turf/open/floor/plasteel,/area/hallway/primary/central) @@ -200,56 +201,2810 @@ "dR" = (/obj/structure/table,/obj/item/device/flashlight{pixel_y = 5},/turf/open/floor/plasteel,/area/storage/primary) (1,1,1) = {" -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaabacadadadadadadadadadaeaeaeaeaeaeaeadadadadadadadadadadadadadadadadacabaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaabacadafafafafafafafadagagagagacacacadafafafafafafafafafafafafafafadacabaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaabacadafahahahahahahahagaiaiagacacacajajajajakakakakakakakakakakafadacabaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaabacadafahalamamamamahaganaoagagajajajapaqarakasatauavavavavavakafadacabaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaabacadafahawaxayayazahagaiaAaBaBaCaDaCaDaEaFakaGaHaIavaJaKaLavakafadacabaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaabacadafahaMawaNaOaPahagaQaRagagajajajaSaTaDaUaVaWaXavaKavaKaYakafadacabaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaabacadafahaZbabbbcaPahagaiaiagacacacajbdbebfakbgbhaIavaLbiaJavakafadacabaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaabacadafahbjbkblbmbnahagagagagacacacajbobebpakbqbraIavavavavavakafadacabaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaabacadafahbsbtahahahbububvbvbvbvbvbububwbxajakakakakbybybybybybyafadacabaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaabacadbzbAbBbCbDbEbFbubGbHbIbJbKbLbMbubNbObPbQbRbSbTbybUbVbWbXbyafadacabaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaabacbYafbZcacbcccccccdcecfcfcfcfcfcgchcicjccccccccccckclcmcmcmcnafadacabaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaabacbYafbZbObNbEbEcobucpcqcqcqcqcqcrcsctbEbEbEbEbEcobycucmcmcmbybybyacabaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaabacbYafbZbObNbEbEbEbucvbvbucwbubvbucsbNbEbEbEbEbEbEcxcucmcmcycnczcnacabaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaabacbYafbZbObCcAcAcAcBcCcDcDcDcDcDcDcEcFcAcAcAcAcAcAcGcHcmcmcmbybybyacabaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaabacbYafbZbObNbEbEbEbEbEbEbEbEbEbEbEbObNbEbEbEbEbEbEbycIcmcmcmcnafadacabaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaabacadbzbAbObNbEbEbEbEbEbEbEbEbEbEbEbObNbEbEbEbEbEbEbycJcKcLcMbyafadacabaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaabacadafcNcOcPcQcQcNcRcRcRcNcQcQcNcScTcUcScScScVcVcVbybybybybybyafadacabaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaabacadafcNcWcXcYcYcYcYcYcYcYcYcYcZcSdadbdcdddedfdgdhdidjdkdldlcSafadacabaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaabacadafcNdmdndndndndndndndndndndocSdpdldcdqdrdsdtdudvdwdkdldxcSafadacabaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaabacadafcNdydndndndndndndndndndndzcSdldldAdBdBdBdBdBdBdBdCdldlcSafadacabaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaabacadafcNdydndndndndndndndndndndzcSdldldldldldldldldldldldldlcSafadacabaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaabacadafcNdydndndndndndndndndndndzcSdldldDdEdEdEdEdEdEdEdFdldlcSafadacabaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaabacadafcNdydndndndndndndndndndndzdGdldldcdHdHdHdHdHdHdHdkdldlcSafadacabaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaabacadafcNdydndndndndndndndndndndzdGdldldcdIdIdIdIdIdIdIdkdldlcSafadacabaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaabacadafcNdydndndndndndndndndndndzcSdldldAdBdBdBdBdBdBdBdCdldlcSafadacabaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaabacadafcNdydndndndndndndndndndndzcSdldldldldldldldldldldldldlcSafadacabaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaabacadafcNdydndndndndndndndndndndzcSdldldDdEdEdEdEdEdEdEdFdldlcSafadacabaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaabacadafcNdmdndndndndndndndndndndocSdpdldcdJdJdJdJdJdJdJdkdldxcSafadacabaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaabacadafcNdKdLdLdLdLdLdLdLdLdLdLdMcSdldldcdNdOdNdNdPdQdRdkdldlcSafadacabaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaabacadafcNcNcNcNcNcNcNcNcNcNcNcNcNcScScScScScScScScScScScScScScSafadacabaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaabacadafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafadacabaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaabacadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadacabaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(2,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(3,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(4,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(5,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(6,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(7,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(8,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(9,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(10,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(11,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +bY +bY +bY +bY +bY +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(12,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +af +af +af +af +af +af +af +bz +af +af +af +af +af +bz +af +af +af +af +af +af +af +af +af +af +af +af +af +af +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(13,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ah +ah +ah +ah +ah +ah +ah +bA +bZ +bZ +bZ +bZ +bZ +bA +cN +cN +cN +cN +cN +cN +cN +cN +cN +cN +cN +cN +cN +cN +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(14,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ah +al +aw +aM +aZ +bj +bs +bB +ca +bO +bO +bO +bO +bO +cO +cW +dm +dy +dy +dy +dy +dy +dy +dy +dy +dm +dK +cN +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(15,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ah +am +ax +aw +ba +bk +bt +bC +cb +bN +bN +bC +bN +bN +cP +cX +dn +dn +dn +dn +dn +dn +dn +dn +dn +dn +dL +cN +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(16,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ah +am +ay +aN +bb +bl +ah +bD +cc +bE +bE +cA +bE +bE +cQ +cY +dn +dn +dn +dn +dn +dn +dn +dn +dn +dn +dL +cN +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(17,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ah +am +ay +aO +bc +bm +ah +bE +cc +bE +bE +cA +bE +bE +cQ +cY +dn +dn +dn +dn +dn +dn +dn +dn +dn +dn +dL +cN +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(18,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ah +am +az +aP +aP +bn +ah +bF +cc +co +bE +cA +bE +bE +cN +cY +dn +dn +dn +dn +dn +dn +dn +dn +dn +dn +dL +cN +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(19,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +ad +ah +ah +ah +ah +ah +ah +bu +bu +cd +bu +bu +cB +bE +bE +cR +cY +dn +dn +dn +dn +dn +dn +dn +dn +dn +dn +dL +cN +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(20,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ae +ag +ag +ag +ag +ag +ag +ag +bu +bG +ce +cp +cv +cC +bE +bE +cR +cY +dn +dn +dn +dn +dn +dn +dn +dn +dn +dn +dL +cN +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(21,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ae +ag +ai +an +ai +aQ +ai +ag +bv +bH +cf +cq +bv +cD +bE +bE +cR +cY +dn +dn +dn +dn +dn +dn +dn +dn +dn +dn +dL +cN +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(22,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ae +ag +ai +ao +aA +aR +ai +ag +bv +bI +cf +cq +bu +cD +bE +bE +cN +cY +dn +dn +dn +dn +dn +dn +dn +dn +dn +dn +dL +cN +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(23,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ae +ag +ag +ag +aB +ag +ag +ag +bv +bJ +cf +cq +cw +cD +bE +bE +cQ +cY +dn +dn +dn +dn +dn +dn +dn +dn +dn +dn +dL +cN +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(24,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ae +ac +ac +ag +aB +ag +ac +ac +bv +bK +cf +cq +bu +cD +bE +bE +cQ +cY +dn +dn +dn +dn +dn +dn +dn +dn +dn +dn +dL +cN +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(25,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ae +ac +ac +aj +aC +aj +ac +ac +bv +bL +cf +cq +bv +cD +bE +bE +cN +cZ +do +dz +dz +dz +dz +dz +dz +dz +dz +do +dM +cN +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(26,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ae +ac +ac +aj +aD +aj +ac +ac +bu +bM +cg +cr +bu +cD +bE +bE +cS +cS +cS +cS +cS +cS +dG +dG +cS +cS +cS +cS +cS +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(27,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +ad +aj +aj +aC +aj +aj +aj +bu +bu +ch +cs +cs +cE +bO +bO +cT +da +dp +dl +dl +dl +dl +dl +dl +dl +dl +dp +dl +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(28,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +aj +ap +aD +aS +bd +bo +bw +bN +ci +ct +bN +cF +bN +bN +cU +db +dl +dl +dl +dl +dl +dl +dl +dl +dl +dl +dl +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(29,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +aj +aq +aE +aT +be +be +bx +bO +cj +bE +bE +cA +bE +bE +cS +dc +dc +dA +dl +dD +dc +dc +dA +dl +dD +dc +dc +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(30,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +aj +ar +aF +aD +bf +bp +aj +bP +cc +bE +bE +cA +bE +bE +cS +dd +dq +dB +dl +dE +dH +dI +dB +dl +dE +dJ +dN +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(31,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ak +ak +ak +aU +ak +ak +ak +bQ +cc +bE +bE +cA +bE +bE +cS +de +dr +dB +dl +dE +dH +dI +dB +dl +dE +dJ +dO +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(32,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ak +as +aG +aV +bg +bq +ak +bR +cc +bE +bE +cA +bE +bE +cV +df +ds +dB +dl +dE +dH +dI +dB +dl +dE +dJ +dN +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(33,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ak +at +aH +aW +bh +br +ak +bS +cc +bE +bE +cA +bE +bE +cV +dg +dt +dB +dl +dE +dH +dI +dB +dl +dE +dJ +dN +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(34,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ak +au +aI +aX +aI +aI +ak +bT +cc +co +bE +cA +bE +bE +cV +dh +du +dB +dl +dE +dH +dI +dB +dl +dE +dJ +dP +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(35,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ak +av +av +av +av +av +by +by +ck +by +cx +cG +by +by +by +di +dv +dB +dl +dE +dH +dI +dB +dl +dE +dJ +dQ +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(36,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ak +av +aJ +aK +aL +av +by +bU +cl +cu +cu +cH +cI +cJ +by +dj +dw +dB +dl +dE +dH +dI +dB +dl +dE +dJ +dR +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(37,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ak +av +aK +av +bi +av +by +bV +cm +cm +cm +cm +cm +cK +by +dk +dk +dC +dl +dF +dk +dk +dC +dl +dF +dk +dk +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(38,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ak +av +aL +aK +aJ +av +by +bW +cm +cm +cm +cm +cm +cL +by +dl +dl +dl +dl +dl +dl +dl +dl +dl +dl +dl +dl +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(39,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ak +av +av +aY +av +av +by +bX +cm +cm +cy +cm +cm +cM +by +dl +dx +dl +dl +dl +dl +dl +dl +dl +dl +dx +dl +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(40,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ak +ak +ak +ak +ak +ak +by +by +cn +by +cn +by +cn +by +by +cS +cS +cS +cS +cS +cS +cS +cS +cS +cS +cS +cS +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(41,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +af +af +af +af +af +af +af +af +af +by +cz +by +af +af +af +af +af +af +af +af +af +af +af +af +af +af +af +af +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(42,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +by +cn +by +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(43,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(44,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(45,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(46,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(47,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(48,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(49,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(50,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(51,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(52,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa "} diff --git a/code/datums/action.dm b/code/datums/action.dm index 03b293b13dc..63de6b19e37 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -198,6 +198,9 @@ if(target == C.internal) button.icon_state = "template_active" +/datum/action/item_action/pick_color + name = "Choose A Color" + /datum/action/item_action/toggle_mister name = "Toggle Mister" diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 95b77d9d67a..c12d828fff7 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -445,10 +445,10 @@ GLOBAL_LIST_EMPTY(blood_splatter_icons) /atom/proc/ratvar_act() return -/atom/proc/rcd_vals(mob/user, obj/item/weapon/rcd/the_rcd) +/atom/proc/rcd_vals(mob/user, obj/item/weapon/construction/rcd/the_rcd) return FALSE -/atom/proc/rcd_act(mob/user, obj/item/weapon/rcd/the_rcd, passed_mode) +/atom/proc/rcd_act(mob/user, obj/item/weapon/construction/rcd/the_rcd, passed_mode) return FALSE /atom/proc/storage_contents_dump_act(obj/item/weapon/storage/src_object, mob/user) diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm index d581af11b94..4eea55dbca7 100644 --- a/code/game/gamemodes/malfunction/Malf_Modules.dm +++ b/code/game/gamemodes/malfunction/Malf_Modules.dm @@ -197,8 +197,8 @@ return for(var/I in GLOB.rcd_list) - if(!istype(I, /obj/item/weapon/rcd/borg)) //Ensures that cyborg RCDs are spared. - var/obj/item/weapon/rcd/RCD = I + if(!istype(I, /obj/item/weapon/construction/rcd/borg)) //Ensures that cyborg RCDs are spared. + var/obj/item/weapon/construction/rcd/RCD = I RCD.detonate_pulse() to_chat(src, "RCD detonation pulse emitted.") diff --git a/code/game/gamemodes/sandbox/h_sandbox.dm b/code/game/gamemodes/sandbox/h_sandbox.dm index ae0486c399f..07a4e0af6c0 100644 --- a/code/game/gamemodes/sandbox/h_sandbox.dm +++ b/code/game/gamemodes/sandbox/h_sandbox.dm @@ -218,7 +218,7 @@ GLOBAL_VAR_INIT(hsboxspawn, TRUE) if("hsbrcd") if(!GLOB.hsboxspawn) return - new/obj/item/weapon/rcd/combat(usr.loc) + new/obj/item/weapon/construction/rcd/combat(usr.loc) // // New sandbox airlock maker diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 9a3af5b627f..147e07fe1da 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -1540,13 +1540,13 @@ ae.loc = src.loc qdel(src) -/obj/machinery/door/airlock/rcd_vals(mob/user, obj/item/weapon/rcd/the_rcd) +/obj/machinery/door/airlock/rcd_vals(mob/user, obj/item/weapon/construction/rcd/the_rcd) switch(the_rcd.mode) if(RCD_DECONSTRUCT) return list("mode" = RCD_DECONSTRUCT, "delay" = 50, "cost" = 32) return FALSE -/obj/machinery/door/airlock/rcd_act(mob/user, obj/item/weapon/rcd/the_rcd, passed_mode) +/obj/machinery/door/airlock/rcd_act(mob/user, obj/item/weapon/construction/rcd/the_rcd, passed_mode) switch(passed_mode) if(RCD_DECONSTRUCT) to_chat(user, "You deconstruct the airlock.") diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 92984b4852b..a05a5af3755 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -1052,7 +1052,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C icon_state = "engivend" icon_deny = "engivend-deny" req_access_txt = "11" //Engineering Equipment access - products = list(/obj/item/clothing/glasses/meson/engine = 2,/obj/item/device/multitool = 4,/obj/item/weapon/electronics/airlock = 10,/obj/item/weapon/electronics/apc = 10,/obj/item/weapon/electronics/airalarm = 10,/obj/item/weapon/stock_parts/cell/high = 10, /obj/item/weapon/rcd/loaded = 3, /obj/item/device/geiger_counter = 5) + products = list(/obj/item/clothing/glasses/meson/engine = 2,/obj/item/device/multitool = 4,/obj/item/weapon/electronics/airlock = 10,/obj/item/weapon/electronics/apc = 10,/obj/item/weapon/electronics/airalarm = 10,/obj/item/weapon/stock_parts/cell/high = 10, /obj/item/weapon/construction/rcd/loaded = 3, /obj/item/device/geiger_counter = 5) contraband = list(/obj/item/weapon/stock_parts/cell/potato = 3) premium = list(/obj/item/weapon/storage/belt/utility = 3) armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50) diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm index dbb3149a385..f8e716ea694 100644 --- a/code/game/objects/items/weapons/RCD.dm +++ b/code/game/objects/items/weapons/RCD.dm @@ -1,14 +1,14 @@ - +#define GLOW_MODE 3 +#define LIGHT_MODE 2 +#define REMOVE_MODE 1 /* CONTAINS: RCD +ARCD */ -/obj/item/weapon/rcd - name = "rapid-construction-device (RCD)" - desc = "A device used to rapidly build and deconstruct walls and floors." - icon = 'icons/obj/tools.dmi' - icon_state = "rcd" + +obj/item/weapon/construction opacity = 0 density = 0 anchored = 0 @@ -25,30 +25,114 @@ RCD resistance_flags = FIRE_PROOF var/datum/effect_system/spark_spread/spark_system var/matter = 0 - var/max_matter = 160 - var/working = 0 + var/max_matter = 100 + var/sheetmultiplier = 4 //Controls the amount of matter added for each glass/metal sheet, triple for plasteel + var/plasteelmultiplier = 3 //Plasteel is worth 3 times more than glass or metal + var/no_ammo_message = "The \'Low Ammo\' light on the device blinks yellow." + +/obj/item/weapon/construction/Initialize() + ..() + desc = "A [src]. It currently holds [matter]/[max_matter] matter-units." + spark_system = new /datum/effect_system/spark_spread + spark_system.set_up(5, 0, src) + spark_system.attach(src) + + +/obj/item/weapon/construction/Destroy() + QDEL_NULL(spark_system) + . = ..() + +/obj/item/weapon/construction/attackby(obj/item/weapon/W, mob/user, params) + if(iscyborg(user)) + return + var/loaded = 0 + if(istype(W, /obj/item/weapon/rcd_ammo)) + var/obj/item/weapon/rcd_ammo/R = W + if((matter + R.ammoamt) > max_matter) + to_chat(user, "The [src] can't hold any more matter-units!") + return + qdel(W) + matter += R.ammoamt + playsound(src.loc, 'sound/machines/click.ogg', 50, 1) + loaded = 1 + else if(istype(W, /obj/item/stack/sheet/metal) || istype(W, /obj/item/stack/sheet/glass)) + loaded = loadwithsheets(W, sheetmultiplier, user) + else if(istype(W, /obj/item/stack/sheet/plasteel)) + loaded = loadwithsheets(W, plasteelmultiplier*sheetmultiplier, user) //Plasteel is worth 3 times more than glass or metal + if(loaded) + to_chat(user, "The [src] now holds [matter]/[max_matter] matter-units.") + desc = "A RCD. It currently holds [matter]/[max_matter] matter-units." + else + return ..() + +/obj/item/weapon/construction/proc/loadwithsheets(obj/item/stack/sheet/S, value, mob/user) + var/maxsheets = round((max_matter-matter)/value) //calculate the max number of sheets that will fit in RCD + if(maxsheets > 0) + var/amount_to_use = min(S.amount, maxsheets) + S.use(amount_to_use) + matter += value*amount_to_use + playsound(src.loc, 'sound/machines/click.ogg', 50, 1) + to_chat(user, "You insert [amount_to_use] [S.name] sheets into the [src]. ") + return 1 + to_chat(user, "You can't insert any more [S.name] sheets into the [src]!") + return 0 + +/obj/item/weapon/construction/proc/activate() + playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + +/obj/item/weapon/construction/attack_self(mob/user) + playsound(src.loc, 'sound/effects/pop.ogg', 50, 0) + if(prob(20)) + spark_system.start() + +/obj/item/weapon/construction/proc/useResource(amount, mob/user) + if(matter < amount) + if(user) + to_chat(user, no_ammo_message) + return 0 + matter -= amount + desc = "A [src]. It currently holds [matter]/[max_matter] matter-units." + return 1 + +/obj/item/weapon/construction/proc/checkResource(amount, mob/user) + . = matter >= amount + if(!. && user) + to_chat(user, no_ammo_message) + return . + +/obj/item/weapon/construction/proc/range_check(atom/A, mob/user) + if(!(A in view(7, get_turf(user)))) + to_chat(user, "The \'Out of Range\' light on the [src] blinks red.") + return FALSE + +/obj/item/weapon/construction/proc/prox_check(proximity) + if(!proximity) + return + + +/obj/item/weapon/construction/rcd + name = "rapid-construction-device (RCD)" + desc = "A device used to rapidly build and deconstruct walls and floors." + icon = 'icons/obj/tools.dmi' + icon_state = "rcd" + max_matter = 160 var/mode = 1 var/canRturf = 0 + var/ranged = FALSE var/airlock_type = /obj/machinery/door/airlock var/window_type = /obj/structure/window/fulltile var/advanced_airlock_setting = 1 //Set to 1 if you want more paintjobs available - var/sheetmultiplier = 4 //Controls the amount of matter added for each glass/metal sheet, triple for plasteel - var/plasteelmultiplier = 3 //Plasteel is worth 3 times more than glass or metal - var/list/conf_access = null var/use_one_access = 0 //If the airlock should require ALL or only ONE of the listed accesses. - var/delay_mod = 1 - var/no_ammo_message = "The \'Low Ammo\' light on \ - the RCD blinks yellow." -/obj/item/weapon/rcd/suicide_act(mob/user) +/obj/item/weapon/construction/rcd/suicide_act(mob/user) user.visible_message("[user] sets the RCD to 'Wall' and points it down [user.p_their()] throat! It looks like [user.p_theyre()] trying to commit suicide..") return (BRUTELOSS) -/obj/item/weapon/rcd/verb/toggle_window_type() +/obj/item/weapon/construction/rcd/verb/toggle_window_type() set name = "Toggle Window Type" set category = "Object" set src in usr // What does this do? @@ -64,7 +148,7 @@ RCD to_chat(usr, "You change \the [src]'s window mode to [window_type_name].") -/obj/item/weapon/rcd/verb/change_airlock_access() +/obj/item/weapon/construction/rcd/verb/change_airlock_access() set name = "Change Airlock Access" set category = "Object" set src in usr @@ -79,7 +163,6 @@ RCD var/t1 = text("") - if(use_one_access) t1 += "Restriction Type: At least one access required
" else @@ -114,7 +197,7 @@ RCD popup.open() onclose(usr, "airlock") -/obj/item/weapon/rcd/Topic(href, href_list) +/obj/item/weapon/construction/rcd/Topic(href, href_list) ..() if (usr.stat || usr.restrained()) return @@ -127,7 +210,7 @@ RCD change_airlock_access() -/obj/item/weapon/rcd/proc/toggle_access(acc) +/obj/item/weapon/construction/rcd/proc/toggle_access(acc) if (acc == "all") conf_access = null else if(acc == "one") @@ -145,7 +228,7 @@ RCD if (!conf_access.len) conf_access = null -/obj/item/weapon/rcd/verb/change_airlock_setting() +/obj/item/weapon/construction/rcd/verb/change_airlock_setting() set name = "Change Airlock Setting" set category = "Object" set src in usr @@ -207,59 +290,16 @@ RCD airlock_type = /obj/machinery/door/airlock -/obj/item/weapon/rcd/New() +/obj/item/weapon/construction/rcd/New() ..() - desc = "An RCD. It currently holds [matter]/[max_matter] matter-units." - src.spark_system = new /datum/effect_system/spark_spread - spark_system.set_up(5, 0, src) - spark_system.attach(src) GLOB.rcd_list += src - -/obj/item/weapon/rcd/Destroy() - qdel(spark_system) - spark_system = null +/obj/item/weapon/construction/rcd/Destroy() GLOB.rcd_list -= src . = ..() -/obj/item/weapon/rcd/attackby(obj/item/weapon/W, mob/user, params) - if(iscyborg(user)) //Make sure cyborgs can't load their RCDs - return - var/loaded = 0 - if(istype(W, /obj/item/weapon/rcd_ammo)) - var/obj/item/weapon/rcd_ammo/R = W - if((matter + R.ammoamt) > max_matter) - to_chat(user, "The RCD can't hold any more matter-units!") - return - qdel(W) - matter += R.ammoamt - playsound(src.loc, 'sound/machines/click.ogg', 50, 1) - loaded = 1 - else if(istype(W, /obj/item/stack/sheet/metal) || istype(W, /obj/item/stack/sheet/glass)) - loaded = loadwithsheets(W, sheetmultiplier, user) - else if(istype(W, /obj/item/stack/sheet/plasteel)) - loaded = loadwithsheets(W, plasteelmultiplier*sheetmultiplier, user) //Plasteel is worth 3 times more than glass or metal - if(loaded) - to_chat(user, "The RCD now holds [matter]/[max_matter] matter-units.") - desc = "A RCD. It currently holds [matter]/[max_matter] matter-units." - else - return ..() - -/obj/item/weapon/rcd/proc/loadwithsheets(obj/item/stack/sheet/S, value, mob/user) - var/maxsheets = round((max_matter-matter)/value) //calculate the max number of sheets that will fit in RCD - if(maxsheets > 0) - var/amount_to_use = min(S.amount, maxsheets) - S.use(amount_to_use) - matter += value*amount_to_use - playsound(src.loc, 'sound/machines/click.ogg', 50, 1) - to_chat(user, "You insert [amount_to_use] [S.name] sheets into the RCD. ") - return 1 - to_chat(user, "You can't insert any more [S.name] sheets into the RCD!") - return 0 - -/obj/item/weapon/rcd/attack_self(mob/user) - //Change the mode - playsound(src.loc, 'sound/effects/pop.ogg', 50, 0) +/obj/item/weapon/construction/rcd/attack_self(mob/user) + ..() switch(mode) if(1) mode = 2 @@ -274,16 +314,14 @@ RCD mode = 1 to_chat(user, "You change RCD's mode to 'Floor & Walls'.") - if(prob(20)) - src.spark_system.start() - -/obj/item/weapon/rcd/proc/activate() - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - - -/obj/item/weapon/rcd/afterattack(atom/A, mob/user, proximity) - if(!proximity) +/obj/item/weapon/construction/rcd/proc/target_check(atom/A, mob/user) // only returns true for stuff the device can actually work with + if((isturf(A) && A.density && mode==RCD_DECONSTRUCT) || (isturf(A) && !A.density) || (istype(A, /obj/machinery/door/airlock) && mode==RCD_DECONSTRUCT) || istype(A, /obj/structure/grille) || (istype(A, /obj/structure/window) && mode==RCD_DECONSTRUCT) || istype(A, /obj/structure/girder)) + return TRUE + else return FALSE + +/obj/item/weapon/construction/rcd/afterattack(atom/A, mob/user, proximity) + prox_check() var/list/rcd_results = A.rcd_vals(user, src) if(!rcd_results) return FALSE @@ -295,40 +333,26 @@ RCD playsound(src.loc, 'sound/machines/click.ogg', 50, 1) return TRUE -/obj/item/weapon/rcd/proc/useResource(amount, mob/user) - if(matter < amount) - if(user) - to_chat(user, no_ammo_message) - return 0 - matter -= amount - desc = "An RCD. It currently holds [matter]/[max_matter] matter-units." - return 1 -/obj/item/weapon/rcd/proc/checkResource(amount, mob/user) - . = matter >= amount - if(!. && user) - to_chat(user, no_ammo_message) - return . - -/obj/item/weapon/rcd/proc/detonate_pulse() +/obj/item/weapon/construction/rcd/proc/detonate_pulse() audible_message("[src] begins to vibrate and \ buzz loudly!","[src] begins \ vibrating violently!") // 5 seconds to get rid of it addtimer(CALLBACK(src, .proc/detonate_pulse_explode), 50) -/obj/item/weapon/rcd/proc/detonate_pulse_explode() +/obj/item/weapon/construction/rcd/proc/detonate_pulse_explode() explosion(src, 0, 0, 3, 1, flame_range = 1) qdel(src) -/obj/item/weapon/rcd/borg/New() +/obj/item/weapon/construction/rcd/borg/New() ..() no_ammo_message = "Insufficient charge." desc = "A device used to rapidly build walls and floors." canRturf = 1 -/obj/item/weapon/rcd/borg/useResource(amount, mob/user) +/obj/item/weapon/construction/rcd/borg/useResource(amount, mob/user) if(!iscyborg(user)) return 0 var/mob/living/silicon/robot/borgy = user @@ -341,7 +365,7 @@ RCD to_chat(user, no_ammo_message) return . -/obj/item/weapon/rcd/borg/checkResource(amount, mob/user) +/obj/item/weapon/construction/rcd/borg/checkResource(amount, mob/user) if(!iscyborg(user)) return 0 var/mob/living/silicon/robot/borgy = user @@ -354,10 +378,10 @@ RCD to_chat(user, no_ammo_message) return . -/obj/item/weapon/rcd/loaded +/obj/item/weapon/construction/rcd/loaded matter = 160 -/obj/item/weapon/rcd/combat +/obj/item/weapon/construction/rcd/combat name = "industrial RCD" max_matter = 500 matter = 500 @@ -378,7 +402,188 @@ RCD ammoamt = 160 -/obj/item/weapon/rcd/admin +/obj/item/weapon/construction/rcd/admin name = "admin RCD" max_matter = INFINITY matter = INFINITY + + +// Ranged RCD + + +/obj/item/weapon/construction/rcd/arcd + name = "advanced rapid-construction-device (ARCD)" + desc = "A prototype RCD with ranged capability and extended capacity" + max_matter = 300 + matter = 300 + delay_mod = 0.6 + ranged = TRUE + icon_state = "arcd" + +/obj/item/weapon/construction/rcd/arcd/afterattack(atom/A, mob/user) + range_check(A,user) + if(target_check(A,user)) + user.Beam(A,icon_state="rped_upgrade",time=30) + ..() + + + +// RAPID LIGHTING DEVICE + + + +/obj/item/weapon/construction/rld + name = "rapid-light-device (RLD)" + desc = "A device used to rapidly provide lighting sources to an area." + icon = 'icons/obj/tools.dmi' + icon_state = "rld-5" + matter = 200 + max_matter = 200 + var/mode = LIGHT_MODE + actions_types = list(/datum/action/item_action/pick_color) + + var/wallcost = 10 + var/floorcost = 15 + var/launchcost = 5 + var/deconcost = 10 + + var/walldelay = 10 + var/floordelay = 10 + var/decondelay = 15 + + var/color_choice = null + + +/obj/item/weapon/construction/rld/ui_action_click(mob/user, var/datum/action/A) + if(istype(A, /datum/action/item_action/pick_color)) + color_choice = input(user,"Choose Color") as color + else + ..() + +/obj/item/weapon/construction/rld/update_icon() + icon_state = "rld-[round(matter/35)]" + ..() + + +/obj/item/weapon/construction/rld/attack_self(mob/user) + ..() + switch(mode) + if(REMOVE_MODE) + mode = LIGHT_MODE + to_chat(user, "You change RLD's mode to 'Permanent Light Construction'.") + if(LIGHT_MODE) + mode = GLOW_MODE + to_chat(user, "You change RLD's mode to 'Light Launcher'.") + if(GLOW_MODE) + mode = REMOVE_MODE + to_chat(user, "You change RLD's mode to 'Deconstruct'.") + + +/obj/item/weapon/construction/rld/proc/checkdupes(var/target) + . = list() + var/turf/checking = get_turf(target) + for(var/obj/machinery/light/dupe in checking) + if(istype(dupe, /obj/machinery/light)) + . |= dupe + + +/obj/item/weapon/construction/rld/afterattack(atom/A, mob/user) + range_check(A,user) + var/turf/start = get_turf(src) + switch(mode) + if(REMOVE_MODE) + if(istype(A, /obj/machinery/light/)) + if(checkResource(deconcost, user)) + to_chat(user, "You start deconstructing [A]...") + user.Beam(A,icon_state="nzcrentrs_power",time=15) + playsound(src.loc, 'sound/machines/click.ogg', 50, 1) + if(do_after(user, decondelay, target = A)) + if(!useResource(deconcost, user)) + return 0 + activate() + qdel(A) + return TRUE + return FALSE + if(LIGHT_MODE) + if(iswallturf(A)) + var/turf/closed/wall/W = A + if(checkResource(floorcost, user)) + to_chat(user, "You start building a wall light...") + user.Beam(A,icon_state="nzcrentrs_power",time=15) + playsound(src.loc, 'sound/machines/click.ogg', 50, 1) + playsound(src.loc, 'sound/effects/light_flicker.ogg', 50, 0) + if(do_after(user, floordelay, target = A)) + if(!istype(W)) + return FALSE + var/list/candidates = list() + var/turf/open/winner = null + var/winning_dist = null + for(var/direction in GLOB.cardinal) + var/turf/C = get_step(W, direction) + var/list/dupes = checkdupes(C) + if(start.CanAtmosPass(C) && !dupes.len) + candidates += C + if(!candidates.len) + to_chat(user, "Valid target not found...") + playsound(src.loc, 'sound/misc/compiler-failure.ogg', 30, 1) + return FALSE + for(var/turf/open/O in candidates) + if(istype(O)) + var/x0 = O.x + var/y0 = O.y + var/contender = cheap_hypotenuse(start.x, start.y, x0, y0) + if(!winner) + winner = O + winning_dist = contender + else + if(contender < winning_dist) // lower is better + winner = O + winning_dist = contender + activate() + if(!useResource(wallcost, user)) + return FALSE + var/light = get_turf(winner) + var/align = get_dir(winner, A) + var/obj/machinery/light/L = new /obj/machinery/light(light) + L.dir = align + L.color = color_choice + L.light_color = L.color + return TRUE + return FALSE + + if(isfloorturf(A)) + var/turf/open/floor/F = A + if(checkResource(floorcost, user)) + to_chat(user, "You start building a floor light...") + user.Beam(A,icon_state="nzcrentrs_power",time=15) + playsound(src.loc, 'sound/machines/click.ogg', 50, 1) + playsound(src.loc, 'sound/effects/light_flicker.ogg', 50, 1) + if(do_after(user, floordelay, target = A)) + if(!istype(F)) + return 0 + if(!useResource(floorcost, user)) + return 0 + activate() + var/destination = get_turf(A) + var/obj/machinery/light/floor/FL = new /obj/machinery/light/floor(destination) + FL.color = color_choice + FL.light_color = FL.color + return TRUE + return FALSE + + if(GLOW_MODE) + if(useResource(launchcost, user)) + activate() + to_chat(user, "You fire a glowstick!") + var/obj/item/device/flashlight/glowstick/G = new /obj/item/device/flashlight/glowstick(start) + G.color = color_choice + G.light_color = G.color + G.throw_at(A, 9, 3, user) + G.on = TRUE + G.update_brightness() + return TRUE + return FALSE + +#undef GLOW_MODE +#undef LIGHT_MODE +#undef REMOVE_MODE diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index 4270e765a29..040edcd9316 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -139,7 +139,7 @@ ..() for(var/i in 1 to 4) new /obj/item/weapon/rcd_ammo(src) - new /obj/item/weapon/rcd(src) + new /obj/item/weapon/construction/rcd(src) /obj/structure/closet/crate/science name = "science crate" diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index 4a3ab87770d..9f37710d78d 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -396,7 +396,7 @@ new/obj/item/stack/sheet/runed_metal/(get_turf(src), 1) qdel(src) -/obj/structure/girder/rcd_vals(mob/user, obj/item/weapon/rcd/the_rcd) +/obj/structure/girder/rcd_vals(mob/user, obj/item/weapon/construction/rcd/the_rcd) switch(the_rcd.mode) if(RCD_FLOORWALL) return list("mode" = RCD_FLOORWALL, "delay" = 20, "cost" = 8) @@ -404,7 +404,7 @@ return list("mode" = RCD_DECONSTRUCT, "delay" = 20, "cost" = 13) return FALSE -/obj/structure/girder/rcd_act(mob/user, obj/item/weapon/rcd/the_rcd, passed_mode) +/obj/structure/girder/rcd_act(mob/user, obj/item/weapon/construction/rcd/the_rcd, passed_mode) var/turf/T = get_turf(src) switch(passed_mode) if(RCD_FLOORWALL) diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 478b3273b29..2dc159d4828 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -18,7 +18,7 @@ var/grille_type = null var/broken_type = /obj/structure/grille/broken -/obj/structure/grille/rcd_vals(mob/user, obj/item/weapon/rcd/the_rcd) +/obj/structure/grille/rcd_vals(mob/user, obj/item/weapon/construction/rcd/the_rcd) switch(the_rcd.mode) if(RCD_DECONSTRUCT) return list("mode" = RCD_DECONSTRUCT, "delay" = 20, "cost" = 5) @@ -26,7 +26,7 @@ return list("mode" = RCD_WINDOWGRILLE, "delay" = 40, "cost" = 10) return FALSE -/obj/structure/grille/rcd_act(mob/user, var/obj/item/weapon/rcd/the_rcd, passed_mode) +/obj/structure/grille/rcd_act(mob/user, var/obj/item/weapon/construction/rcd/the_rcd, passed_mode) switch(passed_mode) if(RCD_DECONSTRUCT) to_chat(user, "You deconstruct the grille.") diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index d5bcb8b60b5..c6c2ef358bc 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -57,13 +57,13 @@ if(rods) debris += new /obj/item/stack/rods(src, rods) -/obj/structure/window/rcd_vals(mob/user, obj/item/weapon/rcd/the_rcd) +/obj/structure/window/rcd_vals(mob/user, obj/item/weapon/construction/rcd/the_rcd) switch(the_rcd.mode) if(RCD_DECONSTRUCT) return list("mode" = RCD_DECONSTRUCT, "delay" = 20, "cost" = 5) return FALSE -/obj/structure/window/rcd_act(mob/user, var/obj/item/weapon/rcd/the_rcd) +/obj/structure/window/rcd_act(mob/user, var/obj/item/weapon/construction/rcd/the_rcd) switch(the_rcd.mode) if(RCD_DECONSTRUCT) to_chat(user, "You deconstruct the window.") diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index 98c28256e92..5f581fba63f 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -200,7 +200,7 @@ /turf/open/floor/acid_melt() ChangeTurf(baseturf) -/turf/open/floor/rcd_vals(mob/user, obj/item/weapon/rcd/the_rcd) +/turf/open/floor/rcd_vals(mob/user, obj/item/weapon/construction/rcd/the_rcd) switch(the_rcd.mode) if(RCD_FLOORWALL) return list("mode" = RCD_FLOORWALL, "delay" = 20, "cost" = 16) @@ -212,7 +212,7 @@ return list("mode" = RCD_WINDOWGRILLE, "delay" = 40, "cost" = 4) return FALSE -/turf/open/floor/rcd_act(mob/user, obj/item/weapon/rcd/the_rcd, passed_mode) +/turf/open/floor/rcd_act(mob/user, obj/item/weapon/construction/rcd/the_rcd, passed_mode) switch(passed_mode) if(RCD_FLOORWALL) to_chat(user, "You build a wall.") diff --git a/code/game/turfs/simulated/wall/reinf_walls.dm b/code/game/turfs/simulated/wall/reinf_walls.dm index c1eff8e4154..c15e478c499 100644 --- a/code/game/turfs/simulated/wall/reinf_walls.dm +++ b/code/game/turfs/simulated/wall/reinf_walls.dm @@ -251,12 +251,12 @@ if(prob(30)) dismantle_wall() -/turf/closed/wall/r_wall/rcd_vals(mob/user, obj/item/weapon/rcd/the_rcd) +/turf/closed/wall/r_wall/rcd_vals(mob/user, obj/item/weapon/construction/rcd/the_rcd) if(!the_rcd.canRturf) return FALSE return ..() -/turf/closed/wall/r_wall/rcd_act(mob/user, obj/item/weapon/rcd/the_rcd, passed_mode) +/turf/closed/wall/r_wall/rcd_act(mob/user, obj/item/weapon/construction/rcd/the_rcd, passed_mode) if(!the_rcd.canRturf) return FALSE return ..() diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 2fd5b4433ff..1aea3d7dbc4 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -258,13 +258,13 @@ /turf/closed/wall/acid_melt() dismantle_wall(1) -/turf/closed/wall/rcd_vals(mob/user, obj/item/weapon/rcd/the_rcd) +/turf/closed/wall/rcd_vals(mob/user, obj/item/weapon/construction/rcd/the_rcd) switch(the_rcd.mode) if(RCD_DECONSTRUCT) return list("mode" = RCD_DECONSTRUCT, "delay" = 40, "cost" = 26) return FALSE -/turf/closed/wall/rcd_act(mob/user, obj/item/weapon/rcd/the_rcd, passed_mode) +/turf/closed/wall/rcd_act(mob/user, obj/item/weapon/construction/rcd/the_rcd, passed_mode) switch(passed_mode) if(RCD_DECONSTRUCT) to_chat(user, "You deconstruct the wall.") diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index 4d96decc5aa..f71e7dbe0f8 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -159,15 +159,16 @@ return 0 -/turf/open/space/rcd_vals(mob/user, obj/item/weapon/rcd/the_rcd) +/turf/open/space/rcd_vals(mob/user, obj/item/weapon/construction/rcd/the_rcd) if(!CanBuildHere()) return FALSE + switch(the_rcd.mode) if(RCD_FLOORWALL) return list("mode" = RCD_FLOORWALL, "delay" = 0, "cost" = 2) return FALSE -/turf/open/space/rcd_act(mob/user, obj/item/weapon/rcd/the_rcd, passed_mode) +/turf/open/space/rcd_act(mob/user, obj/item/weapon/construction/rcd/the_rcd, passed_mode) switch(passed_mode) if(RCD_FLOORWALL) to_chat(user, "You build a floor.") diff --git a/code/modules/cargo/exports/tools.dm b/code/modules/cargo/exports/tools.dm index 71b778e931f..683f2c08cc0 100644 --- a/code/modules/cargo/exports/tools.dm +++ b/code/modules/cargo/exports/tools.dm @@ -105,7 +105,7 @@ /datum/export/rcd cost = 100 // 15 metal -> 75 credits, +25 credits for production unit_name = "rapid construction device" - export_types = list(/obj/item/weapon/rcd) + export_types = list(/obj/item/weapon/construction/rcd) /datum/export/rcd_ammo cost = 15 // 1.5 metal, 1 glass -> 12.5 credits, +2.5 credits diff --git a/code/modules/clothing/outfits/ert.dm b/code/modules/clothing/outfits/ert.dm index 83a8747252e..b3f74b038fa 100644 --- a/code/modules/clothing/outfits/ert.dm +++ b/code/modules/clothing/outfits/ert.dm @@ -139,7 +139,7 @@ /obj/item/weapon/melee/baton/loaded=1,\ /obj/item/clothing/mask/gas/sechailer=1,\ /obj/item/weapon/gun/energy/e_gun=1,\ - /obj/item/weapon/rcd/loaded=1) + /obj/item/weapon/construction/rcd/loaded=1) /datum/outfit/ert/engineer/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) ..() @@ -158,7 +158,7 @@ /obj/item/weapon/melee/baton/loaded=1,\ /obj/item/clothing/mask/gas/sechailer/swat=1,\ /obj/item/weapon/gun/energy/pulse/pistol/loyalpin=1,\ - /obj/item/weapon/rcd/combat=1) + /obj/item/weapon/construction/rcd/combat=1) /datum/outfit/centcom_official diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index 6cc485a34c9..d8a0c97f51c 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -67,7 +67,7 @@ obj_integrity = 300 max_integrity = 300 armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75, fire = 50, acid = 75) - allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals,/obj/item/device/t_scanner, /obj/item/weapon/rcd, /obj/item/weapon/pipe_dispenser) + allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals,/obj/item/device/t_scanner, /obj/item/weapon/construction/rcd, /obj/item/weapon/pipe_dispenser) siemens_coefficient = 0 var/obj/item/clothing/head/helmet/space/hardsuit/helmet actions_types = list(/datum/action/item_action/toggle_helmet) diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index e0b92a8fad6..321163d1040 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -493,7 +493,7 @@ icon_state = "coatengineer" item_state = "coatengineer" armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 20, fire = 30, acid = 45) - allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/device/t_scanner, /obj/item/weapon/rcd, /obj/item/weapon/pipe_dispenser) + allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/device/t_scanner, /obj/item/weapon/construction/rcd, /obj/item/weapon/pipe_dispenser) hoodtype = /obj/item/clothing/head/hooded/winterhood/engineering /obj/item/clothing/head/hooded/winterhood/engineering diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index d735d8e534f..cd034a11174 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -538,7 +538,7 @@ Gunshots/explosions/opening doors/less rare audio (done) /obj/item/device/radio/headset/syndicate, /obj/item/weapon/grenade/plastic/c4,\ /obj/item/device/powersink, /obj/item/weapon/storage/box/syndie_kit,\ /obj/item/toy/syndicateballoon, /obj/item/weapon/gun/energy/laser/captain,\ - /obj/item/weapon/hand_tele, /obj/item/weapon/rcd, /obj/item/weapon/tank/jetpack,\ + /obj/item/weapon/hand_tele, /obj/item/weapon/construction/rcd, /obj/item/weapon/tank/jetpack,\ /obj/item/clothing/under/rank/captain, /obj/item/device/aicard,\ /obj/item/clothing/shoes/magboots, /obj/item/areaeditor/blueprints, /obj/item/weapon/disk/nuclear,\ /obj/item/clothing/suit/space/nasavoid, /obj/item/weapon/tank) @@ -673,7 +673,6 @@ Gunshots/explosions/opening doors/less rare audio (done) QDEL_IN(O, 300) - /obj/effect/hallucination/bolts var/list/doors = list() diff --git a/code/modules/mining/aux_base_camera.dm b/code/modules/mining/aux_base_camera.dm index fcbced3210d..ebcd35f6df9 100644 --- a/code/modules/mining/aux_base_camera.dm +++ b/code/modules/mining/aux_base_camera.dm @@ -20,7 +20,7 @@ dir = direct //This camera eye is visible as a drone, and needs to keep the dir updated ..() -/obj/item/weapon/rcd/internal //Base console's internal RCD. Roundstart consoles are filled, rebuilt cosoles start empty. +/obj/item/weapon/construction/rcd/internal //Base console's internal RCD. Roundstart consoles are filled, rebuilt cosoles start empty. name = "internal RCD" max_matter = 600 //Bigger container and faster speeds due to being specialized and stationary. no_ammo_message = "Internal matter exhausted. Please add additional materials." @@ -30,7 +30,7 @@ name = "base contruction console" desc = "An industrial computer integrated with a camera-assisted rapid construction drone." networks = list("SS13") - var/obj/item/weapon/rcd/internal/RCD //Internal RCD. The computer passes user commands to this in order to avoid massive copypaste. + var/obj/item/weapon/construction/rcd/internal/RCD //Internal RCD. The computer passes user commands to this in order to avoid massive copypaste. circuit = /obj/item/weapon/circuitboard/computer/base_construction off_action = new/datum/action/innate/camera_off/base_construction var/datum/action/innate/aux_base/switch_mode/switch_mode_action = new //Action for switching the RCD's build modes @@ -50,7 +50,7 @@ /obj/machinery/computer/camera_advanced/base_construction/New() ..() - RCD = new /obj/item/weapon/rcd/internal(src) + RCD = new /obj/item/weapon/construction/rcd/internal(src) /obj/machinery/computer/camera_advanced/base_construction/Initialize(mapload) ..() @@ -117,7 +117,7 @@ remote_eye = C.remote_control B = target if(!B.RCD) //The console must always have an RCD. - B.RCD = new /obj/item/weapon/rcd/internal(src) //If the RCD is lost somehow, make a new (empty) one! + B.RCD = new /obj/item/weapon/construction/rcd/internal(src) //If the RCD is lost somehow, make a new (empty) one! /datum/action/innate/aux_base/proc/check_spot() //Check a loction to see if it is inside the aux base at the station. Camera visbility checks omitted so as to not hinder construction. diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 1ac95b26af2..257bf11163c 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -287,7 +287,7 @@ basic_modules = list( /obj/item/device/assembly/flash/cyborg, /obj/item/borg/sight/meson, - /obj/item/weapon/rcd/borg, + /obj/item/weapon/construction/rcd/borg, /obj/item/weapon/pipe_dispenser, /obj/item/weapon/extinguisher, /obj/item/weapon/weldingtool/largetank/cyborg, diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 82124c14099..133fad1b4d8 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -649,3 +649,14 @@ force = 5 playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1) update() + + +/obj/machinery/light/floor + name = "floor light" + icon = 'icons/obj/lighting.dmi' + base_state = "floor" // base description and icon_state + icon_state = "floor1" + brightness = 4 + layer = 2.5 + light_type = /obj/item/weapon/light/bulb + fitting = "bulb" diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index 28b5a893a98..9f2fbda1f34 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -581,7 +581,7 @@ id = "rcd" build_type = AUTOLATHE materials = list(MAT_METAL = 30000) - build_path = /obj/item/weapon/rcd + build_path = /obj/item/weapon/construction/rcd category = list("hacked", "Construction") /datum/design/rpd diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index 877ef70c66f..c12a6d553fd 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -73,7 +73,7 @@ valid_items += rand(1,max(2,35-probWeight)) valid_items += I - if(ispath(I,/obj/item/weapon/rcd) || ispath(I,/obj/item/weapon/grenade) || ispath(I,/obj/item/device/aicard) || ispath(I,/obj/item/weapon/storage/backpack/holding) || ispath(I,/obj/item/slime_extract) || ispath(I,/obj/item/device/onetankbomb) || ispath(I,/obj/item/device/transfer_valve)) + if(ispath(I,/obj/item/weapon/construction/rcd) || ispath(I,/obj/item/weapon/grenade) || ispath(I,/obj/item/device/aicard) || ispath(I,/obj/item/weapon/storage/backpack/holding) || ispath(I,/obj/item/slime_extract) || ispath(I,/obj/item/device/onetankbomb) || ispath(I,/obj/item/device/transfer_valve)) var/obj/item/tempCheck = I if(initial(tempCheck.icon_state) != null) critical_items += I diff --git a/icons/obj/tools.dmi b/icons/obj/tools.dmi index cd0d3f835ed180967e72f8721137d815ad85c93a..042a8c12cd39727c2c16e14d57cd065e7cf367da 100644 GIT binary patch literal 15004 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%0D}xqw=Tky+i6+l z14|9mzZmi*Wr}QRb$4E4D`fx>=ZCrzA`EmgL$Y{-g9J*Nr`h^lkjVS^7@vI>PfyPV zpUpp&Zms9a9#mS2=1y207O;&K_w z3Dn76Er~_9>45cDH`C`Q4Wz&_DFVWbpB1orTf?7>ODr*N5*k9ocz3OBT;)S(I_ zoX;+h!P)By!yy`vAfVd&DK-ZH98Xe^>FFpN%^d=ee2crzoIEd5u14_+U^}Wo02$1t z0ZF8-7QgArE~zgw|I=zHsjy#7Pc;60~)uHKk#8TLsYxu)=(oYu|^^SmC zI#rtYtLWT9jDBX*&wfv$c^4h1<+LyhE3|AAcB$}m;$bfuPxepS;v9acy{k6!Zl1ReQ9a%Sx7ireLqZ>wBdD<^h$ z1AU(1C$BV!y+Fc{#zpU1aN4Nd4v#4q5;O{I-IvA`e#zusG@mU-FJb~IPjTK=&2_hi zT(~bCIkItbTF1f!l>BxUkU7`H?# zlIB&nPCA9I578mxa{i&Sj`PLCFCe^B`kp%gsFy>5-$ag$3>v=M-vta`-UCpQN*B~K zVnwYbC((kf--d>VJwRtomkOX%L{!4=-o0B`SO@^Y$D;;|o+i&O*5Q0={dqN`bsy#) zGBsZ+nDd!0IAcNX0-+rDh;2S)2^w5~sArl_wtr%q>4ej+AukVM^q+^sZL+ekR0N&6 zCV%|+eS5kwkwExx(pmJ;2d2==eSxc!5D(c-1NQC2=7+Pi9IYA(L3>20L4xo9MBBb} z8?e2Ba98Y4v@KoA-4phSX4+PQK_4*>biZSp9!n0F6&EYCmpudJM7CR?L{#>mawa4a zeD$LM=Bn+~?~HN1ZtOX71KkQ3XVk6NK?+5pi_1q5*%u)|o`EHMS*wnj{{qhbMRj%c z#7*O1Y(+gyv~s4&uX=CKz4>}lK5u~OrKHsk>UlX+S2O2Uzog%e&9l1@$35tY0Xzrm}it&oO|l-#Of+Os_iuP9EenLy%ks<5`Et=X2e_2a;Z2=AlstE+Z;1_pi& zlemlDc~=HPuZ7h#G<=(WIow~2mD~Zq-N=#bx>j1i{rOp`M*ryOs9}}OYx9dmiO+R8 zOhVj$WENIu%gZ6zzCa^64B}_B(*bTVyYFSUd~Tb6ZH-iWi=hqrOl-h2)t}4Cu>0U* z6tnb+-<1i^7i_n`oX10I%3e{QPJ5AoZFLW!D-jg-g*l_p%K2Q5+gxk>5-8H@&$Nc% z^QvASEGQmnSE%bOF*OZDNvUD2pX*YpQqOcvuq@HRF8^Tb>~r9LB@a$p@T>N(VfLjx zB86X?i2!$WRP5=+(r!)L&UPCNR4z84_w=dNQl~9|9MGr@+#(uehYmj8Q!6Si?r5QB zACA9<6&5>%rpbi9ZO_1ZGZ^&NbUn$K-4;X@Q$835xMj*!tI-Dcl;?_&;H? z;fy1J0D%AH<}84yD6Nl=Ps2*GNwX{6q}`eNRe39gq9 z*VyKE5$em+AT_n5PmhHj-D~l8b#+CZ44bfKd&@?gyh)~2t?;#$^&AeMrGA$ENV1fX8dU~&Fk-wgx?4g5BdqGyG zJ2PMM@~{&U68sPPI2%dmMJpD(3?P6&OB+@+ognEqnbw2vyg!CVnHK6cj)~4Ix-H@RK8C+_25vKL8Eqp|VjXI{J zBM9JxBFU?OKHUjGRt=00*yp$2W5hE%E9=kN^;U)xA_l;|hOA_V7a2wUM`?(etT|ZAW#G#MC?joE)Ua>2!rdkuzpE6K|Gh7 zWHi3n0IxecGiHZd+P?lU)bCQ?anpRssfUp@3nNriPWUMBzI{snvR*S%PWB#d2#c$Hzq-nHA{2dJxjk?;Ozhe! zlybS~ZbdkxP=6cGfw9ekU2Fz{^;qSafxCnQs)dy1^*#Lq__*uJmHv-|9T?Rbp%SQ!U`SYC9H+kr%-l*t)>dWui=Iz`CM*Q7DG7)Y}j@#3EPeC4MQHQqm-M9_$HOPk zB+iR?WWP?4JMSG@&%B*tG@v&UL#zp|tdlB}3 znhm;E@(-V+T!x34Gf4QJ6uCELw0-+{D+2y%r_vs0z}IMJ>NgBfSihol~!uMi>k0Jv&`@xH&$#w26O3E(9zSQ+D-Su^eg8_igZ)DLUR5? z_i0#JuJJJO6#JgAaJPB0ZGSTI8rKP%Z6t5_H&TZcfUn;9z_QGV5nK&LcxpZh*Lc$e z{8(u@)il%{5m}-*Vdmt-qm9M^H!^NIw-sbFzd50B@MQ$xxyI?IVrR#ZCLL6#Yvk;ZvPv|EbaY)VH(;xp-2)I(2mL>O*rWUnv?j_6mZBPVBSg`-VRLt zOgmd*!i=|i&PuTX;>#Qj3Xmr&0g-Mzd%Nf73{GS_H_B0IUQ~mc!@0Q$yjFiCD1p<; z@5dFg)~B#<HP8~8FC3%%NjD3dSw|y7>NPqr=xYU7_F7EVIBqjZoI#xU z?1j$VFzuvQ8)O>oG?-KVt;fC+xp3!g} z`Yl(J+-YzdCg*pUs1~rCu+BIp4Z;zC496qOt*O!Di@OSB;@CZ-%qmbv6~>8H)}{S) zs1?cCwi9-870ns_6H#1ccVAq_Yis;&y*yVllbGurdRc@N=w5R^{#Qqdn(pA4oxYn< z$m6-&v23xxnsd`T4TRjKt%>Tzi*Y(ph~FGZ^H&mCzeI7%F~^|J<%yT}l3xn=r_0Q`PQhlwvmxzsP|tLNmQfPn(5=MB9aHd z>0GERFc0zvk6_T%yDuv$aZgu^NWkjqL}R!FdtXy=Y8e{-J<(oF<~L~o?Zx-{GN6E% zPZc~{b>D*}QesjR?7c+g<>etasUl$5&N_o-tDJP?SVH&jQ+Gy^co~a148qx_L&SD8 z9-%@MWU^x*g5SV=&npTCXBS0l6W-WAqdBkdQt!@0zk5en-p;wz z>Da4pA{3T`3zfM(vz9ve#tO_I84AUtv2*UrNaMa2mTlzi5I#eHm8f){KJx(Mq50Bs zU!oA~t%e9r=lNl4Fh7rS?9qd>h!FA6YbnHWiTUdnp{2Q4DzS{+3!PEWe9brrfyjOl zXLkB|pY*~cmHXM=0)SNeAi(WQLvylVFME+{=nLLMZX`m;ofbjV|E9Uas~}XY{W8B2 zc Date: Thu, 13 Apr 2017 14:31:45 -0700 Subject: [PATCH 04/28] Automatic changelog generation for PR #25263 [ci skip] --- html/changelogs/AutoChangeLog-pr-25263.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-25263.yml diff --git a/html/changelogs/AutoChangeLog-pr-25263.yml b/html/changelogs/AutoChangeLog-pr-25263.yml new file mode 100644 index 00000000000..f0d7ad58ec5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-25263.yml @@ -0,0 +1,5 @@ +author: "Robustin" +delete-after: True +changes: + - rscadd: "Ranged RCD added to the game" + - rscadd: "Rapid Lighting Device (also ranged) has been added. It can create wall, floor, and temporary lights of any color you desire." From 9b1cc42727cf0d7ecbb525e6d255f92117e7bd56 Mon Sep 17 00:00:00 2001 From: oranges Date: Fri, 14 Apr 2017 09:45:28 +1200 Subject: [PATCH 05/28] Finish the fight between global and static --- .github/CONTRIBUTING.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 1b1a8f07c83..859af746b47 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -276,6 +276,22 @@ H.gib() however DM also has a dot variable, accessed just as ```.``` on it's own, defaulting to a value of null, now what's special about the dot operator is that it is automatically returned (as in the ```return``` statment) at the end of a proc, provided the proc does not already manually return (```return count``` for example). Why is this special? well the ```return``` statement should ideally be free from overhead (functionally free, of course nothing's free) but DM fails to fulfill this, DM's return statement is actually fairly costly for what it does and for what it's used for. With ```.``` being everpresent in every proc can we use it as a temporary variable? Of course we can! However the ```.``` operator cannot replace a typecasted variable, it can hold data any other var in DM can, it just can't be accessed as one, however the ```.``` operator is compatible with a few operators that look weird but work perfectly fine, such as: ```.++``` for incrementing ```.'s``` value, or ```.[1]``` for accessing the first element of ```.``` (provided it's a list). +## Globals versus Static + +Byond has a var keyword, called global. This var keyword is for vars inside of types. IE: + +``` +mob + var + global + thing = 1 +``` +It DOES NOT mean that you can access it everywhere like a global var, instead It means that that var will only exist once for all instances of its type, in this case that var will only exist once for all mobs, ie its shared across everything in it's type. (much more like the keyword static in other languages like php/c++/c#/java) + +Isn't that confusing? + +There is also an undocumented keyword static, that has the same behaviour as global but more correctly describes byond's behaviour. Therefore we always use static instead of global where we need it as it reduces suprise when reading byond code. + ## Pull Request Process There is no strict process when it comes to merging pull requests, pull requests will sometimes take a while before they are looked at by a maintainer, the bigger the change the more time it will take before they are accepted into the code. Every team member is a volunteer who is giving up their own time to help maintain and contribute, so please be nice. Here are some helpful ways to make it easier for you and for the maintainer when making a pull request. From e2c48435171654fc5ea7e1c4e33835b3cf87fded Mon Sep 17 00:00:00 2001 From: coiax Date: Thu, 13 Apr 2017 23:14:11 +0100 Subject: [PATCH 06/28] Upgrading RPG loot items modifies their name accordingly (#26144) * Upgrading RPG loot items modifies their name accordingly - the greater crowbar of many tales +2 - use item fortification scroll - the greater crowbar of many tales +3 - Once the RPG loot event fires, a global is set which means all new items will have rpg_loot datums attached to them. Otherwise, everything functions the same. Item fortification scrolls are only spawned when the event fires. Using an admin spawned item fortification scroll on a non-rpg looted item works, it'll grant that item only a RPG datum. Made a /unlimited upgrade scroll if admins feel like buffing an item. * Scroll * Scroll, nix * Fixes vaporising items, negative quality * Fixes runtime when upgrading non-rpg item * Static lists * Muh spelling --- code/game/objects/items.dm | 10 +++ code/modules/events/wizard/rpgloot.dm | 122 ++++++++++++++++++-------- 2 files changed, 97 insertions(+), 35 deletions(-) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 9e962ddeeca..390fab562cb 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -1,5 +1,9 @@ GLOBAL_DATUM_INIT(fire_overlay, /image, image("icon" = 'icons/effects/fire.dmi', "icon_state" = "fire")) +GLOBAL_VAR_INIT(rpg_loot_items, FALSE) +// if true, everyone item when created will have its name changed to be +// more... RPG-like. + /obj/item name = "item" icon = 'icons/obj/items.dmi' @@ -99,6 +103,8 @@ GLOBAL_DATUM_INIT(fire_overlay, /image, image("icon" = 'icons/effects/fire.dmi', // non-clothing items var/datum/dog_fashion/dog_fashion = null + var/datum/rpg_loot/rpg_loot = null + /obj/item/Initialize() if (!materials) materials = list() @@ -107,6 +113,9 @@ GLOBAL_DATUM_INIT(fire_overlay, /image, image("icon" = 'icons/effects/fire.dmi', new path(src) actions_types = null + if(GLOB.rpg_loot_items) + rpg_loot = new(src) + /obj/item/Destroy() flags &= ~DROPDEL //prevent reqdels if(ismob(loc)) @@ -114,6 +123,7 @@ GLOBAL_DATUM_INIT(fire_overlay, /image, image("icon" = 'icons/effects/fire.dmi', m.temporarilyRemoveItemFromInventory(src, TRUE) for(var/X in actions) qdel(X) + QDEL_NULL(rpg_loot) return ..() /obj/item/device diff --git a/code/modules/events/wizard/rpgloot.dm b/code/modules/events/wizard/rpgloot.dm index d651400baa0..98ae7ba6aa5 100644 --- a/code/modules/events/wizard/rpgloot.dm +++ b/code/modules/events/wizard/rpgloot.dm @@ -6,27 +6,10 @@ earliest_start = 0 /datum/round_event/wizard/rpgloot/start() - var/list/prefixespositive = list("greater", "major", "blessed", "superior", "enpowered", "honed", "true", "glorious", "robust") - var/list/prefixesnegative = list("lesser", "minor", "blighted", "inferior", "enfeebled", "rusted", "unsteady", "tragic", "gimped") - var/list/suffixes = list("orc slaying", "elf slaying", "corgi slaying", "strength", "dexterity", "constitution", "intelligence", "wisdom", "charisma", "the forest", "the hills", "the plains", "the sea", "the sun", "the moon", "the void", "the world", "the fool", "many secrets", "many tales", "many colors", "rending", "sundering", "the night", "the day") - var/upgrade_scroll_chance = 0 + var/upgrade_scroll_chance = 0 for(var/obj/item/I in world) - if(istype(I,/obj/item/organ/)) - continue - var/quality = pick(1;15, 2;14, 2;13, 2;12, 3;11, 3;10, 3;9, 4;8, 4;7, 4;6, 5;5, 5;4, 5;3, 6;2, 6;1, 6;0) - if(prob(50)) - quality = -quality - if(quality > 0) - I.name = "[pick(prefixespositive)] [I.name] of [pick(suffixes)] +[quality]" - else if(quality < 0) - I.name = "[pick(prefixesnegative)] [I.name] of [pick(suffixes)] [quality]" - else - I.name = "[I.name] of [pick(suffixes)]" - - I.force = max(0,I.force + quality) - I.throwforce = max(0,I.throwforce + quality) - for(var/value in I.armor) - I.armor[value] += quality + if(!istype(I.rpg_loot)) + I.rpg_loot = new(I) if(istype(I,/obj/item/weapon/storage)) var/obj/item/weapon/storage/S = I @@ -36,28 +19,97 @@ upgrade_scroll_chance = max(0,upgrade_scroll_chance-100) upgrade_scroll_chance += 25 + GLOB.rpg_loot_items = TRUE + /obj/item/upgradescroll - name = "Item Fortification Scroll" + name = "item fortification scroll" desc = "Somehow, this piece of paper can be applied to items to make them \"better\". Apparently there's a risk of losing the item if it's already \"too good\". This all feels so arbitrary..." icon = 'icons/obj/wizard.dmi' icon_state = "scroll" w_class = WEIGHT_CLASS_TINY + var/upgrade_amount = 1 + var/can_backfire = TRUE + var/one_use = TRUE + /obj/item/upgradescroll/afterattack(obj/item/target, mob/user , proximity) if(!proximity || !istype(target)) return - var/quality = target.force - initial(target.force) - if(quality > 9 && prob((quality - 9)*10)) - to_chat(user, "[target] catches fire!") - if(target.resistance_flags & (LAVA_PROOF|FIRE_PROOF)) - target.resistance_flags &= ~(LAVA_PROOF|FIRE_PROOF) - target.resistance_flags |= FLAMMABLE - target.fire_act() + + var/datum/rpg_loot/rpg_loot_datum = target.rpg_loot + if(!istype(rpg_loot_datum)) + rpg_loot_datum = new /datum/rpg_loot(target) + + var/quality = rpg_loot_datum.quality + + if(can_backfire && (quality > 9 && prob((quality - 9)*10))) + to_chat(user, "[target] violently glows blue for a while, then evaporates.") + target.burn() + else + to_chat(user, "[target] glows blue and seems vaguely \"better\"!") + rpg_loot_datum.modify(upgrade_amount) + + if(one_use) qdel(src) - return - target.force += 1 - target.throwforce += 1 - for(var/value in target.armor) - target.armor[value] += 1 - to_chat(user, "[target] glows blue and seems vaguely \"better\"!") - qdel(src) + +/obj/item/upgradescroll/unlimited + name = "unlimited foolproof item fortification scroll" + desc = "Somehow, this piece of paper can be applied to items to make them \"better\". This scroll is made from the tongues of dead paper wizards, and can be used an unlimited number of times, with no drawbacks." + one_use = FALSE + can_backfire = FALSE + +/datum/rpg_loot + var/positive_prefix = "okay" + var/negative_prefix = "weak" + var/suffix = "something profound" + var/quality = 0 + + var/obj/item/attached + var/original_name + +/datum/rpg_loot/New(attached_item=null) + attached = attached_item + + randomise() + +/datum/rpg_loot/Destroy() + attached = null + +/datum/rpg_loot/proc/randomise() + var/static/list/prefixespositive = list("greater", "major", "blessed", "superior", "enpowered", "honed", "true", "glorious", "robust") + var/static/list/prefixesnegative = list("lesser", "minor", "blighted", "inferior", "enfeebled", "rusted", "unsteady", "tragic", "gimped") + var/static/list/suffixes = list("orc slaying", "elf slaying", "corgi slaying", "strength", "dexterity", "constitution", "intelligence", "wisdom", "charisma", "the forest", "the hills", "the plains", "the sea", "the sun", "the moon", "the void", "the world", "the fool", "many secrets", "many tales", "many colors", "rending", "sundering", "the night", "the day") + + var/new_quality = pick(1;15, 2;14, 2;13, 2;12, 3;11, 3;10, 3;9, 4;8, 4;7, 4;6, 5;5, 5;4, 5;3, 6;2, 6;1, 6;0) + + suffix = pick(suffixes) + positive_prefix = pick(prefixespositive) + negative_prefix = pick(prefixesnegative) + + if(prob(50)) + new_quality = -new_quality + + modify(new_quality) + +/datum/rpg_loot/proc/rename() + var/obj/item/I = attached + if(!original_name) + original_name = I.name + if(quality < 0) + I.name = "[negative_prefix] [original_name] of [suffix] [quality]" + else if(quality == 0) + I.name = "[original_name] of [suffix]" + else if(quality > 0) + I.name = "[positive_prefix] [original_name] of [suffix] +[quality]" + +/datum/rpg_loot/proc/modify(quality_mod) + var/obj/item/I = attached + quality += quality_mod + + I.force = max(0,I.force + quality_mod) + I.throwforce = max(0,I.throwforce + quality_mod) + + for(var/value in I.armor) + I.armor[value] += quality + + rename() From 44b85bf82c1e23e80e6b20ae25df082e3828486f Mon Sep 17 00:00:00 2001 From: Joan Lung Date: Thu, 13 Apr 2017 18:20:57 -0400 Subject: [PATCH 07/28] Some more logging (#26139) * Some more logging And then you'll be a lumberjane! * space * beware the... * hmph --- code/game/turfs/simulated/minerals.dm | 7 +- code/modules/mining/equipment.dm | 6 +- .../mining/lavaland/necropolis_chests.dm | 6 +- .../chemistry/recipes/slime_extracts.dm | 322 +++++------------- .../research/xenobiology/xenobiology.dm | 9 +- 5 files changed, 100 insertions(+), 250 deletions(-) diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm index ba84d0ff113..d418c0a48a5 100644 --- a/code/game/turfs/simulated/minerals.dm +++ b/code/game/turfs/simulated/minerals.dm @@ -44,7 +44,6 @@ /turf/closed/mineral/attackby(obj/item/weapon/pickaxe/P, mob/user, params) - if (!user.IsAdvancedToolUser()) to_chat(usr, "You don't have the dexterity to do this!") return @@ -67,18 +66,16 @@ feedback_add_details("pick_used_mining","[P.type]") else return attack_hand(user) - return /turf/closed/mineral/proc/gets_drilled() if (mineralType && (src.mineralAmt > 0) && (src.mineralAmt < 11)) var/i - for (i=0;i= 2) diff --git a/code/modules/mining/equipment.dm b/code/modules/mining/equipment.dm index 2b10ab05531..02a752c2d76 100644 --- a/code/modules/mining/equipment.dm +++ b/code/modules/mining/equipment.dm @@ -68,7 +68,7 @@ /obj/item/device/wormhole_jaunter/attack_self(mob/user) user.visible_message("[user.name] activates the [src.name]!") - feedback_add_details("jaunter", "U") // user activated + feedback_add_details("jaunter", "User") // user activated activate(user) /obj/item/device/wormhole_jaunter/proc/turf_check(mob/user) @@ -124,13 +124,13 @@ if(triggered) usr.visible_message("The [src] overloads and activates!") - feedback_add_details("jaunter","E") // EMP accidental activation + feedback_add_details("jaunter","EMP") // EMP accidental activation activate(usr) /obj/item/device/wormhole_jaunter/proc/chasm_react(mob/user) if(user.get_item_by_slot(slot_belt) == src) to_chat(user, "Your [src] activates, saving you from the chasm!") - feedback_add_details("jaunter","C") // chasm automatic activation + feedback_add_details("jaunter","Chasm") // chasm automatic activation activate(user) else to_chat(user, "The [src] is not attached to your belt, preventing it from saving you from the chasm. RIP.
") diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 630359d402b..92a764d10cc 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -87,7 +87,7 @@ user.sight |= SEE_MOBS icon_state = "lantern" wisp.orbit(user, 20) - feedback_add_details("wisp_lantern","F") // freed + feedback_add_details("wisp_lantern","Freed") // freed else to_chat(user, "You return the wisp to the lantern.") @@ -102,7 +102,7 @@ wisp.stop_orbit() wisp.loc = src icon_state = "lantern-blue" - feedback_add_details("wisp_lantern","R") // returned + feedback_add_details("wisp_lantern","Returned") // returned /obj/item/device/wisp_lantern/Initialize() ..() @@ -229,7 +229,7 @@ /obj/item/device/immortality_talisman/attack_self(mob/user) if(cooldown < world.time) - feedback_add_details("immortality_talisman","U") // usage + feedback_add_details("immortality_talisman","Activated") // usage cooldown = world.time + 600 user.visible_message("[user] vanishes from reality, leaving a a hole in [user.p_their()] place!") var/obj/effect/immortality_talisman/Z = new(get_turf(src.loc)) diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm index 7246a26ce5c..f270fa567fa 100644 --- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm +++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm @@ -1,8 +1,11 @@ /datum/chemical_reaction/slime + var/deletes_extract = TRUE /datum/chemical_reaction/slime/on_reaction(datum/reagents/holder) - delete_extract(holder) + feedback_add_details("slime_cores_used","[type]") + if(deletes_extract) + delete_extract(holder) /datum/chemical_reaction/slime/proc/delete_extract(datum/reagents/holder) var/obj/item/slime_extract/M = holder.my_atom @@ -19,12 +22,9 @@ required_other = 1 /datum/chemical_reaction/slime/slimespawn/on_reaction(datum/reagents/holder) - feedback_add_details("slime_cores_used","[type]") var/mob/living/simple_animal/slime/S S = new(get_turf(holder.my_atom), "grey") - S.visible_message("Infused with plasma, the \ - core begins to quiver and grow, and soon a new baby slime \ - emerges from it!") + S.visible_message("Infused with plasma, the core begins to quiver and grow, and a new baby slime emerges from it!") ..() /datum/chemical_reaction/slime/slimeinaprov @@ -35,10 +35,6 @@ required_other = 1 required_container = /obj/item/slime_extract/grey -/datum/chemical_reaction/slime/slimeinaprov/on_reaction(datum/reagents/holder) - feedback_add_details("slime_cores_used","[type]") - ..() - /datum/chemical_reaction/slime/slimemonkey name = "Slime Monkey" id = "m_monkey" @@ -47,10 +43,8 @@ required_other = 1 /datum/chemical_reaction/slime/slimemonkey/on_reaction(datum/reagents/holder) - feedback_add_details("slime_cores_used","[type]") - for(var/i = 1, i <= 3, i++) - var /obj/item/weapon/reagent_containers/food/snacks/monkeycube/M = new /obj/item/weapon/reagent_containers/food/snacks/monkeycube - M.loc = get_turf(holder.my_atom) + for(var/i in 1 to 3) + new /obj/item/weapon/reagent_containers/food/snacks/monkeycube(get_turf(holder.my_atom)) ..() //Green @@ -62,10 +56,6 @@ required_other = 1 required_container = /obj/item/slime_extract/green -/datum/chemical_reaction/slime/slimemutate/on_reaction(datum/reagents/holder) - feedback_add_details("slime_cores_used","[type]") - ..() - //Mutated Green /datum/chemical_reaction/slime/slimemutate_unstable name = "Unstable Mutation Toxin" @@ -76,10 +66,6 @@ required_container = /obj/item/slime_extract/green mix_message = "The mixture rapidly expands and contracts, its appearance shifting into a sickening green." -/datum/chemical_reaction/slime/slimemutate_unstable/on_reaction(datum/reagents/holder) - feedback_add_details("slime_cores_used","[type]") - ..() - //Metal /datum/chemical_reaction/slime/slimemetal name = "Slime Metal" @@ -89,10 +75,9 @@ required_other = 1 /datum/chemical_reaction/slime/slimemetal/on_reaction(datum/reagents/holder) - feedback_add_details("slime_cores_used","[type]") var/turf/location = get_turf(holder.my_atom) - new /obj/item/stack/sheet/plasteel (location, 5) - new /obj/item/stack/sheet/metal (location, 15) + new /obj/item/stack/sheet/plasteel(location, 5) + new /obj/item/stack/sheet/metal(location, 15) ..() /datum/chemical_reaction/slime/slimeglass @@ -103,60 +88,49 @@ required_other = 1 /datum/chemical_reaction/slime/slimeglass/on_reaction(datum/reagents/holder) - feedback_add_details("slime_cores_used","[type]") var/turf/location = get_turf(holder.my_atom) - new /obj/item/stack/sheet/rglass (location, 5) - new /obj/item/stack/sheet/glass (location, 15) + new /obj/item/stack/sheet/rglass(location, 5) + new /obj/item/stack/sheet/glass(location, 15) ..() //Gold -/datum/chemical_reaction/slime/slimecrit +/datum/chemical_reaction/slime/slimemobspawn name = "Slime Crit" id = "m_tele" required_reagents = list("plasma" = 1) required_container = /obj/item/slime_extract/gold required_other = 1 + deletes_extract = FALSE //we do delete, but we don't do so instantly -/datum/chemical_reaction/slime/slimecrit/on_reaction(datum/reagents/holder) - feedback_add_details("slime_cores_used","[type]") +/datum/chemical_reaction/slime/slimemobspawn/on_reaction(datum/reagents/holder) var/turf/T = get_turf(holder.my_atom) - T.visible_message("The slime extract begins to vibrate violently !") - addtimer(CALLBACK(src, .proc/chemical_mob_spawn, holder, 5, "Gold Slime"), 50) + summon_mobs(T) var/obj/item/slime_extract/M = holder.my_atom deltimer(M.qdel_timer) + ..() M.qdel_timer = addtimer(CALLBACK(src, .proc/delete_extract, holder), 55, TIMER_STOPPABLE) -/datum/chemical_reaction/slime/slimecritlesser +/datum/chemical_reaction/slime/slimemobspawn/proc/summon_mobs(datum/reagents/holder, turf/T) + T.visible_message("The slime extract begins to vibrate violently!") + addtimer(CALLBACK(src, .proc/chemical_mob_spawn, holder, 5, "Gold Slime"), 50) + +/datum/chemical_reaction/slime/slimemobspawn/lesser name = "Slime Crit Lesser" id = "m_tele3" required_reagents = list("blood" = 1) - required_container = /obj/item/slime_extract/gold - required_other = 1 -/datum/chemical_reaction/slime/slimecritlesser/on_reaction(datum/reagents/holder) - feedback_add_details("slime_cores_used","[type]") - var/turf/T = get_turf(holder.my_atom) - T.visible_message("The slime extract begins to vibrate violently !") +/datum/chemical_reaction/slime/slimemobspawn/lesser/summon_mobs(datum/reagents/holder, turf/T) + T.visible_message("The slime extract begins to vibrate violently!") addtimer(CALLBACK(src, .proc/chemical_mob_spawn, holder, 3, "Lesser Gold Slime", "neutral"), 50) - var/obj/item/slime_extract/M = holder.my_atom - deltimer(M.qdel_timer) - M.qdel_timer = addtimer(CALLBACK(src, .proc/delete_extract, holder), 55, TIMER_STOPPABLE) -/datum/chemical_reaction/slime/slimecritfriendly +/datum/chemical_reaction/slime/slimemobspawn/friendly name = "Slime Crit Friendly" id = "m_tele5" required_reagents = list("water" = 1) - required_container = /obj/item/slime_extract/gold - required_other = 1 -/datum/chemical_reaction/slime/slimecritfriendly/on_reaction(datum/reagents/holder) - feedback_add_details("slime_cores_used","[type]") - var/turf/T = get_turf(holder.my_atom) - T.visible_message("The slime extract begins to vibrate adorably !") +/datum/chemical_reaction/slime/slimemobspawn/friendly/summon_mobs(datum/reagents/holder, turf/T) + T.visible_message("The slime extract begins to vibrate adorably!") addtimer(CALLBACK(src, .proc/chemical_mob_spawn, holder, 1, "Friendly Gold Slime", "neutral"), 50) - var/obj/item/slime_extract/M = holder.my_atom - deltimer(M.qdel_timer) - M.qdel_timer = addtimer(CALLBACK(src, .proc/delete_extract, holder), 55, TIMER_STOPPABLE) //Silver /datum/chemical_reaction/slime/slimebork @@ -167,8 +141,24 @@ required_other = 1 /datum/chemical_reaction/slime/slimebork/on_reaction(datum/reagents/holder) + //BORK BORK BORK + var/list/borks = getborks() + var/turf/T = get_turf(holder.my_atom) - feedback_add_details("slime_cores_used","[type]") + playsound(T, 'sound/effects/phasein.ogg', 100, 1) + + for(var/mob/living/carbon/C in viewers(T, null)) + C.flash_act() + + for(var/i in 1 to 4 + rand(1,2)) + var/chosen = pick(borks) + var/obj/B = new chosen(T) + if(prob(50)) + for(var/j in 1 to rand(1, 3)) + step(B, pick(NORTH,SOUTH,EAST,WEST)) + ..() + +/datum/chemical_reaction/slime/slimebork/proc/getborks() var/list/blocked = list(/obj/item/weapon/reagent_containers/food/snacks, /obj/item/weapon/reagent_containers/food/snacks/store/bread, /obj/item/weapon/reagent_containers/food/snacks/breadslice, @@ -188,53 +178,15 @@ ) blocked |= typesof(/obj/item/weapon/reagent_containers/food/snacks/customizable) - var/list/borks = typesof(/obj/item/weapon/reagent_containers/food/snacks) - blocked - // BORK BORK BORK + return typesof(/obj/item/weapon/reagent_containers/food/snacks) - blocked - playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) - - for(var/mob/living/carbon/C in viewers(get_turf(holder.my_atom), null)) - C.flash_act() - - for(var/i = 1, i <= 4 + rand(1,2), i++) - var/chosen = pick(borks) - var/obj/B = new chosen - if(B) - B.loc = get_turf(holder.my_atom) - if(prob(50)) - for(var/j = 1, j <= rand(1, 3), j++) - step(B, pick(NORTH,SOUTH,EAST,WEST)) - ..() - - -/datum/chemical_reaction/slime/slimebork2 +/datum/chemical_reaction/slime/slimebork/drinks name = "Slime Bork 2" id = "m_tele4" required_reagents = list("water" = 1) - required_container = /obj/item/slime_extract/silver - required_other = 1 - -/datum/chemical_reaction/slime/slimebork2/on_reaction(datum/reagents/holder) - - feedback_add_details("slime_cores_used","[type]") - var/list/borks = subtypesof(/obj/item/weapon/reagent_containers/food/drinks) - // BORK BORK BORK - - playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) - - for(var/mob/living/carbon/M in viewers(get_turf(holder.my_atom), null)) - M.flash_act() - - for(var/i = 1, i <= 4 + rand(1,2), i++) - var/chosen = pick(borks) - var/obj/B = new chosen - if(B) - B.loc = get_turf(holder.my_atom) - if(prob(50)) - for(var/j = 1, j <= rand(1, 3), j++) - step(B, pick(NORTH,SOUTH,EAST,WEST)) - ..() +/datum/chemical_reaction/slime/slimebork/drinks/getborks() + return subtypesof(/obj/item/weapon/reagent_containers/food/drinks) //Blue /datum/chemical_reaction/slime/slimefrost @@ -245,11 +197,6 @@ required_container = /obj/item/slime_extract/blue required_other = 1 -/datum/chemical_reaction/slime/slimefrost/on_reaction(datum/reagents/holder) - feedback_add_details("slime_cores_used","[type]") - ..() - - /datum/chemical_reaction/slime/slimestabilizer name = "Slime Stabilizer" id = "m_slimestabilizer" @@ -258,12 +205,9 @@ required_other = 1 /datum/chemical_reaction/slime/slimestabilizer/on_reaction(datum/reagents/holder) - feedback_add_details("slime_cores_used","[type]") - var/obj/item/slimepotion/stabilizer/P = new /obj/item/slimepotion/stabilizer - P.loc = get_turf(holder.my_atom) + new /obj/item/slimepotion/stabilizer(get_turf(holder.my_atom)) ..() - /datum/chemical_reaction/slime/slimefoam name = "Slime Foam" id = "m_foam" @@ -272,11 +216,6 @@ required_container = /obj/item/slime_extract/blue required_other = 1 -/datum/chemical_reaction/slime/slimefoam/on_reaction(datum/reagents/holder) - feedback_add_details("slime_cores_used","[type]") - ..() - - //Dark Blue /datum/chemical_reaction/slime/slimefreeze name = "Slime Freeze" @@ -286,12 +225,12 @@ required_other = 1 /datum/chemical_reaction/slime/slimefreeze/on_reaction(datum/reagents/holder) - feedback_add_details("slime_cores_used","[type]") var/turf/T = get_turf(holder.my_atom) T.visible_message("The slime extract begins to vibrate adorably!") addtimer(CALLBACK(src, .proc/freeze, holder), 50) var/obj/item/slime_extract/M = holder.my_atom deltimer(M.qdel_timer) + ..() M.qdel_timer = addtimer(CALLBACK(src, .proc/delete_extract, holder), 55, TIMER_STOPPABLE) /datum/chemical_reaction/slime/slimefreeze/proc/freeze(datum/reagents/holder) @@ -300,8 +239,6 @@ if(istype(T)) T.atmos_spawn_air("freon=50;TEMP=120") - - /datum/chemical_reaction/slime/slimefireproof name = "Slime Fireproof" id = "m_fireproof" @@ -310,9 +247,7 @@ required_other = 1 /datum/chemical_reaction/slime/slimefireproof/on_reaction(datum/reagents/holder) - feedback_add_details("slime_cores_used","[type]") - var/obj/item/slimepotion/fireproof/P = new /obj/item/slimepotion/fireproof - P.loc = get_turf(holder.my_atom) + new /obj/item/slimepotion/fireproof(get_turf(holder.my_atom)) ..() //Orange @@ -324,24 +259,21 @@ required_container = /obj/item/slime_extract/orange required_other = 1 -/datum/chemical_reaction/slime/slimecasp/on_reaction(datum/reagents/holder) - feedback_add_details("slime_cores_used","[type]") - ..() - /datum/chemical_reaction/slime/slimefire name = "Slime fire" id = "m_fire" required_reagents = list("plasma" = 1) required_container = /obj/item/slime_extract/orange required_other = 1 + deletes_extract = FALSE /datum/chemical_reaction/slime/slimefire/on_reaction(datum/reagents/holder) - feedback_add_details("slime_cores_used","[type]") - var/turf/TU = get_turf(holder.my_atom) - TU.visible_message("The slime extract begins to vibrate adorably!") + var/turf/T = get_turf(holder.my_atom) + T.visible_message("The slime extract begins to vibrate adorably!") addtimer(CALLBACK(src, .proc/slime_burn, holder), 50) var/obj/item/slime_extract/M = holder.my_atom deltimer(M.qdel_timer) + ..() M.qdel_timer = addtimer(CALLBACK(src, .proc/delete_extract, holder), 55, TIMER_STOPPABLE) /datum/chemical_reaction/slime/slimefire/proc/slime_burn(datum/reagents/holder) @@ -359,12 +291,7 @@ required_container = /obj/item/slime_extract/orange required_other = 1 -/datum/chemical_reaction/slime/slimesmoke/on_reaction(datum/reagents/holder) - feedback_add_details("slime_cores_used","[type]") - ..() - //Yellow - /datum/chemical_reaction/slime/slimeoverload name = "Slime EMP" id = "m_emp" @@ -373,11 +300,9 @@ required_other = 1 /datum/chemical_reaction/slime/slimeoverload/on_reaction(datum/reagents/holder, created_volume) - feedback_add_details("slime_cores_used","[type]") empulse(get_turf(holder.my_atom), 3, 7) ..() - /datum/chemical_reaction/slime/slimecell name = "Slime Powercell" id = "m_cell" @@ -386,9 +311,7 @@ required_other = 1 /datum/chemical_reaction/slime/slimecell/on_reaction(datum/reagents/holder, created_volume) - feedback_add_details("slime_cores_used","[type]") - var/obj/item/weapon/stock_parts/cell/high/slime/P = new /obj/item/weapon/stock_parts/cell/high/slime - P.loc = get_turf(holder.my_atom) + new /obj/item/weapon/stock_parts/cell/high/slime(get_turf(holder.my_atom)) ..() /datum/chemical_reaction/slime/slimeglow @@ -399,15 +322,12 @@ required_other = 1 /datum/chemical_reaction/slime/slimeglow/on_reaction(datum/reagents/holder) - feedback_add_details("slime_cores_used","[type]") var/turf/T = get_turf(holder.my_atom) T.visible_message("The slime begins to emit a soft light. Squeezing it will cause it to grow brightly.") - var/obj/item/device/flashlight/slime/F = new /obj/item/device/flashlight/slime - F.loc = get_turf(holder.my_atom) + new /obj/item/device/flashlight/slime(T) ..() //Purple - /datum/chemical_reaction/slime/slimepsteroid name = "Slime Steroid" id = "m_steroid" @@ -416,9 +336,7 @@ required_other = 1 /datum/chemical_reaction/slime/slimepsteroid/on_reaction(datum/reagents/holder) - feedback_add_details("slime_cores_used","[type]") - var/obj/item/slimepotion/steroid/P = new /obj/item/slimepotion/steroid - P.loc = get_turf(holder.my_atom) + new /obj/item/slimepotion/steroid(get_turf(holder.my_atom)) ..() /datum/chemical_reaction/slime/slimejam @@ -429,11 +347,6 @@ required_container = /obj/item/slime_extract/purple required_other = 1 -/datum/chemical_reaction/slime/slimejam/on_reaction(datum/reagents/holder) - feedback_add_details("slime_cores_used","[type]") - ..() - - //Dark Purple /datum/chemical_reaction/slime/slimeplasma name = "Slime Plasma" @@ -443,9 +356,7 @@ required_other = 1 /datum/chemical_reaction/slime/slimeplasma/on_reaction(datum/reagents/holder) - feedback_add_details("slime_cores_used","[type]") - var/turf/location = get_turf(holder.my_atom) - new /obj/item/stack/sheet/mineral/plasma (location, 3) + new /obj/item/stack/sheet/mineral/plasma(get_turf(holder.my_atom), 3) ..() //Red @@ -458,9 +369,7 @@ required_other = 1 /datum/chemical_reaction/slime/slimemutator/on_reaction(datum/reagents/holder) - feedback_add_details("slime_cores_used","[type]") - var/obj/item/slimepotion/mutator/P = new /obj/item/slimepotion/mutator - P.loc = get_turf(holder.my_atom) + new /obj/item/slimepotion/mutator(get_turf(holder.my_atom)) ..() /datum/chemical_reaction/slime/slimebloodlust @@ -471,13 +380,11 @@ required_other = 1 /datum/chemical_reaction/slime/slimebloodlust/on_reaction(datum/reagents/holder) - feedback_add_details("slime_cores_used","[type]") for(var/mob/living/simple_animal/slime/slime in viewers(get_turf(holder.my_atom), null)) slime.rabid = 1 slime.visible_message("The [slime] is driven into a frenzy!") ..() - /datum/chemical_reaction/slime/slimespeed name = "Slime Speed" id = "m_speed" @@ -486,12 +393,9 @@ required_other = 1 /datum/chemical_reaction/slime/slimespeed/on_reaction(datum/reagents/holder) - feedback_add_details("slime_cores_used","[type]") - var/obj/item/slimepotion/speed/P = new /obj/item/slimepotion/speed - P.loc = get_turf(holder.my_atom) + new /obj/item/slimepotion/speed(get_turf(holder.my_atom)) ..() - //Pink /datum/chemical_reaction/slime/docility name = "Docility Potion" @@ -501,9 +405,7 @@ required_other = 1 /datum/chemical_reaction/slime/docility/on_reaction(datum/reagents/holder) - feedback_add_details("slime_cores_used","[type]") - var/obj/item/slimepotion/docility/P = new /obj/item/slimepotion/docility - P.loc = get_turf(holder.my_atom) + new /obj/item/slimepotion/docility(get_turf(holder.my_atom)) ..() /datum/chemical_reaction/slime/gender @@ -514,9 +416,7 @@ required_other = 1 /datum/chemical_reaction/slime/gender/on_reaction(datum/reagents/holder) - feedback_add_details("slime_cores_used","[type]") - var/obj/item/slimepotion/genderchange/G = new /obj/item/slimepotion/genderchange - G.loc = get_turf(holder.my_atom) + new /obj/item/slimepotion/genderchange(get_turf(holder.my_atom)) ..() //Black @@ -528,10 +428,6 @@ required_other = 1 required_container = /obj/item/slime_extract/black -/datum/chemical_reaction/slime/slimemutate2/on_reaction(datum/reagents/holder) - feedback_add_details("slime_cores_used","[type]") - ..() - //Oil /datum/chemical_reaction/slime/slimeexplosion name = "Slime Explosion" @@ -539,9 +435,9 @@ required_reagents = list("plasma" = 1) required_container = /obj/item/slime_extract/oil required_other = 1 + deletes_extract = FALSE /datum/chemical_reaction/slime/slimeexplosion/on_reaction(datum/reagents/holder) - feedback_add_details("slime_cores_used","[type]") var/turf/T = get_turf(holder.my_atom) var/lastkey = holder.my_atom.fingerprintslast var/touch_msg = "N/A" @@ -554,6 +450,7 @@ addtimer(CALLBACK(src, .proc/boom, holder), 50) var/obj/item/slime_extract/M = holder.my_atom deltimer(M.qdel_timer) + ..() M.qdel_timer = addtimer(CALLBACK(src, .proc/delete_extract, holder), 55, TIMER_STOPPABLE) /datum/chemical_reaction/slime/slimeexplosion/proc/boom(datum/reagents/holder) @@ -569,10 +466,6 @@ required_container = /obj/item/slime_extract/oil required_other = 1 -/datum/chemical_reaction/slime/slimecornoil/on_reaction(datum/reagents/holder) - feedback_add_details("slime_cores_used","[type]") - ..() - //Light Pink /datum/chemical_reaction/slime/slimepotion2 name = "Slime Potion 2" @@ -582,9 +475,7 @@ required_other = 1 /datum/chemical_reaction/slime/slimepotion2/on_reaction(datum/reagents/holder) - feedback_add_details("slime_cores_used","[type]") - var/obj/item/slimepotion/sentience/P = new /obj/item/slimepotion/sentience - P.loc = get_turf(holder.my_atom) + new /obj/item/slimepotion/sentience ..() //Adamantine @@ -596,10 +487,7 @@ required_other = 1 /datum/chemical_reaction/slime/slimegolem/on_reaction(datum/reagents/holder) - feedback_add_details("slime_cores_used","[type]") - var/obj/effect/golemrune/Z = new /obj/effect/golemrune - Z.loc = get_turf(holder.my_atom) - notify_ghosts("Golem rune created in [get_area(Z)].", 'sound/effects/ghost2.ogg', source = Z) + new /obj/effect/golemrune(get_turf(holder.my_atom)) ..() /datum/chemical_reaction/slime/slimegolem2 @@ -610,9 +498,7 @@ required_other = 1 /datum/chemical_reaction/slime/slimegolem2/on_reaction(datum/reagents/holder) - feedback_add_details("slime_cores_used","[type]") - var/obj/item/golem_shell/artificial/Z = new /obj/item/golem_shell/artificial - Z.loc = get_turf(holder.my_atom) + new /obj/item/golem_shell/artificial(get_turf(holder.my_atom)) ..() //Bluespace @@ -624,10 +510,7 @@ required_other = 1 /datum/chemical_reaction/slime/slimefloor2/on_reaction(datum/reagents/holder, created_volume) - feedback_add_details("slime_cores_used","[type]") - var/obj/item/stack/tile/bluespace/P = new /obj/item/stack/tile/bluespace - P.amount = 25 - P.loc = get_turf(holder.my_atom) + new /obj/item/stack/tile/bluespace(get_turf(holder.my_atom), 25) ..() @@ -639,10 +522,8 @@ required_other = 1 /datum/chemical_reaction/slime/slimecrystal/on_reaction(datum/reagents/holder, created_volume) - feedback_add_details("slime_cores_used","[type]") - if(holder.my_atom) - var/obj/item/weapon/ore/bluespace_crystal/BC = new(get_turf(holder.my_atom)) - BC.visible_message("The [BC.name] appears out of thin air!") + var/obj/item/weapon/ore/bluespace_crystal/BC = new (get_turf(holder.my_atom)) + BC.visible_message("The [BC.name] appears out of thin air!") ..() //Cerulean @@ -654,12 +535,9 @@ required_other = 1 /datum/chemical_reaction/slime/slimepsteroid2/on_reaction(datum/reagents/holder) - feedback_add_details("slime_cores_used","[type]") - var/obj/item/slimepotion/enhancer/P = new /obj/item/slimepotion/enhancer - P.loc = get_turf(holder.my_atom) + new /obj/item/slimepotion/enhancer(get_turf(holder.my_atom)) ..() - /datum/chemical_reaction/slime/slime_territory name = "Slime Territory" id = "s_territory" @@ -668,9 +546,7 @@ required_other = 1 /datum/chemical_reaction/slime/slime_territory/on_reaction(datum/reagents/holder) - feedback_add_details("slime_cores_used","[type]") - var/obj/item/areaeditor/blueprints/slime/P = new /obj/item/areaeditor/blueprints/slime - P.loc = get_turf(holder.my_atom) + new /obj/item/areaeditor/blueprints/slime(get_turf(holder.my_atom)) ..() //Sepia @@ -682,15 +558,12 @@ required_other = 1 /datum/chemical_reaction/slime/slimestop/on_reaction(datum/reagents/holder) - feedback_add_details("slime_cores_used","[type]") - var/mob/mob = get_mob_by_key(holder.my_atom.fingerprintslast) var/obj/effect/timestop/T = new /obj/effect/timestop - T.loc = get_turf(holder.my_atom) - T.immune += mob + T.forceMove(get_turf(holder.my_atom)) + T.immune += get_mob_by_key(holder.my_atom.fingerprintslast) T.timestop() ..() - /datum/chemical_reaction/slime/slimecamera name = "Slime Camera" id = "m_camera" @@ -699,11 +572,8 @@ required_other = 1 /datum/chemical_reaction/slime/slimecamera/on_reaction(datum/reagents/holder) - feedback_add_details("slime_cores_used","[type]") - var/obj/item/device/camera/P = new /obj/item/device/camera - P.loc = get_turf(holder.my_atom) - var/obj/item/device/camera_film/Z = new /obj/item/device/camera_film - Z.loc = get_turf(holder.my_atom) + new /obj/item/device/camera(get_turf(holder.my_atom)) + new /obj/item/device/camera_film(get_turf(holder.my_atom)) ..() /datum/chemical_reaction/slime/slimefloor @@ -714,16 +584,10 @@ required_other = 1 /datum/chemical_reaction/slime/slimefloor/on_reaction(datum/reagents/holder) - feedback_add_details("slime_cores_used","[type]") - var/obj/item/stack/tile/sepia/P = new /obj/item/stack/tile/sepia - P.amount = 25 - P.loc = get_turf(holder.my_atom) + new /obj/item/stack/tile/sepia(get_turf(holder.my_atom), 25) ..() - //Pyrite - - /datum/chemical_reaction/slime/slimepaint name = "Slime Paint" id = "s_paint" @@ -732,15 +596,10 @@ required_other = 1 /datum/chemical_reaction/slime/slimepaint/on_reaction(datum/reagents/holder) - feedback_add_details("slime_cores_used","[type]") - var/list/paints = subtypesof(/obj/item/weapon/paint) - var/chosen = pick(paints) - var/obj/P = new chosen - if(P) - P.loc = get_turf(holder.my_atom) + var/chosen = pick(subtypesof(/obj/item/weapon/paint)) + new chosen(get_turf(holder.my_atom)) ..() - /datum/chemical_reaction/slime/slimecrayon name = "Slime Crayon" id = "s_crayon" @@ -749,12 +608,8 @@ required_other = 1 /datum/chemical_reaction/slime/slimecrayon/on_reaction(datum/reagents/holder) - feedback_add_details("slime_cores_used","[type]") - var/list/crayons = difflist(subtypesof(/obj/item/toy/crayon),typesof(/obj/item/toy/crayon/spraycan)) - var/chosen = pick(crayons) - var/obj/P = new chosen - if(P) - P.loc = get_turf(holder.my_atom) + var/chosen = pick(difflist(subtypesof(/obj/item/toy/crayon),typesof(/obj/item/toy/crayon/spraycan))) + new chosen(get_turf(holder.my_atom)) ..() //Rainbow :o) @@ -766,12 +621,8 @@ required_container = /obj/item/slime_extract/rainbow /datum/chemical_reaction/slime/slimeRNG/on_reaction(datum/reagents/holder) - feedback_add_details("slime_cores_used","[type]") - var/mob/living/simple_animal/slime/random/S - S = new(get_turf(holder.my_atom)) - S.visible_message("Infused with plasma, the \ - core begins to quiver and grow, and soon a new baby slime emerges \ - from it!") + var/mob/living/simple_animal/slime/random/S = new (get_turf(holder.my_atom)) + S.visible_message("Infused with plasma, the core begins to quiver and grow, and a new baby slime emerges from it!") ..() /datum/chemical_reaction/slime/slime_transfer @@ -782,9 +633,7 @@ required_container = /obj/item/slime_extract/rainbow /datum/chemical_reaction/slime/slime_transfer/on_reaction(datum/reagents/holder) - feedback_add_details("slime_cores_used","[type]") - var/obj/item/slimepotion/transference/P = new /obj/item/slimepotion/transference - P.loc = get_turf(holder.my_atom) + new /obj/item/slimepotion/transference(get_turf(holder.my_atom)) ..() /datum/chemical_reaction/slime/flight_potion @@ -795,7 +644,6 @@ required_container = /obj/item/slime_extract/rainbow /datum/chemical_reaction/slime/flight_potion/on_reaction(datum/reagents/holder) - feedback_add_details("slime_cores_used","[type]") - new/obj/item/weapon/reagent_containers/glass/bottle/potion/flight(get_turf(holder.my_atom)) + new /obj/item/weapon/reagent_containers/glass/bottle/potion/flight(get_turf(holder.my_atom)) ..() diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index f31cd011312..38d742c5be0 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -482,9 +482,14 @@ resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF layer = TURF_LAYER -/obj/effect/golemrune/New() - ..() +/obj/effect/golemrune/Initialize() + . = ..() START_PROCESSING(SSobj, src) + notify_ghosts("Golem rune created in [get_area(src)].", 'sound/effects/ghost2.ogg', source = src) + +/obj/effect/golemrune/Destroy() + STOP_PROCESSING(SSobj, src) + return ..() /obj/effect/golemrune/process() var/mob/dead/observer/ghost From 68d760b5b2f533b56c86a6f7fe2de789b3af020e Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Thu, 13 Apr 2017 18:21:42 -0400 Subject: [PATCH 08/28] Fixes suit removal item dropping (#26138) --- code/modules/mob/living/carbon/human/inventory.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 091800d46a1..101b06849b0 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -141,7 +141,7 @@ return not_handled //For future deeper overrides -/mob/living/carbon/human/doUnEquip(obj/item/I, force, newloc, no_move, invdrop) +/mob/living/carbon/human/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE) . = ..() //See mob.dm for an explanation on this and some rage about people copypasting instead of calling ..() like they should. if(!. || !I) return From 909c75c5e55de8e5038a4cbe28d3b044ba23c43c Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Thu, 13 Apr 2017 18:22:11 -0400 Subject: [PATCH 09/28] Moves AStar and priority_announce into __HELPERS (#26136) --- code/{orphaned_procs => __HELPERS}/AStar.dm | 0 code/{orphaned_procs => __HELPERS}/priority_announce.dm | 0 tgstation.dme | 4 ++-- 3 files changed, 2 insertions(+), 2 deletions(-) rename code/{orphaned_procs => __HELPERS}/AStar.dm (100%) rename code/{orphaned_procs => __HELPERS}/priority_announce.dm (100%) diff --git a/code/orphaned_procs/AStar.dm b/code/__HELPERS/AStar.dm similarity index 100% rename from code/orphaned_procs/AStar.dm rename to code/__HELPERS/AStar.dm diff --git a/code/orphaned_procs/priority_announce.dm b/code/__HELPERS/priority_announce.dm similarity index 100% rename from code/orphaned_procs/priority_announce.dm rename to code/__HELPERS/priority_announce.dm diff --git a/tgstation.dme b/tgstation.dme index 04a6e47e821..092f36089f4 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -70,6 +70,7 @@ #include "code\__HELPERS\_lists.dm" #include "code\__HELPERS\_logging.dm" #include "code\__HELPERS\_string_lists.dm" +#include "code\__HELPERS\AStar.dm" #include "code\__HELPERS\bandetect.dm" #include "code\__HELPERS\cmp.dm" #include "code\__HELPERS\files.dm" @@ -82,6 +83,7 @@ #include "code\__HELPERS\matrices.dm" #include "code\__HELPERS\mobs.dm" #include "code\__HELPERS\names.dm" +#include "code\__HELPERS\priority_announce.dm" #include "code\__HELPERS\pronouns.dm" #include "code\__HELPERS\radio.dm" #include "code\__HELPERS\sanitize_values.dm" @@ -2074,9 +2076,7 @@ #include "code\modules\VR\vr_sleeper.dm" #include "code\modules\zombie\items.dm" #include "code\modules\zombie\organs.dm" -#include "code\orphaned_procs\AStar.dm" #include "code\orphaned_procs\dbcore.dm" -#include "code\orphaned_procs\priority_announce.dm" #include "code\orphaned_procs\statistics.dm" #include "interface\interface.dm" #include "interface\stylesheet.dm" From bc72b2e28845ca92ef181c8bb8c46f237589c5a6 Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Thu, 13 Apr 2017 18:22:56 -0400 Subject: [PATCH 10/28] Refactors dellogging into SSgarbage/Shutdown (#26135) * Refactors dellogging into SSgarbage/Shutdown * list --- code/controllers/subsystem/garbage.dm | 15 +++++++++++++++ code/controllers/subsystem/ticker.dm | 16 ---------------- code/world.dm | 8 -------- 3 files changed, 15 insertions(+), 24 deletions(-) diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm index 1fff5c64304..f0bfb6a76a2 100644 --- a/code/controllers/subsystem/garbage.dm +++ b/code/controllers/subsystem/garbage.dm @@ -47,6 +47,21 @@ SUBSYSTEM_DEF(garbage) msg += "TGR:[round((totalgcs/(totaldels+totalgcs))*100, 0.01)]%" ..(msg) +/datum/controller/subsystem/garbage/Shutdown() + //Adds the del() log to world.log in a format condensable by the runtime condenser found in tools + if(didntgc.len || sleptDestroy.len) + var/list/dellog = list() + for(var/path in didntgc) + dellog += "Path : [path] \n" + dellog += "Failures : [didntgc[path]] \n" + if(path in sleptDestroy) + dellog += "Sleeps : [sleptDestroy[path]] \n" + sleptDestroy -= path + for(var/path in sleptDestroy) + dellog += "Path : [path] \n" + dellog += "Sleeps : [sleptDestroy[path]] \n" + log_world(dellog.Join()) + /datum/controller/subsystem/garbage/fire() HandleToBeQueued() if(state == SS_RUNNING) diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 3f7f23b62e2..5d572f8a07a 100644 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -590,22 +590,6 @@ SUBSYSTEM_DEF(ticker) CHECK_TICK - //Adds the del() log to world.log in a format condensable by the runtime condenser found in tools - if(SSgarbage.didntgc.len || SSgarbage.sleptDestroy.len) - var/dellog = "" - for(var/path in SSgarbage.didntgc) - dellog += "Path : [path] \n" - dellog += "Failures : [SSgarbage.didntgc[path]] \n" - if(path in SSgarbage.sleptDestroy) - dellog += "Sleeps : [SSgarbage.sleptDestroy[path]] \n" - SSgarbage.sleptDestroy -= path - for(var/path in SSgarbage.sleptDestroy) - dellog += "Path : [path] \n" - dellog += "Sleeps : [SSgarbage.sleptDestroy[path]] \n" - log_world(dellog) - - CHECK_TICK - //Collects persistence features SSpersistence.CollectData() diff --git a/code/world.dm b/code/world.dm index ea6c35ebec4..2fac93f87cb 100644 --- a/code/world.dm +++ b/code/world.dm @@ -210,14 +210,6 @@ /world/proc/OnReboot(reason, feedback_c, feedback_r, round_end_sound_sent) feedback_set_details("[feedback_c]","[feedback_r]") log_game("Rebooting World. [reason]") -#ifdef dellogging - var/log = file("data/logs/del.log") - log << time2text(world.realtime) - for(var/index in del_counter) - var/count = del_counter[index] - if(count > 10) - log << "#[count]\t[index]" -#endif if(GLOB.blackbox) GLOB.blackbox.save_all_data_to_sql() Master.Shutdown() //run SS shutdowns From 40b8f011fe5795d68c21b27a2da3b9fc72c4cf93 Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Thu, 13 Apr 2017 18:24:38 -0400 Subject: [PATCH 11/28] Adds a comment on init order because it can get confusing (#26132) --- code/controllers/master.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/controllers/master.dm b/code/controllers/master.dm index f90960b92f0..b4c5bc7d6d7 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -10,6 +10,10 @@ //This is the ABSOLUTE ONLY THING that should init globally like this GLOBAL_REAL(Master, /datum/controller/master) = new +//THIS IS THE INIT ORDER +//Master -> SSPreInit -> GLOB -> world -> config -> SSInit -> Failsafe +//GOT IT MEMORIZED? + GLOBAL_VAR_INIT(MC_restart_clear, 0) GLOBAL_VAR_INIT(MC_restart_timeout, 0) GLOBAL_VAR_INIT(MC_restart_count, 0) From 7b9282cb07329c023aefdfe44216edf05a05629f Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Thu, 13 Apr 2017 18:56:08 -0400 Subject: [PATCH 12/28] Revert "Shuttle movement immediately updates lighting objects" --- code/modules/lighting/lighting_object.dm | 4 ++++ code/modules/shuttle/on_move.dm | 7 ------- code/modules/shuttle/shuttle.dm | 2 -- 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/code/modules/lighting/lighting_object.dm b/code/modules/lighting/lighting_object.dm index 2dfcd0e1034..369129fc578 100644 --- a/code/modules/lighting/lighting_object.dm +++ b/code/modules/lighting/lighting_object.dm @@ -133,6 +133,10 @@ GLOBAL_LIST_EMPTY(all_lighting_objects) // Global list of lighting objects. /atom/movable/lighting_object/blob_act() return +// Nope nope nope! +/atom/movable/lighting_object/onShuttleMove(turf/T1, rotation) + return FALSE + // Override here to prevent things accidentally moving around overlays. /atom/movable/lighting_object/forceMove(atom/destination, var/no_tp=FALSE, var/harderforce = FALSE) if(harderforce) diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm index 13a2f453f3a..1cf42135d69 100644 --- a/code/modules/shuttle/on_move.dm +++ b/code/modules/shuttle/on_move.dm @@ -1,6 +1,3 @@ -/turf/proc/onShuttleMove(turf/oldturf) - addtimer(CALLBACK(lighting_object, /atom/movable/lighting_object/proc/update), 0) - /atom/movable/proc/onShuttleMove(turf/T1, rotation) if(rotation) shuttleRotate(rotation) @@ -80,7 +77,3 @@ var/oldPY = pixel_y pixel_x = oldPY pixel_y = (oldPX*(-1)) - -// Nope nope nope! -/atom/movable/lighting_object/onShuttleMove(turf/T1, rotation) - return FALSE \ No newline at end of file diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index f6f955f9e94..a271ddfe417 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -503,8 +503,6 @@ //move mobile to new location for(var/atom/movable/AM in T0) AM.onShuttleMove(T1, rotation) - - T1.onShuttleMove(T0) if(rotation) T1.shuttleRotate(rotation) From 4ef90caf4e84b30d853a4eb324e8e13cdbc8af55 Mon Sep 17 00:00:00 2001 From: bagil Date: Thu, 13 Apr 2017 23:31:53 +0000 Subject: [PATCH 13/28] Automatic changelog compile, [ci skip] --- html/changelog.html | 5 +++++ html/changelogs/.all_changelog.yml | 4 ++++ html/changelogs/AutoChangeLog-pr-25263.yml | 5 ----- 3 files changed, 9 insertions(+), 5 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-25263.yml diff --git a/html/changelog.html b/html/changelog.html index aad02c775fc..377341d284a 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -79,6 +79,11 @@
  • Constructing lattice no longer prevents space transitions.
+

Robustin updated:

+
    +
  • Ranged RCD added to the game
  • +
  • Rapid Lighting Device (also ranged) has been added. It can create wall, floor, and temporary lights of any color you desire.
  • +

coiax updated:

  • Cigarette branding has been fixed.
  • diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 15b46468820..bd574806d91 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -10569,6 +10569,10 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - bugfix: Bodies in body bags get cremated properly now RemieRichards: - bugfix: Constructing lattice no longer prevents space transitions. + Robustin: + - rscadd: Ranged RCD added to the game + - rscadd: Rapid Lighting Device (also ranged) has been added. It can create wall, + floor, and temporary lights of any color you desire. coiax: - bugfix: Cigarette branding has been fixed. - rscadd: Uplift Smooth brand cigarettes now taste minty as advertised. diff --git a/html/changelogs/AutoChangeLog-pr-25263.yml b/html/changelogs/AutoChangeLog-pr-25263.yml deleted file mode 100644 index f0d7ad58ec5..00000000000 --- a/html/changelogs/AutoChangeLog-pr-25263.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Robustin" -delete-after: True -changes: - - rscadd: "Ranged RCD added to the game" - - rscadd: "Rapid Lighting Device (also ranged) has been added. It can create wall, floor, and temporary lights of any color you desire." From 8b92499578344fd476024f456f96bf453f423c7a Mon Sep 17 00:00:00 2001 From: AnturK Date: Fri, 14 Apr 2017 09:49:25 +0200 Subject: [PATCH 14/28] Really now (#26175) --- code/modules/events/spacevine.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm index 5dc56ceac89..8d410c475c0 100644 --- a/code/modules/events/spacevine.dm +++ b/code/modules/events/spacevine.dm @@ -434,14 +434,14 @@ var/list/growth_queue = list() var/spread_multiplier = 5 var/spread_cap = 30 - var/list/GLOB.mutations_list = list() + var/list/vine_mutations_list = list() var/mutativeness = 1 /obj/effect/spacevine_controller/New(loc, list/muts, potency, production) add_atom_colour("#ffffff", FIXED_COLOUR_PRIORITY) spawn_spacevine_piece(loc, , muts) START_PROCESSING(SSobj, src) - init_subtypes(/datum/spacevine_mutation/, GLOB.mutations_list) + init_subtypes(/datum/spacevine_mutation/, vine_mutations_list) if(potency != null) mutativeness = potency / 10 if(production != null) @@ -476,7 +476,7 @@ var/parentcolor = parent.atom_colours[FIXED_COLOUR_PRIORITY] SV.add_atom_colour(parentcolor, FIXED_COLOUR_PRIORITY) if(prob(mutativeness)) - var/datum/spacevine_mutation/randmut = pick(GLOB.mutations_list - SV.mutations) + var/datum/spacevine_mutation/randmut = pick(vine_mutations_list - SV.mutations) randmut.add_mutation_to_vinepiece(SV) for(var/datum/spacevine_mutation/SM in SV.mutations) From 8fa50296e7dc5bc09f603b2a0c92a60d80d8b5ca Mon Sep 17 00:00:00 2001 From: AnturK Date: Fri, 14 Apr 2017 09:49:45 +0200 Subject: [PATCH 15/28] Fixes #26142 (#26174) --- code/modules/projectiles/pins.dm | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm index 907082cc8b7..2347cc3c7c1 100644 --- a/code/modules/projectiles/pins.dm +++ b/code/modules/projectiles/pins.dm @@ -95,9 +95,8 @@ var/obj/item/weapon/implant/req_implant = null /obj/item/device/firing_pin/implant/pin_auth(mob/living/user) - if(iscarbon(user)) - var/mob/living/carbon/C = user - for(var/obj/item/weapon/implant/I in C.implants) + if(istype(user)) + for(var/obj/item/weapon/implant/I in user.implants) if(req_implant && I.type == req_implant) return 1 return 0 From 6ab03c37c34658caf42f95fecc413a19f651c361 Mon Sep 17 00:00:00 2001 From: Davidj361 Date: Fri, 14 Apr 2017 03:50:34 -0400 Subject: [PATCH 16/28] Fixes #26048, ashwalkers no longer able to wear shoes (#26173) --- code/modules/mob/living/carbon/human/species.dm | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 6cd9e2e7f3b..3eea0ea8e00 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -111,6 +111,12 @@ var/obj/item/thing = C.get_item_by_slot(slot_id) if(thing && (!thing.species_exception || !is_type_in_list(src,thing.species_exception))) C.dropItemToGround(thing) + + // this needs to be FIRST because qdel calls update_body which checks if we have DIGITIGRADE legs or not and if not then removes DIGITIGRADE from species_traits + if(("legs" in C.dna.species.mutant_bodyparts) && C.dna.features["legs"] == "Digitigrade Legs") + species_traits += DIGITIGRADE + if(DIGITIGRADE in species_traits) + C.Digitigrade_Leg_Swap(FALSE) var/obj/item/organ/heart/heart = C.getorganslot("heart") var/obj/item/organ/lungs/lungs = C.getorganslot("lungs") @@ -152,10 +158,6 @@ if(exotic_bloodtype && C.dna.blood_type != exotic_bloodtype) C.dna.blood_type = exotic_bloodtype - if(("legs" in C.dna.species.mutant_bodyparts) && C.dna.features["legs"] == "Digitigrade Legs") - species_traits += DIGITIGRADE - if(DIGITIGRADE in species_traits) - C.Digitigrade_Leg_Swap(FALSE) /datum/species/proc/on_species_loss(mob/living/carbon/C) if(C.dna.species.exotic_bloodtype) From 4926430829ce19d7630a1630b5eec73010adec20 Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Fri, 14 Apr 2017 00:50:35 -0700 Subject: [PATCH 17/28] Automatic changelog generation for PR #26173 [ci skip] --- html/changelogs/AutoChangeLog-pr-26173.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-26173.yml diff --git a/html/changelogs/AutoChangeLog-pr-26173.yml b/html/changelogs/AutoChangeLog-pr-26173.yml new file mode 100644 index 00000000000..0c7b1f3e2e0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-26173.yml @@ -0,0 +1,4 @@ +author: "Davidj361" +delete-after: True +changes: + - bugfix: "Mutant digitigrade legs re-added to the ashwalker species" From 02f81a091f8ccef7adcab4c3a5f2735f526cc7a9 Mon Sep 17 00:00:00 2001 From: octareenroon91 Date: Fri, 14 Apr 2017 02:51:03 -0500 Subject: [PATCH 18/28] Fix twohanded quick-equip (#26172) Fixes #26105 --- code/game/objects/items/weapons/twohanded.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index 0b36647b986..002c7773b47 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -106,6 +106,8 @@ /obj/item/weapon/twohanded/equip_to_best_slot(mob/M) if(..()) + if(istype(src, /obj/item/weapon/twohanded/required)) + return // unwield forces twohanded-required items to be dropped. unwield(M) return From a2f6e7b6e00143c972bf752fc00e69b7d6125c9c Mon Sep 17 00:00:00 2001 From: 4dplanner <3combined@gmail.com> Date: Fri, 14 Apr 2017 08:51:25 +0100 Subject: [PATCH 19/28] Changes guardian lighting check to use light_range (#26171) --- code/modules/mob/living/simple_animal/guardian/guardian.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index 1eec40c264f..e49e4120478 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -338,7 +338,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians to_chat(src, "You don't have another mode!") /mob/living/simple_animal/hostile/guardian/proc/ToggleLight() - if(!luminosity) + if(light_range<3) to_chat(src, "You activate your light.") set_light(3) else From 401fdd3a224626a6f0464741843bf604baea8305 Mon Sep 17 00:00:00 2001 From: Militaires Date: Fri, 14 Apr 2017 10:52:12 +0300 Subject: [PATCH 20/28] fixes shit formatting and grammar with human piggyback riding (#26170) * fixes shit formatting and grammar with human piggyback riding * removes because their --- code/datums/riding.dm | 8 ++++---- code/modules/mob/living/carbon/human/human.dm | 10 +++------- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/code/datums/riding.dm b/code/datums/riding.dm index aa167307036..c069e0cdeb2 100644 --- a/code/datums/riding.dm +++ b/code/datums/riding.dm @@ -335,11 +335,11 @@ /datum/riding/human/ride_check(mob/living/M) var/mob/living/carbon/human/H = ridden //IF this runtimes I'm blaming the admins. if(M.incapacitated(FALSE, TRUE) || H.incapacitated(FALSE, TRUE)) - M.visible_message("[M] falls off of [ridden]!") + M.visible_message("[M] falls off [ridden]!") Unbuckle(M) return FALSE if(M.restrained(TRUE)) - M.visible_message("[M] can't hang onto [ridden] with their hands cuffed!") //Honestly this should put the ridden mob in a chokehold. + M.visible_message("[M] can't hang onto [ridden] with their hands cuffed!") //Honestly this should put the ridden mob in a chokehold. Unbuckle(M) return FALSE if(H.pulling == M) @@ -375,7 +375,7 @@ ridden.unbuckle_mob(user) user.Weaken(3) user.Stun(3) - user.visible_message("[ridden] pushes [user] off of them!") + user.visible_message("[ridden] pushes [user] off of them!") /datum/riding/cyborg keytype = null @@ -436,7 +436,7 @@ var/turf/target = get_edge_target_turf(ridden, ridden.dir) var/turf/targetm = get_step(get_turf(ridden), ridden.dir) M.Move(targetm) - M.visible_message("[M] is thrown clear of [ridden]!") + M.visible_message("[M] is thrown clear of [ridden]!") M.throw_at(target, 14, 5, ridden) M.Weaken(3) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index a003c8cf174..7b604bc3699 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -920,18 +920,14 @@ return if(!riding_datum) riding_datum = new /datum/riding/human(src) - if(buckled_mobs && ((M in buckled_mobs) || (buckled_mobs.len >= max_buckled_mobs))) - return - if(buckled) //NO INFINITE STACKING!! - return - if(M.stat != CONSCIOUS) + if(buckled_mobs && ((M in buckled_mobs) || (buckled_mobs.len >= max_buckled_mobs)) || buckled || (M.stat != CONSCIOUS)) return if(iscarbon(M)) if(M.incapacitated(FALSE, TRUE) || incapacitated(FALSE, TRUE)) - M.visible_message("[M] can't hang onto [src]!") + M.visible_message("[M] can't hang onto [src]!") return if(!riding_datum.equip_buckle_inhands(M, 2)) //MAKE SURE THIS IS LAST!! - M.visible_message("[M] can't climb onto [src] because [M.p_their()] hands are full!") + M.visible_message("[M] can't climb onto [src]!") return . = ..(M, force, check_loc) stop_pulling() From 9b6abcbd120c007db54c71f93bf10434c5587177 Mon Sep 17 00:00:00 2001 From: Davidj361 Date: Fri, 14 Apr 2017 03:52:58 -0400 Subject: [PATCH 21/28] Fixes #26076, you can't cheat with eyewear/eye-implants (#26165) * Fixes #26076, you can't cheat with eyewear/eye-implants when using advanced cameras * Removed comment --- code/game/machinery/computer/camera_advanced.dm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm index f0adeac2266..39cdb1478cb 100644 --- a/code/game/machinery/computer/camera_advanced.dm +++ b/code/game/machinery/computer/camera_advanced.dm @@ -92,6 +92,12 @@ obj/machinery/computer/camera_advanced/attack_ai(mob/user) var/eye_initialized = 0 var/visible_icon = 0 var/image/user_image = null + +/mob/camera/aiEye/remote/update_remote_sight(mob/living/user) + user.see_invisible = SEE_INVISIBLE_LIVING //can't see ghosts through cameras + user.sight = 0 + user.see_in_dark = 2 + return 1 /mob/camera/aiEye/remote/Destroy() eye_user = null From 6daeb5ecd2d63cdf0fc753dfe606f5aef60ba219 Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Fri, 14 Apr 2017 00:53:00 -0700 Subject: [PATCH 22/28] Automatic changelog generation for PR #26165 [ci skip] --- html/changelogs/AutoChangeLog-pr-26165.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-26165.yml diff --git a/html/changelogs/AutoChangeLog-pr-26165.yml b/html/changelogs/AutoChangeLog-pr-26165.yml new file mode 100644 index 00000000000..84c8e321ca3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-26165.yml @@ -0,0 +1,4 @@ +author: "Davidj361" +delete-after: True +changes: + - bugfix: "You can't cheat with eyewear/eye-implants when using advanced cameras" From 4637624699b93605a746c3330316e5015a0b301d Mon Sep 17 00:00:00 2001 From: coiax Date: Fri, 14 Apr 2017 09:33:45 +0100 Subject: [PATCH 23/28] Fixes plasmamen burning to death in cloning pods (#25924) * Fixes plasmamen burning to death in cloning pods Fixes #25921. :cl: coiax fix: Plasmamen no longer burn to death while inside a cloning pod. /:cl: In my big cloning overhaul, I made the choice to have clones not interact with the external gases, because they were immersed in pressurised liquid, with their oxygen needs being taken care of by the "brine". This was a declared feature of the cloning PR. Evidently, I must have removed it at some point. So I'm fixing that. * converts space gas mixtures to immutable gas mixtures * renames space_mixture.dm * adds immutable gas mix for cloners * updates the repo dme * updates keyword according to new guidelines --- code/game/machinery/cloning.dm | 9 +++ code/game/turfs/space/space.dm | 2 +- .../environmental/LINDA_turf_tile.dm | 4 +- .../gasmixtures/immutable_mixtures.dm | 81 +++++++++++++++++++ .../atmospherics/gasmixtures/space_mixture.dm | 58 ------------- tgstation.dme | 2 +- 6 files changed, 94 insertions(+), 62 deletions(-) create mode 100644 code/modules/atmospherics/gasmixtures/immutable_mixtures.dm delete mode 100644 code/modules/atmospherics/gasmixtures/space_mixture.dm diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index fcf09bca3d6..794f1ccda32 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -126,6 +126,15 @@ if (is_operational() && (!isnull(occupant)) && (occupant.stat != DEAD)) to_chat(user, "Current clone cycle is [round(get_completion())]% complete.") +/obj/machinery/clonepod/return_air() + // We want to simulate the clone not being in contact with + // the atmosphere, so we'll put them in a constant pressure + // nitrogen. They'll breathe through the chemicals we pump into them. + var/static/datum/gas_mixture/immutable/cloner/GM //global so that there's only one instance made for all cloning pods + if(!GM) + GM = new + return GM + /obj/machinery/clonepod/proc/get_completion() . = (100 * ((occupant.health + 100) / (heal_level + 100))) diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index f71e7dbe0f8..6c1e2743cd5 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -12,7 +12,7 @@ var/destination_x var/destination_y - var/global/datum/gas_mixture/space/space_gas = new + var/global/datum/gas_mixture/immutable/space/space_gas = new plane = PLANE_SPACE light_power = 0.25 dynamic_lighting = DYNAMIC_LIGHTING_DISABLED diff --git a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm index f78f1724d8b..7e9df7d22ce 100644 --- a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm +++ b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm @@ -322,10 +322,10 @@ for(var/t in turf_list) var/turf/open/T = t - if (space_is_all_consuming && !space_in_group && istype(T.air, /datum/gas_mixture/space)) + if (space_is_all_consuming && !space_in_group && istype(T.air, /datum/gas_mixture/immutable/space)) space_in_group = 1 qdel(A) - A = new/datum/gas_mixture/space() + A = new/datum/gas_mixture/immutable/space() A.merge(T.air) for(var/id in A_gases) diff --git a/code/modules/atmospherics/gasmixtures/immutable_mixtures.dm b/code/modules/atmospherics/gasmixtures/immutable_mixtures.dm new file mode 100644 index 00000000000..7dc112434f6 --- /dev/null +++ b/code/modules/atmospherics/gasmixtures/immutable_mixtures.dm @@ -0,0 +1,81 @@ +//"immutable" gas mixture used for immutable calculations +//it can be changed, but any changes will ultimately be undone before they can have any effect + +/datum/gas_mixture/immutable + var/initial_temperature + +/datum/gas_mixture/immutable/proc/reset_gas_mix() + temperature = initial_temperature + temperature_archived = initial_temperature + +/datum/gas_mixture/immutable/New() + ..() + reset_gas_mix() + +/datum/gas_mixture/immutable/garbage_collect() + reset_gas_mix() + +/datum/gas_mixture/immutable/archive() + return 1 //nothing changes, so we do nothing and the archive is successful + +/datum/gas_mixture/immutable/merge() + return 0 //we're immutable. + +/datum/gas_mixture/immutable/heat_capacity_archived() + return heat_capacity() + +/datum/gas_mixture/immutable/share(datum/gas_mixture/sharer, atmos_adjacent_turfs = 4) + . = ..(sharer, 0) + reset_gas_mix() + +/datum/gas_mixture/immutable/after_share() + temperature = initial_temperature + reset_gas_mix() + +/datum/gas_mixture/immutable/react() + return 0 //we're immutable. + +/datum/gas_mixture/immutable/copy() + return new type //we're immutable, so we can just return a new instance. + +/datum/gas_mixture/immutable/copy_from() + return 0 //we're immutable. + +/datum/gas_mixture/immutable/copy_from_turf() + return 0 //we're immutable. + +/datum/gas_mixture/immutable/parse_gas_string() + return 0 //we're immutable. + +/datum/gas_mixture/immutable/temperature_share(datum/gas_mixture/sharer, conduction_coefficient, sharer_temperature, sharer_heat_capacity) + . = ..() + temperature = initial_temperature + +//used by space tiles +/datum/gas_mixture/immutable/space + initial_temperature = TCMB + +/datum/gas_mixture/immutable/space/garbage_collect() + gases.Cut() //clever way of ensuring we always are empty. + +/datum/gas_mixture/immutable/space/heat_capacity() + return 7000 + +/datum/gas_mixture/immutable/space/remove() + return copy() //we're always empty, so we can just return a copy. + +/datum/gas_mixture/immutable/space/remove_ratio() + return copy() //we're always empty, so we can just return a copy. + + +//used by cloners +/datum/gas_mixture/immutable/cloner + initial_temperature = T20C + +/datum/gas_mixture/immutable/cloner/reset_gas_mix() + assert_gas("n2") + gases["n2"][MOLES] = MOLES_O2STANDARD + MOLES_N2STANDARD + ..() + +/datum/gas_mixture/immutable/cloner/heat_capacity() + return (MOLES_O2STANDARD + MOLES_N2STANDARD)*20 //specific heat of nitrogen is 20 diff --git a/code/modules/atmospherics/gasmixtures/space_mixture.dm b/code/modules/atmospherics/gasmixtures/space_mixture.dm deleted file mode 100644 index 5b590e4626a..00000000000 --- a/code/modules/atmospherics/gasmixtures/space_mixture.dm +++ /dev/null @@ -1,58 +0,0 @@ -//"immutable" gas mixture used for space calculations -//it can be changed, but any changes will ultimately be undone before they can have any effect - -/datum/gas_mixture/space - -/datum/gas_mixture/space/New() - ..() - temperature = TCMB - temperature_archived = TCMB - -/datum/gas_mixture/space/garbage_collect() - gases.Cut() //clever way of ensuring we always are empty. - -/datum/gas_mixture/space/archive() - return 1 //nothing changes, so we do nothing and the archive is successful - -/datum/gas_mixture/space/merge() - return 0 //we're immutable. - -/datum/gas_mixture/space/heat_capacity() - . = 7000 - -/datum/gas_mixture/space/heat_capacity_archived() - . = heat_capacity() - -/datum/gas_mixture/space/remove() - return copy() //we're immutable, so we can just return a copy. - -/datum/gas_mixture/space/remove_ratio() - return copy() //we're immutable, so we can just return a copy. - -/datum/gas_mixture/space/share(datum/gas_mixture/sharer, atmos_adjacent_turfs = 4) - . = ..(sharer, 0) - temperature = TCMB - gases.Cut() - -/datum/gas_mixture/space/after_share() - temperature = TCMB - gases.Cut() - -/datum/gas_mixture/space/react() - return 0 //we're immutable. - -/datum/gas_mixture/space/copy() - return new /datum/gas_mixture/space //we're immutable, so we can just return a new instance. - -/datum/gas_mixture/space/copy_from() - return 0 //we're immutable. - -/datum/gas_mixture/space/copy_from_turf() - return 0 //we're immutable. - -/datum/gas_mixture/space/parse_gas_string() - return 0 //we're immutable. - -/datum/gas_mixture/space/temperature_share(datum/gas_mixture/sharer, conduction_coefficient, sharer_temperature, sharer_heat_capacity) - . = ..() - temperature = TCMB diff --git a/tgstation.dme b/tgstation.dme index 092f36089f4..ea9822617af 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1032,8 +1032,8 @@ #include "code\modules\atmospherics\environmental\LINDA_turf_tile.dm" #include "code\modules\atmospherics\gasmixtures\gas_mixture.dm" #include "code\modules\atmospherics\gasmixtures\gas_types.dm" +#include "code\modules\atmospherics\gasmixtures\immutable_mixtures.dm" #include "code\modules\atmospherics\gasmixtures\reactions.dm" -#include "code\modules\atmospherics\gasmixtures\space_mixture.dm" #include "code\modules\atmospherics\machinery\airalarm.dm" #include "code\modules\atmospherics\machinery\atmosmachinery.dm" #include "code\modules\atmospherics\machinery\datum_pipeline.dm" From 3baf508097ffe4614486fa192912c2ca9dd2e836 Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Fri, 14 Apr 2017 01:33:46 -0700 Subject: [PATCH 24/28] Automatic changelog generation for PR #25924 [ci skip] --- html/changelogs/AutoChangeLog-pr-25924.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-25924.yml diff --git a/html/changelogs/AutoChangeLog-pr-25924.yml b/html/changelogs/AutoChangeLog-pr-25924.yml new file mode 100644 index 00000000000..8075d0ef268 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-25924.yml @@ -0,0 +1,4 @@ +author: "coiax" +delete-after: True +changes: + - bugfix: "Plasmamen no longer burn to death while inside a cloning pod." From 8af63d5fd2982b48ee3fa42c3cd582c2a8b56423 Mon Sep 17 00:00:00 2001 From: Iamgoofball Date: Fri, 14 Apr 2017 01:44:40 -0700 Subject: [PATCH 25/28] Tracks station renames. (#26051) * Tracks station renames. * addresses jordie's request --- code/game/objects/items/charter.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/charter.dm b/code/game/objects/items/charter.dm index e5f4ac1cb75..98e03ef18ca 100644 --- a/code/game/objects/items/charter.dm +++ b/code/game/objects/items/charter.dm @@ -86,7 +86,7 @@ name = "station charter for [station_name()]" desc = "An official document entrusting the governance of \ [station_name()] and surrounding space to Captain [uname]." - + feedback_set_details("station_renames","[station_name()]") if(!unlimited_uses) used = TRUE From bf34a33b3139793af1ba824a5d35884e2b5b0bea Mon Sep 17 00:00:00 2001 From: Robustin Date: Fri, 14 Apr 2017 07:10:20 -0400 Subject: [PATCH 26/28] Prototype Emitter: The re-opening (#26190) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🆑 Robustin add: The Prototype Emitter, will function like an ordinary emitter while also charging a secondary power supply that will allow a buckled user to manually fire the emitter. Returning to automatic fire will have the emitter continue to fire at the last target struck by manual fire. /🆑 --- code/modules/power/singularity/emitter.dm | 228 +++++++++++++++++++--- icons/obj/turrets.dmi | Bin 57287 -> 64252 bytes 2 files changed, 203 insertions(+), 25 deletions(-) diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index 4947715b318..7aa09e8edfc 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -1,5 +1,3 @@ - - /obj/machinery/power/emitter name = "Emitter" desc = "A heavy duty industrial laser.\nAlt-click to rotate it clockwise." @@ -9,6 +7,11 @@ anchored = 0 density = 1 req_access = list(GLOB.access_engine_equip) + + // The following 3 vars are mostly for the prototype + var/manual = FALSE + var/charge = 0 + var/atom/target = null use_power = 0 idle_power_usage = 10 @@ -174,9 +177,11 @@ investigate_log("lost power and turned off at [get_area(src)]","singulo") log_game("Emitter lost power in ([x],[y],[z])") return - if(!check_delay()) + if(charge <=80) + charge+=5 + if(!check_delay() || manual == TRUE) return FALSE - fire_beam() + fire_beam(target) /obj/machinery/power/emitter/proc/check_delay() if((src.last_shot + src.fire_delay) <= world.time) @@ -192,34 +197,62 @@ add_load(active_power_usage) fire_beam() -/obj/machinery/power/emitter/proc/fire_beam() - src.last_shot = world.time - if(src.shot_number < 3) - src.fire_delay = 20 - src.shot_number ++ - else - src.fire_delay = rand(minimum_fire_delay,maximum_fire_delay) - src.shot_number = 0 - var/obj/item/projectile/A = new projectile_type(src.loc) - A.setDir(src.dir) - playsound(src.loc, projectile_sound, 25, 1) +/obj/machinery/power/emitter/proc/fire_beam(atom/targeted_atom, mob/user) + var/turf/targets_from = get_turf(src) + if(targeted_atom == user|| targeted_atom == targets_from) + return + var/obj/item/projectile/P = new projectile_type(targets_from) + playsound(src.loc, projectile_sound, 50, 1) if(prob(35)) sparks.start() switch(dir) if(NORTH) - A.yo = 20 - A.xo = 0 + P.yo = 20 + P.xo = 0 + if(NORTHEAST) + P.yo = 20 + P.xo = 20 if(EAST) - A.yo = 0 - A.xo = 20 + P.yo = 0 + P.xo = 20 + if(SOUTHEAST) + P.yo = -20 + P.xo = 20 if(WEST) - A.yo = 0 - A.xo = -20 + P.yo = 0 + P.xo = -20 + if(SOUTHWEST) + P.yo = -20 + P.xo = -20 + if(NORTHWEST) + P.yo = 20 + P.xo = -20 else // Any other - A.yo = -20 - A.xo = 0 - A.starting = loc - A.fire() + P.yo = -20 + P.xo = 0 + if(target) + P.yo = targeted_atom.y - targets_from.y + P.xo = targeted_atom.x - targets_from.x + P.current = targets_from + P.starting = targets_from + P.firer = src + P.original = targeted_atom + if(!manual) + last_shot = world.time + if(shot_number < 3) + fire_delay = 20 + shot_number ++ + else + fire_delay = rand(minimum_fire_delay,maximum_fire_delay) + shot_number = 0 + if(!target) + P.setDir(src.dir) + P.starting = loc + else + if(QDELETED(target)) + target = null + P.fire() + return P /obj/machinery/power/emitter/can_be_unfasten_wrench(mob/user, silent) if(state == EM_WELDED) @@ -312,3 +345,148 @@ emagged = 1 if(user) user.visible_message("[user.name] emags the [src.name].","You short out the lock.") + + +/obj/machinery/power/emitter/prototype + name = "Prototype Emitter" + icon = 'icons/obj/turrets.dmi' + icon_state = "protoemitter" + icon_state_on = "protoemitter_+a" + can_buckle = TRUE + buckle_lying = 0 + var/view_range = 12 + var/datum/action/innate/protoemitter/firing/auto + +//BUCKLE HOOKS + +/obj/machinery/power/emitter/prototype/unbuckle_mob(mob/living/buckled_mob,force = 0) + playsound(src,'sound/mecha/mechmove01.ogg', 50, 1) + manual = FALSE + for(var/obj/item/I in buckled_mob.held_items) + if(istype(I, /obj/item/weapon/turret_control)) + qdel(I) + if(istype(buckled_mob)) + buckled_mob.pixel_x = 0 + buckled_mob.pixel_y = 0 + if(buckled_mob.client) + buckled_mob.client.change_view(world.view) + auto.Remove(buckled_mob) + . = ..() + +/obj/machinery/power/emitter/prototype/user_buckle_mob(mob/living/M, mob/living/carbon/user) + if(user.incapacitated() || !istype(user)) + return + for(var/atom/movable/A in get_turf(src)) + if(A.density && (A != src && A != M)) + return + M.forceMove(get_turf(src)) + ..() + playsound(src,'sound/mecha/mechmove01.ogg', 50, 1) + M.pixel_y = 14 + layer = 4.1 + if(M.client) + M.client.change_view(view_range) + if(!auto) + auto = new() + auto.Grant(M, src) + +/datum/action/innate/protoemitter + check_flags = AB_CHECK_RESTRAINED | AB_CHECK_STUNNED | AB_CHECK_CONSCIOUS + var/obj/machinery/power/emitter/prototype/PE + var/mob/living/carbon/U + + +/datum/action/innate/protoemitter/Grant(mob/living/carbon/L, obj/machinery/power/emitter/prototype/proto) + PE = proto + U = L + . = ..() + +/datum/action/innate/protoemitter/firing + name = "Switch to Manual Firing" + desc = "The emitter will only fire on your command and at your designated target" + button_icon_state = "mech_zoom_on" + +/datum/action/innate/protoemitter/firing/Activate() + if(PE.manual) + playsound(PE,'sound/mecha/mechmove01.ogg', 50, 1) + PE.manual = FALSE + name = "Switch to Manual Firing" + desc = "The emitter will only fire on your command and at your designated target" + button_icon_state = "mech_zoom_on" + for(var/obj/item/I in U.held_items) + if(istype(I, /obj/item/weapon/turret_control)) + qdel(I) + UpdateButtonIcon() + return + else + playsound(PE,'sound/mecha/mechmove01.ogg', 50, 1) + name = "Switch to Automatic Firing" + desc = "Emitters will switch to periodic firing at your last target" + button_icon_state = "mech_zoom_off" + PE.manual = TRUE + for(var/V in U.held_items) + var/obj/item/I = V + if(istype(I)) + if(U.dropItemToGround(I)) + var/obj/item/weapon/turret_control/TC = new /obj/item/weapon/turret_control() + U.put_in_hands(TC) + else //Entries in the list should only ever be items or null, so if it's not an item, we can assume it's an empty hand + var/obj/item/weapon/turret_control/TC = new /obj/item/weapon/turret_control() + U.put_in_hands(TC) + UpdateButtonIcon() + + +/obj/item/weapon/turret_control + name = "turret controls" + icon_state = "offhand" + w_class = WEIGHT_CLASS_HUGE + flags = ABSTRACT | NODROP + resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF | NOBLUDGEON + var/delay = 0 + +/obj/item/weapon/turret_control/afterattack(atom/targeted_atom, mob/user) + ..() + var/obj/machinery/power/emitter/E = user.buckled + E.setDir(get_dir(E,targeted_atom)) + user.setDir(E.dir) + switch(E.dir) + if(NORTH) + E.layer = 3.9 + user.pixel_x = 0 + user.pixel_y = -14 + if(NORTHEAST) + E.layer = 3.9 + user.pixel_x = -8 + user.pixel_y = -12 + if(EAST) + E.layer = 4.1 + user.pixel_x = -14 + user.pixel_y = 0 + if(SOUTHEAST) + E.layer = 3.9 + user.pixel_x = -8 + user.pixel_y = 12 + if(SOUTH) + E.layer = 4.1 + user.pixel_x = 0 + user.pixel_y = 14 + if(SOUTHWEST) + E.layer = 3.9 + user.pixel_x = 8 + user.pixel_y = 12 + if(WEST) + E.layer = 4.1 + user.pixel_x = 14 + user.pixel_y = 0 + if(NORTHWEST) + E.layer = 3.9 + user.pixel_x = 8 + user.pixel_y = -12 + + if(E.charge >= 10 && world.time > delay) + E.charge -= 10 + E.target = targeted_atom + E.fire_beam(targeted_atom, user) + delay = world.time + 10 + else if (E.charge < 10) + playsound(get_turf(user),'sound/machines/buzz-sigh.ogg', 50, 1) diff --git a/icons/obj/turrets.dmi b/icons/obj/turrets.dmi index 3244dd905e155221b0b34134d20dcf5e5afce88b..f4478fc73708c330bf06e50439e922e5c20c9009 100644 GIT binary patch delta 12915 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 A^Z)<= delta 5895 zcmX|lcRZEv|Nm_Z9h6aIWMq$wh;WdSvf>z-Z!24LjD*`(WM(AkSRt85=uk$olGVwk zBQp*e$2vLVd-wZ29-lw&`*C0Qb-l*(`FuSu(g9sx2VDj)Sj5Z-0D#t5ixdFRScY5L zAg{YWbPe))fbaDnGVq4w3bh+v7%!}S^&!|lEEA-yq% z@>Aiu2wOl%`VVZAYmGi(7uc@0ICQ3r9iBnlIy^h%e2@2M(lJnT`Nv)MJ(^Fs*sgQ5 z;c^y&SK89ut!>@&qWz6n%Z+-!d?2rap^jW=ppK_|S`a`sD7$6WNiwH2Dx|74`P?@{Kc&TvNSkSX$#USrBM!@wWWGKkNsO z$lfZV_`ZIYi4&UQFMLCUkLjzAP)Fb++*;wICo{QNg8_-w)>fb_%GwwUlucZ>MD)ye zy?wSY8AzhX*Sp(#j293+R*1(s0Lg}M$>aY0VlTcwH?1D%pwVwB;DfsOG<^lpy)u?2 zxeAM%{Ik2UjhVg_Q`;~pvXG$zRX&eZ8^ul~g^o<&(gn4W!H&jwg$_y#$e;s!2;D;g zWlHe8!IdXeI=eRNtpeJWqt4NU?(Mpuwt3H}nw+aN1`hWsmXvjX7buiM*%sS9LJ=Xj zP{VaSIwD81jxLp!#UM*;g5s?BVwD~(YZn4{s2Hvv@iHzm>yIjasy;J2J1rSO91A_K zfboz(I+*%#9((b_8xBDf3UyN{-wol1L0%%M*j(OIHCEoh<1eeIe7P}?#bS@~LX^C# zHf~<0nU0J;1Q9Mmk=ve9abhVn6bowgVRIs{ADvA1H=fuClvh-6zI@V1$TC5{Y8B^M zN9v$IPrOS^Ol0xbY!b4eo?hoGYsP(ibQUcu+FZ{j9K5C40Zy>A%nqfkMXKjX|K<2tUF5cpuOfX}tner1zgtO3 zNn^*!F*!MlxgyfV)CRfOOtDjrb-ZZV#^m0O4ezjPg2)RxU3VSZjk4LVC46hM`!9Dy zQ`h&u^Ho)!*Fb_TV~0yDyKc(gRpH+RVo{a%J*FSQ8*EkY-q8Tss1Z*7(W{k&EsbDC zfj(2WkNvw)l!0YqTQA5C^1OU7^0h5_UMm<}MMb6FPJdk6PSWU#kel08L@s3^kd|Fg zVrTWKWBjGX7td~=7xi!7`ayGebYwj?Xp~EQ_*c-~4BRgvV3DS#rtIE!Cdyjh`ZQ>^ zEuexu*B7U-K2INmn(vyRY45?>LHNa6cY6g}eE0Ttsr}#iunn&$?9Nych?IW{J+`*B z-Tp((rZMRi_n^+q%sk_z&NjL<)al6GqgZW&-~Sm-A8Q35I6oT;&!{PC|@~j75?xy}i8v;OFOePEau9 z3nMZuHS+^NP|-)BqQpHGm-T>Rue2^ZK z22*OMVdA)^K&TFSv64*VtR&x%tS3W^m#vUyA8KKcq5lfEL>LcNeJfac`>haMYee}% zsny6GiLM?FI1mxIg>z8?IW{6I_zQ2B=d7RQcK|=87bt&rAwz}5ydmLy!A9zH zL6T*|a|-y_o8e}NVqDpQ&c$X_r{8;mbIR0bc)pHs(4D@p~qCjsSjee zytd)1WX>TA7>K-PW+PQ=+s^&;dTfrjrW`0LfF20ZV`@7?^0m+m>ErRC1`R5>Y4|AD zb_`_%ROpLj_V4Hd=i4{F99Tc4pi;9V5ACU)9O0_=;<}u<{d)RC$TWEEbFifRbd5;z7&YeW z4%L3kNt(*e7>7WfsLD(WrZZ8ANi>_Y1d(>i>f=|}9LVpgx{FF^>cDDbL}*US$jF4PRI$_*&*!NIO0@{=X z2hmx-t!6a&_C=jKK$3%*p0>;CB7P}@o;C(9JXQ7N|GkS%zD^H^o;fVVt|DSs=rId! zE5AH+P0v8z=Olss07KgI+f5UM2PQFavuS9}gY3KRF(K)@oXqsGdYm+73(O?!m)qj{ z^tv(d1u+qTr;9Lp9y$+P*m;@oe%GbwVP4x1ZH%*zFs*aUF*!;<*FC=bKhX=Y0Pmzb zG{P5P{Ak%cIbnKQnoU^9oAkhFur!o0Oh&NK zzui=fyYExAo+QjtJ?zccJGYPcx3;!C0|Jn2k))#Ujg zS_GV9Bqsq+Yw?!>F{})rfw|(fYixjL_4I4}Bm-@X@X1iUS0O8CnA)1I(i#ZOZ(|rS zjhFUCCK=ilu9`3HnT@~rjrfeyc;HFj&Zl7-R}PeftT$4pW8j^TRurdij74fEil+LH z&d(HPMXvQ4ls0&1-nidxuzZUbFe_-6Ju zz09sP4*&bU77u#*``_4VWLQ=PIQf4u#C~<}mNL5+V9v#0`plZ+<&%H<3XKD-;Urf0 zy`9pu%8rhXWJjx@Zzw|F*rRm^b1uo`&+Tn^xXh)cyNTL8j79cJSsU}SI~0u8Z*3v{ z-=*RIbPupZ1ed9=45y~_#`T@D#}GL(B@j>;^Wd6m7gQjIdS?Tn!gI~qLtRYcdk!ca^PFJ? zDEpp_P--~;RtoyeS}9LNA1`DFtpB~yhy6P;(~KzZMhOln&Kr&#{d`>ad!fZV2V8q2 z({cIb&#Cm=lkNZMK2Va^&2|4+zi&I{^DwFdcdqa@`dOAQ35wH(x z8aul|Ufx4%g#RKUUKzL00MjuaG}RMY9@_Rsj0b!gygzwh%IgX zvQC%wcYxOAaqzW1h;~0WFpjS;o;#NY>c2S5Y^VAYJ3Io0B1yW zTk);02}nO-4rgou687_up3E4^RPn-OzHdWOBQJhrt$X0Pgj%*lIUH&g@d`fka_%nAk?31INfCdC~;+}i=Q!STO z>5;TcATLA%5XQ8BOguO&l%5lK<>~;_`=3_dOOj z-zD`bvVuj(+vmxR(w*>6P!p9Z<9HC_8%HOp?d{r|Gfk`z`ufq&oE4uy8M1{SP_B09 z>NhJ5*@}GfHbe_hS$4>%`!8TbOYrH-ch?}aL3x3CtFW-JvaZgQKYB+)b;37Eb}&qZ zpd$gbZ&mePKa|yC5h|Uip^~ma=$(*G$cf$*?iihJqKp;wF9CIZXtMOXF0@f zts{M-??I-YIxR^IU6_%M*!MCB%Rx|KuWTm}Leh!UlUr?$opa!t6AdsJ@$zsRendRS zf8l}`vUF*5aPx5j&sR2f_P9enf39edoFZB4(3WUj^?ISF;}Jg;-?ht*QtE)+^iTZ3 z;!Kmz@qt1~GhGJGn8W~u0Xd~RAVkgeB6zOKa<3aAnf0X2*l++!)MAty15`{1*-Nfo z{1jDimkkiU_0}Z=a&8aTd}`19P#FRMO@YmQ+GuF3_cyIs7RNn9w(flrd2Gks4}LGo|xt5zS;l?9t+_bwgu;8{!^0w^}vC)^x;4(vi{v3TT(Z0 zHx7lVi!v-o&I$R{xfw7qKm5mq#ZtJ^9_BNb|j?wYBm9T=86dxfgI3QCn5D_-DcL#tvRRDmHiuvW+U7P*YTAh+BV~W#cl? z?b|(T6P3L&Cv~<=_IKY)wac2Ctj1W#lECJSsNz!l6AR0jMnn`^YxUu{Q9UMX2q$?|7j6xNk|2|L+sb+@Q+alQv z+P<;Uo1CyDWhD(~t?sac9YyuR%}37$(rOHkWb`)kKTQ5z=g?}dLlUQAJ7@z=qHWKjods78Z&uB?Oj z^HmA3o*A7?!}^C_FB6N4FG2_#g+vlsd7b>O4a+DDT?dp+gQEOT*v$Ta{UX+Gy05bf zf)YEBPYrne+rU#KZQw)p<;B%Fj?{L-Jd+`=w5WGmxePqo-!H1DV1n*7@Λ!}Fe zAb)--$%w>zNvL$`_!MNYEv>ET41=rDvXF%9WtBbC@}FLY^g};O3?iL=^f!(5{~7U^ zgn_=ds=aSi%SDC4UU`EZwo#LBm1S8|#*-{R$@J##gMRn<05`WUR+BDQr#E`H-u`&+ zu9Sa=RW=EK=Ee0Yy-aCU{bG*Bn|5~miAhPBcWQB9ej-|<%`R#ebpZKtbH?mDmo95- zr$Hv!YE;*vbZBVkTw!5CiKM!HUUY389-7-2Wr%yje6n|Lj7?552_s}nC5>*ZTC;s5 zi{CP0jZH3b{+|!cuWA+G=cjY_`^N=}&sFKl*sdeS-&cSAc=h$yIbx{x$v`eh%rAB& zvh{C}tQ5Xy?#o@GD<0+r?B#g}C6Nw&zwMQ3?w~wSy^Q@)i!tIdG}e4qb?<#dBN>5k4=Np##Kuv2 z@gDd8on~Qx56}{19|S}nG_gQ2IiJ^1?t`LE#b}flzyXoi=`XRMg z!E@*OZJD%3r%%JGH%*nQk;3Fx-W@q4XlgyYDwI(8dAbyFfwg1)w3V-$uL;)=v>Z63QILB$pn)4FlYVnTCA$R|JaBF$Z8ziW-V6Q+UtR3$xU|1;UWP?U$ zMS=?aR15|?oEJ2>Hu-xKxuEI9VtB3RxASFCv9 zDPt^K%WP^-kHPG7%)I~LHqU2*B+AWZ9d0{4-FQEc{P&Lm9YSqU89CE2$`F4MZ}ySloXaWOR5eB1kA z)B?T@{4|Ln1JOBUy From 58b3f78cf9a77d90e0fecbd9874b8176b2c80e89 Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Fri, 14 Apr 2017 04:10:22 -0700 Subject: [PATCH 27/28] Automatic changelog generation for PR #26190 [ci skip] --- html/changelogs/AutoChangeLog-pr-26190.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-26190.yml diff --git a/html/changelogs/AutoChangeLog-pr-26190.yml b/html/changelogs/AutoChangeLog-pr-26190.yml new file mode 100644 index 00000000000..b2de3597430 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-26190.yml @@ -0,0 +1,4 @@ +author: "Robustin" +delete-after: True +changes: + - rscadd: "The Prototype Emitter, will function like an ordinary emitter while also charging a secondary power supply that will allow a buckled user to manually fire the emitter. Returning to automatic fire will have the emitter continue to fire at the last target struck by manual fire." From b076895ebb86b1a93afabb138909b36ff95892d6 Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Fri, 14 Apr 2017 04:23:00 -0700 Subject: [PATCH 28/28] Automatic changelog generation for PR #26122 [ci skip] --- html/changelogs/AutoChangeLog-pr-26122.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-26122.yml diff --git a/html/changelogs/AutoChangeLog-pr-26122.yml b/html/changelogs/AutoChangeLog-pr-26122.yml new file mode 100644 index 00000000000..9851dcce417 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-26122.yml @@ -0,0 +1,4 @@ +author: "Davidj361" +delete-after: True +changes: + - bugfix: "Monkeys won't pickup items or rob you while they are in your stomach, neither walk out of your stomach."