diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 1b1a8f07c8..859af746b4 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. diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm index f219cfcc99..a6c92c7610 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 b3facda8d2..2c90bf7f22 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/_maps/shuttles/emergency_pubby.dmm b/_maps/shuttles/emergency_pubby.dmm index d73b5563b3..ced48fe48b 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 diff --git a/code/__DATASTRUCTURES/globals.dm b/code/__DATASTRUCTURES/globals.dm index f9b5281212..bcc860245f 100644 --- a/code/__DATASTRUCTURES/globals.dm +++ b/code/__DATASTRUCTURES/globals.dm @@ -16,6 +16,7 @@ #define GLOBAL_PROTECT(X) #endif +#define GLOBAL_REAL_VAR(X) var/global/##X #define GLOBAL_REAL(X, Typepath) var/global##Typepath/##X #define GLOBAL_RAW(X) /datum/controller/global_vars/var/global##X diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 28e4a262fd..5b0bdbc11e 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -37,6 +37,9 @@ #define BODYPART_ORGANIC 1 #define BODYPART_ROBOTIC 2 +#define DEFAULT_BODYPART_ICON_ORGANIC 'icons/mob/human_parts_greyscale.dmi' +#define DEFAULT_BODYPART_ICON_ROBOTIC 'icons/mob/augments.dmi' + #define MONKEY_BODYPART "monkey" #define ALIEN_BODYPART "alien" #define LARVA_BODYPART "larva" diff --git a/code/__DEFINES/sound.dm b/code/__DEFINES/sound.dm index 94ed5dc7b9..77c263cada 100644 --- a/code/__DEFINES/sound.dm +++ b/code/__DEFINES/sound.dm @@ -2,7 +2,10 @@ #define CHANNEL_LOBBYMUSIC 1024 #define CHANNEL_ADMIN 1023 #define CHANNEL_VOX 1022 +#define CHANNEL_JUKEBOX 1021 //THIS SHOULD ALWAYS BE THE LOWEST ONE! //KEEP IT UPDATED -#define CHANNEL_HIGHEST_AVAILABLE 1021 + +#define CHANNEL_HIGHEST_AVAILABLE 1020 + 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/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index 853ff4fb6a..f78c40fbe1 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -19,7 +19,7 @@ return copytext(sqltext, 2, lentext(sqltext));//Quote() adds quotes around input, we already do that /proc/format_table_name(table as text) - return GLOB.sqlfdbktableprefix + table + return global.sqlfdbktableprefix + table /* * Text sanitization diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index e1c34dc0c9..73b4c33620 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1279,6 +1279,9 @@ proc/pick_closest_path(value, list/matches = get_fancy_list_of_atom_types()) #define QDEL_IN(item, time) addtimer(CALLBACK(GLOBAL_PROC, .proc/qdel, item), time, TIMER_STOPPABLE) #define QDEL_NULL(item) qdel(item); item = null +#define QDEL_LIST(L) if(L) { for(var/I in L) qdel(I); L.Cut(); } +#define QDEL_LIST_ASSOC(L) if(L) { for(var/I in L) { qdel(L[I]); qdel(I); } L.Cut(); } +#define QDEL_LIST_ASSOC_VAL(L) if(L) { for(var/I in L) qel(L[I]); L.Cut(); } /proc/random_nukecode() var/val = rand(0, 99999) diff --git a/code/_globalvars/configuration.dm b/code/_globalvars/configuration.dm index e8833f77aa..23bfdd3987 100644 --- a/code/_globalvars/configuration.dm +++ b/code/_globalvars/configuration.dm @@ -23,20 +23,6 @@ GLOBAL_VAR_INIT(tinted_weldhelh, TRUE) GLOBAL_VAR_INIT(Debug, FALSE) // global debug switch GLOBAL_VAR_INIT(Debug2, FALSE) -//Server API key -GLOBAL_VAR_INIT(comms_key, "default_pwd") -GLOBAL_PROTECT(comms_key) -GLOBAL_VAR_INIT(comms_allowed, FALSE) //By default, the server does not allow messages to be sent to it, unless the key is strong enough (this is to prevent misconfigured servers from becoming vulnerable) -GLOBAL_PROTECT(comms_allowed) - -GLOBAL_VAR(medal_hub) -GLOBAL_PROTECT(medal_hub) -GLOBAL_VAR_INIT(medal_pass, " ") -GLOBAL_PROTECT(medal_pass) -GLOBAL_VAR_INIT(medals_enabled, TRUE) //will be auto set to false if the game fails contacting the medal hub to prevent unneeded calls. -GLOBAL_PROTECT(medals_enabled) - - //This was a define, but I changed it to a variable so it can be changed in-game.(kept the all-caps definition because... code...) -Errorage GLOBAL_VAR_INIT(MAX_EX_DEVESTATION_RANGE, 3) GLOBAL_VAR_INIT(MAX_EX_HEAVY_RANGE, 7) diff --git a/code/_globalvars/database.dm b/code/_globalvars/database.dm deleted file mode 100644 index 8ba72517ce..0000000000 --- a/code/_globalvars/database.dm +++ /dev/null @@ -1,19 +0,0 @@ - // MySQL configuration - -GLOBAL_VAR_INIT(sqladdress, "localhost") -GLOBAL_PROTECT(sqladdress) -GLOBAL_VAR_INIT(sqlport, "3306") -GLOBAL_PROTECT(sqlport) -GLOBAL_VAR_INIT(sqlfdbkdb, "test") -GLOBAL_PROTECT(sqlfdbkdb) -GLOBAL_VAR_INIT(sqlfdbklogin, "root") -GLOBAL_PROTECT(sqlfdbklogin) -GLOBAL_VAR_INIT(sqlfdbkpass, "") -GLOBAL_PROTECT(sqlfdbkpass) -GLOBAL_VAR_INIT(sqlfdbktableprefix, "erro_") //backwords compatibility with downstream server hosts -GLOBAL_PROTECT(sqlfdbktableprefix) - -//Database connections -//A connection is established on world creation. Ideally, the connection dies when the server restarts (After feedback logging.). -GLOBAL_DATUM_INIT(dbcon, /DBConnection, new) //Feedback database (New database) -GLOBAL_PROTECT(dbcon) diff --git a/code/_globalvars/misc.dm b/code/_globalvars/misc.dm index ea89f3e4e7..a7763236e6 100644 --- a/code/_globalvars/misc.dm +++ b/code/_globalvars/misc.dm @@ -6,4 +6,16 @@ GLOBAL_VAR_INIT(timezoneOffset, 0) // The difference betwen midnight (of the hos // However it'd be ok to use for accessing attack logs and such too, which are even laggier. GLOBAL_VAR_INIT(fileaccess_timer, 0) -GLOBAL_VAR_INIT(TAB, "    ") \ No newline at end of file +GLOBAL_VAR_INIT(TAB, "    ") + +GLOBAL_DATUM(data_core, /datum/datacore) + +GLOBAL_VAR_INIT(CELLRATE, 0.002) // multiplier for watts per tick <> cell storage (eg: .002 means if there is a load of 1000 watts, 20 units will be taken from a cell per second) +GLOBAL_VAR_INIT(CHARGELEVEL, 0.001) // Cap for how fast cells charge, as a percentage-per-tick (.001 means cellcharge is capped to 1% per second) + +GLOBAL_LIST_EMPTY(powernets) + +//Database connections +//A connection is established on world creation. Ideally, the connection dies when the server restarts (After feedback logging.). +GLOBAL_DATUM_INIT(dbcon, /DBConnection, new) //Feedback database (New database) +GLOBAL_PROTECT(dbcon) \ No newline at end of file diff --git a/code/_globalvars/sensitive.dm b/code/_globalvars/sensitive.dm new file mode 100644 index 0000000000..786287f96f --- /dev/null +++ b/code/_globalvars/sensitive.dm @@ -0,0 +1,16 @@ +//Server API key +GLOBAL_REAL_VAR(comms_key) = "default_pwd" +GLOBAL_REAL_VAR(comms_allowed) = FALSE //By default, the server does not allow messages to be sent to it, unless the key is strong enough (this is to prevent misconfigured servers from becoming vulnerable) + +GLOBAL_REAL_VAR(medal_hub) +GLOBAL_REAL_VAR(medal_pass) = " " +GLOBAL_REAL_VAR(medals_enabled) = TRUE //will be auto set to false if the game fails contacting the medal hub to prevent unneeded calls. + +// MySQL configuration + +GLOBAL_REAL_VAR(sqladdress) = "localhost" +GLOBAL_REAL_VAR(sqlport) = "3306" +GLOBAL_REAL_VAR(sqlfdbkdb) = "test" +GLOBAL_REAL_VAR(sqlfdbklogin) = "root" +GLOBAL_REAL_VAR(sqlfdbkpass) = "" +GLOBAL_REAL_VAR(sqlfdbktableprefix) = "erro_" \ No newline at end of file diff --git a/code/_globalvars/station.dm b/code/_globalvars/station.dm deleted file mode 100644 index 7af03b7ce3..0000000000 --- a/code/_globalvars/station.dm +++ /dev/null @@ -1,6 +0,0 @@ -GLOBAL_DATUM(data_core, /datum/datacore) - -GLOBAL_VAR_INIT(CELLRATE, 0.002) // multiplier for watts per tick <> cell storage (eg: .002 means if there is a load of 1000 watts, 20 units will be taken from a cell per second) -GLOBAL_VAR_INIT(CHARGELEVEL, 0.001) // Cap for how fast cells charge, as a percentage-per-tick (.001 means cellcharge is capped to 1% per second) - -GLOBAL_LIST_EMPTY(powernets) \ No newline at end of file diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm index 578e6cd378..c52b3441db 100644 --- a/code/_onclick/cyborg.dm +++ b/code/_onclick/cyborg.dm @@ -22,6 +22,9 @@ if(modifiers["shift"] && modifiers["ctrl"]) CtrlShiftClickOn(A) return + if(modifiers["shift"] && modifiers["middle"]) + ShiftMiddleClickOn(A) + return if(modifiers["middle"]) MiddleClickOn(A) return diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index e83cfadedf..9c8fe9750a 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -266,8 +266,8 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." icon_state = "no-servants-caches" var/static/list/scripture_states = list(SCRIPTURE_DRIVER = TRUE, SCRIPTURE_SCRIPT = FALSE, SCRIPTURE_APPLICATION = FALSE, SCRIPTURE_REVENANT = FALSE, SCRIPTURE_JUDGEMENT = FALSE) -/obj/screen/alert/clockwork/scripture_reqs/New() - ..() +/obj/screen/alert/clockwork/scripture_reqs/Initialize() + . = ..() START_PROCESSING(SSprocessing, src) process() diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 95fc6aa622..1aa1f3d4fa 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -276,6 +276,18 @@ qdel(M) votable_modes += "secret" + Reload() + +/datum/configuration/proc/Reload() + load("config/config.txt") + load("config/game_options.txt","game_options") + loadsql("config/dbconfig.txt") + if (maprotation) + loadmaplist("config/maps.txt") + + // apply some settings from config.. + GLOB.abandon_allowed = respawn + /datum/configuration/proc/load(filename, type = "config") //the type can also be game_options, in which case it uses a different switch. not making it separate to not copypaste code - Urist var/list/Lines = file2list(filename) @@ -305,109 +317,109 @@ if(type == "config") switch(name) if("hub") - config.hub = 1 + hub = 1 if("admin_legacy_system") - config.admin_legacy_system = 1 + admin_legacy_system = 1 if("ban_legacy_system") - config.ban_legacy_system = 1 + ban_legacy_system = 1 if("use_age_restriction_for_jobs") - config.use_age_restriction_for_jobs = 1 + use_age_restriction_for_jobs = 1 if("use_account_age_for_jobs") - config.use_account_age_for_jobs = 1 + use_account_age_for_jobs = 1 if("lobby_countdown") - config.lobby_countdown = text2num(value) + lobby_countdown = text2num(value) if("round_end_countdown") - config.round_end_countdown = text2num(value) + round_end_countdown = text2num(value) if("log_ooc") - config.log_ooc = 1 + log_ooc = 1 if("log_access") - config.log_access = 1 + log_access = 1 if("log_say") - config.log_say = 1 + log_say = 1 if("log_admin") - config.log_admin = 1 + log_admin = 1 if("log_prayer") - config.log_prayer = 1 + log_prayer = 1 if("log_law") - config.log_law = 1 + log_law = 1 if("log_game") - config.log_game = 1 + log_game = 1 if("log_vote") - config.log_vote = 1 + log_vote = 1 if("log_whisper") - config.log_whisper = 1 + log_whisper = 1 if("log_attack") - config.log_attack = 1 + log_attack = 1 if("log_emote") - config.log_emote = 1 + log_emote = 1 if("log_adminchat") - config.log_adminchat = 1 + log_adminchat = 1 if("log_pda") - config.log_pda = 1 + log_pda = 1 if("log_hrefs") - config.log_hrefs = 1 + log_hrefs = 1 if("log_twitter") - config.log_twitter = 1 + log_twitter = 1 if("log_world_topic") - config.log_world_topic = 1 + log_world_topic = 1 if("allow_admin_ooccolor") - config.allow_admin_ooccolor = 1 + allow_admin_ooccolor = 1 if("allow_vote_restart") - config.allow_vote_restart = 1 + allow_vote_restart = 1 if("allow_vote_mode") - config.allow_vote_mode = 1 + allow_vote_mode = 1 if("no_dead_vote") - config.vote_no_dead = 1 + vote_no_dead = 1 if("default_no_vote") - config.vote_no_default = 1 + vote_no_default = 1 if("vote_delay") - config.vote_delay = text2num(value) + vote_delay = text2num(value) if("vote_period") - config.vote_period = text2num(value) + vote_period = text2num(value) if("norespawn") - config.respawn = 0 + respawn = 0 if("servername") - config.server_name = value + server_name = value if("serversqlname") - config.server_sql_name = value + server_sql_name = value if("stationname") - config.station_name = value + station_name = value if("hostedby") - config.hostedby = value + hostedby = value if("server") - config.server = value + server = value if("banappeals") - config.banappeals = value + banappeals = value if("wikiurl") - config.wikiurl = value + wikiurl = value if("forumurl") - config.forumurl = value + forumurl = value if("rulesurl") - config.rulesurl = value + rulesurl = value if("githuburl") - config.githuburl = value + githuburl = value if("githubrepoid") - config.githubrepoid = value + githubrepoid = value if("guest_jobban") - config.guest_jobban = 1 + guest_jobban = 1 if("guest_ban") GLOB.guests_allowed = 0 if("usewhitelist") - config.usewhitelist = TRUE + usewhitelist = TRUE if("allow_metadata") - config.allow_Metadata = 1 + allow_Metadata = 1 if("kick_inactive") if(value < 1) value = INACTIVITY_KICK - config.kick_inactive = value + kick_inactive = value if("load_jobs_from_txt") load_jobs_from_txt = 1 if("forbid_singulo_possession") forbid_singulo_possession = 1 if("popup_admin_pm") - config.popup_admin_pm = 1 + popup_admin_pm = 1 if("allow_holidays") - config.allow_holidays = 1 + allow_holidays = 1 if("useircbot") useircbot = 1 if("ticklag") @@ -421,9 +433,9 @@ if("automute_on") automute_on = 1 if("comms_key") - GLOB.comms_key = value + global.comms_key = value if(value != "default_pwd" && length(value) > 6) //It's the default value or less than 6 characters long, warn badmins - GLOB.comms_allowed = 1 + global.comms_allowed = 1 if("cross_server_address") cross_address = value if(value != "byond:\\address:port") @@ -437,46 +449,46 @@ if(value != "byond:\\address:port") allow_panic_bunker_bounce = 1 if("medal_hub_address") - GLOB.medal_hub = value + global.medal_hub = value if("medal_hub_password") - GLOB.medal_pass = value + global.medal_pass = value if("show_irc_name") - config.showircname = 1 + showircname = 1 if("see_own_notes") - config.see_own_notes = 1 + see_own_notes = 1 if("soft_popcap") - config.soft_popcap = text2num(value) + soft_popcap = text2num(value) if("hard_popcap") - config.hard_popcap = text2num(value) + hard_popcap = text2num(value) if("extreme_popcap") - config.extreme_popcap = text2num(value) + extreme_popcap = text2num(value) if("soft_popcap_message") - config.soft_popcap_message = value + soft_popcap_message = value if("hard_popcap_message") - config.hard_popcap_message = value + hard_popcap_message = value if("extreme_popcap_message") - config.extreme_popcap_message = value + extreme_popcap_message = value if("panic_bunker") - config.panic_bunker = 1 + panic_bunker = 1 if("notify_new_player_age") - config.notify_new_player_age = text2num(value) + notify_new_player_age = text2num(value) if("irc_first_connection_alert") - config.irc_first_connection_alert = 1 + irc_first_connection_alert = 1 if("check_randomizer") - config.check_randomizer = 1 + check_randomizer = 1 if("ipintel_email") if (value != "ch@nge.me") - config.ipintel_email = value + ipintel_email = value if("ipintel_rating_bad") - config.ipintel_rating_bad = text2num(value) + ipintel_rating_bad = text2num(value) if("ipintel_domain") - config.ipintel_domain = value + ipintel_domain = value if("ipintel_save_good") - config.ipintel_save_good = text2num(value) + ipintel_save_good = text2num(value) if("ipintel_save_bad") - config.ipintel_save_bad = text2num(value) + ipintel_save_bad = text2num(value) if("aggressive_changelog") - config.aggressive_changelog = 1 + aggressive_changelog = 1 if("log_runtimes") log_runtimes = TRUE var/newlog = file("data/logs/runtimes/runtime-[time2text(world.realtime, "YYYY-MM-DD")].log") @@ -484,39 +496,39 @@ world.log << "Now logging runtimes to data/logs/runtimes/runtime-[time2text(world.realtime, "YYYY-MM-DD")].log" GLOB.runtime_diary = newlog if("autoconvert_notes") - config.autoconvert_notes = 1 + autoconvert_notes = 1 if("allow_webclient") - config.allowwebclient = 1 + allowwebclient = 1 if("webclient_only_byond_members") - config.webclientmembersonly = 1 + webclientmembersonly = 1 if("announce_admin_logout") - config.announce_admin_logout = 1 + announce_admin_logout = 1 if("announce_admin_login") - config.announce_admin_login = 1 + announce_admin_login = 1 if("maprotation") - config.maprotation = 1 + maprotation = 1 if("allow_map_voting") - config.allow_map_voting = text2num(value) + allow_map_voting = text2num(value) if("maprotationchancedelta") - config.maprotatechancedelta = text2num(value) + maprotatechancedelta = text2num(value) if("autoadmin") - config.autoadmin = 1 + autoadmin = 1 if(value) - config.autoadmin_rank = ckeyEx(value) + autoadmin_rank = ckeyEx(value) if("generate_minimaps") - config.generate_minimaps = 1 + generate_minimaps = 1 if("client_warn_version") - config.client_warn_version = text2num(value) + client_warn_version = text2num(value) if("client_warn_message") - config.client_warn_message = value + client_warn_message = value if("client_error_version") - config.client_error_version = text2num(value) + client_error_version = text2num(value) if("client_error_message") - config.client_error_message = value + client_error_message = value if("minute_topic_limit") - config.minutetopiclimit = text2num(value) + minutetopiclimit = text2num(value) if("second_topic_limit") - config.secondtopiclimit = text2num(value) + secondtopiclimit = text2num(value) if("error_cooldown") error_cooldown = text2num(value) if("error_limit") @@ -531,75 +543,75 @@ else if(type == "game_options") switch(name) if("damage_multiplier") - config.damage_multiplier = text2num(value) + damage_multiplier = text2num(value) if("revival_pod_plants") - config.revival_pod_plants = text2num(value) + revival_pod_plants = text2num(value) if("revival_cloning") - config.revival_cloning = text2num(value) + revival_cloning = text2num(value) if("revival_brain_life") - config.revival_brain_life = text2num(value) + revival_brain_life = text2num(value) if("rename_cyborg") - config.rename_cyborg = 1 + rename_cyborg = 1 if("ooc_during_round") - config.ooc_during_round = 1 + ooc_during_round = 1 if("emojis") - config.emojis = 1 + emojis = 1 if("run_delay") - config.run_speed = text2num(value) + run_speed = text2num(value) if("walk_delay") - config.walk_speed = text2num(value) + walk_speed = text2num(value) if("human_delay") - config.human_delay = text2num(value) + human_delay = text2num(value) if("robot_delay") - config.robot_delay = text2num(value) + robot_delay = text2num(value) if("monkey_delay") - config.monkey_delay = text2num(value) + monkey_delay = text2num(value) if("alien_delay") - config.alien_delay = text2num(value) + alien_delay = text2num(value) if("slime_delay") - config.slime_delay = text2num(value) + slime_delay = text2num(value) if("animal_delay") - config.animal_delay = text2num(value) + animal_delay = text2num(value) if("alert_red_upto") - config.alert_desc_red_upto = value + alert_desc_red_upto = value if("alert_red_downto") - config.alert_desc_red_downto = value + alert_desc_red_downto = value if("alert_blue_downto") - config.alert_desc_blue_downto = value + alert_desc_blue_downto = value if("alert_blue_upto") - config.alert_desc_blue_upto = value + alert_desc_blue_upto = value if("alert_green") - config.alert_desc_green = value + alert_desc_green = value if("alert_delta") - config.alert_desc_delta = value + alert_desc_delta = value if("no_intercept_report") - config.intercept = 0 + intercept = 0 if("assistants_have_maint_access") - config.jobs_have_maint_access |= ASSISTANTS_HAVE_MAINT_ACCESS + jobs_have_maint_access |= ASSISTANTS_HAVE_MAINT_ACCESS if("security_has_maint_access") - config.jobs_have_maint_access |= SECURITY_HAS_MAINT_ACCESS + jobs_have_maint_access |= SECURITY_HAS_MAINT_ACCESS if("everyone_has_maint_access") - config.jobs_have_maint_access |= EVERYONE_HAS_MAINT_ACCESS + jobs_have_maint_access |= EVERYONE_HAS_MAINT_ACCESS if("sec_start_brig") - config.sec_start_brig = 1 + sec_start_brig = 1 if("gateway_delay") - config.gateway_delay = text2num(value) + gateway_delay = text2num(value) if("continuous") var/mode_name = lowertext(value) - if(mode_name in config.modes) - config.continuous[mode_name] = 1 + if(mode_name in modes) + continuous[mode_name] = 1 else GLOB.diary << "Unknown continuous configuration definition: [mode_name]." if("midround_antag") var/mode_name = lowertext(value) - if(mode_name in config.modes) - config.midround_antag[mode_name] = 1 + if(mode_name in modes) + midround_antag[mode_name] = 1 else GLOB.diary << "Unknown midround antagonist configuration definition: [mode_name]." if("midround_antag_time_check") - config.midround_antag_time_check = text2num(value) + midround_antag_time_check = text2num(value) if("midround_antag_life_check") - config.midround_antag_life_check = text2num(value) + midround_antag_life_check = text2num(value) if("min_pop") var/pop_pos = findtext(value, " ") var/mode_name = null @@ -608,8 +620,8 @@ if(pop_pos) mode_name = lowertext(copytext(value, 1, pop_pos)) mode_value = copytext(value, pop_pos + 1) - if(mode_name in config.modes) - config.min_pop[mode_name] = text2num(mode_value) + if(mode_name in modes) + min_pop[mode_name] = text2num(mode_value) else GLOB.diary << "Unknown minimum population configuration definition: [mode_name]." else @@ -622,28 +634,28 @@ if(pop_pos) mode_name = lowertext(copytext(value, 1, pop_pos)) mode_value = copytext(value, pop_pos + 1) - if(mode_name in config.modes) - config.max_pop[mode_name] = text2num(mode_value) + if(mode_name in modes) + max_pop[mode_name] = text2num(mode_value) else GLOB.diary << "Unknown maximum population configuration definition: [mode_name]." else GLOB.diary << "Incorrect maximum population configuration definition: [mode_name] [mode_value]." if("shuttle_refuel_delay") - config.shuttle_refuel_delay = text2num(value) + shuttle_refuel_delay = text2num(value) if("show_game_type_odds") - config.show_game_type_odds = 1 + show_game_type_odds = 1 if("ghost_interaction") - config.ghost_interaction = 1 + ghost_interaction = 1 if("traitor_scaling_coeff") - config.traitor_scaling_coeff = text2num(value) + traitor_scaling_coeff = text2num(value) if("changeling_scaling_coeff") - config.changeling_scaling_coeff = text2num(value) + changeling_scaling_coeff = text2num(value) if("security_scaling_coeff") - config.security_scaling_coeff = text2num(value) + security_scaling_coeff = text2num(value) if("abductor_scaling_coeff") - config.abductor_scaling_coeff = text2num(value) + abductor_scaling_coeff = text2num(value) if("traitor_objectives_amount") - config.traitor_objectives_amount = text2num(value) + traitor_objectives_amount = text2num(value) if("probability") var/prob_pos = findtext(value, " ") var/prob_name = null @@ -652,51 +664,51 @@ if(prob_pos) prob_name = lowertext(copytext(value, 1, prob_pos)) prob_value = copytext(value, prob_pos + 1) - if(prob_name in config.modes) - config.probabilities[prob_name] = text2num(prob_value) + if(prob_name in modes) + probabilities[prob_name] = text2num(prob_value) else GLOB.diary << "Unknown game mode probability configuration definition: [prob_name]." else GLOB.diary << "Incorrect probability configuration definition: [prob_name] [prob_value]." if("protect_roles_from_antagonist") - config.protect_roles_from_antagonist = 1 + protect_roles_from_antagonist = 1 if("protect_assistant_from_antagonist") - config.protect_assistant_from_antagonist = 1 + protect_assistant_from_antagonist = 1 if("enforce_human_authority") - config.enforce_human_authority = 1 + enforce_human_authority = 1 if("allow_latejoin_antagonists") - config.allow_latejoin_antagonists = 1 + allow_latejoin_antagonists = 1 if("allow_random_events") - config.allow_random_events = 1 + allow_random_events = 1 if("events_min_time_mul") - config.events_min_time_mul = text2num(value) + events_min_time_mul = text2num(value) if("events_min_players_mul") - config.events_min_players_mul = text2num(value) + events_min_players_mul = text2num(value) if("minimal_access_threshold") - config.minimal_access_threshold = text2num(value) + minimal_access_threshold = text2num(value) if("jobs_have_minimal_access") - config.jobs_have_minimal_access = 1 + jobs_have_minimal_access = 1 if("humans_need_surnames") humans_need_surnames = 1 if("force_random_names") - config.force_random_names = 1 + force_random_names = 1 if("allow_ai") - config.allow_ai = 1 + allow_ai = 1 if("disable_secborg") - config.forbid_secborg = 1 + forbid_secborg = 1 if("disable_peaceborg") - config.forbid_peaceborg = 1 + forbid_peaceborg = 1 if("silent_ai") - config.silent_ai = 1 + silent_ai = 1 if("silent_borg") - config.silent_borg = 1 + silent_borg = 1 if("sandbox_autoclose") - config.sandbox_autoclose = 1 + sandbox_autoclose = 1 if("default_laws") - config.default_laws = text2num(value) + default_laws = text2num(value) if("random_laws") var/law_id = lowertext(value) lawids += law_id @@ -711,9 +723,9 @@ law_weights[lawid] = weight if("silicon_max_law_amount") - config.silicon_max_law_amount = text2num(value) + silicon_max_law_amount = text2num(value) if("join_with_mutant_race") - config.mutant_races = 1 + mutant_races = 1 if("roundstart_races") var/race_id = lowertext(value) for(var/species_id in GLOB.species_list) @@ -721,25 +733,25 @@ roundstart_races += GLOB.species_list[species_id] GLOB.roundstart_species[species_id] = GLOB.species_list[species_id] if("join_with_mutant_humans") - config.mutant_humans = 1 + mutant_humans = 1 if("assistant_cap") - config.assistant_cap = text2num(value) + assistant_cap = text2num(value) if("starlight") - config.starlight = 1 + starlight = 1 if("grey_assistants") - config.grey_assistants = 1 + grey_assistants = 1 if("lavaland_budget") - config.lavaland_budget = text2num(value) + lavaland_budget = text2num(value) if("space_budget") - config.space_budget = text2num(value) + space_budget = text2num(value) if("no_summon_guns") - config.no_summon_guns = 1 + no_summon_guns = 1 if("no_summon_magic") - config.no_summon_magic = 1 + no_summon_magic = 1 if("no_summon_events") - config.no_summon_events = 1 + no_summon_events = 1 if("reactionary_explosions") - config.reactionary_explosions = 1 + reactionary_explosions = 1 if("bombcap") var/BombCap = text2num(value) if (!BombCap) @@ -753,13 +765,13 @@ GLOB.MAX_EX_FLASH_RANGE = BombCap GLOB.MAX_EX_FLAME_RANGE = BombCap if("arrivals_shuttle_dock_window") - config.arrivals_shuttle_dock_window = max(PARALLAX_LOOP_TIME, text2num(value)) + arrivals_shuttle_dock_window = max(PARALLAX_LOOP_TIME, text2num(value)) if("arrivals_shuttle_require_safe_latejoin") - config.arrivals_shuttle_require_safe_latejoin = text2num(value) + arrivals_shuttle_require_safe_latejoin = text2num(value) if ("mentor_mobname_only") - config.mentors_mobname_only = 1 + mentors_mobname_only = 1 if ("mentor_legacy_system") - config.mentor_legacy_system = 1 + mentor_legacy_system = 1 else GLOB.diary << "Unknown setting in configuration: '[name]'" @@ -810,9 +822,9 @@ if ("weight","voteweight") currentmap.voteweight = text2num(data) if ("default","defaultmap") - config.defaultmap = currentmap + defaultmap = currentmap if ("endmap") - config.maplist[currentmap.map_name] = currentmap + maplist[currentmap.map_name] = currentmap currentmap = null else GLOB.diary << "Unknown command in map vote config: '[command]'" @@ -845,19 +857,19 @@ switch(name) if("sql_enabled") - config.sql_enabled = 1 + sql_enabled = 1 if("address") - GLOB.sqladdress = value + global.sqladdress = value if("port") - GLOB.sqlport = value + global.sqlport = value if("feedback_database") - GLOB.sqlfdbkdb = value + global.sqlfdbkdb = value if("feedback_login") - GLOB.sqlfdbklogin = value + global.sqlfdbklogin = value if("feedback_password") - GLOB.sqlfdbkpass = value + global.sqlfdbkpass = value if("feedback_tableprefix") - GLOB.sqlfdbktableprefix = value + global.sqlfdbktableprefix = value else GLOB.diary << "Unknown setting in configuration: '[name]'" @@ -915,4 +927,4 @@ if(!statclick) statclick = new/obj/effect/statclick/debug(null, "Edit", src) - stat("[name]:", statclick) \ No newline at end of file + stat("[name]:", statclick) diff --git a/code/controllers/master.dm b/code/controllers/master.dm index 259524bb0c..b4c5bc7d6d 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) @@ -65,7 +69,7 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING) else init_subtypes(/datum/controller/subsystem, subsystems) Master = src - + if(!GLOB) new /datum/controller/global_vars diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm index 1fff5c6430..f0bfb6a76a 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/datums/action.dm b/code/datums/action.dm index 03b293b13d..63de6b19e3 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/datums/datumvars.dm b/code/datums/datumvars.dm index 81079c5621..c40f39eb19 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -340,7 +340,7 @@ target="_parent._top" onmouseclick="this.focus()" style="background-color:#ffffff"> - + [dropdownoptions_html.Join()] @@ -1084,7 +1084,7 @@ if("augment") if(ishuman(C)) if(BP) - BP.change_bodypart_status(BODYPART_ROBOTIC, 1) + BP.change_bodypart_status(BODYPART_ROBOTIC, TRUE, TRUE) else to_chat(usr, "[C] doesn't have such bodypart.") else diff --git a/code/datums/dna.dm b/code/datums/dna.dm index ecc3e121f0..5150938258 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -247,13 +247,10 @@ dna.struc_enzymes = se domutcheck() - give_genitals(1) - if(mrace || newfeatures || ui) update_body() update_hair() update_body_parts() - update_genitals() update_mutations_overlay() diff --git a/code/datums/martial/krav_maga.dm b/code/datums/martial/krav_maga.dm index 1a193db87b..5bc9b0588b 100644 --- a/code/datums/martial/krav_maga.dm +++ b/code/datums/martial/krav_maga.dm @@ -12,9 +12,13 @@ if(owner.incapacitated()) to_chat(owner, "You can't use Krav Maga while you're incapacitated.") return - owner.visible_message("[owner] assumes the Neck Chop stance!", "Your next attack will be a Neck Chop.") var/mob/living/carbon/human/H = owner - H.martial_art.streak = "neck_chop" + if (H.martial_art.streak == "neck_chop") + owner.visible_message("[owner] assumes a neutral stance.", "Your next attack is cleared.") + H.martial_art.streak = "" + else + owner.visible_message("[owner] assumes the Neck Chop stance!", "Your next attack will be a Neck Chop.") + H.martial_art.streak = "neck_chop" /datum/action/leg_sweep name = "Leg Sweep - Trips the victim, knocking them down for a brief moment." @@ -24,9 +28,13 @@ if(owner.incapacitated()) to_chat(owner, "You can't use Krav Maga while you're incapacitated.") return - owner.visible_message("[owner] assumes the Leg Sweep stance!", "Your next attack will be a Leg Sweep.") var/mob/living/carbon/human/H = owner - H.martial_art.streak = "leg_sweep" + if (H.martial_art.streak == "leg_sweep") + owner.visible_message("[owner] assumes a neutral stance.", "Your next attack is cleared.") + H.martial_art.streak = "" + else + owner.visible_message("[owner] assumes the Leg Sweep stance!", "Your next attack will be a Leg Sweep.") + H.martial_art.streak = "leg_sweep" /datum/action/lung_punch//referred to internally as 'quick choke' name = "Lung Punch - Delivers a strong punch just above the victim's abdomen, constraining the lungs. The victim will be unable to breathe for a short time." @@ -36,9 +44,13 @@ if(owner.incapacitated()) to_chat(owner, "You can't use Krav Maga while you're incapacitated.") return - owner.visible_message("[owner] assumes the Lung Punch stance!", "Your next attack will be a Lung Punch.") var/mob/living/carbon/human/H = owner - H.martial_art.streak = "quick_choke"//internal name for lung punch + if (H.martial_art.streak == "quick_choke") + owner.visible_message("[owner] assumes a neutral stance.", "Your next attack is cleared.") + H.martial_art.streak = "" + else + owner.visible_message("[owner] assumes the Lung Punch stance!", "Your next attack will be a Lung Punch.") + H.martial_art.streak = "quick_choke"//internal name for lung punch /datum/martial_art/krav_maga/teach(var/mob/living/carbon/human/H,var/make_temporary=0) ..() diff --git a/code/datums/riding.dm b/code/datums/riding.dm index aa16730703..c069e0cdeb 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/game/area/Space_Station_13_areas.dm b/code/game/area/Space_Station_13_areas.dm index ee369d73f7..426ab3220d 100644 --- a/code/game/area/Space_Station_13_areas.dm +++ b/code/game/area/Space_Station_13_areas.dm @@ -80,8 +80,8 @@ NOTE: there are two lists of areas in the end of this file: centcom and station name = "Asteroid - Artifact" icon_state = "cave" -/area/asteroid/artifactroom/New() - ..() +/area/asteroid/artifactroom/Initialize() + . = ..() set_dynamic_lighting() /area/planet/clown diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 4395e5155a..f346da191a 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -25,7 +25,7 @@ var/lightswitch = 1 var/requires_power = 1 - var/always_unpowered = 0 // This gets overriden to 1 for space in area/New(). + var/always_unpowered = 0 // This gets overriden to 1 for space in area/Initialize(). var/outdoors = 0 //For space, the asteroid, lavaland, etc. Used with blueprints to determine if we are adding a new area (vs editing a station room) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index c7ee05888c..ed04e8f529 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/antag_spawner.dm b/code/game/gamemodes/antag_spawner.dm index 61b64337f1..74c16cf132 100644 --- a/code/game/gamemodes/antag_spawner.dm +++ b/code/game/gamemodes/antag_spawner.dm @@ -162,9 +162,7 @@ used = 1 var/mob/dead/observer/theghost = pick(nuke_candidates) spawn_antag(theghost.client, get_turf(src), "syndieborg") - var/datum/effect_system/spark_spread/S = new /datum/effect_system/spark_spread - S.set_up(4, 1, src) - S.start() + do_sparks(4, TRUE, src) qdel(src) else to_chat(user, "Unable to connect to Syndicate command. Please wait and try again later or use the teleporter on your uplink to get your points refunded.") diff --git a/code/game/gamemodes/blob/blobs/core.dm b/code/game/gamemodes/blob/blobs/core.dm index 9c41d7b99b..7ae47f4c0e 100644 --- a/code/game/gamemodes/blob/blobs/core.dm +++ b/code/game/gamemodes/blob/blobs/core.dm @@ -15,7 +15,7 @@ var/point_rate = 2 -/obj/structure/blob/core/New(loc, client/new_overmind = null, new_rate = 2, placed = 0) +/obj/structure/blob/core/Initialize(mapload, client/new_overmind = null, new_rate = 2, placed = 0) GLOB.blob_cores += src START_PROCESSING(SSobj, src) GLOB.poi_list |= src @@ -25,7 +25,7 @@ if(overmind) update_icon() point_rate = new_rate - ..() + . = ..() /obj/structure/blob/core/scannerreport() return "Directs the blob's expansion, gradually expands, and sustains nearby blob spores and blobbernauts." diff --git a/code/game/gamemodes/blob/blobs/node.dm b/code/game/gamemodes/blob/blobs/node.dm index fcb2bf9be2..d778323ac2 100644 --- a/code/game/gamemodes/blob/blobs/node.dm +++ b/code/game/gamemodes/blob/blobs/node.dm @@ -10,10 +10,10 @@ point_return = 25 -/obj/structure/blob/node/New(loc) +/obj/structure/blob/node/Initialize() GLOB.blob_nodes += src START_PROCESSING(SSobj, src) - ..() + . = ..() /obj/structure/blob/node/scannerreport() return "Gradually expands and sustains nearby blob spores and blobbernauts." diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm index 1931629e62..3ae9e3e8d6 100644 --- a/code/game/gamemodes/blob/theblob.dm +++ b/code/game/gamemodes/blob/theblob.dm @@ -21,14 +21,14 @@ var/mob/camera/blob/overmind -/obj/structure/blob/New(loc) +/obj/structure/blob/Initialize() var/area/Ablob = get_area(loc) if(Ablob.blob_allowed) //Is this area allowed for winning as blob? GLOB.blobs_legit += src GLOB.blobs += src //Keep track of the blob in the normal list either way setDir(pick(GLOB.cardinal)) update_icon() - ..() + .= ..() ConsumeTile() if(atmosblock) CanAtmosPass = ATMOS_PASS_NO @@ -99,7 +99,7 @@ var/list/blobs_to_affect = list() for(var/obj/structure/blob/B in urange(claim_range, src, 1)) blobs_to_affect += B - shuffle(blobs_to_affect) + shuffle_inplace(blobs_to_affect) for(var/L in blobs_to_affect) var/obj/structure/blob/B = L if(!B.overmind && !istype(B, /obj/structure/blob/core) && prob(30)) diff --git a/code/game/gamemodes/changeling/powers/fleshmend.dm b/code/game/gamemodes/changeling/powers/fleshmend.dm index 1809e6c8c8..dd9d4a8634 100644 --- a/code/game/gamemodes/changeling/powers/fleshmend.dm +++ b/code/game/gamemodes/changeling/powers/fleshmend.dm @@ -11,8 +11,8 @@ // divided by healing_ticks to get heal/tick var/total_healing = 100 -/obj/effect/proc_holder/changeling/fleshmend/New() - ..() +/obj/effect/proc_holder/changeling/fleshmend/Initialize() + . = ..() START_PROCESSING(SSobj, src) /obj/effect/proc_holder/changeling/fleshmend/Destroy() diff --git a/code/game/gamemodes/changeling/powers/mutations.dm b/code/game/gamemodes/changeling/powers/mutations.dm index 57db295d53..54e8ea1e38 100644 --- a/code/game/gamemodes/changeling/powers/mutations.dm +++ b/code/game/gamemodes/changeling/powers/mutations.dm @@ -162,8 +162,8 @@ sharpness = IS_SHARP var/can_drop = FALSE -/obj/item/weapon/melee/arm_blade/New(location,silent,synthetic) - ..() +/obj/item/weapon/melee/arm_blade/Initialize(mapload,silent,synthetic) + . = ..() if(ismob(loc) && !silent) loc.visible_message("A grotesque blade forms around [loc.name]\'s arm!", "Our arm twists and mutates, transforming it into a deadly blade.", "You hear organic matter ripping and tearing!") if(synthetic) @@ -240,8 +240,8 @@ throw_range = 0 throw_speed = 0 -/obj/item/weapon/gun/magic/tentacle/New(location,silent) - ..() +/obj/item/weapon/gun/magic/tentacle/Initialize(mapload, silent) + . = ..() if(ismob(loc)) if(!silent) loc.visible_message("[loc.name]\'s arm starts stretching inhumanly!", "Our arm twists and mutates, transforming it into a tentacle.", "You hear organic matter ripping and tearing!") @@ -266,9 +266,9 @@ firing_effect_type = null var/obj/item/weapon/gun/magic/tentacle/gun //the item that shot it -/obj/item/ammo_casing/magic/tentacle/New(obj/item/weapon/gun/magic/tentacle/tentacle_gun) - gun = tentacle_gun - ..() +/obj/item/ammo_casing/magic/tentacle/Initialize() + gun = loc + . = ..() /obj/item/ammo_casing/magic/tentacle/Destroy() gun = null @@ -285,9 +285,9 @@ var/chain var/obj/item/ammo_casing/magic/tentacle/source //the item that shot it -/obj/item/projectile/tentacle/New(obj/item/ammo_casing/magic/tentacle/tentacle_casing) - source = tentacle_casing - ..() +/obj/item/projectile/tentacle/Initialize() + source = loc + . = ..() /obj/item/projectile/tentacle/fire(setAngle) if(firer) @@ -407,8 +407,8 @@ var/remaining_uses //Set by the changeling ability. -/obj/item/weapon/shield/changeling/New() - ..() +/obj/item/weapon/shield/changeling/Initialize() + . = ..() if(ismob(loc)) loc.visible_message("The end of [loc.name]\'s hand inflates rapidly, forming a huge shield-like mass!", "We inflate our hand into a strong shield.", "You hear organic matter ripping and tearing!") @@ -452,8 +452,8 @@ allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/internals/emergency_oxygen, /obj/item/weapon/tank/internals/oxygen) armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 90, acid = 90) //No armor at all. -/obj/item/clothing/suit/space/changeling/New() - ..() +/obj/item/clothing/suit/space/changeling/Initialize() + . = ..() if(ismob(loc)) loc.visible_message("[loc.name]\'s flesh rapidly inflates, forming a bloated mass around their body!", "We inflate our flesh, creating a spaceproof suit!", "You hear organic matter ripping and tearing!") START_PROCESSING(SSobj, src) @@ -501,8 +501,8 @@ cold_protection = 0 heat_protection = 0 -/obj/item/clothing/suit/armor/changeling/New() - ..() +/obj/item/clothing/suit/armor/changeling/Initialize() + . = ..() if(ismob(loc)) loc.visible_message("[loc.name]\'s flesh turns black, quickly transforming into a hard, chitinous mass!", "We harden our flesh, creating a suit of armor!", "You hear organic matter ripping and tearing!") diff --git a/code/game/gamemodes/clock_cult/clock_helpers/clock_powerdrain.dm b/code/game/gamemodes/clock_cult/clock_helpers/clock_powerdrain.dm index 2691036cf1..705273876c 100644 --- a/code/game/gamemodes/clock_cult/clock_helpers/clock_powerdrain.dm +++ b/code/game/gamemodes/clock_cult/clock_helpers/clock_powerdrain.dm @@ -21,10 +21,8 @@ if(!charge && !panel_open) panel_open = TRUE icon_state = "[initial(icon_state)]-o" - var/datum/effect_system/spark_spread/spks = new(get_turf(src)) - spks.set_up(10, 0, get_turf(src)) - spks.start() - visible_message("[src]'s panel flies open with a flurry of spark") + do_sparks(10, FALSE, src) + visible_message("[src]'s panel flies open with a flurry of sparks!") update_icon() /obj/item/weapon/stock_parts/cell/power_drain(clockcult_user) diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index e58a7912b2..f471dc3477 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -124,7 +124,7 @@ structure_check() searches for nearby cultist structures required for the invoca if(allow_excess_invokers) chanters += invokers else - shuffle(invokers) + shuffle_inplace(invokers) for(var/i in 1 to req_cultists) var/L = pick_n_take(invokers) if(L) diff --git a/code/game/gamemodes/devil/devil_game_mode.dm b/code/game/gamemodes/devil/devil_game_mode.dm index 70775dfe9d..9a528a1240 100644 --- a/code/game/gamemodes/devil/devil_game_mode.dm +++ b/code/game/gamemodes/devil/devil_game_mode.dm @@ -50,12 +50,16 @@ /datum/game_mode/devil/post_setup() for(var/datum/mind/devil in devils) - spawn(rand(10,100)) - finalize_devil(devil, TRUE) - spawn(100) - add_devil_objectives(devil, objective_count) //This has to be in a separate loop, as we need devil names to be generated before we give objectives in devil agent. - devil.announceDevilLaws() - devil.announce_objectives() + post_setup_finalize(devil) modePlayer += devils ..() return 1 + +/datum/game_mode/devil/proc/post_setup_finalize(datum/mind/devil) + set waitfor = FALSE + sleep(rand(10,100)) + finalize_devil(devil, TRUE) + sleep(100) + add_devil_objectives(devil, objective_count) //This has to be in a separate loop, as we need devil names to be generated before we give objectives in devil agent. + devil.announceDevilLaws() + devil.announce_objectives() \ No newline at end of file diff --git a/code/game/gamemodes/devil/game_mode.dm b/code/game/gamemodes/devil/game_mode.dm index f311a289e0..515a6e4c97 100644 --- a/code/game/gamemodes/devil/game_mode.dm +++ b/code/game/gamemodes/devil/game_mode.dm @@ -31,7 +31,7 @@ /datum/game_mode/proc/finalize_devil(datum/mind/devil_mind, ascendable = FALSE) - + set waitfor = FALSE var/trueName= randomDevilName() devil_mind.devilinfo = devilInfo(trueName, 1) @@ -39,14 +39,14 @@ devil_mind.store_memory("Your devilic true name is [devil_mind.devilinfo.truename]
[GLOB.lawlorify[LAW][devil_mind.devilinfo.ban]]
You may not use violence to coerce someone into selling their soul.
You may not directly and knowingly physically harm a devil, other than yourself.
[GLOB.lawlorify[LAW][devil_mind.devilinfo.bane]]
[GLOB.lawlorify[LAW][devil_mind.devilinfo.obligation]]
[GLOB.lawlorify[LAW][devil_mind.devilinfo.banish]]
") devil_mind.devilinfo.owner = devil_mind devil_mind.devilinfo.give_base_spells(1) - spawn(10) - devil_mind.devilinfo.update_hud() - if(devil_mind.assigned_role == "Clown" && ishuman(devil_mind.current)) - var/mob/living/carbon/human/S = devil_mind.current - to_chat(S, "Your infernal nature has allowed you to overcome your clownishness.") - S.dna.remove_mutation(CLOWNMUT) if(issilicon(devil_mind.current)) add_law_sixsixsix(devil_mind.current) + sleep(10) + devil_mind.devilinfo.update_hud() + if(devil_mind.assigned_role == "Clown" && ishuman(devil_mind.current)) + var/mob/living/carbon/human/S = devil_mind.current + to_chat(S, "Your infernal nature has allowed you to overcome your clownishness.") + S.dna.remove_mutation(CLOWNMUT) /datum/game_mode/proc/add_devil_objectives(datum/mind/devil_mind, quantity) var/list/validtypes = list(/datum/objective/devil/soulquantity, /datum/objective/devil/soulquality, /datum/objective/devil/sintouch, /datum/objective/devil/buy_target) diff --git a/code/game/gamemodes/devil/true_devil/_true_devil.dm b/code/game/gamemodes/devil/true_devil/_true_devil.dm index 7f908756b9..eb2921c966 100644 --- a/code/game/gamemodes/devil/true_devil/_true_devil.dm +++ b/code/game/gamemodes/devil/true_devil/_true_devil.dm @@ -60,8 +60,7 @@ stat = DEAD ..(gibbed) drop_all_held_items() - spawn (0) - mind.devilinfo.beginResurrectionCheck(src) + INVOKE_ASYNC(mind.devilinfo, /datum/devilinfo/proc/beginResurrectionCheck, src) /mob/living/carbon/true_devil/examine(mob/user) diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 7dda5a619e..2564d1b262 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -75,11 +75,10 @@ ///Everyone should now be on the station and have their normal gear. This is the place to give the special roles extra things -/datum/game_mode/proc/post_setup(report=0) //Gamemodes can override the intercept report. Passing a 1 as the argument will force a report. +/datum/game_mode/proc/post_setup(report) //Gamemodes can override the intercept report. Passing TRUE as the argument will force a report. if(!report) report = config.intercept - spawn (ROUNDSTART_LOGOUT_REPORT_TIME) - display_roundstart_logout_report() + addtimer(CALLBACK(GLOBAL_PROC, .proc/display_roundstart_logout_report), ROUNDSTART_LOGOUT_REPORT_TIME) feedback_set_details("round_start","[time2text(world.realtime)]") if(SSticker && SSticker.mode) @@ -88,8 +87,7 @@ feedback_set_details("revision","[GLOB.revdata.commit]") feedback_set_details("server_ip","[world.internet_address]:[world.port]") if(report) - spawn (rand(waittime_l, waittime_h)) - send_intercept(0) + addtimer(CALLBACK(src, .proc/send_intercept, 0), rand(waittime_l, waittime_h)) generate_station_goals() GLOB.start_state = new /datum/station_state() GLOB.start_state.count(1) @@ -105,6 +103,7 @@ ///Allows rounds to basically be "rerolled" should the initial premise fall through. Also known as mulligan antags. /datum/game_mode/proc/convert_roundtype() + set waitfor = FALSE var/list/living_crew = list() for(var/mob/Player in GLOB.mob_list) @@ -158,15 +157,16 @@ message_admins("The roundtype will be converted. If you have other plans for the station or feel the station is too messed up to inhabit stop the creation of antags or end the round now.") - spawn(rand(600,1800)) //somewhere between 1 and 3 minutes from now - if(!config.midround_antag[SSticker.mode.config_tag]) - round_converted = 0 - return 1 - for(var/mob/living/carbon/human/H in antag_candidates) - replacementmode.make_antag_chance(H) - round_converted = 2 - message_admins("-- IMPORTANT: The roundtype has been converted to [replacementmode.name], antagonists may have been created! --") - return 1 + . = 1 + sleep(rand(600,1800)) + //somewhere between 1 and 3 minutes from now + if(!config.midround_antag[SSticker.mode.config_tag]) + round_converted = 0 + return 1 + for(var/mob/living/carbon/human/H in antag_candidates) + replacementmode.make_antag_chance(H) + round_converted = 2 + message_admins("-- IMPORTANT: The roundtype has been converted to [replacementmode.name], antagonists may have been created! --") ///Called by the gameSSticker diff --git a/code/game/gamemodes/gang/dominator.dm b/code/game/gamemodes/gang/dominator.dm index 1e48e69d39..54099070cd 100644 --- a/code/game/gamemodes/gang/dominator.dm +++ b/code/game/gamemodes/gang/dominator.dm @@ -24,7 +24,7 @@ set_light(2) GLOB.poi_list |= src spark_system = new - spark_system.set_up(5, 1, src) + spark_system.set_up(5, TRUE, src) countdown = new(src) /obj/machinery/dominator/examine(mob/user) @@ -129,9 +129,8 @@ set_broken() GLOB.poi_list.Remove(src) gang = null - qdel(spark_system) - qdel(countdown) - countdown = null + QDEL_NULL(spark_system) + QDEL_NULL(countdown) STOP_PROCESSING(SSmachines, src) return ..() diff --git a/code/game/gamemodes/gang/gang.dm b/code/game/gamemodes/gang/gang.dm index 51a9d21195..22ca4b2298 100644 --- a/code/game/gamemodes/gang/gang.dm +++ b/code/game/gamemodes/gang/gang.dm @@ -73,15 +73,16 @@ GLOBAL_LIST_INIT(gang_colors_pool, list("red","orange","yellow","green","blue"," /datum/game_mode/gang/post_setup() - spawn(rand(10,100)) - for(var/datum/gang/G in gangs) - for(var/datum/mind/boss_mind in G.bosses) - G.add_gang_hud(boss_mind) - forge_gang_objectives(boss_mind) - greet_gang(boss_mind) - equip_gang(boss_mind.current,G) - modePlayer += boss_mind + set waitfor = FALSE ..() + sleep(rand(10,100)) + for(var/datum/gang/G in gangs) + for(var/datum/mind/boss_mind in G.bosses) + G.add_gang_hud(boss_mind) + forge_gang_objectives(boss_mind) + greet_gang(boss_mind) + equip_gang(boss_mind.current,G) + modePlayer += boss_mind /datum/game_mode/proc/forge_gang_objectives(datum/mind/boss_mind) diff --git a/code/game/gamemodes/gang/gang_pen.dm b/code/game/gamemodes/gang/gang_pen.dm index 5045c27485..0e01532190 100644 --- a/code/game/gamemodes/gang/gang_pen.dm +++ b/code/game/gamemodes/gang/gang_pen.dm @@ -36,6 +36,7 @@ ..() /obj/item/weapon/pen/gang/proc/cooldown(datum/gang/gang) + set waitfor = FALSE var/cooldown_time = 600+(600*gang.bosses.len) // 1recruiter=2mins, 2recruiters=3mins, 3recruiters=4mins cooldown = 1 @@ -52,8 +53,8 @@ if(charges) cooldown_time = 50 - spawn(cooldown_time) - cooldown = 0 - icon_state = "pen" - var/mob/M = get(src, /mob) - to_chat(M, "\icon[src] [src][(src.loc == M)?(""):(" in your [src.loc]")] vibrates softly. It is ready to be used again.") + sleep(cooldown_time) + cooldown = 0 + icon_state = "pen" + var/mob/M = get(src, /mob) + to_chat(M, "\icon[src] [src][(src.loc == M)?(""):(" in your [src.loc]")] vibrates softly. It is ready to be used again.") diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm index d581af11b9..a7c466e746 100644 --- a/code/game/gamemodes/malfunction/Malf_Modules.dm +++ b/code/game/gamemodes/malfunction/Malf_Modules.dm @@ -192,19 +192,20 @@ set category = "Malfunction" set name = "Destroy RCDs" set desc = "Detonate all RCDs on the station, while sparing onboard cyborg RCDs." + set waitfor = FALSE if(!canUseTopic() || malf_cooldown) 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.") - malf_cooldown = 1 - spawn(100) - malf_cooldown = 0 + malf_cooldown = TRUE + sleep(100) + malf_cooldown = FALSE /datum/AI_Module/large/mecha_domination module_name = "Viral Mech Domination" diff --git a/code/game/gamemodes/miniantags/borer/borer.dm b/code/game/gamemodes/miniantags/borer/borer.dm index a8bfab458a..122d2c34ba 100644 --- a/code/game/gamemodes/miniantags/borer/borer.dm +++ b/code/game/gamemodes/miniantags/borer/borer.dm @@ -1072,4 +1072,4 @@ GLOBAL_VAR_INIT(total_borer_hosts_needed, 10) /datum/action/innate/borer/jumpstart_host/Activate() var/mob/living/simple_animal/borer/B = owner - B.jumpstart() + B.jumpstart() \ No newline at end of file diff --git a/code/game/gamemodes/sandbox/h_sandbox.dm b/code/game/gamemodes/sandbox/h_sandbox.dm index 722fabc81d..6b308357ec 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/gamemodes/traitor/double_agents.dm b/code/game/gamemodes/traitor/double_agents.dm index 68b92eea70..992e10fa22 100644 --- a/code/game/gamemodes/traitor/double_agents.dm +++ b/code/game/gamemodes/traitor/double_agents.dm @@ -65,7 +65,7 @@ // As soon as we get 3 or 4 extra latejoin traitors, make them traitors and kill each other. if(late_joining_list.len >= rand(3, 4)) // True randomness - shuffle(late_joining_list) + shuffle_inplace(late_joining_list) // Reset the target_list, it'll be used again in force_traitor_objectives target_list = list() diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm index 2a5eaef299..13084fab64 100644 --- a/code/game/gamemodes/wizard/artefact.dm +++ b/code/game/gamemodes/wizard/artefact.dm @@ -329,7 +329,7 @@ if("cyborg") for(var/X in M.bodyparts) var/obj/item/bodypart/affecting = X - affecting.change_bodypart_status(BODYPART_ROBOTIC) + affecting.change_bodypart_status(BODYPART_ROBOTIC, FALSE, TRUE) M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/eyepatch(M), slot_glasses) M.put_in_hands_or_del(sword) diff --git a/code/game/gamemodes/wizard/raginmages.dm b/code/game/gamemodes/wizard/raginmages.dm index c9831d8347..01eb8a52c4 100644 --- a/code/game/gamemodes/wizard/raginmages.dm +++ b/code/game/gamemodes/wizard/raginmages.dm @@ -117,7 +117,7 @@ mages_made-- return else - shuffle(candidates) + shuffle_inplace(candidates) for(var/mob/i in candidates) if(!i || !i.client) continue //Dont bother removing them from the list since we only grab one wizard diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 433470bf1b..78dce54101 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/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm index f0adeac226..39cdb1478c 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 diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm index 2a2c02f72b..74fcf77ce5 100644 --- a/code/game/machinery/computer/computer.dm +++ b/code/game/machinery/computer/computer.dm @@ -35,7 +35,7 @@ return ..() /obj/machinery/computer/Initialize() - ..() + . = ..() power_change() /obj/machinery/computer/process() diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm new file mode 100644 index 0000000000..0876e5c1f7 --- /dev/null +++ b/code/game/machinery/dance_machine.dm @@ -0,0 +1,514 @@ +// DISCO DANCE MACHINE - For engineering power optimization incentive nurturing test system (POINTS) + +/obj/machinery/disco + name = "radiant dance machine mark IV" + desc = "The first three prototypes were discontinued after mass casualty incidents." + icon = 'icons/obj/lighting.dmi' + icon_state = "disco0" + anchored = FALSE + verb_say = "states" + density = TRUE + req_access = list(GLOB.access_engine) + var/active = FALSE + var/list/rangers = list() + var/list/listeners = list() + var/charge = 35 + var/stop = 0 + var/list/available = list() + var/list/select_name = list() + var/list/spotlights = list() + var/list/sparkles = list() + var/static/list/songs = list( + new /datum/track("Engineering's Basic Beat", 'sound/misc/disco.ogg', 600, 5), + new /datum/track("Engineering's Domination Dance", 'sound/misc/e1m1.ogg', 950, 6), + new /datum/track("Engineering's Superiority Shimmy", 'sound/misc/Paradox.ogg', 2400, 4), + new /datum/track("Engineering's Ultimate High-Energy Hustle", 'sound/misc/boogie2.ogg', 1770, 5), + ) + var/datum/track/selection = null + +/datum/track + var/song_name = "generic" + var/song_path = null + var/song_length = 0 + var/song_beat = 0 + +/datum/track/New(name, path, length, beat) + song_name = name + song_path = path + song_length = length + song_beat = beat + +/obj/machinery/disco/Initialize() + ..() + selection = songs[1] + + +/obj/machinery/disco/Destroy() + dance_over() + return ..() + +/obj/machinery/disco/attackby(obj/item/O, mob/user, params) + if(!active) + if(istype(O, /obj/item/weapon/wrench)) + if(!anchored && !isinspace()) + to_chat(user,"You secure the [src] to the floor.") + anchored = TRUE + else if(anchored) + to_chat(user,"You unsecure and disconnect the [src].") + anchored = FALSE + playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) + return + return ..() + +/obj/machinery/disco/update_icon() + if(active) + icon_state = "disco1" + else + icon_state = "disco0" + ..() + + +/obj/machinery/disco/interact(mob/user) + if (!anchored) + to_chat(user,"This device must be anchored by a wrench!") + return + if(!allowed(user)) + to_chat(user,"Error: Access Denied - Message: Only the engineering department can be trusted with this kind of power.") + playsound(src, 'sound/misc/compiler-failure.ogg', 50, 1) + return + if(!Adjacent(user) && !isAI(user)) + return + user.set_machine(src) + var/list/dat = list() + dat +="
" + dat += "[!active ? "BREAK IT DOWN" : "SHUT IT DOWN"]
" + dat += "

" + dat += " Select Track
" + dat += "Track Selected: [selection.song_name]
" + dat += "Track Length: [selection.song_length/10] seconds

" + dat += "
DJ's Soundboard:
" + dat +="
" + dat += "Air Horn " + dat += "Station Alert " + dat += "Warning Siren " + dat += "Honk
" + dat += "Shotgun Pump" + dat += "Gunshot" + dat += "Esword" + dat += "Harm Alarm" + var/datum/browser/popup = new(user, "vending", "Radiance Dance Machine - Mark IV", 400, 350) + popup.set_content(dat.Join()) + popup.open() + + +/obj/machinery/disco/Topic(href, href_list) + if(..()) + return + add_fingerprint(usr) + switch(href_list["action"]) + if("toggle") + if (QDELETED(src)) + return + if(!active) + if(stop > world.time) + to_chat(usr, "Error: The device is still resetting from the last activation, it will be ready again in [round((stop-world.time)/10)] seconds.") + playsound(src, 'sound/misc/compiler-failure.ogg', 50, 1) + return + active = TRUE + update_icon() + dance_setup() + START_PROCESSING(SSobj, src) + lights_spin() + updateUsrDialog() + else if(active) + active = FALSE + STOP_PROCESSING(SSobj, src) + update_icon() + dance_over() + stop = world.time + 300 + updateUsrDialog() + if("select") + if(active) + to_chat(usr, "Error: You cannot change the song until the current one is over.") + return + check_GBP() + select_name = input(usr, "Choose your song", "Track:") as null|anything in available + if (QDELETED(src)) + return + for(var/datum/track/S in songs) + if(select_name == S.song_name) + selection = S + break + updateUsrDialog() + if("horn") + deejay('sound/items/AirHorn2.ogg') + if("alert") + deejay('sound/misc/notice1.ogg') + if("siren") + deejay('sound/machines/engine_alert1.ogg') + if("honk") + deejay('sound/items/bikehorn.ogg') + if("pump") + deejay('sound/weapons/shotgunpump.ogg') + if("pop") + deejay('sound/weapons/Gunshot3.ogg') + if("saber") + deejay('sound/weapons/saberon.ogg') + if("harm") + deejay('sound/AI/harmalarm.ogg') + +/obj/machinery/disco/proc/deejay(var/S) + if (QDELETED(src) || !active || charge < 5) + to_chat(usr, "The device is not able to play more DJ sounds at this time.") + return + charge -= 5 + playsound(src, S,300,1) + +/obj/machinery/disco/proc/check_GBP() + available |= "Engineering's Basic Beat" + available |= "Engineering's Domination Dance" + available |= "Engineering's Superiority Shimmy" + available |= "Engineering's Ultimate High-Energy Hustle" + + +/obj/machinery/disco/proc/dance_setup() + stop = world.time + selection.song_length + var/turf/cen = get_turf(src) + FOR_DVIEW(var/turf/t, 3, get_turf(src),INVISIBILITY_LIGHTING) + if(t.x == cen.x && t.y > cen.y) + var/obj/item/device/flashlight/spotlight/L = new /obj/item/device/flashlight/spotlight(t) + L.light_color = "red" + L.light_power = 30-(get_dist(src,L)*8) + L.range = 1+get_dist(src, L) + spotlights+=L + continue + if(t.x == cen.x && t.y < cen.y) + var/obj/item/device/flashlight/spotlight/L = new /obj/item/device/flashlight/spotlight(t) + L.light_color = "purple" + L.light_power = 30-(get_dist(src,L)*8) + L.range = 1+get_dist(src, L) + spotlights+=L + continue + if(t.x > cen.x && t.y == cen.y) + var/obj/item/device/flashlight/spotlight/L = new /obj/item/device/flashlight/spotlight(t) + L.light_color = "#ffff00" + L.light_power = 30-(get_dist(src,L)*8) + L.range = 1+get_dist(src, L) + spotlights+=L + continue + if(t.x < cen.x && t.y == cen.y) + var/obj/item/device/flashlight/spotlight/L = new /obj/item/device/flashlight/spotlight(t) + L.light_color = "green" + L.light_power = 30-(get_dist(src,L)*8) + L.range = 1+get_dist(src, L) + spotlights+=L + continue + if((t.x+1 == cen.x && t.y+1 == cen.y) || (t.x+2==cen.x && t.y+2 == cen.y)) + var/obj/item/device/flashlight/spotlight/L = new /obj/item/device/flashlight/spotlight(t) + L.light_color = "sw" + L.light_power = 30-(get_dist(src,L)*8) + L.range = 1.4+get_dist(src, L) + spotlights+=L + continue + if((t.x-1 == cen.x && t.y-1 == cen.y) || (t.x-2==cen.x && t.y-2 == cen.y)) + var/obj/item/device/flashlight/spotlight/L = new /obj/item/device/flashlight/spotlight(t) + L.light_color = "ne" + L.light_power = 30-(get_dist(src,L)*8) + L.range = 1.4+get_dist(src, L) + spotlights+=L + continue + if((t.x-1 == cen.x && t.y+1 == cen.y) || (t.x-2==cen.x && t.y+2 == cen.y)) + var/obj/item/device/flashlight/spotlight/L = new /obj/item/device/flashlight/spotlight(t) + L.light_color = "se" + L.light_power = 30-(get_dist(src,L)*8) + L.range = 1.4+get_dist(src, L) + spotlights+=L + continue + if((t.x+1 == cen.x && t.y-1 == cen.y) || (t.x+2==cen.x && t.y-2 == cen.y)) + var/obj/item/device/flashlight/spotlight/L = new /obj/item/device/flashlight/spotlight(t) + L.light_color = "nw" + L.light_power = 30-(get_dist(src,L)*8) + L.range = 1.4+get_dist(src, L) + spotlights+=L + continue + continue + +/obj/machinery/disco/proc/hierofunk() + for(var/i in 1 to 10) + spawn_atom_to_turf(/obj/effect/overlay/temp/hierophant/telegraph/edge, src, 1, FALSE) + sleep(5) + +/obj/machinery/disco/proc/lights_spin() + for(var/i in 1 to 25) + if(QDELETED(src) || !active) + return + var/obj/effect/overlay/sparkles/S = new /obj/effect/overlay/sparkles(src) + S.alpha = 0 + sparkles += S + switch(i) + if(1 to 8) + S.orbit(src, 30, TRUE, 60, 36, TRUE, FALSE) + if(9 to 16) + S.orbit(src, 62, TRUE, 60, 36, TRUE, FALSE) + if(17 to 24) + S.orbit(src, 95, TRUE, 60, 36, TRUE, FALSE) + if(25) + S.pixel_y = 7 + S.forceMove(get_turf(src)) + sleep(7) + if(selection.song_name == "Engineering's Ultimate High-Energy Hustle") + sleep(280) + for(var/obj/reveal in sparkles) + reveal.alpha = 255 + while(active) + for(var/obj/item/device/flashlight/spotlight/glow in spotlights) // The multiples reflects custom adjustments to each colors after dozens of tests + if(QDELETED(src) || !active || QDELETED(glow)) + return + if(glow.light_color == "red") + glow.light_color = "nw" + glow.light_power = glow.light_power * 1.48 + glow.light_range = 0 + glow.update_light() + continue + if(glow.light_color == "nw") + glow.light_color = "green" + glow.light_range = glow.range * 1.1 + glow.light_power = glow.light_power * 2 // Any changes to power must come in pairs to neutralize it for other colors + glow.update_light() + continue + if(glow.light_color == "green") + glow.light_color = "sw" + glow.light_power = glow.light_power * 0.5 + glow.light_range = 0 + glow.update_light() + continue + if(glow.light_color == "sw") + glow.light_color = "purple" + glow.light_power = glow.light_power * 2.27 + glow.light_range = glow.range * 1.15 + glow.update_light() + continue + if(glow.light_color == "purple") + glow.light_color = "se" + glow.light_power = glow.light_power * 0.44 + glow.light_range = 0 + glow.update_light() + continue + if(glow.light_color == "se") + glow.light_color = "#ffff00" + glow.light_range = glow.range * 0.9 + glow.update_light() + continue + if(glow.light_color == "#ffff00") + glow.light_color = "ne" + glow.light_range = 0 + glow.update_light() + continue + if(glow.light_color == "ne") + glow.light_color = "red" + glow.light_power = glow.light_power * 0.68 + glow.light_range = glow.range * 0.85 + glow.update_light() + continue + if(prob(2)) // Unique effects for the dance floor that show up randomly to mix things up + INVOKE_ASYNC(src, .proc/hierofunk) + sleep(selection.song_beat) + + +/obj/machinery/disco/proc/dance(var/mob/living/carbon/M) //Show your moves + + switch(rand(0,9)) + if(0 to 1) + dance2(M) + if(2 to 3) + dance3(M) + if(4 to 6) + dance4(M) + if(7 to 9) + dance5(M) + +/obj/machinery/disco/proc/dance2(var/mob/living/carbon/M) + set waitfor = 0 + for(var/i = 1, i < 10, i++) + M.SpinAnimation(15,1) + M.setDir(pick(GLOB.cardinal)) + sleep(8) + +/obj/machinery/disco/proc/dance3(var/mob/living/carbon/M) + var/matrix/initial_matrix = matrix(M.transform) + for(var/i in 1 to 6) + if (!M) + return + M.SpinAnimation(7,1) + M.setDir(pick(GLOB.cardinal)) + for (var/x in 1 to 12) + sleep(1) + if (!M) + return + if (i<5) + initial_matrix = matrix(M.transform) + initial_matrix.Translate(0,1) + animate(M, transform = initial_matrix, time = 1, loop = 0) + if (i>4) + initial_matrix = matrix(M.transform) + initial_matrix.Translate(0,-2) + animate(M, transform = initial_matrix, time = 1, loop = 0) + M.setDir(turn(M.dir, 90)) + switch (M.dir) + if (NORTH) + initial_matrix = matrix(M.transform) + initial_matrix.Translate(0,3) + animate(M, transform = initial_matrix, time = 1, loop = 0) + if (SOUTH) + initial_matrix = matrix(M.transform) + initial_matrix.Translate(0,-3) + animate(M, transform = initial_matrix, time = 1, loop = 0) + if (EAST) + initial_matrix = matrix(M.transform) + initial_matrix.Translate(3,0) + animate(M, transform = initial_matrix, time = 1, loop = 0) + if (WEST) + initial_matrix = matrix(M.transform) + initial_matrix.Translate(-3,0) + animate(M, transform = initial_matrix, time = 1, loop = 0) + sleep(10) + animate(M, transform = null, time = 1, loop = 0) + + +/obj/machinery/disco/proc/dance4(var/mob/living/carbon/M) + var/speed = rand(1,3) + set waitfor = 0 + var/time = 30 + while(time) + sleep(speed) + for(var/i in 1 to speed) + M.setDir(pick(GLOB.cardinal)) + M.lay_down(TRUE) + time-- + +/obj/machinery/disco/proc/dance5(var/mob/living/carbon/M) + INVOKE_ASYNC(M, .proc/dance5helper) + var/matrix/initial_matrix = matrix(M.transform) + for (var/i in 1 to 60) + if (!M) + return + if (i<31) + initial_matrix = matrix(M.transform) + initial_matrix.Translate(0,1) + animate(M, transform = initial_matrix, time = 1, loop = 0) + if (i>30) + initial_matrix = matrix(M.transform) + initial_matrix.Translate(0,-1) + animate(M, transform = initial_matrix, time = 1, loop = 0) + M.setDir(turn(M.dir, 90)) + switch (M.dir) + if (NORTH) + initial_matrix = matrix(M.transform) + initial_matrix.Translate(0,3) + animate(M, transform = initial_matrix, time = 1, loop = 0) + if (SOUTH) + initial_matrix = matrix(M.transform) + initial_matrix.Translate(0,-3) + animate(M, transform = initial_matrix, time = 1, loop = 0) + if (EAST) + initial_matrix = matrix(M.transform) + initial_matrix.Translate(3,0) + animate(M, transform = initial_matrix, time = 1, loop = 0) + if (WEST) + initial_matrix = matrix(M.transform) + initial_matrix.Translate(-3,0) + animate(M, transform = initial_matrix, time = 1, loop = 0) + sleep (1) + animate(M, transform = null, time = 1, loop = 0) + +/obj/machinery/disco/proc/dance5helper(var/mob/living/carbon/M) + if (M) + animate(M, transform = matrix(180, MATRIX_ROTATE), time = 1, loop = 0) + sleep (70) + if (M) + animate(M, transform = null, time = 1, loop = 0) + +/mob/living/carbon/proc/dancey() // Dance5 except independent of the machine if admins want to meme it up + INVOKE_ASYNC(src, .proc/danceyhelper) + var/matrix/initial_matrix = matrix(transform) + for (var/i in 1 to 60) + if (!src) + return + if (i<31) + initial_matrix = matrix(transform) + initial_matrix.Translate(0,1) + transform = initial_matrix + animate(src, transform, time = 1, loop = 0) + if (i>30) + initial_matrix = matrix(transform) + initial_matrix.Translate(0,-1) + transform = initial_matrix + animate(src, transform, time = 1, loop = 0) + setDir(turn(src.dir, 90)) + switch (dir) + if (NORTH) + initial_matrix = matrix(transform) + initial_matrix.Translate(0,3) + animate(src, transform, time = 1, loop = 0) + if (SOUTH) + initial_matrix = matrix(transform) + initial_matrix.Translate(0,-3) + animate(src, transform, time = 1, loop = 0) + if (EAST) + initial_matrix = matrix(transform) + initial_matrix.Translate(3,0) + animate(src, transform, time = 1, loop = 0) + if (WEST) + initial_matrix = matrix(transform) + initial_matrix.Translate(-3,0) + animate(src, transform, time = 1, loop = 0) + sleep (1) + animate(src, transform = null, time = 1, loop = 0) + +/mob/living/carbon/proc/danceyhelper() + if (src) + animate(src, transform = matrix(180, MATRIX_ROTATE), time = 1, loop = 0) + sleep (70) + if (src) + animate(src, transform = null, time = 1, loop = 0) + + +/obj/machinery/disco/proc/dance_over() + for(var/obj/item/device/flashlight/spotlight/SL in spotlights) + qdel(SL) + spotlights.Cut() + for(var/obj/effect/overlay/sparkles/SP in sparkles) + qdel(SP) + sparkles.Cut() + rangers.Cut() + for(var/mob/living/L in listeners) + if(!L || !L.client) + continue + L.stop_sound_channel(CHANNEL_JUKEBOX) + listeners.Cut() + + +/obj/machinery/disco/process() + if(charge<35) + charge += 1 + if(world.time < stop && active) + rangers = list() + for(var/mob/living/M in range(9,src)) + rangers += M + if(!(listeners[M])) + M.playsound_local(get_turf(M), selection.song_path, 100, channel = CHANNEL_JUKEBOX) + listeners[M] = TRUE + if(prob(5+(allowed(M)*4))) + dance(M) + for(var/mob/living/L in listeners) + if(!(L in rangers)) + listeners -= L + if(!L || !L.client) + continue + L.stop_sound_channel(CHANNEL_JUKEBOX) + else if(active) + STOP_PROCESSING(SSobj, src) + dance_over() + playsound(src,'sound/machines/terminal_off.ogg',50,1) + active = FALSE + icon_state = "disco0" diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index df5366024b..147e07fe1d 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -339,9 +339,7 @@ return FALSE //Already shocked someone recently? if(!prob(prb)) return FALSE //you lucked out, no shock for you - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(5, 1, src) - s.start() //sparks always. + do_sparks(5, TRUE, src) var/tmp/check_range = TRUE if(electrocute_mob(user, get_area(src), src, 1, check_range)) hasShocked = TRUE @@ -1542,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/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm index fae47406b8..b37db06ac2 100644 --- a/code/game/machinery/doors/brigdoors.dm +++ b/code/game/machinery/doors/brigdoors.dm @@ -212,6 +212,11 @@ if(..()) return . = TRUE + + if(!allowed(usr)) + to_chat(usr, "Access denied.") + return FALSE + switch(action) if("time") var/value = text2num(params["adjust"]) diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index f28e6cdbdb..ae8c1ac1c4 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -97,7 +97,7 @@ Possible to do for anyone motivated enough: /obj/machinery/holopad/interact(mob/living/carbon/human/user) //Carn: Hologram requests. if(!istype(user)) return - if(user.stat || stat & (NOPOWER|BROKEN)) + if(user.stat || !is_operational()) return user.set_machine(src) var/dat @@ -112,7 +112,7 @@ Possible to do for anyone motivated enough: popup.open() /obj/machinery/holopad/Topic(href, href_list) - if(..()) + if(..() || !is_operational()) return if (href_list["AIrequest"]) if(last_request + 200 < world.time) diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 137a492b3a..6cd8e75798 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -127,7 +127,7 @@ Class Procs: /obj/machinery/Initialize() if (!armor) armor = list(melee = 25, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 70) - ..() + . = ..() GLOB.machines += src if(!speed_process) START_PROCESSING(SSmachines, src) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index c8c1854344..3de0b85820 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -528,7 +528,7 @@ if(icon_vend) //Show the vending animation if needed flick(icon_vend,src) new R.product_path(get_turf(src)) - feedback_add_details("vending_machine_usage","[R.product_path]|[src.type]") + feedback_add_details("vending_machine_usage","[src.type]|[R.product_path]") vend_ready = 1 return @@ -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/machinery/wishgranter.dm b/code/game/machinery/wishgranter.dm index cdaea6f875..1866295a8f 100644 --- a/code/game/machinery/wishgranter.dm +++ b/code/game/machinery/wishgranter.dm @@ -50,4 +50,4 @@ to_chat(user, "You have a very bad feeling about this.") - return \ No newline at end of file + return diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 99aad7743f..25ba38c51c 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -119,8 +119,8 @@ hud_possible = list (DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_MECH_HUD, DIAG_TRACK_HUD) -/obj/mecha/New() - ..() +/obj/mecha/Initialize() + . = ..() events = new icon_state += "-open" add_radio() diff --git a/code/game/objects/effects/effect_system/effect_system.dm b/code/game/objects/effects/effect_system/effect_system.dm index 34b20fde6f..fe7216801b 100644 --- a/code/game/objects/effects/effect_system/effect_system.dm +++ b/code/game/objects/effects/effect_system/effect_system.dm @@ -23,7 +23,7 @@ would spawn and follow the beaker, even if it is carried or thrown. /datum/effect_system var/number = 3 - var/cardinals = 0 + var/cardinals = FALSE var/turf/location var/atom/holder var/effect_type @@ -34,7 +34,7 @@ would spawn and follow the beaker, even if it is carried or thrown. location = null return ..() -/datum/effect_system/proc/set_up(n = 3, c = 0, loca) +/datum/effect_system/proc/set_up(n = 3, c = FALSE, loca) if(n > 10) n = 10 number = n diff --git a/code/game/objects/effects/effect_system/effects_sparks.dm b/code/game/objects/effects/effect_system/effects_sparks.dm index 054416efc2..997c7af124 100644 --- a/code/game/objects/effects/effect_system/effects_sparks.dm +++ b/code/game/objects/effects/effect_system/effects_sparks.dm @@ -5,6 +5,17 @@ // will always spawn at the items location. ///////////////////////////////////////////// +/proc/do_sparks(n, c, source) + // n - number of sparks + // c - cardinals, bool, do the sparks only move in cardinal directions? + // source - source of the sparks. + + var/datum/effect_system/spark_spread/sparks = new + sparks.set_up(n, c, source) + sparks.start() + qdel(sparks) + + /obj/effect/particle_effect/sparks name = "sparks" icon_state = "sparks" diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm index e83ecda809..3d62e850e8 100644 --- a/code/game/objects/effects/overlays.dm +++ b/code/game/objects/effects/overlays.dm @@ -210,6 +210,11 @@ icon_state = "smoke" duration = 50 +/obj/effect/overlay/temp/fire + icon = 'icons/effects/fire.dmi' + icon_state = "3" + duration = 20 + /obj/effect/overlay/temp/cult randomdir = 0 duration = 10 @@ -608,3 +613,8 @@ name = "Coconuts" icon = 'icons/misc/beach.dmi' icon_state = "coconuts" + +/obj/effect/overlay/sparkles + name = "sparkles" + icon = 'icons/effects/effects.dmi' + icon_state = "shieldsparkles" diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index b0876e394d..fa2dee2495 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,14 +103,19 @@ 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() - ..() + . = ..() for(var/path in actions_types) 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/game/objects/items/charter.dm b/code/game/objects/items/charter.dm index e5f4ac1cb7..98e03ef18c 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 diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index c97fc18b8e..433e095c24 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -307,7 +307,7 @@ // Glowsticks, in the uncomfortable range of similar to flares, // but not similar enough to make it worth a refactor /obj/item/device/flashlight/glowstick - name = "green glowstick" + name = "glowstick" desc = "A military-grade glowstick." w_class = WEIGHT_CLASS_SMALL brightness_on = 4 @@ -363,6 +363,11 @@ . = ..() if(.) user.visible_message("[user] cracks and shakes [src].", "You crack and shake [src], turning it on!") + activate() + +/obj/item/device/flashlight/glowstick/proc/activate() + if(!on) + on = TRUE START_PROCESSING(SSobj, src) /obj/item/device/flashlight/glowstick/red @@ -402,6 +407,20 @@ color = initial(glowtype.color) . = ..() +/obj/item/device/flashlight/spotlight //invisible lighting source + name = "disco lighting" + icon_state = null + light_color = null + brightness_on = 0 + light_range = 0 + light_power = 10 + alpha = 0 + layer = 0 + on = TRUE + anchored = TRUE + var/range = null + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + /obj/item/device/flashlight/flashdark name = "flashdark" desc = "A strange device manufactured with mysterious elements that somehow emits darkness. Or maybe it just sucks in light? Nobody knows for sure." diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm index dbb3149a38..f8e716ea69 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/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm index 580c5d8605..da8d4fe97e 100644 --- a/code/game/objects/items/weapons/extinguisher.dm +++ b/code/game/objects/items/weapons/extinguisher.dm @@ -94,6 +94,9 @@ return 0 /obj/item/weapon/extinguisher/afterattack(atom/target, mob/user , flag) + // Make it so the extinguisher doesn't spray yourself when you click your inventory items + if (target.loc == user) + return //TODO; Add support for reagents in water. if(refilling) refilling = FALSE diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index 3d8174df2a..49cc975546 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -45,10 +45,7 @@ if(do_mob(user, C, 30) && (C.get_num_arms() >= 2 || C.get_arm_ignore())) apply_cuffs(C,user) to_chat(user, "You handcuff [C].") - if(istype(src, /obj/item/weapon/restraints/handcuffs/cable)) - feedback_add_details("handcuffs","C") - else - feedback_add_details("handcuffs","H") + feedback_add_details("handcuffs","[type]") add_logs(user, C, "handcuffed") else @@ -247,7 +244,7 @@ var/armed = 0 var/trap_damage = 20 -/obj/item/weapon/restraints/legcuffs/beartrap/New() +/obj/item/weapon/restraints/legcuffs/beartrap/Initialize() ..() icon_state = "[initial(icon_state)][armed]" @@ -278,7 +275,7 @@ C.legcuffed = src src.loc = C C.update_inv_legcuffed() - feedback_add_details("handcuffs","B") //Yes, I know they're legcuffs. Don't change this, no need for an extra variable. The "B" is used to tell them apart. + feedback_add_details("handcuffs","[type]") else if(isanimal(L)) var/mob/living/simple_animal/SA = L if(SA.mob_size > MOB_SIZE_TINY) @@ -307,9 +304,7 @@ /obj/item/weapon/restraints/legcuffs/beartrap/energy/proc/dissipate() if(!istype(loc, /mob)) - var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread - sparks.set_up(1, 1, src) - sparks.start() + do_sparks(1, TRUE, src) qdel(src) /obj/item/weapon/restraints/legcuffs/beartrap/energy/attack_hand(mob/user) @@ -341,7 +336,7 @@ C.legcuffed = src src.loc = C C.update_inv_legcuffed() - feedback_add_details("handcuffs","B") + feedback_add_details("handcuffs","[type]") to_chat(C, "\The [src] ensnares you!") C.Weaken(weaken) diff --git a/code/game/objects/items/weapons/implants/implant_explosive.dm b/code/game/objects/items/weapons/implants/implant_explosive.dm index ad7079fee1..369effbe7c 100644 --- a/code/game/objects/items/weapons/implants/implant_explosive.dm +++ b/code/game/objects/items/weapons/implants/implant_explosive.dm @@ -31,7 +31,7 @@ /obj/item/weapon/implant/explosive/activate(cause) if(!cause || !imp_in || active) return 0 - if(cause == "action_button" || !popup) + if(cause == "action_button" && !popup) popup = TRUE var/response = alert(imp_in, "Are you sure you want to activate your [name]? This will cause you to explode!", "[name] Confirmation", "Yes", "No") popup = FALSE diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index 0b36647b98..002c7773b4 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 diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index d7fa0f1084..a93abfbf9d 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -12,7 +12,7 @@ /obj/structure/Initialize() if (!armor) armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 50) - ..() + . = ..() if(smooth) queue_smooth(src) queue_smooth_neighbors(src) diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index 8724136b87..b3b83553c2 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/displaycase.dm b/code/game/objects/structures/displaycase.dm index dfd2574bbb..be1b49074d 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -242,7 +242,7 @@ /obj/structure/displaycase/captain alert = 1 start_showpiece_type = /obj/item/weapon/gun/energy/laser/captain - req_access = list(GLOB.access_captain) + req_access = list(GLOB.access_cent_specops) /obj/structure/displaycase/labcage name = "lab cage" diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index 4a3ab87770..9f37710d78 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 478b3273b2..2dc159d482 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/morgue.dm b/code/game/objects/structures/morgue.dm index b388fd78cf..a13858296a 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -188,8 +188,10 @@ GLOBAL_LIST_EMPTY(crematoriums) /obj/structure/bodycontainer/crematorium/proc/cremate(mob/user) if(locked) return //don't let you cremate something twice or w/e + // Make sure we don't delete the actual morgue and its tray + var/list/conts = GetAllContents() - src - connected - if(contents.len <= 1) + if(conts.len <= 1) audible_message("You hear a hollow crackle.") return @@ -199,7 +201,7 @@ GLOBAL_LIST_EMPTY(crematoriums) locked = 1 update_icon() - for(var/mob/living/M in contents) + for(var/mob/living/M in conts) if (M.stat != DEAD) M.emote("scream") if(user) @@ -212,7 +214,7 @@ GLOBAL_LIST_EMPTY(crematoriums) M.ghostize() qdel(M) - for(var/obj/O in contents) //obj instead of obj/item so that bodybags and ashes get destroyed. We dont want tons and tons of ash piling up + for(var/obj/O in conts) //obj instead of obj/item so that bodybags and ashes get destroyed. We dont want tons and tons of ash piling up if(O != connected) //Creamtorium does not burn hot enough to destroy the tray qdel(O) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index d5bcb8b60b..c6c2ef358b 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/sound.dm b/code/game/sound.dm index d6ed179aba..8d0c20d63d 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -134,18 +134,6 @@ soundin = pick('sound/machines/terminal_button01.ogg', 'sound/machines/terminal_button02.ogg', 'sound/machines/terminal_button03.ogg', \ 'sound/machines/terminal_button04.ogg', 'sound/machines/terminal_button05.ogg', 'sound/machines/terminal_button06.ogg', \ 'sound/machines/terminal_button07.ogg', 'sound/machines/terminal_button08.ogg') - //Vore sounds - if ("digestion_sounds") - soundin = pick('sound/vore/digest1.ogg', 'sound/vore/digest2.ogg', 'sound/vore/digest3.ogg', \ - 'sound/vore/digest4.ogg', 'sound/vore/digest5.ogg', 'sound/vore/digest6.ogg', \ - 'sound/vore/digest7.ogg', 'sound/vore/digest8.ogg', 'sound/vore/digest9.ogg', \ - 'sound/vore/digest10.ogg','sound/vore/digest11.ogg', 'sound/vore/digest12.ogg') - if ("death_gurgles") - soundin = pick('sound/vore/death1.ogg', 'sound/vore/death2.ogg', 'sound/vore/death3.ogg', \ - 'sound/vore/death4.ogg', 'sound/vore/death5.ogg', 'sound/vore/death6.ogg', \ - 'sound/vore/death7.ogg', 'sound/vore/death8.ogg', 'sound/vore/death9.ogg', 'sound/vore/death10.ogg') - if ("struggle_sounds") - soundin = pick('sound/vore/squish1.ogg', 'sound/vore/squish2.ogg', 'sound/vore/squish3.ogg', 'sound/vore/squish4.ogg') return soundin /proc/playsound_global(file, repeat=0, wait, channel, volume) diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index 98c28256e9..5f581fba63 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/minerals.dm b/code/game/turfs/simulated/minerals.dm index ba84d0ff11..d418c0a48a 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/game/turfs/simulated/wall/reinf_walls.dm b/code/game/turfs/simulated/wall/reinf_walls.dm index c1eff8e415..c15e478c49 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 2fd5b4433f..1aea3d7dbc 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 7262569762..6c1e2743cd 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 @@ -159,18 +159,29 @@ 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.") ChangeTurf(/turf/open/floor/plating) return TRUE - return FALSE \ No newline at end of file + return FALSE + +/turf/open/space/ReplaceWithLattice() + var/dest_x = destination_x + var/dest_y = destination_y + var/dest_z = destination_z + ..() + destination_x = dest_x + destination_y = dest_y + destination_z = dest_z + diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 93d034cc32..fc3c2ccd05 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -172,7 +172,7 @@ message["message_sender"] = source message["message"] = msg message["source"] = "([config.cross_name])" - message["key"] = GLOB.comms_key + message["key"] = global.comms_key message["crossmessage"] = type world.Export("[config.cross_address]?[list2params(message)]") diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 55fc078cf1..92c36347f5 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -755,11 +755,11 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if(!holder) return - GLOB.medals_enabled = !GLOB.medals_enabled + global.medals_enabled = !global.medals_enabled - message_admins("[key_name_admin(src)] [GLOB.medals_enabled ? "disabled" : "enabled"] the medal hub lockout.") + message_admins("[key_name_admin(src)] [global.medals_enabled ? "disabled" : "enabled"] the medal hub lockout.") feedback_add_details("admin_verb","Toggle Medal Disable") // If... - log_admin("[key_name(src)] [GLOB.medals_enabled ? "disabled" : "enabled"] the medal hub lockout.") + log_admin("[key_name(src)] [global.medals_enabled ? "disabled" : "enabled"] the medal hub lockout.") /client/proc/view_runtimes() set category = "Debug" diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index 0f2ce94d31..d7b06ee9c8 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -224,7 +224,7 @@ var/agentcount = 0 for(var/i = 0, i 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/client/client_procs.dm b/code/modules/client/client_procs.dm index b4de0ebb0d..b78d4d5ff4 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -279,7 +279,7 @@ GLOBAL_LIST(external_rsc_urls) add_admin_verbs() to_chat(src, get_message_output("memo")) adminGreet() - if((GLOB.comms_key == "default_pwd" || length(GLOB.comms_key) <= 6) && GLOB.comms_allowed) //It's the default value or less than 6 characters long, but it somehow didn't disable comms. + if((global.comms_key == "default_pwd" || length(global.comms_key) <= 6) && global.comms_allowed) //It's the default value or less than 6 characters long, but it somehow didn't disable comms. to_chat(src, "The server's API key is either too short or is the default value! Consider changing it immediately!") /* if(mentor && !holder) diff --git a/code/modules/clothing/outfits/ert.dm b/code/modules/clothing/outfits/ert.dm index 83a8747252..b3f74b038f 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 6cc485a34c..d8a0c97f51 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 5b8a4ab50e..7c9c72437f 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/events/_event.dm b/code/modules/events/_event.dm index 9b97dddb0e..4046e7dcb8 100644 --- a/code/modules/events/_event.dm +++ b/code/modules/events/_event.dm @@ -78,7 +78,7 @@ triggering = FALSE message_admins("[key_name_admin(usr)] cancelled event [name].") log_admin_private("[key_name(usr)] cancelled event [name].") - feedback_add_details("admin_verb","Cancel Event: [typepath]") + feedback_add_details("event_admin_cancelled","[typepath]") /datum/round_event_control/proc/runEvent(random) var/datum/round_event/E = new typepath() diff --git a/code/modules/events/ghost_role.dm b/code/modules/events/ghost_role.dm index 87b72c5590..93eff54b27 100644 --- a/code/modules/events/ghost_role.dm +++ b/code/modules/events/ghost_role.dm @@ -63,7 +63,7 @@ else regular_candidates = list() - shuffle(regular_candidates) + shuffle_inplace(regular_candidates) var/list/candidates = priority_candidates + regular_candidates diff --git a/code/modules/events/shuttle_loan.dm b/code/modules/events/shuttle_loan.dm index c3d3505e39..60d7535e5a 100644 --- a/code/modules/events/shuttle_loan.dm +++ b/code/modules/events/shuttle_loan.dm @@ -7,7 +7,7 @@ /datum/round_event_control/shuttle_loan - name = "Shuttle loan" + name = "Shuttle Loan" typepath = /datum/round_event/shuttle_loan max_occurrences = 1 earliest_start = 4000 diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm index 5dc56ceac8..a80147ccc7 100644 --- a/code/modules/events/spacevine.dm +++ b/code/modules/events/spacevine.dm @@ -19,7 +19,7 @@ if(turfs.len) //Pick a turf to spawn at if we can var/turf/T = pick(turfs) - new/obj/effect/spacevine_controller(T) //spawn a controller at turf + new /datum/spacevine_controller(T) //spawn a controller at turf /datum/spacevine_mutation @@ -80,12 +80,7 @@ /datum/spacevine_mutation/space_covering/New() . = ..() if(!coverable_turfs) - coverable_turfs = typecacheof(list( - /turf/open/space - )) - coverable_turfs -= typecacheof(list( - /turf/open/space/transit - )) + coverable_turfs = typecacheof(list(/turf/open/space)) - /turf/open/space/transit /datum/spacevine_mutation/space_covering/on_grow(obj/structure/spacevine/holder) process_mutation(holder) @@ -324,10 +319,10 @@ obj_integrity = 50 max_integrity = 50 var/energy = 0 - var/obj/effect/spacevine_controller/master = null + var/datum/spacevine_controller/master = null var/list/mutations = list() -/obj/structure/spacevine/New() +/obj/structure/spacevine/Initialize() ..() add_atom_colour("#ffffff", FIXED_COLOUR_PRIORITY) @@ -347,13 +342,7 @@ for(var/datum/spacevine_mutation/SM in mutations) SM.on_death(src) if(master) - master.vines -= src - master.growth_queue -= src - if(!master.vines.len) - var/obj/item/seeds/kudzu/KZ = new(loc) - KZ.mutations |= mutations - KZ.set_potency(master.mutativeness * 10) - KZ.set_production((master.spread_cap / initial(master.spread_cap)) * 5) + master.VineDestroyed(src) mutations = list() set_opacity(0) if(has_buckled_mobs()) @@ -428,41 +417,49 @@ /obj/structure/spacevine/attack_alien(mob/living/user) eat(user) -/obj/effect/spacevine_controller - invisibility = INVISIBILITY_ABSTRACT - var/list/obj/structure/spacevine/vines = list() - var/list/growth_queue = list() +/datum/spacevine_controller + var/list/obj/structure/spacevine/vines + var/list/growth_queue var/spread_multiplier = 5 var/spread_cap = 30 - var/list/GLOB.mutations_list = list() + var/list/vine_mutations_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) +/datum/spacevine_controller/New(turf/location, list/muts, potency, production) + spawn_spacevine_piece(location, null, muts) START_PROCESSING(SSobj, src) - init_subtypes(/datum/spacevine_mutation/, GLOB.mutations_list) + vines = list() + growth_queue = list() + vine_mutations_list = list() + init_subtypes(/datum/spacevine_mutation/, vine_mutations_list) if(potency != null) mutativeness = potency / 10 if(production != null) spread_cap *= production / 5 spread_multiplier /= production / 5 - ..() -/obj/effect/spacevine_controller/ex_act() //only killing all vines will end this suffering - return +/datum/spacevine_controller/vv_drop_down/vv_get_dropdown() + . = ..() + . += "---" + .["Delete Vines"] = "?_src_=\ref[src];purge_vines=1" -/obj/effect/spacevine_controller/singularity_act() - return +/datum/spacevine_controller/Topic(href, href_list) + if(..() || !check_rights(R_ADMIN, FALSE)) + return + + if(href_list["purge_vines"]) + if(alert(usr, "Are you sure you want to delete this spacevine cluster?", "Delete Vines", "Yes", "No") != "Yes") + return + DeleteVines() -/obj/effect/spacevine_controller/singularity_pull() - return +/datum/spacevine_controller/proc/DeleteVines() //this is kill + QDEL_LIST(vines) //this will also qdel us -/obj/effect/spacevine_controller/Destroy() +/datum/spacevine_controller/Destroy() STOP_PROCESSING(SSobj, src) return ..() -/obj/effect/spacevine_controller/proc/spawn_spacevine_piece(turf/location, obj/structure/spacevine/parent, list/muts) +/datum/spacevine_controller/proc/spawn_spacevine_piece(turf/location, obj/structure/spacevine/parent, list/muts) var/obj/structure/spacevine/SV = new(location) growth_queue += SV vines += SV @@ -476,17 +473,28 @@ 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) SM.on_birth(SV) -/obj/effect/spacevine_controller/process() - if(!vines) +/datum/spacevine_controller/proc/VineDestroyed(obj/structure/spacevine/S) + S.master = null + vines -= S + growth_queue -= S + if(!vines.len) + var/obj/item/seeds/kudzu/KZ = new(S.loc) + KZ.mutations |= S.mutations + KZ.set_potency(mutativeness * 10) + KZ.set_production((spread_cap / initial(spread_cap)) * 5) + qdel(src) + +/datum/spacevine_controller/process() + if(!LAZYLEN(vines)) qdel(src) //space vines exterminated. Remove the controller return - if(!growth_queue) + if(!LAZYLEN(growth_queue)) qdel(src) //Sanity check return diff --git a/code/modules/events/wizard/rpgloot.dm b/code/modules/events/wizard/rpgloot.dm index d651400baa..98ae7ba6aa 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() diff --git a/code/modules/events/wizard/shuffle.dm b/code/modules/events/wizard/shuffle.dm index e1db066674..b6fe96ba97 100644 --- a/code/modules/events/wizard/shuffle.dm +++ b/code/modules/events/wizard/shuffle.dm @@ -21,8 +21,8 @@ if(!mobs) return - shuffle(moblocs) - shuffle(mobs) + shuffle_inplace(moblocs) + shuffle_inplace(mobs) for(var/mob/living/carbon/human/H in mobs) if(!moblocs) @@ -55,8 +55,8 @@ if(!mobs) return - shuffle(mobnames) - shuffle(mobs) + shuffle_inplace(mobnames) + shuffle_inplace(mobs) for(var/mob/living/carbon/human/H in mobs) if(!mobnames) @@ -89,7 +89,7 @@ if(!mobs) return - shuffle(mobs) + shuffle_inplace(mobs) var/obj/effect/proc_holder/spell/targeted/mind_transfer/swapper = new /obj/effect/proc_holder/spell/targeted/mind_transfer while(mobs.len > 1) diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index d735d8e534..cd034a1117 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/games/cas.dm b/code/modules/games/cas.dm index 4cc32d9d6a..c34325c904 100644 --- a/code/modules/games/cas.dm +++ b/code/modules/games/cas.dm @@ -51,7 +51,7 @@ P.name = "Blank Card" P.card_icon = "cas_white" cards += P - shuffle(cards) // distribute blank cards throughout deck + shuffle_inplace(cards) // distribute blank cards throughout deck ..() /obj/item/toy/cards/deck/cas/attack_hand(mob/user) diff --git a/code/modules/holodeck/area_copy.dm b/code/modules/holodeck/area_copy.dm index 09eee814b2..e8cde84d01 100644 --- a/code/modules/holodeck/area_copy.dm +++ b/code/modules/holodeck/area_copy.dm @@ -1,5 +1,5 @@ //Vars that will not be copied when using /DuplicateObject -GLOBAL_LIST_INIT(duplicate_forbidden_vars,list("area","type","loc","locs","vars", "parent","parent_type", "verbs","ckey","key","power_supply","contents","reagents","stat","x","y","z","group","atmos_adjacent_turfs")) +GLOBAL_LIST_INIT(duplicate_forbidden_vars,list("tag","area","type","loc","locs","vars", "parent","parent_type", "verbs","ckey","key","power_supply","contents","reagents","stat","x","y","z","group","atmos_adjacent_turfs")) /proc/DuplicateObject(atom/original, perfectcopy = TRUE, sameloc = FALSE, atom/newloc = null, nerf = FALSE, holoitem=FALSE) if(!original) diff --git a/code/modules/hydroponics/grown/kudzu.dm b/code/modules/hydroponics/grown/kudzu.dm index d5cf0f0b97..60ff69a323 100644 --- a/code/modules/hydroponics/grown/kudzu.dm +++ b/code/modules/hydroponics/grown/kudzu.dm @@ -38,7 +38,7 @@ to_chat(user, "You plant [src].") message_admins("Kudzu planted by [ADMIN_LOOKUPFLW(user)] at [ADMIN_COORDJMP(user)]",0,1) investigate_log("was planted by [key_name(user)] at [COORD(user)]","botany") - new /obj/effect/spacevine_controller(user.loc, mutations, potency, production) + new /datum/spacevine_controller(get_turf(user), mutations, potency, production) qdel(src) /obj/item/seeds/kudzu/attack_self(mob/user) diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm index 15f5fc948d..31bb564a06 100644 --- a/code/modules/hydroponics/plant_genes.dm +++ b/code/modules/hydroponics/plant_genes.dm @@ -374,7 +374,7 @@ if(CG) // 10x charge for deafult cell charge gene - 20 000 with 100 potency. pocell.maxcharge *= CG.rate*1000 pocell.charge = pocell.maxcharge - pocell.name = "[G] battery" + pocell.name = "[G.name] battery" pocell.desc = "A rechargable plant based power cell. This one has a power rating of [pocell.maxcharge], and you should not swallow it." if(G.reagents.has_reagent("plasma", 2)) diff --git a/code/modules/mapping/map_template.dm b/code/modules/mapping/map_template.dm index ca576d24e6..d47c4da04b 100644 --- a/code/modules/mapping/map_template.dm +++ b/code/modules/mapping/map_template.dm @@ -46,7 +46,7 @@ var/x = round(world.maxx/2) var/y = round(world.maxy/2) - var/list/bounds = maploader.load_map(get_file(), x, y) + var/list/bounds = maploader.load_map(file(mappath), x, y) if(!bounds) return FALSE @@ -67,7 +67,7 @@ if(T.y+height > world.maxy) return - var/list/bounds = maploader.load_map(get_file(), T.x, T.y, T.z, cropMap=TRUE) + var/list/bounds = maploader.load_map(file(mappath), T.x, T.y, T.z, cropMap=TRUE) if(!bounds) return @@ -77,13 +77,6 @@ log_game("[name] loaded at at [T.x],[T.y],[T.z]") return TRUE -/datum/map_template/proc/get_file() - if(mappath) - . = file(mappath) - - if(!.) - world.log << "The file of [src] ([mappath]) appears to be empty/non-existent." - /datum/map_template/proc/get_affected_turfs(turf/T, centered = FALSE) var/turf/placement = T if(centered) diff --git a/code/modules/mining/aux_base_camera.dm b/code/modules/mining/aux_base_camera.dm index fcbced3210..ebcd35f6df 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/mining/equipment.dm b/code/modules/mining/equipment.dm index 2b10ab0553..02a752c2d7 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 630359d402..92a764d10c 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/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm index 526f726c52..dc6bc87d18 100644 --- a/code/modules/mining/machine_vending.dm +++ b/code/modules/mining/machine_vending.dm @@ -51,9 +51,6 @@ new /datum/data/mining_equipment("Drone Ranged Upgrade",/obj/item/device/mine_bot_ugprade/cooldown, 600), new /datum/data/mining_equipment("Drone AI Upgrade", /obj/item/slimepotion/sentience/mining, 1000), new /datum/data/mining_equipment("Jump Boots", /obj/item/clothing/shoes/bhop, 2500), - new /datum/data/mining_equipment("Survival Knife", /obj/item/weapon/kitchen/knife/combat/survival, 350), - new /datum/data/mining_equipment("Stimpack", /obj/item/weapon/reagent_containers/hypospray/medipen/stimpack, 250), - new /datum/data/mining_equipment("Stimpack Economy Pack",/obj/item/weapon/storage/box/medipens/utility, 1000) ) /datum/data/mining_equipment diff --git a/code/modules/mob/living/carbon/alien/emote.dm b/code/modules/mob/living/carbon/alien/emote.dm new file mode 100644 index 0000000000..e97bb785bf --- /dev/null +++ b/code/modules/mob/living/carbon/alien/emote.dm @@ -0,0 +1,30 @@ +/datum/emote/living/alien + mob_type_allowed_typecache = list(/mob/living/carbon/alien) + +/datum/emote/living/alien/gnarl + key = "gnarl" + key_third_person = "gnarls" + message = "gnarls and shows its teeth..." + +/datum/emote/living/alien/hiss + key = "hiss" + key_third_person = "hisses" + message_alien = "hisses." + message_larva = "hisses softly." + +/datum/emote/living/alien/hiss/run_emote(mob/user, params) + . = ..() + if(. && isalienadult(user)) + playsound(user.loc, "hiss", 40, 1, 1) + +/datum/emote/living/alien/roar + key = "roar" + key_third_person = "roars" + message_alien = "roars" + message_larva = "softly roars" + emote_type = EMOTE_AUDIBLE + +/datum/emote/living/alien/roar/run_emote(mob/user, params) + . = ..() + if(. && isalienadult(user)) + playsound(user.loc, 'sound/voice/hiss5.ogg', 40, 1, 1) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/humanoid/emote.dm b/code/modules/mob/living/carbon/alien/humanoid/emote.dm deleted file mode 100644 index c6501be357..0000000000 --- a/code/modules/mob/living/carbon/alien/humanoid/emote.dm +++ /dev/null @@ -1,88 +0,0 @@ -/mob/living/carbon/alien/humanoid/emote(act,m_type=1,message = null) - - var/param = null - if (findtext(act, "-", 1, null)) - var/t1 = findtext(act, "-", 1, null) - param = copytext(act, t1 + 1, length(act) + 1) - act = copytext(act, 1, t1) - - var/muzzled = is_muzzled() - - switch(act) //Alphabetical please - if ("deathgasp","deathgasps") - message = "[src] lets out a waning guttural screech, green blood bubbling from its maw..." - m_type = 2 - - if ("gnarl","gnarls") - if (!muzzled) - message = "[src] gnarls and shows its teeth.." - m_type = 2 - - if ("hiss","hisses") - if(!muzzled) - message = "[src] hisses." - m_type = 2 - - if ("me") - ..() - return - - if ("moan","moans") - message = "[src] moans!" - m_type = 2 - - if ("roar","roars") - if (!muzzled) - message = "[src] roars." - m_type = 2 - - if ("roll","rolls") - if (!src.restrained()) - message = "[src] rolls." - m_type = 1 - - if ("scratch","scratches") - if (!src.restrained()) - message = "[src] scratches." - m_type = 1 - - if ("screech","screeches") - if (!muzzled) - message = "[src] screeches." - m_type = 2 - - if ("shiver","shivers") - message = "[src] shivers." - m_type = 2 - - if ("sign","signs") - if (!src.restrained()) - message = text("[src] signs[].", (text2num(param) ? text(" the number []", text2num(param)) : null)) - m_type = 1 - - if ("tail") - message = "[src] waves its tail." - m_type = 1 - - if ("help") //This is an exception - src << "Help for xenomorph emotes. You can use these emotes with say \"*emote\":\n\naflap, airguitar, blink, blink_r, blush, bow, burp, choke, chucke, clap, collapse, cough, dance, deathgasp, drool, flap, frown, gasp, giggle, glare-(none)/mob, gnarl, hiss, jump, laugh, look-atom, me, moan, nod, point-atom, roar, roll, scream, scratch, screech, shake, shiver, sign-#, sit, smile, sneeze, sniff, snore, stare-(none)/mob, sulk, sway, tail, tremble, twitch, twitch_s, wave, whimper, wink, yawn" - - else - ..(act) - - if ((message && src.stat == 0)) - log_emote("[name]/[key] : [message]") - if (act == "roar") - playsound(src.loc, 'sound/voice/hiss5.ogg', 40, 1, 1) - - if (act == "hiss") - playsound(src.loc, "hiss", 40, 1, 1) - - if (act == "deathgasp") - playsound(src.loc, 'sound/voice/hiss6.ogg', 80, 1, 1) - - if (m_type & 1) - visible_message(message) - else - audible_message(message) - return \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 6349e48edc..213477674a 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -234,9 +234,11 @@ if(usr.canUseTopic(src, BE_CLOSE, NO_DEXTERY)) if(href_list["embedded_object"]) - var/obj/item/I = locate(href_list["embedded_object"]) - var/obj/item/bodypart/L = locate(href_list["embedded_limb"]) - if(!I || !L || I.loc != src || !(I in L.embedded_objects)) //no item, no limb, or item is not in limb or in the person anymore + var/obj/item/bodypart/L = locate(href_list["embedded_limb"]) in bodyparts + if(!L) + return + var/obj/item/I = locate(href_list["embedded_object"]) in L.embedded_objects + if(!I || I.loc != src) //no item, no limb, or item is not in limb or in the person anymore return var/time_taken = I.embedded_unsafe_removal_time*I.w_class usr.visible_message("[usr] attempts to remove [I] from their [L.name].","You attempt to remove [I] from your [L.name]... (It will take [time_taken/10] seconds.)") @@ -921,18 +923,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() diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index d41b90ed3d..d34ea0b0a4 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -685,7 +685,7 @@ to_chat(src, "\t [status == "OK" ? "\blue" : "\red"] Your [LB.name] is [status].") for(var/obj/item/I in LB.embedded_objects) - to_chat(src, "\t \red There is \a [I] embedded in your [LB.name]!") + to_chat(src, "\t There is \a [I] embedded in your [LB.name]!") for(var/t in missing) to_chat(src, "Your [parse_zone(t)] is missing!") diff --git a/code/modules/mob/living/carbon/human/interactive.dm b/code/modules/mob/living/carbon/human/interactive.dm index 744e8f9844..f80e949ede 100644 --- a/code/modules/mob/living/carbon/human/interactive.dm +++ b/code/modules/mob/living/carbon/human/interactive.dm @@ -277,7 +277,7 @@ for(var/X in bodyparts) var/obj/item/bodypart/BP = X if(prob((FUZZY_CHANCE_LOW+FUZZY_CHANCE_HIGH)/4)) - BP.change_bodypart_status(BODYPART_ROBOTIC) + BP.change_bodypart_status(BODYPART_ROBOTIC, FALSE, TRUE) update_icons() update_damage_overlays() functions = list("nearbyscan","combat","shitcurity","chatter") // stop customize adding multiple copies of a function diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 2afa202bfa..331fc5fc95 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 diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 57bfb42623..8a062b9e33 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -117,6 +117,12 @@ 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") var/obj/item/organ/appendix/appendix = C.getorganslot("appendix") @@ -157,10 +163,7 @@ 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) + if(NOAROUSAL in species_traits) C.canbearoused = FALSE else diff --git a/code/modules/mob/living/carbon/human/species_types/android.dm b/code/modules/mob/living/carbon/human/species_types/android.dm index 3a6a45b721..f211de52bc 100644 --- a/code/modules/mob/living/carbon/human/species_types/android.dm +++ b/code/modules/mob/living/carbon/human/species_types/android.dm @@ -12,10 +12,10 @@ . = ..() for(var/X in C.bodyparts) var/obj/item/bodypart/O = X - O.change_bodypart_status(BODYPART_ROBOTIC) + O.change_bodypart_status(BODYPART_ROBOTIC, 0, 1) /datum/species/android/on_species_loss(mob/living/carbon/C) . = ..() for(var/X in C.bodyparts) var/obj/item/bodypart/O = X - O.change_bodypart_status(BODYPART_ORGANIC) \ No newline at end of file + O.change_bodypart_status(BODYPART_ORGANIC,FALSE, TRUE) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/monkey/combat.dm b/code/modules/mob/living/carbon/monkey/combat.dm index 7eed766eaa..c6c50252d7 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)) diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 4abba829be..39040b983c 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/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index 1eec40c264..e49e412047 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 diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm index 24b8b9b1ee..2e64ee526e 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm @@ -326,7 +326,7 @@ Difficulty: Hard pools_to_remove = get_pools(get_turf(target), 1) pools -= pools_to_remove if(pools.len) - shuffle(pools) + shuffle_inplace(pools) found_bloodpool = pick(pools) if(found_bloodpool) visible_message("[src] sinks into the blood...") diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm index dcb37610cf..8af5c76f5b 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm @@ -118,7 +118,7 @@ if(admin_spawned) return FALSE - if(GLOB.medal_hub && GLOB.medal_pass && GLOB.medals_enabled) + if(global.medal_hub && global.medal_pass && global.medals_enabled) for(var/mob/living/L in view(7,src)) if(L.stat) continue @@ -135,11 +135,11 @@ if(!player || !medal) return - if(GLOB.medal_hub && GLOB.medal_pass && GLOB.medals_enabled) + if(global.medal_hub && global.medal_pass && global.medals_enabled) spawn() - var/result = world.SetMedal(medal, player, GLOB.medal_hub, GLOB.medal_pass) + var/result = world.SetMedal(medal, player, global.medal_hub, global.medal_pass) if(isnull(result)) - GLOB.medals_enabled = FALSE + global.medals_enabled = FALSE log_game("MEDAL ERROR: Could not contact hub to award medal:[medal] player:[player.ckey]") message_admins("Error! Failed to contact hub to award [medal] medal to [player.ckey]!") else if (result) @@ -150,7 +150,7 @@ if(!score || !player) return - if(GLOB.medal_hub && GLOB.medal_pass && GLOB.medals_enabled) + if(global.medal_hub && global.medal_pass && global.medals_enabled) spawn() var/list/oldscore = GetScore(score,player,1) @@ -164,10 +164,10 @@ var/newscoreparam = list2params(oldscore) - var/result = world.SetScores(player.ckey, newscoreparam, GLOB.medal_hub, GLOB.medal_pass) + var/result = world.SetScores(player.ckey, newscoreparam, global.medal_hub, global.medal_pass) if(isnull(result)) - GLOB.medals_enabled = FALSE + global.medals_enabled = FALSE log_game("SCORE ERROR: Could not contact hub to set score. Score:[score] player:[player.ckey]") message_admins("Error! Failed to contact hub to set [score] score for [player.ckey]!") @@ -176,11 +176,11 @@ if(!score || !player) return - if(GLOB.medal_hub && GLOB.medal_pass && GLOB.medals_enabled) + if(global.medal_hub && global.medal_pass && global.medals_enabled) - var/scoreget = world.GetScores(player.ckey, score, GLOB.medal_hub, GLOB.medal_pass) + var/scoreget = world.GetScores(player.ckey, score, global.medal_hub, global.medal_pass) if(isnull(scoreget)) - GLOB.medals_enabled = FALSE + global.medals_enabled = FALSE log_game("SCORE ERROR: Could not contact hub to get score. Score:[score] player:[player.ckey]") message_admins("Error! Failed to contact hub to get score: [score] for [player.ckey]!") return @@ -197,12 +197,12 @@ if(!player || !medal) return - if(GLOB.medal_hub && GLOB.medal_pass && GLOB.medals_enabled) + if(global.medal_hub && global.medal_pass && global.medals_enabled) - var/result = world.GetMedal(medal, player, GLOB.medal_hub, GLOB.medal_pass) + var/result = world.GetMedal(medal, player, global.medal_hub, global.medal_pass) if(isnull(result)) - GLOB.medals_enabled = FALSE + global.medals_enabled = FALSE log_game("MEDAL ERROR: Could not contact hub to get medal:[medal] player:[player.ckey]") message_admins("Error! Failed to contact hub to get [medal] medal for [player.ckey]!") else if (result) @@ -212,12 +212,12 @@ if(!player || !medal) return - if(GLOB.medal_hub && GLOB.medal_pass && GLOB.medals_enabled) + if(global.medal_hub && global.medal_pass && global.medals_enabled) - var/result = world.ClearMedal(medal, player, GLOB.medal_hub, GLOB.medal_pass) + var/result = world.ClearMedal(medal, player, global.medal_hub, global.medal_pass) if(isnull(result)) - GLOB.medals_enabled = FALSE + global.medals_enabled = FALSE log_game("MEDAL ERROR: Could not contact hub to clear medal:[medal] player:[player.ckey]") message_admins("Error! Failed to contact hub to clear [medal] medal for [player.ckey]!") else if (result) @@ -227,6 +227,6 @@ /proc/ClearScore(client/player) - world.SetScores(player.ckey, "", GLOB.medal_hub, GLOB.medal_pass) + world.SetScores(player.ckey, "", global.medal_hub, global.medal_pass) #undef MEDAL_PREFIX diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm index 0afd30e137..ca0ef6a7ea 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm @@ -1014,7 +1014,7 @@ last_tendril = FALSE break if(last_tendril && !admin_spawned) - if(GLOB.medal_hub && GLOB.medal_pass && GLOB.medals_enabled) + if(global.medal_hub && global.medal_pass && global.medals_enabled) for(var/mob/living/L in view(7,src)) if(L.stat) continue diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 6a11e28e80..72fe84de45 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -253,7 +253,7 @@ /obj/item/weapon/paper/proc/openhelp(mob/user) - user << browse({"Pen Help + user << browse({"Paper Help
Crayon&Pen commands


@@ -279,6 +279,9 @@ if(usr.stat || usr.restrained()) return + if(href_list["help"]) + openhelp(usr) + return if(href_list["write"]) var/id = href_list["write"] var/t = stripped_multiline_input("Enter what you want to write:", "Write", no_trim=TRUE) @@ -303,7 +306,7 @@ info += t // Oh, he wants to edit to the end of the file, let him. updateinfolinks() i.on_write(src,usr) - usr << browse("[name][info_links]
[stamps]", "window=[name]") // Update the window + usr << browse("[name][info_links]
[stamps]", "window=[name]") // Update the window update_icon() @@ -318,7 +321,7 @@ if(istype(P, /obj/item/weapon/pen) || istype(P, /obj/item/toy/crayon)) if(user.is_literate()) - user << browse("[name][info_links]
[stamps]", "window=[name]") + user << browse("[name][info_links]
[stamps]", "window=[name]") return else to_chat(user, "You don't know how to read or write.") diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 2b9c212d17..401c745b0f 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -89,6 +89,10 @@ c.fields = copy.fields c.update_icon() c.updateinfolinks() + c.stamps = copy.stamps + if(copy.stamped) + c.stamped = copy.stamped.Copy() + c.copy_overlays(copy, TRUE) toner-- busy = 1 sleep(15) diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 5ea803ed74..133fad1b4d 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -350,9 +350,7 @@ else to_chat(user, "You stick \the [W] into the light socket!") if(has_power() && (W.flags & CONDUCT)) - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(3, 1, src) - s.start() + do_sparks(3, TRUE, src) if (prob(75)) electrocute_mob(user, get_area(src), src, rand(0.7,1.0), TRUE) else @@ -523,9 +521,7 @@ if(status == LIGHT_OK || status == LIGHT_BURNED) playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1) if(on) - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(3, 1, src) - s.start() + do_sparks(3, TRUE, src) status = LIGHT_BROKEN update() @@ -653,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/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm index 5f2c050c17..c3bf399ed1 100644 --- a/code/modules/power/singularity/containment_field.dm +++ b/code/modules/power/singularity/containment_field.dm @@ -123,9 +123,7 @@ if(hasShocked) return 0 hasShocked = 1 - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(5, 1, AM.loc) - s.start() + do_sparks(5, TRUE, AM.loc) var/atom/target = get_edge_target_turf(AM, get_dir(src, get_step_away(AM, src))) AM.throw_at(target, 200, 4) addtimer(CALLBACK(src, .proc/clear_shock), 5) diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index 1fa2bf2376..50a24b76ff 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 @@ -28,6 +31,8 @@ var/projectile_sound = 'sound/weapons/emitter.ogg' + var/datum/effect_system/spark_spread/sparks + /obj/machinery/power/emitter/New() ..() var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/emitter(null) @@ -87,11 +92,15 @@ if(state == 2 && anchored) connect_to_network() + sparks = new + sparks.set_up(5, TRUE, src) + /obj/machinery/power/emitter/Destroy() if(SSticker && SSticker.current_state == GAME_STATE_PLAYING) message_admins("Emitter deleted at ([x],[y],[z] - JMP)",0,1) log_game("Emitter deleted at ([x],[y],[z])") investigate_log("deleted at ([x],[y],[z]) at [get_area(src)]","singulo") + QDEL_NULL(sparks) return ..() /obj/machinery/power/emitter/update_icon() @@ -168,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) @@ -186,36 +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)) - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(5, 1, src) - s.start() + 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) @@ -308,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/code/modules/power/smes.dm b/code/modules/power/smes.dm index de0d230a39..e03eaf944a 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -152,9 +152,7 @@ return var/obj/structure/cable/N = T.get_cable_node() //get the connecting node cable, if there's one if (prob(50) && electrocute_mob(usr, N, N, 1, TRUE)) //animate the electrocution if uncautious and unlucky - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(5, 1, src) - s.start() + do_sparks(5, TRUE, src) return C.use(10) diff --git a/code/modules/power/terminal.dm b/code/modules/power/terminal.dm index bfe94d5516..5cae8b3c91 100644 --- a/code/modules/power/terminal.dm +++ b/code/modules/power/terminal.dm @@ -62,9 +62,7 @@ if(do_after(user, 50*W.toolspeed, target = src)) if(!master || master.can_terminal_dismantle()) if(prob(50) && electrocute_mob(user, powernet, src, 1, TRUE)) - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(5, 1, master) - s.start() + do_sparks(5, TRUE, master) return new /obj/item/stack/cable_coil(loc, 10) to_chat(user, "You cut the cables and dismantle the power terminal.") diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm index 907082cc8b..2347cc3c7c 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 diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index 9ac83c5f5f..7ef0d31561 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -49,10 +49,8 @@ ..() /obj/item/projectile/bullet/pellet/weak/on_range() - var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread - sparks.set_up(1, 1, src) - sparks.start() - ..() + do_sparks(1, TRUE, src) + ..() /obj/item/projectile/bullet/pellet/overload damage = 3 @@ -66,11 +64,9 @@ explosion(target, 0, 0, 2) /obj/item/projectile/bullet/pellet/overload/on_range() - explosion(src, 0, 0, 2) - var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread - sparks.set_up(3, 3, src) - sparks.start() - ..() + explosion(src, 0, 0, 2) + do_sparks(3, TRUE, src) + ..() /obj/item/projectile/bullet/midbullet damage = 20 diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm index 980ff11211..fca31019ff 100644 --- a/code/modules/projectiles/projectile/energy.dm +++ b/code/modules/projectiles/projectile/energy.dm @@ -21,9 +21,7 @@ /obj/item/projectile/energy/electrode/on_hit(atom/target, blocked = 0) . = ..() if(!ismob(target) || blocked >= 100) //Fully blocked by mob or collided with dense object - burst into sparks! - var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread - sparks.set_up(1, 1, src) - sparks.start() + do_sparks(1, TRUE, src) else if(iscarbon(target)) var/mob/living/carbon/C = target if(C.dna && C.dna.check_mutation(HULK)) @@ -32,9 +30,7 @@ addtimer(CALLBACK(C, /mob/living/carbon.proc/do_jitter_animation, jitter), 5) /obj/item/projectile/energy/electrode/on_range() //to ensure the bolt sparks when it reaches the end of its range if it didn't hit a target yet - var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread - sparks.set_up(1, 1, src) - sparks.start() + do_sparks(1, TRUE, src) ..() /obj/item/projectile/energy/net @@ -45,7 +41,7 @@ hitsound = 'sound/weapons/taserhit.ogg' range = 10 -/obj/item/projectile/energy/net/New() +/obj/item/projectile/energy/net/Initialize() ..() SpinAnimation() @@ -53,13 +49,11 @@ if(isliving(target)) var/turf/Tloc = get_turf(target) if(!locate(/obj/effect/nettingportal) in Tloc) - new/obj/effect/nettingportal(Tloc) + new /obj/effect/nettingportal(Tloc) ..() /obj/item/projectile/energy/net/on_range() - var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread - sparks.set_up(1, 1, src) - sparks.start() + do_sparks(1, TRUE, src) ..() /obj/effect/nettingportal @@ -69,7 +63,7 @@ icon_state = "dragnetfield" anchored = 1 -/obj/effect/nettingportal/New() +/obj/effect/nettingportal/Initialize() ..() set_light(3) var/obj/item/device/radio/beacon/teletarget = null @@ -77,16 +71,18 @@ if(com.target) if(com.power_station && com.power_station.teleporter_hub && com.power_station.engaged) teletarget = com.target + + addtimer(CALLBACK(src, .proc/pop, teletarget), 30) + +/obj/effect/nettingportal/proc/pop(teletarget) if(teletarget) - spawn(30) - for(var/mob/living/L in get_turf(src)) - do_teleport(L, teletarget, 2)//teleport what's in the tile to the beacon - qdel(src) + for(var/mob/living/L in get_turf(src)) + do_teleport(L, teletarget, 2)//teleport what's in the tile to the beacon else - spawn(30) - for(var/mob/living/L in get_turf(src)) - do_teleport(L, L, 15) //Otherwise it just warps you off somewhere. - qdel(src) + for(var/mob/living/L in get_turf(src)) + do_teleport(L, L, 15) //Otherwise it just warps you off somewhere. + + qdel(src) /obj/item/projectile/energy/trap @@ -106,7 +102,7 @@ ..() /obj/item/projectile/energy/trap/on_range() - new/obj/item/weapon/restraints/legcuffs/beartrap/energy(loc) + new /obj/item/weapon/restraints/legcuffs/beartrap/energy(loc) ..() /obj/item/projectile/energy/trap/cyborg @@ -119,21 +115,16 @@ /obj/item/projectile/energy/trap/cyborg/on_hit(atom/target, blocked = 0) if(!ismob(target) || blocked >= 100) - var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread - sparks.set_up(1, 1, src) - sparks.start() + do_sparks(1, TRUE, src) qdel(src) if(iscarbon(target)) var/obj/item/weapon/restraints/legcuffs/beartrap/B = new /obj/item/weapon/restraints/legcuffs/beartrap/energy/cyborg(get_turf(target)) B.Crossed(target) - spawn(10) - qdel(src) + QDEL_IN(src, 10) ..() /obj/item/projectile/energy/trap/cyborg/on_range() - var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread - sparks.set_up(1, 1, src) - sparks.start() + do_sparks(1, TRUE, src) qdel(src) /obj/item/projectile/energy/declone diff --git a/code/modules/reagents/chemistry/reagents/blob_reagents.dm b/code/modules/reagents/chemistry/reagents/blob_reagents.dm index e940081db3..948da607f8 100644 --- a/code/modules/reagents/chemistry/reagents/blob_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/blob_reagents.dm @@ -261,7 +261,6 @@ color = "#EFD65A" complementary_color = "#00E5B1" message_living = ", and you feel a horrible tingling sensation" - var/datum/effect_system/spark_spread/spark_system = new/datum/effect_system/spark_spread() /datum/reagent/blob/energized_jelly/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O) reac_volume = ..() @@ -272,8 +271,7 @@ /datum/reagent/blob/energized_jelly/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag) if((damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser") && B.obj_integrity - damage <= 0 && prob(10)) - spark_system.set_up(rand(2, 4), 0, B) - spark_system.start() + do_sparks(rand(2, 4), FALSE, B) return ..() /datum/reagent/blob/energized_jelly/tesla_reaction(obj/structure/blob/B, power) diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index 0357f0dbdc..805aa936d4 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -216,9 +216,7 @@ if(holder.has_reagent("stabilizing_agent")) return var/location = get_turf(holder.my_atom) - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(2, 1, location) - s.start() + do_sparks(2, TRUE, location) for(var/mob/living/carbon/C in get_hearers_in_view(created_volume/3, location)) if(C.flash_act()) if(get_dist(C, location) < 4) @@ -235,9 +233,7 @@ /datum/chemical_reaction/flash_powder_flash/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(2, 1, location) - s.start() + do_sparks(2, TRUE, location) for(var/mob/living/carbon/C in get_hearers_in_view(created_volume/10, location)) if(C.flash_act()) if(get_dist(C, location) < 4) @@ -402,4 +398,4 @@ required_reagents = list("nitrous_oxide" = 1) strengthdiv = 7 required_temp = 575 - modifier = 1 \ No newline at end of file + modifier = 1 diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm index 7246a26ce5..f270fa567f 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/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 46f9754116..34d422da92 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -61,7 +61,7 @@ /obj/item/weapon/reagent_containers/spray/proc/spray(atom/A) - var/range = max(min(spray_range, get_dist(src, A)), 1) + var/range = max(min(current_range, get_dist(src, A)), 1) var/obj/effect/decal/chempuff/D = new /obj/effect/decal/chempuff(get_turf(src)) D.create_reagents(amount_per_transfer_from_this) var/puff_reagent_left = range //how many turf, mob or dense objet we can react with before we consider the chem puff consumed @@ -169,6 +169,12 @@ amount_per_transfer_from_this = 5 list_reagents = list("condensedcapsaicin" = 40) +// Fix pepperspraying yourself +/obj/item/weapon/reagent_containers/spray/pepper/afterattack(atom/A as mob|obj, mob/user) + if (A.loc == user) + return + ..() + //water flower /obj/item/weapon/reagent_containers/spray/waterflower name = "water flower" @@ -200,6 +206,11 @@ volume = 600 origin_tech = "combat=3;materials=3;engineering=3" +/obj/item/weapon/reagent_containers/spray/chemsprayer/afterattack(atom/A as mob|obj, mob/user) + // Make it so the bioterror spray doesn't spray yourself when you click your inventory items + if (A.loc == user) + return + ..() /obj/item/weapon/reagent_containers/spray/chemsprayer/spray(atom/A) var/direction = get_dir(src, A) diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index 28b5a893a9..9f2fbda1f3 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 e9bc353715..c8f580cc34 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/code/modules/research/rdmachines.dm b/code/modules/research/rdmachines.dm index 741c13a14a..4dfcf3ff85 100644 --- a/code/modules/research/rdmachines.dm +++ b/code/modules/research/rdmachines.dm @@ -30,9 +30,7 @@ return 0 if(!prob(prb)) return 0 - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(5, 1, src) - s.start() + do_sparks(5, TRUE, src) if (electrocute_mob(user, get_area(src), src, 0.7, TRUE)) return 1 else diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index f31cd01131..38d742c5be 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 diff --git a/code/modules/spells/spell.dm b/code/modules/spells/spell.dm index 3de937a15e..bdab8b6c22 100644 --- a/code/modules/spells/spell.dm +++ b/code/modules/spells/spell.dm @@ -295,9 +295,7 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th if(isliving(target) && message) to_chat(target, text("[message]")) if(sparks_spread) - var/datum/effect_system/spark_spread/sparks = new - sparks.set_up(sparks_amt, 0, location) //no idea what the 0 is - sparks.start() + do_sparks(sparks_amt, FALSE, location) if(smoke_spread) if(smoke_spread == 1) var/datum/effect_system/smoke_spread/smoke = new diff --git a/code/modules/spells/spell_types/godhand.dm b/code/modules/spells/spell_types/godhand.dm index c1d9707ce4..20d223354b 100644 --- a/code/modules/spells/spell_types/godhand.dm +++ b/code/modules/spells/spell_types/godhand.dm @@ -50,9 +50,7 @@ if(!proximity || target == user || !ismob(target) || !iscarbon(user) || user.lying || user.handcuffed) //exploding after touching yourself would be bad return var/mob/M = target - var/datum/effect_system/spark_spread/sparks = new - sparks.set_up(4, 0, M.loc) //no idea what the 0 is - sparks.start() + do_sparks(4, FALSE, M.loc) M.gib() ..() @@ -73,4 +71,4 @@ var/mob/living/M = target M.Stun(2) M.petrify() - ..() \ No newline at end of file + ..() diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm index 167ccf62f7..56d35be23b 100644 --- a/code/modules/surgery/bodyparts/bodyparts.dm +++ b/code/modules/surgery/bodyparts/bodyparts.dm @@ -183,13 +183,20 @@ //Change organ status -/obj/item/bodypart/proc/change_bodypart_status(new_limb_status, heal_limb) +/obj/item/bodypart/proc/change_bodypart_status(new_limb_status, heal_limb, change_icon_to_default) status = new_limb_status if(heal_limb) burn_dam = 0 brute_dam = 0 brutestate = 0 burnstate = 0 + + if(change_icon_to_default) + if(status == BODYPART_ORGANIC) + icon = DEFAULT_BODYPART_ICON_ORGANIC + else if(status == BODYPART_ROBOTIC) + icon = DEFAULT_BODYPART_ICON_ROBOTIC + if(owner) owner.updatehealth() owner.update_body() //if our head becomes robotic, we remove the lizard horns and human hair. diff --git a/code/modules/surgery/bodyparts/robot_bodyparts.dm b/code/modules/surgery/bodyparts/robot_bodyparts.dm index d9b51a19a5..00a01e2d2e 100644 --- a/code/modules/surgery/bodyparts/robot_bodyparts.dm +++ b/code/modules/surgery/bodyparts/robot_bodyparts.dm @@ -187,5 +187,5 @@ name = "surplus prosthetic right leg" desc = "A skeletal, robotic limb. Outdated and fragile, but it's still better than nothing." icon = 'icons/mob/surplus_augments.dmi' - icon_state = "surplus_r_leg" + icon_state = "r_leg" max_damage = 20 diff --git a/code/modules/surgery/limb_augmentation.dm b/code/modules/surgery/limb_augmentation.dm index e25c06cffb..aaea6de1d5 100644 --- a/code/modules/surgery/limb_augmentation.dm +++ b/code/modules/surgery/limb_augmentation.dm @@ -50,7 +50,7 @@ /datum/surgery_step/add_limb/success(mob/user, mob/living/carbon/target, target_zone, obj/item/bodypart/tool, datum/surgery/surgery) if(L) user.visible_message("[user] successfully augments [target]'s [parse_zone(target_zone)]!", "You successfully augment [target]'s [parse_zone(target_zone)].") - L.change_bodypart_status(BODYPART_ROBOTIC, 1) + L.change_bodypart_status(BODYPART_ROBOTIC, TRUE) L.icon = tool.icon L.max_damage = tool.max_damage user.drop_item() diff --git a/code/modules/surgery/remove_embedded_object.dm b/code/modules/surgery/remove_embedded_object.dm index f2c1e143b6..b791586e22 100644 --- a/code/modules/surgery/remove_embedded_object.dm +++ b/code/modules/surgery/remove_embedded_object.dm @@ -28,6 +28,8 @@ objects++ I.loc = get_turf(H) L.embedded_objects -= I + if(!H.has_embedded_objects()) + H.clear_alert("embeddedobject") if(objects > 0) user.visible_message("[user] sucessfully removes [objects] objects from [H]'s [L]!", "You successfully remove [objects] objects from [H]'s [L.name].") diff --git a/code/modules/telesci/telepad.dm b/code/modules/telesci/telepad.dm index e681a0693d..d4e49215ad 100644 --- a/code/modules/telesci/telepad.dm +++ b/code/modules/telesci/telepad.dm @@ -167,8 +167,6 @@ /obj/item/weapon/rcs/emag_act(mob/user) if(!emagged) - emagged = 1 - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(5, 1, src) - s.start() + emagged = TRUE + do_sparks(5, TRUE, src) to_chat(user, "You emag the RCS. Click on it to toggle between modes.") diff --git a/code/modules/telesci/telesci_computer.dm b/code/modules/telesci/telesci_computer.dm index d9d5486736..8b4ff36c05 100644 --- a/code/modules/telesci/telesci_computer.dm +++ b/code/modules/telesci/telesci_computer.dm @@ -139,20 +139,14 @@ var/datum/browser/popup = new(user, "telesci", name, 300, 500) popup.set_content(t) popup.open() - return /obj/machinery/computer/telescience/proc/sparks() if(telepad) - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(5, 1, get_turf(telepad)) - s.start() - else - return + do_sparks(5, TRUE, get_turf(telepad)) /obj/machinery/computer/telescience/proc/telefail() sparks() visible_message("The telepad weakly fizzles.") - return /obj/machinery/computer/telescience/proc/doteleport(mob/user) @@ -201,9 +195,7 @@ // use a lot of power use_power(power * 10) - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(5, 1, get_turf(telepad)) - s.start() + do_sparks(5, TRUE, get_turf(telepad)) temp_msg = "Teleport successful.
" if(teles_left < 10) @@ -211,10 +203,7 @@ else temp_msg += "Data printed below." - var/sparks = get_turf(target) - var/datum/effect_system/spark_spread/y = new /datum/effect_system/spark_spread - y.set_up(5, 1, sparks) - y.start() + do_sparks(5, TRUE, get_turf(target)) var/turf/source = target var/turf/dest = get_turf(telepad) diff --git a/code/modules/tooltip/tooltip.dm b/code/modules/tooltip/tooltip.dm index 11d60ca07b..5d074286eb 100644 --- a/code/modules/tooltip/tooltip.dm +++ b/code/modules/tooltip/tooltip.dm @@ -34,7 +34,6 @@ Notes: /datum/tooltip var/client/owner var/control = "mainwindow.tooltip" - var/file = 'code/modules/tooltip/tooltip.html' var/showing = 0 var/queueHide = 0 var/init = 0 @@ -43,7 +42,7 @@ Notes: /datum/tooltip/New(client/C) if (C) src.owner = C - src.owner << browse(file2text(src.file), "window=[src.control]") + src.owner << browse(file2text('code/modules/tooltip/tooltip.html'), "window=[src.control]") ..() diff --git a/code/modules/uplink/uplink_item.dm b/code/modules/uplink/uplink_item.dm index dd33cb0b1b..9ed0565ee7 100644 --- a/code/modules/uplink/uplink_item.dm +++ b/code/modules/uplink/uplink_item.dm @@ -88,7 +88,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. /datum/uplink_item/proc/spawn_item(turf/loc, obj/item/device/uplink/U) if(item) - feedback_add_details("traitor_uplink_items_bought", "[item]") + feedback_add_details("traitor_uplink_items_bought", "[name]|[cost]") return new item(loc) /datum/uplink_item/proc/buy(mob/user, obj/item/device/uplink/U) @@ -127,7 +127,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. if(src in GLOB.uplink_items) GLOB.uplink_items -= src //Take us out instead of leaving a null! return ..() - + //Discounts (dynamically filled above) /datum/uplink_item/discounts category = "Discounted Gear" @@ -1158,6 +1158,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. /datum/uplink_item/cyber_implants/spawn_item(turf/loc, obj/item/device/uplink/U) if(item) if(istype(item, /obj/item/organ)) + feedback_add_details("traitor_uplink_items_bought", "[item]|[cost]") return new /obj/item/weapon/storage/box/cyber_implants(loc, item) else return ..() @@ -1325,12 +1326,12 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. new I.item(C) U.purchase_log += "\icon[I.item]" + feedback_add_details("traitor_uplink_items_bought", "[name]|[cost]") return C /datum/uplink_item/badass/random name = "Random Item" - desc = "Picking this will purchase a random item. Useful if you have some TC to spare or if you haven't \ - decided on a strategy yet." + desc = "Picking this will purchase a random item. Useful if you have some TC to spare or if you haven't decided on a strategy yet." item = /obj/item/weapon/paper cost = 0 cant_discount = TRUE @@ -1351,5 +1352,6 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. var/datum/uplink_item/I = pick(possible_items) U.telecrystals -= I.cost U.spent_telecrystals += I.cost - feedback_add_details("traitor_uplink_items_bought","RN") + feedback_add_details("traitor_uplink_items_bought","[name]|[I.cost]") + feedback_add_details("traitor_random_uplink_items_gotten","[I.name]") return new I.item(loc) diff --git a/code/orphaned_procs/dbcore.dm b/code/orphaned_procs/dbcore.dm index a073780ea0..23b4fd0eb1 100644 --- a/code/orphaned_procs/dbcore.dm +++ b/code/orphaned_procs/dbcore.dm @@ -63,11 +63,11 @@ DBConnection/proc/Connect() if(failed_connections > FAILED_DB_CONNECTION_CUTOFF) //If it failed to establish a connection more than 5 times in a row, don't bother attempting to connect anymore. return FALSE - var/user = GLOB.sqlfdbklogin - var/pass = GLOB.sqlfdbkpass - var/db = GLOB.sqlfdbkdb - var/address = GLOB.sqladdress - var/port = GLOB.sqlport + var/user = global.sqlfdbklogin + var/pass = global.sqlfdbkpass + var/db = global.sqlfdbkdb + var/address = global.sqladdress + var/port = global.sqlport doConnect("dbi:mysql:[db]:[address]:[port]","[user]","[pass]") . = IsConnected() @@ -98,7 +98,7 @@ DBConnection/proc/ErrorMsg() return _dm_db_error_msg(_db_con) DBConnection/proc/SelectDB(database_name,dbi) if(IsConnected()) Disconnect() //return Connect("[dbi?"[dbi]":"dbi:mysql:[database_name]:[DB_SERVER]:[DB_PORT]"]",user,password) - return Connect("[dbi?"[dbi]":"dbi:mysql:[database_name]:[GLOB.sqladdress]:[GLOB.sqlport]"]",user,password) + return Connect("[dbi?"[dbi]":"dbi:mysql:[database_name]:[global.sqladdress]:[global.sqlport]"]",user,password) DBConnection/proc/NewQuery(sql_query,cursor_handler=src.default_cursor) return new/DBQuery(sql_query,src,cursor_handler) diff --git a/code/world.dm b/code/world.dm index 1b42af425c..233138ba30 100644 --- a/code/world.dm +++ b/code/world.dm @@ -35,7 +35,7 @@ GLOB.changelog_hash = md5('html/changelog.html') //used for telling if the changelog has changed recently make_datum_references_lists() //initialises global lists for referencing frequently used datums (so that we only ever do it once) - load_configuration() + config = new GLOB.revdata.DownloadPRDetails() load_mode() load_motd() @@ -65,7 +65,7 @@ GLOB.diary << "TOPIC: \"[T]\", from:[addr], master:[master], key:[key]" var/list/input = params2list(T) - var/key_valid = (GLOB.comms_allowed && input["key"] == GLOB.comms_key) + var/key_valid = (global.comms_allowed && input["key"] == global.comms_key) var/static/last_irc_status = 0 if("ping" in input) @@ -211,14 +211,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 @@ -273,18 +265,6 @@ /world/proc/load_motd() GLOB.join_motd = file2text("config/motd.txt") + "
" + GLOB.revdata.GetTestMergeInfo() -/world/proc/load_configuration() - config = new /datum/configuration() - config.load("config/config.txt") - config.load("config/game_options.txt","game_options") - config.loadsql("config/dbconfig.txt") - if (config.maprotation) - config.loadmaplist("config/maps.txt") - - // apply some settings from config.. - GLOB.abandon_allowed = config.respawn - - /world/proc/update_status() var/s = "" @@ -334,4 +314,4 @@ if (features) s += ": [jointext(features, ", ")]" - status = s \ No newline at end of file + status = s diff --git a/sound/ambience/ambivapor1.ogg b/sound/ambience/ambivapor1.ogg index 3ac83daead..4374f46710 100644 Binary files a/sound/ambience/ambivapor1.ogg and b/sound/ambience/ambivapor1.ogg differ diff --git a/sound/ambience/title1.ogg b/sound/ambience/title1.ogg index 6d689d475f..1858f38e33 100644 Binary files a/sound/ambience/title1.ogg and b/sound/ambience/title1.ogg differ diff --git a/sound/ambience/title2.ogg b/sound/ambience/title2.ogg index af8cc5caae..94e78f83c1 100644 Binary files a/sound/ambience/title2.ogg and b/sound/ambience/title2.ogg differ diff --git a/sound/ambience/title3.ogg b/sound/ambience/title3.ogg index 9632d259e1..cd1e4835a5 100644 Binary files a/sound/ambience/title3.ogg and b/sound/ambience/title3.ogg differ diff --git a/sound/ambience/title4.ogg b/sound/ambience/title4.ogg index 61873497fa..12f70b3d2c 100644 Binary files a/sound/ambience/title4.ogg and b/sound/ambience/title4.ogg differ diff --git a/sound/machines/engine_alert1.ogg b/sound/machines/engine_alert1.ogg new file mode 100644 index 0000000000..fadec78891 Binary files /dev/null and b/sound/machines/engine_alert1.ogg differ diff --git a/sound/machines/engine_alert2.ogg b/sound/machines/engine_alert2.ogg new file mode 100644 index 0000000000..83f693617a Binary files /dev/null and b/sound/machines/engine_alert2.ogg differ diff --git a/sound/misc/Paradox.ogg b/sound/misc/Paradox.ogg new file mode 100644 index 0000000000..c28403578d Binary files /dev/null and b/sound/misc/Paradox.ogg differ diff --git a/sound/misc/airraid.ogg b/sound/misc/airraid.ogg new file mode 100644 index 0000000000..820eaccf91 Binary files /dev/null and b/sound/misc/airraid.ogg differ diff --git a/sound/misc/boogie2.ogg b/sound/misc/boogie2.ogg new file mode 100644 index 0000000000..e9cdb973a2 Binary files /dev/null and b/sound/misc/boogie2.ogg differ diff --git a/sound/misc/disco.ogg b/sound/misc/disco.ogg new file mode 100644 index 0000000000..5e15c8ccc0 Binary files /dev/null and b/sound/misc/disco.ogg differ diff --git a/sound/misc/superior.ogg b/sound/misc/superior.ogg new file mode 100644 index 0000000000..e9cdb973a2 Binary files /dev/null and b/sound/misc/superior.ogg differ diff --git a/sound/misc/ultimate.ogg b/sound/misc/ultimate.ogg new file mode 100644 index 0000000000..0674a55313 Binary files /dev/null and b/sound/misc/ultimate.ogg differ diff --git a/tgstation.dme b/tgstation.dme index 171e998234..c4f4e2e1ed 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -72,6 +72,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" @@ -84,6 +85,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" @@ -98,12 +100,11 @@ #include "code\__HELPERS\sorts\MergeSort.dm" #include "code\__HELPERS\sorts\TimSort.dm" #include "code\_globalvars\configuration.dm" -#include "code\_globalvars\database.dm" #include "code\_globalvars\game_modes.dm" #include "code\_globalvars\genetics.dm" #include "code\_globalvars\logging.dm" #include "code\_globalvars\misc.dm" -#include "code\_globalvars\station.dm" +#include "code\_globalvars\sensitive.dm" #include "code\_globalvars\lists\flavor_misc.dm" #include "code\_globalvars\lists\mapping.dm" #include "code\_globalvars\lists\mobs.dm" @@ -531,6 +532,7 @@ #include "code\game\machinery\cell_charger.dm" #include "code\game\machinery\cloning.dm" #include "code\game\machinery\constructable_frame.dm" +#include "code\game\machinery\dance_machine.dm" #include "code\game\machinery\deployable.dm" #include "code\game\machinery\dna_scanner.dm" #include "code\game\machinery\doppler_array.dm" @@ -1062,6 +1064,7 @@ #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" @@ -1535,6 +1538,7 @@ #include "code\modules\mob\living\carbon\alien\alien_defense.dm" #include "code\modules\mob\living\carbon\alien\damage_procs.dm" #include "code\modules\mob\living\carbon\alien\death.dm" +#include "code\modules\mob\living\carbon\alien\emote.dm" #include "code\modules\mob\living\carbon\alien\life.dm" #include "code\modules\mob\living\carbon\alien\login.dm" #include "code\modules\mob\living\carbon\alien\logout.dm" @@ -2144,9 +2148,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" diff --git a/tools/github_webhook_processor.php b/tools/github_webhook_processor.php index 06a3b2ae2d..9eaa7aef77 100644 --- a/tools/github_webhook_processor.php +++ b/tools/github_webhook_processor.php @@ -194,7 +194,7 @@ function handle_pr($payload) { case 'edited': case 'synchronize': tag_pr($payload, false); - break; + return; case 'reopened': $action = $payload['action']; break; @@ -241,14 +241,20 @@ function checkchangelog($payload, $merge = false, $compile = true) { return; } $body = $payload['pull_request']['body']; + + $tags = array(); + + if(preg_match('/(?i)(fix|fixes|fixed|resolve|resolves|resolved)\s*#[0-9]+/',$body)) //github autoclose syntax + $tags[] = 'Fix'; + $body = str_replace("\r\n", "\n", $body); $body = explode("\n", $body); + $username = $payload['pull_request']['user']['login']; $incltag = false; $changelogbody = array(); $currentchangelogblock = array(); $foundcltag = false; - $tags = array(); foreach ($body as $line) { $line = trim($line); if (substr($line,0,4) == ':cl:' || substr($line,0,4) == '🆑') {