diff --git a/_maps/map_files/Delta/delta.dmm b/_maps/map_files/Delta/delta.dmm index 8d91f419b02..7e54cfe3e58 100644 --- a/_maps/map_files/Delta/delta.dmm +++ b/_maps/map_files/Delta/delta.dmm @@ -503,8 +503,8 @@ }, /area/shuttle/abandoned) "abp" = ( -/turf/space, /obj/machinery/porta_turret/syndicate, +/turf/space, /turf/simulated/shuttle/wall{ dir = 8; icon_state = "diagonalWall3" @@ -570,8 +570,8 @@ /turf/simulated/shuttle/plating, /area/shuttle/syndicate) "abu" = ( -/turf/space, /obj/machinery/porta_turret/syndicate, +/turf/space, /turf/simulated/shuttle/wall{ dir = 1; icon_state = "diagonalWall3" @@ -661,13 +661,13 @@ }, /area/shuttle/syndicate) "abG" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/maintenance/auxsolarstarboard) "abH" = ( @@ -847,7 +847,6 @@ }, /area/shuttle/syndicate) "ace" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 4; @@ -860,10 +859,10 @@ icon_state = "2-4"; tag = "" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/maintenance/auxsolarstarboard) "acf" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 4; @@ -881,31 +880,31 @@ d2 = 8; icon_state = "4-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/maintenance/auxsolarstarboard) "acg" = ( -/turf/space, /obj/structure/cable{ d2 = 8; icon_state = "0-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/maintenance/auxsolarstarboard) "ach" = ( -/turf/space, /obj/structure/cable, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/maintenance/auxsolarstarboard) "aci" = ( -/turf/space, /obj/structure/cable{ icon_state = "0-4"; d2 = 4 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/maintenance/auxsolarstarboard) "acj" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 8; @@ -922,6 +921,7 @@ d2 = 8; icon_state = "4-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/maintenance/auxsolarstarboard) "ack" = ( @@ -1077,11 +1077,11 @@ /turf/simulated/floor/plating, /area/hallway/secondary/entry) "acE" = ( -/turf/space, /obj/structure/cable{ d2 = 8; icon_state = "0-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "acF" = ( @@ -1089,11 +1089,11 @@ /turf/simulated/floor/plating/airless/catwalk, /area/space) "acG" = ( -/turf/space, /obj/structure/cable{ icon_state = "0-4"; d2 = 4 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "acH" = ( @@ -1644,16 +1644,16 @@ /turf/simulated/floor/plasteel, /area/hallway/secondary/entry) "adL" = ( -/turf/simulated/floor/plating, /obj/structure/shuttle/engine/propulsion/burst, +/turf/simulated/floor/plating, /turf/simulated/shuttle/wall{ icon_state = "swall_f5"; dir = 2 }, /area/shuttle/pod_1) "adM" = ( -/turf/simulated/floor/plating, /obj/structure/shuttle/engine/propulsion/burst, +/turf/simulated/floor/plating, /turf/simulated/shuttle/wall{ icon_state = "swall_f9"; dir = 2 @@ -1685,16 +1685,16 @@ /turf/simulated/shuttle/floor, /area/shuttle/pod_2) "adQ" = ( -/turf/simulated/floor/plating, /obj/structure/shuttle/engine/propulsion/burst, +/turf/simulated/floor/plating, /turf/simulated/shuttle/wall{ icon_state = "swall_f5"; dir = 2 }, /area/shuttle/pod_2) "adR" = ( -/turf/simulated/floor/plating, /obj/structure/shuttle/engine/propulsion/burst, +/turf/simulated/floor/plating, /turf/simulated/shuttle/wall{ icon_state = "swall_f9"; dir = 2 @@ -1766,7 +1766,6 @@ /turf/simulated/floor/plasteel, /area/hallway/secondary/entry) "aec" = ( -/turf/space, /obj/machinery/access_button{ command = "cycle_exterior"; frequency = 1379; @@ -1776,6 +1775,7 @@ pixel_y = -25; req_access_txt = "10;13" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/maintenance/auxsolarstarboard) "aed" = ( @@ -1816,12 +1816,12 @@ /turf/simulated/shuttle/floor, /area/shuttle/pod_2) "aeh" = ( -/turf/space, /obj/structure/shuttle/engine/propulsion{ tag = "icon-propulsion (NORTH)"; icon_state = "propulsion"; dir = 1 }, +/turf/space, /turf/simulated/shuttle/wall/interior{ tag = "icon-swall_f6"; icon_state = "swall_f6" @@ -2674,12 +2674,12 @@ /turf/simulated/floor/plasteel, /area/hallway/secondary/entry) "afL" = ( -/turf/space, /obj/structure/shuttle/engine/propulsion{ tag = "icon-propulsion (NORTH)"; icon_state = "propulsion"; dir = 1 }, +/turf/space, /turf/simulated/shuttle/wall/interior{ tag = "icon-swall_f10"; icon_state = "swall_f10" @@ -8921,17 +8921,16 @@ /turf/simulated/floor/plating, /area/maintenance/disposal) "asU" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/maintenance/auxsolarport) "asV" = ( -/turf/space, /obj/structure/cable{ d1 = 2; d2 = 4; @@ -8944,6 +8943,7 @@ icon_state = "1-4"; tag = "" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/maintenance/auxsolarport) "asW" = ( @@ -8984,7 +8984,6 @@ }, /area/hallway/secondary/entry) "ata" = ( -/turf/space, /obj/structure/cable{ d1 = 2; d2 = 4; @@ -9002,19 +9001,20 @@ d2 = 8; icon_state = "4-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/maintenance/auxsolarport) "atb" = ( -/turf/space, /obj/structure/cable{ d2 = 8; icon_state = "0-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/maintenance/auxsolarport) "atc" = ( -/turf/space, /obj/structure/cable, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/maintenance/auxsolarport) "atd" = ( @@ -9350,15 +9350,14 @@ /turf/simulated/floor/plating, /area/maintenance/fsmaint) "atK" = ( -/turf/space, /obj/structure/cable{ icon_state = "0-4"; d2 = 4 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/maintenance/auxsolarport) "atL" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 8; @@ -9375,6 +9374,7 @@ d2 = 8; icon_state = "4-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/maintenance/auxsolarport) "atM" = ( @@ -9484,7 +9484,6 @@ }, /area/maintenance/disposal) "atU" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 8; @@ -9496,6 +9495,7 @@ d2 = 8; icon_state = "2-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/maintenance/auxsolarport) "atV" = ( @@ -12855,10 +12855,10 @@ /turf/simulated/floor/greengrid, /area/engine/supermatter) "aAe" = ( -/turf/space, /obj/machinery/atmospherics/pipe/simple/heat_exchanging{ dir = 6 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "aAf" = ( @@ -12904,10 +12904,10 @@ /turf/simulated/floor/plasteel, /area/engine/controlroom) "aAi" = ( -/turf/space, /obj/machinery/atmospherics/pipe/simple/heat_exchanging{ dir = 4 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "aAj" = ( @@ -13819,10 +13819,10 @@ }, /area/hallway/primary/fore) "aBV" = ( -/turf/space, /obj/machinery/atmospherics/pipe/simple/heat_exchanging{ dir = 5 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "aBW" = ( @@ -14705,10 +14705,10 @@ }, /area/maintenance/fsmaint) "aDC" = ( -/turf/space, /obj/machinery/atmospherics/pipe/simple/heat_exchanging{ dir = 10 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "aDD" = ( @@ -14979,34 +14979,34 @@ /turf/simulated/floor/plating, /area/quartermaster/storage) "aDZ" = ( -/turf/space, /obj/machinery/atmospherics/unary/outlet_injector/on{ dir = 8 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/engine/controlroom) "aEa" = ( -/turf/space, /obj/machinery/atmospherics/pipe/simple/heat_exchanging{ dir = 9 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "aEb" = ( -/turf/space, /obj/structure/cable{ icon_state = "0-2"; d2 = 2 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/maintenance/auxsolarport) "aEc" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 2; icon_state = "1-2" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/maintenance/auxsolarport) "aEd" = ( @@ -15769,10 +15769,10 @@ /turf/simulated/wall, /area/crew_quarters/sleep) "aFz" = ( -/turf/space, /obj/machinery/atmospherics/pipe/simple/visible/yellow{ dir = 10 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "aFA" = ( @@ -18102,13 +18102,13 @@ /turf/simulated/floor/plasteel, /area/security/prison) "aJy" = ( -/turf/space, /obj/machinery/atmospherics/pipe/simple/heat_exchanging, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "aJz" = ( -/turf/space, /obj/machinery/atmospherics/pipe/simple/visible/yellow, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "aJA" = ( @@ -19461,7 +19461,6 @@ }, /area/crew_quarters/bar) "aLQ" = ( -/turf/space, /obj/machinery/access_button{ command = "cycle_exterior"; frequency = 1379; @@ -19475,6 +19474,7 @@ d2 = 4; icon_state = "0-4" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/maintenance/auxsolarport) "aLR" = ( @@ -19493,8 +19493,8 @@ }, /area/crew_quarters/bar/atrium) "aLT" = ( -/turf/space, /obj/item/wrench, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "aLU" = ( @@ -21048,10 +21048,10 @@ /turf/simulated/floor/plating, /area/security/prison) "aOU" = ( -/turf/space, /obj/machinery/atmospherics/pipe/simple/visible/yellow{ dir = 5 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "aOV" = ( @@ -21062,10 +21062,10 @@ /turf/simulated/floor/plating, /area/security/prison) "aOW" = ( -/turf/space, /obj/machinery/atmospherics/pipe/simple/visible/yellow{ dir = 4 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "aOX" = ( @@ -25718,13 +25718,13 @@ }, /area/security/prison) "aWR" = ( -/turf/space, /obj/structure/disposalpipe/trunk{ dir = 4 }, /obj/structure/disposaloutlet{ dir = 8 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/maintenance/incinerator) "aWS" = ( @@ -27679,13 +27679,13 @@ /turf/simulated/floor/plasteel, /area/security/prison) "aZY" = ( -/turf/space, /obj/machinery/atmospherics/pipe/simple/visible{ dir = 4 }, /obj/structure/disposalpipe/segment{ dir = 4 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "aZZ" = ( @@ -27700,7 +27700,6 @@ }, /area/crew_quarters/bar/atrium) "baa" = ( -/turf/space, /obj/machinery/atmospherics/pipe/simple/visible{ dir = 9 }, @@ -27708,6 +27707,7 @@ dir = 8; icon_state = "pipe-c" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "bab" = ( @@ -28079,11 +28079,11 @@ /turf/simulated/floor/plasteel, /area/crew_quarters/kitchen) "baN" = ( -/turf/space, /obj/machinery/atmospherics/pipe/simple/visible/cyan{ dir = 4; level = 2 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/atmos) "baO" = ( @@ -28612,11 +28612,11 @@ /turf/simulated/floor/plating, /area/security/prison) "bbF" = ( -/turf/space, /obj/machinery/atmospherics/pipe/simple/visible/yellow{ dir = 4; level = 2 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/atmos) "bbG" = ( @@ -36121,10 +36121,10 @@ }, /area/construction/hallway) "bpr" = ( -/turf/simulated/floor/plating, /obj/structure/shuttle/engine/propulsion/burst{ dir = 8 }, +/turf/simulated/floor/plating, /turf/simulated/shuttle/wall{ tag = "icon-swall_f6"; icon_state = "swall_f6"; @@ -39475,11 +39475,11 @@ }, /area/hallway/primary/central) "buX" = ( -/turf/space, /obj/machinery/atmospherics/pipe/simple/visible/green{ dir = 4; level = 2 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/atmos) "buY" = ( @@ -40560,10 +40560,10 @@ /turf/simulated/wall/r_wall, /area/engine/gravitygenerator) "bwO" = ( -/turf/simulated/floor/plating, /obj/structure/shuttle/engine/propulsion/burst{ dir = 8 }, +/turf/simulated/floor/plating, /turf/simulated/shuttle/wall{ tag = "icon-swall_f5"; icon_state = "swall_f5"; @@ -52894,10 +52894,10 @@ /turf/simulated/floor/plasteel, /area/security/warden) "bRm" = ( -/turf/space, /obj/machinery/atmospherics/pipe/simple/visible/yellow{ dir = 9 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "bRn" = ( @@ -53130,11 +53130,11 @@ /turf/simulated/wall/r_wall, /area/turret_protected/aisat) "bRG" = ( -/turf/space, /obj/structure/window/reinforced{ dir = 1; layer = 2.9 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "bRH" = ( @@ -54795,7 +54795,6 @@ }, /area/hallway/primary/port) "bUb" = ( -/turf/space, /obj/machinery/access_button{ command = "cycle_exterior"; frequency = 1379; @@ -54805,6 +54804,7 @@ pixel_y = -20; req_access_txt = "32" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "bUc" = ( @@ -55188,7 +55188,6 @@ }, /area/hallway/primary/port) "bUJ" = ( -/turf/space, /obj/structure/cable{ d1 = 4; d2 = 8; @@ -55199,6 +55198,7 @@ dir = 4; level = 1 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "bUK" = ( @@ -55447,7 +55447,6 @@ }, /area/hallway/primary/central) "bVf" = ( -/turf/space, /obj/structure/cable{ d1 = 2; d2 = 8; @@ -55457,6 +55456,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 10 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "bVg" = ( @@ -55664,7 +55664,6 @@ /turf/simulated/floor/plasteel, /area/crew_quarters/chief) "bVs" = ( -/turf/space, /obj/structure/cable{ d1 = 2; d2 = 4; @@ -55674,6 +55673,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 6 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "bVt" = ( @@ -57169,7 +57169,6 @@ }, /area/security/checkpoint/engineering) "bXF" = ( -/turf/space, /obj/structure/cable{ d1 = 4; d2 = 8; @@ -57189,16 +57188,17 @@ pixel_y = 20; req_access_txt = "10;13" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "bXG" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 2; icon_state = "1-2" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "bXH" = ( @@ -57384,7 +57384,6 @@ /turf/simulated/wall, /area/engine/engineering) "bYa" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 2; @@ -57392,6 +57391,7 @@ tag = "" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "bYb" = ( @@ -57464,7 +57464,6 @@ /turf/simulated/floor/plating, /area/library) "bYl" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 4; @@ -57475,10 +57474,10 @@ dir = 5; level = 1 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "bYm" = ( -/turf/space, /obj/structure/cable{ d1 = 4; d2 = 8; @@ -57489,6 +57488,7 @@ dir = 4; level = 1 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "bYn" = ( @@ -57689,7 +57689,6 @@ /turf/simulated/floor/plating, /area/crew_quarters/courtroom) "bYJ" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 8; @@ -57698,6 +57697,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 9 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "bYK" = ( @@ -57915,10 +57915,10 @@ /turf/simulated/floor/plasteel, /area/security/armoury) "bZf" = ( -/turf/space, /obj/structure/window/reinforced{ dir = 4 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "bZg" = ( @@ -58086,7 +58086,6 @@ /turf/simulated/floor/plasteel, /area/engine/engineering) "bZw" = ( -/turf/space, /obj/structure/window/reinforced{ dir = 8 }, @@ -58094,6 +58093,7 @@ dir = 4; level = 1 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "bZx" = ( @@ -62775,11 +62775,11 @@ /turf/simulated/wall/rust, /area/teleporter) "chw" = ( -/turf/space, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4; level = 1 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "chx" = ( @@ -63818,7 +63818,6 @@ /turf/simulated/floor/plating, /area/lawoffice) "cjl" = ( -/turf/space, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4; level = 1 @@ -63831,6 +63830,7 @@ tag = "icon-D-SE"; icon_state = "D-SE" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "cjm" = ( @@ -66335,7 +66335,6 @@ /turf/simulated/floor/plasteel, /area/teleporter) "cnH" = ( -/turf/space, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4; level = 1 @@ -66344,6 +66343,7 @@ tag = "icon-E-SW-NW"; icon_state = "E-SW-NW" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "cnI" = ( @@ -66559,7 +66559,6 @@ /turf/simulated/floor/plasteel, /area/engine/engineering) "coi" = ( -/turf/space, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4; level = 1 @@ -66567,6 +66566,7 @@ /obj/structure/transit_tube{ icon_state = "E-W-Pass" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "coj" = ( @@ -69028,12 +69028,12 @@ /turf/simulated/floor/plating, /area/engine/engineering) "csr" = ( -/turf/space, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4; level = 1 }, /obj/structure/transit_tube, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "css" = ( @@ -69086,7 +69086,6 @@ /turf/simulated/floor/plating, /area/engine/engine_smes) "csy" = ( -/turf/space, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4; level = 1 @@ -69095,6 +69094,7 @@ tag = "icon-W-SE"; icon_state = "W-SE" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "csz" = ( @@ -69730,7 +69730,6 @@ }, /area/library) "ctI" = ( -/turf/space, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4; level = 1 @@ -69742,10 +69741,10 @@ /obj/structure/window/reinforced{ dir = 4 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "ctJ" = ( -/turf/space, /obj/structure/transit_tube{ tag = "icon-E-NW"; icon_state = "E-NW" @@ -69753,6 +69752,7 @@ /obj/structure/window/reinforced{ dir = 4 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "ctK" = ( @@ -69896,12 +69896,12 @@ /turf/simulated/floor/plasteel, /area/ai_monitored/storage/eva) "ctY" = ( -/turf/space, /obj/structure/cable/yellow{ d1 = 2; d2 = 4; icon_state = "2-4" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "ctZ" = ( @@ -72995,12 +72995,12 @@ }, /area/maintenance/fpmaint2) "czw" = ( -/turf/space, /obj/structure/cable/yellow{ d1 = 4; d2 = 8; icon_state = "4-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "czx" = ( @@ -74432,7 +74432,6 @@ }, /area/crew_quarters/locker) "cBU" = ( -/turf/space, /obj/structure/cable/yellow{ d1 = 2; d2 = 4; @@ -74443,6 +74442,7 @@ d2 = 8; icon_state = "4-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "cBV" = ( @@ -77530,12 +77530,12 @@ }, /area/maintenance/fpmaint2) "cHt" = ( -/turf/space, /obj/structure/cable/yellow{ d1 = 2; d2 = 8; icon_state = "2-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "cHu" = ( @@ -78377,12 +78377,12 @@ /turf/space, /area/engine/engineering) "cJe" = ( -/turf/space, /obj/structure/cable/yellow{ d1 = 1; d2 = 2; icon_state = "1-2" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "cJf" = ( @@ -78819,7 +78819,6 @@ }, /area/maintenance/fpmaint2) "cKj" = ( -/turf/space, /obj/structure/cable/yellow{ d1 = 1; d2 = 2; @@ -78830,6 +78829,7 @@ d2 = 4; icon_state = "1-4" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "cKk" = ( @@ -78843,8 +78843,8 @@ /turf/simulated/floor/plasteel, /area/toxins/xenobiology) "cKl" = ( -/turf/space, /obj/structure/window/reinforced, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "cKm" = ( @@ -80265,7 +80265,6 @@ /turf/simulated/floor/plasteel, /area/toxins/xenobiology) "cNn" = ( -/turf/space, /obj/structure/cable/yellow{ d1 = 1; d2 = 2; @@ -80281,6 +80280,7 @@ d2 = 4; icon_state = "1-4" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "cNo" = ( @@ -80739,7 +80739,6 @@ }, /area/medical/medbay) "cNZ" = ( -/turf/space, /obj/structure/cable/yellow{ d1 = 1; d2 = 2; @@ -80750,6 +80749,7 @@ d2 = 4; icon_state = "2-4" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "cOa" = ( @@ -80920,12 +80920,12 @@ /turf/simulated/wall, /area/medical/medbay) "cOm" = ( -/turf/space, /obj/structure/cable/yellow{ d1 = 1; d2 = 4; icon_state = "1-4" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "cOn" = ( @@ -81674,7 +81674,6 @@ }, /area/medical/medbay) "cPK" = ( -/turf/space, /obj/structure/cable/yellow{ d1 = 1; d2 = 4; @@ -81685,6 +81684,7 @@ d2 = 8; icon_state = "4-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "cPL" = ( @@ -81847,16 +81847,15 @@ }, /area/medical/medbay2) "cPX" = ( -/turf/space, /obj/structure/cable/yellow{ d1 = 1; d2 = 8; icon_state = "1-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "cPY" = ( -/turf/space, /obj/machinery/access_button{ command = "cycle_exterior"; frequency = 1379; @@ -81866,6 +81865,7 @@ pixel_y = 24; req_access_txt = "0" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "cPZ" = ( @@ -107523,7 +107523,6 @@ }, /area/shuttle/escape) "dKx" = ( -/turf/space, /obj/structure/cable{ d1 = 4; d2 = 8; @@ -107538,6 +107537,7 @@ pixel_y = 25; req_access_txt = "13" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/maintenance/auxsolarstarboard) "dKy" = ( @@ -110238,12 +110238,12 @@ /turf/simulated/floor/plating, /area/medical/virology) "dPn" = ( -/turf/space, /obj/structure/cable{ d2 = 2; icon_state = "0-2"; pixel_y = 0 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/maintenance/auxsolarstarboard) "dPo" = ( @@ -114992,7 +114992,6 @@ /turf/simulated/floor/plasteel, /area/hallway/secondary/exit) "dXX" = ( -/turf/space, /obj/machinery/access_button{ command = "cycle_exterior"; frequency = 1379; @@ -115002,6 +115001,7 @@ pixel_y = 24; req_access_txt = "0" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "dXY" = ( @@ -115335,24 +115335,23 @@ /turf/simulated/floor/plasteel, /area/medical/research) "dYI" = ( -/turf/space, /obj/structure/cable{ icon_state = "0-4"; d2 = 4 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/maintenance/portsolar) "dYJ" = ( -/turf/space, /obj/structure/cable{ d1 = 4; d2 = 8; icon_state = "4-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/maintenance/portsolar) "dYK" = ( -/turf/space, /obj/structure/cable{ d1 = 4; d2 = 8; @@ -115367,10 +115366,10 @@ pixel_y = 25; req_access_txt = "13" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/maintenance/portsolar) "dYL" = ( -/turf/space, /obj/structure/cable{ d1 = 2; d2 = 4; @@ -115383,10 +115382,10 @@ icon_state = "1-4"; tag = "" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/maintenance/portsolar) "dYM" = ( -/turf/space, /obj/structure/cable{ d1 = 2; d2 = 4; @@ -115404,18 +115403,18 @@ d2 = 8; icon_state = "4-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/maintenance/portsolar) "dYN" = ( -/turf/space, /obj/structure/cable{ d2 = 8; icon_state = "0-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/maintenance/portsolar) "dYO" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 8; @@ -115432,10 +115431,10 @@ d2 = 8; icon_state = "4-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/maintenance/portsolar) "dYP" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 8; @@ -115447,10 +115446,10 @@ d2 = 8; icon_state = "2-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/maintenance/portsolar) "dYQ" = ( -/turf/space, /obj/machinery/access_button{ command = "cycle_exterior"; frequency = 1379; @@ -115460,25 +115459,26 @@ pixel_y = 24; req_access_txt = "10;13" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "dYR" = ( -/turf/space, /obj/structure/cable{ d2 = 2; icon_state = "0-2"; pixel_y = 0 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/maintenance/portsolar) "dYS" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/maintenance/portsolar) "dYT" = ( diff --git a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm index 7b07b479e41..c1740c983de 100644 --- a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm +++ b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm @@ -15,8 +15,8 @@ /turf/space, /area/space) "aac" = ( -/turf/space, /obj/machinery/porta_turret/syndicate, +/turf/space, /turf/simulated/shuttle/wall{ dir = 8; icon_state = "diagonalWall3" @@ -82,8 +82,8 @@ /turf/simulated/shuttle/plating, /area/shuttle/syndicate) "aah" = ( -/turf/space, /obj/machinery/porta_turret/syndicate, +/turf/space, /turf/simulated/shuttle/wall{ dir = 1; icon_state = "diagonalWall3" @@ -760,12 +760,12 @@ }, /area/shuttle/syndicate) "abA" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 2; icon_state = "1-2" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/auxport) "abB" = ( @@ -867,12 +867,11 @@ }, /area/shuttle/syndicate) "abL" = ( -/turf/space, /obj/structure/cable, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/auxport) "abM" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 4; @@ -883,6 +882,7 @@ d2 = 4; icon_state = "2-4" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/auxport) "abN" = ( @@ -943,7 +943,6 @@ }, /area/shuttle/syndicate) "abU" = ( -/turf/space, /obj/structure/cable{ d1 = 4; d2 = 8; @@ -959,14 +958,15 @@ d2 = 4; icon_state = "2-4" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/auxport) "abV" = ( -/turf/space, /obj/structure/cable{ d2 = 8; icon_state = "0-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/auxport) "abW" = ( @@ -974,15 +974,14 @@ /turf/simulated/floor/plating/airless/catwalk, /area/solar/auxport) "abX" = ( -/turf/space, /obj/structure/cable{ icon_state = "0-4"; d2 = 4 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/auxport) "abY" = ( -/turf/space, /obj/structure/cable{ d1 = 4; d2 = 8; @@ -998,10 +997,10 @@ d2 = 8; icon_state = "1-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/auxport) "abZ" = ( -/turf/space, /obj/structure/cable{ d1 = 2; d2 = 8; @@ -1012,6 +1011,7 @@ d2 = 8; icon_state = "1-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/auxport) "aca" = ( @@ -1054,8 +1054,8 @@ }, /area/solar/auxport) "acf" = ( -/turf/space, /obj/item/stack/cable_coil, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/auxport) "acg" = ( @@ -1265,11 +1265,11 @@ /turf/space, /area/space) "acz" = ( -/turf/space, /obj/effect/landmark{ name = "xeno_spawn"; pixel_x = -1 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/auxport) "acA" = ( @@ -1519,8 +1519,8 @@ }, /area/security/permabrig) "acY" = ( -/turf/simulated/floor/plating, /obj/structure/shuttle/engine/propulsion/burst, +/turf/simulated/floor/plating, /turf/simulated/shuttle/wall{ tag = "icon-swall_f5"; icon_state = "swall_f5"; @@ -1604,8 +1604,8 @@ }, /area/security/permabrig) "adg" = ( -/turf/simulated/floor/plating, /obj/structure/shuttle/engine/propulsion/burst, +/turf/simulated/floor/plating, /turf/simulated/shuttle/wall{ tag = "icon-swall_f9"; icon_state = "swall_f9"; @@ -1623,20 +1623,20 @@ /turf/simulated/shuttle/floor, /area/shuttle/pod_2) "adi" = ( -/turf/space, /obj/structure/cable{ icon_state = "0-2"; d2 = 2 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/auxport) "adj" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 2; icon_state = "1-2" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/auxstarboard) "adk" = ( @@ -1989,8 +1989,8 @@ }, /area/shuttle/vox) "adP" = ( -/turf/space, /obj/structure/cable, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/auxstarboard) "adQ" = ( @@ -2125,7 +2125,6 @@ /turf/space, /area/space) "aeg" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 4; @@ -2136,6 +2135,7 @@ d2 = 4; icon_state = "2-4" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/auxstarboard) "aeh" = ( @@ -2404,7 +2404,6 @@ }, /area/security/permabrig) "aeA" = ( -/turf/space, /obj/structure/cable{ d1 = 4; d2 = 8; @@ -2420,6 +2419,7 @@ d2 = 4; icon_state = "2-4" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/auxstarboard) "aeB" = ( @@ -2889,11 +2889,11 @@ /turf/simulated/shuttle/plating/vox, /area/shuttle/vox) "afo" = ( -/turf/space, /obj/structure/cable{ d2 = 8; icon_state = "0-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/auxstarboard) "afp" = ( @@ -2914,11 +2914,11 @@ }, /area/security/permabrig) "afq" = ( -/turf/space, /obj/structure/cable{ icon_state = "0-4"; d2 = 4 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/auxstarboard) "afr" = ( @@ -3109,7 +3109,6 @@ name = "\improper Recreation Area" }) "afG" = ( -/turf/space, /obj/structure/cable{ d1 = 4; d2 = 8; @@ -3125,6 +3124,7 @@ d2 = 8; icon_state = "2-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/auxstarboard) "afH" = ( @@ -3375,7 +3375,6 @@ /turf/simulated/floor/engine, /area/security/podbay) "age" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 8; @@ -3386,6 +3385,7 @@ d2 = 8; icon_state = "2-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/auxstarboard) "agf" = ( @@ -3446,12 +3446,12 @@ }, /area/security/permabrig) "agn" = ( -/turf/space, /obj/structure/cable{ icon_state = "0-2"; pixel_y = 1; d2 = 2 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/auxport) "ago" = ( @@ -3653,8 +3653,8 @@ name = "\improper Recreation Area" }) "agH" = ( -/turf/space, /obj/item/stack/cable_coil, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/auxstarboard) "agI" = ( @@ -3694,12 +3694,12 @@ /turf/simulated/floor/plating, /area/security/hos) "agM" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 4; icon_state = "1-4" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/auxport) "agN" = ( @@ -5100,21 +5100,21 @@ }, /area/security/armoury) "aiQ" = ( -/turf/space, /obj/structure/cable{ d1 = 4; d2 = 8; icon_state = "4-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/auxport) "aiR" = ( -/turf/space, /obj/structure/cable{ d1 = 2; d2 = 8; icon_state = "2-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/auxport) "aiS" = ( @@ -5385,10 +5385,10 @@ /turf/simulated/shuttle/floor4/vox, /area/shuttle/vox) "ajr" = ( -/turf/simulated/floor/plating, /obj/structure/shuttle/engine/propulsion/burst{ dir = 8 }, +/turf/simulated/floor/plating, /turf/simulated/shuttle/wall{ icon_state = "swall_f6"; dir = 2 @@ -5682,10 +5682,10 @@ }, /area/security/permabrig) "ajS" = ( -/turf/simulated/floor/plating, /obj/structure/shuttle/engine/propulsion/burst{ dir = 8 }, +/turf/simulated/floor/plating, /turf/simulated/shuttle/wall{ icon_state = "swall_f5"; dir = 2 @@ -6292,11 +6292,11 @@ /turf/simulated/floor/plasteel, /area/security/armoury) "akX" = ( -/turf/space, /obj/effect/landmark{ name = "xeno_spawn"; pixel_x = -1 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/auxstarboard) "akY" = ( @@ -11638,11 +11638,11 @@ name = "Port Maintenance" }) "auv" = ( -/turf/space, /obj/structure/cable{ icon_state = "0-2"; d2 = 2 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/maintenance/auxsolarstarboard) "auw" = ( @@ -27719,13 +27719,13 @@ name = "Arrivals" }) "aWE" = ( +/obj/structure/shuttle/engine/propulsion/burst{ + dir = 8 + }, /turf/simulated/floor/plasteel{ icon_state = "vault"; dir = 5 }, -/obj/structure/shuttle/engine/propulsion/burst{ - dir = 8 - }, /turf/simulated/shuttle/wall{ icon_state = "swall_f6"; dir = 2 @@ -27742,13 +27742,13 @@ /turf/simulated/shuttle/floor, /area/shuttle/pod_1) "aWG" = ( +/obj/structure/shuttle/engine/propulsion/burst{ + dir = 8 + }, /turf/simulated/floor/plasteel{ icon_state = "vault"; dir = 5 }, -/obj/structure/shuttle/engine/propulsion/burst{ - dir = 8 - }, /turf/simulated/shuttle/wall{ icon_state = "swall_f5"; dir = 2 @@ -31843,8 +31843,8 @@ name = "\improper MiniSat Exterior" }) "bdO" = ( -/turf/space, /obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/construction/hallway{ name = "\improper MiniSat Exterior" @@ -35755,8 +35755,8 @@ }, /area/shuttle/arrival/station) "bkj" = ( -/turf/simulated/floor/plating, /obj/structure/shuttle/engine/propulsion/burst, +/turf/simulated/floor/plating, /turf/simulated/shuttle/wall{ tag = "icon-swall_f5"; icon_state = "swall_f5"; @@ -36476,8 +36476,8 @@ name = "\improper Cargo Office" }) "bly" = ( -/turf/simulated/floor/plating, /obj/structure/shuttle/engine/propulsion/burst, +/turf/simulated/floor/plating, /turf/simulated/shuttle/wall{ tag = "icon-swall_f9"; icon_state = "swall_f9"; @@ -43938,7 +43938,6 @@ /turf/simulated/floor/plating/airless, /area/space) "bxm" = ( -/turf/space, /obj/structure/transit_tube{ icon_state = "W-NE-SE" }, @@ -43951,10 +43950,10 @@ d2 = 8; icon_state = "4-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "bxn" = ( -/turf/space, /obj/structure/transit_tube{ tag = "icon-D-SW"; icon_state = "D-SW" @@ -43972,10 +43971,10 @@ d2 = 8; icon_state = "4-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "bxo" = ( -/turf/space, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4; level = 1 @@ -43985,6 +43984,7 @@ d2 = 8; icon_state = "4-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "bxp" = ( @@ -44013,7 +44013,6 @@ name = "\improper MiniSat Exterior" }) "bxq" = ( -/turf/space, /obj/structure/window/reinforced{ dir = 4 }, @@ -44026,6 +44025,7 @@ d2 = 8; icon_state = "4-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "bxr" = ( @@ -49927,12 +49927,12 @@ /turf/simulated/floor/plasteel, /area/atmos) "bGW" = ( -/turf/space, /obj/structure/shuttle/engine/propulsion{ dir = 8; icon_state = "propulsion"; tag = "icon-propulsion (EAST)" }, +/turf/space, /turf/simulated/shuttle/wall{ icon_state = "swall_f6"; dir = 2 @@ -53183,12 +53183,12 @@ }, /area/tcommsat/server) "bMv" = ( -/turf/space, /obj/structure/shuttle/engine/propulsion{ dir = 8; icon_state = "propulsion"; tag = "icon-propulsion (EAST)" }, +/turf/space, /turf/simulated/shuttle/wall{ icon_state = "swall_f5"; dir = 2 @@ -65912,8 +65912,8 @@ }, /area/hydroponics) "ciB" = ( -/turf/space, /obj/structure/cable, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/port) "ciC" = ( @@ -67032,11 +67032,11 @@ /turf/space, /area/space) "ckr" = ( -/turf/space, /obj/structure/cable{ icon_state = "0-2"; d2 = 2 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/port) "cks" = ( @@ -68466,12 +68466,12 @@ name = "\improper Secure Lab" }) "cmH" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 2; icon_state = "1-2" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/port) "cmI" = ( @@ -74372,7 +74372,6 @@ }, /area/solar/port) "cvQ" = ( -/turf/space, /obj/structure/cable{ d1 = 2; d2 = 4; @@ -74383,6 +74382,7 @@ d2 = 4; icon_state = "1-4" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/port) "cvR" = ( @@ -76922,7 +76922,6 @@ name = "Aft Maintenance" }) "cAf" = ( -/turf/space, /obj/structure/cable{ d1 = 2; d2 = 4; @@ -76938,6 +76937,7 @@ d2 = 8; icon_state = "4-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/port) "cAg" = ( @@ -77552,11 +77552,11 @@ }, /area/medical/chemistry) "cBe" = ( -/turf/space, /obj/structure/cable{ d2 = 8; icon_state = "0-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/port) "cBf" = ( @@ -77575,11 +77575,11 @@ }, /area/crew_quarters/hor) "cBg" = ( -/turf/space, /obj/structure/cable{ icon_state = "0-4"; d2 = 4 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/port) "cBh" = ( @@ -78214,7 +78214,6 @@ name = "Aft Maintenance" }) "cCf" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 8; @@ -78230,6 +78229,7 @@ d2 = 8; icon_state = "4-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/port) "cCg" = ( @@ -78302,7 +78302,6 @@ }, /area/medical/genetics) "cCj" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 8; @@ -78313,6 +78312,7 @@ d2 = 8; icon_state = "2-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/port) "cCk" = ( @@ -78462,8 +78462,8 @@ }, /area/medical/surgeryobs) "cCw" = ( -/turf/space, /obj/item/stack/cable_coil, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/port) "cCx" = ( @@ -78493,11 +78493,11 @@ }, /area/medical/surgeryobs) "cCz" = ( -/turf/space, /obj/structure/cable/yellow{ d2 = 4; icon_state = "0-4" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "cCA" = ( @@ -78809,12 +78809,12 @@ }, /area/medical/cryo) "cCZ" = ( -/turf/space, /obj/structure/cable/yellow{ d1 = 4; d2 = 8; icon_state = "4-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "cDa" = ( @@ -82331,12 +82331,12 @@ name = "\improper Toxins Lab" }) "cIN" = ( -/turf/space, /obj/effect/landmark{ name = "xeno_spawn"; pixel_x = -1 }, /obj/structure/cable, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/port) "cIO" = ( @@ -86868,11 +86868,11 @@ name = "Aft Maintenance" }) "cPU" = ( -/turf/space, /obj/structure/cable/yellow{ d2 = 8; icon_state = "0-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "cPV" = ( @@ -91758,12 +91758,12 @@ name = "\improper Departure Lounge" }) "cXN" = ( -/turf/space, /obj/structure/cable{ d1 = 4; d2 = 8; icon_state = "4-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "cXO" = ( @@ -92024,12 +92024,12 @@ }, /area/chapel/main) "cYi" = ( -/turf/space, /obj/structure/cable{ d1 = 2; d2 = 8; icon_state = "2-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "cYj" = ( @@ -92221,12 +92221,12 @@ name = "\improper Recreation Area" }) "cYA" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 2; icon_state = "1-2" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "cYB" = ( @@ -92482,8 +92482,8 @@ name = "\improper Departure Lounge" }) "cYY" = ( -/turf/space, /obj/structure/cable, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "cYZ" = ( @@ -92523,7 +92523,6 @@ }, /area/solar/starboard) "cZc" = ( -/turf/space, /obj/structure/cable{ d1 = 2; d2 = 4; @@ -92534,10 +92533,10 @@ d2 = 4; icon_state = "1-4" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "cZd" = ( -/turf/space, /obj/structure/cable{ d1 = 2; d2 = 4; @@ -92553,6 +92552,7 @@ d2 = 8; icon_state = "4-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "cZe" = ( @@ -92596,11 +92596,11 @@ name = "\improper Arcade" }) "cZj" = ( -/turf/space, /obj/structure/cable{ d2 = 8; icon_state = "0-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "cZk" = ( @@ -92807,8 +92807,8 @@ name = "\improper Arcade" }) "cZA" = ( -/turf/space, /obj/item/stack/cable_coil, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "cZB" = ( @@ -93002,11 +93002,11 @@ /turf/simulated/shuttle/plating, /area/shuttle/escape) "cZW" = ( -/turf/space, /obj/structure/cable{ icon_state = "0-4"; d2 = 4 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "cZX" = ( @@ -94632,7 +94632,6 @@ name = "\improper Secure Lab" }) "dcv" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 8; @@ -94648,6 +94647,7 @@ d2 = 8; icon_state = "4-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "dcw" = ( @@ -94845,7 +94845,6 @@ /turf/simulated/shuttle/floor, /area/shuttle/escape) "dcN" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 8; @@ -94856,6 +94855,7 @@ d2 = 8; icon_state = "2-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "dcO" = ( @@ -95128,11 +95128,11 @@ /turf/space, /area/space) "ddw" = ( -/turf/space, /obj/effect/landmark{ name = "xeno_spawn"; pixel_x = -1 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "ddx" = ( @@ -95200,11 +95200,11 @@ name = "\improper Secure Lab" }) "ddD" = ( -/turf/space, /obj/structure/cable{ icon_state = "0-2"; d2 = 2 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "ddE" = ( diff --git a/_maps/map_files/MetaStation/z2.dmm b/_maps/map_files/MetaStation/z2.dmm index 25a1d408e93..5533ba2af8d 100644 --- a/_maps/map_files/MetaStation/z2.dmm +++ b/_maps/map_files/MetaStation/z2.dmm @@ -231,8 +231,8 @@ }, /area/holodeck/source_desert) "aJ" = ( -/turf/simulated/floor/holofloor/grass, /obj/structure/flora/ausbushes/ywflowers, +/turf/simulated/floor/holofloor/grass, /turf/simulated/floor/holofloor{ tag = "icon-wood_siding2 (EAST)"; icon_state = "wood_siding2"; @@ -248,8 +248,8 @@ /turf/simulated/floor/holofloor/grass, /area/holodeck/source_picnicarea) "aM" = ( -/turf/simulated/floor/holofloor/grass, /obj/structure/flora/ausbushes/brflowers, +/turf/simulated/floor/holofloor/grass, /turf/simulated/floor/holofloor{ tag = "icon-wood_siding2 (EAST)"; icon_state = "wood_siding2"; @@ -315,8 +315,8 @@ }, /area/holodeck/source_picnicarea) "aU" = ( -/turf/simulated/floor/holofloor/grass, /obj/structure/flora/ausbushes/grassybush, +/turf/simulated/floor/holofloor/grass, /turf/simulated/floor/holofloor{ tag = "icon-wood_siding5"; icon_state = "wood_siding5"; @@ -336,8 +336,8 @@ }, /area/holodeck/source_picnicarea) "aX" = ( -/turf/simulated/floor/holofloor/grass, /obj/structure/flora/ausbushes/grassybush, +/turf/simulated/floor/holofloor/grass, /turf/simulated/floor/holofloor{ tag = "icon-wood_siding9"; icon_state = "wood_siding9"; @@ -388,8 +388,8 @@ }, /area/holodeck/source_desert) "bf" = ( -/turf/simulated/floor/holofloor/grass, /obj/structure/flora/ausbushes/grassybush, +/turf/simulated/floor/holofloor/grass, /turf/simulated/floor/holofloor{ tag = "icon-wood_siding6"; icon_state = "wood_siding6"; @@ -397,8 +397,8 @@ }, /area/holodeck/source_picnicarea) "bg" = ( -/turf/simulated/floor/holofloor/grass, /obj/structure/flora/ausbushes/grassybush, +/turf/simulated/floor/holofloor/grass, /turf/simulated/floor/holofloor{ tag = "icon-wood_siding10"; icon_state = "wood_siding10"; @@ -452,8 +452,8 @@ }, /area/holodeck/source_theatre) "bo" = ( -/turf/simulated/floor/holofloor/grass, /obj/structure/flora/ausbushes/ywflowers, +/turf/simulated/floor/holofloor/grass, /turf/simulated/floor/holofloor{ tag = "icon-wood_siding1"; icon_state = "wood_siding1"; @@ -461,8 +461,8 @@ }, /area/holodeck/source_picnicarea) "bp" = ( -/turf/simulated/floor/holofloor/grass, /obj/structure/flora/ausbushes/brflowers, +/turf/simulated/floor/holofloor/grass, /turf/simulated/floor/holofloor{ tag = "icon-wood_siding1"; icon_state = "wood_siding1"; @@ -867,10 +867,10 @@ }, /area/holodeck/source_meetinghall) "cq" = ( -/turf/unsimulated/floor/snow, /obj/structure/flora/tree/pine{ pixel_x = 1 }, +/turf/unsimulated/floor/snow, /turf/unsimulated/floor/snow{ icon_state = "gravsnow_corner" }, @@ -3619,10 +3619,10 @@ }, /area/syndicate_mothership) "jZ" = ( -/turf/unsimulated/floor/snow, /obj/structure/flora/tree/pine{ pixel_x = 1 }, +/turf/unsimulated/floor/snow, /turf/unsimulated/floor/snow{ tag = "icon-gravsnow_corner (WEST)"; icon_state = "gravsnow_corner"; @@ -3757,8 +3757,8 @@ /turf/space/transit, /area/wizard_station) "kr" = ( -/turf/unsimulated/floor/snow, /obj/structure/flora/tree/pine, +/turf/unsimulated/floor/snow, /turf/unsimulated/floor/snow{ icon_state = "gravsnow_corner" }, @@ -3772,8 +3772,8 @@ /turf/simulated/floor/plating/airless, /area/wizard_station) "kt" = ( -/turf/unsimulated/floor/snow, /obj/structure/flora/grass/brown, +/turf/unsimulated/floor/snow, /turf/unsimulated/floor/snow{ icon_state = "gravsnow_corner" }, @@ -3961,8 +3961,8 @@ /turf/unsimulated/wall, /area/tdome/tdomeobserve) "kW" = ( -/turf/unsimulated/floor/snow, /obj/structure/flora/grass/brown, +/turf/unsimulated/floor/snow, /turf/unsimulated/floor/snow{ tag = "icon-gravsnow_corner (SOUTHWEST)"; icon_state = "gravsnow_corner"; @@ -4507,8 +4507,8 @@ /turf/unsimulated/floor/abductor, /area/abductor_ship) "mB" = ( -/turf/unsimulated/floor/snow, /obj/structure/flora/grass/brown, +/turf/unsimulated/floor/snow, /turf/unsimulated/floor/snow{ tag = "icon-gravsnow_corner (EAST)"; icon_state = "gravsnow_corner"; @@ -4801,9 +4801,9 @@ }, /area/syndicate_mothership) "nh" = ( +/obj/machinery/porta_turret/syndicate/pod, /turf/simulated/floor/pod, /turf/space, -/obj/machinery/porta_turret/syndicate/pod, /turf/simulated/shuttle/wall{ dir = 8; icon_state = "diagonalWall3" @@ -4819,9 +4819,9 @@ /turf/simulated/floor/plating, /area/shuttle/assault_pod) "nj" = ( +/obj/machinery/porta_turret/syndicate/pod, /turf/simulated/floor/pod, /turf/space, -/obj/machinery/porta_turret/syndicate/pod, /turf/simulated/shuttle/wall{ dir = 1; icon_state = "diagonalWall3" @@ -5099,8 +5099,8 @@ /turf/unsimulated/floor/snow, /area/syndicate_mothership) "nP" = ( -/turf/unsimulated/floor/snow, /obj/structure/flora/grass/brown, +/turf/unsimulated/floor/snow, /turf/unsimulated/floor/snow{ tag = "icon-gravsnow_corner (WEST)"; icon_state = "gravsnow_corner"; @@ -5201,9 +5201,9 @@ }, /area/syndicate_mothership) "oa" = ( +/obj/machinery/porta_turret/syndicate/pod, /turf/simulated/floor/pod, /turf/space, -/obj/machinery/porta_turret/syndicate/pod, /turf/simulated/shuttle/wall{ tag = "icon-diagonalWall3"; icon_state = "diagonalWall3"; @@ -5211,9 +5211,9 @@ }, /area/shuttle/assault_pod) "ob" = ( +/obj/machinery/porta_turret/syndicate/pod, /turf/simulated/floor/pod, /turf/space, -/obj/machinery/porta_turret/syndicate/pod, /turf/simulated/shuttle/wall{ dir = 4; icon_state = "diagonalWall3" @@ -5339,8 +5339,8 @@ }, /area/syndicate_mothership) "os" = ( -/turf/unsimulated/floor/snow, /obj/structure/flora/bush, +/turf/unsimulated/floor/snow, /turf/unsimulated/floor/snow{ tag = "icon-gravsnow_corner (NORTH)"; icon_state = "gravsnow_corner"; @@ -5520,8 +5520,8 @@ }, /area/wizard_station) "oS" = ( -/turf/unsimulated/floor/snow, /obj/structure/flora/bush, +/turf/unsimulated/floor/snow, /turf/unsimulated/floor/snow{ tag = "icon-gravsnow_corner (WEST)"; icon_state = "gravsnow_corner"; diff --git a/_maps/map_files/MetaStation/z3.dmm b/_maps/map_files/MetaStation/z3.dmm index c2a11075ee8..c1e20ddacaa 100644 --- a/_maps/map_files/MetaStation/z3.dmm +++ b/_maps/map_files/MetaStation/z3.dmm @@ -1060,6 +1060,16 @@ /obj/structure/girder, /turf/simulated/floor/plating/airless, /area/AIsattele) +"gw" = ( +/obj/machinery/atmospherics/unary/portables_connector{ + dir = 1 + }, +/turf/simulated/floor/plating/airless, +/area/AIsattele) +"AV" = ( +/obj/machinery/atmospherics/unary/tank/oxygen_agent_b, +/turf/simulated/floor/plating/airless, +/area/AIsattele) (1,1,1) = {" aa @@ -55476,8 +55486,8 @@ aa ay em em -er -eB +AV +gw eG em em diff --git a/_maps/map_files/MetaStation/z4.dmm b/_maps/map_files/MetaStation/z4.dmm index 3f3b3ae1ab9..95277b92bf9 100644 --- a/_maps/map_files/MetaStation/z4.dmm +++ b/_maps/map_files/MetaStation/z4.dmm @@ -4863,8 +4863,8 @@ /turf/simulated/floor/plating/airless, /area/derelict/se_solar) "nv" = ( -/turf/space, /obj/structure/cable, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/derelict_aft) "nw" = ( @@ -4896,11 +4896,11 @@ /turf/simulated/floor/plating/airless, /area/derelict/hallway/secondary) "nA" = ( -/turf/space, /obj/structure/cable{ icon_state = "0-2"; d2 = 2 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/derelict_aft) "nB" = ( @@ -4915,13 +4915,13 @@ /turf/simulated/floor/plating/airless, /area/solar/derelict_aft) "nC" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/derelict_aft) "nD" = ( @@ -4941,7 +4941,6 @@ /turf/simulated/floor/plating/airless, /area/solar/derelict_aft) "nF" = ( -/turf/space, /obj/structure/cable{ d1 = 4; d2 = 8; @@ -4957,10 +4956,10 @@ d2 = 4; icon_state = "2-4" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/derelict_aft) "nG" = ( -/turf/space, /obj/structure/cable{ d1 = 2; d2 = 4; @@ -4971,19 +4970,19 @@ d2 = 4; icon_state = "1-4" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/derelict_aft) "nH" = ( -/turf/space, /obj/structure/cable{ d1 = 4; d2 = 8; icon_state = "4-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/derelict_aft) "nI" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 8; @@ -5000,10 +4999,10 @@ icon_state = "1-2"; pixel_y = 0 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/derelict_aft) "nJ" = ( -/turf/space, /obj/structure/cable{ d1 = 4; d2 = 8; @@ -5014,10 +5013,10 @@ d2 = 8; icon_state = "1-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/derelict_aft) "nK" = ( -/turf/space, /obj/structure/cable{ d1 = 4; d2 = 8; @@ -5033,11 +5032,12 @@ d2 = 8; icon_state = "1-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/derelict_aft) "nL" = ( -/turf/space, /obj/item/stack/cable_coil/cut, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "nM" = ( @@ -5146,7 +5146,6 @@ /turf/simulated/floor/plating/airless, /area/derelict/hallway/secondary) "of" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 4; @@ -5157,6 +5156,7 @@ d2 = 4; icon_state = "2-4" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/derelict_aft) "og" = ( @@ -5175,7 +5175,6 @@ /turf/simulated/floor/plating/airless, /area/space) "oj" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 8; @@ -5186,6 +5185,7 @@ d2 = 8; icon_state = "2-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/derelict_aft) "ok" = ( diff --git a/_maps/map_files/RandomRuins/SpaceRuins/oldstation.dmm b/_maps/map_files/RandomRuins/SpaceRuins/oldstation.dmm index 296c5013867..8ce28e665a2 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/oldstation.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/oldstation.dmm @@ -1809,7 +1809,6 @@ }, /area/ruin/space/ancientstation/engi) "eK" = ( -/turf/simulated/floor/plating/airless, /obj/structure/cable/yellow{ d1 = 2; d2 = 4; @@ -1820,6 +1819,7 @@ d2 = 8; icon_state = "2-8" }, +/turf/simulated/floor/plating/airless, /turf/simulated/floor/plating/airless/catwalk, /area/template_noop) "eL" = ( @@ -2997,12 +2997,12 @@ }, /area/ruin/space/ancientstation/sec) "hf" = ( -/turf/simulated/floor/plating/airless, /obj/structure/cable/yellow{ d1 = 1; d2 = 2; icon_state = "1-2" }, +/turf/simulated/floor/plating/airless, /turf/simulated/floor/plating/airless/catwalk, /area/template_noop) "hg" = ( @@ -3117,7 +3117,6 @@ }, /area/ruin/space/ancientstation/kitchen) "hs" = ( -/turf/simulated/floor/plating/airless, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -3131,6 +3130,7 @@ d2 = 4; icon_state = "2-4" }, +/turf/simulated/floor/plating/airless, /turf/simulated/floor/plating/airless/catwalk, /area/template_noop) "ht" = ( @@ -3302,7 +3302,6 @@ }, /area/ruin/space/ancientstation/kitchen) "hJ" = ( -/turf/simulated/floor/plating/airless, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -3311,6 +3310,7 @@ d2 = 8; icon_state = "4-8" }, +/turf/simulated/floor/plating/airless, /turf/simulated/floor/plating/airless/catwalk, /area/template_noop) "hK" = ( @@ -3704,7 +3704,6 @@ /turf/simulated/floor/plating, /area/ruin/space/ancientstation/deltacorridor) "iB" = ( -/turf/simulated/floor/plating/airless, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -3723,6 +3722,7 @@ d2 = 4; icon_state = "1-4" }, +/turf/simulated/floor/plating/airless, /turf/simulated/floor/plating/airless/catwalk, /area/template_noop) "iC" = ( @@ -3826,21 +3826,21 @@ /turf/simulated/floor/plasteel, /area/ruin/space/ancientstation/powered) "iO" = ( -/turf/simulated/floor/plating, /obj/structure/cable/yellow{ d1 = 1; d2 = 2; icon_state = "1-2" }, +/turf/simulated/floor/plating, /turf/simulated/floor/plating/airless/catwalk, /area/template_noop) "iP" = ( -/turf/simulated/floor/plating, /obj/structure/cable/yellow{ d1 = 1; d2 = 8; icon_state = "1-8" }, +/turf/simulated/floor/plating, /turf/simulated/floor/plating/airless/catwalk, /area/template_noop) "iQ" = ( @@ -4130,12 +4130,12 @@ }, /area/ruin/space/ancientstation/proto) "jw" = ( -/turf/simulated/floor/plating/airless, /obj/structure/cable/yellow{ d1 = 1; d2 = 8; icon_state = "1-8" }, +/turf/simulated/floor/plating/airless, /turf/simulated/floor/plating/airless/catwalk, /area/template_noop) "jx" = ( @@ -4483,12 +4483,12 @@ /turf/simulated/floor/plating/airless, /area/ruin/space/ancientstation/atmo) "kl" = ( -/turf/simulated/floor/plating/airless, /obj/structure/cable/yellow{ d1 = 1; d2 = 4; icon_state = "1-4" }, +/turf/simulated/floor/plating/airless, /turf/simulated/floor/plating/airless/catwalk, /area/template_noop) "km" = ( @@ -4579,12 +4579,12 @@ /turf/simulated/floor/plating/airless, /area/ruin/space/ancientstation/atmo) "kv" = ( -/turf/simulated/floor/plating, /obj/structure/cable/yellow{ d1 = 1; d2 = 4; icon_state = "1-4" }, +/turf/simulated/floor/plating, /turf/simulated/floor/plating/airless/catwalk, /area/template_noop) "kw" = ( diff --git a/_maps/map_files/RandomRuins/SpaceRuins/spacebar.dmm b/_maps/map_files/RandomRuins/SpaceRuins/spacebar.dmm index da654b419ba..54e511a4373 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/spacebar.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/spacebar.dmm @@ -143,8 +143,8 @@ name = "Space Bar" }) "aA" = ( -/turf/simulated/floor/plating, /obj/structure/shuttle/engine/propulsion/burst, +/turf/simulated/floor/plating, /turf/simulated/shuttle/wall{ icon_state = "swall_f5"; dir = 2 @@ -157,8 +157,8 @@ /turf/simulated/shuttle/floor, /area/ruin/powered) "aC" = ( -/turf/simulated/floor/plating, /obj/structure/shuttle/engine/propulsion/burst, +/turf/simulated/floor/plating, /turf/simulated/shuttle/wall{ icon_state = "swall_f9"; dir = 2 @@ -442,8 +442,8 @@ /turf/simulated/floor/plating, /area/ruin/powered) "bp" = ( -/turf/simulated/floor/plating/airless/asteroid, /obj/structure/shuttle/engine/propulsion/burst, +/turf/simulated/floor/plating/airless/asteroid, /turf/simulated/shuttle/wall{ icon_state = "swall_f5"; dir = 2 @@ -464,8 +464,8 @@ /turf/simulated/floor/plating, /area/ruin/powered) "bs" = ( -/turf/simulated/floor/plating/airless/asteroid, /obj/structure/shuttle/engine/propulsion/burst, +/turf/simulated/floor/plating/airless/asteroid, /turf/simulated/shuttle/wall{ icon_state = "swall_f9"; dir = 2 diff --git a/_maps/map_files/RandomZLevels/centcomAway.dmm b/_maps/map_files/RandomZLevels/centcomAway.dmm index f252a7a79ee..bd6b40c51de 100644 --- a/_maps/map_files/RandomZLevels/centcomAway.dmm +++ b/_maps/map_files/RandomZLevels/centcomAway.dmm @@ -1052,7 +1052,6 @@ /turf/simulated/floor/plating, /area/awaymission/centcomAway/maint) "cN" = ( -/turf/space, /obj/structure/cable{ d1 = 4; d2 = 8; @@ -1060,10 +1059,10 @@ pixel_x = 0; tag = "" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/awaymission/centcomAway/maint) "cO" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 8; @@ -1083,6 +1082,7 @@ pixel_x = 0; tag = "" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/awaymission/centcomAway/maint) "cP" = ( @@ -1538,7 +1538,6 @@ }, /area/awaymission/centcomAway/hangar) "dU" = ( -/turf/space, /obj/structure/cable{ d1 = 2; d2 = 8; @@ -1552,6 +1551,7 @@ pixel_x = 0; tag = "" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/awaymission/centcomAway/maint) "dV" = ( @@ -1639,7 +1639,6 @@ }, /area/awaymission/centcomAway/hangar) "eh" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 2; @@ -1647,6 +1646,7 @@ pixel_y = 0; tag = "" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/awaymission/centcomAway/maint) "ei" = ( @@ -1692,9 +1692,9 @@ /turf/simulated/floor/plating, /area/awaymission/centcomAway/hangar) "eo" = ( -/turf/space, /obj/structure/cable, /obj/machinery/power/tracker, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/awaymission/centcomAway/maint) "ep" = ( @@ -4679,20 +4679,20 @@ }, /area/awaymission/centcomAway/general) "ls" = ( -/turf/simulated/floor/plating, /obj/structure/shuttle/engine/propulsion/burst{ dir = 8 }, +/turf/simulated/floor/plating, /turf/simulated/shuttle/wall{ icon_state = "swall_f6"; dir = 2 }, /area/awaymission/centcomAway/hangar) "lt" = ( -/turf/simulated/floor/plating, /obj/structure/shuttle/engine/propulsion/burst{ dir = 8 }, +/turf/simulated/floor/plating, /turf/simulated/shuttle/wall{ icon_state = "swall_f5"; dir = 2 diff --git a/_maps/map_files/RandomZLevels/spacehotel.dmm b/_maps/map_files/RandomZLevels/spacehotel.dmm index 7f144031668..b107cfec5b9 100644 --- a/_maps/map_files/RandomZLevels/spacehotel.dmm +++ b/_maps/map_files/RandomZLevels/spacehotel.dmm @@ -2364,42 +2364,42 @@ /area/awaymission/spacehotel) "ev" = ( /obj/machinery/door/unpowered/hotel_door{ - icon = 'icons/obj/doors/Doorgold.dmi'; + icon = 'icons/obj/doors/doorgold.dmi'; id = 110 }, /turf/unsimulated/floor/carpet, /area/awaymission/spacehotel) "ew" = ( /obj/machinery/door/unpowered/hotel_door{ - icon = 'icons/obj/doors/Doorgold.dmi'; + icon = 'icons/obj/doors/doorgold.dmi'; id = 111 }, /turf/unsimulated/floor/carpet, /area/awaymission/spacehotel) "ex" = ( /obj/machinery/door/unpowered/hotel_door{ - icon = 'icons/obj/doors/Doorgold.dmi'; + icon = 'icons/obj/doors/doorgold.dmi'; id = 112 }, /turf/unsimulated/floor/carpet, /area/awaymission/spacehotel) "ey" = ( /obj/machinery/door/unpowered/hotel_door{ - icon = 'icons/obj/doors/Doorgold.dmi'; + icon = 'icons/obj/doors/doorgold.dmi'; id = 210 }, /turf/unsimulated/floor/carpet, /area/awaymission/spacehotel) "ez" = ( /obj/machinery/door/unpowered/hotel_door{ - icon = 'icons/obj/doors/Doorgold.dmi'; + icon = 'icons/obj/doors/doorgold.dmi'; id = 211 }, /turf/unsimulated/floor/carpet, /area/awaymission/spacehotel) "eA" = ( /obj/machinery/door/unpowered/hotel_door{ - icon = 'icons/obj/doors/Doorgold.dmi'; + icon = 'icons/obj/doors/doorgold.dmi'; id = 212 }, /turf/unsimulated/floor/carpet, diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index 579e69c9762..a0deb25b20d 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -619,8 +619,8 @@ }, /area/shuttle/abandoned) "abG" = ( -/turf/space, /obj/machinery/porta_turret/syndicate, +/turf/space, /turf/simulated/shuttle/wall{ dir = 8; icon_state = "diagonalWall3" @@ -686,8 +686,8 @@ /turf/simulated/shuttle/plating, /area/shuttle/syndicate) "abL" = ( -/turf/space, /obj/machinery/porta_turret/syndicate, +/turf/space, /turf/simulated/shuttle/wall{ dir = 1; icon_state = "diagonalWall3" @@ -2151,6 +2151,7 @@ }, /area/shuttle/syndicate_sit) "aey" = ( +/obj/machinery/computer/brigcells, /turf/simulated/floor/plasteel{ dir = 9; icon_state = "darkred" @@ -6056,13 +6057,14 @@ /turf/simulated/floor/plasteel, /area/security/permabrig) "akN" = ( -/obj/item/twohanded/required/kirbyplants, /obj/machinery/newscaster{ pixel_y = 30 }, /obj/machinery/computer/security/telescreen/entertainment{ pixel_x = 32 }, +/obj/structure/closet/secure_closet/hos, +/obj/item/reagent_containers/food/drinks/flask/barflask, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -6581,12 +6583,12 @@ /turf/simulated/floor/plating, /area/security/hos) "alD" = ( -/turf/space, /obj/structure/cable{ icon_state = "0-2"; d2 = 2 }, /obj/machinery/power/tracker, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/auxstarboard) "alE" = ( @@ -7003,7 +7005,6 @@ /turf/simulated/floor/plasteel, /area/security/main) "amo" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 2; @@ -7011,6 +7012,7 @@ pixel_y = 0; tag = "" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/auxstarboard) "amp" = ( @@ -7070,8 +7072,6 @@ /turf/simulated/floor/plating, /area/security/permabrig) "amt" = ( -/obj/structure/closet/secure_closet/hos, -/obj/item/reagent_containers/food/drinks/flask/barflask, /obj/machinery/requests_console{ announcementConsole = 1; department = "Head of Security's Desk"; @@ -7080,6 +7080,7 @@ pixel_x = 30; pixel_y = 0 }, +/obj/machinery/computer/brigcells, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -7385,12 +7386,12 @@ }, /area/security/hos) "amU" = ( -/turf/space, /obj/structure/cable{ icon_state = "0-2"; d2 = 2 }, /obj/machinery/power/tracker, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/auxport) "amV" = ( @@ -7542,8 +7543,8 @@ }, /area/security/permabrig) "ann" = ( -/turf/space, /obj/structure/cable, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/auxstarboard) "ano" = ( @@ -7783,7 +7784,6 @@ /turf/simulated/floor/plasteel, /area/security/seceqstorage) "anG" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 2; @@ -7791,6 +7791,7 @@ pixel_y = 0; tag = "" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/auxport) "anH" = ( @@ -8160,7 +8161,7 @@ }, /area/security/evidence) "aom" = ( -/obj/machinery/computer/station_alert/all, +/obj/machinery/computer/brigcells, /turf/simulated/floor/plasteel{ dir = 9; icon_state = "darkred" @@ -8456,7 +8457,6 @@ /turf/simulated/floor/plasteel, /area/security/main) "aoK" = ( -/turf/space, /obj/structure/cable{ d1 = 2; d2 = 8; @@ -8469,6 +8469,7 @@ icon_state = "2-4"; tag = "" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/auxstarboard) "aoL" = ( @@ -8826,7 +8827,6 @@ /turf/simulated/floor/plating, /area/security/main) "apn" = ( -/turf/space, /obj/structure/cable{ d1 = 2; d2 = 8; @@ -8845,6 +8845,7 @@ icon_state = "1-2"; tag = "" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/auxstarboard) "apo" = ( @@ -9793,8 +9794,8 @@ }, /area/lawoffice) "arb" = ( -/turf/space, /obj/structure/cable, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/auxport) "arc" = ( @@ -10293,7 +10294,6 @@ }, /area/security/evidence) "arL" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 4; @@ -10306,10 +10306,10 @@ icon_state = "2-4"; tag = "" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/auxport) "arM" = ( -/turf/space, /obj/structure/cable{ d1 = 4; d2 = 8; @@ -10329,14 +10329,15 @@ icon_state = "2-4"; tag = "" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/auxport) "arN" = ( -/turf/space, /obj/structure/cable{ d2 = 8; icon_state = "0-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/auxport) "arO" = ( @@ -10405,11 +10406,11 @@ /turf/simulated/floor/plating, /area/maintenance/fsmaint) "arU" = ( -/turf/space, /obj/structure/cable{ icon_state = "0-4"; d2 = 4 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/auxport) "arV" = ( @@ -11004,7 +11005,6 @@ }, /area/shuttle/trade/sol) "asL" = ( -/turf/space, /obj/structure/cable{ d1 = 4; d2 = 8; @@ -11024,10 +11024,10 @@ icon_state = "1-8"; tag = "" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/auxport) "asM" = ( -/turf/space, /obj/structure/cable{ d1 = 2; d2 = 8; @@ -11040,6 +11040,7 @@ icon_state = "1-8"; tag = "" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/auxport) "asN" = ( @@ -13075,7 +13076,6 @@ }, /area/security/permabrig) "avM" = ( -/turf/space, /obj/machinery/access_button{ command = "cycle_exterior"; frequency = 1450; @@ -13085,6 +13085,7 @@ pixel_y = -25; req_access_txt = "13" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "avN" = ( @@ -13418,7 +13419,6 @@ /turf/simulated/floor/plasteel, /area/security/processing) "awk" = ( -/turf/space, /obj/machinery/access_button{ command = "cycle_exterior"; frequency = 1379; @@ -13433,6 +13433,7 @@ pixel_y = 1; d2 = 2 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/auxport) "awl" = ( @@ -13711,10 +13712,10 @@ }, /area/security/permabrig) "awP" = ( -/turf/simulated/floor/plating, /obj/structure/shuttle/engine/propulsion/burst{ dir = 8 }, +/turf/simulated/floor/plating, /turf/simulated/shuttle/wall{ tag = "icon-swall_f6"; icon_state = "swall_f6"; @@ -13722,20 +13723,20 @@ }, /area/shuttle/pod_3) "awQ" = ( -/turf/space, /obj/structure/cable{ d1 = 2; d2 = 4; icon_state = "2-4" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/auxstarboard) "awR" = ( -/turf/space, /obj/structure/cable{ d2 = 8; icon_state = "0-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/auxstarboard) "awS" = ( @@ -14008,13 +14009,13 @@ }, /area/lawoffice) "axq" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 2; icon_state = "1-2"; tag = "" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/auxstarboard) "axr" = ( @@ -14330,10 +14331,10 @@ }, /area/security/prison/cell_block/A) "axN" = ( -/turf/simulated/floor/plating, /obj/structure/shuttle/engine/propulsion/burst{ dir = 8 }, +/turf/simulated/floor/plating, /turf/simulated/shuttle/wall{ tag = "icon-swall_f5"; icon_state = "swall_f5"; @@ -14690,7 +14691,7 @@ /obj/machinery/camera{ c_tag = "Prison South"; dir = 1; - network = list("SS13") + network = list("Prison","SS13") }, /turf/simulated/floor/plasteel{ icon_state = "floorgrime" @@ -14809,7 +14810,6 @@ }, /area/security/execution) "ayE" = ( -/turf/space, /obj/machinery/access_button{ command = "cycle_exterior"; frequency = 1379; @@ -14825,6 +14825,7 @@ icon_state = "1-2"; tag = "" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/auxstarboard) "ayF" = ( @@ -15159,7 +15160,6 @@ /turf/simulated/wall/r_wall, /area/security/processing) "azb" = ( -/turf/space, /obj/machinery/access_button{ command = "cycle_exterior"; frequency = 1450; @@ -15169,6 +15169,7 @@ pixel_y = -25; req_access_txt = "13" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "azc" = ( @@ -16525,7 +16526,6 @@ /turf/simulated/floor/plating, /area/maintenance/fsmaint) "aBx" = ( -/turf/space, /obj/machinery/access_button{ command = "cycle_exterior"; frequency = 1379; @@ -16535,6 +16535,7 @@ pixel_y = 0; req_access_txt = "13" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "aBy" = ( @@ -18243,7 +18244,6 @@ /turf/simulated/floor/plating, /area/maintenance/fpmaint2) "aEM" = ( -/turf/space, /obj/machinery/access_button{ command = "cycle_exterior"; frequency = 1379; @@ -18253,6 +18253,7 @@ pixel_y = -25; req_access_txt = "13" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "aEN" = ( @@ -22882,16 +22883,16 @@ /turf/simulated/floor/plating, /area/maintenance/electrical) "aON" = ( -/turf/simulated/floor/plating, /obj/structure/shuttle/engine/propulsion/burst, +/turf/simulated/floor/plating, /turf/simulated/shuttle/wall{ icon_state = "swall_f5"; dir = 2 }, /area/shuttle/pod_1) "aOO" = ( -/turf/simulated/floor/plating, /obj/structure/shuttle/engine/propulsion/burst, +/turf/simulated/floor/plating, /turf/simulated/shuttle/wall{ icon_state = "swall_f9"; dir = 2 @@ -23349,8 +23350,8 @@ /turf/simulated/wall, /area/maintenance/electrical) "aPP" = ( -/turf/simulated/floor/plating, /obj/structure/shuttle/engine/propulsion/burst, +/turf/simulated/floor/plating, /turf/simulated/shuttle/wall{ icon_state = "swall_f5"; dir = 2 @@ -23404,8 +23405,8 @@ }, /area/hallway/secondary/entry) "aPU" = ( -/turf/simulated/floor/plating, /obj/structure/shuttle/engine/propulsion/burst, +/turf/simulated/floor/plating, /turf/simulated/shuttle/wall{ icon_state = "swall_f9"; dir = 2 @@ -33753,6 +33754,13 @@ }, /area/hydroponics) "bje" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, /turf/simulated/floor/plasteel{ dir = 2; icon_state = "asteroid"; @@ -33763,13 +33771,6 @@ icon_state = "siding2"; dir = 1 }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 6 - }, /turf/simulated/floor/plasteel{ tag = "icon-siding1 (NORTH)"; icon_state = "siding1"; @@ -33781,16 +33782,6 @@ /turf/simulated/floor/wood, /area/crew_quarters/bar) "bjg" = ( -/turf/simulated/floor/plasteel{ - dir = 2; - icon_state = "asteroid"; - tag = "icon-asteroid (NORTH)" - }, -/turf/simulated/floor/plasteel{ - tag = "icon-siding1 (NORTH)"; - icon_state = "siding1"; - dir = 1 - }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -33798,13 +33789,6 @@ dir = 4 }, /mob/living/simple_animal/pig, -/turf/simulated/floor/plasteel{ - tag = "icon-siding2 (NORTH)"; - icon_state = "siding2"; - dir = 1 - }, -/area/hydroponics) -"bjh" = ( /turf/simulated/floor/plasteel{ dir = 2; icon_state = "asteroid"; @@ -33815,12 +33799,29 @@ icon_state = "siding1"; dir = 1 }, +/turf/simulated/floor/plasteel{ + tag = "icon-siding2 (NORTH)"; + icon_state = "siding2"; + dir = 1 + }, +/area/hydroponics) +"bjh" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, +/turf/simulated/floor/plasteel{ + dir = 2; + icon_state = "asteroid"; + tag = "icon-asteroid (NORTH)" + }, +/turf/simulated/floor/plasteel{ + tag = "icon-siding1 (NORTH)"; + icon_state = "siding1"; + dir = 1 + }, /turf/simulated/floor/plasteel{ tag = "icon-siding2 (NORTH)"; icon_state = "siding2"; @@ -40653,12 +40654,12 @@ /turf/simulated/floor/plasteel, /area/hallway/secondary/exit) "bwX" = ( -/turf/space, /obj/structure/shuttle/engine/propulsion{ dir = 8; icon_state = "propulsion"; tag = "icon-propulsion (EAST)" }, +/turf/space, /turf/simulated/shuttle/wall{ icon_state = "swall_f6"; dir = 2 @@ -41449,12 +41450,12 @@ }, /area/hallway/primary/central/ne) "bys" = ( -/turf/space, /obj/structure/shuttle/engine/propulsion{ dir = 8; icon_state = "propulsion"; tag = "icon-propulsion (EAST)" }, +/turf/space, /turf/simulated/shuttle/wall{ icon_state = "swall_f5"; dir = 2 @@ -49565,11 +49566,9 @@ pixel_y = 0; step_size = 0 }, -/obj/item/storage/box/pillbottles, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 8 }, -/obj/item/storage/box/iv_bags, /turf/simulated/floor/plasteel{ tag = "icon-whitebluefull"; icon_state = "whitebluefull" @@ -66710,7 +66709,6 @@ /turf/simulated/floor/plating, /area/medical/virology) "cpz" = ( -/turf/space, /obj/structure/cable{ d1 = 2; d2 = 8; @@ -66723,6 +66721,7 @@ icon_state = "2-4"; tag = "" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/port) "cpA" = ( @@ -80064,7 +80063,6 @@ /turf/simulated/floor/plating, /area/maintenance/asmaint) "cMB" = ( -/turf/space, /obj/structure/cable{ d1 = 2; d2 = 8; @@ -80083,6 +80081,7 @@ icon_state = "1-2"; tag = "" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/port) "cMC" = ( @@ -80625,11 +80624,11 @@ /turf/simulated/floor/plating, /area/maintenance/aft) "cNE" = ( -/turf/space, /obj/machinery/atmospherics/pipe/simple/visible/yellow{ dir = 10; level = 2 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "cNF" = ( @@ -81634,13 +81633,13 @@ /turf/simulated/floor/plasteel, /area/assembly/assembly_line) "cPw" = ( -/turf/space, /obj/machinery/atmospherics/pipe/simple/visible/yellow, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "cPx" = ( -/turf/space, /obj/structure/cable, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/port) "cPy" = ( @@ -81683,12 +81682,12 @@ /turf/simulated/floor/plasteel, /area/atmos/distribution) "cPC" = ( -/turf/space, /obj/machinery/power/tracker, /obj/structure/cable{ icon_state = "0-4"; d2 = 4 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/port) "cPD" = ( @@ -81728,29 +81727,29 @@ }, /area/toxins/xenobiology) "cPG" = ( -/turf/space, /obj/structure/cable{ d1 = 4; d2 = 8; icon_state = "4-8"; tag = "" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/port) "cPH" = ( -/turf/space, /obj/structure/cable{ d2 = 8; icon_state = "0-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/port) "cPI" = ( -/turf/space, /obj/structure/cable{ icon_state = "0-4"; d2 = 4 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/port) "cPJ" = ( @@ -81919,7 +81918,6 @@ /turf/simulated/floor/plating, /area/atmos/distribution) "cQa" = ( -/turf/space, /obj/machinery/access_button{ command = "cycle_exterior"; frequency = 1379; @@ -81935,6 +81933,7 @@ icon_state = "4-8"; tag = "" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/port) "cQb" = ( @@ -82065,11 +82064,11 @@ /turf/space, /area/space) "cQq" = ( -/turf/space, /obj/structure/cable{ icon_state = "0-2"; d2 = 2 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/port) "cQr" = ( @@ -82565,7 +82564,6 @@ /turf/simulated/floor/plasteel, /area/atmos/distribution) "cRe" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 8; @@ -82584,6 +82582,7 @@ icon_state = "1-2"; tag = "" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/port) "cRf" = ( @@ -83266,7 +83265,6 @@ /turf/simulated/floor/plating, /area/maintenance/aft) "cSk" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 8; @@ -83279,6 +83277,7 @@ icon_state = "1-4"; tag = "" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/port) "cSl" = ( @@ -84244,7 +84243,6 @@ /turf/simulated/floor/plasteel, /area/maintenance/asmaint) "cTR" = ( -/turf/space, /obj/machinery/access_button{ command = "cycle_exterior"; frequency = 1450; @@ -84254,6 +84252,7 @@ pixel_y = 8; req_access_txt = "13" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "cTS" = ( @@ -86905,12 +86904,12 @@ /turf/simulated/floor/plasteel, /area/maintenance/turbine) "cYz" = ( -/turf/space, /obj/machinery/access_button/airlock_exterior{ master_tag = "atmospherics_south"; pixel_x = -25; pixel_y = -8 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "cYA" = ( @@ -89472,7 +89471,6 @@ /turf/simulated/floor/plasteel, /area/maintenance/turbine) "ddA" = ( -/turf/space, /obj/machinery/access_button{ command = "cycle_exterior"; frequency = 1379; @@ -89489,6 +89487,7 @@ pixel_y = 0; tag = "" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "ddB" = ( @@ -89499,19 +89498,18 @@ /turf/simulated/floor/plating, /area/maintenance/asmaint2) "ddC" = ( -/turf/space, /obj/structure/transit_tube{ icon_state = "E-W-Pass" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "ddD" = ( -/turf/space, /obj/item/wrench, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "ddE" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 2; @@ -89519,6 +89517,7 @@ pixel_y = 0; tag = "" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "ddF" = ( @@ -89572,7 +89571,6 @@ /turf/space, /area/space) "ddM" = ( -/turf/space, /obj/machinery/access_button{ command = "cycle_exterior"; frequency = 1379; @@ -89582,23 +89580,23 @@ pixel_y = 25; req_access_txt = "75;13" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "ddN" = ( -/turf/space, /obj/structure/cable, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "ddO" = ( -/turf/space, /obj/machinery/atmospherics/pipe/simple/visible/yellow{ dir = 6; level = 2 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/space) "ddP" = ( -/turf/space, /obj/structure/cable{ d1 = 2; d2 = 4; @@ -89611,10 +89609,10 @@ icon_state = "1-4"; tag = "" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "ddQ" = ( -/turf/space, /obj/structure/cable{ d1 = 2; d2 = 4; @@ -89634,14 +89632,15 @@ pixel_x = 0; tag = "" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "ddR" = ( -/turf/space, /obj/structure/cable{ d2 = 8; icon_state = "0-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "ddS" = ( @@ -89649,15 +89648,14 @@ /turf/simulated/floor/plating, /area/engine/engineering) "ddT" = ( -/turf/space, /obj/structure/cable{ icon_state = "0-4"; d2 = 4 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "ddU" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 8; @@ -89677,10 +89675,10 @@ pixel_x = 0; tag = "" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "ddV" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 8; @@ -89693,13 +89691,14 @@ icon_state = "2-8"; tag = "" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "ddW" = ( -/turf/simulated/floor/plating, /obj/structure/shuttle/engine/propulsion/burst{ dir = 8 }, +/turf/simulated/floor/plating, /turf/simulated/shuttle/wall{ tag = "icon-swall_f6"; icon_state = "swall_f6"; @@ -89707,7 +89706,6 @@ }, /area/shuttle/pod_4) "ddX" = ( -/turf/space, /obj/machinery/access_button{ command = "cycle_exterior"; frequency = 1450; @@ -89717,16 +89715,17 @@ pixel_y = 25; req_access_txt = "13" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk{ tag = "icon-catwalk0"; icon_state = "catwalk0" }, /area/space) "ddY" = ( -/turf/simulated/floor/plating, /obj/structure/shuttle/engine/propulsion/burst{ dir = 8 }, +/turf/simulated/floor/plating, /turf/simulated/shuttle/wall{ tag = "icon-swall_f5"; icon_state = "swall_f5"; @@ -89755,7 +89754,6 @@ /turf/simulated/floor/plating, /area/maintenance/asmaint2) "deb" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 8; @@ -89766,6 +89764,7 @@ d2 = 8; icon_state = "2-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "dec" = ( @@ -89773,15 +89772,14 @@ /turf/simulated/floor/plasteel, /area/atmos) "ded" = ( -/turf/space, /obj/structure/cable{ icon_state = "0-2"; d2 = 2 }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "dee" = ( -/turf/space, /obj/structure/cable{ d1 = 4; d2 = 8; @@ -89789,10 +89787,10 @@ pixel_x = 0; tag = "" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "def" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 4; @@ -89811,12 +89809,13 @@ icon_state = "1-2"; tag = "" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "deg" = ( -/turf/space, /obj/structure/cable, /obj/machinery/power/tracker, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/solar/starboard) "deh" = ( diff --git a/_maps/map_files/cyberiad/z2.dmm b/_maps/map_files/cyberiad/z2.dmm index 4b46b076295..0dc62cde008 100644 --- a/_maps/map_files/cyberiad/z2.dmm +++ b/_maps/map_files/cyberiad/z2.dmm @@ -410,8 +410,8 @@ }, /area/holodeck/source_meetinghall) "bg" = ( -/turf/simulated/floor/holofloor/grass, /obj/structure/flora/ausbushes/grassybush, +/turf/simulated/floor/holofloor/grass, /turf/simulated/floor/holofloor{ tag = "icon-wood_siding5"; icon_state = "wood_siding5"; @@ -441,8 +441,8 @@ /turf/unsimulated/floor/plating/vox, /area/vox_station) "bm" = ( -/turf/simulated/floor/holofloor/grass, /obj/structure/flora/ausbushes/grassybush, +/turf/simulated/floor/holofloor/grass, /turf/simulated/floor/holofloor{ tag = "icon-wood_siding9"; icon_state = "wood_siding9"; @@ -516,8 +516,8 @@ }, /area/holodeck/source_meetinghall) "bw" = ( -/turf/simulated/floor/holofloor/grass, /obj/structure/flora/ausbushes/grassybush, +/turf/simulated/floor/holofloor/grass, /turf/simulated/floor/holofloor{ tag = "icon-wood_siding6"; icon_state = "wood_siding6"; @@ -743,8 +743,8 @@ }, /area/space) "cd" = ( -/turf/simulated/floor/holofloor/grass, /obj/structure/flora/ausbushes/brflowers, +/turf/simulated/floor/holofloor/grass, /turf/simulated/floor/holofloor{ dir = 2; icon_state = "wood_siding4"; @@ -838,8 +838,8 @@ }, /area/space) "cs" = ( -/turf/simulated/floor/holofloor/grass, /obj/structure/flora/ausbushes/grassybush, +/turf/simulated/floor/holofloor/grass, /turf/simulated/floor/holofloor{ dir = 2; icon_state = "wood_siding10"; @@ -847,8 +847,8 @@ }, /area/holodeck/source_picnicarea) "ct" = ( -/turf/simulated/floor/holofloor/grass, /obj/structure/flora/ausbushes/brflowers, +/turf/simulated/floor/holofloor/grass, /turf/simulated/floor/holofloor{ dir = 2; icon_state = "wood_siding8"; @@ -2882,10 +2882,10 @@ }, /area/syndicate_mothership) "ht" = ( -/turf/unsimulated/floor/snow, /obj/structure/flora/tree/pine{ pixel_x = 1 }, +/turf/unsimulated/floor/snow, /turf/unsimulated/floor/snow{ tag = "icon-gravsnow_corner (SOUTHWEST)"; icon_state = "gravsnow_corner"; @@ -3038,8 +3038,8 @@ }, /area/syndicate_mothership) "hP" = ( -/turf/unsimulated/floor/snow, /obj/structure/flora/grass/brown, +/turf/unsimulated/floor/snow, /turf/unsimulated/floor/snow{ tag = "icon-gravsnow_corner (EAST)"; icon_state = "gravsnow_corner"; @@ -3207,8 +3207,8 @@ }, /area/syndicate_mothership) "ip" = ( -/turf/unsimulated/floor/snow, /obj/structure/flora/grass/brown, +/turf/unsimulated/floor/snow, /turf/unsimulated/floor/snow{ tag = "icon-gravsnow_corner (SOUTHWEST)"; icon_state = "gravsnow_corner"; @@ -3362,10 +3362,10 @@ /turf/simulated/floor/plating/airless, /area/syndicate_mothership) "iH" = ( -/turf/unsimulated/floor/snow, /obj/structure/flora/tree/pine{ pixel_x = 1 }, +/turf/unsimulated/floor/snow, /turf/unsimulated/floor/snow{ icon_state = "gravsnow_corner" }, @@ -3422,9 +3422,9 @@ }, /area/syndicate_mothership) "iO" = ( +/obj/machinery/porta_turret/syndicate/pod, /turf/simulated/floor/pod, /turf/space, -/obj/machinery/porta_turret/syndicate/pod, /turf/simulated/shuttle/wall{ dir = 8; icon_state = "diagonalWall3" @@ -3440,9 +3440,9 @@ /turf/simulated/floor/plating, /area/shuttle/assault_pod) "iQ" = ( +/obj/machinery/porta_turret/syndicate/pod, /turf/simulated/floor/pod, /turf/space, -/obj/machinery/porta_turret/syndicate/pod, /turf/simulated/shuttle/wall{ dir = 1; icon_state = "diagonalWall3" @@ -3885,9 +3885,9 @@ }, /area/syndicate_mothership) "kc" = ( +/obj/machinery/porta_turret/syndicate/pod, /turf/simulated/floor/pod, /turf/space, -/obj/machinery/porta_turret/syndicate/pod, /turf/simulated/shuttle/wall{ tag = "icon-diagonalWall3"; icon_state = "diagonalWall3"; @@ -3916,9 +3916,9 @@ }, /area/wizard_station) "kh" = ( +/obj/machinery/porta_turret/syndicate/pod, /turf/simulated/floor/pod, /turf/space, -/obj/machinery/porta_turret/syndicate/pod, /turf/simulated/shuttle/wall{ dir = 4; icon_state = "diagonalWall3" @@ -3978,8 +3978,8 @@ }, /area/syndicate_mothership) "ko" = ( -/turf/unsimulated/floor/snow, /obj/structure/flora/bush, +/turf/unsimulated/floor/snow, /turf/unsimulated/floor/snow{ tag = "icon-gravsnow_corner (NORTH)"; icon_state = "gravsnow_corner"; @@ -5439,26 +5439,26 @@ }, /area/syndicate_mothership) "nX" = ( -/turf/unsimulated/floor/snow, /obj/structure/flora/tree/pine, +/turf/unsimulated/floor/snow, /turf/unsimulated/floor/snow{ icon_state = "gravsnow_corner" }, /area/syndicate_mothership) "nY" = ( -/turf/unsimulated/floor/snow, /obj/structure/flora/grass/brown, +/turf/unsimulated/floor/snow, /turf/unsimulated/floor/snow{ icon_state = "gravsnow_corner" }, /area/syndicate_mothership) "nZ" = ( -/turf/unsimulated/floor{ - icon_state = "engine" - }, /obj/structure/window/reinforced{ dir = 1 }, +/turf/unsimulated/floor{ + icon_state = "engine" + }, /turf/unsimulated/wall{ dir = 1; icon = 'icons/turf/shuttle.dmi'; @@ -5466,12 +5466,12 @@ }, /area/admin) "oa" = ( -/turf/unsimulated/floor{ - icon_state = "engine" - }, /obj/structure/window/reinforced{ dir = 1 }, +/turf/unsimulated/floor{ + icon_state = "engine" + }, /turf/unsimulated/wall{ dir = 8; icon = 'icons/turf/shuttle.dmi'; diff --git a/_maps/map_files/cyberiad/z3.dmm b/_maps/map_files/cyberiad/z3.dmm index b517ac3154b..31314bf545a 100644 --- a/_maps/map_files/cyberiad/z3.dmm +++ b/_maps/map_files/cyberiad/z3.dmm @@ -4065,6 +4065,16 @@ /obj/structure/girder, /turf/simulated/floor/plating/airless, /area/AIsattele) +"we" = ( +/obj/machinery/atmospherics/unary/portables_connector{ + dir = 1 + }, +/turf/simulated/floor/plating/airless, +/area/AIsattele) +"LU" = ( +/obj/machinery/atmospherics/unary/tank/oxygen_agent_b, +/turf/simulated/floor/plating/airless, +/area/AIsattele) (1,1,1) = {" aa @@ -58481,8 +58491,8 @@ aa aT iF iF -iK -iT +LU +we iW iF iF diff --git a/_maps/map_files/cyberiad/z4.dmm b/_maps/map_files/cyberiad/z4.dmm index 9edf8b675d0..e533422b39a 100644 --- a/_maps/map_files/cyberiad/z4.dmm +++ b/_maps/map_files/cyberiad/z4.dmm @@ -908,12 +908,12 @@ }, /area/engiestation/solars) "cu" = ( -/turf/simulated/floor/plating/airless, /obj/structure/cable{ d1 = 2; d2 = 8; icon_state = "2-8" }, +/turf/simulated/floor/plating/airless, /turf/simulated/floor/plating/airless/catwalk{ tag = "icon-catwalk3"; icon_state = "catwalk3" @@ -930,7 +930,6 @@ }, /area/engiestation/solars) "cw" = ( -/turf/simulated/floor/plating/airless, /obj/structure/cable{ d1 = 2; d2 = 8; @@ -941,6 +940,7 @@ d2 = 4; icon_state = "2-4" }, +/turf/simulated/floor/plating/airless, /turf/simulated/floor/plating/airless/catwalk{ tag = "icon-catwalk3"; icon_state = "catwalk3" @@ -972,7 +972,6 @@ /turf/simulated/floor/plasteel/airless, /area/constructionsite/hallway/center) "cA" = ( -/turf/simulated/floor/plating/airless, /obj/structure/cable{ d1 = 1; d2 = 2; @@ -983,13 +982,13 @@ d2 = 8; icon_state = "2-8" }, +/turf/simulated/floor/plating/airless, /turf/simulated/floor/plating/airless/catwalk{ tag = "icon-catwalk3"; icon_state = "catwalk3" }, /area/engiestation/solars) "cB" = ( -/turf/simulated/floor/plating/airless, /obj/structure/cable{ d1 = 1; d2 = 2; @@ -1005,6 +1004,7 @@ d2 = 4; icon_state = "2-4" }, +/turf/simulated/floor/plating/airless, /turf/simulated/floor/plating/airless/catwalk{ tag = "icon-catwalk3"; icon_state = "catwalk3" @@ -1093,7 +1093,6 @@ }, /area/engiestation/solars) "cN" = ( -/turf/simulated/floor/plating/airless, /obj/structure/cable{ d1 = 1; d2 = 2; @@ -1104,13 +1103,13 @@ d2 = 8; icon_state = "2-8" }, +/turf/simulated/floor/plating/airless, /turf/simulated/floor/plating/airless/catwalk{ tag = "icon-catwalk1"; icon_state = "catwalk1" }, /area/engiestation/solars) "cO" = ( -/turf/simulated/floor/plating/airless, /obj/structure/cable{ d1 = 1; d2 = 2; @@ -1126,6 +1125,7 @@ d2 = 4; icon_state = "2-4" }, +/turf/simulated/floor/plating/airless, /turf/simulated/floor/plating/airless/catwalk{ tag = "icon-catwalk1"; icon_state = "catwalk1" @@ -1332,7 +1332,6 @@ }, /area/engiestation/solars) "dp" = ( -/turf/simulated/floor/plating/airless, /obj/structure/cable{ d1 = 2; d2 = 4; @@ -1343,13 +1342,13 @@ d2 = 4; icon_state = "1-4" }, +/turf/simulated/floor/plating/airless, /turf/simulated/floor/plating/airless/catwalk{ tag = "icon-catwalk12"; icon_state = "catwalk12" }, /area/engiestation/solars) "dq" = ( -/turf/simulated/floor/plating/airless, /obj/structure/cable{ d1 = 4; d2 = 8; @@ -1366,13 +1365,13 @@ d2 = 4; icon_state = "1-4" }, +/turf/simulated/floor/plating/airless, /turf/simulated/floor/plating/airless/catwalk{ tag = "icon-catwalk12"; icon_state = "catwalk12" }, /area/engiestation/solars) "dr" = ( -/turf/simulated/floor/plating/airless, /obj/structure/cable{ d1 = 4; d2 = 8; @@ -1389,6 +1388,7 @@ d2 = 4; icon_state = "1-4" }, +/turf/simulated/floor/plating/airless, /turf/simulated/floor/plating/airless/catwalk{ tag = "icon-catwalk8"; icon_state = "catwalk8" @@ -1487,7 +1487,6 @@ }, /area/engiestation) "dy" = ( -/turf/simulated/floor/plating/airless, /obj/structure/cable{ d1 = 1; d2 = 8; @@ -1504,13 +1503,13 @@ icon_state = "4-8"; pixel_x = 0 }, +/turf/simulated/floor/plating/airless, /turf/simulated/floor/plating/airless/catwalk{ tag = "icon-catwalk4"; icon_state = "catwalk4" }, /area/engiestation/solars) "dz" = ( -/turf/simulated/floor/plating/airless, /obj/structure/cable{ d1 = 1; d2 = 8; @@ -1527,13 +1526,13 @@ icon_state = "4-8"; pixel_x = 0 }, +/turf/simulated/floor/plating/airless, /turf/simulated/floor/plating/airless/catwalk{ tag = "icon-catwalk12"; icon_state = "catwalk12" }, /area/engiestation/solars) "dA" = ( -/turf/simulated/floor/plating/airless, /obj/structure/cable{ d1 = 1; d2 = 8; @@ -1544,6 +1543,7 @@ d2 = 8; icon_state = "2-8" }, +/turf/simulated/floor/plating/airless, /turf/simulated/floor/plating/airless/catwalk{ tag = "icon-catwalk12"; icon_state = "catwalk12" @@ -1702,19 +1702,18 @@ /turf/simulated/floor/plating/airless, /area/constructionsite/ai) "dS" = ( -/turf/simulated/floor/plating/airless, /obj/structure/cable{ d1 = 2; d2 = 4; icon_state = "2-4" }, +/turf/simulated/floor/plating/airless, /turf/simulated/floor/plating/airless/catwalk{ tag = "icon-catwalk12"; icon_state = "catwalk12" }, /area/engiestation/solars) "dT" = ( -/turf/simulated/floor/plating/airless, /obj/structure/cable{ d1 = 4; d2 = 8; @@ -1726,13 +1725,13 @@ d2 = 4; icon_state = "2-4" }, +/turf/simulated/floor/plating/airless, /turf/simulated/floor/plating/airless/catwalk{ tag = "icon-catwalk12"; icon_state = "catwalk12" }, /area/engiestation/solars) "dU" = ( -/turf/simulated/floor/plating/airless, /obj/structure/cable{ d1 = 4; d2 = 8; @@ -1744,6 +1743,7 @@ d2 = 4; icon_state = "2-4" }, +/turf/simulated/floor/plating/airless, /turf/simulated/floor/plating/airless/catwalk{ tag = "icon-catwalk8"; icon_state = "catwalk8" @@ -1792,7 +1792,6 @@ }, /area/engiestation) "ea" = ( -/turf/simulated/floor/plating/airless, /obj/structure/cable{ d1 = 2; d2 = 8; @@ -1804,13 +1803,13 @@ icon_state = "4-8"; pixel_x = 0 }, +/turf/simulated/floor/plating/airless, /turf/simulated/floor/plating/airless/catwalk{ tag = "icon-catwalk4"; icon_state = "catwalk4" }, /area/engiestation/solars) "eb" = ( -/turf/simulated/floor/plating/airless, /obj/structure/cable{ d1 = 2; d2 = 8; @@ -1822,18 +1821,19 @@ icon_state = "4-8"; pixel_x = 0 }, +/turf/simulated/floor/plating/airless, /turf/simulated/floor/plating/airless/catwalk{ tag = "icon-catwalk12"; icon_state = "catwalk12" }, /area/engiestation/solars) "ec" = ( -/turf/simulated/floor/plating/airless, /obj/structure/cable{ d1 = 2; d2 = 8; icon_state = "2-8" }, +/turf/simulated/floor/plating/airless, /turf/simulated/floor/plating/airless/catwalk{ tag = "icon-catwalk12"; icon_state = "catwalk12" @@ -2642,8 +2642,8 @@ }, /area/space) "fR" = ( -/turf/simulated/floor/plating/airless, /obj/item/lighter/zippo, +/turf/simulated/floor/plating/airless, /turf/simulated/floor/plating/airless/catwalk{ tag = "icon-catwalk8"; icon_state = "catwalk8" diff --git a/_maps/map_files/cyberiad/z6.dmm b/_maps/map_files/cyberiad/z6.dmm index 268339344ab..08f7dc62ebe 100644 --- a/_maps/map_files/cyberiad/z6.dmm +++ b/_maps/map_files/cyberiad/z6.dmm @@ -61,7 +61,6 @@ /turf/simulated/floor/plating, /area/djstation) "an" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 2; @@ -77,6 +76,7 @@ d2 = 8; icon_state = "2-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/djstation/solars) "ao" = ( @@ -88,12 +88,12 @@ /turf/space, /area/space) "ap" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 2; icon_state = "1-2" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/djstation/solars) "aq" = ( @@ -120,12 +120,12 @@ /turf/simulated/floor/plating, /area/djstation) "as" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 2; icon_state = "1-2" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/djstation) "at" = ( @@ -297,7 +297,6 @@ /turf/simulated/floor/plating, /area/derelict/bridge) "aQ" = ( -/turf/space, /obj/structure/cable{ d1 = 4; d2 = 8; @@ -313,10 +312,10 @@ d2 = 4; icon_state = "1-4" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/djstation) "aR" = ( -/turf/space, /obj/structure/cable{ d1 = 4; d2 = 8; @@ -332,19 +331,19 @@ d2 = 4; icon_state = "1-4" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/djstation/solars) "aS" = ( -/turf/space, /obj/structure/cable{ d1 = 4; d2 = 8; icon_state = "4-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/djstation/solars) "aT" = ( -/turf/space, /obj/structure/cable{ d1 = 4; d2 = 8; @@ -360,6 +359,7 @@ d2 = 8; icon_state = "2-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/djstation/solars) "aU" = ( @@ -371,7 +371,6 @@ /turf/simulated/floor/plating, /area/djstation) "aV" = ( -/turf/space, /obj/structure/cable{ d1 = 4; d2 = 8; @@ -387,6 +386,7 @@ d2 = 8; icon_state = "2-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/djstation) "aW" = ( @@ -4329,11 +4329,11 @@ name = "Derelict Annex" }) "jj" = ( +/obj/effect/landmark/burnturf, /turf/simulated/floor/plasteel{ dir = 2; icon_state = "cautionfull" }, -/obj/effect/landmark/burnturf, /turf/simulated/wall/mineral/titanium/nodecon/tileblend{ fixed_underlay = list("icon" = 'icons/turf/floors.dmi', "icon_state" = "cautionfull"); icon_state = "4-i" @@ -4587,7 +4587,6 @@ name = "Derelict Annex" }) "jK" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 2; @@ -4603,6 +4602,7 @@ d2 = 8; icon_state = "2-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/derelict/solar_control) "jL" = ( @@ -6688,12 +6688,12 @@ }, /area/syndicate_depot/core) "oS" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 2; icon_state = "1-2" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/derelict/solar_control) "oT" = ( @@ -7746,16 +7746,15 @@ }, /area/derelict/crew_quarters) "rm" = ( -/turf/space, /obj/structure/cable{ d1 = 4; d2 = 8; icon_state = "4-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/derelict/solar_control) "rn" = ( -/turf/space, /obj/structure/cable{ d1 = 4; d2 = 8; @@ -7766,6 +7765,7 @@ d2 = 8; icon_state = "1-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/derelict/solar_control) "ro" = ( @@ -7978,7 +7978,6 @@ }, /area/derelict/crew_quarters) "rF" = ( -/turf/space, /obj/structure/cable{ d1 = 2; d2 = 8; @@ -7994,6 +7993,7 @@ d2 = 8; icon_state = "1-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/derelict/solar_control) "rG" = ( @@ -8262,7 +8262,6 @@ }, /area/derelict/crew_quarters) "sh" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 2; @@ -8273,6 +8272,7 @@ d2 = 4; icon_state = "2-4" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/derelict/solar_control) "si" = ( @@ -8996,7 +8996,6 @@ }, /area/derelict/crew_quarters) "tE" = ( -/turf/space, /obj/structure/cable{ d1 = 4; d2 = 8; @@ -9007,6 +9006,7 @@ d2 = 8; icon_state = "2-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/derelict/solar_control) "tF" = ( @@ -9025,7 +9025,6 @@ }, /area/derelict/arrival) "tH" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 8; @@ -9041,6 +9040,7 @@ d2 = 8; icon_state = "2-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/derelict/solar_control) "tI" = ( @@ -9547,7 +9547,6 @@ name = "Derelict Annex" }) "uI" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 2; @@ -9564,6 +9563,7 @@ d2 = 8; icon_state = "1-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/derelict/solar_control) "uJ" = ( @@ -9704,13 +9704,13 @@ name = "Derelict Annex" }) "uV" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "whiteredfull" }, -/obj/structure/window/reinforced{ - dir = 1 - }, /turf/simulated/wall/mineral/titanium/nodecon/tileblend{ fixed_underlay = list("icon" = 'icons/turf/floors.dmi', "icon_state" = "whiteredfull"); icon_state = "4-i" @@ -9838,13 +9838,13 @@ name = "Derelict Annex" }) "vi" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "whiteredfull" }, -/obj/structure/window/reinforced{ - dir = 8 - }, /turf/simulated/wall/mineral/titanium/nodecon/tileblend{ fixed_underlay = list("icon" = 'icons/turf/floors.dmi', "icon_state" = "whiteredfull"); icon_state = "4-i" @@ -9880,7 +9880,6 @@ /turf/space, /area/derelict/arrival) "vm" = ( -/turf/space, /obj/structure/cable{ d1 = 4; d2 = 8; @@ -9896,6 +9895,7 @@ d2 = 4; icon_state = "1-4" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/derelict/solar_control) "vn" = ( @@ -10452,7 +10452,6 @@ name = "Derelict Annex" }) "wl" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 2; @@ -10463,10 +10462,10 @@ d2 = 8; icon_state = "1-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/derelict/solar_control) "wm" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 2; @@ -10477,6 +10476,7 @@ d2 = 4; icon_state = "1-4" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/derelict/solar_control) "wn" = ( @@ -10487,7 +10487,6 @@ }, /area/derelict/crew_quarters) "wo" = ( -/turf/space, /obj/structure/cable{ d1 = 4; d2 = 8; @@ -10503,10 +10502,10 @@ d2 = 8; icon_state = "2-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/derelict/solar_control) "wp" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 2; @@ -10522,10 +10521,10 @@ d2 = 4; icon_state = "1-4" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/derelict/solar_control) "wq" = ( -/turf/space, /obj/structure/cable{ d1 = 1; d2 = 2; @@ -10541,6 +10540,7 @@ d2 = 8; icon_state = "1-8" }, +/turf/space, /turf/simulated/floor/plating/airless/catwalk, /area/derelict/solar_control) "wr" = ( diff --git a/_maps/map_files/shuttles/emergency_narnar.dmm b/_maps/map_files/shuttles/emergency_narnar.dmm index e8e89240ff7..b6bfe0376d6 100644 --- a/_maps/map_files/shuttles/emergency_narnar.dmm +++ b/_maps/map_files/shuttles/emergency_narnar.dmm @@ -296,13 +296,13 @@ /turf/simulated/floor/engine/cult, /area/shuttle/escape) "aR" = ( +/obj/effect/spawner/window/reinforced{ + color = "red" + }, /turf/simulated/shuttle/wall{ icon_state = "swall3"; dir = 2 }, -/obj/effect/spawner/window/reinforced{ - color = "red" - }, /turf/simulated/wall/cult, /area/shuttle/escape) "aS" = ( diff --git a/_maps/map_files/shuttles/ferry_base.dmm b/_maps/map_files/shuttles/ferry_base.dmm index 87658df37bf..a5e2d5aef05 100644 --- a/_maps/map_files/shuttles/ferry_base.dmm +++ b/_maps/map_files/shuttles/ferry_base.dmm @@ -3,12 +3,12 @@ /turf/space, /area/space) "b" = ( -/turf/space, /obj/structure/shuttle/engine/propulsion{ dir = 8; icon_state = "propulsion"; tag = "icon-propulsion (EAST)" }, +/turf/space, /turf/simulated/shuttle/wall{ icon_state = "swall_f6"; dir = 2 @@ -98,12 +98,12 @@ /turf/simulated/shuttle/floor, /area/shuttle/transport) "o" = ( -/turf/space, /obj/structure/shuttle/engine/propulsion{ dir = 8; icon_state = "propulsion"; tag = "icon-propulsion (EAST)" }, +/turf/space, /turf/simulated/shuttle/wall{ icon_state = "swall_f5"; dir = 2 diff --git a/_maps/map_files/shuttles/ferry_meat.dmm b/_maps/map_files/shuttles/ferry_meat.dmm index 1a085c97f7d..a4008980d4a 100644 --- a/_maps/map_files/shuttles/ferry_meat.dmm +++ b/_maps/map_files/shuttles/ferry_meat.dmm @@ -3,12 +3,12 @@ /turf/space, /area/space) "b" = ( -/turf/space, /obj/structure/shuttle/engine/propulsion{ dir = 8; icon_state = "propulsion"; tag = "icon-propulsion (EAST)" }, +/turf/space, /turf/simulated/shuttle/wall{ icon_state = "swall_f6"; dir = 2 @@ -153,12 +153,12 @@ /turf/simulated/shuttle/floor, /area/shuttle/transport) "s" = ( -/turf/space, /obj/structure/shuttle/engine/propulsion{ dir = 8; icon_state = "propulsion"; tag = "icon-propulsion (EAST)" }, +/turf/space, /turf/simulated/shuttle/wall{ icon_state = "swall_f5"; dir = 2 diff --git a/code/ATMOSPHERICS/components/unary_devices/tank.dm b/code/ATMOSPHERICS/components/unary_devices/tank.dm index bf0c3c8e06d..deb194af6e7 100644 --- a/code/ATMOSPHERICS/components/unary_devices/tank.dm +++ b/code/ATMOSPHERICS/components/unary_devices/tank.dm @@ -16,7 +16,7 @@ if(!istype(T)) return add_underlay(T, node, dir) - + /obj/machinery/atmospherics/unary/tank/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/analyzer)) atmosanalyzer_scan(air_contents, user) @@ -94,4 +94,18 @@ trace_gas.moles = (25*ONE_ATMOSPHERE)*(air_contents.volume)/(R_IDEAL_GAS_EQUATION*air_contents.temperature) air_contents.trace_gases += trace_gas - \ No newline at end of file + +/obj/machinery/atmospherics/unary/tank/oxygen_agent_b + name = "Unidentified Gas Tank" + desc = "A large vessel containing an unknown pressurized gas." + icon_state = "agent_b_map" + +/obj/machinery/atmospherics/unary/tank/oxygen_agent_b/New() + ..() + icon_state = "agent_b" + air_contents.volume = volume + air_contents.temperature = T20C + + var/datum/gas/oxygen_agent_b/trace_gas = new + trace_gas.moles = (50 * ONE_ATMOSPHERE) * (air_contents.volume) / (R_IDEAL_GAS_EQUATION * air_contents.temperature) + air_contents.trace_gases += trace_gas \ No newline at end of file diff --git a/code/LINDA/LINDA_fire.dm b/code/LINDA/LINDA_fire.dm index ada5e6a9e5f..b788cd07d26 100644 --- a/code/LINDA/LINDA_fire.dm +++ b/code/LINDA/LINDA_fire.dm @@ -1,5 +1,7 @@ /atom/proc/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) + if(reagents) + reagents.temperature_reagents(exposed_temperature) return null @@ -10,6 +12,8 @@ /turf/simulated/hotspot_expose(exposed_temperature, exposed_volume, soh) var/datum/gas_mixture/air_contents = return_air() + if(reagents) + reagents.temperature_reagents(exposed_temperature, 10, 300) if(!air_contents) return 0 if(active_hotspot) @@ -44,42 +48,48 @@ anchored = 1 mouse_opacity = MOUSE_OPACITY_TRANSPARENT unacidable = 1//So you can't melt fire with acid. - icon = 'icons/effects/fire.dmi' + icon = 'icons/goonstation/effects/fire.dmi' icon_state = "1" - layer = TURF_LAYER - + layer = MASSIVE_OBJ_LAYER + alpha = 250 blend_mode = BLEND_ADD - light_range = 3 + light_range = 2 var/volume = 125 var/temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST var/just_spawned = 1 var/bypassing = 0 + var/fake = FALSE + var/burn_time = 0 /obj/effect/hotspot/New() ..() - SSair.hotspots += src - perform_exposure() + if(!fake) + SSair.hotspots += src + perform_exposure() dir = pick(cardinal) air_update_turf() /obj/effect/hotspot/proc/perform_exposure() var/turf/simulated/location = loc - if(!istype(location) || !(location.air)) return 0 + if(!istype(location) || !(location.air)) + return FALSE - if(volume > CELL_VOLUME*0.95) bypassing = 1 - else bypassing = 0 + if(volume > CELL_VOLUME * 0.95) + bypassing = TRUE + else + bypassing = FALSE if(bypassing) if(!just_spawned) - volume = location.air.fuel_burnt*FIRE_GROWTH_RATE + volume = location.air.fuel_burnt * FIRE_GROWTH_RATE temperature = location.air.temperature else - var/datum/gas_mixture/affected = location.air.remove_ratio(volume/location.air.volume) + var/datum/gas_mixture/affected = location.air.remove_ratio(volume / location.air.volume) affected.temperature = temperature affected.react() temperature = affected.temperature - volume = affected.fuel_burnt*FIRE_GROWTH_RATE + volume = affected.fuel_burnt * FIRE_GROWTH_RATE location.assume_air(affected) for(var/A in loc) @@ -89,7 +99,7 @@ color = heat2color(temperature) set_light(l_color = color) - return 0 + return FALSE /obj/effect/hotspot/process() @@ -131,7 +141,7 @@ W.adjacent_fire_act(W, radiated_temperature) continue var/turf/simulated/T = get_step(src, direction) - if(istype(T) && T.active_hotspot) + if(istype(T) && !T.active_hotspot) T.hotspot_expose(radiated_temperature, CELL_VOLUME/4) else @@ -155,7 +165,8 @@ /obj/effect/hotspot/Destroy() set_light(0) SSair.hotspots -= src - DestroyTurf() + if(!fake) + DestroyTurf() if(istype(loc, /turf/simulated)) var/turf/simulated/T = loc if(T.active_hotspot == src) @@ -182,3 +193,147 @@ ..() if(isliving(L)) L.fire_act() + +/obj/effect/hotspot/fake // Largely for the fireflash procs below + fake = TRUE + burn_time = 30 + +/obj/effect/hotspot/fake/New() + ..() + if(burn_time) + QDEL_IN(src, burn_time) + +/proc/fireflash(atom/center, radius, temp) + if(!temp) + temp = rand(2800, 3200) + for(var/turf/T in view(radius, get_turf(center))) + if(isspaceturf(T)) + continue + if(locate(/obj/effect/hotspot) in T) + continue + if(!can_line(get_turf(center), T, radius + 1)) + continue + + var/obj/effect/hotspot/fake/H = new(T) + H.temperature = temp + H.volume = 400 + H.color = heat2color(H.temperature) + H.set_light(l_color = H.color) + + T.hotspot_expose(H.temperature, H.volume) + for(var/atom/A in T) + if(isliving(A)) + continue + if(A != H) + A.fire_act(null, H.temperature, H.volume) + + if(isfloorturf(T)) + var/turf/simulated/floor/F = T + F.burn_tile() + + for(var/mob/living/L in T) + L.adjust_fire_stacks(3) + L.IgniteMob() + L.bodytemperature = max(temp / 3, L.bodytemperature) + +/proc/fireflash_s(atom/center, radius, temp, falloff) + if(temp < T0C + 60) + return list() + var/list/open = list() + var/list/affected = list() + var/list/closed = list() + var/turf/Ce = get_turf(center) + var/max_dist = radius + if(falloff) + max_dist = min((temp - (T0C + 60)) / falloff, radius) + open[Ce] = 0 + while(open.len) + var/turf/T = open[1] + var/dist = open[T] + open -= T + closed += T + + if(isspaceturf(T)) + continue + if(dist > max_dist) + continue + if(!ff_cansee(Ce, T)) + continue + + var/obj/effect/hotspot/existing_hotspot = locate(/obj/effect/hotspot) in T + var/prev_temp = 0 + var/need_expose = 0 + var/expose_temp = 0 + if(!existing_hotspot) + var/obj/effect/hotspot/fake/H = new(T) + need_expose = TRUE + H.temperature = temp - dist * falloff + expose_temp = H.temperature + H.volume = 400 + H.color = heat2color(H.temperature) + H.set_light(l_color = H.color) + existing_hotspot = H + + else if(existing_hotspot.temperature < temp - dist * falloff) + expose_temp = (temp - dist * falloff) - existing_hotspot.temperature + prev_temp = existing_hotspot.temperature + if(expose_temp > prev_temp * 3) + need_expose = TRUE + existing_hotspot.temperature = temp - dist * falloff + existing_hotspot.color = heat2color(existing_hotspot.temperature) + existing_hotspot.set_light(l_color = existing_hotspot.color) + + affected[T] = existing_hotspot.temperature + if(need_expose && expose_temp) + T.hotspot_expose(expose_temp, existing_hotspot.volume) + for(var/atom/A in T) + if(isliving(A)) + continue + if(A != existing_hotspot) + A.fire_act(null, expose_temp, existing_hotspot.volume) + if(isfloorturf(T)) + var/turf/simulated/floor/F = T + F.burn_tile() + for(var/mob/living/L in T) + L.adjust_fire_stacks(3) + L.IgniteMob() + L.bodytemperature = (2 * L.bodytemperature + temp) / 3 + + if(T.density) + continue + for(var/obj/O in T) + if(O.density) + continue + if(dist == max_dist) + continue + + for(var/dir in cardinal) + var/turf/link = get_step(T, dir) + if (!link) + continue + var/dx = link.x - Ce.x + var/dy = link.y - Ce.y + var/target_dist = max((dist + 1 + sqrt(dx * dx + dy * dy)) / 2, dist) + if(!(link in closed)) + if(link in open) + if(open[link] > target_dist) + open[link] = target_dist + else + open[link] = target_dist + + return affected + +/proc/fireflash_sm(atom/center, radius, temp, falloff, capped = TRUE, bypass_rng = FALSE) + var/list/affected = fireflash_s(center, radius, temp, falloff) + for(var/turf/simulated/T in affected) + var/mytemp = affected[T] + var/melt = 1643.15 // default steel melting point + var/divisor = melt + if(mytemp >= melt * 2) + var/chance = mytemp / divisor + if(capped) + chance = min(chance, 30) + if(prob(chance) || bypass_rng) + T.visible_message("[T] melts!") + T.burn_down() + return affected \ No newline at end of file diff --git a/code/LINDA/LINDA_turf_tile.dm b/code/LINDA/LINDA_turf_tile.dm index bb212b17138..685eba641c5 100644 --- a/code/LINDA/LINDA_turf_tile.dm +++ b/code/LINDA/LINDA_turf_tile.dm @@ -215,9 +215,9 @@ item.temperature_expose(air, air.temperature, CELL_VOLUME) temperature_expose(air, air.temperature, CELL_VOLUME) - if(air.temperature > MINIMUM_TEMPERATURE_START_SUPERCONDUCTION) - if(consider_superconductivity(starting = 1)) - remove = 0 + if(air.temperature > MINIMUM_TEMPERATURE_START_SUPERCONDUCTION) + if(consider_superconductivity(starting = 1)) + remove = 0 if(air.temperature < T0C && air.return_pressure() > 10) icy = 1 @@ -311,7 +311,9 @@ /atom/movable/proc/experience_pressure_difference(pressure_difference, direction) if(last_forced_movement >= SSair.times_fired) return 0 - else if(!anchored && !pulledby) + if(anchored || move_resist == INFINITY) + return 0 + else if(!pulledby) var/turf/target = get_turf(src) var/datum/gas_mixture/target_air = target.return_air() if(isspaceturf(target) || isunsimulatedturf(target) || pressure_resistance > target_air.return_pressure()) diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index 593419b61b1..ba4bf0090c7 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -26,6 +26,7 @@ #define TOXLOSS 4 #define OXYLOSS 8 #define SHAME 16 +#define OBLITERATION 32 //Bitflags defining which status effects could be or are inflicted on a mob #define CANSTUN 1 @@ -40,6 +41,9 @@ #define FAKEDEATH 8192 //Replaces stuff like changeling.changeling_fakedeath #define XENO_HOST 16384 //Tracks whether we're gonna be a baby alien's mummy. +//Health Defines +#define HEALTH_THRESHOLD_CRIT 0 +#define HEALTH_THRESHOLD_DEAD -100 //Grab levels #define GRAB_PASSIVE 1 diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm index 87b9094b47e..02b36614cb5 100644 --- a/code/__DEFINES/components.dm +++ b/code/__DEFINES/components.dm @@ -274,4 +274,12 @@ //Ouch my toes! #define CALTROP_BYPASS_SHOES 1 -#define CALTROP_IGNORE_WALKERS 2 \ No newline at end of file +#define CALTROP_IGNORE_WALKERS 2 + +//Xenobio hotkeys +#define COMSIG_XENO_SLIME_CLICK_CTRL "xeno_slime_click_ctrl" //from slime CtrlClickOn(): (/mob) +#define COMSIG_XENO_SLIME_CLICK_ALT "xeno_slime_click_alt" //from slime AltClickOn(): (/mob) +#define COMSIG_XENO_SLIME_CLICK_SHIFT "xeno_slime_click_shift" //from slime ShiftClickOn(): (/mob) +#define COMSIG_XENO_TURF_CLICK_SHIFT "xeno_turf_click_shift" //from turf ShiftClickOn(): (/mob) +#define COMSIG_XENO_TURF_CLICK_CTRL "xeno_turf_click_alt" //from turf AltClickOn(): (/mob) +#define COMSIG_XENO_MONKEY_CLICK_CTRL "xeno_monkey_click_ctrl" //from monkey CtrlClickOn(): (/mob) \ No newline at end of file diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm index b4fa2fb2f78..aa3652046b5 100644 --- a/code/__DEFINES/preferences.dm +++ b/code/__DEFINES/preferences.dm @@ -30,6 +30,8 @@ #define DISABLE_KARMA 262144 #define CHAT_NO_MENTORTICKETLOGS 524288 +#define TYPING_ONCE 1048576 + #define TOGGLES_DEFAULT (CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|CHAT_LOOC|MEMBER_PUBLIC|DONATOR_PUBLIC) // Admin attack logs filter system, see /proc/add_attack_logs and /proc/msg_admin_attack diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm index 7eaf300277a..65372fed1c8 100644 --- a/code/__DEFINES/role_preferences.dm +++ b/code/__DEFINES/role_preferences.dm @@ -48,32 +48,33 @@ //The gamemode specific ones are just so the gamemodes can query whether a player is old enough //(in game days played) to play that role var/global/list/special_roles = list( - ROLE_TRAITOR = /datum/game_mode/traitor, - ROLE_OPERATIVE = /datum/game_mode/nuclear, - ROLE_CHANGELING = /datum/game_mode/changeling, - ROLE_WIZARD = /datum/game_mode/wizard, - ROLE_REV = /datum/game_mode/revolution, - ROLE_ALIEN, - ROLE_PAI, - ROLE_CULTIST = /datum/game_mode/cult, - ROLE_BLOB = /datum/game_mode/blob, - ROLE_NINJA, -// ROLE_MONKEY = /datum/game_mode/monkey, Sooner or later these are going to get ported -// ROLE_GANG = /datum/game_mode/gang, - ROLE_SHADOWLING = /datum/game_mode/shadowling, - ROLE_ABDUCTOR = /datum/game_mode/abduction, + ROLE_ABDUCTOR = /datum/game_mode/abduction, // Abductor + ROLE_BLOB = /datum/game_mode/blob, // Blob + ROLE_CHANGELING = /datum/game_mode/changeling, // Changeling + ROLE_BORER, // Cortical borer + ROLE_CULTIST = /datum/game_mode/cult, // Cultist + ROLE_DEVIL = /datum/game_mode/devil/devil_agents, // Devil + ROLE_GSPIDER, // Giant spider + ROLE_GUARDIAN, // Guardian + ROLE_MORPH, // Morph + ROLE_OPERATIVE = /datum/game_mode/nuclear, // Operative + ROLE_PAI, // PAI + ROLE_POSIBRAIN, // Positronic brain + ROLE_REVENANT, // Revenant + ROLE_REV = /datum/game_mode/revolution, // Revolutionary + ROLE_SENTIENT, // Sentient animal + ROLE_SHADOWLING = /datum/game_mode/shadowling, // Shadowling + ROLE_DEMON, // Slaguther demon + ROLE_NINJA, // Space ninja + ROLE_TRADER, // Trader + ROLE_TRAITOR = /datum/game_mode/traitor, // Traitor + ROLE_VAMPIRE = /datum/game_mode/vampire, // Vampire + ROLE_RAIDER = /datum/game_mode/heist, // Vox raider + ROLE_ALIEN, // Xenomorph + ROLE_WIZARD = /datum/game_mode/wizard, // Wizard + // UNUSED/BROKEN ANTAGS // ROLE_HOG_GOD = /datum/game_mode/hand_of_god, // ROLE_HOG_CULTIST = /datum/game_mode/hand_of_god, - ROLE_RAIDER = /datum/game_mode/heist, - ROLE_VAMPIRE = /datum/game_mode/vampire, - ROLE_BORER, - ROLE_DEMON, - ROLE_SENTIENT, - ROLE_POSIBRAIN, - ROLE_REVENANT, - ROLE_GUARDIAN, - ROLE_MORPH, - ROLE_TRADER, - ROLE_GSPIDER, - ROLE_DEVIL = /datum/game_mode/devil/devil_agents, +// ROLE_MONKEY = /datum/game_mode/monkey, Sooner or later these are going to get ported +// ROLE_GANG = /datum/game_mode/gang, ) diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm index 8573873676b..e7f5262db1f 100644 --- a/code/__HELPERS/_logging.dm +++ b/code/__HELPERS/_logging.dm @@ -91,7 +91,7 @@ /proc/log_adminsay(text, mob/speaker) if(config.log_adminchat) WRITE_LOG(GLOB.world_game_log, "ADMINSAY: [speaker.simple_info_line()]: [html_decode(text)][log_end]") - + /proc/log_qdel(text) WRITE_LOG(GLOB.world_qdel_log, "QDEL: [text]") @@ -137,6 +137,9 @@ /proc/log_href(text) WRITE_LOG(GLOB.world_href_log, "HREF: [html_decode(text)]") +/proc/log_asset(text) + WRITE_LOG(GLOB.world_asset_log, "ASSET: [text]") + /** * Standardized method for tracking startup times. */ diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 79b7da3c10c..c7c3bbf5256 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -74,6 +74,19 @@ //turfs += centerturf return atoms +/proc/ff_cansee(atom/A, atom/B) + var/AT = get_turf(A) + var/BT = get_turf(B) + if(AT == BT) + return 1 + var/list/line = getline(A, B) + for(var/turf/T in line) + if(T == AT || T == BT) + break + if(T.density) + return FALSE + return TRUE + /proc/get_dist_euclidian(atom/Loc1 as turf|mob|obj,atom/Loc2 as turf|mob|obj) var/dx = Loc1.x - Loc2.x var/dy = Loc1.y - Loc2.y diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index 04fc2c6f73c..dad2ecd7630 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -731,10 +731,16 @@ The _flatIcons list is a cache for generated icon files. var/icon/add // Icon of overlay being added - // Current dimensions of flattened icon - var/{flatX1=1;flatX2=flat.Width();flatY1=1;flatY2=flat.Height()} - // Dimensions of overlay being added - var/{addX1;addX2;addY1;addY2} + // Current dimensions of flattened icon + var/flatX1 = 1 + var/flatX2 = flat.Width() + var/flatY1 = 1 + var/flatY2 = flat.Height() + // Dimensions of overlay being added + var/addX1 + var/addX2 + var/addY1 + var/addY2 for(var/I in layers) diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index 9dd3c870d51..5b639cc80f8 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -109,6 +109,15 @@ else return trim(html_encode(name), max_length) //trim is "outside" because html_encode can expand single symbols into multiple symbols (such as turning < into <) +// Uses client.typing to check if the popup should appear or not +/proc/typing_input(mob/user, message = "", title = "", default = "") + if(user.client.checkTyping()) // Prevent double windows + return null + user.client.typing = TRUE + var/msg = input(user, message, title, default) as text|null + user.client.typing = FALSE + return msg + //Filters out undesirable characters from names /proc/reject_bad_name(var/t_in, var/allow_numbers=0, var/max_length=MAX_NAME_LEN) if(!t_in || length(t_in) > max_length) diff --git a/code/__HELPERS/time.dm b/code/__HELPERS/time.dm index d36fd9449d4..54fd47a220d 100644 --- a/code/__HELPERS/time.dm +++ b/code/__HELPERS/time.dm @@ -102,6 +102,10 @@ proc/isDay(var/month, var/day) var/numMinutes = (seconds - numSeconds) / 60 return "[numMinutes] [numMinutes > 1 ? "minutes" : "minute"] and [numSeconds] seconds." +//Take a value in seconds and makes it display like a clock +/proc/seconds_to_clock(var/seconds as num) + return "[add_zero(num2text((seconds / 60) % 60), 2)]:[add_zero(num2text(seconds % 60), 2)]" + //Takes a value of time in deciseconds. //Returns a text value of that number in hours, minutes, or seconds. /proc/DisplayTimeText(time_value) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 97978fe6832..619d09713d6 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -216,6 +216,23 @@ Turf and target are seperate in case you want to teleport some distance from a t line+=locate(px,py,M.z) return line +//Same as the thing below just for density and without support for atoms. +/proc/can_line(atom/source, atom/target, length = 5) + var/turf/current = get_turf(source) + var/turf/target_turf = get_turf(target) + var/steps = 0 + + while(current != target_turf) + if(steps > length) + return FALSE + if(!current) + return FALSE + if(current.density) + return FALSE + current = get_step_towards(current, target_turf) + steps++ + return TRUE + //Returns whether or not a player is a guest using their ckey as an input /proc/IsGuestKey(key) if(findtext(key, "Guest-", 1, 7) != 1) //was findtextEx @@ -1165,7 +1182,7 @@ var/global/list/common_tools = list( if(istype(W, /obj/item/weldingtool)) var/obj/item/weldingtool/O = W if(O.isOn()) - return 3800 + return 2500 else return 0 if(istype(W, /obj/item/lighter)) @@ -1207,7 +1224,7 @@ var/global/list/common_tools = list( else return 0 if(istype(W, /obj/item/assembly/igniter)) - return 1000 + return 20000 else return 0 @@ -1297,31 +1314,6 @@ proc/atan2(x, y) if(!x && !y) return 0 return y >= 0 ? arccos(x / sqrt(x * x + y * y)) : -arccos(x / sqrt(x * x + y * y)) -proc/rotate_icon(file, state, step = 1, aa = FALSE) - var icon/base = icon(file, state) - - var w, h, w2, h2 - - if(aa) - aa++ - w = base.Width() - w2 = w * aa - h = base.Height() - h2 = h * aa - - var icon{result = icon(base); temp} - - for(var/angle in 0 to 360 step step) - if(angle == 0 ) continue - if(angle == 360) continue - temp = icon(base) - if(aa) temp.Scale(w2, h2) - temp.Turn(angle) - if(aa) temp.Scale(w, h) - result.Insert(temp, "[angle]") - - return result - /proc/format_text(text) return replacetext(replacetext(text,"\proper ",""),"\improper ","") @@ -1487,10 +1479,11 @@ var/mob/dview/dview_mob = new /mob/dview invisibility = 101 density = 0 - + move_force = 0 + pull_force = 0 move_resist = INFINITY simulated = 0 - + canmove = FALSE see_in_dark = 1e6 /mob/dview/New() //For whatever reason, if this isn't called, then BYOND will throw a type mismatch runtime when attempting to add this to the mobs list. -Fox diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index 78148aee00e..c7217221585 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -13,6 +13,7 @@ GLOBAL_LIST_INIT(singularities, list()) //list of all singularities GLOBAL_LIST_INIT(janitorial_equipment, list()) //list of janitorial equipment GLOBAL_LIST_INIT(crafting_recipes, list()) //list of all crafting recipes GLOBAL_LIST_INIT(prisoncomputer_list, list()) +GLOBAL_LIST_INIT(celltimers_list, list()) // list of all cell timers GLOBAL_LIST_INIT(cell_logs, list()) GLOBAL_LIST_INIT(navigation_computers, list()) diff --git a/code/_globalvars/logging.dm b/code/_globalvars/logging.dm index f2e463f2af1..43482937afb 100644 --- a/code/_globalvars/logging.dm +++ b/code/_globalvars/logging.dm @@ -10,6 +10,8 @@ GLOBAL_VAR(world_qdel_log) GLOBAL_PROTECT(world_qdel_log) GLOBAL_VAR(world_href_log) GLOBAL_PROTECT(world_href_log) +GLOBAL_VAR(world_asset_log) +GLOBAL_PROTECT(world_asset_log) var/list/jobMax = list() var/list/admin_log = list ( ) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 7b700ad4c6d..24e58b502ad 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -70,6 +70,10 @@ changeNext_click(1) var/list/modifiers = params2list(params) + var/dragged = modifiers["drag"] + if(dragged && !modifiers[dragged]) + return + if(modifiers["middle"] && modifiers["shift"] && modifiers["ctrl"]) MiddleShiftControlClickOn(A) return diff --git a/code/_onclick/hud/blob_overmind.dm b/code/_onclick/hud/blob_overmind.dm new file mode 100644 index 00000000000..feb57d83c05 --- /dev/null +++ b/code/_onclick/hud/blob_overmind.dm @@ -0,0 +1,196 @@ +/mob/camera/blob/create_mob_hud() + if(client && !hud_used) + hud_used = new /datum/hud/blob_overmind(src) + +/obj/screen/blob + icon = 'icons/mob/blob.dmi' + +/obj/screen/blob/MouseEntered(location,control,params) + openToolTip(usr,src,params,title = name,content = desc, theme = "blob") + +/obj/screen/blob/MouseExited() + closeToolTip(usr) + +/obj/screen/blob/BlobHelp + icon_state = "ui_help" + name = "Blob Help" + desc = "Help on playing blob!" + +/obj/screen/blob/BlobHelp/Click() + if(isovermind(usr)) + var/mob/camera/blob/B = usr + B.blob_help() + +/obj/screen/blob/JumpToNode + icon_state = "ui_tonode" + name = "Jump to Node" + desc = "Moves your camera to a selected blob node." + +/obj/screen/blob/JumpToNode/Click() + if(isovermind(usr)) + var/mob/camera/blob/B = usr + B.jump_to_node() + +/obj/screen/blob/JumpToCore + icon_state = "ui_tocore" + name = "Jump to Core" + desc = "Moves your camera to your blob core." + +/obj/screen/blob/JumpToCore/MouseEntered(location,control,params) + if(hud && hud.mymob && isovermind(hud.mymob)) + name = initial(name) + desc = initial(desc) + ..() + +/obj/screen/blob/JumpToCore/Click() + if(isovermind(usr)) + var/mob/camera/blob/B = usr + B.transport_core() + +/obj/screen/blob/Blobbernaut + icon_state = "ui_blobbernaut" + name = "Produce Blobbernaut (20)" + desc = "Produces a strong, but dumb blobbernaut from a factory blob for 20 resources.
The factory blob will be destroyed in the process." + +/obj/screen/blob/Blobbernaut/Click() + if(isovermind(usr)) + var/mob/camera/blob/B = usr + B.create_blobbernaut() + +/obj/screen/blob/StorageBlob + icon_state = "ui_storage" + name = "Produce Storage Blob (40)" + desc = "Produces a storage blob for 40 resources.
Storage blobs will raise your max resource cap by 50." + +/obj/screen/blob/StorageBlob/Click() + if(isovermind(usr)) + var/mob/camera/blob/B = usr + B.create_storage() + +/obj/screen/blob/ResourceBlob + icon_state = "ui_resource" + name = "Produce Resource Blob (40)" + desc = "Produces a resource blob for 40 resources.
Resource blobs will give you resources every few seconds." + +/obj/screen/blob/ResourceBlob/Click() + if(isovermind(usr)) + var/mob/camera/blob/B = usr + B.create_resource() + +/obj/screen/blob/NodeBlob + icon_state = "ui_node" + name = "Produce Node Blob (60)" + desc = "Produces a node blob for 60 resources.
Node blobs will expand and activate nearby resource and factory blobs." + +/obj/screen/blob/NodeBlob/Click() + if(isovermind(usr)) + var/mob/camera/blob/B = usr + B.create_node() + +/obj/screen/blob/FactoryBlob + icon_state = "ui_factory" + name = "Produce Factory Blob (60)" + desc = "Produces a factory blob for 60 resources.
Factory blobs will produce spores every few seconds." + +/obj/screen/blob/FactoryBlob/Click() + if(isovermind(usr)) + var/mob/camera/blob/B = usr + B.create_factory() + +/obj/screen/blob/ReadaptChemical + icon_state = "ui_chemswap" + name = "Readapt Chemical (50)" + desc = "Randomly rerolls your chemical for 50 resources." + +/obj/screen/blob/ReadaptChemical/MouseEntered(location,control,params) + if(hud && hud.mymob && isovermind(hud.mymob)) + name = initial(name) + desc = initial(desc) + ..() + +/obj/screen/blob/ReadaptChemical/Click() + if(isovermind(usr)) + var/mob/camera/blob/B = usr + B.chemical_reroll() + +/obj/screen/blob/RelocateCore + icon_state = "ui_swap" + name = "Relocate Core (80)" + desc = "Swaps a node and your core for 80 resources." + +/obj/screen/blob/RelocateCore/Click() + if(isovermind(usr)) + var/mob/camera/blob/B = usr + B.relocate_core() + +/obj/screen/blob/Split + icon_state = "ui_split" + name = "Split consciousness (100)" + desc = "Creates another Blob Overmind at the nearest node. One use only.
Offsprings are be unable to use this ability." + +/obj/screen/blob/Split/Click() + if(isovermind(usr)) + var/mob/camera/blob/B = usr + B.split_consciousness() + +/datum/hud/blob_overmind/New(mob/user) + ..() + var/obj/screen/using + + blobpwrdisplay = new /obj/screen() + blobpwrdisplay.name = "blob power" + blobpwrdisplay.icon_state = "block" + blobpwrdisplay.screen_loc = ui_health + static_inventory += blobpwrdisplay + + blobhealthdisplay = new /obj/screen() + blobhealthdisplay.name = "blob health" + blobhealthdisplay.icon_state = "block" + blobhealthdisplay.screen_loc = ui_internal + static_inventory += blobhealthdisplay + + using = new /obj/screen/blob/BlobHelp() + using.screen_loc = "WEST:6,NORTH:-3" + static_inventory += using + + using = new /obj/screen/blob/JumpToNode() + using.screen_loc = ui_inventory + static_inventory += using + + using = new /obj/screen/blob/JumpToCore() + using.screen_loc = ui_zonesel + using.hud = src + static_inventory += using + + using = new /obj/screen/blob/Blobbernaut() + using.screen_loc = ui_id + static_inventory += using + + using = new /obj/screen/blob/StorageBlob() + using.screen_loc = ui_belt + static_inventory += using + + using = new /obj/screen/blob/ResourceBlob() + using.screen_loc = ui_back + static_inventory += using + + using = new /obj/screen/blob/NodeBlob() + using.screen_loc = using.screen_loc = ui_rhand + static_inventory += using + + using = new /obj/screen/blob/FactoryBlob() + using.screen_loc = using.screen_loc = ui_lhand + static_inventory += using + + using = new /obj/screen/blob/ReadaptChemical() + using.screen_loc = ui_storage1 + using.hud = src + static_inventory += using + + using = new /obj/screen/blob/RelocateCore() + using.screen_loc = ui_storage2 + static_inventory += using + + using = new /obj/screen/blob/Split() + using.screen_loc = ui_acti + static_inventory += using \ No newline at end of file diff --git a/code/_onclick/hud/guardian.dm b/code/_onclick/hud/guardian.dm index 6da2a44b0f7..cc1ac13931f 100644 --- a/code/_onclick/hud/guardian.dm +++ b/code/_onclick/hud/guardian.dm @@ -9,6 +9,11 @@ guardianhealthdisplay = new /obj/screen/healths/guardian() infodisplay += guardianhealthdisplay + using = new /obj/screen/act_intent/guardian() + using.icon_state = mymob.a_intent + static_inventory += using + action_intent = using + using = new /obj/screen/guardian/Manifest() using.screen_loc = ui_rhand static_inventory += using diff --git a/code/_onclick/hud/other_mobs.dm b/code/_onclick/hud/other_mobs.dm index 8cf38a88eb9..a82c847a246 100644 --- a/code/_onclick/hud/other_mobs.dm +++ b/code/_onclick/hud/other_mobs.dm @@ -24,24 +24,4 @@ mymob.pullin.icon = 'icons/mob/screen_corgi.dmi' mymob.pullin.update_icon(mymob) mymob.pullin.screen_loc = ui_construct_pull - static_inventory += mymob.pullin - - -/mob/camera/blob/create_mob_hud() - if(client && !hud_used) - hud_used = new /datum/hud/blob_overmind(src) - -/datum/hud/blob_overmind/New(mob/user) - ..() - - blobpwrdisplay = new /obj/screen() - blobpwrdisplay.name = "blob power" - blobpwrdisplay.icon_state = "block" - blobpwrdisplay.screen_loc = ui_health - static_inventory += blobpwrdisplay - - blobhealthdisplay = new /obj/screen() - blobhealthdisplay.name = "blob health" - blobhealthdisplay.icon_state = "block" - blobhealthdisplay.screen_loc = ui_internal - static_inventory += blobhealthdisplay \ No newline at end of file + static_inventory += mymob.pullin \ No newline at end of file diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 8847e990338..d9f6653b0ff 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -97,11 +97,14 @@ name = "run/walk toggle" icon_state = "running" - /obj/screen/act_intent/simple_animal icon = 'icons/mob/screen_simplemob.dmi' screen_loc = ui_acti +/obj/screen/act_intent/guardian + icon = 'icons/mob/guardian.dmi' + screen_loc = ui_acti + /obj/screen/mov_intent/Click() if(iscarbon(usr)) var/mob/living/carbon/C = usr diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 76ef6bf5031..47036da9cf8 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -12,6 +12,9 @@ return /obj/item/proc/pre_attackby(atom/A, mob/living/user, params) //do stuff before attackby! + if(is_hot(src) && A.reagents && !ismob(A)) + to_chat(user, "You heat [A] with [src].") + A.reagents.temperature_reagents(is_hot(src)) return TRUE //return FALSE to avoid calling attackby after this proc does stuff // No comment diff --git a/code/_onclick/overmind.dm b/code/_onclick/overmind.dm index 91f24465569..8ace273dd8f 100644 --- a/code/_onclick/overmind.dm +++ b/code/_onclick/overmind.dm @@ -1,17 +1,35 @@ // Blob Overmind Controls -/mob/camera/blob/CtrlClickOn(var/atom/A) // Expand blob +/mob/camera/blob/ClickOn(var/atom/A, var/params) //Expand blob + var/list/modifiers = params2list(params) + if(modifiers["middle"]) + MiddleClickOn(A) + return + if(modifiers["shift"]) + ShiftClickOn(A) + return + if(modifiers["alt"]) + AltClickOn(A) + return + if(modifiers["ctrl"]) + CtrlClickOn(A) + return var/turf/T = get_turf(A) if(T) expand_blob(T) -/mob/camera/blob/MiddleClickOn(var/atom/A) // Rally spores +/mob/camera/blob/MiddleClickOn(atom/A) //Rally spores var/turf/T = get_turf(A) if(T) rally_spores(T) -/mob/camera/blob/AltClickOn(var/atom/A) // Create a shield +/mob/camera/blob/CtrlClickOn(atom/A) //Create a shield var/turf/T = get_turf(A) if(T) - create_shield(T) \ No newline at end of file + create_shield(T) + +/mob/camera/blob/AltClickOn(atom/A) //Remove a blob + var/turf/T = get_turf(A) + if(T) + remove_blob(T) \ No newline at end of file diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index b26ac90921e..01cf57aad9e 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -2,6 +2,8 @@ var/server_name = null // server name (for world name / status) var/server_suffix = 0 // generate numeric suffix based on server port + var/minimum_client_build = 1421 // Build 1421 due to the middle mouse button exploit + var/nudge_script_path = "nudge.py" // where the nudge.py script is located var/log_ooc = 0 // log OOC channel @@ -98,10 +100,6 @@ //game_options.txt configs - var/health_threshold_softcrit = 0 - var/health_threshold_crit = 0 - var/health_threshold_dead = -100 - var/bones_can_break = 1 var/revival_pod_plants = 1 @@ -215,6 +213,9 @@ // Automatic localhost admin disable var/disable_localhost_admin = 0 + + //Start now warning + var/start_now_confirmation = 0 /datum/configuration/New() for(var/T in subtypesof(/datum/game_mode)) @@ -357,6 +358,12 @@ if("no_dead_vote") config.vote_no_dead = 1 + + if("vote_autotransfer_initial") + config.vote_autotransfer_initial = text2num(value) + + if("vote_autotransfer_interval") + config.vote_autotransfer_interval = text2num(value) if("default_no_vote") config.vote_no_default = 1 @@ -382,6 +389,9 @@ if("serversuffix") config.server_suffix = 1 + if("minimum_client_build") + config.minimum_client_build = text2num(value) + if("nudge_script_path") config.nudge_script_path = value @@ -635,6 +645,9 @@ if("disable_karma") config.disable_karma = 1 + + if("start_now_confirmation") + config.start_now_confirmation = 1 if("tick_limit_mc_init") config.tick_limit_mc_init = text2num(value) @@ -658,10 +671,6 @@ value = text2num(value) switch(name) - if("health_threshold_crit") - config.health_threshold_crit = value - if("health_threshold_dead") - config.health_threshold_dead = value if("revival_pod_plants") config.revival_pod_plants = value if("revival_cloning") diff --git a/code/controllers/subsystem/timer.dm b/code/controllers/subsystem/timer.dm index 3e7285a79bf..1b2938fc70f 100644 --- a/code/controllers/subsystem/timer.dm +++ b/code/controllers/subsystem/timer.dm @@ -71,7 +71,6 @@ SUBSYSTEM_DEF(timer) for(var/I in second_queue) log_world(get_timer_debug_string(I)) - var/cut_start_index = 1 var/next_clienttime_timer_index = 0 var/len = length(clienttime_timers) @@ -94,14 +93,14 @@ SUBSYSTEM_DEF(timer) if(ctime_timer.flags & TIMER_LOOP) ctime_timer.spent = 0 - clienttime_timers.Insert(ctime_timer, 1) - cut_start_index++ + ctime_timer.timeToRun = REALTIMEOFDAY + ctime_timer.wait + BINARY_INSERT(ctime_timer, clienttime_timers, datum/timedevent, timeToRun) else qdel(ctime_timer) if(next_clienttime_timer_index) - clienttime_timers.Cut(cut_start_index,next_clienttime_timer_index+1) + clienttime_timers.Cut(1, next_clienttime_timer_index+1) if(MC_TICK_CHECK) return @@ -269,7 +268,7 @@ SUBSYSTEM_DEF(timer) var/new_bucket_count var/i = 1 for(i in 1 to length(alltimers)) - var/datum/timedevent/timer = alltimers[1] + var/datum/timedevent/timer = alltimers[i] if(!timer) continue @@ -411,10 +410,8 @@ SUBSYSTEM_DEF(timer) prev.next = next next.prev = prev else - if(prev) - prev.next = null - if(next) - next.prev = null + prev?.next = null + next?.prev = null prev = next = null /datum/timedevent/proc/bucketJoin() @@ -521,4 +518,4 @@ SUBSYSTEM_DEF(timer) #undef BUCKET_LEN #undef BUCKET_POS #undef TIMER_MAX -#undef TIMER_ID_MAX +#undef TIMER_ID_MAX \ No newline at end of file diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index 5d815472974..674557bc839 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -715,7 +715,7 @@ log_admin("[key_name(usr)] has offered control of ([key_name(M)]) to ghosts.") var/minhours = input(usr, "Minimum hours required to play [M]?", "Set Min Hrs", 10) as num message_admins("[key_name_admin(usr)] has offered control of ([key_name_admin(M)]) to ghosts with [minhours] hrs playtime") - var/list/mob/dead/observer/candidates = pollCandidates("Do you want to play as [M.real_name]?", poll_time = 100, min_hours = minhours) + var/list/mob/dead/observer/candidates = pollCandidates("Do you want to play as [M.real_name ? M.real_name : M.name]?", poll_time = 100, min_hours = minhours) var/mob/dead/observer/theghost = null if(candidates.len) diff --git a/code/datums/diseases/advance/symptoms/fire.dm b/code/datums/diseases/advance/symptoms/fire.dm index 1466bc86459..b88f04d1eea 100644 --- a/code/datums/diseases/advance/symptoms/fire.dm +++ b/code/datums/diseases/advance/symptoms/fire.dm @@ -45,13 +45,13 @@ Bonus return /datum/symptom/fire/proc/Firestacks_stage_4(mob/living/M, datum/disease/advance/A) - var/get_stacks = (sqrtor0(20+A.totalStageSpeed()*2))-(sqrtor0(16+A.totalStealth())) + var/get_stacks = max((sqrtor0(20 + A.totalStageSpeed() * 2)) - (sqrtor0(16 + A.totalStealth())), 1) M.adjust_fire_stacks(get_stacks) - M.adjustFireLoss(get_stacks/2) + M.adjustFireLoss(get_stacks * 0.5) return 1 /datum/symptom/fire/proc/Firestacks_stage_5(mob/living/M, datum/disease/advance/A) - var/get_stacks = (sqrtor0(20+A.totalStageSpeed()*3))-(sqrtor0(16+A.totalStealth())) + var/get_stacks = max((sqrtor0(20 + A.totalStageSpeed() * 3))-(sqrtor0(16 + A.totalStealth())), 1) M.adjust_fire_stacks(get_stacks) M.adjustFireLoss(get_stacks) - return 1 \ No newline at end of file + return 1 diff --git a/code/datums/diseases/critical.dm b/code/datums/diseases/critical.dm new file mode 100644 index 00000000000..82748802cce --- /dev/null +++ b/code/datums/diseases/critical.dm @@ -0,0 +1,130 @@ +/datum/disease/critical + +/datum/disease/critical/stage_act() //overriden to ensure unique behavior + stage = min(stage, max_stages) + + if(prob(stage_prob)) + stage = min(stage + 1, max_stages) + + for(var/C_id in cures) + if(affected_mob.reagents.has_reagent(C_id)) + if(prob(cure_chance)) + cure() + return FALSE + return TRUE + +/datum/disease/critical/shock + name = "Shock" + form = "Medical Emergency" + spread_text = "The patient is in shock" + max_stages = 3 + spread_flags = SPECIAL + cure_text = "Saline Solution" + cures = list("salglu_solution") + cure_chance = 10 + viable_mobtypes = list(/mob/living/carbon/human) + stage_prob = 6 + severity = DANGEROUS + disease_flags = CURABLE + bypasses_immunity = TRUE + virus_heal_resistant = TRUE + +/datum/disease/critical/shock/stage_act() + if(..()) + if(affected_mob.health >= 25) + to_chat(affected_mob, "You feel better.") + cure() + return + switch(stage) + if(1) + if(prob(1) && prob(10)) + to_chat(affected_mob, "You feel better.") + cure() + return + if(prob(8)) + affected_mob.emote(pick("shiver", "pale", "moan")) + if(prob(5)) + to_chat(affected_mob, "You feel weak!") + if(2) + if(prob(1) && prob(10)) + to_chat(affected_mob, "You feel better.") + cure() + return + if(prob(8)) + affected_mob.emote(pick("shiver", "pale", "moan", "shudder", "tremble")) + if(prob(5)) + to_chat(affected_mob, "You feel absolutely terrible!") + if(prob(5)) + affected_mob.emote("faint", "collapse", "groan") + if(3) + if(prob(1) && prob(10)) + to_chat(affected_mob, "You feel better.") + cure() + return + if(prob(8)) + affected_mob.emote(pick("shudder", "pale", "tremble", "groan", "bshake")) + if(prob(5)) + to_chat(affected_mob, "You feel horrible!") + if(prob(5)) + affected_mob.emote(pick("faint", "collapse", "groan")) + if(prob(7)) + to_chat(affected_mob, "You can't breathe!") + affected_mob.AdjustLoseBreath(1) + if(prob(5)) + var/datum/disease/D = new /datum/disease/critical/heart_failure + affected_mob.ForceContractDisease(D) + +/datum/disease/critical/heart_failure + name = "Cardiac Failure" + form = "Medical Emergency" + spread_text = "The patient is having a cardiac emergency" + max_stages = 3 + spread_flags = SPECIAL + cure_text = "Cardiac Stimulants" + cures = list("atropine", "epinephrine") + cure_chance = 10 + needs_all_cures = FALSE + viable_mobtypes = list(/mob/living/carbon/human) + stage_prob = 5 + severity = DANGEROUS + disease_flags = CURABLE + required_organs = list(/obj/item/organ/internal/heart) + bypasses_immunity = TRUE + virus_heal_resistant = TRUE + +/datum/disease/critical/heart_failure/stage_act() + if(..()) + switch(stage) + if(1) + if(prob(1) && prob(10)) + to_chat(affected_mob, "You feel better.") + cure() + return + if(prob(8)) + affected_mob.emote(pick("pale", "shudder")) + if(prob(5)) + to_chat(affected_mob, "Your arm hurts!") + else if(prob(5)) + to_chat(affected_mob, "Your chest hurts!") + if(2) + if(prob(1) && prob(10)) + to_chat(affected_mob, "You feel better.") + cure() + return + if(prob(8)) + affected_mob.emote(pick("pale", "groan")) + if(prob(5)) + to_chat(affected_mob, "Your heart lurches in your chest!") + affected_mob.AdjustLoseBreath(1) + if(prob(3)) + to_chat(affected_mob, "Your heart stops beating!") + affected_mob.AdjustLoseBreath(3) + if(prob(5)) + affected_mob.emote(pick("faint", "collapse", "groan")) + if(3) + affected_mob.adjustOxyLoss(1) + if(prob(8)) + affected_mob.emote(pick("twitch", "gasp")) + if(prob(5) && ishuman(affected_mob)) + var/mob/living/carbon/human/H = affected_mob + H.set_heartattack(TRUE) \ No newline at end of file diff --git a/code/datums/diseases/food_poisoning.dm b/code/datums/diseases/food_poisoning.dm index 79a3801ce10..2e7d083455b 100644 --- a/code/datums/diseases/food_poisoning.dm +++ b/code/datums/diseases/food_poisoning.dm @@ -14,20 +14,13 @@ disease_flags = CURABLE spread_flags = NON_CONTAGIOUS virus_heal_resistant = TRUE - var/remissive = 0 /datum/disease/food_poisoning/stage_act() - if(!remissive) - ..() + ..() if(affected_mob.sleeping && prob(33)) to_chat(affected_mob, "You feel better.") - remissive = 1 - if(remissive) - if(prob(stage_prob)) - stage-- - if(stage == 0) - cure() - return + cure() + return switch(stage) if(1) if(prob(5)) diff --git a/code/datums/diseases/gbs.dm b/code/datums/diseases/gbs.dm index 371f38238a1..19d4c287427 100644 --- a/code/datums/diseases/gbs.dm +++ b/code/datums/diseases/gbs.dm @@ -34,7 +34,7 @@ if(5) to_chat(affected_mob, "Your body feels as if it's trying to rip itself open...") if(prob(50)) - affected_mob.gib() + affected_mob.delayed_gib() else return diff --git a/code/datums/gas_mixture.dm b/code/datums/gas_mixture.dm index a10c3a8358f..7a7571999cf 100644 --- a/code/datums/gas_mixture.dm +++ b/code/datums/gas_mixture.dm @@ -117,7 +117,7 @@ What are the archived variables for? trace_gas.moles -= reaction_rate*0.05 - temperature -= (reaction_rate*20000)/heat_capacity() + temperature += (reaction_rate*20000)/heat_capacity() reacting = 1 diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 0658c81d90f..556e74179da 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -870,6 +870,7 @@ special_role = SPECIAL_ROLE_WIZARD //ticker.mode.learn_basic_spells(current) ticker.mode.update_wiz_icons_added(src) + SEND_SOUND(current, 'sound/ambience/antag/ragesmages.ogg') to_chat(current, "You are a Space Wizard!") current.faction = list("wizard") log_admin("[key_name(usr)] has wizarded [key_name(current)]") @@ -911,6 +912,7 @@ ticker.mode.grant_changeling_powers(current) ticker.mode.update_change_icons_added(src) special_role = SPECIAL_ROLE_CHANGELING + SEND_SOUND(current, 'sound/ambience/antag/ling_aler.ogg') to_chat(current, "Your powers have awoken. A flash of memory returns to us... we are a changeling!") log_admin("[key_name(usr)] has changelinged [key_name(current)]") message_admins("[key_name_admin(usr)] has changelinged [key_name_admin(current)]") @@ -955,6 +957,7 @@ slaved.masters += src som = slaved //we MIGT want to mindslave someone special_role = SPECIAL_ROLE_VAMPIRE + SEND_SOUND(current, 'sound/ambience/antag/vampalert.ogg') to_chat(current, "Your powers have awoken. Your lust for blood grows... You are a Vampire!") log_admin("[key_name(usr)] has vampired [key_name(current)]") message_admins("[key_name_admin(usr)] has vampired [key_name_admin(current)]") @@ -1157,6 +1160,9 @@ if(isAI(current)) var/mob/living/silicon/ai/A = current ticker.mode.add_law_zero(A) + SEND_SOUND(current, 'sound/ambience/antag/malf.ogg') + else + SEND_SOUND(current, 'sound/ambience/antag/tatoralert.ogg') ticker.mode.update_traitor_icons_added(src) if("autoobjectives") @@ -1442,6 +1448,11 @@ ticker.mode.greet_changeling(src) ticker.mode.update_change_icons_added(src) +/datum/mind/proc/make_Overmind() + if(!(src in ticker.mode.blob_overminds)) + ticker.mode.blob_overminds += src + special_role = SPECIAL_ROLE_BLOB_OVERMIND + /datum/mind/proc/make_Wizard() if(!(src in ticker.mode.wizards)) ticker.mode.wizards += src diff --git a/code/datums/spells/inflict_handler.dm b/code/datums/spells/inflict_handler.dm index cfda930afd2..896e399187a 100644 --- a/code/datums/spells/inflict_handler.dm +++ b/code/datums/spells/inflict_handler.dm @@ -44,7 +44,7 @@ else if(amt_dam_fire <= 0) target.heal_overall_damage(amt_dam_brute,amt_dam_fire) target.adjustToxLoss(amt_dam_tox) - target.oxyloss += amt_dam_oxy + target.adjustOxyLoss(amt_dam_oxy) //disabling target.Weaken(amt_weakened) target.Paralyse(amt_paralysis) diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index e04efee8328..ec43330a8eb 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -149,6 +149,27 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine access = access_hydroponics announce_beacons = list("Hydroponics" = list("Hydroponics")) +/datum/supply_packs/emergency/voxsupport + name = "Vox Life Support Supplies" + contains = list(/obj/item/clothing/mask/breath/vox, + /obj/item/clothing/mask/breath/vox, + /obj/item/tank/emergency_oxygen/vox, + /obj/item/tank/emergency_oxygen/vox) + cost = 50 + containertype = /obj/structure/closet/crate/medical + containername = "vox life support supplies crate" + +/datum/supply_packs/emergency/plasmamansupport + name = "Plasmaman Life Support Supplies" + contains = list(/obj/item/clothing/mask/breath, + /obj/item/tank/emergency_oxygen/plasma, + /obj/item/clothing/suit/space/eva/plasmaman, + /obj/item/clothing/head/helmet/space/eva/plasmaman) + cost = 75 + containertype = /obj/structure/closet/crate/secure/plasma + containername = "plasmaman life support supplies crate" + access = access_eva + /datum/supply_packs/emergency/specialops name = "Special Ops Supplies" contains = list(/obj/item/storage/box/emps, @@ -1039,8 +1060,8 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine /datum/supply_packs/organic/bar name = "Bar Starter Kit" contains = list(/obj/item/storage/box/drinkingglasses, - /obj/item/circuitboard/soda, - /obj/item/circuitboard/beer) + /obj/item/circuitboard/chem_dispenser/soda, + /obj/item/circuitboard/chem_dispenser/beer) cost = 20 containername = "beer starter kit" announce_beacons = list("Bar" = list("Bar")) @@ -1178,7 +1199,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine /datum/supply_packs/organic/hydroponics/beekeeping_fullkit name = "Beekeeping Starter Kit" - contains = list(/obj/structure/beebox, + contains = list(/obj/structure/beebox/unwrenched, /obj/item/honey_frame, /obj/item/honey_frame, /obj/item/honey_frame, diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index a22bdd371a6..9278d0d5f80 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -90,7 +90,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) if(hijack_only) if(!(locate(/datum/objective/hijack) in usr.mind.objectives)) - to_chat(usr, "The Syndicate lacks resources to provide you with this item.") + to_chat(usr, "The Syndicate will only issue this extremely dangerous item to agents assigned the Hijack objective.") return if(item) @@ -182,6 +182,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) cost = 3 job = list("Clown") +/datum/uplink_item/jobspecific/trick_revolver + name = "Trick Revolver" + desc = "A revolver that will fire backwards and kill whoever attempts to use it. Perfect for those pesky vigilante or just a good laugh." + reference = "CTR" + item = /obj/item/toy/russian_revolver/trick_revolver + cost = 1 + job = list("Clown") + //mime /datum/uplink_item/jobspecific/caneshotgun name = "Cane Shotgun and Assassination Shells" @@ -351,6 +359,16 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) cost = 12 job = list("Research Director") +//Roboticist +/datum/uplink_item/jobspecific/syndiemmi + name = "Syndicate MMI" + desc = "A syndicate developed man-machine-interface which will make any cyborg it is inserted into follow the standard syndicate lawset." + reference = "SMMI" + item = /obj/item/mmi/syndie + cost = 2 + job = list("Roboticist") + surplus = 0 + //Librarian /datum/uplink_item/jobspecific/etwenty name = "The E20" @@ -911,6 +929,8 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) reference = "SB" item = /obj/item/radio/beacon/syndicate/bomb cost = 11 + surplus = 0 + cant_discount = TRUE /datum/uplink_item/explosives/syndicate_minibomb name = "Syndicate Minibomb" @@ -960,13 +980,22 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) gamemodes = list(/datum/game_mode/nuclear) surplus = 0 -/datum/uplink_item/explosives/atmosgrenades - name = "Atmos Grenades" - desc = "A box of two (2) grenades that wreak havoc with the atmosphere of the target area. Capable of engulfing a large area in lit plasma, or N2O. Deploy with extreme caution!" - reference = "AGG" - item = /obj/item/storage/box/syndie_kit/atmosgasgrenades - cost = 11 +/datum/uplink_item/explosives/atmosn2ogrenades + name = "Knockout Gas Grenades" + desc = "A box of two (2) grenades that spread knockout gas over a large area. Equip internals before using one of these." + reference = "ANG" + item = /obj/item/storage/box/syndie_kit/atmosn2ogrenades + cost = 8 + +/datum/uplink_item/explosives/atmosfiregrenades + name = "Plasma Fire Grenades" + desc = "A box of two (2) grenades that cause large plasma fires. Can be used to deny access to a large area. Most useful if you have an atmospherics hardsuit." + reference = "APG" + item = /obj/item/storage/box/syndie_kit/atmosfiregrenades + hijack_only = TRUE + cost = 12 surplus = 0 + cant_discount = TRUE /datum/uplink_item/explosives/emp name = "EMP Grenades and Implanter Kit" @@ -1160,10 +1189,10 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) /datum/uplink_item/device_tools/surgerybag name = "Syndicate Surgery Duffelbag" - desc = "The Syndicate surgery duffelbag is a toolkit containing all surgery tools, a straitjacket, and a muzzle." + desc = "The Syndicate surgery duffelbag comes with a full set of surgery tools, a straightjacket and a muzzle. The bag itself is also made of very light materials and won't slow you down while it is equipped." reference = "SSDB" item = /obj/item/storage/backpack/duffel/syndie/surgery - cost = 4 + cost = 2 /datum/uplink_item/device_tools/bonerepair name = "Prototype Bone Repair Kit" diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index a74314a9919..c5683f366ae 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -341,7 +341,7 @@ L << sound(sound, repeat = 0, wait = 0, volume = 25, channel = CHANNEL_AMBIENCE) L.client.played = 1 spawn(600) //ewww - this is very very bad - if(L.&& L.client) + if(L && L.client) L.client.played = 0 /area/proc/gravitychange(var/gravitystate = 0, var/area/A) @@ -362,7 +362,7 @@ if(istype(get_turf(M), /turf/space)) // Can't fall onto nothing. return - if((istype(M,/mob/living/carbon/human/)) && (M.m_intent == MOVE_INTENT_RUN)). + if((istype(M,/mob/living/carbon/human/)) && (M.m_intent == MOVE_INTENT_RUN)) M.Stun(5) M.Weaken(5) diff --git a/code/game/asteroid.dm b/code/game/asteroid.dm index c6edd09575e..66124a9582e 100644 --- a/code/game/asteroid.dm +++ b/code/game/asteroid.dm @@ -104,7 +104,7 @@ var/global/max_secret_rooms = 6 theme = "hitech" walltypes = list(/turf/simulated/wall/r_wall=5,/turf/simulated/mineral/random=1) floortypes = list(/turf/simulated/floor/greengrid,/turf/simulated/floor/bluegrid) - treasureitems = list(/obj/item/stock_parts/cell/hyper=1, /obj/machinery/chem_dispenser/constructable=1,/obj/machinery/computer/telescience=1, /obj/machinery/r_n_d/protolathe=1, + treasureitems = list(/obj/item/stock_parts/cell/hyper=1, /obj/item/circuitboard/chem_dispenser=1,/obj/machinery/computer/telescience=1, /obj/machinery/r_n_d/protolathe=1, /obj/machinery/biogenerator=1) fluffitems = list(/obj/structure/table/reinforced=2,/obj/item/stock_parts/scanning_module/phasic=3, /obj/item/stock_parts/matter_bin/super=3,/obj/item/stock_parts/manipulator/pico=3, diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 58197cbadf1..024b2a924cf 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -311,8 +311,9 @@ /atom/proc/blob_act(obj/structure/blob/B) SEND_SIGNAL(src, COMSIG_ATOM_BLOB_ACT, B) -/atom/proc/fire_act() - return +/atom/proc/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE) + if(reagents) + reagents.temperature_reagents(exposed_temperature) /atom/proc/emag_act() return @@ -679,10 +680,10 @@ var/list/blood_splatter_icons = list() return pass_flags&passflag /atom/proc/isinspace() - if(istype(get_turf(src), /turf/space)) - return 1 + if(isspaceturf(get_turf(src))) + return TRUE else - return 0 + return FALSE /atom/proc/handle_fall() return diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index 178605853e8..461de475b41 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -78,10 +78,11 @@ return 1 return 0 -//helper for getting the appropriate health status UPDATED BY PUCKABOO2 TO INCLUDE NEGATIVES. +//helper for getting the appropriate health status /proc/RoundHealth(mob/living/M) if(M.stat == DEAD || (M.status_flags & FAKEDEATH)) - return "health-100" //what's our health? it doesn't matter, we're dead, or faking + return "health-100-dead" //what's our health? it doesn't matter, we're dead, or faking + var/maxi_health = M.maxHealth if(iscarbon(M) && M.health < 0) maxi_health = 100 //so crit shows up right for aliens and other high-health carbon mobs; noncarbons don't have crit. @@ -91,7 +92,7 @@ if(100 to INFINITY) return "health100" if(95 to 100) - return "health95" //For telling patients to eat a warm donk pocket and go on with their shift. + return "health95" if(90 to 95) return "health90" if(80 to 90) @@ -127,13 +128,13 @@ if(-70 to -60) return "health-60" if(-80 to -70) - return "health-70" //Doc? + return "health-70" if(-90 to -80) - return "health-80" //Hey, doc? + return "health-80" if(-100 to -90) - return "health-90" //HURRY UP, DOC! + return "health-90" else - return "health-100" //doc u had 1 job + return "health-100" //past this point, you're just in trouble return "0" @@ -438,4 +439,4 @@ if(weedlevel < 1) // You don't want to see these icons if the value is small holder.icon_state = "" return - holder.icon_state = "hudweed[RoundPlantBar(weedlevel/10)]" + holder.icon_state = "hudweed[RoundPlantBar(weedlevel/10)]" \ No newline at end of file diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index 708d8467fb0..e4b1f1e8a49 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -537,7 +537,7 @@ occupantData["isViableSubject"] = 0 occupantData["health"] = connected.occupant.health occupantData["maxHealth"] = connected.occupant.maxHealth - occupantData["minHealth"] = config.health_threshold_dead + occupantData["minHealth"] = HEALTH_THRESHOLD_DEAD occupantData["uniqueEnzymes"] = connected.occupant.dna.unique_enzymes occupantData["uniqueIdentity"] = connected.occupant.dna.uni_identity occupantData["structuralEnzymes"] = connected.occupant.dna.struc_enzymes diff --git a/code/game/gamemodes/autotraitor/autotraitor.dm b/code/game/gamemodes/autotraitor/autotraitor.dm index bf9fbb5a9e5..97371f6d35b 100644 --- a/code/game/gamemodes/autotraitor/autotraitor.dm +++ b/code/game/gamemodes/autotraitor/autotraitor.dm @@ -130,8 +130,10 @@ forge_traitor_objectives(newtraitor.mind) if(istype(newtraitor, /mob/living/silicon)) + SEND_SOUND(newtraitor, 'sound/ambience/antag/malf.ogg') add_law_zero(newtraitor) else + SEND_SOUND(newtraitor, 'sound/ambience/antag/tatoralert.ogg') equip_traitor(newtraitor) traitors += newtraitor.mind diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm index 41068876a54..30934a07214 100644 --- a/code/game/gamemodes/blob/blob.dm +++ b/code/game/gamemodes/blob/blob.dm @@ -3,6 +3,8 @@ var/list/blobs = list() var/list/blob_cores = list() var/list/blob_nodes = list() +/datum/game_mode + var/list/blob_overminds = list() /datum/game_mode/blob name = "blob" diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm index e3b1d082623..e6e9dfe4196 100644 --- a/code/game/gamemodes/blob/blobs/blob_mobs.dm +++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm @@ -12,6 +12,8 @@ minbodytemp = 0 maxbodytemp = 360 universal_speak = 1 //So mobs can understand them when a blob uses Blob Broadcast + sentience_type = SENTIENCE_OTHER + gold_core_spawnable = CHEM_MOB_SPAWN_INVALID var/mob/camera/blob/overmind = null /mob/living/simple_animal/hostile/blob/proc/adjustcolors(var/a_color) @@ -21,6 +23,7 @@ /mob/living/simple_animal/hostile/blob/blob_act() return + //////////////// // BLOB SPORE // //////////////// @@ -42,11 +45,10 @@ var/obj/structure/blob/factory/factory = null var/list/human_overlays = list() var/is_zombie = 0 - gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE pressure_resistance = 100 //100 kPa difference required to push throw_pressure_limit = 120 //120 kPa difference required to throw -/mob/living/simple_animal/hostile/blob/blobspore/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) +/mob/living/simple_animal/hostile/blob/blobspore/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE) ..() adjustBruteLoss(Clamp(0.01 * exposed_temperature, 1, 5)) @@ -65,15 +67,17 @@ /mob/living/simple_animal/hostile/blob/blobspore/Life(seconds, times_fired) if(!is_zombie && isturf(src.loc)) - for(var/mob/living/carbon/human/H in oview(src,1)) //Only for corpse right next to/on same tile - if(H.stat == DEAD) + for(var/mob/living/carbon/human/H in oview(src, 1)) //Only for corpse right next to/on same tile + if(H.stat == DEAD || (!H.check_death_method() && H.health <= HEALTH_THRESHOLD_DEAD)) Zombify(H) break ..() -/mob/living/simple_animal/hostile/blob/blobspore/proc/Zombify(var/mob/living/carbon/human/H) +/mob/living/simple_animal/hostile/blob/blobspore/proc/Zombify(mob/living/carbon/human/H) + if(!H.check_death_method()) + H.death() var/obj/item/organ/external/head/head_organ = H.get_organ("head") - is_zombie = 1 + is_zombie = TRUE if(H.wear_suit) var/obj/item/clothing/suit/armor/A = H.wear_suit if(A.armor && A.armor["melee"]) @@ -87,14 +91,15 @@ icon = H.icon speak_emote = list("groans") icon_state = "zombie2_s" - head_organ.h_style = null + if(head_organ) + head_organ.h_style = null H.update_hair() human_overlays = H.overlays update_icons() - H.loc = src + H.forceMove(src) pressure_resistance = 20 //5 kPa difference required to push lowered throw_pressure_limit = 30 //15 kPa difference required to throw lowered - loc.visible_message("The corpse of [H.name] suddenly rises!") + visible_message("The corpse of [H.name] suddenly rises!") /mob/living/simple_animal/hostile/blob/blobspore/death(gibbed) // Only execute the below if we successfuly died @@ -113,9 +118,8 @@ else reagents.add_reagent("spore", 8) - // Attach the smoke spreader and setup/start it. - S.attach(location) - S.set_up(reagents, 1, 1, location, 15, 1) // only 1-2 smoke cloud + // Setup up the smoke spreader and start it. + S.set_up(reagents, location, TRUE) S.start() qdel(src) @@ -133,9 +137,9 @@ ..() if(overmind && overmind.blob_reagent_datum) - adjustcolors(overmind.blob_reagent_datum.color) + adjustcolors(overmind.blob_reagent_datum.complementary_color) else - adjustcolors(color) //to ensure zombie/other overlays update + adjustcolors(overmind.blob_reagent_datum.complementary_color) //to ensure zombie/other overlays update /mob/living/simple_animal/hostile/blob/blobspore/adjustcolors(var/a_color) @@ -145,8 +149,8 @@ overlays.Cut() overlays = human_overlays var/image/I = image('icons/mob/blob.dmi', icon_state = "blob_head") - I.color = color - color = initial(color)//looks better. + I.color = overmind.blob_reagent_datum.complementary_color + color = initial(overmind.blob_reagent_datum.complementary_color)//looks better. overlays += I ///////////////// @@ -172,7 +176,6 @@ force_threshold = 10 mob_size = MOB_SIZE_LARGE environment_smash = ENVIRONMENT_SMASH_RWALLS - gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE pressure_resistance = 100 //100 kPa difference required to push throw_pressure_limit = 120 //120 kPa difference required to throw diff --git a/code/game/gamemodes/blob/blobs/core.dm b/code/game/gamemodes/blob/blobs/core.dm index 644383f344d..b0dc48aba93 100644 --- a/code/game/gamemodes/blob/blobs/core.dm +++ b/code/game/gamemodes/blob/blobs/core.dm @@ -4,6 +4,7 @@ icon_state = "blank_blob" health = 200 fire_resist = 2 + point_return = -1 var/mob/camera/blob/overmind = null // the blob core's overmind var/overmind_get_delay = 0 // we don't want to constantly try to find an overmind, do it every 5 minutes var/resource_delay = 0 @@ -45,7 +46,7 @@ GLOB.poi_list.Remove(src) return ..() -/obj/structure/blob/core/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) +/obj/structure/blob/core/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE) return /obj/structure/blob/core/update_icon() @@ -117,10 +118,11 @@ src.overmind = B color = overmind.blob_reagent_datum.color if(B.mind && !B.mind.special_role) - B.mind.special_role = SPECIAL_ROLE_BLOB_OVERMIND + B.mind.make_Overmind() spawn(0) if(is_offspring) - B.verbs -= /mob/camera/blob/verb/split_consciousness + B.is_offspring = TRUE + /obj/structure/blob/core/proc/lateblobtimer() addtimer(CALLBACK(src, .proc/lateblobcheck), 50) @@ -129,7 +131,7 @@ if(overmind) overmind.add_points(60) if(overmind.mind) - overmind.mind.special_role = SPECIAL_ROLE_BLOB_OVERMIND + overmind.mind.make_Overmind() else log_debug("/obj/structure/blob/core/proc/lateblobcheck: Blob core lacks a overmind.mind.") else diff --git a/code/game/gamemodes/blob/blobs/factory.dm b/code/game/gamemodes/blob/blobs/factory.dm index 81d3ab47493..fde2c9bf8a3 100644 --- a/code/game/gamemodes/blob/blobs/factory.dm +++ b/code/game/gamemodes/blob/blobs/factory.dm @@ -4,6 +4,7 @@ icon_state = "blob_factory" health = 100 fire_resist = 2 + point_return = 18 var/list/spores = list() var/max_spores = 3 var/spore_delay = 0 @@ -27,7 +28,7 @@ return 0 spore_delay = world.time + 100 // 10 seconds var/mob/living/simple_animal/hostile/blob/blobspore/BS = new/mob/living/simple_animal/hostile/blob/blobspore(src.loc, src) - BS.color = color + BS.color = overmind.blob_reagent_datum.complementary_color BS.overmind = overmind overmind.blob_mobs.Add(BS) return 0 diff --git a/code/game/gamemodes/blob/blobs/node.dm b/code/game/gamemodes/blob/blobs/node.dm index 19ac320287a..e1a08555a10 100644 --- a/code/game/gamemodes/blob/blobs/node.dm +++ b/code/game/gamemodes/blob/blobs/node.dm @@ -4,6 +4,7 @@ icon_state = "blank_blob" health = 100 fire_resist = 2 + point_return = 18 var/mob/camera/blob/overmind /obj/structure/blob/node/New(loc, var/h = 100) @@ -20,7 +21,7 @@ var/image/C = new('icons/mob/blob.dmi', "blob_node_overlay") src.overlays += C -/obj/structure/blob/node/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) +/obj/structure/blob/node/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE) return /obj/structure/blob/node/Destroy() diff --git a/code/game/gamemodes/blob/blobs/resource.dm b/code/game/gamemodes/blob/blobs/resource.dm index f5d838fd0a2..7198d3ef081 100644 --- a/code/game/gamemodes/blob/blobs/resource.dm +++ b/code/game/gamemodes/blob/blobs/resource.dm @@ -4,6 +4,7 @@ icon_state = "blob_resource" health = 30 fire_resist = 2 + point_return = 12 var/mob/camera/blob/overmind = null var/resource_delay = 0 diff --git a/code/game/gamemodes/blob/blobs/shield.dm b/code/game/gamemodes/blob/blobs/shield.dm index 1fb293be2cf..8d13625acb9 100644 --- a/code/game/gamemodes/blob/blobs/shield.dm +++ b/code/game/gamemodes/blob/blobs/shield.dm @@ -3,9 +3,10 @@ icon = 'icons/mob/blob.dmi' icon_state = "blob_idle" desc = "Some blob creature thingy" - health = 75 + health = 75 fire_resist = 2 - var/maxHealth = 75 + point_return = 4 + var/maxHealth = 75 /obj/structure/blob/shield/update_icon() if(health <= 0) @@ -13,7 +14,7 @@ return return -/obj/structure/blob/shield/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) +/obj/structure/blob/shield/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE) return /obj/structure/blob/shield/CanPass(atom/movable/mover, turf/target, height=0) @@ -27,6 +28,7 @@ brute_resist = 0 health = 50 maxHealth = 50 + point_return = 9 flags_2 = CHECK_RICOCHET_1 var/reflect_chance = 80 //80% chance to reflect @@ -42,11 +44,11 @@ P.setAngle(new_angle_s) P.firer = src //so people who fired the lasers are not immune to them when it reflects visible_message("[P] reflects off [src]!") - return -1// complete projectile permutation + return -1// complete projectile permutation else playsound(src, P.hitsound, 50, 1) visible_message("[src] is hit by \a [P]!") take_damage(P.damage, P.damage_type) - + /obj/structure/blob/shield/reflective/bullet_act() return diff --git a/code/game/gamemodes/blob/blobs/storage.dm b/code/game/gamemodes/blob/blobs/storage.dm index 8c9da104edf..00f6d7b4e0c 100644 --- a/code/game/gamemodes/blob/blobs/storage.dm +++ b/code/game/gamemodes/blob/blobs/storage.dm @@ -4,6 +4,7 @@ icon_state = "blob_resource" health = 30 fire_resist = 2 + point_return = 12 var/mob/camera/blob/overmind = null /obj/structure/blob/storage/update_icon() diff --git a/code/game/gamemodes/blob/overmind.dm b/code/game/gamemodes/blob/overmind.dm index c0f2e4a4a9e..ca1dffbfa74 100644 --- a/code/game/gamemodes/blob/overmind.dm +++ b/code/game/gamemodes/blob/overmind.dm @@ -15,6 +15,9 @@ var/blob_points = 0 var/max_blob_points = 100 var/last_attack = 0 + var/nodes_required = TRUE //if the blob needs nodes to place resource and factory blobs + var/split_used = FALSE + var/is_offspring = FALSE var/datum/reagent/blob/blob_reagent_datum = new/datum/reagent/blob() var/list/blob_mobs = list() var/ghostimage = null @@ -31,6 +34,7 @@ if(blob_core) blob_core.adjustcolors(blob_reagent_datum.color) + color = blob_reagent_datum.complementary_color ghostimage = image(src.icon,src,src.icon_state) ghost_darkness_images |= ghostimage //so ghosts can see the blob cursor when they disable darkness updateallghostimages() @@ -51,16 +55,7 @@ /mob/camera/blob/Login() ..() sync_mind() - to_chat(src, "You are the overmind!") - to_chat(src, "Your randomly chosen reagent is: [blob_reagent_datum.name]!") - to_chat(src, "You are the overmind and can control the blob! You can expand, which will attack people, and place new blob pieces such as...") - to_chat(src, "Normal Blob will expand your reach and allow you to upgrade into special blobs that perform certain functions.") - to_chat(src, "Shield Blob is a strong and expensive blob which can take more damage. It is fireproof and can block air, use this to protect yourself from station fires.") - to_chat(src, "Reflective Blobis an upgraded Shield Blob which has a high chance of deflecting energy projectiles, but is vulnerable to ballistics and brute damage.") - to_chat(src, "Resource Blob is a blob which will collect more resources for you, try to build these earlier to get a strong income. It will benefit from being near your core or multiple nodes, by having an increased resource rate; put it alone and it won't create resources at all.") - to_chat(src, "Node Blob is a blob which will grow, like the core. Unlike the core it won't give you a small income but it can power resource and factory blobs to increase their rate.") - to_chat(src, "Factory Blob is a blob which will spawn blob spores which will attack nearby food. Putting this nearby nodes and your core will increase the spawn rate; put it alone and it will not spawn any spores.") - to_chat(src, "Shortcuts: CTRL Click = Expand Blob / Middle Mouse Click = Rally Spores / Alt Click = Create Shield") + blob_help() update_health() /mob/camera/blob/proc/update_health() diff --git a/code/game/gamemodes/blob/powers.dm b/code/game/gamemodes/blob/powers.dm index 4491b80d2e4..748823829b5 100644 --- a/code/game/gamemodes/blob/powers.dm +++ b/code/game/gamemodes/blob/powers.dm @@ -31,6 +31,16 @@ if(chosen_node) src.loc = chosen_node.loc +/mob/camera/blob/verb/toggle_node_req() + set category = "Blob" + set name = "Toggle Node Requirement" + set desc = "Toggle requiring nodes to place resource and factory blobs." + nodes_required = !nodes_required + if(nodes_required) + to_chat(src, "You now require a nearby node or core to place factory and resource blobs.") + else + to_chat(src, "You no longer require a nearby node or core to place factory and resource blobs.") + /mob/camera/blob/verb/create_shield_power() set category = "Blob" set name = "Create/Upgrade Shield Blob (15)" @@ -43,7 +53,7 @@ var/obj/structure/blob/B = locate(/obj/structure/blob) in T var/obj/structure/blob/shield/S = locate(/obj/structure/blob/shield) in T - + if(!S) if(!B)//We are on a blob to_chat(src, "There is no blob here!") @@ -59,7 +69,7 @@ B.color = blob_reagent_datum.color B.change_to(/obj/structure/blob/shield) else - + if(istype(S, /obj/structure/blob/shield/reflective)) to_chat(src, "There's already a reflector blob here!") return @@ -68,12 +78,12 @@ else if(S.health < S.maxHealth * 0.5) to_chat(src, "This shield blob is too damaged to be modified properly!") return - + else if (!can_buy(15)) return - + to_chat(src, "You secrete a reflective ooze over the shield blob, allowing it to reflect energy projectiles at the cost of reduced intregrity.") - + S.change_to(/obj/structure/blob/shield/reflective) S.color = blob_reagent_datum.color return @@ -103,6 +113,11 @@ to_chat(src, "There is a resource blob nearby, move more than 4 tiles away from it!") return + if(nodes_required) + if(!(locate(/obj/structure/blob/node) in orange(3, T)) && !(locate(/obj/structure/blob/core) in orange(4, T))) + to_chat(src, "You need to place this blob closer to a node or core!") + return //handholdotron 2000 + if(!can_buy(40)) return @@ -174,6 +189,11 @@ to_chat(src, "There is a factory blob nearby, move more than 7 tiles away from it!") return + if(nodes_required) + if(!(locate(/obj/structure/blob/node) in orange(3, T)) && !(locate(/obj/structure/blob/core) in orange(4, T))) + to_chat(src, "You need to place this blob closer to a node or core!") + return //handholdotron 2000 + if(!can_buy(60)) return @@ -210,7 +230,7 @@ var/mob/living/simple_animal/hostile/blob/blobbernaut/blobber = new /mob/living/simple_animal/hostile/blob/blobbernaut (get_turf(B)) if(blobber) qdel(B) - blobber.color = blob_reagent_datum.color + blobber.color = blob_reagent_datum.complementary_color blobber.overmind = src blob_mobs.Add(blobber) return @@ -245,21 +265,28 @@ /mob/camera/blob/verb/revert() set category = "Blob" set name = "Remove Blob" - set desc = "Removes a blob." + set desc = "Removes a blob. You will receive 30% cost refund for special Blob structures." var/turf/T = get_turf(src) - if(!T) - return + remove_blob(T) + +/mob/camera/blob/proc/remove_blob(var/turf/T) var/obj/structure/blob/B = locate(/obj/structure/blob) in T + if(!T) + return if(!B) - to_chat(src, "You must be on a blob!") + to_chat(src, "There is no blob there!") return - - if(istype(B, /obj/structure/blob/core)) - to_chat(src, "Unable to remove this blob.") + if(B.point_return < 0) + to_chat(src, "Unable to remove this blob.") return - + if(max_blob_points < B.point_return + blob_points) + to_chat(src, "You have too many resources to remove this blob!") + return + if(B.point_return) + add_points(B.point_return) + to_chat(src, "Gained [B.point_return] resources from removing \the [B].") qdel(B) return @@ -331,8 +358,14 @@ /mob/camera/blob/verb/split_consciousness() set category = "Blob" set name = "Split consciousness (100) (One use)" - set desc = "Expend resources to attempt to produce another sentient overmind" + set desc = "Expend resources to attempt to produce another sentient overmind." + if(split_used) + to_chat(src, "You have already produced an offspring.") + return + if(is_offspring) + to_chat(src, "You cannot split as an offspring of another Blob.") + return if(!blob_nodes || !blob_nodes.len) to_chat(src, "A node is required to birth your offspring...") return @@ -340,11 +373,12 @@ if(!N) to_chat(src, "A node is required to birth your offspring...") return - + if(!can_buy(100)) return - verbs -= /mob/camera/blob/verb/split_consciousness //we've used our split_consciousness + split_used = TRUE + new /obj/structure/blob/core/ (get_turf(N), 200, null, blob_core.point_rate, "offspring") qdel(N) @@ -409,7 +443,7 @@ /mob/camera/blob/verb/chemical_reroll() set category = "Blob" set name = "Reactive Chemical Adaptation (50)" - set desc = "Replaces your chemical with a different one" + set desc = "Replaces your chemical with a random, different one." if(!can_buy(50)) return @@ -417,10 +451,31 @@ var/datum/reagent/blob/B = pick((subtypesof(/datum/reagent/blob) - blob_reagent_datum.type)) blob_reagent_datum = new B + color = blob_reagent_datum.complementary_color + for(var/obj/structure/blob/BL in blobs) BL.adjustcolors(blob_reagent_datum.color) for(var/mob/living/simple_animal/hostile/blob/BLO) - BLO.adjustcolors(blob_reagent_datum.color) + BLO.adjustcolors(blob_reagent_datum.complementary_color) - to_chat(src, "Your reagent is now: [blob_reagent_datum.name]!") + to_chat(src, "Your reagent is now: [blob_reagent_datum.name] - [blob_reagent_datum.description]") + +/mob/camera/blob/verb/blob_help() + set category = "Blob" + set name = "*Blob Help*" + set desc = "Help on how to blob." + to_chat(src, "As the overmind, you can control the blob!") + to_chat(src, "Your blob reagent is: [blob_reagent_datum.name] - [blob_reagent_datum.description]") + to_chat(src, "You can expand, which will attack people, damage objects, or place a Normal Blob if the tile is clear.") + to_chat(src, "Normal Blobs will expand your reach and can be upgraded into special blobs that perform certain functions.") + to_chat(src, "You can upgrade normal blobs into the following types of blob:") + to_chat(src, "Shield Blobs are strong and expensive blobs which take more damage. In additon, they are fireproof and can block air, use these to protect yourself from station fires. Upgrading them again will result in a Reflective blob, capable of reflecting laser projectiles at the cost of the strong blob's extra health.") + to_chat(src, "Resource Blobs are blobs which produce more resources for you, build as many of these as possible to consume the station. This type of blob must be placed near node blobs or your core to work.") + to_chat(src, "Factory Blobs are blobs that spawn blob spores which will attack nearby enemies. This type of blob must be placed near node blobs or your core to work.") + to_chat(src, "Blobbernauts can be produced from factories for a cost, and are hard to kill, powerful, but ultimately dumb. The factory used to create one will be destroyed in the process.") + to_chat(src, "Storage Blobs are storage towers which will store extra resources for you. This increases your max resource cap by 50.") + to_chat(src, "Node Blobs are blobs which grow, like the core. Like the core it can activate resource and factory blobs.") + to_chat(src, "In addition to the buttons on your HUD, there are a few click shortcuts to speed up expansion and defense.") + to_chat(src, "Shortcuts: Click = Expand Blob | CTRL Click = Create Shield Blob | Middle Mouse Click = Rally Spores | Alt Click = Remove Blob") + to_chat(src, "Attempting to talk will send a message to all other overminds, allowing you to coordinate with them.") \ No newline at end of file diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm index 7d55f2fe1c9..bf56d1687c5 100644 --- a/code/game/gamemodes/blob/theblob.dm +++ b/code/game/gamemodes/blob/theblob.dm @@ -7,6 +7,7 @@ density = 0 opacity = 0 anchored = 1 + var/point_return = 0 //How many points the blob gets back when it removes a blob of that type. If less than 0, blob cannot be removed. var/health = 30 var/health_timestamp = 0 var/brute_resist = 4 @@ -31,8 +32,10 @@ /obj/structure/blob/CanPass(atom/movable/mover, turf/target, height=0) - if(height==0) return 1 - if(istype(mover) && mover.checkpass(PASSBLOB)) return 1 + if(height==0) + return 1 + if(istype(mover) && mover.checkpass(PASSBLOB)) + return 1 return 0 /obj/structure/blob/CanAStarPass(ID, dir, caller) @@ -45,7 +48,7 @@ Life() return -/obj/structure/blob/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) +/obj/structure/blob/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE) ..() var/damage = Clamp(0.01 * exposed_temperature, 0, 4) take_damage(damage, BURN) diff --git a/code/game/gamemodes/changeling/powers/fleshmend.dm b/code/game/gamemodes/changeling/powers/fleshmend.dm index 6dbd4badc30..21d97863105 100644 --- a/code/game/gamemodes/changeling/powers/fleshmend.dm +++ b/code/game/gamemodes/changeling/powers/fleshmend.dm @@ -40,9 +40,6 @@ // The healing itself - doesn't heal toxin damage // (that's anatomic panacea) and the effectiveness decreases with // each use in a short timespan - if(ishuman(user)) - var/mob/living/carbon/human/H = user - H.shock_stage = 0 for(var/i in 1 to healing_ticks) if(user) var/healpertick = -(total_healing / healing_ticks) diff --git a/code/game/gamemodes/changeling/powers/mutations.dm b/code/game/gamemodes/changeling/powers/mutations.dm index 0c8d22b5a8b..6288bed2964 100644 --- a/code/game/gamemodes/changeling/powers/mutations.dm +++ b/code/game/gamemodes/changeling/powers/mutations.dm @@ -220,7 +220,7 @@ /obj/item/gun/magic/tentacle/suicide_act(mob/user) user.visible_message("[user] coils [src] tightly around [user.p_their()] neck! It looks like [user.p_theyre()] trying to commit suicide.") - return (OXYLOSS) + return OXYLOSS /obj/item/ammo_casing/magic/tentacle name = "tentacle" diff --git a/code/game/gamemodes/changeling/powers/revive.dm b/code/game/gamemodes/changeling/powers/revive.dm index 83f221a95d3..1fef93d0f13 100644 --- a/code/game/gamemodes/changeling/powers/revive.dm +++ b/code/game/gamemodes/changeling/powers/revive.dm @@ -27,8 +27,6 @@ if(ishuman(user)) var/mob/living/carbon/human/H = user H.restore_blood() - H.traumatic_shock = 0 - H.shock_stage = 0 H.next_pain_time = 0 H.dna.species.create_organs(H) // Now that recreating all organs is necessary, the rest of this organ stuff probably @@ -51,6 +49,8 @@ IO.rejuvenate() IO.trace_chemicals.Cut() H.remove_all_embedded_objects() + for(var/datum/disease/critical/C in user.viruses) + C.cure() user.status_flags &= ~(FAKEDEATH) user.updatehealth("revive sting") user.update_blind_effects() diff --git a/code/game/gamemodes/changeling/traitor_chan.dm b/code/game/gamemodes/changeling/traitor_chan.dm index 060f454dddd..80a3dc37809 100644 --- a/code/game/gamemodes/changeling/traitor_chan.dm +++ b/code/game/gamemodes/changeling/traitor_chan.dm @@ -38,5 +38,6 @@ changeling.special_role = SPECIAL_ROLE_CHANGELING forge_changeling_objectives(changeling) greet_changeling(changeling) + update_change_icons_added(changeling) ..() return \ No newline at end of file diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index 865d8e603d2..9e45cab4292 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -185,6 +185,7 @@ var/global/list/all_cults = list() cult_mind.current.faction |= "cult" var/datum/action/innate/cultcomm/C = new() C.Grant(cult_mind.current) + SEND_SOUND(cult_mind.current, 'sound/ambience/antag/bloodcult.ogg') cult_mind.current.create_attack_log("Has been converted to the cult!") if(jobban_isbanned(cult_mind.current, ROLE_CULTIST) || jobban_isbanned(cult_mind.current, ROLE_SYNDICATE)) replace_jobbanned_player(cult_mind.current, ROLE_CULTIST) diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index 26cf3fdf655..45f2f2853bc 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -26,7 +26,7 @@ ..() /obj/item/melee/cultblade/pickup(mob/living/user) - ..() + . = ..() if(!iscultist(user)) to_chat(user, "\"I wouldn't advise that.\"") to_chat(user, "An overwhelming sense of nausea overpowers you!") @@ -34,7 +34,7 @@ if(HULK in user.mutations) to_chat(user, "You can't seem to hold the blade properly!") - user.unEquip(src, 1) + return FALSE /obj/item/melee/cultblade/dagger name = "sacrificial dagger" diff --git a/code/game/gamemodes/miniantags/borer/borer.dm b/code/game/gamemodes/miniantags/borer/borer.dm index 5ba8d1360b0..34d1f64f0d0 100644 --- a/code/game/gamemodes/miniantags/borer/borer.dm +++ b/code/game/gamemodes/miniantags/borer/borer.dm @@ -129,6 +129,7 @@ to_chat(user, "Upon using the antagHUD you forfeited the ability to join the round.") return if(jobban_isbanned(user, "Syndicate")) + to_chat(user, "You are banned from antagonists!") return if(key) return diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm index cfa5ce3af84..e0f329bb0a4 100644 --- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm +++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm @@ -36,17 +36,22 @@ to_chat(user, "This swarmer shell is completely depowered. You cannot activate it.") return - var/be_swarmer = alert("Become a swarmer? (Warning, You can no longer be cloned!)",,"Yes","No") - if(be_swarmer == "No") - return - if(jobban_isbanned(user, "Syndicate")) to_chat(user, "You are banned from antagonists!") return + if(cannotPossess(user)) + to_chat(user, "Upon using the antagHUD you forfeited the ability to join the round.") + return + + var/be_swarmer = alert("Become a swarmer? (Warning, You can no longer be cloned!)",,"Yes","No") + if(be_swarmer == "No") + return + if(crit_fail)//in case it depowers while ghost is looking at yes/no to_chat(user, "This swarmer shell is completely depowered. You cannot activate it.") return + if(QDELETED(src)) to_chat(user, "Swarmer has been occupied by someone else.") return @@ -96,10 +101,12 @@ attack_sound = 'sound/effects/empulse.ogg' friendly = "pinches" speed = 0 + a_intent = INTENT_HARM + can_change_intents = 0 faction = list("swarmer") projectiletype = /obj/item/projectile/beam/disabler pass_flags = PASSTABLE - mob_size = MOB_SIZE_TINY + mob_size = MOB_SIZE_SMALL ventcrawler = 2 ranged = 1 light_color = LIGHT_COLOR_CYAN diff --git a/code/game/gamemodes/miniantags/guardian/guardian.dm b/code/game/gamemodes/miniantags/guardian/guardian.dm index f95a22402e9..8a027c904ca 100644 --- a/code/game/gamemodes/miniantags/guardian/guardian.dm +++ b/code/game/gamemodes/miniantags/guardian/guardian.dm @@ -12,6 +12,7 @@ icon_dead = "magicOrange" speed = 0 a_intent = INTENT_HARM + can_change_intents = 0 stop_automated_movement = 1 floating = 1 attack_sound = 'sound/weapons/punch1.ogg' @@ -60,9 +61,9 @@ /mob/living/simple_animal/hostile/guardian/Life(seconds, times_fired) //Dies if the summoner dies ..() if(summoner) - if(summoner.stat == DEAD) + if(summoner.stat == DEAD || (!summoner.check_death_method() && summoner.health <= HEALTH_THRESHOLD_DEAD)) to_chat(src, "Your summoner has died!") - visible_message("The [src] dies along with its user!") + visible_message("[src] dies along with its user!") ghostize() qdel(src) snapback() @@ -85,6 +86,18 @@ forceMove(summoner.loc) //move to summoner's tile, don't recall new /obj/effect/temp_visual/guardian/phase(loc) +/mob/living/simple_animal/hostile/guardian/proc/is_deployed() + return loc != summoner + +/mob/living/simple_animal/hostile/guardian/AttackingTarget() + if(!is_deployed() && a_intent == INTENT_HARM) + to_chat(src, "You must be manifested to attack!") + return FALSE + else if(!is_deployed() && a_intent == INTENT_HELP) + return FALSE + else + return ..() + /mob/living/simple_animal/hostile/guardian/Move() //Returns to summoner if they move out of range ..() snapback() @@ -102,7 +115,7 @@ if(summoner) var/resulthealth if(iscarbon(summoner)) - resulthealth = round((abs(config.health_threshold_dead - summoner.health) / abs(config.health_threshold_dead - summoner.maxHealth)) * 100) + resulthealth = round((abs(HEALTH_THRESHOLD_DEAD - summoner.health) / abs(HEALTH_THRESHOLD_DEAD - summoner.maxHealth)) * 100) else resulthealth = round((summoner.health / summoner.maxHealth) * 100) if(hud_used) @@ -182,7 +195,7 @@ if(adminseal || override)//if it's an admin-spawned guardian without a host it can still talk normally return ..(message) Communicate(message) - + /mob/living/simple_animal/hostile/guardian/proc/ToggleMode() to_chat(src, "You dont have another mode!") @@ -261,7 +274,7 @@ var/failure_message = "..And draw a card! It's...blank? Maybe you should try again later." var/ling_failure = "The deck refuses to respond to a souless creature such as you." var/list/possible_guardians = list("Chaos", "Standard", "Ranged", "Support", "Explosive", "Assassin", "Lightning", "Charger", "Protector") - var/random = TRUE + var/random = FALSE var/color_list = list("Pink" = "#FFC0CB", "Red" = "#FF0000", "Orange" = "#FFA500", @@ -358,7 +371,7 @@ G.icon_state = "[theme][color]" G.icon_dead = "[theme][color]" to_chat(user, "[G.magic_fluff_string].") - + /obj/item/guardiancreator/choose random = FALSE diff --git a/code/game/gamemodes/miniantags/guardian/types/bomb.dm b/code/game/gamemodes/miniantags/guardian/types/bomb.dm index f916f127f5e..fbe4458693f 100644 --- a/code/game/gamemodes/miniantags/guardian/types/bomb.dm +++ b/code/game/gamemodes/miniantags/guardian/types/bomb.dm @@ -8,6 +8,13 @@ tech_fluff_string = "Boot sequence complete. Explosive modules active. Holoparasite swarm online." bio_fluff_string = "Your scarab swarm finishes mutating and stirs to life, capable of stealthily booby trapping items." var/bomb_cooldown = 0 + var/default_bomb_cooldown = 20 SECONDS + +/mob/living/simple_animal/hostile/guardian/bomb/Stat() + ..() + if(statpanel("Status")) + if(bomb_cooldown >= world.time) + stat(null, "Bomb Cooldown Remaining: [max(round((bomb_cooldown - world.time)*0.1, 0.1), 0)] seconds") /mob/living/simple_animal/hostile/guardian/bomb/AltClickOn(atom/movable/A) if(!istype(A)) @@ -21,11 +28,11 @@ to_chat(src, "Success! Bomb on [A] armed!") if(summoner) to_chat(summoner, "Your guardian has primed [A] to explode!") - bomb_cooldown = world.time + 200 + bomb_cooldown = world.time + default_bomb_cooldown B.spawner = src B.disguise (A) else - to_chat(src, "Your powers are on cooldown! You must wait 20 seconds between bombs.") + to_chat(src, "Your power is on cooldown! You must wait another [max(round((bomb_cooldown - world.time)*0.1, 0.1), 0)] seconds before you can place next bomb.") /obj/item/guardian_bomb name = "bomb" @@ -72,6 +79,7 @@ /obj/item/guardian_bomb/pickup(mob/living/user) detonate(user) + return FALSE // Disarm or blow up. No picking up /obj/item/guardian_bomb/examine(mob/user) stored_obj.examine(user) diff --git a/code/game/gamemodes/miniantags/guardian/types/fire.dm b/code/game/gamemodes/miniantags/guardian/types/fire.dm index f10a94793b5..58f4873e800 100644 --- a/code/game/gamemodes/miniantags/guardian/types/fire.dm +++ b/code/game/gamemodes/miniantags/guardian/types/fire.dm @@ -1,5 +1,4 @@ /mob/living/simple_animal/hostile/guardian/fire - a_intent = INTENT_HELP melee_damage_lower = 10 melee_damage_upper = 10 attack_sound = 'sound/items/welder.ogg' diff --git a/code/game/gamemodes/miniantags/guardian/types/healer.dm b/code/game/gamemodes/miniantags/guardian/types/healer.dm index 6c784e1ee0a..d9be543f7e2 100644 --- a/code/game/gamemodes/miniantags/guardian/types/healer.dm +++ b/code/game/gamemodes/miniantags/guardian/types/healer.dm @@ -1,5 +1,4 @@ /mob/living/simple_animal/hostile/guardian/healer - a_intent = INTENT_HARM friendly = "heals" speed = 0 melee_damage_lower = 15 @@ -10,6 +9,7 @@ bio_fluff_string = "Your scarab swarm finishes mutating and stirs to life, capable of mending wounds and travelling via bluespace." var/turf/simulated/floor/beacon var/beacon_cooldown = 0 + var/default_beacon_cooldown = 300 SECONDS var/toggle = FALSE var/heal_cooldown = 0 @@ -21,7 +21,6 @@ icon_state = "seal" attacktext = "slaps" speak_emote = list("barks") - a_intent = INTENT_HARM friendly = "heals" speed = 0 melee_damage_lower = 0 @@ -37,6 +36,12 @@ var/datum/atom_hud/medsensor = huds[DATA_HUD_MEDICAL_ADVANCED] medsensor.add_hud_to(src) +/mob/living/simple_animal/hostile/guardian/healer/Stat() + ..() + if(statpanel("Status")) + if(beacon_cooldown >= world.time) + stat(null, "Bluespace Beacon Cooldown Remaining: [max(round((beacon_cooldown - world.time)*0.1, 0.1), 0)] seconds") + /mob/living/simple_animal/hostile/guardian/healer/AttackingTarget() ..() if(toggle == TRUE) @@ -60,6 +65,7 @@ if(loc == summoner) if(toggle) a_intent = INTENT_HARM + hud_used.action_intent.icon_state = a_intent; speed = 0 damage_transfer = 0.7 if(adminseal) @@ -70,6 +76,7 @@ toggle = FALSE else a_intent = INTENT_HELP + hud_used.action_intent.icon_state = a_intent; speed = 1 damage_transfer = 1 if(adminseal) @@ -81,9 +88,8 @@ else to_chat(src, "You have to be recalled to toggle modes!") - /mob/living/simple_animal/hostile/guardian/healer/verb/Beacon() - set name = "Place Bluespsace Beacon" + set name = "Place Bluespace Beacon" set category = "Guardian" set desc = "Mark a floor as your beacon point, allowing you to warp targets to it. Your beacon will not work in unfavorable atmospheric conditions." if(beacon_cooldown < world.time) @@ -98,10 +104,10 @@ if(beacon) beacon.ChangeTurf(/turf/simulated/floor/plating) beacon = F - beacon_cooldown = world.time+3000 + beacon_cooldown = world.time + default_beacon_cooldown else - to_chat(src, "Your power is on cooldown. You must wait five minutes between placing beacons.") + to_chat(src, "Your power is on cooldown! You must wait another [max(round((beacon_cooldown - world.time)*0.1, 0.1), 0)] seconds before you can place another beacon.") /mob/living/simple_animal/hostile/guardian/healer/AltClickOn(atom/movable/A) if(!istype(A)) diff --git a/code/game/gamemodes/miniantags/guardian/types/ranged.dm b/code/game/gamemodes/miniantags/guardian/types/ranged.dm index 695782728fa..0979ed45a6c 100644 --- a/code/game/gamemodes/miniantags/guardian/types/ranged.dm +++ b/code/game/gamemodes/miniantags/guardian/types/ranged.dm @@ -6,7 +6,6 @@ armour_penetration = 100 /mob/living/simple_animal/hostile/guardian/ranged - a_intent = INTENT_HELP friendly = "quietly assesses" melee_damage_lower = 10 melee_damage_upper = 10 diff --git a/code/game/gamemodes/miniantags/morph/morph.dm b/code/game/gamemodes/miniantags/morph/morph.dm index 94c39d12442..3bb36870d31 100644 --- a/code/game/gamemodes/miniantags/morph/morph.dm +++ b/code/game/gamemodes/miniantags/morph/morph.dm @@ -38,12 +38,12 @@ var/atom/movable/form = null var/morph_time = 0 - var/playstyle_string = "You are a morph, an abomination of science created primarily with changeling cells. \ - You may take the form of anything nearby by shift-clicking it. This process will alert any nearby \ - observers, and can only be performed once every five seconds. While morphed, you move faster, but do \ + var/playstyle_string = "You are a morph.
As an abomination created primarily with changeling cells, \ + you may take the form of anything nearby by shift-clicking it. This process will alert any nearby \ + observers, and can only be performed once every five seconds.
While morphed, you move faster, but do \ less damage. In addition, anyone within three tiles will note an uncanny wrongness if examining you. \ - You can attack any item or dead creature to consume it - creatures will restore 1/3 of your max health. \ - Finally, you can restore yourself to your original form while morphed by shift-clicking yourself.
" + You can restore yourself to your original form while morphed by shift-clicking yourself.
\ + Finally, you can attack any item or dead creature to consume it - creatures will restore 1/3 of your max health.
" /mob/living/simple_animal/hostile/morph/examine(mob/user) if(morphed) diff --git a/code/game/gamemodes/scoreboard.dm b/code/game/gamemodes/scoreboard.dm index 9a3ca6073a1..bd17175eaa2 100644 --- a/code/game/gamemodes/scoreboard.dm +++ b/code/game/gamemodes/scoreboard.dm @@ -59,7 +59,7 @@ score_richestjob = E.job score_richestkey = E.key - dmg_score = E.bruteloss + E.fireloss + E.toxloss + E.oxyloss + dmg_score = E.getBruteLoss() + E.getFireLoss() + E.getToxLoss() + E.getOxyLoss() if(dmg_score > score_dmgestdamage) score_dmgestdamage = dmg_score score_dmgestname = E.real_name diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm index 51360c7b398..4768ba19b88 100644 --- a/code/game/gamemodes/shadowling/shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm @@ -2,6 +2,9 @@ /obj/effect/proc_holder/spell/proc/shadowling_check(var/mob/living/carbon/human/H) if(!H || !istype(H)) return + if(H.incorporeal_move == 1) + to_chat(usr, "You can't use abilities affecting others while you are traversing between worlds!") + return FALSE if(isshadowling(H) && is_shadow(H)) return 1 if(isshadowlinglesser(H) && is_thrall(H)) @@ -15,9 +18,9 @@ return 0 -/obj/effect/proc_holder/spell/targeted/glare //Stuns and mutes a human target for 10 seconds +/obj/effect/proc_holder/spell/targeted/glare //Stuns and mutes a human target, depending on the distance relative to the shadowling name = "Glare" - desc = "Stuns and mutes a target for a decent duration." + desc = "Stuns and mutes a target for a decent duration. Duration depends on the proximity to the target." panel = "Shadowling Abilities" charge_max = 300 clothes_req = 0 @@ -43,13 +46,25 @@ return var/mob/living/carbon/human/M = target user.visible_message("[user]'s eyes flash a blinding red!") - target.visible_message("[target] freezes in place, [target.p_their()] eyes glazing over...") - if(in_range(target, user)) + var/distance = get_dist(target, user) + if (distance <= 1) //Melee glare + target.visible_message("[target] freezes in place, [target.p_their()] eyes glazing over...") to_chat(target, "Your gaze is forcibly drawn into [user]'s eyes, and you are mesmerized by [user.p_their()] heavenly beauty...") - else //Only alludes to the shadowling if the target is close by + target.Stun(10) + M.AdjustSilence(10) + else //Distant glare + var/loss = 10 - distance + var/duration = 10 - loss + if(loss <= 0) + to_chat(user, "Your glare had no effect over a such long distance!") + return + target.slowed = duration + M.AdjustSilence(10) + to_chat(target, "A red light flashes across your vision, and your mind tries to resist them.. you are exhausted.. you are not able to speak..") + sleep(duration*10) + target.Stun(loss) + target.visible_message("[target] freezes in place, [target.p_their()] eyes glazing over...") to_chat(target, "Red lights suddenly dance in your vision, and you are mesmerized by the heavenly lights...") - target.Stun(10) - M.AdjustSilence(10) /obj/effect/proc_holder/spell/aoe_turf/veil name = "Veil" @@ -411,11 +426,9 @@ B.icon_state = null //Invisible B.reagents.add_reagent("blindness_smoke", 10) var/datum/effect_system/smoke_spread/chem/S = new - S.attach(B) if(S) - S.set_up(B.reagents, 10, 0, B.loc) + S.set_up(B.reagents, B.loc, TRUE) S.start(4) - sleep(10) qdel(B) /datum/reagent/shadowling_blindness_smoke //Blinds non-shadowlings, heals shadowlings/thralls diff --git a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm index a561fe6a273..29a2c9aadca 100644 --- a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm @@ -107,6 +107,8 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/collective_mind(null)) H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadowling_regenarmor(null)) H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadowling_extend_shuttle(null)) + H.hud_used = new /datum/hud/human(H, ui_style2icon(H.client.prefs.UI_style), H.client.prefs.UI_style_color, H.client.prefs.UI_style_alpha) + H.hud_used.show_hud(H.hud_used.hud_version) /obj/effect/proc_holder/spell/targeted/shadowling_ascend name = "Ascend" diff --git a/code/game/gamemodes/vampire/traitor_vamp.dm b/code/game/gamemodes/vampire/traitor_vamp.dm index f1064bffd1b..406275c709f 100644 --- a/code/game/gamemodes/vampire/traitor_vamp.dm +++ b/code/game/gamemodes/vampire/traitor_vamp.dm @@ -43,4 +43,5 @@ vampire.special_role = SPECIAL_ROLE_VAMPIRE forge_vampire_objectives(vampire) greet_vampire(vampire) + update_vampire_icons_added(vampire) ..() \ No newline at end of file diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm index 5ed9af46fe1..dbe3146dd7f 100644 --- a/code/game/gamemodes/wizard/artefact.dm +++ b/code/game/gamemodes/wizard/artefact.dm @@ -868,7 +868,7 @@ var/global/list/multiverse = list() var/area/A = get_area(src) to_chat(victim, "You feel a dark presence from [A.name]") -/obj/item/voodoo/fire_act() +/obj/item/voodoo/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE) if(target) target.adjust_fire_stacks(20) target.IgniteMob() diff --git a/code/game/gamemodes/wizard/rightandwrong.dm b/code/game/gamemodes/wizard/rightandwrong.dm index 9150f25736a..aff40200c6b 100644 --- a/code/game/gamemodes/wizard/rightandwrong.dm +++ b/code/game/gamemodes/wizard/rightandwrong.dm @@ -1,12 +1,12 @@ -/mob/proc/rightandwrong(var/summon_type) //0 = Summon Guns, 1 = Summon Magic - var/list/gunslist = list("taser","egun","laser","revolver","detective","c20r","nuclear","deagle","gyrojet","pulse","suppressed","cannon","doublebarrel","shotgun","combatshotgun","bulldog","mateba","sabr","crossbow","saw","car","boltaction","arg","uzi","turret","pulsecarbine","decloner","mindflayer","kinetic","advplasmacutter","wormhole","wt550","grenadelauncher","medibeam") +/mob/proc/rightandwrong(summon_type, revolver_fight = FALSE, fake_revolver_fight = FALSE) //0 = Summon Guns, 1 = Summon Magic + var/list/gunslist = list("taser","egun","laser","revolver","detective","c20r","nuclear","deagle","gyrojet","pulse","suppressed","cannon","doublebarrel","shotgun","combatshotgun","bulldog","mateba","sabr","crossbow","saw","car","boltaction","arg","uzi","turret","pulsecarbine","decloner","mindflayer","kinetic","advplasmacutter","wormhole","wt550","grenadelauncher","medibeam", "fakerevolver") var/list/magiclist = list("fireball","smoke","blind","mindswap","forcewall","knock","horsemask","charge", "summonitem", "wandnothing", "wanddeath", "wandresurrection", "wandpolymorph", "wandteleport", "wanddoor", "wandfireball", "staffhealing", "armor", "scrying", "staffdoor", "special","voodoo","special") var/list/magicspeciallist = list("staffchange","staffanimation", "wandbelt", "contract", "staffchaos","necromantic") to_chat(usr, "You summoned [summon_type ? "magic" : "guns"]!") - message_admins("[key_name_admin(usr)] summoned [summon_type ? "magic" : "guns"]!") + message_admins("[key_name_admin(usr)] summoned [summon_type ? "magic" : "guns"]! ([revolver_fight ? "Revolver duel!" : ""] [fake_revolver_fight ? "Suicidal revolver duel!" : ""])") for(var/mob/living/carbon/human/H in GLOB.player_list) if(H.stat == 2 || !(H.client)) @@ -17,6 +17,13 @@ var/randomizeguns = pick(gunslist) var/randomizemagic = pick(magiclist) var/randomizemagicspecial = pick(magicspeciallist) + if(revolver_fight) + randomizeguns = "revolver" + if(fake_revolver_fight) + if(prob(50)) + randomizeguns = "revolver" + else + randomizeguns = "fakerevolver" if(!summon_type) switch(randomizeguns) if("taser") @@ -88,6 +95,8 @@ new /obj/item/gun/projectile/revolver/grenadelauncher(get_turf(H)) if("medibeam") new /obj/item/gun/medbeam(get_turf(H)) + if("fakerevolver") + new /obj/item/toy/russian_revolver/trick_revolver(get_turf(H)) //lol playsound(get_turf(H), 'sound/magic/summon_guns.ogg', 50, 1) else diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm index f9224d1746a..3e22f3f84df 100644 --- a/code/game/gamemodes/wizard/soulstone.dm +++ b/code/game/gamemodes/wizard/soulstone.dm @@ -39,7 +39,7 @@ optional = TRUE /obj/item/soulstone/pickup(mob/living/user) - ..() + . = ..() if(!can_use(user)) to_chat(user, "An overwhelming feeling of dread comes over you as you pick up the soulstone. It would be wise to be rid of this quickly.") user.Dizzy(120) diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index 29b77a366eb..66cdff69b3f 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -409,9 +409,19 @@ limit = 3 category = "Assistance" +/datum/spellbook_entry/item/oozebottle + name = "Bottle of Ooze" + desc = "A bottle of magically infused ooze, which will awake an all-consuming Morph, capable of cunningly disguising itself as any object it comes in contact with. Be careful though, as Morph diet includes Wizards." + item_path = /obj/item/antag_spawner/morph + cost = 1 + log_name = "BO" + limit = 3 + category = "Assistance" + /datum/spellbook_entry/item/tarotdeck name = "Tarot Deck" - desc = "A deck of tarot cards that can be used to summon a spirit companion for the wizard." + desc = "A deck of guardian tarot cards, capable of binding a personal guardian to your body. There are multiple types of guardian available, but all of them will transfer some amount of damage to you. \ + It would be wise to avoid buying these with anything capable of causing you to swap bodies with others." item_path = /obj/item/guardiancreator log_name = "TD" limit = 1 diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm index e2cffabcfd0..ecae6919813 100644 --- a/code/game/jobs/job/engineering.dm +++ b/code/game/jobs/job/engineering.dm @@ -18,8 +18,8 @@ access_heads, access_construction, access_sec_doors, access_ce, access_RC_announce, access_keycard_auth, access_tcomsat, access_minisat, access_mechanic, access_mineral_storeroom) minimal_player_age = 21 - exp_requirements = 1200 - exp_type = EXP_TYPE_CREW + exp_requirements = 300 + exp_type = EXP_TYPE_ENGINEERING outfit = /datum/outfit/job/chief_engineer /datum/outfit/job/chief_engineer diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm index aaf1a61a2a1..49e6b4486ac 100644 --- a/code/game/jobs/job/medical.dm +++ b/code/game/jobs/job/medical.dm @@ -16,8 +16,8 @@ access_chemistry, access_virology, access_cmo, access_surgery, access_RC_announce, access_keycard_auth, access_sec_doors, access_psychiatrist, access_maint_tunnels, access_paramedic, access_mineral_storeroom) minimal_player_age = 21 - exp_requirements = 1200 - exp_type = EXP_TYPE_CREW + exp_requirements = 300 + exp_type = EXP_TYPE_MEDICAL outfit = /datum/outfit/job/cmo /datum/outfit/job/cmo diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm index a1711bf4fd8..435565434c8 100644 --- a/code/game/jobs/job/science.dm +++ b/code/game/jobs/job/science.dm @@ -18,8 +18,8 @@ access_research, access_robotics, access_xenobiology, access_ai_upload, access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_minisat, access_maint_tunnels, access_mineral_storeroom, access_network) minimal_player_age = 21 - exp_requirements = 1200 - exp_type = EXP_TYPE_CREW + exp_requirements = 300 + exp_type = EXP_TYPE_SCIENCE // All science-y guys get bonuses for maxing out their tech. required_objectives = list( /datum/job_objective/further_research diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm index b425532bf30..407393eb489 100644 --- a/code/game/jobs/job/security.dm +++ b/code/game/jobs/job/security.dm @@ -18,8 +18,8 @@ access_research, access_engine, access_mining, access_medical, access_construction, access_mailsorting, access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_pilot, access_weapons) minimal_player_age = 21 - exp_requirements = 1200 - exp_type = EXP_TYPE_CREW + exp_requirements = 300 + exp_type = EXP_TYPE_SECURITY disabilities_allowed = 0 outfit = /datum/outfit/job/hos diff --git a/code/game/jobs/job/silicon.dm b/code/game/jobs/job/silicon.dm index 0def40bc7b1..c239c1d3b3b 100644 --- a/code/game/jobs/job/silicon.dm +++ b/code/game/jobs/job/silicon.dm @@ -9,8 +9,8 @@ department_head = list("Captain") req_admin_notify = 1 minimal_player_age = 30 - exp_requirements = 1200 - exp_type = EXP_TYPE_CREW + exp_requirements = 300 + exp_type = EXP_TYPE_SILICON /datum/job/ai/equip(mob/living/carbon/human/H) if(!H) diff --git a/code/game/jobs/job/supervisor.dm b/code/game/jobs/job/supervisor.dm index 3cdbb9b7247..710835ca873 100644 --- a/code/game/jobs/job/supervisor.dm +++ b/code/game/jobs/job/supervisor.dm @@ -13,8 +13,8 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0) access = list() //See get_access() minimal_access = list() //See get_access() minimal_player_age = 30 - exp_requirements = 2400 - exp_type = EXP_TYPE_CREW + exp_requirements = 300 + exp_type = EXP_TYPE_COMMAND disabilities_allowed = 0 outfit = /datum/outfit/job/captain @@ -68,8 +68,8 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0) req_admin_notify = 1 is_command = 1 minimal_player_age = 21 - exp_requirements = 1200 - exp_type = EXP_TYPE_CREW + exp_requirements = 300 + exp_type = EXP_TYPE_COMMAND access = list(access_security, access_sec_doors, access_brig, access_court, access_forensics_lockers, access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads, access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue, diff --git a/code/game/jobs/job_exp.dm b/code/game/jobs/job_exp.dm index fa13fbdb4b7..218b0761eb3 100644 --- a/code/game/jobs/job_exp.dm +++ b/code/game/jobs/job_exp.dm @@ -100,6 +100,7 @@ var/global/list/role_playtime_requirements = list( // Procs /proc/role_available_in_playtime(client/C, role) + // "role" is a special role defined in role_playtime_requirements above. e.g: ROLE_ERT. This is *not* a job title. if(!C) return 0 if(!role) @@ -121,6 +122,7 @@ var/global/list/role_playtime_requirements = list( return req_mins return max(0, req_mins - my_exp) + /datum/job/proc/available_in_playtime(client/C) if(!C) return 0 diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index a4fc67ddf32..c447ff26e72 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -104,6 +104,7 @@ if(prob(addiction_removal_chance)) to_chat(occupant, "You no longer feel reliant on [R.name]!") occupant.reagents.addiction_list.Remove(R) + qdel(R) for(var/mob/M as mob in src) // makes sure that simple mobs don't get stuck inside a sleeper when they resist out of occupant's grasp if(M == occupant) @@ -148,7 +149,7 @@ occupantData["stat"] = occupant.stat occupantData["health"] = occupant.health occupantData["maxHealth"] = occupant.maxHealth - occupantData["minHealth"] = config.health_threshold_dead + occupantData["minHealth"] = HEALTH_THRESHOLD_DEAD occupantData["bruteLoss"] = occupant.getBruteLoss() occupantData["oxyLoss"] = occupant.getOxyLoss() occupantData["toxLoss"] = occupant.getToxLoss() diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index 1be5fa5e43a..95e609ee524 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -244,6 +244,7 @@ update_flag return 0 /obj/machinery/portable_atmospherics/canister/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) + ..() if(exposed_temperature > temperature_resistance) health -= 5 healthcheck() diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 17a27812499..4f028fac2d1 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -34,7 +34,7 @@ var/obj/effect/countdown/clonepod/countdown - var/list/brine_types = list("corazone", "salbutamol", "hydrocodone") + var/list/brine_types = list("corazone", "perfluorodecalin", "epinephrine", "salglu_solution") //stops heart attacks, heart failure, shock, and keeps their O2 levels normal var/list/missing_organs var/organs_number = 0 @@ -341,7 +341,7 @@ check_brine() //Also heal some oxyloss ourselves just in case!! - occupant.adjustOxyLoss(-4) + occupant.adjustOxyLoss(-10) use_power(7500) //This might need tweaking. @@ -476,10 +476,13 @@ for(var/i in missing_organs) qdel(i) missing_organs.Cut() + occupant.SetLoseBreath(0) // Stop friggin' dying, gosh damn + occupant.setOxyLoss(0) + for(var/datum/disease/critical/crit in occupant.viruses) + crit.cure() occupant.forceMove(get_turf(src)) occupant.update_body() domutcheck(occupant) //Waiting until they're out before possible notransform. - occupant.shock_stage = 0 //Reset Shock occupant.special_post_clone_handling() occupant = null update_icon() diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm index c338a0f32c9..c4c8d342aeb 100644 --- a/code/game/machinery/computer/Operating.dm +++ b/code/game/machinery/computer/Operating.dm @@ -112,7 +112,7 @@ occupantData["stat"] = occupant.stat occupantData["health"] = occupant.health occupantData["maxHealth"] = occupant.maxHealth - occupantData["minHealth"] = config.health_threshold_dead + occupantData["minHealth"] = HEALTH_THRESHOLD_DEAD occupantData["bruteLoss"] = occupant.getBruteLoss() occupantData["oxyLoss"] = occupant.getOxyLoss() occupantData["toxLoss"] = occupant.getToxLoss() diff --git a/code/game/machinery/computer/brigcells.dm b/code/game/machinery/computer/brigcells.dm new file mode 100644 index 00000000000..d322e99ae4b --- /dev/null +++ b/code/game/machinery/computer/brigcells.dm @@ -0,0 +1,58 @@ +/obj/machinery/computer/brigcells + name = "cell management computer" + desc = "Used to manage prison cells." + icon_keyboard = "security_key" + icon_screen = "cell_monitor" + use_power = IDLE_POWER_USE + idle_power_usage = 250 + active_power_usage = 500 + circuit = /obj/item/circuitboard/brigcells + light_color = LIGHT_COLOR_DARKRED + req_access = list(access_brig) + +/obj/machinery/computer/brigcells/attack_ai(mob/user) + attack_hand(user) + ui_interact(user) + +/obj/machinery/computer/brigcells/attack_hand(mob/user) + add_fingerprint(user) + if(stat & (BROKEN|NOPOWER)) + return + if(!allowed(user)) + to_chat(user, "Access denied.") + return + ui_interact(user) + +/obj/machinery/computer/brigcells/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "brig_cells.tmpl", "Brig Cell Management", 1000, 400) + ui.open() + ui.set_auto_update(1) + +/obj/machinery/computer/brigcells/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state) + var/data[0] + var/list/timers = list() + for(var/obj/machinery/door_timer/T in GLOB.celltimers_list) + var/timer = list() + timer["cell_id"] = T.name + timer["occupant"] = T.occupant + timer["crimes"] = T.crimes + timer["brigged_by"] = T.officer + if(T.time == 0) + timer["background"] = "'background-color:#007f47'" + else + timer["background"] = "'background-color:#890E26'" + timer["time_set"] = seconds_to_clock(T.time / 10) + timer["time_left"] = seconds_to_clock(T.timeleft()) + timer["ref"] = "\ref[T]" + timers[++timers.len] += timer + timers = sortByKey(timers, "cell_id") + data["cells"] = timers + return data + +/obj/machinery/computer/brigcells/Topic(href, href_list) + if(href_list["release"]) + var/obj/machinery/door_timer/T = locate(href_list["release"]) + T.timer_end() + T.Radio.autosay("Timer stopped manually from a cell management console.", T.name, "Security", list(z)) diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index 9060833d585..2b294db78c9 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -219,6 +219,9 @@ /obj/item/circuitboard/prisoner name = "Circuit board (Prisoner Management)" build_path = /obj/machinery/computer/prisoner +/obj/item/circuitboard/brigcells + name = "Circuit board (Brig Cell Control)" + build_path = /obj/machinery/computer/brigcells // RD console circuits, so that {de,re}constructing one of the special consoles doesn't ruin everything forever diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index c134747cd41..acdbc1110f3 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -36,10 +36,13 @@ if(scanner.occupant && can_autoprocess()) scan_mob(scanner.occupant) - + + if(!LAZYLEN(records)) + return + for(var/obj/machinery/clonepod/pod in pods) if(!(pod.occupant || pod.mess) && (pod.efficiency > 5)) - for(var/datum/dna2/record/R in src.records) + for(var/datum/dna2/record/R in records) if(!(pod.occupant || pod.mess)) if(pod.growclone(R)) records.Remove(R) @@ -392,6 +395,12 @@ SSnanoui.update_uis(src) return + for(var/obj/machinery/clonepod/pod in pods) + if(pod.occupant && pod.clonemind == subject.mind) + scantemp = "Subject already getting cloned." + SSnanoui.update_uis(src) + return + subject.dna.check_integrity() var/datum/dna2/record/R = new /datum/dna2/record() diff --git a/code/game/machinery/computer/depot.dm b/code/game/machinery/computer/depot.dm index 4e6afa0c229..149e2b7ff49 100644 --- a/code/game/machinery/computer/depot.dm +++ b/code/game/machinery/computer/depot.dm @@ -283,7 +283,7 @@ return message_sent = TRUE if(user.mind && user.mind.special_role == SPECIAL_ROLE_TRAITOR) - var/input = stripped_input(user, "Please choose a message to transmit to Syndicate HQ via quantum entanglement. Transmission does not guarantee a response. This function may only be used ONCE.", "To abort, send an empty message.", "") as text|null + var/input = stripped_input(user, "Please choose a message to transmit to Syndicate HQ via quantum entanglement. Transmission does not guarantee a response. This function may only be used ONCE.", "To abort, send an empty message.", "") if(!input) message_sent = FALSE return diff --git a/code/game/machinery/computer/prisoner.dm b/code/game/machinery/computer/prisoner.dm index ea684d9596b..672ebed32e4 100644 --- a/code/game/machinery/computer/prisoner.dm +++ b/code/game/machinery/computer/prisoner.dm @@ -1,5 +1,5 @@ /obj/machinery/computer/prisoner - name = "prisoner management console" + name = "implant management console" icon = 'icons/obj/computer.dmi' icon_keyboard = "security_key" icon_screen = "explosive" diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index ece6615b786..9e91e254950 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -541,21 +541,20 @@ to destroy them and players will be able to make replacements. /obj/item/stock_parts/capacitor = 1) /obj/item/circuitboard/chem_dispenser - name = "circuit board (Portable Chem Dispenser)" - build_path = /obj/machinery/chem_dispenser/constructable + name = "circuit board (Chem Dispenser)" + build_path = /obj/machinery/chem_dispenser board_type = "machine" origin_tech = "materials=4;programming=4;plasmatech=4;biotech=3" frame_desc = "Requires 2 Matter Bins, 1 Capacitor, 1 Manipulator, 1 Console Screen, and 1 Power Cell." - req_components = list( - /obj/item/stock_parts/matter_bin = 2, + req_components = list( /obj/item/stock_parts/matter_bin = 2, /obj/item/stock_parts/capacitor = 1, /obj/item/stock_parts/manipulator = 1, /obj/item/stock_parts/console_screen = 1, /obj/item/stock_parts/cell = 1) /obj/item/circuitboard/chem_master - name = "circuit board (Chem Master 2999)" - build_path = /obj/machinery/chem_master/constructable + name = "circuit board (ChemMaster 3000)" + build_path = /obj/machinery/chem_master board_type = "machine" origin_tech = "materials=3;programming=2;biotech=3" req_components = list( @@ -563,6 +562,25 @@ to destroy them and players will be able to make replacements. /obj/item/stock_parts/manipulator = 1, /obj/item/stock_parts/console_screen = 1) +/obj/item/circuitboard/chem_master/attackby(obj/item/I, mob/user, params) + if(isscrewdriver(I)) + var/new_name = "ChemMaster" + var/new_path = /obj/machinery/chem_master + + if(build_path == /obj/machinery/chem_master) + new_name = "CondiMaster" + new_path = /obj/machinery/chem_master/condimaster + + build_path = new_path + name = "circuit board ([new_name] 3000)" + to_chat(user, "You change the circuit board setting to \"[new_name]\".") + else + return ..() + +/obj/item/circuitboard/chem_master/condi_master + name = "circuit board (CondiMaster 3000)" + build_path = /obj/machinery/chem_master/condimaster + /obj/item/circuitboard/chem_heater name = "circuit board (Chemical Heater)" build_path = /obj/machinery/chem_heater @@ -617,30 +635,13 @@ to destroy them and players will be able to make replacements. /obj/item/stock_parts/manipulator = 2, /obj/item/reagent_containers/glass/beaker = 2) -/obj/item/circuitboard/soda +/obj/item/circuitboard/chem_dispenser/soda name = "Circuit board (Soda Machine)" build_path = /obj/machinery/chem_dispenser/soda - board_type = "machine" - frame_desc = "Requires 2 Matter Bins, 1 Manipulators, 1 Capacitor, 1 Console Screen, and 1 Power Cell." - req_components = list( - /obj/item/stock_parts/matter_bin = 2, - /obj/item/stock_parts/manipulator = 1, - /obj/item/stock_parts/capacitor = 1, - /obj/item/stock_parts/console_screen = 1, - /obj/item/stock_parts/cell = 1) -/obj/item/circuitboard/beer +/obj/item/circuitboard/chem_dispenser/beer name = "Circuit board (Beer Machine)" build_path = /obj/machinery/chem_dispenser/beer - board_type = "machine" - frame_desc = "Requires 2 Matter Bins, 1 Manipulators, 1 Capacitor, 1 Console Screen, and 1 Power Cell." - req_components = list( - /obj/item/stock_parts/matter_bin = 2, - /obj/item/stock_parts/manipulator = 1, - /obj/item/stock_parts/capacitor = 1, - /obj/item/stock_parts/console_screen = 1, - /obj/item/stock_parts/cell = 1) - /obj/item/circuitboard/circuit_imprinter name = "Circuit board (Circuit Imprinter)" diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm index fc60d8f005d..d05ec96133d 100644 --- a/code/game/machinery/cryo.dm +++ b/code/game/machinery/cryo.dm @@ -208,7 +208,7 @@ occupantData["stat"] = occupant.stat occupantData["health"] = occupant.health occupantData["maxHealth"] = occupant.maxHealth - occupantData["minHealth"] = config.health_threshold_dead + occupantData["minHealth"] = HEALTH_THRESHOLD_DEAD occupantData["bruteLoss"] = occupant.getBruteLoss() occupantData["oxyLoss"] = occupant.getOxyLoss() occupantData["toxLoss"] = occupant.getToxLoss() @@ -378,9 +378,9 @@ occupant.Paralyse(max(5/efficiency, (1/occupant.bodytemperature)*3000/efficiency)) if(air_contents.oxygen > 2) if(occupant.getOxyLoss()) - occupant.adjustOxyLoss(-10) + occupant.adjustOxyLoss(-6) else - occupant.adjustOxyLoss(-2) + occupant.adjustOxyLoss(-1.2) if(beaker && next_trans == 0) var/proportion = 10 * min(1/beaker.volume, 1) // Yes, this means you can get more bang for your buck with a beaker of SF vs a patch @@ -388,7 +388,7 @@ beaker.reagents.reaction(occupant, TOUCH, proportion) beaker.reagents.trans_to(occupant, 1, 10) next_trans++ - if(next_trans == 10) + if(next_trans == 17) next_trans = 0 /obj/machinery/atmospherics/unary/cryo_cell/proc/heat_gas_contents() diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index a1bdff99d56..9c39f84ffda 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -769,3 +769,12 @@ target_cryopod.take_occupant(person_to_cryo, 1) return 1 return 0 + +/proc/force_cryo_human(var/mob/living/carbon/person_to_cryo) + if(!istype(person_to_cryo)) + return + if(!istype(person_to_cryo.loc, /obj/machinery/cryopod)) + cryo_ssd(person_to_cryo) + if(istype(person_to_cryo.loc, /obj/machinery/cryopod)) + var/obj/machinery/cryopod/P = person_to_cryo.loc + P.despawn_occupant() diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm index 53fab536afd..a0d6efc5d1f 100644 --- a/code/game/machinery/doors/airlock_types.dm +++ b/code/game/machinery/doors/airlock_types.dm @@ -171,6 +171,7 @@ assemblytype = /obj/structure/door_assembly/door_assembly_plasma /obj/machinery/door/airlock/plasma/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) + ..() if(exposed_temperature > 300) PlasmaBurn(exposed_temperature) @@ -541,7 +542,7 @@ icon = 'icons/obj/doors/airlocks/glass_large/glass_large.dmi' overlays_file = 'icons/obj/doors/airlocks/glass_large/overlays.dmi' note_overlay_file = 'icons/obj/doors/airlocks/glass_large/overlays.dmi' - assemblytype = "obj/structure/door_assembly/multi_tile" + assemblytype = /obj/structure/door_assembly/multi_tile /obj/machinery/door/airlock/multi_tile/narsie_act() return diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm index df20e6fcf37..eb536953b45 100644 --- a/code/game/machinery/doors/brigdoors.dm +++ b/code/game/machinery/doors/brigdoors.dm @@ -31,6 +31,18 @@ maptext_height = 26 maptext_width = 32 maptext_y = -1 + var/occupant = "None" + var/crimes = "None" + var/time = 0 + var/officer = "None" + +/obj/machinery/door_timer/New() + GLOB.celltimers_list += src + return ..() + +/obj/machinery/door_timer/Destroy() + GLOB.celltimers_list -= src + return ..() /obj/machinery/door_timer/proc/print_report() var/logname = input(usr, "Name of the guilty?","[id] log name") @@ -38,6 +50,10 @@ if(!logname || !logcharges) return 0 + occupant = logname + crimes = logcharges + time = timetoset + officer = usr.name for(var/obj/machinery/computer/prisoner/C in GLOB.prisoncomputer_list) var/obj/item/paper/P = new /obj/item/paper(C.loc) @@ -121,6 +137,7 @@ if(timing) if(timeleft() <= 0) Radio.autosay("Timer has expired. Releasing prisoner.", name, "Security", list(z)) + occupant = "None" timer_end() // open doors, reset timer, clear status screen timing = 0 . = PROCESS_KILL @@ -181,7 +198,11 @@ if(stat & (NOPOWER|BROKEN)) return 0 - // Reset releasetime + // Reset vars + occupant = "None" + crimes = "None" + time = 0 + officer = "None" releasetime = 0 printed = 0 if(prisoner) diff --git a/code/game/machinery/doors/spacepod.dm b/code/game/machinery/doors/spacepod.dm index 5aea5b477ed..ae966070f22 100644 --- a/code/game/machinery/doors/spacepod.dm +++ b/code/game/machinery/doors/spacepod.dm @@ -15,8 +15,9 @@ return 0 /obj/structure/spacepoddoor/Destroy() - air_update_turf(1) - return ..() + var/turf/T = get_turf(src) + . = ..() + T.air_update_turf(TRUE) /obj/structure/spacepoddoor/CanPass(atom/movable/A, turf/T) if(istype(A, /obj/spacepod)) diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 1ab22f341b6..21ff909796f 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -205,9 +205,9 @@ qdel(src) /obj/machinery/door/window/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) + ..() if(exposed_temperature > T0C + (reinf ? 1600 : 800)) take_damage(round(exposed_volume / 200), BURN, 0, 0) - ..() /obj/machinery/door/window/attack_ai(mob/user) return attack_hand(user) diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index b949028c713..f1651d5bb99 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -52,6 +52,7 @@ FIRE ALARM playsound(loc, 'sound/effects/sparks4.ogg', 50, 1) /obj/machinery/firealarm/temperature_expose(datum/gas_mixture/air, temperature, volume) + ..() if(!emagged && detecting && temperature > T0C + 200) alarm() // added check of detector status here diff --git a/code/game/machinery/telecomms/ntsl2.dm b/code/game/machinery/telecomms/ntsl2.dm index d24b51389ec..f01f173ebb3 100644 --- a/code/game/machinery/telecomms/ntsl2.dm +++ b/code/game/machinery/telecomms/ntsl2.dm @@ -346,7 +346,8 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new()) setting_language = null else for(var/datum/multilingual_say_piece/S in message_pieces) - S.speaking = GLOB.all_languages[setting_language] + if(S.speaking != GLOB.all_languages["Noise"]) // check if they are emoting, these do not need to be translated + S.speaking = GLOB.all_languages[setting_language] // Regex replacements if(islist(regex) && regex.len > 0) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index fb780e5d550..33a2e2840ac 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -1015,13 +1015,16 @@ icon_deny = "med-deny" product_ads = "Go save some lives!;The best stuff for your medbay.;Only the finest tools.;Natural chemicals!;This stuff saves lives.;Don't you want some?;Ping!" req_access_txt = "5" - products = list(/obj/item/reagent_containers/glass/bottle/charcoal = 4,/obj/item/reagent_containers/glass/bottle/morphine = 4,/obj/item/reagent_containers/glass/bottle/ether = 4,/obj/item/reagent_containers/glass/bottle/epinephrine = 4, - /obj/item/reagent_containers/glass/bottle/toxin = 4,/obj/item/reagent_containers/syringe/antiviral = 6,/obj/item/reagent_containers/syringe/insulin = 4, - /obj/item/reagent_containers/syringe = 12,/obj/item/healthanalyzer = 5,/obj/item/healthupgrade = 5,/obj/item/reagent_containers/glass/beaker = 4, /obj/item/reagent_containers/hypospray/safety = 2, - /obj/item/reagent_containers/dropper = 2,/obj/item/stack/medical/bruise_pack/advanced = 3, /obj/item/stack/medical/ointment/advanced = 3, - /obj/item/stack/medical/bruise_pack = 3,/obj/item/stack/medical/splint = 4, /obj/item/sensor_device = 2, /obj/item/reagent_containers/hypospray/autoinjector = 4, - /obj/item/pinpointer/crew = 2) - contraband = list(/obj/item/reagent_containers/glass/bottle/pancuronium = 1,/obj/item/reagent_containers/glass/bottle/sulfonal = 1) + products = list(/obj/item/reagent_containers/syringe = 12, /obj/item/reagent_containers/food/pill/patch/styptic = 10, /obj/item/reagent_containers/food/pill/patch/silver_sulf = 10, + /obj/item/reagent_containers/glass/bottle/charcoal = 4, /obj/item/reagent_containers/glass/bottle/epinephrine = 4, /obj/item/reagent_containers/glass/bottle/diphenhydramine = 4, + /obj/item/reagent_containers/glass/bottle/salicylic = 4, /obj/item/reagent_containers/glass/bottle/potassium_iodide =3, /obj/item/reagent_containers/glass/bottle/saline = 5, + /obj/item/reagent_containers/glass/bottle/morphine = 4, /obj/item/reagent_containers/glass/bottle/ether = 4, /obj/item/reagent_containers/glass/bottle/atropine = 3, + /obj/item/reagent_containers/glass/bottle/oculine = 2, /obj/item/reagent_containers/glass/bottle/toxin = 4, /obj/item/reagent_containers/syringe/antiviral = 6, + /obj/item/reagent_containers/syringe/insulin = 6, /obj/item/reagent_containers/syringe/calomel = 10, /obj/item/reagent_containers/hypospray/autoinjector = 5, /obj/item/reagent_containers/food/pill/salbutamol = 10, + /obj/item/reagent_containers/food/pill/mannitol = 10, /obj/item/reagent_containers/food/pill/mutadone = 5, /obj/item/stack/medical/bruise_pack/advanced = 4, /obj/item/stack/medical/ointment/advanced = 4, /obj/item/stack/medical/bruise_pack = 4, + /obj/item/stack/medical/splint = 4, /obj/item/reagent_containers/glass/beaker = 4, /obj/item/reagent_containers/dropper = 4, /obj/item/healthanalyzer = 4, + /obj/item/healthupgrade = 4, /obj/item/reagent_containers/hypospray/safety = 2, /obj/item/sensor_device = 2, /obj/item/pinpointer/crew = 2) + contraband = list(/obj/item/reagent_containers/glass/bottle/sulfonal = 1, /obj/item/reagent_containers/glass/bottle/pancuronium = 1) armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0) //This one's from bay12 @@ -1041,7 +1044,7 @@ icon_deny = "wallmed-deny" req_access_txt = "5" density = 0 //It is wall-mounted, and thus, not dense. --Superxpdude - products = list(/obj/item/stack/medical/bruise_pack = 2,/obj/item/stack/medical/ointment = 2,/obj/item/reagent_containers/hypospray/autoinjector = 4,/obj/item/healthanalyzer = 1) + products = list(/obj/item/stack/medical/bruise_pack = 2, /obj/item/stack/medical/ointment = 2, /obj/item/reagent_containers/hypospray/autoinjector = 4, /obj/item/healthanalyzer = 1) contraband = list(/obj/item/reagent_containers/syringe/charcoal = 4,/obj/item/reagent_containers/syringe/antiviral = 4,/obj/item/reagent_containers/food/pill/tox = 1) armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index e8e4ae6027b..6cfd1d63942 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -721,6 +721,7 @@ check_for_internal_damage(list(MECHA_INT_FIRE, MECHA_INT_TEMP_CONTROL, MECHA_INT_CONTROL_LOST, MECHA_INT_SHORT_CIRCUIT), 1) /obj/mecha/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) + ..() if(exposed_temperature > max_temperature) log_message("Exposed to dangerous temperature.", 1) take_damage(5, "fire") diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm index ab38ee3a0d0..5667a45ca85 100644 --- a/code/game/mecha/working/ripley.dm +++ b/code/game/mecha/working/ripley.dm @@ -20,9 +20,9 @@ update_pressure() /obj/mecha/working/ripley/Destroy() - while(damage_absorption.["brute"] < 0.6) + while(damage_absorption["brute"] < 0.6) new /obj/item/asteroid/goliath_hide(loc) - damage_absorption.["brute"] = damage_absorption.["brute"] + 0.1 //If a goliath-plated ripley gets killed, all the plates drop + damage_absorption["brute"] = damage_absorption["brute"] + 0.1 //If a goliath-plated ripley gets killed, all the plates drop for(var/atom/movable/A in cargo) A.forceMove(loc) step_rand(A) @@ -31,28 +31,28 @@ /obj/mecha/working/ripley/go_out() ..() - if(damage_absorption.["brute"] < 0.6 && damage_absorption.["brute"] > 0.3) + if(damage_absorption["brute"] < 0.6 && damage_absorption["brute"] > 0.3) overlays = null overlays += image("icon" = "mecha.dmi", "icon_state" = "ripley-g-open") - else if(damage_absorption.["brute"] == 0.3) + else if(damage_absorption["brute"] == 0.3) overlays = null overlays += image("icon" = "mecha.dmi", "icon_state" = "ripley-g-full-open") /obj/mecha/working/ripley/moved_inside(var/mob/living/carbon/human/H as mob) ..() - if(damage_absorption.["brute"] < 0.6 && damage_absorption.["brute"] > 0.3) + if(damage_absorption["brute"] < 0.6 && damage_absorption["brute"] > 0.3) overlays = null overlays += image("icon" = "mecha.dmi", "icon_state" = "ripley-g") - else if(damage_absorption.["brute"] == 0.3) + else if(damage_absorption["brute"] == 0.3) overlays = null overlays += image("icon" = "mecha.dmi", "icon_state" = "ripley-g-full") /obj/mecha/working/ripley/mmi_moved_inside(var/obj/item/mmi/mmi_as_oc as obj,mob/user as mob) ..() - if(damage_absorption.["brute"] < 0.6 && damage_absorption.["brute"] > 0.3) + if(damage_absorption["brute"] < 0.6 && damage_absorption["brute"] > 0.3) overlays = null overlays += image("icon" = "mecha.dmi", "icon_state" = "ripley-g") - else if(damage_absorption.["brute"] == 0.3) + else if(damage_absorption["brute"] == 0.3) overlays = null overlays += image("icon" = "mecha.dmi", "icon_state" = "ripley-g-full") diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index 53072d7e82c..7cfd8bbec45 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -192,7 +192,7 @@ var/global/list/image/splatter_cache = list() icon = 'icons/effects/blood.dmi' icon_state = "gibbl5" random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6") - noclear = TRUE + no_clear = TRUE var/fleshcolor = "#FFFFFF" /obj/effect/decal/cleanable/blood/gibs/update_icon() @@ -221,18 +221,11 @@ var/global/list/image/splatter_cache = list() /obj/effect/decal/cleanable/blood/gibs/core random_icon_states = list("gibmid1", "gibmid2", "gibmid3") - -/obj/effect/decal/cleanable/blood/gibs/Initialize() - . = ..() - reagents.add_reagent("liquidgibs", 5) + scoop_reagents = list("liquidgibs" = 5) /obj/effect/decal/cleanable/blood/gibs/cleangibs //most ironic name ever... - -/obj/effect/decal/cleanable/blood/gibs/cleangibs/Initialize() //no reagent! - . = ..() - reagents.remove_reagent("liquidgibs",5) - + scoop_reagents = null /obj/effect/decal/cleanable/blood/gibs/proc/streak(var/list/directions) set waitfor = 0 diff --git a/code/game/objects/effects/decals/Cleanable/misc.dm b/code/game/objects/effects/decals/Cleanable/misc.dm index aef1999ff69..7b5f255fcfb 100644 --- a/code/game/objects/effects/decals/Cleanable/misc.dm +++ b/code/game/objects/effects/decals/Cleanable/misc.dm @@ -15,10 +15,7 @@ icon = 'icons/obj/objects.dmi' icon_state = "ash" anchored = TRUE - -/obj/effect/decal/cleanable/ash/Initialize() - . = ..() - reagents.add_reagent("ash", 10) + scoop_reagents = list("ash" = 10) /obj/effect/decal/cleanable/dirt name = "dirt" @@ -40,11 +37,8 @@ /obj/effect/decal/cleanable/dirt/blackpowder name = "black powder" mouse_opacity = TRUE - noscoop = TRUE - -/obj/effect/decal/cleanable/dirt/blackpowder/Initialize() - . = ..() - reagents.add_reagent("blackpowder", 40) // size 2 explosion when activated + no_scoop = TRUE + scoop_reagents = list("blackpowder" = 40) // size 2 explosion when activated /obj/effect/decal/cleanable/flour name = "flour" @@ -90,7 +84,8 @@ icon_state = "cobweb1" burntime = 1 -/obj/effect/decal/cleanable/cobweb/fire_act() +/obj/effect/decal/cleanable/cobweb/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE) + ..() qdel(src) /obj/effect/decal/cleanable/molten_object @@ -126,22 +121,15 @@ icon = 'icons/effects/blood.dmi' icon_state = "vomit_1" random_icon_states = list("vomit_1", "vomit_2", "vomit_3", "vomit_4") - noclear = TRUE - -/obj/effect/decal/cleanable/vomit/Initialize() - . = ..() - reagents.add_reagent("vomit", 5) + no_clear = TRUE + scoop_reagents = list("vomit" = 5) /obj/effect/decal/cleanable/vomit/green name = "green vomit" desc = "It's all gummy. Ew." icon_state = "gvomit_1" random_icon_states = list("gvomit_1", "gvomit_2", "gvomit_3", "gvomit_4") - -/obj/effect/decal/cleanable/vomit/green/Initialize() - . = ..() - reagents.remove_reagent("vomit", 5) - reagents.add_reagent("green_vomit", 5) + scoop_reagents = list("green_vomit" = 5) /obj/effect/decal/cleanable/tomato_smudge name = "tomato smudge" @@ -188,10 +176,7 @@ icon = 'icons/effects/effects.dmi' icon_state = "flour" color = "#D5820B" - -/obj/effect/decal/cleanable/fungus/Initialize() - . = ..() - reagents.add_reagent("fungus", 10) + scoop_reagents = list("fungus" = 10) /obj/effect/decal/cleanable/confetti //PARTY TIME! name = "confetti" diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm index 130a50cac89..461273bccdb 100644 --- a/code/game/objects/effects/decals/cleanable.dm +++ b/code/game/objects/effects/decals/cleanable.dm @@ -1,8 +1,6 @@ /obj/effect/decal/cleanable anchored = TRUE var/list/random_icon_states = list() - var/noscoop = FALSE //if it has this, don't let it be scooped up - var/noclear = FALSE //if it has this, don't delete it when its' scooped up /obj/effect/decal/cleanable/proc/can_bloodcrawl_in() return FALSE @@ -10,7 +8,6 @@ /obj/effect/decal/cleanable/New() if(random_icon_states && length(src.random_icon_states) > 0) src.icon_state = pick(src.random_icon_states) - create_reagents(100) if(smooth) queue_smooth(src) queue_smooth_neighbors(src) @@ -19,38 +16,4 @@ /obj/effect/decal/cleanable/Destroy() if(smooth) queue_smooth_neighbors(src) - return ..() - -/obj/effect/decal/cleanable/attackby(obj/item/W as obj, mob/user as mob,) - if(istype(W, /obj/item/reagent_containers/glass) || istype(W, /obj/item/reagent_containers/food/drinks)) - if(src.reagents && W.reagents && !noscoop) - if(!src.reagents.total_volume) - to_chat(user, "There isn't enough [src] to scoop up!") - return - if(W.reagents.total_volume >= W.reagents.maximum_volume) - to_chat(user, "[W] is full!") - return - to_chat(user, "You scoop the [src] into [W]!") - reagents.trans_to(W, reagents.total_volume) - if(!reagents.total_volume && !noclear) //scooped up all of it - qdel(src) - return - if(is_hot(W)) //todo: make heating a reagent holder proc - if(istype(W, /obj/item/clothing/mask/cigarette)) - return - else - src.reagents.chem_temp += 15 - src.reagents.handle_reactions() - to_chat(user, "You heat [src] with [W]!") - -/obj/effect/decal/cleanable/ex_act() - if(reagents) - for(var/datum/reagent/R in reagents.reagent_list) - R.on_ex_act() - ..() - -/obj/effect/decal/cleanable/fire_act() - if(reagents) - reagents.chem_temp += 30 - reagents.handle_reactions() - ..() + return ..() \ No newline at end of file diff --git a/code/game/objects/effects/decals/misc.dm b/code/game/objects/effects/decals/misc.dm index 52ad55c48a4..64561630d06 100644 --- a/code/game/objects/effects/decals/misc.dm +++ b/code/game/objects/effects/decals/misc.dm @@ -54,3 +54,16 @@ /obj/effect/decal/straw/edge icon_state = "strawscatterededge" + +/obj/effect/decal/ants + name = "space ants" + desc = "A bunch of space ants." + icon = 'icons/goonstation/effects/effects.dmi' + icon_state = "spaceants" + scoop_reagents = list("ants" = 20) + +/obj/effect/decal/ants/Initialize(mapload) + . = ..() + var/scale = (rand(2, 10) / 10) + (rand(0, 5) / 100) + transform = matrix(transform, scale, scale, MATRIX_SCALE) + setDir(pick(NORTH, SOUTH, EAST, WEST)) \ No newline at end of file diff --git a/code/game/objects/effects/effect_system/effects_chem_smoke.dm b/code/game/objects/effects/effect_system/effects_chem_smoke.dm new file mode 100644 index 00000000000..f55a64aac8d --- /dev/null +++ b/code/game/objects/effects/effect_system/effects_chem_smoke.dm @@ -0,0 +1,126 @@ +///////////////////////////////////////////// +// Chem smoke +///////////////////////////////////////////// + +/obj/effect/particle_effect/chem_smoke + icon = 'icons/goonstation/effects/64x64.dmi' + icon_state = "smoke" + density = FALSE + opacity = FALSE + layer = ABOVE_MOB_LAYER + animate_movement = NO_STEPS + var/matrix/first = matrix() + var/matrix/second = matrix() + var/matrix/third = matrix() + var/first_scale = 0.1 + var/second_scale = 5 + var/third_scale = 2 + var/spread_amount = 96 + +/obj/effect/particle_effect/chem_smoke/New(location, chem_color) + ..(location) + color = chem_color + pixel_x += -16 + rand(-3, 3) + pixel_y += -16 + rand(-3, 3) + + first = turn(first, rand(-90, 90)) + first.Scale(first_scale, first_scale) + transform = first + + second = first + second.Scale(second_scale, second_scale) + + third.Scale(third_scale, third_scale) + + animate(src,transform = second, time = 5, alpha = 200) + animate(transform = third, time = 20, pixel_y = rand(-spread_amount, spread_amount), pixel_x = rand(-spread_amount, spread_amount), alpha = 1) + QDEL_IN(src, 26) + + +/obj/effect/particle_effect/chem_smoke/small + first_scale = 0.05 + second_scale = 2.5 + third_scale = 1 + spread_amount = 48 + + +/datum/effect_system/smoke_spread/chem + var/obj/chemholder + var/list/smoked_atoms = list() + +/datum/effect_system/smoke_spread/chem/New() + ..() + chemholder = new + chemholder.create_reagents(1000) + chemholder.reagents.set_reacting(FALSE) // Just in case + +/datum/effect_system/smoke_spread/chem/Destroy() + QDEL_NULL(chemholder) + smoked_atoms.Cut() + return ..() + +/datum/effect_system/smoke_spread/chem/set_up(datum/reagents/carry = null, loca, silent = FALSE) + if(isturf(loca)) + location = loca + else + location = get_turf(loca) + carry.copy_to(chemholder, carry.total_volume) + carry.clear_reagents() + if(!silent) + var/contained = "" + for(var/reagent in carry.reagent_list) + contained += " [reagent] " + if(contained) + contained = "\[[contained]\]" + var/area/A = get_area(location) + + var/where = "[A.name] | [location.x], [location.y]" + var/whereLink = "[where]" + + if(carry && carry.my_atom) + if(carry.my_atom.fingerprintslast) + var/mob/M = get_mob_by_key(carry.my_atom.fingerprintslast) + var/more = "" + if(M) + more = " " + msg_admin_attack("A chemical smoke reaction has taken place in ([whereLink])[contained]. Last associated key is [carry.my_atom.fingerprintslast][more].", ATKLOG_FEW) + log_game("A chemical smoke reaction has taken place in ([where])[contained]. Last associated key is [carry.my_atom.fingerprintslast].") + else + msg_admin_attack("A chemical smoke reaction has taken place in ([whereLink]). No associated key.", ATKLOG_FEW) + log_game("A chemical smoke reaction has taken place in ([where])[contained]. No associated key.") + else + msg_admin_attack("A chemical smoke reaction has taken place in ([whereLink]). No associated key. CODERS: carry.my_atom may be null.", ATKLOG_FEW) + log_game("A chemical smoke reaction has taken place in ([where])[contained]. No associated key. CODERS: carry.my_atom may be null.") + + +/datum/effect_system/smoke_spread/chem/start(effect_range = 2) + set waitfor = FALSE + + var/color = mix_color_from_reagents(chemholder.reagents.reagent_list) + + for(var/x in 0 to 99) + for(var/i = 0, i < rand(2, 6), i++) + if(effect_range < 3) + new /obj/effect/particle_effect/chem_smoke/small(location, color) + else + new /obj/effect/particle_effect/chem_smoke(location, color) + + if(x % 10 == 0) //Once every 10 ticks. + INVOKE_ASYNC(src, .proc/SmokeEm, effect_range) + + sleep(1) + qdel(src) + + +/datum/effect_system/smoke_spread/chem/proc/SmokeEm(effect_range = 2) + for(var/atom/A in view(effect_range, get_turf(location))) + if(istype(A, /obj/effect/particle_effect)) // Don't impact particle effects, as there can be hundreds of them in a small area. Also, we don't want smoke particles adding themselves to this list. Major performance issue. + continue + if(A in smoked_atoms) + continue + smoked_atoms += A + chemholder.reagents.reaction(A) + if(iscarbon(A)) + var/mob/living/carbon/C = A + if(C.can_breathe_gas()) + chemholder.reagents.copy_to(C, chemholder.reagents.total_volume) \ No newline at end of file diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm index e765e59442d..6d746377ec7 100644 --- a/code/game/objects/effects/effect_system/effects_foam.dm +++ b/code/game/objects/effects/effect_system/effects_foam.dm @@ -84,7 +84,10 @@ // foam disolves when heated // except metal foams -/obj/effect/particle_effect/foam/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) +/obj/effect/particle_effect/foam/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE) //Don't heat the reagents inside + return + +/obj/effect/particle_effect/foam/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) // overriden to prevent weird behaviors with heating reagents inside if(!metal && prob(max(0, exposed_temperature - 475))) flick("[icon_state]-disolve", src) @@ -178,8 +181,9 @@ air_update_turf(1) /obj/structure/foamedmetal/Destroy() - air_update_turf(1) - return ..() + var/turf/T = get_turf(src) + . = ..() + T.air_update_turf(TRUE) /obj/structure/foamedmetal/Move() var/turf/T = loc diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm index 1df0166260e..405a0ec46f7 100644 --- a/code/game/objects/effects/effect_system/effects_smoke.dm +++ b/code/game/objects/effects/effect_system/effects_smoke.dm @@ -207,99 +207,4 @@ return 1 /datum/effect_system/smoke_spread/sleeping - effect_type = /obj/effect/particle_effect/smoke/sleeping - -///////////////////////////////////////////// -// Chem smoke -///////////////////////////////////////////// - -/obj/effect/particle_effect/smoke/chem - icon = 'icons/effects/chemsmoke.dmi' - opacity = 0 - lifetime = 10 - -/datum/effect_system/smoke_spread/chem - effect_type = /obj/effect/particle_effect/smoke/chem - var/obj/chemholder - -/datum/effect_system/smoke_spread/chem/New() - ..() - chemholder = new/obj() - var/datum/reagents/R = new/datum/reagents(500) - chemholder.reagents = R - R.my_atom = chemholder - -/datum/effect_system/smoke_spread/chem/Destroy() - QDEL_NULL(chemholder) - return ..() - -/datum/effect_system/smoke_spread/chem/set_up(datum/reagents/carry = null, n = 5, c = 0, loca, direct, silent = 0) - if(n > 20) - n = 20 - number = n - cardinals = c - - if(isturf(loca)) - location = loca - else - location = get_turf(loca) - if(direct) - direction = direct - carry.copy_to(chemholder, carry.total_volume) - if(!silent) - var/contained = "" - for(var/reagent in carry.reagent_list) - contained += " [reagent] " - if(contained) - contained = "\[[contained]\]" - var/area/A = get_area(location) - - var/where = "[A.name] | [location.x], [location.y]" - var/whereLink = "[where]" - - if(carry && carry.my_atom) - if(carry.my_atom.fingerprintslast) - var/mob/M = get_mob_by_key(carry.my_atom.fingerprintslast) - var/more = "" - if(M) - more = " " - msg_admin_attack("A chemical smoke reaction has taken place in ([whereLink])[contained]. Last associated key is [carry.my_atom.fingerprintslast][more].", ATKLOG_FEW) - log_game("A chemical smoke reaction has taken place in ([where])[contained]. Last associated key is [carry.my_atom.fingerprintslast].") - else - msg_admin_attack("A chemical smoke reaction has taken place in ([whereLink]). No associated key.", ATKLOG_FEW) - log_game("A chemical smoke reaction has taken place in ([where])[contained]. No associated key.") - else - msg_admin_attack("A chemical smoke reaction has taken place in ([whereLink]). No associated key. CODERS: carry.my_atom may be null.", ATKLOG_FEW) - log_game("A chemical smoke reaction has taken place in ([where])[contained]. No associated key. CODERS: carry.my_atom may be null.") - -/datum/effect_system/smoke_spread/chem/start(effect_range = 2) - var/color = mix_color_from_reagents(chemholder.reagents.reagent_list) - var/obj/effect/particle_effect/smoke/chem/smokeholder = new effect_type(location) - for(var/atom/A in view(effect_range, smokeholder)) - chemholder.reagents.reaction(A) - if(iscarbon(A)) - var/mob/living/carbon/C = A - if(C.can_breathe_gas()) - chemholder.reagents.copy_to(C, chemholder.reagents.total_volume) - qdel(smokeholder) - for(var/i=0, iThere isn't enough [src] to scoop up!") + return + if(I.reagents.total_volume >= I.reagents.maximum_volume) + to_chat(user, "[I] is full!") + return + to_chat(user, "You scoop [src] into [I]!") + reagents.trans_to(I, reagents.total_volume) + if(!reagents.total_volume && !no_clear) //scooped up all of it + qdel(src) + +/obj/effect/decal/ex_act() + if(reagents) + for(var/datum/reagent/R in reagents.reagent_list) + R.on_ex_act() + ..() \ No newline at end of file diff --git a/code/game/objects/effects/glowshroom.dm b/code/game/objects/effects/glowshroom.dm index 4cf5e79cc77..464d5c277fd 100644 --- a/code/game/objects/effects/glowshroom.dm +++ b/code/game/objects/effects/glowshroom.dm @@ -180,6 +180,7 @@ qdel(src) /obj/structure/glowshroom/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) + ..() if(exposed_temperature > 300) endurance -= 5 CheckEndurance() diff --git a/code/game/objects/effects/snowcloud.dm b/code/game/objects/effects/snowcloud.dm index a67bbd3c5f7..08a64d62f17 100644 --- a/code/game/objects/effects/snowcloud.dm +++ b/code/game/objects/effects/snowcloud.dm @@ -113,7 +113,8 @@ else return ..() -/obj/effect/snow/fire_act() +/obj/effect/snow/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE) + ..() qdel(src) /obj/effect/snow/ex_act(severity) @@ -133,7 +134,8 @@ ..() qdel(src) -/obj/item/snowball/fire_act() +/obj/item/snowball/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE) + ..() qdel(src) /obj/item/snowball/ex_act(severity) diff --git a/code/game/objects/effects/spawners/random_spawners.dm b/code/game/objects/effects/spawners/random_spawners.dm index 18392256fb8..510e5b90380 100644 --- a/code/game/objects/effects/spawners/random_spawners.dm +++ b/code/game/objects/effects/spawners/random_spawners.dm @@ -279,7 +279,7 @@ /obj/item/clothing/glasses/thermal = 1, /obj/item/chameleon = 1, /obj/item/reagent_containers/hypospray/autoinjector/stimulants = 1, - /obj/item/storage/box/syndie_kit/atmosgasgrenades = 1, + /obj/item/storage/box/syndie_kit/atmosn2ogrenades = 1, /obj/item/grenade/plastic/x4 = 1) diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index 7ea087eb8cb..f0233bb0f9e 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -69,6 +69,7 @@ qdel(src) /obj/structure/spider/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) + ..() if(exposed_temperature > 300) health -= 5 healthcheck() diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm index 8b9314e9a6f..880043c8be6 100644 --- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm +++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm @@ -211,3 +211,21 @@ pixel_x = rand(-4,4) pixel_y = rand(-4,4) animate(src, pixel_y = pixel_y + 32, alpha = 0, time = 25) + +/obj/effect/temp_visual/shockwave + name = "shockwave" + icon = 'icons/goonstation/effects/64x64.dmi' + icon_state = "shockwave" + randomdir = FALSE + pixel_y = -16 + pixel_x = -16 + duration = 20 + +/obj/effect/temp_visual/implosion + name = "implosion" + icon = 'icons/goonstation/effects/64x64.dmi' + icon_state = "implosion" + randomdir = FALSE + pixel_y = -16 + pixel_x = -16 + duration = 20 \ No newline at end of file diff --git a/code/game/objects/empulse.dm b/code/game/objects/empulse.dm index 1e026e90e02..cec5b6e1fc8 100644 --- a/code/game/objects/empulse.dm +++ b/code/game/objects/empulse.dm @@ -5,8 +5,8 @@ epicenter = get_turf(epicenter.loc) if(log) - message_admins("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] [cause ? "(Cause: [cause])": ] [ADMIN_COORDJMP(epicenter)]") - log_game("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] [cause ? "(Cause: [cause])" : ] [COORD(epicenter)]") + message_admins("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] [cause ? "(Cause: [cause])": ""] [ADMIN_COORDJMP(epicenter)]") + log_game("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] [cause ? "(Cause: [cause])" : ""] [COORD(epicenter)]") if(heavy_range > 1) new/obj/effect/temp_visual/emp/pulse(epicenter) diff --git a/code/game/objects/explosion.dm b/code/game/objects/explosion.dm index 9c457e43b6a..f21bbb69c02 100644 --- a/code/game/objects/explosion.dm +++ b/code/game/objects/explosion.dm @@ -25,8 +25,8 @@ var/list/cached_exp_block = list() if(adminlog) - message_admins("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in area [epicenter.loc.name] [cause ? "(Cause: [cause])" : ] [ADMIN_COORDJMP(epicenter)] ") - log_game("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in area [epicenter.loc.name] [cause ? "(Cause: [cause])" : ] [COORD(epicenter)] ") + message_admins("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in area [epicenter.loc.name] [cause ? "(Cause: [cause])" : ""] [ADMIN_COORDJMP(epicenter)] ") + log_game("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in area [epicenter.loc.name] [cause ? "(Cause: [cause])" : ""] [COORD(epicenter)] ") // Play sounds; we want sounds to be different depending on distance so we will manually do it ourselves. // Stereo users will also hear the direction of the explosion! diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index cd50f079b0c..4860733f4f7 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -16,6 +16,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d var/inhand_y_dimension = 32 can_be_hit = FALSE + suicidal_hands = TRUE var/r_speed = 1.0 var/health = null @@ -145,16 +146,6 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d /obj/item/blob_act() qdel(src) -//user: The mob that is suiciding -//damagetype: The type of damage the item will inflict on the user -//BRUTELOSS = 1 -//FIRELOSS = 2 -//TOXLOSS = 4 -//OXYLOSS = 8 -//Output a creative message and then return the damagetype done -/obj/item/proc/suicide_act(mob/user) - return - /obj/item/verb/move_to_top() set name = "Move To Top" set category = null @@ -255,11 +246,10 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d else if(isliving(loc)) return 0 - - pickup(user) - add_fingerprint(user) - user.put_in_active_hand(src) + if(pickup(user)) // Pickup succeeded + user.put_in_active_hand(src) + return 1 /obj/item/attack_alien(mob/user as mob) @@ -355,6 +345,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d // called just as an item is picked up (loc is not yet changed) /obj/item/proc/pickup(mob/user) SEND_SIGNAL(src, COMSIG_ITEM_PICKUP, user) + return TRUE // called when this item is removed from a storage item, which is passed on as S. The loc variable is already set to the new destination before this is called. /obj/item/proc/on_exit_storage(obj/item/storage/S as obj) diff --git a/code/game/objects/items/candle.dm b/code/game/objects/items/candle.dm index f4f527c1b7f..85780484264 100644 --- a/code/game/objects/items/candle.dm +++ b/code/game/objects/items/candle.dm @@ -51,7 +51,8 @@ light("[user] tilts [C] and lights [src] with it.") -/obj/item/candle/fire_act() +/obj/item/candle/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE) + ..() if(!lit) light() //honk diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index b4dd66e3be5..926da3d28cb 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -23,7 +23,7 @@ /obj/item/toy/crayon/suicide_act(mob/user) user.visible_message("[user] is jamming the [name] up [user.p_their()] nose and into [user.p_their()] brain. It looks like [user.p_theyre()] trying to commit suicide.") - return (BRUTELOSS|OXYLOSS) + return BRUTELOSS|OXYLOSS /obj/item/toy/crayon/New() ..() diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index c8473f1dfc8..24c8cbcd3b7 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -187,7 +187,7 @@ /obj/item/flashlight/flare/Destroy() processing_objects.Remove(src) - ..() + return ..() /obj/item/flashlight/flare/proc/turn_off() on = 0 diff --git a/code/game/objects/items/devices/handheld_defib.dm b/code/game/objects/items/devices/handheld_defib.dm new file mode 100644 index 00000000000..199aaf43737 --- /dev/null +++ b/code/game/objects/items/devices/handheld_defib.dm @@ -0,0 +1,91 @@ +/obj/item/handheld_defibrillator + name = "handheld defibrillator" + desc = "Used to restart stopped hearts." + icon = 'icons/goonstation/objects/objects.dmi' + lefthand_file = 'icons/goonstation/mob/inhands/items_lefthand.dmi' + righthand_file = 'icons/goonstation/mob/inhands/items_righthand.dmi' + icon_state = "defib-on" + item_state = "defib" + + var/icon_base = "defib" + var/cooldown = FALSE + var/charge_time = 100 + var/emagged = FALSE + +/obj/item/handheld_defibrillator/emag_act(mob/user) + if(!emagged) + emagged = TRUE + desc += " The screen only shows the word KILL flashing over and over." + if(user) + to_chat(user, "you short out the safeties on [src]") + else + emagged = FALSE + desc = "Used to restart stopped hearts." + if(user) + to_chat(user, "You restore the safeties on [src]") + +/obj/item/handheld_defibrillator/emp_act(severity) + if(emagged) + emagged = FALSE + desc = "Used to restart stopped hearts." + visible_message("[src] beeps: Safety protocols enabled!") + playsound(get_turf(src), 'sound/machines/defib_saftyon.ogg', 50, 0) + else + emagged = TRUE + desc += " The screen only shows the word KILL flashing over and over." + visible_message("[src] beeps: Safety protocols disabled!") + playsound(get_turf(src), 'sound/machines/defib_saftyoff.ogg', 50, 0) + +/obj/item/handheld_defibrillator/attack(mob/living/carbon/human/H, mob/user) + if(!istype(H)) + return ..() + + if(cooldown) + to_chat(user, "[src] is still charging!") + return + + if(emagged || (H.health <= HEALTH_THRESHOLD_CRIT) || (H.undergoing_cardiac_arrest())) + user.visible_message("[user] shocks [H] with [src].", "You shock [H] with [src].") + add_attack_logs(user, H, "defibrillated with [src]") + playsound(user.loc, "sound/weapons/Egloves.ogg", 75, 1) + + if(H.stat == DEAD) + to_chat(user, "[H] doesn't respond at all!") + else + H.set_heartattack(FALSE) + var/total_damage = H.getBruteLoss() + H.getFireLoss() + H.getToxLoss() + if(H.health <= HEALTH_THRESHOLD_CRIT) + if(total_damage >= 90) + to_chat(user, "[H] looks horribly injured. Resuscitation alone may not help revive them.") + if(prob(66)) + to_chat(user, "[H] inhales deeply!") + H.adjustOxyLoss(-50) + else + to_chat(user, "[H] doesn't respond!") + + H.AdjustParalysis(3) + H.AdjustStunned(5) + H.AdjustWeakened(5) + H.AdjustStuttering(10) + to_chat(H, "You feel a powerful jolt!") + H.shock_internal_organs(100) + + if(emagged && prob(10)) + to_chat(user, "[src]'s on board scanner indicates that the target is undergoing a cardiac arrest!") + H.set_heartattack(TRUE) + + cooldown = TRUE + icon_state = "[icon_base]-shock" + addtimer(CALLBACK(src, .proc/short_charge), 10) + addtimer(CALLBACK(src, .proc/recharge), charge_time) + + else + to_chat(user, "[src]'s on board medical scanner indicates that no shock is required.") + +/obj/item/handheld_defibrillator/proc/short_charge() + icon_state = "[icon_base]-off" + +/obj/item/handheld_defibrillator/proc/recharge() + cooldown = FALSE + icon_state = "[icon_base]-on" + playsound(loc, "sound/weapons/flash.ogg", 75, 1) \ No newline at end of file diff --git a/code/game/objects/items/devices/instruments.dm b/code/game/objects/items/devices/instruments.dm index 840d5e64395..6d3a1c2b49d 100644 --- a/code/game/objects/items/devices/instruments.dm +++ b/code/game/objects/items/devices/instruments.dm @@ -19,7 +19,7 @@ /obj/item/instrument/suicide_act(mob/user) user.visible_message("[user] begins to play 'Gloomy Sunday'! It looks like [user.p_theyre()] trying to commit suicide!") - return (BRUTELOSS) + return BRUTELOSS /obj/item/instrument/Initialize(mapload) song.tempo = song.sanitize_tempo(song.tempo) // tick_lag isn't set when the map is loaded diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index dd214c7a673..4a20a52fa04 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -125,8 +125,8 @@ REAGENT SCANNER var/mode = 1; -/obj/item/healthanalyzer/attack(mob/living/M as mob, mob/living/user as mob) - if(( (CLUMSY in user.mutations) || user.getBrainLoss() >= 60) && prob(50)) +/obj/item/healthanalyzer/attack(mob/living/M, mob/living/user) + if(((CLUMSY in user.mutations) || user.getBrainLoss() >= 60) && prob(50)) to_chat(user, text("You try to analyze the floor's vitals!")) for(var/mob/O in viewers(M, null)) O.show_message(text("[user] has analyzed the floor's vitals!"), 1) @@ -137,7 +137,7 @@ REAGENT SCANNER return user.visible_message("[user] has analyzed [M]'s vitals."," You have analyzed [M]'s vitals.") - if(!istype(M,/mob/living/carbon/human) || M.isSynthetic()) + if(!ishuman(M) || M.isSynthetic()) //these sensors are designed for organic life user.show_message("Analyzing Results for ERROR:\n\t Overall Status: ERROR") user.show_message("\t Key: Suffocation/Toxin/Burns/Brute", 1) @@ -147,122 +147,132 @@ REAGENT SCANNER user.show_message("Subject's pulse: -- bpm.") return - var/fake_oxy = max(rand(1,40), M.getOxyLoss(), (300 - (M.getToxLoss() + M.getFireLoss() + M.getBruteLoss()))) - var/OX = M.getOxyLoss() > 50 ? "[M.getOxyLoss()]" : M.getOxyLoss() - var/TX = M.getToxLoss() > 50 ? "[M.getToxLoss()]" : M.getToxLoss() - var/BU = M.getFireLoss() > 50 ? "[M.getFireLoss()]" : M.getFireLoss() - var/BR = M.getBruteLoss() > 50 ? "[M.getBruteLoss()]" : M.getBruteLoss() - if(M.status_flags & FAKEDEATH) + var/mob/living/carbon/human/H = M + var/fake_oxy = max(rand(1,40), H.getOxyLoss(), (300 - (H.getToxLoss() + H.getFireLoss() + H.getBruteLoss()))) + var/OX = H.getOxyLoss() > 50 ? "[H.getOxyLoss()]" : H.getOxyLoss() + var/TX = H.getToxLoss() > 50 ? "[H.getToxLoss()]" : H.getToxLoss() + var/BU = H.getFireLoss() > 50 ? "[H.getFireLoss()]" : H.getFireLoss() + var/BR = H.getBruteLoss() > 50 ? "[H.getBruteLoss()]" : H.getBruteLoss() + if(H.status_flags & FAKEDEATH) OX = fake_oxy > 50 ? "[fake_oxy]" : fake_oxy - user.show_message("Analyzing Results for [M]:\n\t Overall Status: dead") + user.show_message("Analyzing Results for [H]:\n\t Overall Status: dead") else - user.show_message("Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "dead" : "[M.health]% healthy"]") + user.show_message("Analyzing Results for [H]:\n\t Overall Status: [H.stat > 1 ? "dead" : "[H.health]% healthy"]") user.show_message("\t Key: Suffocation/Toxin/Burns/Brute", 1) user.show_message("\t Damage Specifics: [OX] - [TX] - [BU] - [BR]") - user.show_message("Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)", 1) - if(M.timeofdeath && (M.stat == DEAD || (M.status_flags & FAKEDEATH))) - user.show_message("Time of Death: [station_time_timestamp("hh:mm:ss", M.timeofdeath)]") - var/tdelta = round(world.time - M.timeofdeath) + user.show_message("Body Temperature: [H.bodytemperature-T0C]°C ([H.bodytemperature*1.8-459.67]°F)", 1) + if(H.timeofdeath && (H.stat == DEAD || (H.status_flags & FAKEDEATH))) + user.show_message("Time of Death: [station_time_timestamp("hh:mm:ss", H.timeofdeath)]") + var/tdelta = round(world.time - H.timeofdeath) if(tdelta < (DEFIB_TIME_LIMIT * 10)) user.show_message("Subject died [DisplayTimeText(tdelta)] ago, defibrillation may be possible!") - if(istype(M, /mob/living/carbon/human) && mode == 1) - var/mob/living/carbon/human/H = M + if(mode == 1) var/list/damaged = H.get_damaged_organs(1,1) user.show_message("Localized Damage, Brute/Burn:",1) if(length(damaged) > 0) for(var/obj/item/organ/external/org in damaged) user.show_message("\t\t[capitalize(org.name)]: [(org.brute_dam > 0) ? "[org.brute_dam]" : "0"]-[(org.burn_dam > 0) ? "[org.burn_dam]" : "0"]") - OX = M.getOxyLoss() > 50 ? "Severe oxygen deprivation detected" : "Subject bloodstream oxygen level normal" - TX = M.getToxLoss() > 50 ? "Dangerous amount of toxins detected" : "Subject bloodstream toxin level minimal" - BU = M.getFireLoss() > 50 ? "Severe burn damage detected" : "Subject burn injury status O.K" - BR = M.getBruteLoss() > 50 ? "Severe anatomical damage detected" : "Subject brute-force injury status O.K" - if(M.status_flags & FAKEDEATH) + OX = H.getOxyLoss() > 50 ? "Severe oxygen deprivation detected" : "Subject bloodstream oxygen level normal" + TX = H.getToxLoss() > 50 ? "Dangerous amount of toxins detected" : "Subject bloodstream toxin level minimal" + BU = H.getFireLoss() > 50 ? "Severe burn damage detected" : "Subject burn injury status O.K" + BR = H.getBruteLoss() > 50 ? "Severe anatomical damage detected" : "Subject brute-force injury status O.K" + if(H.status_flags & FAKEDEATH) OX = fake_oxy > 50 ? "Severe oxygen deprivation detected" : "Subject bloodstream oxygen level normal" user.show_message("[OX] | [TX] | [BU] | [BR]") - if(istype(M, /mob/living/carbon)) - if(upgraded) - chemscan(user, M) - for(var/thing in M.viruses) - var/datum/disease/D = thing - if(!(D.visibility_flags & HIDDEN_SCANNER)) - user.show_message("Warning: [D.form] detected\nName: [D.name].\nType: [D.spread_text].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure_text]") - if(M.getStaminaLoss()) + + if(upgraded) + chemscan(user, H) + for(var/thing in H.viruses) + var/datum/disease/D = thing + if(!(D.visibility_flags & HIDDEN_SCANNER)) + user.show_message("Warning: [D.form] detected\nName: [D.name].\nType: [D.spread_text].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure_text]") + if(H.undergoing_cardiac_arrest()) + var/obj/item/organ/internal/heart/heart = H.get_int_organ(/obj/item/organ/internal/heart) + if(heart && !(heart.status & ORGAN_DEAD)) + user.show_message("Warning: Medical Emergency detected\nName: Cardiac Arrest.\nType: The patient's heart has stopped.\nStage: 1/1.\nPossible Cure: Electric Shock") + else if(heart && (heart.status & ORGAN_DEAD)) + user.show_message("Subject's heart is necrotic.") + else if(!heart) + user.show_message("Subject has no heart.") + + if(H.getStaminaLoss()) user.show_message("Subject appears to be suffering from fatigue.") - if(M.getCloneLoss()) - user.show_message("Subject appears to have [M.getCloneLoss() > 30 ? "severe" : "minor"] cellular damage.") - if(M.has_brain_worms()) + if(H.getCloneLoss()) + user.show_message("Subject appears to have [H.getCloneLoss() > 30 ? "severe" : "minor"] cellular damage.") + if(H.has_brain_worms()) user.show_message("Subject suffering from aberrant brain activity. Recommend further scanning.") - else if(M.getBrainLoss() >= 100 || istype(M, /mob/living/carbon/human) && !M.get_int_organ(/obj/item/organ/internal/brain)) - user.show_message("Subject is brain dead.") - else if(M.getBrainLoss() >= 60) - user.show_message("Severe brain damage detected. Subject likely to have mental retardation.") - else if(M.getBrainLoss() >= 10) - user.show_message("Significant brain damage detected. Subject may have had a concussion.") - if(ishuman(M)) - var/mob/living/carbon/human/H = M - for(var/name in H.bodyparts_by_name) - var/obj/item/organ/external/e = H.bodyparts_by_name[name] - if(!e) - continue - var/limb = e.name - if(e.status & ORGAN_BROKEN) - if((e.limb_name in list("l_arm", "r_arm", "l_hand", "r_hand", "l_leg", "r_leg", "l_foot", "r_foot")) && !(e.status & ORGAN_SPLINTED)) - user.show_message("Unsecured fracture in subject [limb]. Splinting recommended for transport.") - if(e.has_infected_wound()) - user.show_message("Infected wound detected in subject [limb]. Disinfection recommended.") - for(var/name in H.bodyparts_by_name) - var/obj/item/organ/external/e = H.bodyparts_by_name[name] - if(!e) - continue - if(e.status & ORGAN_BROKEN) - user.show_message(text("Bone fractures detected. Advanced scanner required for location."), 1) - break - for(var/obj/item/organ/external/e in H.bodyparts) - if(e.internal_bleeding) - user.show_message(text("Internal bleeding detected. Advanced scanner required for location."), 1) - break - var/blood_id = H.get_blood_id() - if(blood_id) - if(H.bleed_rate) - user.show_message("Subject is bleeding!") - var/blood_percent = round((H.blood_volume / BLOOD_VOLUME_NORMAL)*100) - var/blood_type = H.b_type - if(blood_id != "blood")//special blood substance - var/datum/reagent/R = GLOB.chemical_reagents_list[blood_id] - if(R) - blood_type = R.name - else - blood_type = blood_id - if(H.blood_volume <= BLOOD_VOLUME_SAFE && H.blood_volume > BLOOD_VOLUME_OKAY) - user.show_message("LOW blood level [blood_percent] %, [H.blood_volume] cl, type: [blood_type]") - else if(H.blood_volume <= BLOOD_VOLUME_OKAY) - user.show_message("CRITICAL blood level [blood_percent] %, [H.blood_volume] cl, type: [blood_type]") + if(H.get_int_organ(/obj/item/organ/internal/brain)) + if(H.getBrainLoss() >= 100) + user.show_message("Subject is brain dead.") + else if(H.getBrainLoss() >= 60) + user.show_message("Severe brain damage detected. Subject likely to have mental retardation.") + else if(H.getBrainLoss() >= 10) + user.show_message("Significant brain damage detected. Subject may have had a concussion.") + else + user.show_message("Subject has no brain.") + + for(var/name in H.bodyparts_by_name) + var/obj/item/organ/external/e = H.bodyparts_by_name[name] + if(!e) + continue + var/limb = e.name + if(e.status & ORGAN_BROKEN) + if((e.limb_name in list("l_arm", "r_arm", "l_hand", "r_hand", "l_leg", "r_leg", "l_foot", "r_foot")) && !(e.status & ORGAN_SPLINTED)) + user.show_message("Unsecured fracture in subject [limb]. Splinting recommended for transport.") + if(e.has_infected_wound()) + user.show_message("Infected wound detected in subject [limb]. Disinfection recommended.") + + for(var/name in H.bodyparts_by_name) + var/obj/item/organ/external/e = H.bodyparts_by_name[name] + if(!e) + continue + if(e.status & ORGAN_BROKEN) + user.show_message(text("Bone fractures detected. Advanced scanner required for location."), 1) + break + for(var/obj/item/organ/external/e in H.bodyparts) + if(e.internal_bleeding) + user.show_message(text("Internal bleeding detected. Advanced scanner required for location."), 1) + break + var/blood_id = H.get_blood_id() + if(blood_id) + if(H.bleed_rate) + user.show_message("Subject is bleeding!") + var/blood_percent = round((H.blood_volume / BLOOD_VOLUME_NORMAL)*100) + var/blood_type = H.b_type + if(blood_id != "blood")//special blood substance + var/datum/reagent/R = GLOB.chemical_reagents_list[blood_id] + if(R) + blood_type = R.name else - user.show_message("Blood level [blood_percent] %, [H.blood_volume] cl, type: [blood_type]") - - if(H.undergoing_cardiac_arrest() && H.stat != DEAD) - user.show_message("Subject suffering from heart attack: Apply defibrillator immediately.") - user.show_message("Subject's pulse: [H.get_pulse(GETPULSE_TOOL)] bpm.") - var/implant_detect - for(var/obj/item/organ/internal/cyberimp/CI in H.internal_organs) - if(CI.is_robotic()) - implant_detect += "[H.name] is modified with a [CI.name].
" - if(implant_detect) - user.show_message("Detected cybernetic modifications:") - user.show_message("[implant_detect]") - if(H.gene_stability < 40) - user.show_message("Subject's genes are quickly breaking down!") - else if(H.gene_stability < 70) - user.show_message("Subject's genes are showing signs of spontaneous breakdown.") - else if(H.gene_stability < 85) - user.show_message("Subject's genes are showing minor signs of instability.") + blood_type = blood_id + if(H.blood_volume <= BLOOD_VOLUME_SAFE && H.blood_volume > BLOOD_VOLUME_OKAY) + user.show_message("LOW blood level [blood_percent] %, [H.blood_volume] cl, type: [blood_type]") + else if(H.blood_volume <= BLOOD_VOLUME_OKAY) + user.show_message("CRITICAL blood level [blood_percent] %, [H.blood_volume] cl, type: [blood_type]") else - user.show_message("Subject's genes are stable.") - src.add_fingerprint(user) - return + user.show_message("Blood level [blood_percent] %, [H.blood_volume] cl, type: [blood_type]") + + user.show_message("Subject's pulse: [H.get_pulse(GETPULSE_TOOL)] bpm.") + var/implant_detect + for(var/obj/item/organ/internal/cyberimp/CI in H.internal_organs) + if(CI.is_robotic()) + implant_detect += "[H.name] is modified with a [CI.name].
" + if(implant_detect) + user.show_message("Detected cybernetic modifications:") + user.show_message("[implant_detect]") + if(H.gene_stability < 40) + user.show_message("Subject's genes are quickly breaking down!") + else if(H.gene_stability < 70) + user.show_message("Subject's genes are showing signs of spontaneous breakdown.") + else if(H.gene_stability < 85) + user.show_message("Subject's genes are showing minor signs of instability.") + else + user.show_message("Subject's genes are stable.") + add_fingerprint(user) + /obj/item/healthanalyzer/verb/toggle_mode() set name = "Switch Verbosity" @@ -275,19 +285,21 @@ REAGENT SCANNER if(0) to_chat(usr, "The scanner no longer shows limb damage.") -/obj/item/healthanalyzer/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/healthupgrade)) +/obj/item/healthanalyzer/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/healthupgrade)) if(upgraded) to_chat(user, "You have already installed an upgraded in the [src].") else to_chat(user, "You install the upgrade in the [src].") overlays += "advanced" - playsound(loc, W.usesound, 50, 1) - upgraded = 1 - qdel(W) + playsound(loc, I.usesound, 50, 1) + upgraded = TRUE + qdel(I) + return + return ..() /obj/item/healthanalyzer/advanced - upgraded = 1 + upgraded = TRUE /obj/item/healthanalyzer/advanced/New() overlays += "advanced" @@ -526,6 +538,9 @@ REAGENT SCANNER materials = list(MAT_METAL=30, MAT_GLASS=20) /obj/item/slime_scanner/attack(mob/living/M as mob, mob/living/user as mob) + slime_scan(M, user) + +/proc/slime_scan(mob/living/carbon/slime/M, mob/living/user) if(!isslime(M)) user.show_message("This device can only scan slimes!", 1) return @@ -831,4 +846,4 @@ REAGENT SCANNER if(target.disabilities & NEARSIGHTED) dat += "Retinal misalignment detected.
" - return dat + return dat \ No newline at end of file diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index 4eaf0e79dce..d3d0a2fe6bb 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -47,7 +47,7 @@ update_icon() -/obj/item/taperecorder/fire_act() +/obj/item/taperecorder/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE) mytape.ruin() //Fires destroy the tape return ..() @@ -262,7 +262,8 @@ var/list/timestamp = list() var/ruined = 0 -/obj/item/tape/fire_act() +/obj/item/tape/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE) + ..() ruin() /obj/item/tape/attack_self(mob/user) diff --git a/code/game/objects/items/devices/uplinks.dm b/code/game/objects/items/devices/uplinks.dm index 247b5fb1a0d..e5bbeef7686 100644 --- a/code/game/objects/items/devices/uplinks.dm +++ b/code/game/objects/items/devices/uplinks.dm @@ -23,7 +23,6 @@ var/list/world_uplinks = list() var/used_TC = 0 var/job = null - var/show_descriptions = 0 var/temp_category var/uplink_type = "traitor" @@ -72,7 +71,10 @@ var/list/world_uplinks = list() if(I.job && I.job.len) if(!(I.job.Find(job))) continue - dat += "[I.name] ([I.cost])
" + dat += "[I.name] ([I.cost])" + if(I.hijack_only) + dat += " (HIJACK ONLY)" + dat += "
" category_items++ dat += "Random Item (??)
" @@ -95,7 +97,7 @@ var/list/world_uplinks = list() if(I.job && I.job.len) if(!(I.job.Find(job))) continue - nano[nano.len]["items"] += list(list("Name" = sanitize(I.name), "Description" = sanitize(I.description()),"Cost" = I.cost, "obj_path" = I.reference)) + nano[nano.len]["items"] += list(list("Name" = sanitize(I.name), "Description" = sanitize(I.description()),"Cost" = I.cost, "hijack_only" = I.hijack_only, "obj_path" = I.reference)) reference[I.reference] = I var/datum/nano_item_lists/result = new @@ -231,7 +233,6 @@ var/list/world_uplinks = list() data["welcome"] = welcome data["crystals"] = uses data["menu"] = nanoui_menu - data["descriptions"] = show_descriptions if(!nanoui_items) generate_items(user) data["nano_items"] = nanoui_items @@ -266,12 +267,6 @@ var/list/world_uplinks = list() if(href_list["menu"]) nanoui_menu = text2num(href_list["menu"]) update_nano_data(href_list["id"]) - if(href_list["menu"]) - nanoui_menu = text2num(href_list["menu"]) - update_nano_data(href_list["id"]) - if(href_list["descriptions"]) - show_descriptions = !show_descriptions - update_nano_data() if(href_list["category"]) temp_category = href_list["category"] update_nano_data() diff --git a/code/game/objects/items/documents.dm b/code/game/objects/items/documents.dm index 63fa0250173..eeb3355c50c 100644 --- a/code/game/objects/items/documents.dm +++ b/code/game/objects/items/documents.dm @@ -47,4 +47,4 @@ H.reagents.add_reagent(poison_type, poison_dose) poison_total -= poison_dose add_attack_logs(src, user, "Picked up [src], the trapped syndicate documents") - ..() \ No newline at end of file + return ..() \ No newline at end of file diff --git a/code/game/objects/items/flag.dm b/code/game/objects/items/flag.dm index 4f8abd4ac49..3ba466b7eec 100644 --- a/code/game/objects/items/flag.dm +++ b/code/game/objects/items/flag.dm @@ -21,7 +21,7 @@ user.visible_message("[user] [rolled ? "rolls up" : "unfurls"] [src].", "You [rolled ? "roll up" : "unfurl"] [src].", "You hear fabric rustling.") update_icon() -/obj/item/flag/fire_act(global_overlay = FALSE) +/obj/item/flag/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = FALSE) ..() update_icon() diff --git a/code/game/objects/items/latexballoon.dm b/code/game/objects/items/latexballoon.dm index d7585608ec7..771ccce0f6b 100644 --- a/code/game/objects/items/latexballoon.dm +++ b/code/game/objects/items/latexballoon.dm @@ -50,9 +50,9 @@ burst() /obj/item/latexballon/temperature_expose(datum/gas_mixture/air, temperature, volume) + ..() if(temperature > T0C+100) burst() - return /obj/item/latexballon/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/tank)) diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 615882021b4..c7a27b5650e 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -179,7 +179,8 @@ var/global/list/datum/stack_recipe/adamantine_recipes = list( else return ..() -/obj/item/stack/sheet/mineral/plasma/fire_act() +/obj/item/stack/sheet/mineral/plasma/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE) + ..() atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, amount*10) qdel(src) diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index b4405a9fbe5..19864e0ba18 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -231,7 +231,7 @@ /obj/item/toy/katana/suicide_act(mob/user) var/dmsg = pick("[user] tries to stab \the [src] into [user.p_their()] abdomen, but it shatters! [user.p_they(TRUE)] look[user.p_s()] as if [user.p_they()] might die from the shame.","[user] tries to stab \the [src] into [user.p_their()] abdomen, but \the [src] bends and breaks in half! [user.p_they(TRUE)] look[user.p_s()] as if [user.p_they()] might die from the shame.","[user] tries to slice [user.p_their()] own throat, but the plastic blade has no sharpness, causing [user.p_them()] to lose [user.p_their()] balance, slip over, and break [user.p_their()] neck with a loud snap!") user.visible_message("[dmsg] It looks like [user.p_theyre()] trying to commit suicide.") - return (BRUTELOSS) + return BRUTELOSS /* @@ -275,7 +275,8 @@ playsound(src, 'sound/effects/snap.ogg', 50, 1) qdel(src) -/obj/item/toy/snappop/fire_act() +/obj/item/toy/snappop/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE) + ..() pop_burst() /obj/item/toy/snappop/throw_impact(atom/hit_atom) @@ -1186,7 +1187,7 @@ obj/item/toy/cards/deck/syndicate/black if(!cooldown) //for the sanity of everyone var/message = pick("You won't get away this time, Griffin!", "Stop right there, criminal!", "Hoot! Hoot!", "I am the night!") to_chat(user, "You pull the string on the [src].") - playsound(user, 'sound/misc/hoot.ogg', 25, 1) + playsound(user, 'sound/creatures/hoot.ogg', 25, 1) visible_message("[bicon(src)] [message]") cooldown = 1 spawn(30) cooldown = 0 @@ -1205,7 +1206,7 @@ obj/item/toy/cards/deck/syndicate/black if(!cooldown) //for the sanity of everyone var/message = pick("You can't stop me, Owl!", "My plan is flawless! The vault is mine!", "Caaaawwww!", "You will never catch me!") to_chat(user, "You pull the string on the [src].") - playsound(user, 'sound/misc/caw.ogg', 25, 1) + playsound(user, 'sound/creatures/caw.ogg', 25, 1) visible_message("[bicon(src)] [message]") cooldown = 1 spawn(30) cooldown = 0 @@ -1371,54 +1372,84 @@ obj/item/toy/cards/deck/syndicate/black force = 5 origin_tech = "combat=1" attack_verb = list("struck", "hit", "bashed") - var/bullet_position = 1 + var/bullets_left = 0 + var/max_shots = 6 /obj/item/toy/russian_revolver/suicide_act(mob/user) user.visible_message("[user] quickly loads six bullets into [src]'s cylinder and points it at [user.p_their()] head before pulling the trigger! It looks like [user.p_theyre()] trying to commit suicide.") playsound(loc, 'sound/weapons/gunshots/gunshot_strong.ogg', 50, 1) - return (BRUTELOSS) + return BRUTELOSS /obj/item/toy/russian_revolver/New() - spin_cylinder() ..() - + spin_cylinder() /obj/item/toy/russian_revolver/attack_self(mob/user) - if(!bullet_position) - user.visible_message("[user] loads a bullet into [src]'s cylinder.") - bullet_position = 1 - else + if(!bullets_left) + user.visible_message("[user] loads a bullet into [src]'s cylinder before spinning it.") spin_cylinder() - user.visible_message("[user] spins the cylinder on [src]!") - -/obj/item/toy/russian_revolver/attack(mob/living/carbon/human/M, mob/living/carbon/human/user) - if(M != user) //can't use this on other people - return ..() - if(!bullet_position) - to_chat(user, "[src] is empty.") - return - if(!(user.has_organ("head"))) //For sanity - to_chat(user, "Playing this game without a head would be classed as cheating.") - return - user.visible_message("[user] points [src] at [user.p_their()] head, ready to pull the trigger!") - if(do_after(user, 30, target = user)) - if(bullet_position > 1) - user.visible_message("*click*") - playsound(src, 'sound/weapons/empty.ogg', 100, 1) - bullet_position-- - return - else - bullet_position = null - playsound(src, 'sound/weapons/gunshots/gunshot_strong.ogg', 50, 1) - user.visible_message("[src] goes off!") - user.apply_damage(200, BRUTE, "head", sharp = 1, used_weapon = "Self-inflicted gunshot wound to the head.") - user.death() else - user.visible_message("[user] lowers [src] from [user.p_their()] head.") + user.visible_message("[user] spins the cylinder on [src]!") + spin_cylinder() + +/obj/item/toy/russian_revolver/attack(mob/M, mob/living/user) + return + +/obj/item/toy/russian_revolver/afterattack(atom/target, mob/user, flag, params) + if(flag) + if(target in user.contents) + return + if(!ismob(target)) + return + shoot_gun(user) /obj/item/toy/russian_revolver/proc/spin_cylinder() - bullet_position = rand(1,6) + bullets_left = rand(1, max_shots) +/obj/item/toy/russian_revolver/proc/post_shot(mob/user) + return + +/obj/item/toy/russian_revolver/proc/shoot_gun(mob/living/carbon/human/user) + if(bullets_left > 1) + bullets_left-- + user.visible_message("*click*") + playsound(src, 'sound/weapons/empty.ogg', 100, 1) + return FALSE + if(bullets_left == 1) + bullets_left = 0 + var/zone = "head" + if(!(user.has_organ(zone))) // If they somehow don't have a head. + zone = "chest" + playsound(src, 'sound/weapons/gunshots/gunshot_strong.ogg', 50, 1) + user.visible_message("[src] goes off!") + post_shot(user) + user.apply_damage(300, BRUTE, zone, sharp = TRUE, used_weapon = "Self-inflicted gunshot wound to the [zone].") + user.bleed(BLOOD_VOLUME_NORMAL) + user.death() // Just in case + return TRUE + else + to_chat(user, "[src] needs to be reloaded.") + return FALSE + +/obj/item/toy/russian_revolver/trick_revolver + name = "\improper .357 revolver" + desc = "A suspicious revolver. Uses .357 ammo." + icon_state = "revolver" + max_shots = 1 + var/fake_bullets = 0 + +/obj/item/toy/russian_revolver/trick_revolver/New() + ..() + fake_bullets = rand(2, 7) + +/obj/item/toy/russian_revolver/trick_revolver/examine(mob/user) //Sneaky sneaky + ..() + to_chat(user, "Has [fake_bullets] round\s remaining.") + to_chat(user, "[fake_bullets] of those are live rounds.") + +/obj/item/toy/russian_revolver/trick_revolver/post_shot(user) + to_chat(user, "[src] did look pretty dodgey!") + SEND_SOUND(user, 'sound/misc/sadtrombone.ogg') //HONK /* * Rubber Chainsaw */ @@ -1689,5 +1720,5 @@ obj/item/toy/cards/deck/syndicate/black /obj/item/restraints/handcuffs/toy desc = "Toy handcuffs. Plastic and extremely cheaply made." throwforce = 0 - breakouttime = 0 + breakouttime = 0 ignoresClumsy = TRUE \ No newline at end of file diff --git a/code/game/objects/items/weapons/cigs.dm b/code/game/objects/items/weapons/cigs.dm index bfe91b5a81b..1378b5c004d 100644 --- a/code/game/objects/items/weapons/cigs.dm +++ b/code/game/objects/items/weapons/cigs.dm @@ -61,7 +61,8 @@ LIGHTERS ARE IN LIGHTERS.DM return ..() -/obj/item/clothing/mask/cigarette/fire_act() +/obj/item/clothing/mask/cigarette/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE) + ..() light() /obj/item/clothing/mask/cigarette/attackby(obj/item/W as obj, mob/user as mob, params) diff --git a/code/game/objects/items/weapons/courtroom.dm b/code/game/objects/items/weapons/courtroom.dm index d25b6f54d29..72bb3fceb11 100644 --- a/code/game/objects/items/weapons/courtroom.dm +++ b/code/game/objects/items/weapons/courtroom.dm @@ -16,7 +16,7 @@ /obj/item/gavelhammer/suicide_act(mob/user) user.visible_message("[user] has sentenced [user.p_them()]self to death with the [src.name]! It looks like [user.p_theyre()] trying to commit suicide.") playsound(loc, 'sound/items/gavel.ogg', 50, 1, -1) - return (BRUTELOSS) + return BRUTELOSS /obj/item/gavelblock name = "gavel block" diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm index 84a400887b0..ea70e29ef83 100644 --- a/code/game/objects/items/weapons/defib.dm +++ b/code/game/objects/items/weapons/defib.dm @@ -41,6 +41,10 @@ update_overlays() update_charge() +/obj/item/defibrillator/examine(mob/user) + ..(user) + to_chat(user,"Ctrl-click to remove the paddles from the defibrillator.") + /obj/item/defibrillator/proc/update_power() if(bcell) if(bcell.charge < paddles.revivecost) @@ -279,7 +283,7 @@ user.visible_message("[user] is putting the live paddles on [user.p_their()] chest! It looks like [user.p_theyre()] trying to commit suicide.") defib.deductcharge(revivecost) playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1) - return (OXYLOSS) + return OXYLOSS /obj/item/twohanded/shockpaddles/dropped(mob/user as mob) if(user) @@ -309,7 +313,7 @@ /obj/item/twohanded/shockpaddles/attack(mob/M, mob/user) var/tobehealed - var/threshold = -config.health_threshold_dead + var/threshold = -HEALTH_THRESHOLD_DEAD var/mob/living/carbon/human/H = M if(busy) @@ -468,7 +472,7 @@ /obj/item/borg_defib/attack(mob/M, mob/user) var/tobehealed - var/threshold = -config.health_threshold_dead + var/threshold = -HEALTH_THRESHOLD_DEAD var/mob/living/carbon/human/H = M if(busy) diff --git a/code/game/objects/items/weapons/dice.dm b/code/game/objects/items/weapons/dice.dm index d93ebcf3214..666c14801d8 100644 --- a/code/game/objects/items/weapons/dice.dm +++ b/code/game/objects/items/weapons/dice.dm @@ -3,6 +3,7 @@ desc = "Contains all the luck you'll ever need." icon = 'icons/obj/dice.dmi' icon_state = "dicebag" + can_hold = list(/obj/item/dice) /obj/item/storage/pill_bottle/dice/New() ..() diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm index be490d29065..d17287b01a6 100644 --- a/code/game/objects/items/weapons/explosives.dm +++ b/code/game/objects/items/weapons/explosives.dm @@ -116,6 +116,7 @@ sleep(10) prime() user.gib() + return OBLITERATION /obj/item/grenade/plastic/update_icon() if(nadeassembly) diff --git a/code/game/objects/items/weapons/garrote.dm b/code/game/objects/items/weapons/garrote.dm index 03125313656..dd65df1ea3f 100644 --- a/code/game/objects/items/weapons/garrote.dm +++ b/code/game/objects/items/weapons/garrote.dm @@ -168,4 +168,4 @@ /obj/item/twohanded/garrote/suicide_act(mob/user) user.visible_message("[user] is wrapping the [src] around [user.p_their()] neck and pulling the handles! It looks like [user.p_theyre()] trying to commit suicide.") playsound(src.loc, 'sound/weapons/cablecuff.ogg', 15, 1, -1) - return (OXYLOSS) + return OXYLOSS diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index 76d5dbda890..7da978a35d1 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -235,7 +235,7 @@ nadeassembly.process_movement() /obj/item/grenade/chem_grenade/pickup() - ..() + . = ..() if(nadeassembly) nadeassembly.process_movement() diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm index 2e7bacd4426..5ae889ceaab 100644 --- a/code/game/objects/items/weapons/grenades/flashbang.dm +++ b/code/game/objects/items/weapons/grenades/flashbang.dm @@ -6,6 +6,7 @@ light_power = 10 light_color = LIGHT_COLOR_WHITE var/light_time = 2 + var/range = 7 /obj/item/grenade/flashbang/prime() update_mob() @@ -15,60 +16,65 @@ set_light(7) - for(var/mob/living/M in hearers(7, flashbang_turf)) - bang(get_turf(M), M) + do_sparks(rand(5, 9), FALSE, src) + playsound(flashbang_turf, 'sound/effects/bang.ogg', 25, 1) + bang(flashbang_turf, range, src) - for(var/obj/structure/blob/B in hear(8,flashbang_turf)) //Blob damage here - var/damage = round(30/(get_dist(B,get_turf(src))+1)) + for(var/obj/structure/blob/B in hear(8, flashbang_turf)) //Blob damage here + var/damage = round(30 / (get_dist(B, get_turf(src)) + 1)) B.health -= damage B.update_icon() spawn(light_time) qdel(src) -/obj/item/grenade/flashbang/proc/bang(var/turf/T , var/mob/living/M) - M.show_message("BANG", 2) - playsound(loc, 'sound/effects/bang.ogg', 25, 1) +/proc/bang(turf/T, atom/A, range = 7, flash = TRUE, bang = TRUE) + for(var/mob/living/M in hearers(range, T)) + if(M.stat == DEAD) + continue + M.show_message("BANG", 2) -//Checking for protections - var/ear_safety = M.check_ear_prot() - var/distance = max(1,get_dist(src,T)) + //Checking for protections + var/ear_safety = M.check_ear_prot() + var/distance = max(1, get_dist(get_turf(A), get_turf(M))) -//Flash - if(M.weakeyes) - M.visible_message("[M] screams and collapses!") - to_chat(M, "AAAAGH!") - M.Weaken(15) //hella stunned - M.Stun(15) - if(ishuman(M)) - M.emote("scream") - var/mob/living/carbon/human/H = M - var/obj/item/organ/internal/eyes/E = H.get_int_organ(/obj/item/organ/internal/eyes) - if(E) - E.receive_damage(8, 1) + //Flash + if(flash) + if(M.weakeyes) + M.visible_message("[M] screams and collapses!") + to_chat(M, "AAAAGH!") + M.Weaken(15) //hella stunned + M.Stun(15) + if(ishuman(M)) + M.emote("scream") + var/mob/living/carbon/human/H = M + var/obj/item/organ/internal/eyes/E = H.get_int_organ(/obj/item/organ/internal/eyes) + if(E) + E.receive_damage(8, 1) - if(M.flash_eyes(affect_silicon = 1)) - M.Stun(max(10/distance, 3)) - M.Weaken(max(10/distance, 3)) + if(M.flash_eyes(affect_silicon = TRUE)) + M.Stun(max(10 / distance, 3)) + M.Weaken(max(10 / distance, 3)) -//Bang - if(get_turf(M) == get_turf(src))//Holding on person or being exactly where lies is significantly more dangerous and voids protection - M.Stun(10) - M.Weaken(10) - if(!ear_safety) - M.Stun(max(10/distance, 3)) - M.Weaken(max(10/distance, 3)) - M.AdjustEarDamage(rand(0, 5), 15) - if(iscarbon(M)) - var/mob/living/carbon/C = M - var/obj/item/organ/internal/ears/ears = C.get_int_organ(/obj/item/organ/internal/ears) - if(istype(ears)) - if(ears.ear_damage >= 15) - to_chat(M, "Your ears start to ring badly!") - if(prob(ears.ear_damage - 5)) - to_chat(M, "You can't hear anything!") - M.BecomeDeaf() - else - if(ears.ear_damage >= 5) - to_chat(M, "Your ears start to ring!") + //Bang + if(bang) + if(!distance || A.loc == M || A.loc == M.loc) //Holding on person or being exactly where lies is significantly more dangerous and voids protection + M.Stun(10) + M.Weaken(10) + if(!ear_safety) + M.Stun(max(10 / distance, 3)) + M.Weaken(max(10 / distance, 3)) + M.AdjustEarDamage(rand(0, 5), 15) + if(iscarbon(M)) + var/mob/living/carbon/C = M + var/obj/item/organ/internal/ears/ears = C.get_int_organ(/obj/item/organ/internal/ears) + if(istype(ears)) + if(ears.ear_damage >= 15) + to_chat(M, "Your ears start to ring badly!") + if(prob(ears.ear_damage - 5)) + to_chat(M, "You can't hear anything!") + M.BecomeDeaf() + else + if(ears.ear_damage >= 5) + to_chat(M, "Your ears start to ring!") \ No newline at end of file diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index 7c26e5c405e..6fa0c875333 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -26,11 +26,15 @@ if((CLUMSY in user.mutations) && prob(50) && (!ignoresClumsy)) to_chat(user, "Uh... how do those things work?!") - apply_cuffs(user,user) - + apply_cuffs(user, user) + return + + cuff(C, user) + +/obj/item/restraints/handcuffs/proc/cuff(mob/living/carbon/C, mob/user, remove_src = TRUE) if(ishuman(C)) var/mob/living/carbon/human/H = C - if(!H.has_left_hand() || !H.has_right_hand()) + if(!(H.has_left_hand() || H.has_right_hand())) to_chat(user, "How do you suggest handcuffing someone with no hands?") return @@ -40,26 +44,31 @@ playsound(loc, cuffsound, 30, 1, -2) if(do_mob(user, C, 30)) - apply_cuffs(C,user) + apply_cuffs(C, user, remove_src) to_chat(user, "You handcuff [C].") if(istype(src, /obj/item/restraints/handcuffs/cable)) - feedback_add_details("handcuffs","C") + feedback_add_details("handcuffs", "C") else - feedback_add_details("handcuffs","H") + feedback_add_details("handcuffs", "H") add_attack_logs(user, C, "Handcuffed ([src])") else to_chat(user, "You fail to handcuff [C].") -/obj/item/restraints/handcuffs/proc/apply_cuffs(mob/living/carbon/target, mob/user) +/obj/item/restraints/handcuffs/proc/apply_cuffs(mob/living/carbon/target, mob/user, remove_src = TRUE) if(!target.handcuffed) - user.drop_item() + if(remove_src) + user.drop_item() if(trashtype) target.handcuffed = new trashtype(target) - qdel(src) + if(remove_src) + qdel(src) else - loc = target - target.handcuffed = src + if(remove_src) + loc = target + target.handcuffed = src + else + target.handcuffed = new type(loc) target.update_handcuffed() return @@ -170,23 +179,7 @@ /obj/item/restraints/handcuffs/cable/zipties/cyborg/attack(mob/living/carbon/C, mob/user) if(isrobot(user)) - if(ishuman(C)) - var/mob/living/carbon/human/H = C - if(!(H.get_organ("l_hand") || H.get_organ("r_hand"))) - to_chat(user, "How do you suggest handcuffing someone with no hands?") - return - if(!C.handcuffed) - playsound(loc, 'sound/weapons/cablecuff.ogg', 30, 1, -2) - C.visible_message("[user] is trying to put zipties on [C]!", \ - "[user] is trying to put zipties on [C]!") - if(do_mob(user, C, 30)) - if(!C.handcuffed) - C.handcuffed = new /obj/item/restraints/handcuffs/cable/zipties/used(C) - C.update_handcuffed() - to_chat(user, "You handcuff [C].") - add_attack_logs(user, C, "Handcuffed (ziptie-cuffed)") - else - to_chat(user, "You fail to handcuff [C].") + cuff(C, user, FALSE) /obj/item/restraints/handcuffs/cable/zipties/used desc = "A pair of broken zipties." diff --git a/code/game/objects/items/weapons/holy_weapons.dm b/code/game/objects/items/weapons/holy_weapons.dm index 73ff4e5064d..9e471583d3b 100644 --- a/code/game/objects/items/weapons/holy_weapons.dm +++ b/code/game/objects/items/weapons/holy_weapons.dm @@ -15,7 +15,7 @@ /obj/item/nullrod/suicide_act(mob/user) user.visible_message("[user] is killing [user.p_them()]self with \the [src.name]! It looks like [user.p_theyre()] trying to get closer to god!") - return (BRUTELOSS|FIRELOSS) + return BRUTELOSS|FIRELOSS /obj/item/nullrod/attack(mob/M, mob/living/carbon/user) ..() diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm index a0810a0b96c..982959dd8f9 100644 --- a/code/game/objects/items/weapons/kitchen.dm +++ b/code/game/objects/items/weapons/kitchen.dm @@ -121,7 +121,7 @@ user.visible_message(pick("[user] is slitting [user.p_their()] wrists with the [src.name]! It looks like [user.p_theyre()] trying to commit suicide.", \ "[user] is slitting [user.p_their()] throat with the [src.name]! It looks like [user.p_theyre()] trying to commit suicide.", \ "[user] is slitting [user.p_their()] stomach open with the [name]! It looks like [user.p_theyre()] trying to commit seppuku.")) - return (BRUTELOSS) + return BRUTELOSS /obj/item/kitchen/knife/plastic name = "plastic knife" diff --git a/code/game/objects/items/weapons/legcuffs.dm b/code/game/objects/items/weapons/legcuffs.dm index 3391687f20a..297966525f0 100644 --- a/code/game/objects/items/weapons/legcuffs.dm +++ b/code/game/objects/items/weapons/legcuffs.dm @@ -35,7 +35,7 @@ /obj/item/restraints/legcuffs/beartrap/suicide_act(mob/user) user.visible_message("[user] is sticking [user.p_their()] head in the [name]! It looks like [user.p_theyre()] trying to commit suicide.") playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1) - return (BRUTELOSS) + return BRUTELOSS /obj/item/restraints/legcuffs/beartrap/attack_self(mob/user) ..() diff --git a/code/game/objects/items/weapons/lighters.dm b/code/game/objects/items/weapons/lighters.dm index 0b348510b8e..a2d8b03da84 100644 --- a/code/game/objects/items/weapons/lighters.dm +++ b/code/game/objects/items/weapons/lighters.dm @@ -166,7 +166,8 @@ location.hotspot_expose(700, 5) return -/obj/item/match/fire_act() +/obj/item/match/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE) + ..() matchignite() /obj/item/match/proc/matchignite() diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm index 8ad283a77da..0d85245d58f 100644 --- a/code/game/objects/items/weapons/melee/energy.dm +++ b/code/game/objects/items/weapons/melee/energy.dm @@ -16,7 +16,7 @@ /obj/item/melee/energy/suicide_act(mob/user) user.visible_message(pick("[user] is slitting [user.p_their()] stomach open with the [name]! It looks like [user.p_theyre()] trying to commit seppuku.", \ "[user] is falling on the [name]! It looks like [user.p_theyre()] trying to commit suicide.")) - return (BRUTELOSS|FIRELOSS) + return BRUTELOSS|FIRELOSS /obj/item/melee/energy/attack_self(mob/living/carbon/user) if(user.disabilities & CLUMSY && prob(50)) @@ -81,7 +81,7 @@ /obj/item/melee/energy/axe/suicide_act(mob/user) user.visible_message("[user] swings the [name] towards [user.p_their()] head! It looks like [user.p_theyre()] trying to commit suicide.") - return (BRUTELOSS|FIRELOSS) + return BRUTELOSS|FIRELOSS /obj/item/melee/energy/sword name = "energy sword" diff --git a/code/game/objects/items/weapons/melee/misc.dm b/code/game/objects/items/weapons/melee/misc.dm index a19df11e790..381f19dc4cf 100644 --- a/code/game/objects/items/weapons/melee/misc.dm +++ b/code/game/objects/items/weapons/melee/misc.dm @@ -17,8 +17,8 @@ /obj/item/melee/chainofcommand/suicide_act(mob/user) - to_chat(viewers(user), "[user] is strangling [user.p_them()]self with the [src.name]! It looks like [user.p_theyre()] trying to commit suicide.") - return (OXYLOSS) + to_chat(viewers(user), "[user] is strangling [user.p_them()]self with the [src.name]! It looks like [user.p_theyre()] trying to commit suicide.") + return OXYLOSS /obj/item/melee/rapier name = "captain's rapier" diff --git a/code/game/objects/items/weapons/shards.dm b/code/game/objects/items/weapons/shards.dm index 88de9de1b11..428bfcd8fab 100644 --- a/code/game/objects/items/weapons/shards.dm +++ b/code/game/objects/items/weapons/shards.dm @@ -18,7 +18,7 @@ /obj/item/shard/suicide_act(mob/user) to_chat(viewers(user), pick("[user] is slitting [user.p_their()] wrists with [src]! It looks like [user.p_theyre()] trying to commit suicide.", "[user] is slitting [user.p_their()] throat with [src]! It looks like [user.p_theyre()] trying to commit suicide.")) - return (BRUTELOSS) + return BRUTELOSS /obj/item/shard/New() ..() diff --git a/code/game/objects/items/weapons/storage/artistic_toolbox.dm b/code/game/objects/items/weapons/storage/artistic_toolbox.dm index 4293c0a6167..0d8613cce4a 100644 --- a/code/game/objects/items/weapons/storage/artistic_toolbox.dm +++ b/code/game/objects/items/weapons/storage/artistic_toolbox.dm @@ -176,10 +176,6 @@ affected_mob.SetSleeping(0) affected_mob.SetSlowed(0) affected_mob.SetConfused(0) - if(ishuman(affected_mob)) - var/mob/living/carbon/human/H = affected_mob - if(H.traumatic_shock < 100) - H.shock_stage = 0 stage = 1 switch(progenitor.hunger) if(10 to 60) diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index 2d06c0fde80..8df4b17251d 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -367,7 +367,6 @@ new /obj/item/FixOVein(src) new /obj/item/clothing/suit/straight_jacket(src) new /obj/item/clothing/mask/muzzle(src) - new /obj/item/mmi/syndie(src) /obj/item/storage/backpack/duffel/syndie/surgery_fake //for maint spawns name = "surgery duffelbag" diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index 2fd7d774113..03cf28b25ed 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -42,7 +42,7 @@ /obj/item/storage/bag/trash/suicide_act(mob/user) user.visible_message("[user] puts the [name] over [user.p_their()] head and starts chomping at the insides! Disgusting!") playsound(loc, 'sound/items/eatfood.ogg', 50, 1, -1) - return (TOXLOSS) + return TOXLOSS /obj/item/storage/bag/trash/update_icon() if(contents.len == 0) diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index c52d4db7e5b..abf68deb765 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -112,6 +112,7 @@ icon_state = "medicalbelt" item_state = "medical" use_item_overlays = 1 + max_w_class = WEIGHT_CLASS_NORMAL can_hold = list( /obj/item/healthanalyzer, /obj/item/dnainjector, @@ -133,6 +134,7 @@ /obj/item/rad_laser, /obj/item/sensor_device, /obj/item/wrench/medical, + /obj/item/handheld_defibrillator ) /obj/item/storage/belt/medical/surgery diff --git a/code/game/objects/items/weapons/storage/bible.dm b/code/game/objects/items/weapons/storage/bible.dm index 16ecd7cc72c..dfa1bf97358 100644 --- a/code/game/objects/items/weapons/storage/bible.dm +++ b/code/game/objects/items/weapons/storage/bible.dm @@ -9,9 +9,10 @@ var/mob/affecting = null var/deity_name = "Christ" - suicide_act(mob/user) - to_chat(viewers(user), "[user] stares into [src.name] and attempts to trascend understanding of the universe!") - return (user.dust()) +/obj/item/storage/bible/suicide_act(mob/user) + to_chat(viewers(user), "[user] stares into [src.name] and attempts to transcend understanding of the universe!") + user.dust() + return OBLITERATION /obj/item/storage/bible/booze diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index 5a5d1c5ba63..afe4bc1ce13 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -773,6 +773,20 @@ new /obj/item/storage/pill_bottle( src ) new /obj/item/storage/pill_bottle( src ) +/obj/item/storage/box/patch_packs + name = "box of patch packs" + desc = "It has pictures of patch packs on its front." + +/obj/item/storage/box/patch_packs/New() + ..() + new /obj/item/storage/pill_bottle/patch_pack(src) + new /obj/item/storage/pill_bottle/patch_pack(src) + new /obj/item/storage/pill_bottle/patch_pack(src) + new /obj/item/storage/pill_bottle/patch_pack(src) + new /obj/item/storage/pill_bottle/patch_pack(src) + new /obj/item/storage/pill_bottle/patch_pack(src) + new /obj/item/storage/pill_bottle/patch_pack(src) + /obj/item/storage/box/bodybags name = "body bags" desc = "This box contains body bags." diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index 66f7e9b9492..5e81c320041 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -234,6 +234,7 @@ /* * Pill Bottles */ + /obj/item/storage/pill_bottle name = "pill bottle" desc = "It's an airtight container for storing medication." @@ -241,18 +242,38 @@ icon = 'icons/obj/chemical.dmi' item_state = "contsolid" w_class = WEIGHT_CLASS_SMALL - can_hold = list(/obj/item/reagent_containers/food/pill, /obj/item/dice, /obj/item/paper) - allow_quick_gather = 1 - use_to_pickup = 1 - storage_slots = 14 - display_contents_with_number = 1 + can_hold = list(/obj/item/reagent_containers/food/pill) + cant_hold = list(/obj/item/reagent_containers/food/pill/patch) + allow_quick_gather = TRUE + use_to_pickup = TRUE + storage_slots = 50 + max_combined_w_class = 50 + display_contents_with_number = TRUE var/base_name = "" var/label_text = "" + var/applying_meds = FALSE //To Prevent spam clicking and generating runtimes from apply a deleting pill multiple times. + var/rapid_intake_message = "unscrews the cap on the pill bottle and begins dumping the entire contents down their throat!" + var/rapid_post_instake_message = "downs the entire bottle of pills in one go!" /obj/item/storage/pill_bottle/New() ..() base_name = name +/obj/item/storage/pill_bottle/attack(mob/M, mob/user) + if(iscarbon(M) && contents.len) + if(applying_meds) + to_chat(user, "You are already applying meds.") + return + applying_meds = TRUE + for(var/obj/item/reagent_containers/food/pill/P in contents) + if(P.attack(M, user)) + applying_meds = FALSE + else + applying_meds = FALSE + break + else + return ..() + /obj/item/storage/pill_bottle/ert/New() ..() new /obj/item/reagent_containers/food/pill/salicylic(src) @@ -262,27 +283,21 @@ new /obj/item/reagent_containers/food/pill/charcoal(src) new /obj/item/reagent_containers/food/pill/charcoal(src) -/obj/item/storage/pill_bottle/MouseDrop(obj/over_object as obj) //Quick pillbottle fix. -Agouri - if(ishuman(usr)) //Can monkeys even place items in the pocket slots? Leaving this in just in case~ - var/mob/M = usr - if(!( istype(over_object, /obj/screen) )) - return ..() - if((!( M.restrained() ) && !( M.stat ) /*&& M.pocket == src*/)) - switch(over_object.name) - if("r_hand") - M.unEquip(src) - M.put_in_r_hand(src) - if("l_hand") - M.unEquip(src) - M.put_in_l_hand(src) - src.add_fingerprint(usr) - return - if(over_object == usr && in_range(src, usr) || usr.contents.Find(src)) - if(usr.s_active) - usr.s_active.close(usr) - src.show_to(usr) - return - return +/obj/item/storage/pill_bottle/MouseDrop(obj/over_object as obj) // Best utilized if you're a cantankerous doctor with a Vicodin habit. + if(iscarbon(over_object)) + var/mob/living/carbon/C = over_object + if(loc == C && src == C.get_active_hand()) + if(!contents.len) + to_chat(C, "There is nothing in [src]!") + return + C.visible_message("[C] [rapid_intake_message]") + if(do_mob(C, C, 100)) // 10 seconds + for(var/obj/item/reagent_containers/food/pill/P in contents) + P.attack(C, C) + C.visible_message("[C] [rapid_post_instake_message]") + return + + return ..() /obj/item/storage/pill_bottle/attackby(var/obj/item/I, mob/user as mob, params) if(istype(I, /obj/item/pen) || istype(I, /obj/item/flashlight/pen)) @@ -294,7 +309,7 @@ label_text = tmp_label update_name_label() else - ..() + return ..() /obj/item/storage/pill_bottle/proc/update_name_label() if(label_text == "") @@ -302,6 +317,14 @@ else name = "[base_name] ([label_text])" +/obj/item/storage/pill_bottle/patch_pack + name = "Patch Pack" + icon_state = "patch_pack" + can_hold = list(/obj/item/reagent_containers/food/pill/patch) + cant_hold = list() + rapid_intake_message = "flips the lid of the Patch Pack open and begins rapidly stamping patches on themselves!" + rapid_post_instake_message = "stamps the entire contents of the Patch Pack all over their entire body!" + /obj/item/storage/pill_bottle/charcoal name = "Pill bottle (Charcoal)" desc = "Contains pills used to counter toxins." diff --git a/code/game/objects/items/weapons/storage/lockbox.dm b/code/game/objects/items/weapons/storage/lockbox.dm index c080715a035..9cd4178aaf2 100644 --- a/code/game/objects/items/weapons/storage/lockbox.dm +++ b/code/game/objects/items/weapons/storage/lockbox.dm @@ -24,6 +24,8 @@ if(locked) icon_state = icon_locked to_chat(user, "You lock \the [src]!") + if(user.s_active) + user.s_active.close(user) return else icon_state = icon_closed @@ -131,5 +133,5 @@ /obj/item/storage/lockbox/t4/New() ..() - for(var/i = 0, i < 3, i++) + for(var/i in 0 to 2) new /obj/item/grenade/plastic/x4/thermite(src) \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index cac42bfced7..c96271d6ddd 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -262,13 +262,24 @@ new /obj/item/spellbook/oneuse/mime/greaterwall(src) new /obj/item/spellbook/oneuse/mime/fingergun(src) -/obj/item/storage/box/syndie_kit/atmosgasgrenades - name = "Atmos Grenades" -/obj/item/storage/box/syndie_kit/atmosgasgrenades/New() +/obj/item/storage/box/syndie_kit/atmosn2ogrenades + name = "Atmos N2O Grenades" + +/obj/item/storage/box/syndie_kit/atmosn2ogrenades/New() + ..() + new /obj/item/grenade/clusterbuster/n2o(src) + new /obj/item/grenade/clusterbuster/n2o(src) + + +/obj/item/storage/box/syndie_kit/atmosfiregrenades + name = "Plasma Fire Grenades" + +/obj/item/storage/box/syndie_kit/atmosfiregrenades/New() ..() new /obj/item/grenade/clusterbuster/plasma(src) - new /obj/item/grenade/clusterbuster/n2o(src) + new /obj/item/grenade/clusterbuster/plasma(src) + /obj/item/storage/box/syndie_kit/missionary_set name = "Missionary Starter Kit" diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index f33fc7240d2..b7356a7757b 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -18,7 +18,7 @@ /obj/item/melee/baton/suicide_act(mob/user) user.visible_message("[user] is putting the live [name] in [user.p_their()] mouth! It looks like [user.p_theyre()] trying to commit suicide.") - return (FIRELOSS) + return FIRELOSS /obj/item/melee/baton/New() ..() diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index e90a7bb4b6d..98f97b66f53 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -32,7 +32,7 @@ /obj/item/wrench/suicide_act(mob/user) user.visible_message("[user] is beating [user.p_them()]self to death with [src]! It looks like [user.p_theyre()] trying to commit suicide!") playsound(loc, 'sound/weapons/genhit.ogg', 50, 1, -1) - return (BRUTELOSS) + return BRUTELOSS /obj/item/wrench/cyborg name = "automatic wrench" @@ -76,7 +76,7 @@ /obj/item/wrench/power/suicide_act(mob/user) user.visible_message("[user] is pressing [src] against [user.p_their()] head! It looks like [user.p_theyre()] trying to commit suicide!") - return (BRUTELOSS) + return BRUTELOSS /obj/item/wrench/medical name = "medical wrench" @@ -113,7 +113,7 @@ return user.dust() - return OXYLOSS + return OBLITERATION //Screwdriver /obj/item/screwdriver @@ -143,7 +143,7 @@ /obj/item/screwdriver/suicide_act(mob/user) user.visible_message("[user] is stabbing [src] into [user.p_their()] [pick("temple", "heart")]! It looks like [user.p_theyre()] trying to commit suicide!") - return(BRUTELOSS) + return BRUTELOSS /obj/item/screwdriver/New(loc, var/param_color = null) ..() @@ -199,7 +199,7 @@ /obj/item/screwdriver/power/suicide_act(mob/user) user.visible_message("[user] is putting [src] to [user.p_their()] temple. It looks like [user.p_theyre()] trying to commit suicide!") - return(BRUTELOSS) + return BRUTELOSS /obj/item/screwdriver/power/attack_self(mob/user) playsound(get_turf(user), 'sound/items/change_drill.ogg', 50, 1) @@ -256,7 +256,7 @@ /obj/item/wirecutters/suicide_act(mob/user) user.visible_message("[user] is cutting at [user.p_their()] arteries with [src]! It looks like [user.p_theyre()] trying to commit suicide!") playsound(loc, usesound, 50, 1, -1) - return (BRUTELOSS) + return BRUTELOSS /obj/item/wirecutters/brass name = "brass wirecutters" @@ -299,7 +299,7 @@ if(head) head.droplimb(0, DROPLIMB_BLUNT, FALSE, TRUE) playsound(loc,pick('sound/misc/desceration-01.ogg','sound/misc/desceration-02.ogg','sound/misc/desceration-01.ogg') ,50, 1, -1) - return (BRUTELOSS) + return BRUTELOSS /obj/item/wirecutters/power/attack_self(mob/user) playsound(get_turf(user), 'sound/items/change_jaws.ogg', 50, 1) @@ -349,7 +349,7 @@ /obj/item/weldingtool/suicide_act(mob/user) user.visible_message("[user] welds [user.p_their()] every orifice closed! It looks like [user.p_theyre()] trying to commit suicide!") - return (FIRELOSS) + return FIRELOSS /obj/item/weldingtool/proc/update_torch() overlays.Cut() @@ -469,7 +469,6 @@ /obj/item/weldingtool/afterattack(atom/O, mob/user, proximity) if(!proximity) return - if(welding) remove_fuel(1) var/turf/location = get_turf(user) @@ -739,7 +738,7 @@ obj/item/weldingtool/experimental/process() /obj/item/crowbar/power/suicide_act(mob/user) user.visible_message("[user] is putting [user.p_their()] head in [src]. It looks like [user.p_theyre()] trying to commit suicide!") playsound(loc, 'sound/items/jaws_pry.ogg', 50, 1, -1) - return (BRUTELOSS) + return BRUTELOSS /obj/item/crowbar/power/attack_self(mob/user) playsound(get_turf(user), 'sound/items/change_jaws.ogg', 50, 1) diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index 5241c054358..29f2c2dd488 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -797,9 +797,10 @@ /obj/item/twohanded/pitchfork/suicide_act(mob/user) user.visible_message("[user] impales \himself in \his abdomen with [src]! It looks like \he's trying to commit suicide...") - return (BRUTELOSS) + return BRUTELOSS /obj/item/twohanded/pitchfork/demonic/pickup(mob/user) + . = ..() if(istype(user, /mob/living)) var/mob/living/U = user if(U.mind && !U.mind.devilinfo && (U.mind.soulOwner == U.mind)) //Burn hands unless they are a devil or have sold their soul diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index cd295befb83..b759139dba6 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -12,8 +12,8 @@ /obj/item/banhammer/suicide_act(mob/user) - to_chat(viewers(user), "[user] is hitting [user.p_them()]self with the [src.name]! It looks like [user.p_theyre()] trying to ban [user.p_them()]self from life.") - return (BRUTELOSS|FIRELOSS|TOXLOSS|OXYLOSS) + to_chat(viewers(user), "[user] is hitting [user.p_them()]self with the [src.name]! It looks like [user.p_theyre()] trying to ban [user.p_them()]self from life.") + return BRUTELOSS|FIRELOSS|TOXLOSS|OXYLOSS /obj/item/sord name = "\improper SORD" @@ -49,7 +49,7 @@ /obj/item/claymore/suicide_act(mob/user) user.visible_message("[user] is falling on the [name]! It looks like [user.p_theyre()] trying to commit suicide.") - return(BRUTELOSS) + return BRUTELOSS /obj/item/claymore/ceremonial name = "ceremonial claymore" @@ -76,7 +76,7 @@ /obj/item/katana/suicide_act(mob/user) user.visible_message("[user] is slitting [user.p_their()] stomach open with [src]! It looks like [user.p_theyre()] trying to commit seppuku.") - return(BRUTELOSS) + return BRUTELOSS /obj/item/harpoon name = "harpoon" diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index 3ab8de69f7f..246fc5df75d 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -93,7 +93,7 @@ /obj/move_crushed(atom/movable/pusher, force = MOVE_FORCE_DEFAULT, direction) collision_damage(pusher, force, direction) return TRUE - + /obj/proc/collision_damage(atom/movable/pusher, force = MOVE_FORCE_DEFAULT, direction) var/amt = max(0, ((force - (move_resist * MOVE_FORCE_CRUSH_RATIO)) / (move_resist * MOVE_FORCE_CRUSH_RATIO)) * 10) take_damage(amt, BRUTE) @@ -163,14 +163,15 @@ //// FIRE -/obj/fire_act(global_overlay=1) +/obj/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE) + ..() if(!burn_state) burn_state = ON_FIRE SSfires.processing[src] = src burn_world_time = world.time + burntime*rand(10,20) if(global_overlay) overlays += fire_overlay - return 1 + return TRUE /obj/proc/burn() empty_object_contents(1, loc) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index d9358c3a694..6506a5fdf2e 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -29,6 +29,7 @@ var/on_blueprints = FALSE //Are we visible on the station blueprints at roundstart? var/force_blueprints = FALSE //forces the obj to be on the blueprints, regardless of when it was created. + var/suicidal_hands = FALSE // Does it requires you to hold it to commit suicide with it? /obj/New() ..() @@ -76,6 +77,19 @@ processing_objects.Remove(src) return 0 +//user: The mob that is suiciding +//damagetype: The type of damage the item will inflict on the user +//BRUTELOSS = 1 +//FIRELOSS = 2 +//TOXLOSS = 4 +//OXYLOSS = 8 +//SHAME = 16 +//OBLITERATION = 32 + +//Output a creative message and then return the damagetype done +/obj/proc/suicide_act(mob/user) + return FALSE + /obj/assume_air(datum/gas_mixture/giver) if(loc) return loc.assume_air(giver) diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm index 1738344ae60..90e32882087 100644 --- a/code/game/objects/structures/aliens.dm +++ b/code/game/objects/structures/aliens.dm @@ -56,8 +56,9 @@ ..() /obj/structure/alien/resin/Destroy() - air_update_turf(1) - return ..() + var/turf/T = get_turf(src) + . = ..() + T.air_update_turf(TRUE) /obj/structure/alien/resin/Move() var/turf/T = loc @@ -157,6 +158,7 @@ new /obj/structure/alien/weeds(T, linked_node) /obj/structure/alien/weeds/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) + ..() if(exposed_temperature > 300) take_damage(5, BURN, 0, 0) @@ -294,6 +296,7 @@ Burst(kill = TRUE) /obj/structure/alien/egg/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) + ..() if(exposed_temperature > 500) take_damage(5, BURN, 0, 0) diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index 61113a4864a..8c4f40a7b62 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -245,7 +245,7 @@ LINEN BINS else icon_state = "linenbin-full" -/obj/structure/bedsheetbin/fire_act() +/obj/structure/bedsheetbin/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE) if(!amount) return ..() diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 5be8c938f3e..03b0172c959 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -278,9 +278,11 @@ if(src == user.loc) to_chat(user, "You can not [welded?"unweld":"weld"] the locker from inside.") return - if(!WT.remove_fuel(0,user)) + if(!WT.remove_fuel(0, user)) to_chat(user, "You need more welding fuel to complete this task.") return + if(!do_after_once(user, 15, target = src)) + return welded = !welded update_icon() for(var/mob/M in viewers(src)) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm index 551a8b30d9d..a25b8d03c00 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -13,6 +13,9 @@ ..() new /obj/item/storage/box/autoinjectors(src) new /obj/item/storage/box/syringes(src) + new /obj/item/storage/box/pillbottles(src) + new /obj/item/storage/box/patch_packs(src) + new /obj/item/storage/box/iv_bags(src) new /obj/item/reagent_containers/dropper(src) new /obj/item/reagent_containers/dropper(src) new /obj/item/reagent_containers/glass/beaker(src) @@ -67,6 +70,7 @@ new /obj/item/radio/headset/headset_med(src) new /obj/item/clothing/gloves/color/latex/nitrile(src) new /obj/item/defibrillator/loaded(src) + new /obj/item/handheld_defibrillator(src) new /obj/item/storage/belt/medical(src) new /obj/item/clothing/glasses/hud/health(src) new /obj/item/clothing/shoes/sandal/white(src) @@ -181,6 +185,7 @@ new /obj/item/radio/headset/heads/cmo(src) new /obj/item/clothing/gloves/color/latex/nitrile(src) new /obj/item/defibrillator/compact/loaded(src) + new /obj/item/handheld_defibrillator(src) new /obj/item/storage/belt/medical(src) new /obj/item/flash(src) new /obj/item/reagent_containers/hypospray/CMO(src) @@ -216,6 +221,8 @@ ..() new /obj/item/storage/box/pillbottles(src) new /obj/item/storage/box/pillbottles(src) + new /obj/item/storage/box/patch_packs(src) + new /obj/item/storage/box/patch_packs(src) /obj/structure/closet/secure_closet/medical_wall diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index 6851cd3cfc5..9b777d45b58 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -249,6 +249,7 @@ qdel(src) /obj/structure/falsewall/plasma/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) + ..() if(exposed_temperature > 300) burnbabyburn() diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index b46324a838c..b3468668f5a 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -48,6 +48,7 @@ qdel(src) /obj/structure/girder/temperature_expose(datum/gas_mixture/air, exposed_temperature) + ..() var/temp_check = exposed_temperature if(temp_check >= GIRDER_MELTING_TEMP) take_damage(10) diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 8d3e178fe58..c06e5d82244 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -261,10 +261,10 @@ return 0 /obj/structure/grille/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) + ..() if(!broken) if(exposed_temperature > T0C + 1500) take_damage(1, BURN, 0, 0) - ..() /obj/structure/grille/hitby(atom/movable/AM) if(istype(AM, /obj)) diff --git a/code/game/objects/structures/holosign.dm b/code/game/objects/structures/holosign.dm index 0b730a539b9..e5c0fc85722 100644 --- a/code/game/objects/structures/holosign.dm +++ b/code/game/objects/structures/holosign.dm @@ -82,8 +82,8 @@ /obj/structure/holosign/barrier/atmos/Destroy() var/turf/T = get_turf(src) + . = ..() T.air_update_turf(TRUE) - return ..() /obj/structure/holosign/barrier/cyborg name = "Energy Field" diff --git a/code/game/objects/structures/inflatable.dm b/code/game/objects/structures/inflatable.dm index 4ea0fc34e2d..f4efa5452b0 100644 --- a/code/game/objects/structures/inflatable.dm +++ b/code/game/objects/structures/inflatable.dm @@ -22,16 +22,18 @@ icon = 'icons/obj/inflatable.dmi' icon_state = "wall" - + var/torn = /obj/item/inflatable/torn + var/intact = /obj/item/inflatable var/health = 50.0 /obj/structure/inflatable/Initialize(location) ..() - air_update_turf(1) + air_update_turf(TRUE) /obj/structure/inflatable/Destroy() - air_update_turf(1) - return ..() + var/turf/T = get_turf(src) + . = ..() + T.air_update_turf(TRUE) /obj/structure/inflatable/CanPass(atom/movable/mover, turf/target, height=0) return 0 @@ -122,13 +124,13 @@ playsound(loc, 'sound/machines/hiss.ogg', 75, 1) if(violent) visible_message("[src] rapidly deflates!") - var/obj/item/inflatable/torn/R = new /obj/item/inflatable/torn(loc) + var/obj/item/inflatable/torn/R = new torn(loc) src.transfer_fingerprints_to(R) qdel(src) else visible_message("[src] slowly deflates.") spawn(50) - var/obj/item/inflatable/R = new /obj/item/inflatable(loc) + var/obj/item/inflatable/R = new intact(loc) src.transfer_fingerprints_to(R) qdel(src) @@ -164,6 +166,8 @@ icon = 'icons/obj/inflatable.dmi' icon_state = "door_closed" + torn = /obj/item/inflatable/door/torn + intact = /obj/item/inflatable/door var/state = 0 //closed, 1 == open var/isSwitchingStates = 0 @@ -238,21 +242,6 @@ else icon_state = "door_closed" -/obj/structure/inflatable/door/deflate(var/violent=0) - playsound(loc, 'sound/machines/hiss.ogg', 75, 1) - if(violent) - visible_message("[src] rapidly deflates!") - var/obj/item/inflatable/door/torn/R = new /obj/item/inflatable/door/torn(loc) - src.transfer_fingerprints_to(R) - qdel(src) - else - visible_message("[src] slowly deflates.") - spawn(50) - var/obj/item/inflatable/door/R = new /obj/item/inflatable/door(loc) - src.transfer_fingerprints_to(R) - qdel(src) - air_update_turf(1) - /obj/item/inflatable/torn name = "torn inflatable wall" desc = "A folded membrane which rapidly expands into a large cubical shape on activation. It is too torn to be usable." diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index e0e9ba1b6a7..5e6e72929fe 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -229,6 +229,7 @@ return ..() /obj/structure/mineral_door/transparent/plasma/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) + ..() if(exposed_temperature > 300) TemperatureAct(exposed_temperature) diff --git a/code/game/objects/structures/plasticflaps.dm b/code/game/objects/structures/plasticflaps.dm index 19b6dc02617..91e2d552859 100644 --- a/code/game/objects/structures/plasticflaps.dm +++ b/code/game/objects/structures/plasticflaps.dm @@ -125,12 +125,13 @@ desc = "Heavy duty, airtight, plastic flaps." /obj/structure/plasticflaps/mining/Initialize() - air_update_turf(1) + air_update_turf(TRUE) ..() /obj/structure/plasticflaps/mining/Destroy() - air_update_turf(1) - return ..() + var/turf/T = get_turf(src) + . = ..() + T.air_update_turf(TRUE) /obj/structure/plasticflaps/mining/CanAtmosPass(turf/T) - return 0 + return FALSE diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm index c6e3ab2e5bd..7925036d70f 100644 --- a/code/game/objects/structures/safe.dm +++ b/code/game/objects/structures/safe.dm @@ -26,7 +26,6 @@ GLOBAL_LIST_EMPTY(safes) var/dial = 0 //where is the dial pointing? var/space = 0 //the combined w_class of everything in the safe var/maxspace = 24 //the maximum combined w_class of stuff in the safe - var/combo_to_open //so admins know the code var/obj/item/thermal_drill/drill = null var/drill_timer var/time_to_drill @@ -39,25 +38,11 @@ GLOBAL_LIST_EMPTY(safes) /obj/structure/safe/New() GLOB.safes += src - tumbler_2_pos = rand(0, 99) // first value in the combination set first - tumbler_2_open = rand(0, 99) - - tumbler_1_pos = rand(0, 99) - do - tumbler_1_open = rand(0, 99) - while(tumbler_1_open > Wrap(tumbler_2_open +48, 0, 100) && tumbler_1_open < Wrap(tumbler_2_open + 53, 0, 100)) // prevents a combination that wont open - do - open_pos = rand(0,99) - while(open_pos > Wrap(tumbler_1_open - 2, 0, 100) && open_pos < Wrap(tumbler_1_open + 2, 0, 100)) // prevents a combination that wont open - var/num1 = tumbler_2_open + 54 - if(num1 > 99) - num1 = num1 - 100 - var/num2 = tumbler_1_open + 98 - if(num2 > 99) - num2 = num2 - 100 - - combo_to_open = "[num1] - [num2]" - + tumbler_1_pos = rand(0, 71) + tumbler_1_open = rand(0, 71) + + tumbler_2_pos = rand(0, 71) // first value in the combination set first + tumbler_2_open = rand(0, 71) /obj/structure/safe/Initialize() ..() @@ -326,7 +311,7 @@ GLOBAL_LIST_EMPTY(safes) /obj/structure/safe/examine(mob/user) ..() if(open) - to_chat(user, "On the inside of the the door is [combo_to_open]") + to_chat(user, "On the inside of the the door is [tumbler_1_open] - [tumbler_2_open]") //FLOOR SAFES /obj/structure/safe/floor @@ -364,6 +349,6 @@ GLOBAL_LIST_EMPTY(safes) for(var/safe in GLOB.safes) var/obj/structure/safe/S = safe if(owner in S.knownby) - info += "
The combination for the safe located in the [get_area(S).name] is: [S.combo_to_open]
" + info += "
The combination for the safe located in the [get_area(S).name] is: [S.tumbler_1_open] - [S.tumbler_2_open]]
" info_links = info - update_icon() \ No newline at end of file + update_icon() diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm index 090327d1c7f..6f531f5c14c 100644 --- a/code/game/objects/structures/statues.dm +++ b/code/game/objects/structures/statues.dm @@ -169,6 +169,7 @@ icon_state = "xeno" /obj/structure/statue/plasma/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) + ..() if(exposed_temperature > 300) PlasmaBurn(exposed_temperature) @@ -255,18 +256,18 @@ /obj/structure/statue/diamond hardness = 10 material_drop_type = /obj/item/stack/sheet/mineral/diamond - desc = "This is a very expensive diamond statue" + desc = "This is a very expensive diamond statue." /obj/structure/statue/diamond/captain - name = "statue of THE captain." + name = "statue of THE captain" icon_state = "cap" /obj/structure/statue/diamond/ai1 - name = "statue of the AI hologram." + name = "statue of the AI hologram" icon_state = "ai1" /obj/structure/statue/diamond/ai2 - name = "statue of the AI core." + name = "statue of the AI core" icon_state = "ai2" /obj/structure/statue/bananium @@ -359,7 +360,8 @@ else return ..() -/obj/structure/snowman/built/fire_act() +/obj/structure/snowman/built/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE) + ..() qdel(src) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index cf87454a97c..ad655a39b64 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -461,9 +461,9 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f overlays += crack_overlay /obj/structure/window/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) + ..() if(exposed_temperature > (T0C + heat_resistance)) take_damage(round(exposed_volume / 100), BURN, 0, 0) - ..() /obj/structure/window/GetExplosionBlock() return reinf && fulltile ? real_explosion_block : 0 diff --git a/code/game/sound.dm b/code/game/sound.dm index 9e0a28493bd..3846e2edeaa 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -5,6 +5,9 @@ var/turf/turf_source = get_turf(source) + if(!turf_source) + return + //allocate a channel if necessary now so its the same for everyone channel = channel || open_sound_channel() @@ -18,13 +21,17 @@ var/mob/M = P if(!M || !M.client) continue + + var/turf/T = get_turf(M) // These checks need to be changed if z-levels are ever further refactored + if(!T) + continue + if(T.z != turf_source.z) + continue + var/distance = get_dist(M, turf_source) if(distance <= maxdistance) - var/turf/T = get_turf(M) - - if(T && T.z == turf_source.z) - M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff, channel, pressure_affected, S) + M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff, channel, pressure_affected, S) /mob/proc/playsound_local(turf/turf_source, soundin, vol as num, vary, frequency, falloff, channel = 0, pressure_affected = TRUE, sound/S) if(!client || !can_hear()) @@ -153,4 +160,4 @@ soundin = pick('sound/effects/bone_break_1.ogg', 'sound/effects/bone_break_2.ogg', 'sound/effects/bone_break_3.ogg', 'sound/effects/bone_break_4.ogg', 'sound/effects/bone_break_5.ogg', 'sound/effects/bone_break_6.ogg') if("honkbot_e") soundin = pick('sound/items/bikehorn.ogg', 'sound/items/AirHorn2.ogg', 'sound/misc/sadtrombone.ogg', 'sound/items/AirHorn.ogg', 'sound/items/WEEOO1.ogg', 'sound/voice/biamthelaw.ogg', 'sound/voice/bcreep.ogg','sound/magic/Fireball.ogg' ,'sound/effects/pray.ogg', 'sound/voice/hiss1.ogg','sound/machines/buzz-sigh.ogg', 'sound/machines/ping.ogg', 'sound/weapons/flashbang.ogg', 'sound/weapons/bladeslice.ogg') - return soundin + return soundin \ No newline at end of file diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index d26a24b39a2..6b3dc1e93ff 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -79,6 +79,9 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3"," src.hotspot_expose(1000,CELL_VOLUME) return +/turf/simulated/floor/burn_down() + ex_act(2) + /turf/simulated/floor/is_shielded() for(var/obj/structure/A in contents) if(A.level == 3) diff --git a/code/game/turfs/simulated/floor/mineral.dm b/code/game/turfs/simulated/floor/mineral.dm index 38f1bdc14a1..d201a38d697 100644 --- a/code/game/turfs/simulated/floor/mineral.dm +++ b/code/game/turfs/simulated/floor/mineral.dm @@ -33,6 +33,7 @@ icons = list("plasma","plasma_dam") /turf/simulated/floor/mineral/plasma/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) + ..() if(exposed_temperature > 300) PlasmaBurn() diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 4c855ac1f15..6fddc40dfa9 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -201,6 +201,11 @@ for(var/i=0, i 300) PlasmaBurn(exposed_temperature) @@ -246,6 +247,9 @@ /turf/simulated/wall/mineral/titanium/nodecon/thermitemelt(mob/user as mob, speed) return +/turf/simulated/wall/mineral/titanium/nodecon/burn_down() + return + /////////////////////Plastitanium walls///////////////////// /turf/simulated/wall/mineral/plastitanium diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 7eb81c589e1..677357cf170 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -282,6 +282,9 @@ /turf/proc/Bless() flags |= NOJAUNT +/turf/proc/burn_down() + return + ///////////////////////////////////////////////////////////////////////// // Navigation procs // Used for A-star pathfinding diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm index a35047bb9ad..9325d3a08b5 100644 --- a/code/game/verbs/ooc.dm +++ b/code/game/verbs/ooc.dm @@ -4,25 +4,21 @@ var/global/mentor_ooc_colour = "#0099cc" var/global/moderator_ooc_colour = "#184880" var/global/admin_ooc_colour = "#b82e00" -/client/verb/ooc(msg as text) +//Checks if the client already has a text input open +/client/proc/checkTyping() + return (prefs.toggles & TYPING_ONCE && typing) + +/client/verb/ooc(msg = "" as text) set name = "OOC" set category = "OOC" - + if(!mob) return if(IsGuestKey(key)) to_chat(src, "Guests may not use OOC.") return - msg = trim(sanitize(copytext(msg, 1, MAX_MESSAGE_LEN))) - if(!msg) - return - - if(!(prefs.toggles & CHAT_OOC)) - to_chat(src, "You have OOC muted.") - return - - if(!check_rights(R_ADMIN|R_MOD,0)) + if(!check_rights(R_ADMIN|R_MOD, 0)) if(!config.ooc_allowed) to_chat(src, "OOC is globally muted.") return @@ -32,6 +28,19 @@ var/global/admin_ooc_colour = "#b82e00" if(prefs.muted & MUTE_OOC) to_chat(src, "You cannot use OOC (muted).") return + + if(!msg) + msg = typing_input(src.mob, "", "ooc \"text\"") + + msg = trim(sanitize(copytext(msg, 1, MAX_MESSAGE_LEN))) + if(!msg) + return + + if(!(prefs.toggles & CHAT_OOC)) + to_chat(src, "You have OOC muted.") + return + + if(!check_rights(R_ADMIN|R_MOD,0)) if(handle_spam_prevention(msg, MUTE_OOC, OOC_COOLDOWN)) return if(findtext(msg, "byond://")) @@ -150,7 +159,7 @@ var/global/admin_ooc_colour = "#b82e00" feedback_add_details("admin_verb","ROC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/client/verb/looc(msg as text) +/client/verb/looc(msg = "" as text) set name = "LOOC" set desc = "Local OOC, seen only by those in view." set category = "OOC" @@ -161,14 +170,6 @@ var/global/admin_ooc_colour = "#b82e00" to_chat(src, "Guests may not use OOC.") return - msg = trim(sanitize(copytext(msg, 1, MAX_MESSAGE_LEN))) - if(!msg) - return - - if(!(prefs.toggles & CHAT_LOOC)) - to_chat(src, "You have LOOC muted.") - return - if(!check_rights(R_ADMIN|R_MOD,0)) if(!config.looc_allowed) to_chat(src, "LOOC is globally muted.") @@ -179,6 +180,19 @@ var/global/admin_ooc_colour = "#b82e00" if(prefs.muted & MUTE_OOC) to_chat(src, "You cannot use LOOC (muted).") return + + if(!msg) + msg = typing_input(src.mob, "Local OOC, seen only by those in view.", "looc \"text\"") + + msg = trim(sanitize(copytext(msg, 1, MAX_MESSAGE_LEN))) + if(!msg) + return + + if(!(prefs.toggles & CHAT_LOOC)) + to_chat(src, "You have LOOC muted.") + return + + if(!check_rights(R_ADMIN|R_MOD,0)) if(handle_spam_prevention(msg, MUTE_OOC, OOC_COOLDOWN)) return if(findtext(msg, "byond://")) diff --git a/code/game/verbs/suicide.dm b/code/game/verbs/suicide.dm index 06b168da042..46d5c4e36ba 100644 --- a/code/game/verbs/suicide.dm +++ b/code/game/verbs/suicide.dm @@ -1,7 +1,7 @@ /mob/var/suiciding = 0 /mob/living/carbon/human/proc/do_suicide(damagetype, byitem) - var/threshold = (config.health_threshold_crit + config.health_threshold_dead) / 2 + var/threshold = check_death_method() ? ((HEALTH_THRESHOLD_CRIT + HEALTH_THRESHOLD_DEAD) / 2) : (HEALTH_THRESHOLD_DEAD - 50) var/dmgamt = maxHealth - threshold var/damage_mod = 1 @@ -52,6 +52,9 @@ /mob/living/carbon/human/verb/suicide() set hidden = 1 + be_suicidal() + +/mob/living/carbon/human/proc/be_suicidal(forced = FALSE) if(stat == DEAD) to_chat(src, "You're already dead!") return @@ -69,20 +72,39 @@ to_chat(src, "You're already committing suicide! Be patient!") return - var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No") - if(confirm == "Yes") - suiciding = 1 + var/confirm = null + if(!forced) + confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No") + + if(forced || (confirm == "Yes")) + suiciding = TRUE var/obj/item/held_item = get_active_hand() if(held_item) var/damagetype = held_item.suicide_act(src) if(damagetype) if(damagetype & SHAME) adjustStaminaLoss(200) - suiciding = 0 + suiciding = FALSE + return + if(damagetype & OBLITERATION) // Does it gib or something? Don't deal damage return do_suicide(damagetype, held_item) return + else + for(var/obj/O in orange(1, src)) + if(O.suicidal_hands) + continue + var/damagetype = O.suicide_act(src) + if(damagetype) + if(damagetype & SHAME) + adjustStaminaLoss(200) + suiciding = FALSE + return + if(damagetype & OBLITERATION) + return + do_suicide(damagetype, O) + return to_chat(viewers(src), "[src] [replacetext(pick(dna.species.suicide_messages), "their", p_their())] It looks like [p_theyre()] trying to commit suicide.") do_suicide(0) diff --git a/code/game/world.dm b/code/game/world.dm index 80bd980f404..d87ad886937 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -322,6 +322,7 @@ var/world_topic_spam_protect_time = world.timeofday //kick_clients_in_lobby("The round came to an end with you in the lobby.", 1) processScheduler.stop() + Master.Shutdown() //run SS shutdowns shutdown_logging() // Past this point, no logging procs can be used, at risk of data loss. for(var/client/C in GLOB.clients) @@ -442,6 +443,7 @@ var/failed_old_db_connections = 0 GLOB.world_href_log = "[GLOB.log_directory]/hrefs.log" GLOB.world_runtime_log = "[GLOB.log_directory]/runtime.log" GLOB.world_qdel_log = "[GLOB.log_directory]/qdel.log" + GLOB.world_asset_log = "[GLOB.log_directory]/asset.log" start_log(GLOB.world_game_log) start_log(GLOB.world_href_log) start_log(GLOB.world_runtime_log) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index e0b4006e63a..c15600f7bb6 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -321,7 +321,7 @@ var/global/nologevent = 0 if(CHANNEL.is_admin_channel) dat+="[CHANNEL.channel_name]
" else - dat+="[CHANNEL.channel_name] [(CHANNEL.censored) ? ("***") : ()]
" + dat+="[CHANNEL.channel_name] [(CHANNEL.censored) ? ("***") : ""]
" dat+={"

Refresh
Back "} @@ -405,7 +405,7 @@ var/global/nologevent = 0 dat+="No feed channels found active...
" else for(var/datum/feed_channel/CHANNEL in news_network.network_channels) - dat+="[CHANNEL.channel_name] [(CHANNEL.censored) ? ("***") : ()]
" + dat+="[CHANNEL.channel_name] [(CHANNEL.censored) ? ("***") : ""]
" dat+="
Cancel" if(11) dat+={" @@ -418,7 +418,7 @@ var/global/nologevent = 0 dat+="No feed channels found active...
" else for(var/datum/feed_channel/CHANNEL in news_network.network_channels) - dat+="[CHANNEL.channel_name] [(CHANNEL.censored) ? ("***") : ()]
" + dat+="[CHANNEL.channel_name] [(CHANNEL.censored) ? ("***") : ""]
" dat+="
Back" if(12) @@ -676,6 +676,9 @@ var/global/nologevent = 0 alert("Unable to start the game as it is not set up.") return if(ticker.current_state == GAME_STATE_PREGAME) + if(config.start_now_confirmation) + if(alert(usr, "This is a live server. Are you sure you want to start now?", "Start game", "Yes", "No") != "Yes") + return ticker.current_state = GAME_STATE_SETTING_UP log_admin("[key_name(usr)] has started the game.") message_admins("[key_name_admin(usr)] has started the game.") diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index 0a943e6a170..f50bae146c3 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -477,6 +477,9 @@ else dat += "Blob not found!" dat += "" + + if(ticker.mode.blob_overminds.len) + dat += check_role_table("Blob Overminds", ticker.mode.blob_overminds) if(ticker.mode.changelings.len) dat += check_role_table("Changelings", ticker.mode.changelings) @@ -545,6 +548,16 @@ if(spider_minds.len) dat += check_role_table("Terror Spiders", spider_minds) + var/count_eggs = 0 + var/count_spiderlings = 0 + for(var/obj/structure/spider/eggcluster/terror_eggcluster/E in ts_egg_list) + if(is_station_level(E.z)) + count_eggs += E.spiderling_number + for(var/obj/structure/spider/spiderling/terror_spiderling/L in ts_spiderling_list) + if(!L.stillborn && is_station_level(L.z)) + count_spiderlings += 1 + dat += "
Growing TS on-station: [count_eggs] egg[count_eggs != 1 ? "s" : ""], [count_spiderlings] spiderling[count_spiderlings != 1 ? "s" : ""].
" + if(ticker.mode.ert.len) dat += check_role_table("ERT", ticker.mode.ert) diff --git a/code/modules/admin/secrets.dm b/code/modules/admin/secrets.dm index fe487ae6431..cec31ffc2ac 100644 --- a/code/modules/admin/secrets.dm +++ b/code/modules/admin/secrets.dm @@ -113,7 +113,9 @@ Japanese Animes Mode   Egalitarian Station Mode
Summon Guns   - Summon Magic + Summon Magic   + Summon Revolver Duel   + Summon Suicidal Revolver Duel
Roll the Dice

diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index d86de2c0d0e..17d3cae9d5c 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -2840,11 +2840,19 @@ if("guns") feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","SG") - usr.rightandwrong(0) + usr.rightandwrong(FALSE) if("magic") feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","SM") - usr.rightandwrong(1) + usr.rightandwrong(TRUE) + if("revolver") + feedback_inc("admin_secrets_fun_used", 1) + feedback_add_details("admin_secrets_fun_used", "SRD") + usr.rightandwrong(FALSE, revolver_fight = TRUE) + if("fakerevolver") + feedback_inc("admin_secrets_fun_used", 1) + feedback_add_details("admin_secrets_fun_used", "SFD") + usr.rightandwrong(FALSE, fake_revolver_fight = TRUE) if("tdomereset") var/delete_mobs = alert("Clear all mobs?","Confirm","Yes","No","Cancel") if(delete_mobs == "Cancel") diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm index 937c831dfbf..2b78de43f82 100644 --- a/code/modules/antagonists/_common/antag_spawner.dm +++ b/code/modules/antagonists/_common/antag_spawner.dm @@ -10,7 +10,6 @@ /obj/item/antag_spawner/proc/equip_antag(mob/target) return - /obj/item/antag_spawner/borg_tele name = "syndicate cyborg teleporter" desc = "A single-use teleporter used to deploy a Syndicate Cyborg on the field." @@ -149,7 +148,6 @@ to_chat(S, "Objective #[1]: [KillDaWiz.explanation_text]") to_chat(S, "Objective #[2]: [KillDaCrew.explanation_text]") - /obj/item/antag_spawner/slaughter_demon/laughter name = "vial of tickles" desc = "A magically infused bottle of clown love, distilled from \ @@ -160,3 +158,59 @@ lurking just beyond the veil...
" objective_verb = "Hug and Tickle" demon_type = /mob/living/simple_animal/slaughter/laughter + +/obj/item/antag_spawner/morph + name = "vial of ooze" + desc = "A magically infused bottle of ooze, distilled by methods rather not be spoken of. Used to awaken an all-consuming monstrosity." + icon = 'icons/obj/wizard.dmi' + icon_state = "vialooze" + var/shatter_msg = "You shatter the bottle, no \ + turning back now!" + var/veil_msg = "The sludge is awake and seeps \ + away..." + var/objective_verb = "Eat" + var/mob/living/morph_type = /mob/living/simple_animal/hostile/morph + +/obj/item/antag_spawner/morph/attack_self(mob/user) + if(level_blocks_magic(user.z))//this is to make sure the wizard does NOT summon a morph from the Den.. + to_chat(user, "You should probably wait until you reach the station.") + return + + if(used) + to_chat(user, "This bottle already has a broken seal.") + return + used = TRUE + to_chat(user, "You break the seal on the bottle, calling upon the dire sludge to awaken...") + + var/list/candidates = pollCandidates("Do you want to play as a morph awakened by [user.real_name]?", ROLE_MORPH, 1, 100) + + if(candidates.len > 0) + var/mob/C = pick(candidates) + spawn_antag(C, get_turf(src.loc), initial(morph_type.name), user) + to_chat(user, "[shatter_msg]") + to_chat(user, "[veil_msg]") + playsound(user.loc, 'sound/effects/glassbr1.ogg', 100, 1) + qdel(src) + else + used = FALSE + to_chat(user, "The sludge does not respond to your attempt to awake it. Perhaps you should try again later.") + +/obj/item/antag_spawner/morph/spawn_antag(client/C, turf/T, type = "", mob/user) + var/mob/living/simple_animal/hostile/morph/M = new /mob/living/simple_animal/hostile/morph(pick(xeno_spawn)) + M.key = C.key + M.mind.assigned_role = SPECIAL_ROLE_MORPH + M.mind.special_role = SPECIAL_ROLE_MORPH + to_chat(M, M.playstyle_string) + ticker.mode.traitors += M.mind + var/datum/objective/assassinate/KillDaWiz = new /datum/objective/assassinate + KillDaWiz.owner = M.mind + KillDaWiz.target = user.mind + KillDaWiz.explanation_text = "[objective_verb] [user.real_name], the one who was foolish enough to awake you." + M.mind.objectives += KillDaWiz + var/datum/objective/KillDaCrew = new /datum/objective + KillDaCrew.owner = M.mind + KillDaCrew.explanation_text = "[objective_verb] everyone and everything else while you're at it." + M.mind.objectives += KillDaCrew + to_chat(M, "Objective #[1]: [KillDaWiz.explanation_text]") + to_chat(M, "Objective #[2]: [KillDaCrew.explanation_text]") + M << 'sound/magic/mutate.ogg' \ No newline at end of file diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index bc36a0543e8..0d5a866e6c5 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -121,7 +121,7 @@ return /obj/item/assembly_holder/pickup() - ..() + . = ..() process_movement() /obj/item/assembly_holder/Bump() diff --git a/code/modules/buildmode/submodes/link.dm b/code/modules/buildmode/submodes/link.dm index 608bea17833..136ffad6433 100644 --- a/code/modules/buildmode/submodes/link.dm +++ b/code/modules/buildmode/submodes/link.dm @@ -46,17 +46,17 @@ if(!M.id || M.id == "") M.id = input(user, "Please select an ID for the button", "Buildmode", "") if(!M.id || M.id == "") - goto(line_jump) + goto line_jump if(P.id_tag == M.id && P.id_tag && P.id_tag != "") P.id_tag = null to_chat(user, "[P] unlinked.") - goto(line_jump) + goto line_jump if(!M.normaldoorcontrol) if(link_lines.len && alert(user, "Warning: This will disable links to connected pod doors. Continue?", "Buildmode", "Yes", "No") == "No") - goto(line_jump) + goto line_jump M.normaldoorcontrol = 1 if(P.id_tag && alert(user, "Warning: This will unlink something else from the door. Continue?", "Buildmode", "Yes", "No") == "No") - goto(line_jump) + goto line_jump P.id_tag = M.id if(istype(link_obj, /obj/machinery/door_control) && istype(object, /obj/machinery/door/poddoor)) var/obj/machinery/door_control/M = link_obj @@ -64,21 +64,21 @@ if(!M.id || M.id == "") M.id = input(user, "Please select an ID for the button", "Buildmode", "") if(!M.id || M.id == "") - goto(line_jump) + goto line_jump if(P.id_tag == M.id && P.id_tag && P.id_tag != "") P.id_tag = null to_chat(user, "[P] unlinked.") - goto(line_jump) + goto line_jump if(M.normaldoorcontrol) if(link_lines.len && alert(user, "Warning: This will disable links to connected airlocks. Continue?", "Buildmode", "Yes", "No") == "No") - goto(line_jump) + goto line_jump M.normaldoorcontrol = 0 if(!M.id || M.id == "") M.id = input(user, "Please select an ID for the button", "Buildmode", "") if(!M.id || M.id == "") - goto(line_jump) + goto line_jump if(P.id_tag && P.id_tag != 1 && alert(user, "Warning: This will unlink something else from the door. Continue?", "Buildmode", "Yes", "No") == "No") - goto(line_jump) + goto line_jump P.id_tag = M.id line_jump // For the goto diff --git a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm index 80eb0a701d7..300443714ab 100644 --- a/code/modules/client/asset_cache.dm +++ b/code/modules/client/asset_cache.dm @@ -44,6 +44,7 @@ You can set verify to TRUE if you want send() to sleep until the client has the if(client.cache.Find(asset_name) || client.sending.Find(asset_name)) return 0 + log_asset("Sending asset [asset_name] to client [client]") client << browse_rsc(SSassets.cache[asset_name], asset_name) if(!verify) // Can't access the asset cache browser, rip. client.cache += asset_name @@ -92,6 +93,7 @@ You can set verify to TRUE if you want send() to sleep until the client has the to_chat(client, "Sending Resources...") for(var/asset in unreceived) if(asset in SSassets.cache) + log_asset("Sending asset [asset] to client [client]") client << browse_rsc(SSassets.cache[asset], asset) if(!verify) // Can't access the asset cache browser, rip. @@ -292,7 +294,7 @@ You can set verify to TRUE if you want send() to sleep until the client has the /datum/asset/chem_master/register() for(var/i = 1 to 20) assets["pill[i].png"] = icon('icons/obj/chemical.dmi', "pill[i]") - for(var/i in list("bottle", "small_bottle", "wide_bottle", "round_bottle")) + for(var/i in list("bottle", "small_bottle", "wide_bottle", "round_bottle", "reagent_bottle")) assets["[i].png"] = icon('icons/obj/chemical.dmi', "[i]") for(var/asset_name in assets) register_asset(asset_name, assets[asset_name]) diff --git a/code/modules/client/client defines.dm b/code/modules/client/client defines.dm index c88347a305b..66b71fb137d 100644 --- a/code/modules/client/client defines.dm +++ b/code/modules/client/client defines.dm @@ -19,6 +19,8 @@ var/area = null var/time_died_as_mouse = null //when the client last died as a mouse + var/typing = FALSE // Prevents typing window stacking + var/adminhelped = 0 var/gc_destroyed //Time when this object was destroyed. diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index dffa321da4b..ac9a88aaa08 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -290,6 +290,10 @@ return null if(byond_version < MIN_CLIENT_VERSION) // Too out of date to play at all. Unfortunately, we can't send them a message here. return null + if(byond_build < config.minimum_client_build) + alert(src, "You are using a byond build which is not supported by this server. Please use a build version of atleast [config.minimum_client_build].", "Incorrect build", "OK") + del(src) + return if(byond_version < SUGGESTED_CLIENT_VERSION) // Update is suggested, but not required. to_chat(src,"Your BYOND client (v: [byond_version]) is out of date. This can cause glitches. We highly suggest you download the latest client from http://www.byond.com/ before playing. ") @@ -383,6 +387,9 @@ if(prefs.toggles & DISABLE_KARMA) // activates if karma is disabled if(establish_db_connection()) to_chat(src,"You have disabled karma gains.") // reminds those who have it disabled + else + if(establish_db_connection()) + to_chat(src,"You have enabled karma gains.") if(!void) void = new() diff --git a/code/modules/client/preference/preferences.dm b/code/modules/client/preference/preferences.dm index 0a09f4504bb..caf98b866cc 100644 --- a/code/modules/client/preference/preferences.dm +++ b/code/modules/client/preference/preferences.dm @@ -435,37 +435,35 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts dat += "" if(TAB_GAME) // General Preferences + // LEFT SIDE OF THE PAGE dat += "
" dat += "

General Settings

" - dat += "Fancy NanoUI: [(nanoui_fancy) ? "Yes" : "No"]
" - dat += "Ghost-Item Attack Animation: [(show_ghostitem_attack) ? "Yes" : "No"]
" - dat += "Window Flashing: [(windowflashing) ? "Yes" : "No"]
" - dat += "Custom UI settings:
" - dat += " - UI Style: [UI_style]
" - dat += " - Color: [UI_style_color]
__

" - dat += " - Alpha (transparency): [UI_style_alpha]
" - dat += "
" - dat += "Play admin midis: [(sound & SOUND_MIDI) ? "Yes" : "No"]
" - dat += "Play lobby music: [(sound & SOUND_LOBBY) ? "Yes" : "No"]
" + dat += "Attack Animations: [(show_ghostitem_attack) ? "Yes" : "No"]
" if(user.client.holder) - dat += "Adminhelp sound: " - dat += "[(sound & SOUND_ADMINHELP)?"On":"Off"]
" - - if(check_rights(R_ADMIN,0)) - dat += "OOC:     Change
" - if(config.allow_Metadata) - dat += "OOC notes: Edit
" + dat += "Adminhelp sound: [(sound & SOUND_ADMINHELP)?"On":"Off"]
" if(unlock_content) dat += "BYOND Membership Publicity: [(toggles & MEMBER_PUBLIC) ? "Public" : "Hidden"]
" + dat += "Custom UI settings:
" + dat += " - Alpha (transparency): [UI_style_alpha]
" + dat += " - Color: [UI_style_color]    
" + dat += " - UI Style: [UI_style]
" + dat += "Deadchat Anonymity: [ghost_anonsay ? "Anonymous" : "Not Anonymous"]
" if(user.client.donator_level >= DONATOR_LEVEL_ONE) dat += "Donator Publicity: [(toggles & DONATOR_PUBLIC) ? "Public" : "Hidden"]
" - - dat += "Randomized character slot: [randomslot ? "Yes" : "No"]
" - dat += "Ghost ears: [(toggles & CHAT_GHOSTEARS) ? "All Speech" : "Nearest Creatures"]
" - dat += "Ghost sight: [(toggles & CHAT_GHOSTSIGHT) ? "All Emotes" : "Nearest Creatures"]
" - dat += "Ghost radio: [(toggles & CHAT_GHOSTRADIO) ? "All Chatter" : "Nearest Speakers"]
" - dat += "Deadchat anonymity: [ghost_anonsay ? "Anonymous" : "Not Anonymous"]
" + dat += "Fancy NanoUI: [(nanoui_fancy) ? "Yes" : "No"]
" dat += "FPS: [clientfps]
" + dat += "Ghost Ears: [(toggles & CHAT_GHOSTEARS) ? "All Speech" : "Nearest Creatures"]
" + dat += "Ghost Sight: [(toggles & CHAT_GHOSTSIGHT) ? "All Emotes" : "Nearest Creatures"]
" + dat += "Ghost Radio: [(toggles & CHAT_GHOSTRADIO) ? "All Chatter" : "Nearest Speakers"]
" + if(check_rights(R_ADMIN,0)) + dat += "OOC Color:     Change
" + if(config.allow_Metadata) + dat += "OOC Notes: Edit
" + dat += "Play Admin MIDIs: [(sound & SOUND_MIDI) ? "Yes" : "No"]
" + dat += "Play Lobby Music: [(sound & SOUND_LOBBY) ? "Yes" : "No"]
" + dat += "Randomized Character Slot: [randomslot ? "Yes" : "No"]
" + dat += "Window Flashing: [(windowflashing) ? "Yes" : "No"]
" + // RIGHT SIDE OF THE PAGE dat += "
" dat += "

Special Role Settings

" if(jobban_isbanned(user, "Syndicate")) @@ -554,7 +552,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts dat += "Reset Setup" dat += "" - var/datum/browser/popup = new(user, "preferences", "
Character Setup
", 820, 640) + var/datum/browser/popup = new(user, "preferences", "
Character Setup
", 820, 660) popup.set_content(dat) popup.open(0) diff --git a/code/modules/client/preference/preferences_mysql.dm b/code/modules/client/preference/preferences_mysql.dm index f5bfb392c70..b355d921016 100644 --- a/code/modules/client/preference/preferences_mysql.dm +++ b/code/modules/client/preference/preferences_mysql.dm @@ -55,7 +55,7 @@ ooccolor = sanitize_hexcolor(ooccolor, initial(ooccolor)) UI_style = sanitize_inlist(UI_style, list("White", "Midnight"), initial(UI_style)) default_slot = sanitize_integer(default_slot, 1, max_save_slots, initial(default_slot)) - toggles = sanitize_integer(toggles, 0, 1048575, initial(toggles)) + toggles = sanitize_integer(toggles, 0, 2097151, initial(toggles)) sound = sanitize_integer(sound, 0, 65535, initial(sound)) UI_style_color = sanitize_hexcolor(UI_style_color, initial(UI_style_color)) UI_style_alpha = sanitize_integer(UI_style_alpha, 0, 255, initial(UI_style_alpha)) diff --git a/code/modules/client/preference/preferences_toggles.dm b/code/modules/client/preference/preferences_toggles.dm index 307f018f73c..703de37468e 100644 --- a/code/modules/client/preference/preferences_toggles.dm +++ b/code/modules/client/preference/preferences_toggles.dm @@ -224,10 +224,22 @@ set name = "Toggle Karma Gains" set category = "Special Verbs" set desc = "This button will allow you to stop other people giving you karma." - if (prefs.toggles & DISABLE_KARMA) + prefs.toggles ^= DISABLE_KARMA + prefs.save_preferences(src) + if(prefs.toggles & DISABLE_KARMA) to_chat(usr, "You have disabled karma gains.") else to_chat(usr, "You have enabled karma gains.") - prefs.toggles ^= DISABLE_KARMA - prefs.save_preferences(src) + return + +/client/verb/toggle_popup_limiter() + set name = "Toggle Text Popup Limiter" + set category = "Preferences" + set desc = "Will let you limit the text input popups to one at a time." + prefs.toggles ^= TYPING_ONCE + prefs.save_preferences(src) + if(prefs.toggles & TYPING_ONCE) + to_chat(usr, "You have enabled text popup limiting.") + else + to_chat(usr, "You have disabled text popup limiting.") return diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index 35c5243de64..b527bb2717d 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -532,6 +532,10 @@ actions_types = list(/datum/action/item_action/toggle) up = 0 tint = 0 + species_fit = list("Vox") + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/eyes.dmi' + ) /obj/item/clothing/glasses/tajblind/eng name = "industrial veil" diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index fb4f3736d6c..d778ea5e63a 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -165,6 +165,10 @@ flags_cover = GLASSESCOVERSEYES actions_types = list(/datum/action/item_action/toggle) up = 0 + species_fit = list("Vox") + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/eyes.dmi' + ) /obj/item/clothing/glasses/hud/security/tajblind/attack_self() toggle_veil() @@ -177,6 +181,10 @@ flags_cover = GLASSESCOVERSEYES actions_types = list(/datum/action/item_action/toggle) up = 0 + species_fit = list("Vox") + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/eyes.dmi' + ) /obj/item/clothing/glasses/hud/health/tajblind/attack_self() toggle_veil() diff --git a/code/modules/clothing/gloves/rings.dm b/code/modules/clothing/gloves/rings.dm index 590efa7cd91..9a512ca2cd5 100644 --- a/code/modules/clothing/gloves/rings.dm +++ b/code/modules/clothing/gloves/rings.dm @@ -6,6 +6,7 @@ icon_state = "ironring" item_state = "" icon = 'icons/obj/clothing/rings.dmi' + var/fluff_material = FALSE //If true, will ignore the material when examining var/material = "iron" var/stud = 0 @@ -21,7 +22,8 @@ /obj/item/clothing/gloves/ring/examine(mob/user) ..(user) - to_chat(user, "This one is made of [material].") + if(!fluff_material) + to_chat(user, "This one is made of [material].") if(stud) to_chat(user, "It is adorned with a single gem.") diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index 5bc13912a04..62873252ad1 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -430,7 +430,7 @@ /obj/item/clothing/head/griffin/proc/caw() if(cooldown < world.time - 20) // A cooldown, to stop people being jerks - playsound(src.loc, 'sound/misc/caw.ogg', 50, 1) + playsound(src.loc, 'sound/creatures/caw.ogg', 50, 1) cooldown = world.time diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index 38f54b1067a..0c4dba9ae49 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -188,7 +188,7 @@ /obj/item/clothing/mask/gas/owl_mask/proc/hoot() if(cooldown < world.time - 35) // A cooldown, to stop people being jerks - playsound(src.loc, 'sound/misc/hoot.ogg', 50, 1) + playsound(src.loc, 'sound/creatures/hoot.ogg', 50, 1) cooldown = world.time // ******************************************************************** diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index 77fcd03c7df..113720caff1 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -491,5 +491,6 @@ /obj/item/clothing/mask/cursedclown/suicide_act(mob/user) user.visible_message("[user] gazes into the eyes of [src]. [src] gazes back!") spawn(10) - user.gib() - return BRUTELOSS + if(user) + user.gib() + return OBLITERATION diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index 4579ec45f8b..23206e8b9b3 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -154,7 +154,7 @@ /obj/item/fluff/rsik_katana/suicide_act(mob/user) user.visible_message("[user] tries to stab [src] into [user.p_their()] stomach! Except [src] shatters! [user.p_they(TRUE)] look[user.p_s()] as if [user.p_they()] might die from the shame.") - return(BRUTELOSS) + return BRUTELOSS /obj/item/crowbar/fluff/zelda_creedy_1 // Zomgponies: Griffin Rowley name = "Zelda's Crowbar" @@ -1156,9 +1156,19 @@ icon = 'icons/obj/custom_items.dmi' icon_state = "shesicoat" item_state = "shesicoat" + hoodtype = /obj/item/clothing/head/hood/fluff/shesi body_parts_covered = UPPER_TORSO|LOWER_TORSO cold_protection = UPPER_TORSO|LOWER_TORSO +/obj/item/clothing/head/hood/fluff/shesi //MrSynnester : Shesi Skaklas + name = "custom made winter hood" + desc = "A custom made winter coat hood. Looks comfy." + icon = 'icons/obj/custom_items.dmi' + icon_state = "shesicoat_hood2" + body_parts_covered = HEAD + flags = NODROP|BLOCKHAIR + flags_inv = HIDEEARS + /obj/item/clothing/suit/jacket/dtx //AffectedArc07: DTX name = "telecommunications bomber jacket" desc = "Looks like something only a nerd would buy. Has a tag inside reading Property of DTX." @@ -1683,6 +1693,14 @@ item_color = "Xann_necklace" slot_flags = SLOT_TIE +/obj/item/clothing/accessory/rbscarf //Rb303: Isthel Eisenwald + name = "Old purple scarf" + desc = "An old, striped purple scarf. It appears to be hand-knitted and has the name 'Isthel' written on it in bad handwriting." + icon = 'icons/obj/custom_items.dmi' + icon_state = "rbscarf" + item_state = "rbscarf" + item_color = "rbscarf" + /obj/item/instrument/accordion/fluff/asmer_accordion //Asmerath: Coloratura name = "Rara's Somber Accordion" desc = "A blue colored accordion with claw indentations on the keys made special for vulpkanins." @@ -1734,4 +1752,25 @@ icon_state = "kiamask" item_state = "kiamask" item_color = "kiamask" - species_restricted = list("Vox") \ No newline at end of file + species_restricted = list("Vox") + + + +/obj/item/clothing/gloves/ring/fluff + name = "fluff ring" + desc = "Someone forgot to set this fluff item's description, notify a coder!" + icon = 'icons/obj/custom_items.dmi' + fluff_material = TRUE + +/obj/item/clothing/gloves/ring/fluff/update_icon() + return + +/obj/item/clothing/gloves/ring/fluff/attackby(obj/item/I as obj, mob/user as mob, params) + return + + + +/obj/item/clothing/gloves/ring/fluff/benjaminfallout //Benjaminfallout: Pretzel Brassheart + name = "Pretzel's Ring" + desc = "A small platinum ring with a large light blue diamond. Engraved inside the band are the words: 'To my lovely Pristine Princess. Forever yours, Savinien.'" + icon_state = "benjaminfallout_ring" \ No newline at end of file diff --git a/code/modules/events/blob.dm b/code/modules/events/blob.dm index 7ea71547123..6f23bbc5fcd 100644 --- a/code/modules/events/blob.dm +++ b/code/modules/events/blob.dm @@ -9,7 +9,7 @@ var/turf/T = pick(blobstart) if(!T) return kill() - var/list/candidates = pollCandidates("Do you want to play as a blob?", ROLE_BLOB, 1) + var/list/candidates = pollCandidates("Do you want to play as a blob infested mouse?", ROLE_BLOB, 1) if(!candidates.len) return kill() var/list/vents = list() diff --git a/code/modules/events/grid_check.dm b/code/modules/events/grid_check.dm index 8c099f22a91..d8d1f46ad9b 100644 --- a/code/modules/events/grid_check.dm +++ b/code/modules/events/grid_check.dm @@ -1,12 +1,18 @@ /datum/event/grid_check //NOTE: Times are measured in master controller ticks! announceWhen = 5 - + /datum/event/grid_check/setup() endWhen = rand(30,120) /datum/event/grid_check/start() power_failure(0) - + var/sound/S = sound('sound/effects/powerloss.ogg') + for(var/mob/living/M in GLOB.player_list) + var/turf/T = get_turf(M) + if(!M.client || !is_station_level(T.z)) + continue + SEND_SOUND(M, S) + /datum/event/grid_check/announce() event_announcement.Announce("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Automated Grid Check", new_sound = 'sound/AI/poweroff.ogg') diff --git a/code/modules/events/sentience.dm b/code/modules/events/sentience.dm index 59fbbc01e55..419bebfe2c1 100644 --- a/code/modules/events/sentience.dm +++ b/code/modules/events/sentience.dm @@ -33,6 +33,7 @@ SA.key = SG.key SA.universal_speak = 1 SA.sentience_act() + SA.can_collar = 1 SA.maxHealth = max(SA.maxHealth + 200) SA.melee_damage_lower = max(SA.melee_damage_lower + 15) SA.melee_damage_upper = max(SA.melee_damage_upper + 15) diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm index 55e87f575b0..7d52d7cd969 100644 --- a/code/modules/events/spacevine.dm +++ b/code/modules/events/spacevine.dm @@ -684,6 +684,7 @@ wither() /obj/structure/spacevine/temperature_expose(null, temp, volume) + ..() var/override = 0 for(var/datum/spacevine_mutation/SM in mutations) override += SM.process_temperature(src, temp, volume) diff --git a/code/modules/events/vent_clog.dm b/code/modules/events/vent_clog.dm index b45a6882e80..9b1588e1161 100644 --- a/code/modules/events/vent_clog.dm +++ b/code/modules/events/vent_clog.dm @@ -29,7 +29,7 @@ R.add_reagent(pick(gunk), 50) var/datum/effect_system/smoke_spread/chem/smoke = new - smoke.set_up(R, rand(1, 2), 0, vent, 0, silent = 1) + smoke.set_up(R, vent, TRUE) playsound(vent.loc, 'sound/effects/smoke.ogg', 50, 1, -3) smoke.start(3) qdel(R) diff --git a/code/modules/examine/descriptions/weapons.dm b/code/modules/examine/descriptions/weapons.dm index 98f60d01ac4..286391f1387 100644 --- a/code/modules/examine/descriptions/weapons.dm +++ b/code/modules/examine/descriptions/weapons.dm @@ -55,6 +55,11 @@ then click where you want to fire. After firing, you will need to pump the gun, by clicking on the gun in your hand. To reload, load more shotgun \ shells into the gun." +/obj/item/toy/russian_revolver/trick_revolver //oh no + description_info = "This is a ballistic weapon. To fire the weapon, have your gun mode set to 'fire', \ + then click where you want to fire. To reload, click the weapon in your hand to unload (if needed), then add the appropriate ammo. The description \ + will tell you what caliber you need." + //******* //*Melee* //******* diff --git a/code/modules/examine/examine.dm b/code/modules/examine/examine.dm index 0956877d202..f39cb562ec8 100644 --- a/code/modules/examine/examine.dm +++ b/code/modules/examine/examine.dm @@ -60,12 +60,3 @@ stat(null,"[description_holders["fluff"]]") //Yellow, fluff-related text. if(description_holders["antag"]) stat(null,"[description_holders["antag"]]") //Red, malicious antag-related text - -//override examinate verb to update description holders when things are examined -/mob/examinate(atom/A as mob|obj|turf in view()) - if(..()) - return 1 - - var/is_antag = (isAntag(src) || isobserver(src)) //ghosts don't have minds - if(client) - client.update_description_holders(A, is_antag) diff --git a/code/modules/fish/fish_items.dm b/code/modules/fish/fish_items.dm index 63a4b668930..a0882ae5df8 100644 --- a/code/modules/fish/fish_items.dm +++ b/code/modules/fish/fish_items.dm @@ -25,9 +25,9 @@ throw_speed = 3 throw_range = 7 - suicide_act(mob/user) //"A tiny net is a death sentence: it's a net and it's tiny!" https://www.youtube.com/watch?v=FCI9Y4VGCVw - to_chat(viewers(user), "[user] places the [src.name] on top of [user.p_their()] head, [user.p_their()] fingers tangled in the netting! It looks like [user.p_theyre()] trying to commit suicide.") - return(OXYLOSS) +/obj/item/fish_net/suicide_act(mob/user) //"A tiny net is a death sentence: it's a net and it's tiny!" https://www.youtube.com/watch?v=FCI9Y4VGCVw + to_chat(viewers(user), "[user] places the [src.name] on top of [user.p_their()] head, [user.p_their()] fingers tangled in the netting! It looks like [user.p_theyre()] trying to commit suicide.") + return OXYLOSS /obj/item/fishfood name = "fish food can" @@ -51,9 +51,9 @@ throw_range = 7 attack_verb = list("scrubbed", "brushed", "scraped") - suicide_act(mob/user) - to_chat(viewers(user), "[user] is vigorously scrubbing [user.p_them()]self raw with the [name]! It looks like [user.p_theyre()] trying to commit suicide.") - return(BRUTELOSS|FIRELOSS) +/obj/item/tank_brush/suicide_act(mob/user) + to_chat(viewers(user), "[user] is vigorously scrubbing [user.p_them()]self raw with the [name]! It looks like [user.p_theyre()] trying to commit suicide.") + return BRUTELOSS|FIRELOSS ////////////////////////////////////////////// // Fish Items // diff --git a/code/modules/flufftext/TextFilters.dm b/code/modules/flufftext/TextFilters.dm index 7ff5a2fd0a5..02a02a6f5b2 100644 --- a/code/modules/flufftext/TextFilters.dm +++ b/code/modules/flufftext/TextFilters.dm @@ -64,9 +64,8 @@ proc/Ellipsis(original_msg, chance = 50) if(chance <= 0) return "..." if(chance >= 100) return original_msg - var/list - words = splittext(original_msg," ") - new_words = list() + var/list/words = splittext(original_msg," ") + var/list/new_words = list() var/new_msg = "" diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm index 2c9c2480a4b..785231a588d 100644 --- a/code/modules/food_and_drinks/drinks/drinks.dm +++ b/code/modules/food_and_drinks/drinks/drinks.dm @@ -11,6 +11,7 @@ possible_transfer_amounts = list(5,10,15,20,25,30,50) volume = 50 burn_state = FIRE_PROOF + antable = FALSE /obj/item/reagent_containers/food/drinks/New() ..() @@ -106,17 +107,6 @@ return FALSE -/obj/item/reagent_containers/food/drinks/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/clothing/mask/cigarette)) //ciggies are weird - return FALSE - if(is_hot(I)) - if(reagents) - reagents.chem_temp += 15 - to_chat(user, "You heat [src] with [I].") - reagents.handle_reactions() - else - return ..() - /obj/item/reagent_containers/food/drinks/examine(mob/user) if(!..(user, 1)) return diff --git a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm index f5bd0e8e4eb..bdc473d774e 100644 --- a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm +++ b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm @@ -27,7 +27,7 @@ else ..() -/obj/item/reagent_containers/food/drinks/drinkingglass/fire_act() +/obj/item/reagent_containers/food/drinks/drinkingglass/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE) if(!reagents.total_volume) return ..() diff --git a/code/modules/food_and_drinks/drinks/drinks/shotglass.dm b/code/modules/food_and_drinks/drinks/drinks/shotglass.dm index 393543b093c..cd158c70e74 100644 --- a/code/modules/food_and_drinks/drinks/drinks/shotglass.dm +++ b/code/modules/food_and_drinks/drinks/drinks/shotglass.dm @@ -51,7 +51,7 @@ if(A.volume >= 5 && A.alcohol_perc >= 0.35) //Only an approximation to if something's flammable but it will do return TRUE -/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass/fire_act(global_overlay = FALSE) +/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = FALSE) if(!isShotFlammable() || burn_state == ON_FIRE) //You can't light a shot that's not flammable! return ..() diff --git a/code/modules/food_and_drinks/food.dm b/code/modules/food_and_drinks/food.dm index 0ecff55cba0..e931db813cf 100644 --- a/code/modules/food_and_drinks/food.dm +++ b/code/modules/food_and_drinks/food.dm @@ -13,10 +13,42 @@ var/transfer_efficiency = 1.0 var/instant_application = 0 //if we want to bypass the forcedfeed delay var/taste = TRUE//whether you can taste eating from this + var/antable = TRUE // Will ants come near it? + var/ant_location = null + var/ant_timer = null burn_state = FLAMMABLE container_type = INJECTABLE -/obj/item/reagent_containers/food/New() - ..() +/obj/item/reagent_containers/food/Initialize(mapload) + . = ..() pixel_x = rand(-5, 5) //Randomizes postion pixel_y = rand(-5, 5) + if(antable) + ant_location = get_turf(src) + ant_timer = addtimer(CALLBACK(src, .proc/check_for_ants), 3000, TIMER_STOPPABLE) + +/obj/item/reagent_containers/food/Destroy() + ant_location = null + if(ant_timer) + deltimer(ant_timer) + return ..() + +/obj/item/reagent_containers/food/proc/check_for_ants() + if(!antable) + return + var/turf/T = get_turf(src) + if(isturf(loc) && !locate(/obj/structure/table) in T) + if(ant_location == T) + if(prob(15)) + if(!locate(/obj/effect/decal/ants) in T) + new /obj/effect/decal/ants(T) + antable = FALSE + desc += " It appears to be infested with ants. Yuck!" + reagents.add_reagent("ants", 1) // Don't eat things with ants in i you weirdo. + if(ant_timer) + deltimer(ant_timer) + else + ant_location = T + if(ant_timer) + deltimer(ant_timer) + ant_timer = addtimer(CALLBACK(src, .proc/check_for_ants), 3000, TIMER_STOPPABLE) \ No newline at end of file diff --git a/code/modules/food_and_drinks/food/condiment.dm b/code/modules/food_and_drinks/food/condiment.dm index 64a585e9051..d512e3888a9 100644 --- a/code/modules/food_and_drinks/food/condiment.dm +++ b/code/modules/food_and_drinks/food/condiment.dm @@ -131,7 +131,7 @@ user.name = newname user.real_name = newname desc = "Salt. From dead crew, presumably." - return (TOXLOSS) + return TOXLOSS /obj/item/reagent_containers/food/condiment/peppermill name = "pepper mill" diff --git a/code/modules/food_and_drinks/food/foods/seafood.dm b/code/modules/food_and_drinks/food/foods/seafood.dm index d06f1eeb77b..9e4407d9602 100644 --- a/code/modules/food_and_drinks/food/foods/seafood.dm +++ b/code/modules/food_and_drinks/food/foods/seafood.dm @@ -97,6 +97,24 @@ bitesize = 3 list_reagents = list("nutriment" = 2) +/obj/item/reagent_containers/food/snacks/shrimp_skewer + name = "shrimp skewer" + desc = "Four shrimp lightly grilled on a skewer. Yummy!" + trash = /obj/item/stack/rods + icon = 'icons/obj/food/seafood.dmi' + icon_state = "shrimpskewer" + bitesize = 3 + list_reagents = list("nutriment" = 8) + +/obj/item/reagent_containers/food/snacks/fish_skewer + name = "fish skewer" + desc = "A whole fish battered and grilled on a skewer. Hope you're hungry!" + trash = /obj/item/stack/rods + icon = 'icons/obj/food/seafood.dmi' + icon_state = "fishskewer" + bitesize = 3 + list_reagents = list("protein" = 6, "vitamin" = 4) + /obj/item/reagent_containers/food/snacks/sliceable/Ebi_maki name = "ebi makiroll" desc = "A large unsliced roll of Ebi Sushi." diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm index c5bcd22a885..edcb85e0d15 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm @@ -24,6 +24,18 @@ idle_power_usage = 2 active_power_usage = 500 +/obj/machinery/gibber/suicide_act(mob/user) + if(occupant || locked) + return FALSE + user.visible_message("[user] climbs into [src] and turns it on!") + user.Stun(10) + user.forceMove(src) + occupant = user + update_icon() + feedinTopanim() + addtimer(CALLBACK(src, .proc/startgibbing, user), 33) + return OBLITERATION + /obj/machinery/gibber/Destroy() if(contents.len) for(var/atom/movable/A in contents) @@ -145,7 +157,7 @@ set name = "Empty Gibber" set src in oview(1) - if(usr.stat != CONSCIOUS) + if(usr.incapacitated()) return go_out() diff --git a/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm b/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm index 8fe5d2cf4d8..1b8f61bb7bf 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm @@ -1,3 +1,5 @@ +GLOBAL_LIST_EMPTY(monkey_recyclers) + /obj/machinery/monkey_recycler name = "Monkey Recycler" desc = "A machine used for recycling dead monkeys into monkey cubes." @@ -14,6 +16,7 @@ var/cube_production = 1 var/cycle_through = 0 var/obj/item/reagent_containers/food/snacks/monkeycube/cube_type = /obj/item/reagent_containers/food/snacks/monkeycube + var/list/connected = list() /obj/machinery/monkey_recycler/New() ..() @@ -21,8 +24,15 @@ component_parts += new /obj/item/circuitboard/monkey_recycler(null) component_parts += new /obj/item/stock_parts/manipulator(null) component_parts += new /obj/item/stock_parts/matter_bin(null) + GLOB.monkey_recyclers += src RefreshParts() +/obj/machinery/monkey_recycler/Destroy() + GLOB.monkey_recyclers -= src + for(var/obj/machinery/computer/camera_advanced/xenobio/console in connected) + console.connected_recycler = null + return ..() + /obj/machinery/monkey_recycler/RefreshParts() var/req_grind = 5 var/cubes_made = 1 @@ -47,21 +57,25 @@ default_deconstruction_crowbar(O) if(istype(O, /obj/item/multitool)) - cycle_through++ - switch(cycle_through) - if(1) - cube_type = /obj/item/reagent_containers/food/snacks/monkeycube/farwacube - if(2) - cube_type = /obj/item/reagent_containers/food/snacks/monkeycube/wolpincube - if(3) - cube_type = /obj/item/reagent_containers/food/snacks/monkeycube/stokcube - if(4) - cube_type = /obj/item/reagent_containers/food/snacks/monkeycube/neaeracube - if(5) - cube_type = /obj/item/reagent_containers/food/snacks/monkeycube - cycle_through = 0 - to_chat(user, "You change the monkeycube type to [initial(cube_type.name)].") - + if(!panel_open) + cycle_through++ + switch(cycle_through) + if(1) + cube_type = /obj/item/reagent_containers/food/snacks/monkeycube/farwacube + if(2) + cube_type = /obj/item/reagent_containers/food/snacks/monkeycube/wolpincube + if(3) + cube_type = /obj/item/reagent_containers/food/snacks/monkeycube/stokcube + if(4) + cube_type = /obj/item/reagent_containers/food/snacks/monkeycube/neaeracube + if(5) + cube_type = /obj/item/reagent_containers/food/snacks/monkeycube + cycle_through = 0 + to_chat(user, "You change the monkeycube type to [initial(cube_type.name)].") + else + var/obj/item/multitool/M = O + M.buffer = src + to_chat(user, "You log [src] in the [M]'s buffer.") if(stat != 0) //NOPOWER etc return if(istype(O, /obj/item/grab)) diff --git a/code/modules/food_and_drinks/recipes/recipes_grill.dm b/code/modules/food_and_drinks/recipes/recipes_grill.dm index 921c2c86e99..e5c4cb6bce5 100644 --- a/code/modules/food_and_drinks/recipes/recipes_grill.dm +++ b/code/modules/food_and_drinks/recipes/recipes_grill.dm @@ -226,3 +226,22 @@ /obj/item/reagent_containers/food/snacks/catfishmeat, ) result = /obj/item/reagent_containers/food/snacks/sushi_Tai + +/datum/recipe/grill/shrimp_skewer + items = list( + /obj/item/reagent_containers/food/snacks/shrimp, + /obj/item/reagent_containers/food/snacks/shrimp, + /obj/item/reagent_containers/food/snacks/shrimp, + /obj/item/reagent_containers/food/snacks/shrimp, + /obj/item/stack/rods, + ) + result = /obj/item/reagent_containers/food/snacks/shrimp_skewer + +/datum/recipe/grill/fish_skewer + reagents = list("flour" = 10) + items = list( + /obj/item/reagent_containers/food/snacks/salmonmeat, + /obj/item/reagent_containers/food/snacks/salmonmeat, + /obj/item/stack/rods, + ) + result = /obj/item/reagent_containers/food/snacks/fish_skewer \ No newline at end of file diff --git a/code/modules/food_and_drinks/recipes/recipes_microwave.dm b/code/modules/food_and_drinks/recipes/recipes_microwave.dm index 81fbe20e3d4..44c572b34e7 100644 --- a/code/modules/food_and_drinks/recipes/recipes_microwave.dm +++ b/code/modules/food_and_drinks/recipes/recipes_microwave.dm @@ -133,6 +133,13 @@ ) result = /obj/item/reagent_containers/food/snacks/baseballburger +/datum/recipe/microwave/cheeseburger + items = list( + /obj/item/reagent_containers/food/snacks/monkeyburger, + /obj/item/reagent_containers/food/snacks/cheesewedge, + ) + result = /obj/item/reagent_containers/food/snacks/cheeseburger + /datum/recipe/microwave/hotdog items = list( /obj/item/reagent_containers/food/snacks/bun, diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm index 37a5e52b466..872bdc8e327 100644 --- a/code/modules/games/cards.dm +++ b/code/modules/games/cards.dm @@ -478,4 +478,5 @@ update_icon() /obj/item/cardhand/pickup(mob/user as mob) + . = ..() update_icon() diff --git a/code/modules/hydroponics/beekeeping/beebox.dm b/code/modules/hydroponics/beekeeping/beebox.dm index 7acd3efc961..371822643a1 100644 --- a/code/modules/hydroponics/beekeeping/beebox.dm +++ b/code/modules/hydroponics/beekeeping/beebox.dm @@ -8,35 +8,36 @@ /mob/proc/bee_friendly() - return 0 + return FALSE /mob/living/simple_animal/hostile/poison/bees/bee_friendly() - return 1 + return TRUE /mob/living/simple_animal/bot/bee_friendly() if(paicard) - return 0 - return 1 + return FALSE + return TRUE /mob/living/simple_animal/diona/bee_friendly() - return 1 + return TRUE /mob/living/carbon/human/bee_friendly() if(isdiona(src)) //bees pollinate plants, duh. - return 1 + return TRUE if((wear_suit && (wear_suit.flags & THICKMATERIAL)) && (head && (head.flags & THICKMATERIAL))) - return 1 - return 0 + return TRUE + return FALSE /obj/structure/beebox name = "apiary" - desc = "Dr Miles Manners is just your average Wasp themed super hero by day, but by night he becomes DR BEES!" + desc = "Dr. Miles Manners is just your average wasp-themed super hero by day, but by night he becomes DR. BEES!" icon = 'icons/obj/hydroponics/equipment.dmi' icon_state = "beebox" - anchored = 1 - density = 1 + anchored = TRUE + density = TRUE + max_integrity = 300 var/mob/living/simple_animal/hostile/poison/bees/queen/queen_bee = null var/list/bees = list() //bees owned by the box, not those inside it var/list/honeycombs = list() @@ -44,8 +45,8 @@ var/bee_resources = 0 -/obj/structure/beebox/New() - ..() +/obj/structure/beebox/Initialize(mapload) + . = ..() processing_objects.Add(src) @@ -66,12 +67,11 @@ var/random_reagent = FALSE -/obj/structure/beebox/premade/New() - ..() - +/obj/structure/beebox/premade/Initialize(mapload) + . = ..() var/datum/reagent/R = null if(random_reagent) - R = get_random_reagent_id() + R = GLOB.chemical_reagents_list[get_random_reagent_id()] queen_bee = new(src) queen_bee.beehome = src @@ -83,7 +83,7 @@ honey_frames += HF for(var/i in 1 to get_max_bees()) - var/mob/living/simple_animal/hostile/poison/bees/worker/B = new(src) + var/mob/living/simple_animal/hostile/poison/bees/B = new(src) bees += B B.beehome = src B.assign_reagent(R) @@ -93,7 +93,7 @@ /obj/structure/beebox/process() - if(queen_bee && (!queen_bee.beegent || !queen_bee.beegent.can_synth)) + if(queen_bee) if(bee_resources >= BEE_RESOURCE_HONEYCOMB_COST) if(honeycombs.len < get_max_honeycomb()) bee_resources = max(bee_resources-BEE_RESOURCE_HONEYCOMB_COST, 0) @@ -109,7 +109,7 @@ if((bee_resources >= BEE_RESOURCE_NEW_BEE_COST && prob(BEE_PROB_NEW_BEE)) || freebee) if(!freebee) bee_resources = max(bee_resources - BEE_RESOURCE_NEW_BEE_COST, 0) - var/mob/living/simple_animal/hostile/poison/bees/worker/B = new(src) + var/mob/living/simple_animal/hostile/poison/bees/B = new(get_turf(src)) B.beehome = src B.assign_reagent(queen_bee.beegent) bees += B @@ -152,14 +152,16 @@ if(istype(I, /obj/item/honey_frame)) var/obj/item/honey_frame/HF = I if(honey_frames.len < BEEBOX_MAX_FRAMES) + if(!user.unEquip(HF)) + return visible_message("[user] adds a frame to the apiary.") - user.unEquip(HF) HF.forceMove(src) honey_frames += HF else to_chat(user, "There's no room for anymore frames in the apiary!") + return - if(istype(I, /obj/item/wrench)) + if(iswrench(I)) if(default_unfasten_wrench(user, I, time = 20)) return @@ -169,25 +171,27 @@ return var/obj/item/queen_bee/qb = I - user.unEquip(qb) if(!qb.queen.beegent || (qb.queen.beegent && qb.queen.beegent.can_synth)) + if(!user.unEquip(qb)) + return qb.queen.forceMove(src) bees += qb.queen queen_bee = qb.queen qb.queen = null else visible_message("The [qb] refuses to settle down. Maybe it's something to do with its reagent?") + return if(queen_bee) visible_message("[user] sets [qb] down inside the apiary, making it [user.p_their()] new home.") var/relocated = 0 for(var/b in bees) - var/mob/living/simple_animal/hostile/poison/bees/worker/B = b + var/mob/living/simple_animal/hostile/poison/bees/B = b if(B.reagent_incompatible(queen_bee)) bees -= B B.beehome = null if(B.loc == src) - B.forceMove(get_turf(src)) + B.forceMove(drop_location()) relocated++ if(relocated) to_chat(user, "This queen has a different reagent to some of the bees who live here, those bees will not return to this apiary!") @@ -196,6 +200,8 @@ to_chat(user, "The queen bee disappeared! bees disappearing has been in the news lately...") qdel(qb) + return + return ..() /obj/structure/beebox/attack_hand(mob/user) @@ -208,7 +214,7 @@ if(B.isqueen) continue if(B.loc == src) - B.forceMove(get_turf(src)) + B.forceMove(drop_location()) B.target = user bees = TRUE if(bees) @@ -254,3 +260,16 @@ QB.forceMove(get_turf(src)) visible_message("[user] removes the queen from the apiary.") queen_bee = null + +/obj/structure/beebox/deconstruct(disassembled = TRUE) + new /obj/item/stack/sheet/wood(loc, 20) + for(var/mob/living/simple_animal/hostile/poison/bees/B in bees) + if(B.loc == src) + B.forceMove(drop_location()) + for(var/obj/item/honey_frame/HF in honey_frames) + HF.forceMove(drop_location()) + honey_frames -= HF + qdel(src) + +/obj/structure/beebox/unwrenched + anchored = FALSE \ No newline at end of file diff --git a/code/modules/hydroponics/grown/banana.dm b/code/modules/hydroponics/grown/banana.dm index 4515b3ad75f..dd56ade79be 100644 --- a/code/modules/hydroponics/grown/banana.dm +++ b/code/modules/hydroponics/grown/banana.dm @@ -30,13 +30,13 @@ playsound(loc, 'sound/items/bikehorn.ogg', 50, 1, -1) sleep(25) if(!user) - return (OXYLOSS) + return OXYLOSS user.say("BANG!") sleep(25) if(!user) - return (OXYLOSS) + return OXYLOSS user.visible_message("[user] laughs so hard [user.p_they()] begin[user.p_s()] to suffocate!") - return (OXYLOSS) + return OXYLOSS /obj/item/grown/bananapeel seed = /obj/item/seeds/banana @@ -52,7 +52,7 @@ /obj/item/grown/bananapeel/suicide_act(mob/user) user.visible_message("[user] is deliberately slipping on the [src.name]! It looks like [user.p_theyre()] trying to commit suicide.") playsound(loc, 'sound/misc/slip.ogg', 50, 1, -1) - return (BRUTELOSS) + return BRUTELOSS // Mimana - invisible sprites are totally a feature! diff --git a/code/modules/hydroponics/grown/flowers.dm b/code/modules/hydroponics/grown/flowers.dm index adbb5f3152c..2b5817788a6 100644 --- a/code/modules/hydroponics/grown/flowers.dm +++ b/code/modules/hydroponics/grown/flowers.dm @@ -199,7 +199,7 @@ qdel(src) /obj/item/grown/novaflower/pickup(mob/living/carbon/human/user) - ..() + . = ..() if(!user.gloves) to_chat(user, "The [name] burns your bare hand!") user.adjustFireLoss(rand(1, 5)) diff --git a/code/modules/hydroponics/grown/kudzu.dm b/code/modules/hydroponics/grown/kudzu.dm index eea80e17e60..64b84649770 100644 --- a/code/modules/hydroponics/grown/kudzu.dm +++ b/code/modules/hydroponics/grown/kudzu.dm @@ -24,7 +24,7 @@ /obj/item/seeds/kudzu/suicide_act(mob/user) user.visible_message("[user] swallows the pack of kudzu seeds! It looks like [user.p_theyre()] trying to commit suicide..") plant(user) - return (BRUTELOSS) + return BRUTELOSS /obj/item/seeds/kudzu/proc/plant(mob/user) if(istype(user.loc, /turf/space)) diff --git a/code/modules/hydroponics/grown/misc.dm b/code/modules/hydroponics/grown/misc.dm index 605f5082522..0d60c7d864f 100644 --- a/code/modules/hydroponics/grown/misc.dm +++ b/code/modules/hydroponics/grown/misc.dm @@ -151,5 +151,4 @@ /obj/item/reagent_containers/food/snacks/grown/cherry_bomb/proc/prime() icon_state = "cherry_bomb_lit" playsound(src, 'sound/goonstation/misc/fuse.ogg', seed.potency, 0) - reagents.chem_temp = 1000 //Sets off the black powder - reagents.handle_reactions() + reagents.set_reagent_temp(1000) //Sets off the black powder \ No newline at end of file diff --git a/code/modules/hydroponics/grown/nettle.dm b/code/modules/hydroponics/grown/nettle.dm index 8bbe4a4e240..444939ca861 100644 --- a/code/modules/hydroponics/grown/nettle.dm +++ b/code/modules/hydroponics/grown/nettle.dm @@ -45,22 +45,22 @@ /obj/item/grown/nettle/suicide_act(mob/user) user.visible_message("[user] is eating some of the [src.name]! It looks like [user.p_theyre()] trying to commit suicide.") - return (BRUTELOSS|TOXLOSS) + return BRUTELOSS|TOXLOSS /obj/item/grown/nettle/pickup(mob/living/user) ..() if(!ishuman(user)) - return 0 + return TRUE var/mob/living/carbon/human/H = user if(H.gloves) - return 0 + return TRUE var/organ = ((H.hand ? "l_":"r_") + "arm") var/obj/item/organ/external/affecting = H.get_organ(organ) if(affecting) if(affecting.receive_damage(0, force)) H.UpdateDamageIcon() to_chat(H, "The nettle burns your bare hand!") - return 1 + return TRUE @@ -95,8 +95,10 @@ force = round((5 + seed.potency / 2.5), 1) /obj/item/grown/nettle/death/pickup(mob/living/carbon/user) - if(..()) - if(prob(50)) + . = ..() + if(. && ishuman(user)) // If the pickup succeeded and is humanoid + var/mob/living/carbon/human/H = user + if(!H.gloves && prob(50)) user.Paralyse(5) to_chat(user, "You are stunned by the Deathnettle when you try picking it up!") diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm index f71cd6ed86a..4ed9d963274 100644 --- a/code/modules/hydroponics/grown/towercap.dm +++ b/code/modules/hydroponics/grown/towercap.dm @@ -153,7 +153,8 @@ Burn() processing_objects.Add(src) -/obj/structure/bonfire/fire_act(exposed_temperature, exposed_volume) +/obj/structure/bonfire/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE) + ..() StartBurning() /obj/structure/bonfire/Crossed(atom/movable/AM) diff --git a/code/modules/hydroponics/hydroitemdefines.dm b/code/modules/hydroponics/hydroitemdefines.dm index a3453585817..14080c62bba 100644 --- a/code/modules/hydroponics/hydroitemdefines.dm +++ b/code/modules/hydroponics/hydroitemdefines.dm @@ -34,7 +34,7 @@ /obj/item/reagent_containers/spray/weedspray/suicide_act(mob/user) user.visible_message("[user] is huffing the [src.name]! It looks like [user.p_theyre()] trying to commit suicide.") - return (TOXLOSS) + return TOXLOSS /obj/item/reagent_containers/spray/pestspray // -- Skie desc = "It's some pest eliminator spray! Do not inhale!" @@ -56,7 +56,7 @@ /obj/item/reagent_containers/spray/pestspray/suicide_act(mob/user) user.visible_message("[user] is huffing the [src.name]! It looks like [user.p_theyre()] trying to commit suicide.") - return (TOXLOSS) + return TOXLOSS /obj/item/cultivator name = "cultivator" @@ -91,7 +91,7 @@ /obj/item/hatchet/suicide_act(mob/user) user.visible_message("[user] is chopping at [user.p_them()]self with the [name]! It looks like [user.p_theyre()] trying to commit suicide.") playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1) - return (BRUTELOSS) + return BRUTELOSS /obj/item/hatchet/unathiknife name = "duelling knife" @@ -126,7 +126,7 @@ if(affecting) affecting.droplimb(1, DROPLIMB_SHARP) playsound(loc, pick('sound/misc/desceration-01.ogg','sound/misc/desceration-02.ogg','sound/misc/desceration-01.ogg'), 50, 1, -1) - return (BRUTELOSS) + return BRUTELOSS /obj/item/scythe/pre_attackby(atom/A, mob/living/user, params) if(swiping || !istype(A, /obj/structure/spacevine) || get_turf(A) == get_turf(user)) diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm index 1a9dc008376..2e95d21e10b 100644 --- a/code/modules/hydroponics/plant_genes.dm +++ b/code/modules/hydroponics/plant_genes.dm @@ -409,11 +409,8 @@ var/datum/effect_system/smoke_spread/chem/S = new var/splat_location = get_turf(target) var/smoke_amount = round(sqrt(G.seed.potency * 0.1), 1) - S.attach(splat_location) - S.set_up(G.reagents, 2, 0, splat_location) + S.set_up(G.reagents, splat_location) S.start(smoke_amount) - if(G && G.reagents) - G.reagents.clear_reagents() /datum/plant_gene/trait/plant_type // Parent type name = "you shouldn't see this" diff --git a/code/modules/martial_arts/krav_maga.dm b/code/modules/martial_arts/krav_maga.dm index 9e889bdce7a..80498117343 100644 --- a/code/modules/martial_arts/krav_maga.dm +++ b/code/modules/martial_arts/krav_maga.dm @@ -132,13 +132,13 @@ datum/martial_art/krav_maga/grab_act(var/mob/living/carbon/human/A, var/mob/livi if(D.hand) if(istype(D.l_hand, /obj/item)) var/obj/item/I = D.l_hand - D.drop_item() - A.put_in_hands(I) + if(D.drop_item()) + A.put_in_hands(I) else if(istype(D.r_hand, /obj/item)) var/obj/item/I = D.r_hand - D.drop_item() - A.put_in_hands(I) + if(D.drop_item()) + A.put_in_hands(I) D.visible_message("[A] has disarmed [D]!", \ "[A] has disarmed [D]!") playsound(D, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) diff --git a/code/modules/martial_arts/martial.dm b/code/modules/martial_arts/martial.dm index aed823b372b..2940e810ade 100644 --- a/code/modules/martial_arts/martial.dm +++ b/code/modules/martial_arts/martial.dm @@ -267,7 +267,7 @@ H.Weaken(4) if(H.staminaloss && !H.sleeping) var/total_health = (H.health - H.staminaloss) - if(total_health <= config.health_threshold_crit && !H.stat) + if(total_health <= HEALTH_THRESHOLD_CRIT && !H.stat) H.visible_message("[user] delivers a heavy hit to [H]'s head, knocking [H.p_them()] out cold!", \ "[user] knocks you unconscious!") H.SetSleeping(30) diff --git a/code/modules/mining/ore.dm b/code/modules/mining/ore.dm index 08b81e1fd78..dda5fb47f78 100644 --- a/code/modules/mining/ore.dm +++ b/code/modules/mining/ore.dm @@ -52,7 +52,7 @@ F.attackby(OB, AM) return ..() -/obj/item/stack/ore/fire_act() +/obj/item/stack/ore/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE) ..() if(isnull(refined_type)) return diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 7d396a7e7ea..923c81c53b1 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -49,7 +49,7 @@ var/list/image/ghost_darkness_images = list() //this is a list of images for thi T = get_turf(body) //Where is the body located? attack_log = body.attack_log //preserve our attack logs by copying them to our ghost - var/mutable_appearance/MA = copy_appearance(body) + var/mutable_appearance/MA = copy_appearance(body) if(body.mind && body.mind.name) MA.name = body.mind.name else if(body.real_name) @@ -148,6 +148,8 @@ Works together with spawning an observer, noted above. /mob/proc/ghostize(var/flags = GHOST_CAN_REENTER) if(key) + if(player_logged) //if they have disconnected we want to remove their SSD overlay + overlays -= image('icons/effects/effects.dmi', icon_state = "zzz_glow") if(GLOB.non_respawnable_keys[ckey]) flags &= ~GHOST_CAN_REENTER var/mob/dead/observer/ghost = new(src, flags) //Transfer safety to observer spawning proc. @@ -177,30 +179,44 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(P) if(TOO_EARLY_TO_GHOST) warningmsg = "It's too early in the shift to enter cryo" - // If it's not too early, we'll skip straight to ghosting out without penalty else if(suiciding && TOO_EARLY_TO_GHOST) warningmsg = "You have committed suicide too early in the round" else if(stat != DEAD) warningmsg = "You are alive" + if(isAI(src)) + warningmsg = "You are a living AI! You should probably use OOC -> Wipe Core instead." else if(GLOB.non_respawnable_keys[ckey]) warningmsg = "You have lost your right to respawn" - if(!warningmsg) - ghostize(1) - else + if(warningmsg) var/response var/alertmsg = "Are you -sure- you want to ghost?\n([warningmsg]. If you ghost now, you probably won't be able to rejoin the round! You can't change your mind, so choose wisely!)" response = alert(src, alertmsg,"Are you sure you want to ghost?","Stay in body","Ghost") if(response != "Ghost") - return //didn't want to ghost after-all - StartResting() - var/mob/dead/observer/ghost = ghostize(0) //0 parameter is so we can never re-enter our body, "Charlie, you can never come baaaack~" :3 - ghost.timeofdeath = world.time // Because the living mob won't have a time of death and we want the respawn timer to work properly. + return + + if(stat == CONSCIOUS) + if(!is_admin_level(z)) + player_ghosted = 1 + if(mind && mind.special_role) + message_admins("[key_name_admin(src)] has ghosted while alive, with special_role: [mind.special_role]") + + if(warningmsg) + // Not respawnable + var/mob/dead/observer/ghost = ghostize(0) // 0 parameter stops them re-entering their body + ghost.timeofdeath = world.time // Because the living mob won't have a time of death and we want the respawn timer to work properly. + else + // Respawnable + ghostize(1) + + // If mob in morgue tray, update tray var/obj/structure/morgue/Morgue = locate() in M.loc if(istype(M.loc, /obj/structure/morgue)) Morgue = M.loc if(Morgue) Morgue.update() + + // If mob in cryopod, despawn mob if(P) if(!P.control_computer) P.find_control_computer(urgent=1) @@ -208,7 +224,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp P.despawn_occupant() return - /mob/dead/observer/Move(NewLoc, direct) following = null dir = direct @@ -235,9 +250,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp ..() -/mob/dead/observer/experience_pressure_difference() - return 0 - /mob/dead/observer/can_use_hands() return 0 /mob/dead/observer/Stat() diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index e53e3c9fd4d..471f82c1511 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -35,7 +35,7 @@ /mob/proc/put_in_l_hand(var/obj/item/W) if(!put_in_hand_check(W)) return 0 - if(!l_hand) + if(!l_hand && has_left_hand()) W.forceMove(src) //TODO: move to equipped? l_hand = W W.layer = 20 //TODO: move to equipped? @@ -51,7 +51,7 @@ /mob/proc/put_in_r_hand(var/obj/item/W) if(!put_in_hand_check(W)) return 0 - if(!r_hand) + if(!r_hand && has_right_hand()) W.forceMove(src) r_hand = W W.layer = 20 diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm index fa5ba4a62ad..8a7c017818a 100644 --- a/code/modules/mob/language.dm +++ b/code/modules/mob/language.dm @@ -246,8 +246,8 @@ syllables = list("hs","zt","kr","st","sh") /datum/language/diona/get_random_name() - var/new_name = "[pick(list("To Sleep Beneath", "Wind Over", "Embrace of", "Dreams of", "Witnessing", "To Walk Beneath", "Approaching the", "Glimmer of", "The Ripple of", "Colors of", "The Still of", "Silence of", "Gentle Breeze of", "Glistening Waters under", "Child of", "Blessed Plant-ling of", "Grass-Walker of", "Element of", "Spawn of"))]" - new_name += " [pick(list("the Void", "the Sky", "Encroaching Night", "Planetsong", "Starsong", "the Wandering Star", "the Empty Day", "Daybreak", "Nightfall", "the Rain", "the Stars", "the Waves", "Dusk", "Night", "the Wind", "the Summer Wind", "the Blazing Sun", "the Scorching Sun", "Eternal Fields", "the Soothing Plains", "the Undying Fiona", "Mother Nature's Bousum"))]" + var/new_name = "[pick(list("To Sleep Beneath", "Wind Over", "Embrace Of", "Dreams Of", "Witnessing", "To Walk Beneath", "Approaching The", "Glimmer Of", "The Ripple Of", "Colors Of", "The Still Of", "Silence Of", "Gentle Breeze Of", "Glistening Waters Under", "Child Of", "Blessed Plant-Ling Of", "Grass-Walker Of", "Element Of", "Spawn Of"))]" + new_name += " [pick(list("The Void", "The Sky", "Encroaching Night", "Planetsong", "Starsong", "The Wandering Star", "The Empty Day", "Daybreak", "Nightfall", "The Rain", "The Stars", "The Waves", "Dusk", "Night", "The Wind", "The Summer Wind", "The Blazing Sun", "The Scorching Sun", "Eternal Fields", "The Soothing Plains", "The Undying Fiona", "Mother Nature's Bousum"))]" return new_name /datum/language/trinary diff --git a/code/modules/mob/living/carbon/_defines.dm b/code/modules/mob/living/carbon/_defines.dm index 163ce8f7c8d..a5a524f86ed 100644 --- a/code/modules/mob/living/carbon/_defines.dm +++ b/code/modules/mob/living/carbon/_defines.dm @@ -1,10 +1,9 @@ -//NOTE: Breathing happens once per FOUR TICKS, unless the last breath fails. In which case it happens once per ONE TICK! So oxyloss healing is done once per 4 ticks while oxyloss damage is applied once per tick! -#define HUMAN_MAX_OXYLOSS 3 //Defines how much oxyloss humans can get per tick. A tile with no air at all (such as space) applies this value, otherwise it's a percentage of it. -#define HUMAN_CRIT_MAX_OXYLOSS ( (tickerProcess.getLastTickerTimeDuration()) / 3) //The amount of damage you'll get when in critical condition. We want this to be a 5 minute deal = 300s. There are 100HP to get through, so (1/3)*last_tick_duration per second. Breaths however only happen every 4 ticks. +//NOTE: Breathing happens once EVERY OTHER TICK. +#define HUMAN_MAX_OXYLOSS 5 //Defines how much oxyloss humans can get per tick. A tile with no air at all (such as space) applies this value, otherwise it's a percentage of it. #define HEAT_DAMAGE_LEVEL_1 2 //Amount of damage applied when your body temperature just passes the 360.15k safety point #define HEAT_DAMAGE_LEVEL_2 3 //Amount of damage applied when your body temperature passes the 400K point -#define HEAT_DAMAGE_LEVEL_3 10 //Amount of damage applied when your body temperature passes the 1000K point +#define HEAT_DAMAGE_LEVEL_3 5 //Amount of damage applied when your body temperature passes the 1000K point #define COLD_DAMAGE_LEVEL_1 0.5 //Amount of damage applied when your body temperature just passes the 260.15k safety point #define COLD_DAMAGE_LEVEL_2 1.5 //Amount of damage applied when your body temperature passes the 200K point diff --git a/code/modules/mob/living/carbon/alien/humanoid/life.dm b/code/modules/mob/living/carbon/alien/humanoid/life.dm index 6012a8fb7f3..3af2250bbbd 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/life.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/life.dm @@ -46,13 +46,13 @@ if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP SetSilence(0) else //ALIVE. LIGHTS ARE ON - if(health < config.health_threshold_dead || !get_int_organ(/obj/item/organ/internal/brain)) + if(health < HEALTH_THRESHOLD_DEAD && check_death_method() || !get_int_organ(/obj/item/organ/internal/brain)) death() SetSilence(0) return 1 //UNCONSCIOUS. NO-ONE IS HOME - if((getOxyLoss() > 50) || (config.health_threshold_crit >= health)) + if((getOxyLoss() > 50) || (HEALTH_THRESHOLD_CRIT >= health && check_death_method())) if(health <= 20 && prob(1)) emote("gasp") if(!reagents.has_reagent("epinephrine")) diff --git a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm index 44287493718..bdc2ee31f77 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm @@ -18,7 +18,7 @@ if(stat == DEAD) //If we mostly took damage from fire - if(fireloss > 125) + if(getFireLoss() > 125) icon_state = "alien[caste]_husked" pixel_y = 0 else diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm index a64750ad93d..5ebaaffac0c 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva.dm @@ -93,6 +93,9 @@ /mob/living/carbon/alien/larva/show_inv(mob/user as mob) return +/mob/living/carbon/alien/larva/start_pulling(atom/movable/AM, state, force = move_force, supress_message = FALSE) + return FALSE + /* Commented out because it's duplicated in life.dm /mob/living/carbon/alien/larva/proc/grow() // Larvae can grow into full fledged Xenos if they survive long enough -- TLE if(icon_state == "larva_l" && !canmove) // This is a shit death check. It is made of shit and death. Fix later. diff --git a/code/modules/mob/living/carbon/alien/larva/life.dm b/code/modules/mob/living/carbon/alien/larva/life.dm index a4b783e08fb..a0668db8327 100644 --- a/code/modules/mob/living/carbon/alien/larva/life.dm +++ b/code/modules/mob/living/carbon/alien/larva/life.dm @@ -19,7 +19,7 @@ return 1 //UNCONSCIOUS. NO-ONE IS HOME - if( (getOxyLoss() > 25) || (config.health_threshold_crit >= health) ) + if((getOxyLoss() > 25) || (HEALTH_THRESHOLD_CRIT >= health && check_death_method())) //if( health <= 20 && prob(1) ) // spawn(0) // emote("gasp") diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index 5294e3bda91..04dcb0c60ef 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -65,9 +65,9 @@ var/const/MAX_ACTIVE_TIME = 400 return /obj/item/clothing/mask/facehugger/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) + ..() if(exposed_temperature > 300) Die() - return /obj/item/clothing/mask/facehugger/equipped(mob/M) Attach(M) diff --git a/code/modules/mob/living/carbon/brain/life.dm b/code/modules/mob/living/carbon/brain/life.dm index 2ac3b3c4d6b..d0cf06f1bf7 100644 --- a/code/modules/mob/living/carbon/brain/life.dm +++ b/code/modules/mob/living/carbon/brain/life.dm @@ -32,7 +32,7 @@ . = ..() if(.) - if(!container && (health < config.health_threshold_dead || ((world.time - timeofhostdeath) > config.revival_brain_life))) + if(!container && (health < HEALTH_THRESHOLD_DEAD && check_death_method() || ((world.time - timeofhostdeath) > config.revival_brain_life))) death() return 0 diff --git a/code/modules/mob/living/carbon/brain/robotic_brain.dm b/code/modules/mob/living/carbon/brain/robotic_brain.dm index c294a11c999..6528d9c252e 100644 --- a/code/modules/mob/living/carbon/brain/robotic_brain.dm +++ b/code/modules/mob/living/carbon/brain/robotic_brain.dm @@ -161,7 +161,7 @@ if(jobban_isbanned(O, "Cyborg") || jobban_isbanned(O,"nonhumandept")) to_chat(O, "You are job banned from this role.") return - to_chat(O., "You've been added to the list of ghosts that may become this [src]. Click again to unvolunteer.") + to_chat(O, "You've been added to the list of ghosts that may become this [src]. Click again to unvolunteer.") ghost_volunteers.Add(O) diff --git a/code/modules/mob/living/carbon/brain/update_status.dm b/code/modules/mob/living/carbon/brain/update_status.dm index 431d1eea0c3..6fec51bb07b 100644 --- a/code/modules/mob/living/carbon/brain/update_status.dm +++ b/code/modules/mob/living/carbon/brain/update_status.dm @@ -3,12 +3,12 @@ return // if(health <= min_health) if(stat == DEAD) - if(container && health > config.health_threshold_dead) + if(container && health > HEALTH_THRESHOLD_DEAD) update_revive() create_debug_log("revived, trigger reason: [reason]") return else - if(!container || health <= config.health_threshold_dead) + if(!container || health <= HEALTH_THRESHOLD_DEAD && check_death_method()) // Considered "dead" without any external apparatus death() create_debug_log("died, trigger reason: [reason]") diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 0e921e7953e..0f1c5d91df1 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -209,7 +209,7 @@ /mob/living/carbon/proc/help_shake_act(mob/living/carbon/M) add_attack_logs(M, src, "Shaked", ATKLOG_ALL) - if(health >= config.health_threshold_crit) + if(health >= HEALTH_THRESHOLD_CRIT) if(src == M && ishuman(src)) var/mob/living/carbon/human/H = src visible_message( \ @@ -442,6 +442,10 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, if(!do_after(src, 45, target = src)) return + if(buckled) + to_chat(src, "You cannot crawl into a vent while buckled to something!") + return + if(!client) return diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 5d816ed625e..4ecd81e1338 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -22,9 +22,8 @@ var/wetlevel = 0 //how wet the mob is - var/failed_last_breath = FALSE //This is used to determine if the mob failed a breath. If they did fail a brath, they will attempt to breathe each tick, otherwise just once per 4 ticks. var/co2overloadtime = null var/dreaming = 0 //How many dream images we have left to send var/nightmare = 0 - blood_volume = BLOOD_VOLUME_NORMAL + blood_volume = BLOOD_VOLUME_NORMAL \ No newline at end of file diff --git a/code/modules/mob/living/carbon/give.dm b/code/modules/mob/living/carbon/give.dm index 473715367b4..c0dba9b77e5 100644 --- a/code/modules/mob/living/carbon/give.dm +++ b/code/modules/mob/living/carbon/give.dm @@ -4,22 +4,15 @@ if(!iscarbon(target)) //something is bypassing the give arguments, no clue what, adding a sanity check JIC to_chat(usr, "Wait a second... \the [target] HAS NO HANDS! AHH!")//cheesy messages ftw + return + if(target.incapacitated() || usr.incapacitated() || target.client == null) return - if(target.stat == 2 || usr.stat == 2|| target.client == null) - return - var/obj/item/I - if(!usr.hand && usr.r_hand == null) - to_chat(usr, " You don't have anything in your right hand to give to [target.name]") - return - if(usr.hand && usr.l_hand == null) - to_chat(usr, " You don't have anything in your left hand to give to [target.name]") - return - if(usr.hand) - I = usr.l_hand - else if(!usr.hand) - I = usr.r_hand + + var/obj/item/I = get_active_hand() + if(!I) + to_chat(usr, " You don't have anything in your hand to give to [target.name]") return if((I.flags & NODROP) || (I.flags & ABSTRACT)) to_chat(usr, "That's not exactly something you can give.") @@ -29,35 +22,30 @@ if("Yes") if(!I) return + if(target.incapacitated() || usr.incapacitated()) + return if(!Adjacent(target)) to_chat(usr, " You need to stay in reaching distance while giving an object.") to_chat(target, " [usr.name] moved too far away.") return - if((usr.hand && usr.l_hand != I) || (!usr.hand && usr.r_hand != I)) + if((I.flags & NODROP) || (I.flags & ABSTRACT)) + to_chat(usr, "[I] stays stuck to your hand when you try to give it!") + to_chat(target, "[I] stays stuck to [usr.name]'s hand when you try to take it!") + return + if(I != get_active_hand()) to_chat(usr, " You need to keep the item in your active hand.") - to_chat(target, " [usr.name] seem to have given up on giving \the [I.name] to you.") + to_chat(target, " [usr.name] seem to have given up on giving [I] to you.") return if(target.r_hand != null && target.l_hand != null) to_chat(target, " Your hands are full.") to_chat(usr, " Their hands are full.") return - else - usr.drop_item() - if(target.r_hand == null) - target.r_hand = I - else - target.l_hand = I - I.loc = target - I.layer = 20 - I.plane = HUD_PLANE + usr.unEquip(I) + target.put_in_hands(I) I.add_fingerprint(target) - src.update_inv_l_hand() - src.update_inv_r_hand() - target.update_inv_l_hand() - target.update_inv_r_hand() - target.visible_message(" [usr.name] handed \the [I.name] to [target.name].") + target.visible_message(" [usr.name] handed [I] to [target.name].") I.on_give(usr, target) if("No") - target.visible_message(" [usr.name] tried to hand [I.name] to [target.name] but [target.name] didn't want it.") + target.visible_message(" [usr.name] tried to hand [I] to [target.name] but [target.name] didn't want it.") else to_chat(usr, " [target.name]'s hands are full.") diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 3e1c874a067..442d7aaf044 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -680,6 +680,14 @@ message = "[src] trembles." m_type = 1 + if("shudder", "shudders") + message = "[src] shudders." + m_type = 1 + + if("bshake", "bshakes") + message = "[src] shakes." + m_type = 1 + if("sneeze", "sneezes") if(miming) message = "[src] sneezes." diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 03726353022..aa714f0d527 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -363,7 +363,7 @@ for(var/datum/data/record/R in data_core.security) if(R.fields["id"] == E.fields["id"]) criminal = R.fields["criminal"] - var/criminal_status = hasHUD(user, "read_only_security") ? "\[[criminal]\]" : "\[[criminal]\]" + var/criminal_status = hasHUD(user, "read_only_security") ? "\[[criminal]\]" : "\[[criminal]\]" msg += "Criminal status: [criminal_status]\n" msg += "Security records: \[View\] \[Add comment\]\n" diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 5550378984a..09787bbf73b 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1651,6 +1651,9 @@ Eyes need to have significantly high darksight to shine unless the mob has the X ..() /mob/living/carbon/human/proc/do_cpr(mob/living/carbon/human/H) + if(H == src) + to_chat(src, "You cannot perform CPR on yourself!") + return if(H.stat == DEAD || (H.status_flags & FAKEDEATH)) to_chat(src, "[H.name] is dead!") return @@ -1662,25 +1665,29 @@ Eyes need to have significantly high darksight to shine unless the mob has the X return if((head && (head.flags_cover & HEADCOVERSMOUTH)) || (wear_mask && (wear_mask.flags_cover & MASKCOVERSMOUTH) && !wear_mask.mask_adjusted)) to_chat(src, "Remove your mask first!") - return 0 + return if((H.head && (H.head.flags_cover & HEADCOVERSMOUTH)) || (H.wear_mask && (H.wear_mask.flags_cover & MASKCOVERSMOUTH) && !H.wear_mask.mask_adjusted)) to_chat(src, "Remove [H.p_their()] mask first!") - return 0 - visible_message("[src] is trying to perform CPR on [H.name]!", \ - "You try to perform CPR on [H.name]!") + return + if(H.receiving_cpr) // To prevent spam stacking + to_chat(src, "They are already receiving CPR!") + return + visible_message("[src] is trying to perform CPR on [H.name]!", "You try to perform CPR on [H.name]!") + H.receiving_cpr = TRUE if(do_mob(src, H, 40)) - if(H.health > config.health_threshold_dead && H.health <= config.health_threshold_crit) - var/suff = min(H.getOxyLoss(), 7) - H.adjustOxyLoss(-suff) + if(H.health <= HEALTH_THRESHOLD_CRIT) + H.adjustOxyLoss(-15) + H.SetLoseBreath(0) + H.AdjustParalysis(-1) H.updatehealth("cpr") - visible_message("[src] performs CPR on [H.name]!", \ - "You perform CPR on [H.name].") + visible_message("[src] performs CPR on [H.name]!", "You perform CPR on [H.name].") to_chat(H, "You feel a breath of fresh air enter your lungs. It feels good.") - to_chat(src, "Repeat at least every 7 seconds.") + H.receiving_cpr = FALSE add_attack_logs(src, H, "CPRed", ATKLOG_ALL) - return 1 + return TRUE else + H.receiving_cpr = FALSE to_chat(src, "You need to stay still while performing CPR!") /mob/living/carbon/human/canBeHandcuffed() @@ -1696,7 +1703,7 @@ Eyes need to have significantly high darksight to shine unless the mob has the X return FALSE /mob/living/carbon/human/InCritical() - return (health <= config.health_threshold_crit && stat == UNCONSCIOUS) + return (health <= HEALTH_THRESHOLD_CRIT && stat == UNCONSCIOUS) /mob/living/carbon/human/IsAdvancedToolUser() @@ -2000,4 +2007,4 @@ Eyes need to have significantly high darksight to shine unless the mob has the X var/obj/item/organ/internal/lantern/O = get_int_organ(/obj/item/organ/internal/lantern) if(O && O.glowing) O.toggle_biolum(TRUE) - visible_message("[src] is engulfed in shadows and fades into the darkness.", "A sense of dread washes over you as you suddenly dim dark.") + visible_message("[src] is engulfed in shadows and fades into the darkness.", "A sense of dread washes over you as you suddenly dim dark.") \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index b858cca130a..7e9739a816d 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -15,7 +15,7 @@ health = maxHealth - getOxyLoss() - getToxLoss() - getCloneLoss() - total_burn - total_brute //TODO: fix husking - if(((maxHealth - total_burn) < config.health_threshold_dead) && stat == DEAD) + if(((maxHealth - total_burn) < HEALTH_THRESHOLD_DEAD) && stat == DEAD) ChangeToHusk() update_stat("updatehealth([reason])") med_hud_set_health() @@ -171,11 +171,17 @@ // Defined here solely to take species flags into account without having to recast at mob/living level. /mob/living/carbon/human/adjustOxyLoss(amount) + if(NO_BREATHE in dna.species.species_traits) + oxyloss = 0 + return FALSE if(dna.species && amount > 0) amount = amount * dna.species.oxy_mod . = ..() /mob/living/carbon/human/setOxyLoss(amount) + if(NO_BREATHE in dna.species.species_traits) + oxyloss = 0 + return FALSE if(dna.species && amount > 0) amount = amount * dna.species.oxy_mod . = ..() diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 965a2c81ab2..84764bfddaa 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -513,3 +513,12 @@ emp_act return TRUE if(check_mask && wear_mask && (wear_mask.flags_cover & MASKCOVERSMOUTH)) return TRUE + +/mob/living/carbon/human/proc/reagent_safety_check(hot = TRUE) + if(wear_mask) + to_chat(src, "Your [wear_mask.name] protects you from the [hot ? "hot" : "cold"] liquid!") + return FALSE + if(head) + to_chat(src, "Your [head.name] protects you from the [hot ? "hot" : "cold"] liquid!") + return FALSE + return TRUE \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 22a9d40f6fd..9bd463b73bc 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -64,6 +64,7 @@ var/global/default_martial_art = new/datum/martial_art var/check_mutations=0 // Check mutations on next life tick var/heartbeat = 0 + var/receiving_cpr = FALSE var/fire_dmi = 'icons/mob/OnFire.dmi' var/fire_sprite = "Standing" diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 7d83c7eaa1d..79b41e47cc3 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -434,11 +434,11 @@ if(slot_l_hand) if(l_hand) return 0 - return 1 + return !incapacitated() if(slot_r_hand) if(r_hand) return 0 - return 1 + return !incapacitated() if(slot_wear_mask) if(wear_mask) return 0 diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 8d0261528ed..3571deb392a 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -10,10 +10,8 @@ update_mutations() check_mutations=0 - handle_shock() handle_pain() handle_heartbeat() - handle_heartattack() handle_drunk() dna.species.handle_life(src) @@ -39,6 +37,17 @@ if(life_tick == 1) regenerate_icons() // Make sure the inventory updates + handle_ghosted() + +/mob/living/carbon/human/proc/handle_ghosted() + if(player_ghosted > 0 && stat == CONSCIOUS && job && !restrained()) + if(key) + player_ghosted = 0 + else + player_ghosted++ + if(player_ghosted % 150 == 0) + force_cryo_human(src) + /mob/living/carbon/human/calculate_affecting_pressure(var/pressure) ..() var/pressure_difference = abs( pressure - ONE_ATMOSPHERE ) @@ -141,15 +150,6 @@ if(3) emote("drool") - if(getBrainLoss() >= 100 && stat != DEAD) //you lapse into a coma and die without immediate aid; RIP. -Fox - Weaken(20) - AdjustLoseBreath(10) - AdjustSilence(2) - - if(getBrainLoss() >= 120 && stat != DEAD) //they died from stupidity--literally. -Fox - visible_message("[src] goes limp, [p_their()] facial expression utterly blank.") - death() - /mob/living/carbon/human/handle_mutations_and_radiation() for(var/datum/dna/gene/gene in dna_genes) if(!gene.block) @@ -242,12 +242,10 @@ var/obj/item/organ/internal/L = get_organ_slot("lungs") if(!L || L && (L.status & ORGAN_DEAD)) - if(health >= config.health_threshold_crit) + if(health >= HEALTH_THRESHOLD_CRIT) adjustOxyLoss(HUMAN_MAX_OXYLOSS + 1) else if(!(NOCRITDAMAGE in dna.species.species_traits)) - adjustOxyLoss(HUMAN_CRIT_MAX_OXYLOSS) - - failed_last_breath = TRUE + adjustOxyLoss(HUMAN_MAX_OXYLOSS) if(dna.species) var/datum/species/S = dna.species @@ -270,7 +268,7 @@ // USED IN DEATHWHISPERS /mob/living/carbon/human/proc/isInCrit() // Health is in deep shit and we're not already dead - return health <= 0 && stat != 2 + return health <= HEALTH_THRESHOLD_CRIT && stat != DEAD /mob/living/carbon/human/get_breath_from_internal(volume_needed) //making this call the parent would be far too complicated @@ -791,6 +789,70 @@ handle_organs() + if(getBrainLoss() >= 120 || (health + (getOxyLoss() / 2)) <= -500) + visible_message("[src] goes limp, their facial expression utterly blank.") + death() + return + + if(getBrainLoss() >= 100) // braindeath + AdjustLoseBreath(10, bound_lower = 0, bound_upper = 25) + Weaken(30) + + if(!check_death_method()) + if(health <= HEALTH_THRESHOLD_DEAD) + var/deathchance = min(99, ((getBrainLoss() * -5) + (health + (getOxyLoss() / 2))) * -0.01) + if(prob(deathchance)) + death() + return + + if(health <= HEALTH_THRESHOLD_CRIT) + if(prob(5)) + emote(pick("faint", "collapse", "cry", "moan", "gasp", "shudder", "shiver")) + AdjustStuttering(5, bound_lower = 0, bound_upper = 5) + EyeBlurry(5) + if(prob(7)) + AdjustConfused(2) + if(prob(5)) + Paralyse(2) + switch(health) + if(-INFINITY to -100) + adjustOxyLoss(1) + if(prob(health * -0.1)) + if(ishuman(src)) + var/mob/living/carbon/human/H = src + H.set_heartattack(TRUE) + if(prob(health * -0.2)) + var/datum/disease/D = new /datum/disease/critical/heart_failure + ForceContractDisease(D) + Paralyse(5) + if(-99 to -80) + adjustOxyLoss(1) + if(prob(4)) + to_chat(src, "Your chest hurts...") + Paralyse(2) + var/datum/disease/D = new /datum/disease/critical/heart_failure + ForceContractDisease(D) + if(-79 to -50) + adjustOxyLoss(1) + if(prob(10)) + var/datum/disease/D = new /datum/disease/critical/shock + ForceContractDisease(D) + if(prob(health * -0.08)) + var/datum/disease/D = new /datum/disease/critical/heart_failure + ForceContractDisease(D) + if(prob(6)) + to_chat(src, "You feel [pick("horrible pain", "awful", "like shit", "absolutely awful", "like death", "like you are dying", "nothing", "warm", "sweaty", "tingly", "really, really bad", "horrible")]!") + Weaken(3) + if(prob(3)) + Paralyse(2) + if(-49 to 0) + adjustOxyLoss(1) + if(prob(3)) + var/datum/disease/D = new /datum/disease/critical/shock + ForceContractDisease(D) + if(prob(5)) + to_chat(src, "You feel [pick("terrible", "awful", "like shit", "sick", "numb", "cold", "sweaty", "tingly", "horrible")]!") + Weaken(3) else //dead SetSilence(0) @@ -962,7 +1024,7 @@ return if(H.is_robotic()) //Handle robotic hearts specially with a wuuuubb. This also applies to machine-people. - if(shock_stage >= 10 || istype(get_turf(src), /turf/space)) + if(isinspace()) //PULSE_THREADY - maximum value for pulse, currently it 5. //High pulse value corresponds to a fast rate of heartbeat. //Divided by 2, otherwise it is too slow. @@ -980,7 +1042,7 @@ if(pulse == PULSE_NONE) return - if(pulse >= PULSE_2FAST || shock_stage >= 10 || istype(get_turf(src), /turf/space)) + if(pulse >= PULSE_2FAST || isinspace()) //PULSE_THREADY - maximum value for pulse, currently it 5. //High pulse value corresponds to a fast rate of heartbeat. //Divided by 2, otherwise it is too slow. @@ -999,7 +1061,7 @@ */ /mob/living/carbon/human/proc/can_heartattack() - if(NO_BLOOD in dna.species.species_traits) + if((NO_BLOOD in dna.species.species_traits) && !dna.species.forced_heartattack) return FALSE if(NO_INTORGANS in dna.species.species_traits) return FALSE @@ -1026,16 +1088,19 @@ heart.beating = !status -/mob/living/carbon/human/proc/handle_heartattack() +/mob/living/carbon/human/handle_heartattack() if(!can_heartattack() || !undergoing_cardiac_arrest() || reagents.has_reagent("corazone")) return - AdjustLoseBreath(2, bound_lower = 0, bound_upper = 3) - adjustOxyLoss(5) - Paralyse(4) - adjustBruteLoss(2) + if(getOxyLoss()) + adjustBrainLoss(3) + else if(prob(10)) + adjustBrainLoss(1) + Weaken(5) + AdjustLoseBreath(20, bound_lower = 0, bound_upper = 25) + adjustOxyLoss(20) // Need this in species. //#undef HUMAN_MAX_OXYLOSS -//#undef HUMAN_CRIT_MAX_OXYLOSS +//#undef HUMAN_CRIT_MAX_OXYLOSS \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/login.dm b/code/modules/mob/living/carbon/human/login.dm index e16c67a56d0..2964166e68f 100644 --- a/code/modules/mob/living/carbon/human/login.dm +++ b/code/modules/mob/living/carbon/human/login.dm @@ -1,4 +1,6 @@ /mob/living/carbon/human/Login() + if(player_logged) + overlays -= image('icons/effects/effects.dmi', icon_state = "zzz_glow") ..() if(dna.species && dna.species.ventcrawler) diff --git a/code/modules/mob/living/carbon/human/logout.dm b/code/modules/mob/living/carbon/human/logout.dm new file mode 100644 index 00000000000..2dae7ea5b9a --- /dev/null +++ b/code/modules/mob/living/carbon/human/logout.dm @@ -0,0 +1,4 @@ +/mob/living/carbon/human/Logout() + ..() + if(mind && mind.active && stat != DEAD) + overlays += image('icons/effects/effects.dmi', icon_state = "zzz_glow") \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index ff8083f8093..1be6fc60a25 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -91,7 +91,7 @@ var/obj/item/organ/internal/L = get_organ_slot("lungs") if((breathes && !L) || breathes && L && (L.status & ORGAN_DEAD)) return FALSE - if(oxyloss > 10 || losebreath >= 4) + if(getOxyLoss() > 10 || losebreath >= 4) emote("gasp") return FALSE if(mind) diff --git a/code/modules/mob/living/carbon/human/shock.dm b/code/modules/mob/living/carbon/human/shock.dm deleted file mode 100644 index e2d5dd79cec..00000000000 --- a/code/modules/mob/living/carbon/human/shock.dm +++ /dev/null @@ -1,75 +0,0 @@ -/mob/living/carbon/human/var/traumatic_shock = 0 -/mob/living/carbon/human/var/shock_stage = 0 - -// proc to find out in how much pain the mob is at the moment -/mob/living/carbon/human/proc/updateshock() - traumatic_shock = getOxyLoss() + getToxLoss() + getFireLoss() + getBruteLoss() + getCloneLoss() - - // broken or ripped off organs will add quite a bit of pain - for(var/thing in bodyparts) - var/obj/item/organ/external/BP = thing - if(BP.status & ORGAN_BROKEN && !(BP.status & ORGAN_SPLINTED) || BP.open) - traumatic_shock += 15 - - if(reagents) - for(var/datum/reagent/R in reagents.reagent_list) - if(R.shock_reduction) - traumatic_shock = max(0, traumatic_shock - R.shock_reduction) // now you too can varedit cyanide to reduce shock by 1000 - Iamgoofball - if(drunk) - traumatic_shock = max(0, traumatic_shock - 10) - - return traumatic_shock - -/mob/living/carbon/human/proc/handle_shock() - if(status_flags & GODMODE) //godmode - return - if(NO_PAIN in dna.species.species_traits) - return - - updateshock() - - if(health <= config.health_threshold_softcrit)// health 0 makes you immediately collapse - shock_stage = max(shock_stage, 61) - - if(traumatic_shock >= 100) - shock_stage += 1 - else - shock_stage = min(shock_stage, 160) - shock_stage = max(shock_stage-1, 0) - return - - if(shock_stage == 10) - to_chat(src, ""+pick("It hurts so much!", "You really need some painkillers..", "Dear god, the pain!")) - - if(shock_stage >= 30) - if(shock_stage == 30) - custom_emote(1,"is having trouble keeping [p_their()] eyes open.") - EyeBlurry(2) - Stuttering(5) - - if(shock_stage == 40) - to_chat(src, ""+pick("The pain is excrutiating!", "Please, just end the pain!", "Your whole body is going numb!")) - - if(shock_stage >=60) - if(shock_stage == 60) - custom_emote(1,"falls limp.") - if(prob(2)) - to_chat(src, ""+pick("The pain is excrutiating!", "Please, just end the pain!", "Your whole body is going numb!")) - Weaken(20) - - if(shock_stage >= 80) - if(prob(5)) - to_chat(src, ""+pick("The pain is excrutiating!", "Please, just end the pain!", "Your whole body is going numb!")) - Weaken(20) - - if(shock_stage >= 120) - if(prob(2)) - to_chat(src, ""+pick("You black out!", "You feel like you could die any moment now.", "You're about to lose consciousness.")) - Paralyse(5) - - if(shock_stage == 150) - custom_emote(1,"can no longer stand, collapsing!") - Weaken(20) - - if(shock_stage >= 150) - Weaken(20) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/_species.dm b/code/modules/mob/living/carbon/human/species/_species.dm index 1335c8e2d57..e9a88fdb033 100644 --- a/code/modules/mob/living/carbon/human/species/_species.dm +++ b/code/modules/mob/living/carbon/human/species/_species.dm @@ -91,6 +91,8 @@ var/is_small var/show_ssd = 1 + var/forced_heartattack = FALSE //Some species have blood, but we still want them to have heart attacks + var/dies_at_threshold = FALSE // Do they die or get knocked out at specific thresholds, or do they go through complex crit? var/can_revive_by_healing // Determines whether or not this species can be revived by simply healing them var/has_gender = TRUE var/blacklisted = FALSE @@ -255,8 +257,6 @@ . += (health_deficiency / 75) else . += (health_deficiency / 25) - if(H.shock_stage >= 10) - . += 3 . += 2 * H.stance_damage //damaged/missing feet or legs is slow if((hungry >= 70) && !flight) @@ -298,11 +298,8 @@ // (Slime People changing color based on the reagents they consume) /datum/species/proc/handle_life(mob/living/carbon/human/H) if((NO_BREATHE in species_traits) || (BREATHLESS in H.mutations)) - H.setOxyLoss(0) - H.SetLoseBreath(0) - var/takes_crit_damage = (!(NOCRITDAMAGE in species_traits)) - if((H.health <= config.health_threshold_crit) && takes_crit_damage) + if((H.health <= HEALTH_THRESHOLD_CRIT) && takes_crit_damage) H.adjustBruteLoss(1) return @@ -315,7 +312,7 @@ /datum/species/proc/help(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style) if(attacker_style && attacker_style.help_act(user, target))//adminfu only... return TRUE - if(target.health >= config.health_threshold_crit && !(target.status_flags & FAKEDEATH)) + if(target.health >= HEALTH_THRESHOLD_CRIT && !(target.status_flags & FAKEDEATH)) target.help_shake_act(user) return TRUE else @@ -539,7 +536,7 @@ return FALSE /datum/species/proc/get_perceived_trauma(mob/living/carbon/human/H) - return 100 - ((NO_PAIN in species_traits) ? 0 : H.traumatic_shock) - H.getStaminaLoss() + return H.health - H.getStaminaLoss() /datum/species/proc/handle_hud_icons(mob/living/carbon/human/H) if(!H.client) diff --git a/code/modules/mob/living/carbon/human/species/abductor.dm b/code/modules/mob/living/carbon/human/species/abductor.dm index cf1492e8408..64c5a4aa0b3 100644 --- a/code/modules/mob/living/carbon/human/species/abductor.dm +++ b/code/modules/mob/living/carbon/human/species/abductor.dm @@ -16,8 +16,7 @@ ) species_traits = list(NO_BLOOD, NO_BREATHE, VIRUSIMMUNE, NOGUNS, NO_EXAMINE) - - oxy_mod = 0 + dies_at_threshold = TRUE clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS dietflags = DIET_OMNI diff --git a/code/modules/mob/living/carbon/human/species/diona.dm b/code/modules/mob/living/carbon/human/species/diona.dm index 82def809a4b..bccbeb6c5a7 100644 --- a/code/modules/mob/living/carbon/human/species/diona.dm +++ b/code/modules/mob/living/carbon/human/species/diona.dm @@ -32,6 +32,7 @@ water and other radiation." species_traits = list(NO_BREATHE, RADIMMUNE, IS_PLANT, NO_BLOOD, NO_PAIN) + dies_at_threshold = TRUE clothing_flags = HAS_SOCKS default_hair_colour = "#000000" has_gender = FALSE @@ -39,8 +40,6 @@ taste_sensitivity = TASTE_SENSITIVITY_NO_TASTE skinned_type = /obj/item/stack/sheet/wood - oxy_mod = 0 - body_temperature = T0C + 15 //make the plant people have a bit lower body temperature, why not blood_color = "#004400" flesh_color = "#907E4A" diff --git a/code/modules/mob/living/carbon/human/species/golem.dm b/code/modules/mob/living/carbon/human/species/golem.dm index 032af8ea3b9..e790181188e 100644 --- a/code/modules/mob/living/carbon/human/species/golem.dm +++ b/code/modules/mob/living/carbon/human/species/golem.dm @@ -6,10 +6,10 @@ deform = 'icons/mob/human_races/r_golem.dmi' species_traits = list(NO_BREATHE, NO_BLOOD, NO_PAIN, RADIMMUNE, VIRUSIMMUNE, NOGUNS) + dies_at_threshold = TRUE brute_mod = 0.45 //55% damage reduction burn_mod = 0.45 tox_mod = 0.45 - oxy_mod = 0 dietflags = DIET_OMNI //golems can eat anything because they are magic or something reagent_tag = PROCESS_ORG @@ -163,6 +163,8 @@ if(H.bodytemperature > 850 && H.on_fire && prob(25)) explosion(get_turf(H), 1, 2, 4, flame_range = 5) + msg_admin_attack("Plasma Golem ([H.name]) exploded with radius 1, 2, 4 (flame_range: 5) at ([H.x],[H.y],[H.z]). User Ckey: [key_name_admin(H)]", ATKLOG_FEW) + log_game("Plasma Golem ([H.name]) exploded with radius 1, 2, 4 (flame_range: 5) at ([H.x],[H.y],[H.z]). User Ckey: [key_name_admin(H)]", ATKLOG_FEW) if(H) H.gib() if(H.fire_stacks < 2) //flammable @@ -533,23 +535,26 @@ check_flags = AB_CHECK_CONSCIOUS button_icon_state = "blink" icon_icon = 'icons/mob/actions/actions.dmi' + var/activated = FALSE // To prevent spamming var/cooldown = 150 var/last_teleport = 0 var/tele_range = 6 /datum/action/innate/unstable_teleport/IsAvailable() if(..()) - if(world.time > last_teleport + cooldown) + if(world.time > last_teleport + cooldown && !activated) return 1 return 0 /datum/action/innate/unstable_teleport/Activate() + activated = TRUE var/mob/living/carbon/human/H = owner H.visible_message("[H] starts vibrating!", "You start charging your bluespace core...") playsound(get_turf(H), 'sound/weapons/flash.ogg', 25, 1) addtimer(CALLBACK(src, .proc/teleport, H), 15) /datum/action/innate/unstable_teleport/proc/teleport(mob/living/carbon/human/H) + activated = FALSE H.visible_message("[H] teleports!", "You teleport!") var/list/turfs = new/list() for(var/turf/T in orange(tele_range, H)) diff --git a/code/modules/mob/living/carbon/human/species/grey.dm b/code/modules/mob/living/carbon/human/species/grey.dm index 31fb5db6661..e5492e60293 100644 --- a/code/modules/mob/living/carbon/human/species/grey.dm +++ b/code/modules/mob/living/carbon/human/species/grey.dm @@ -8,10 +8,10 @@ butt_sprite = "grey" has_organ = list( - "heart" = /obj/item/organ/internal/heart, - "lungs" = /obj/item/organ/internal/lungs, + "heart" = /obj/item/organ/internal/heart/grey, + "lungs" = /obj/item/organ/internal/lungs/grey, "liver" = /obj/item/organ/internal/liver/grey, - "kidneys" = /obj/item/organ/internal/kidneys, + "kidneys" = /obj/item/organ/internal/kidneys/grey, "brain" = /obj/item/organ/internal/brain/grey, "appendix" = /obj/item/organ/internal/appendix, "eyes" = /obj/item/organ/internal/eyes/grey //5 darksight. diff --git a/code/modules/mob/living/carbon/human/species/kidan.dm b/code/modules/mob/living/carbon/human/species/kidan.dm index 583e098054b..a1d2fb6624d 100644 --- a/code/modules/mob/living/carbon/human/species/kidan.dm +++ b/code/modules/mob/living/carbon/human/species/kidan.dm @@ -20,13 +20,13 @@ butt_sprite = "kidan" has_organ = list( - "heart" = /obj/item/organ/internal/heart, - "lungs" = /obj/item/organ/internal/lungs, + "heart" = /obj/item/organ/internal/heart/kidan, + "lungs" = /obj/item/organ/internal/lungs/kidan, "liver" = /obj/item/organ/internal/liver/kidan, - "kidneys" = /obj/item/organ/internal/kidneys, - "brain" = /obj/item/organ/internal/brain, + "kidneys" = /obj/item/organ/internal/kidneys/kidan, + "brain" = /obj/item/organ/internal/brain/kidan, "appendix" = /obj/item/organ/internal/appendix, - "eyes" = /obj/item/organ/internal/eyes, //Default darksight of 2. + "eyes" = /obj/item/organ/internal/eyes/kidan, //Default darksight of 2. "lantern" = /obj/item/organ/internal/lantern ) diff --git a/code/modules/mob/living/carbon/human/species/machine.dm b/code/modules/mob/living/carbon/human/species/machine.dm index 88ed0a626cb..4f5a65c82a2 100644 --- a/code/modules/mob/living/carbon/human/species/machine.dm +++ b/code/modules/mob/living/carbon/human/species/machine.dm @@ -19,7 +19,6 @@ burn_mod = 2.28 // So they take 50% extra damage from brute/burn overall tox_mod = 0 clone_mod = 0 - oxy_mod = 0 death_message = "gives one shrill beep before falling limp, their monitor flashing blue before completely shutting off..." species_traits = list(IS_WHITELISTED, NO_BREATHE, NO_SCAN, NO_INTORGANS, NO_PAIN, NO_DNA, RADIMMUNE, VIRUSIMMUNE, NOTRANSSTING) @@ -36,6 +35,7 @@ //Default styles for created mobs. default_hair = "Blue IPC Screen" + dies_at_threshold = TRUE can_revive_by_healing = 1 has_gender = FALSE reagent_tag = PROCESS_SYN diff --git a/code/modules/mob/living/carbon/human/species/monkey.dm b/code/modules/mob/living/carbon/human/species/monkey.dm index 5e926a23870..cac42a29cd2 100644 --- a/code/modules/mob/living/carbon/human/species/monkey.dm +++ b/code/modules/mob/living/carbon/human/species/monkey.dm @@ -108,11 +108,11 @@ tail = "farwatail" reagent_tag = PROCESS_ORG has_organ = list( - "heart" = /obj/item/organ/internal/heart, - "lungs" = /obj/item/organ/internal/lungs, + "heart" = /obj/item/organ/internal/heart/tajaran, + "lungs" = /obj/item/organ/internal/lungs/tajaran, "liver" = /obj/item/organ/internal/liver/tajaran, - "kidneys" = /obj/item/organ/internal/kidneys, - "brain" = /obj/item/organ/internal/brain, + "kidneys" = /obj/item/organ/internal/kidneys/tajaran, + "brain" = /obj/item/organ/internal/brain/tajaran, "appendix" = /obj/item/organ/internal/appendix, "eyes" = /obj/item/organ/internal/eyes/tajaran/farwa //Tajara monkey-forms are uniquely colourblind and have excellent darksight, which is why they need a subtype of their greater-form's organ.. ) @@ -132,11 +132,11 @@ tail = "wolpintail" reagent_tag = PROCESS_ORG has_organ = list( - "heart" = /obj/item/organ/internal/heart, - "lungs" = /obj/item/organ/internal/lungs, + "heart" = /obj/item/organ/internal/heart/vulpkanin, + "lungs" = /obj/item/organ/internal/lungs/vulpkanin, "liver" = /obj/item/organ/internal/liver/vulpkanin, - "kidneys" = /obj/item/organ/internal/kidneys, - "brain" = /obj/item/organ/internal/brain, + "kidneys" = /obj/item/organ/internal/kidneys/vulpkanin, + "brain" = /obj/item/organ/internal/brain/vulpkanin, "appendix" = /obj/item/organ/internal/appendix, "eyes" = /obj/item/organ/internal/eyes/vulpkanin/wolpin //Vulpkanin monkey-forms are uniquely colourblind and have excellent darksight, which is why they need a subtype of their greater-form's organ.. ) @@ -156,6 +156,16 @@ reagent_tag = PROCESS_ORG tail = null + has_organ = list( + "heart" = /obj/item/organ/internal/heart/skrell, + "lungs" = /obj/item/organ/internal/lungs/skrell, + "liver" = /obj/item/organ/internal/liver/skrell, + "kidneys" = /obj/item/organ/internal/kidneys/skrell, + "brain" = /obj/item/organ/internal/brain/skrell, + "appendix" = /obj/item/organ/internal/appendix, + "eyes" = /obj/item/organ/internal/eyes/skrell //Tajara monkey-forms are uniquely colourblind and have excellent darksight, which is why they need a subtype of their greater-form's organ.. + ) + /datum/species/monkey/unathi name = "Stok" name_plural = "Stok" @@ -171,3 +181,13 @@ reagent_tag = PROCESS_ORG bodyflags = HAS_TAIL + + has_organ = list( + "heart" = /obj/item/organ/internal/heart/unathi, + "lungs" = /obj/item/organ/internal/lungs/unathi, + "liver" = /obj/item/organ/internal/liver/unathi, + "kidneys" = /obj/item/organ/internal/kidneys/unathi, + "brain" = /obj/item/organ/internal/brain/unathi, + "appendix" = /obj/item/organ/internal/appendix, + "eyes" = /obj/item/organ/internal/eyes/unathi + ) diff --git a/code/modules/mob/living/carbon/human/species/nucleation.dm b/code/modules/mob/living/carbon/human/species/nucleation.dm index 21d8a5c0012..fe8a5587017 100644 --- a/code/modules/mob/living/carbon/human/species/nucleation.dm +++ b/code/modules/mob/living/carbon/human/species/nucleation.dm @@ -13,8 +13,8 @@ language = "Sol Common" burn_mod = 4 // holy shite, poor guys wont survive half a second cooking smores brute_mod = 2 // damn, double wham, double dam - oxy_mod = 0 species_traits = list(LIPS, IS_WHITELISTED, NO_BREATHE, NO_BLOOD, NO_PAIN, NO_SCAN, RADIMMUNE) + dies_at_threshold = TRUE dietflags = DIET_OMNI //still human at their core, so they maintain their eating habits and diet //Default styles for created mobs. diff --git a/code/modules/mob/living/carbon/human/species/plasmaman.dm b/code/modules/mob/living/carbon/human/species/plasmaman.dm index df2359af3df..ba249edb5a8 100644 --- a/code/modules/mob/living/carbon/human/species/plasmaman.dm +++ b/code/modules/mob/living/carbon/human/species/plasmaman.dm @@ -7,6 +7,7 @@ //language = "Clatter" species_traits = list(IS_WHITELISTED, NO_BLOOD, NOTRANSSTING) + forced_heartattack = TRUE // Plasmamen have no blood, but they should still get heart-attacks skinned_type = /obj/item/stack/sheet/mineral/plasma // We're low on plasma, R&D! *eyes plasmaman co-worker intently* dietflags = DIET_OMNI reagent_tag = PROCESS_ORG @@ -30,13 +31,13 @@ "shows their true colors, which happens to be the color of plasma!") has_organ = list( - "heart" = /obj/item/organ/internal/heart, + "heart" = /obj/item/organ/internal/heart/plasmaman, "lungs" = /obj/item/organ/internal/lungs/plasmaman, - "liver" = /obj/item/organ/internal/liver, - "kidneys" = /obj/item/organ/internal/kidneys, - "brain" = /obj/item/organ/internal/brain, + "liver" = /obj/item/organ/internal/liver/plasmaman, + "kidneys" = /obj/item/organ/internal/kidneys/plasmaman, + "brain" = /obj/item/organ/internal/brain/plasmaman, "appendix" = /obj/item/organ/internal/appendix, - "eyes" = /obj/item/organ/internal/eyes + "eyes" = /obj/item/organ/internal/eyes/plasmaman ) speciesbox = /obj/item/storage/box/survival_plasmaman diff --git a/code/modules/mob/living/carbon/human/species/shadow.dm b/code/modules/mob/living/carbon/human/species/shadow.dm index df1ecd61484..fb7fd2ebda1 100644 --- a/code/modules/mob/living/carbon/human/species/shadow.dm +++ b/code/modules/mob/living/carbon/human/species/shadow.dm @@ -18,8 +18,7 @@ ) species_traits = list(NO_BREATHE, NO_BLOOD, RADIMMUNE, VIRUSIMMUNE) - - oxy_mod = 0 + dies_at_threshold = TRUE dietflags = DIET_OMNI //the mutation process allowed you to now digest all foods regardless of initial race reagent_tag = PROCESS_ORG diff --git a/code/modules/mob/living/carbon/human/species/shadowling.dm b/code/modules/mob/living/carbon/human/species/shadowling.dm index 1ce7b5cd0e0..f65aedb530b 100644 --- a/code/modules/mob/living/carbon/human/species/shadowling.dm +++ b/code/modules/mob/living/carbon/human/species/shadowling.dm @@ -11,7 +11,6 @@ species_traits = list(NO_BLOOD, NO_BREATHE, RADIMMUNE, NOGUNS, NO_EXAMINE) //Can't use guns due to muzzle flash burn_mod = 1.5 //1.5x burn damage, 2x is excessive - oxy_mod = 0 heatmod = 1.5 silent_steps = 1 @@ -63,7 +62,6 @@ species_traits = list(NO_BLOOD, NO_BREATHE, RADIMMUNE, NO_EXAMINE) burn_mod = 1.1 - oxy_mod = 0 heatmod = 1.1 /datum/species/shadow/ling/lesser/handle_life(mob/living/carbon/human/H) diff --git a/code/modules/mob/living/carbon/human/species/skeleton.dm b/code/modules/mob/living/carbon/human/species/skeleton.dm index 6a2b74fb671..50920798d70 100644 --- a/code/modules/mob/living/carbon/human/species/skeleton.dm +++ b/code/modules/mob/living/carbon/human/species/skeleton.dm @@ -11,10 +11,9 @@ flesh_color = "#E6E6C6" species_traits = list(NO_BREATHE, NO_BLOOD, RADIMMUNE, VIRUSIMMUNE) + dies_at_threshold = TRUE skinned_type = /obj/item/stack/sheet/bone - oxy_mod = 0 - dietflags = DIET_OMNI reagent_tag = PROCESS_ORG diff --git a/code/modules/mob/living/carbon/human/species/skrell.dm b/code/modules/mob/living/carbon/human/species/skrell.dm index a7c24cd338c..009514f4902 100644 --- a/code/modules/mob/living/carbon/human/species/skrell.dm +++ b/code/modules/mob/living/carbon/human/species/skrell.dm @@ -28,13 +28,13 @@ butt_sprite = "skrell" has_organ = list( - "heart" = /obj/item/organ/internal/heart, - "lungs" = /obj/item/organ/internal/lungs, + "heart" = /obj/item/organ/internal/heart/skrell, + "lungs" = /obj/item/organ/internal/lungs/skrell, "liver" = /obj/item/organ/internal/liver/skrell, - "kidneys" = /obj/item/organ/internal/kidneys, - "brain" = /obj/item/organ/internal/brain, + "kidneys" = /obj/item/organ/internal/kidneys/skrell, + "brain" = /obj/item/organ/internal/brain/skrell, "appendix" = /obj/item/organ/internal/appendix, - "eyes" = /obj/item/organ/internal/eyes, //Default darksight of 2. + "eyes" = /obj/item/organ/internal/eyes/skrell, //Default darksight of 2. "headpocket" = /obj/item/organ/internal/headpocket ) diff --git a/code/modules/mob/living/carbon/human/species/slime.dm b/code/modules/mob/living/carbon/human/species/slime.dm index 5631f600afc..b33ebc1f048 100644 --- a/code/modules/mob/living/carbon/human/species/slime.dm +++ b/code/modules/mob/living/carbon/human/species/slime.dm @@ -20,13 +20,13 @@ cold_level_3 = 200 coldmod = 3 - oxy_mod = 0 brain_mod = 2.5 male_cough_sounds = list('sound/effects/slime_squish.ogg') female_cough_sounds = list('sound/effects/slime_squish.ogg') species_traits = list(LIPS, IS_WHITELISTED, NO_BREATHE, NO_INTORGANS, NO_SCAN) + dies_at_threshold = TRUE clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS bodyflags = HAS_SKIN_COLOR | NO_EYES dietflags = DIET_CARN @@ -83,7 +83,7 @@ H.update_body() ..() -/datum/species/slime/can_hear() // fucking snowflakes +/datum/species/slime/can_hear() // fucking snowflakes . = TRUE /datum/action/innate/slimecolor diff --git a/code/modules/mob/living/carbon/human/species/tajaran.dm b/code/modules/mob/living/carbon/human/species/tajaran.dm index d4cdaf95944..2b0c65aa821 100644 --- a/code/modules/mob/living/carbon/human/species/tajaran.dm +++ b/code/modules/mob/living/carbon/human/species/tajaran.dm @@ -30,16 +30,17 @@ dietflags = DIET_OMNI taste_sensitivity = TASTE_SENSITIVITY_SHARP reagent_tag = PROCESS_ORG + flesh_color = "#AFA59E" base_color = "#424242" butt_sprite = "tajaran" has_organ = list( - "heart" = /obj/item/organ/internal/heart, - "lungs" = /obj/item/organ/internal/lungs, + "heart" = /obj/item/organ/internal/heart/tajaran, + "lungs" = /obj/item/organ/internal/lungs/tajaran, "liver" = /obj/item/organ/internal/liver/tajaran, - "kidneys" = /obj/item/organ/internal/kidneys, - "brain" = /obj/item/organ/internal/brain, + "kidneys" = /obj/item/organ/internal/kidneys/tajaran, + "brain" = /obj/item/organ/internal/brain/tajaran, "appendix" = /obj/item/organ/internal/appendix, "eyes" = /obj/item/organ/internal/eyes/tajaran /*Most Tajara see in full colour as a result of genetic augmentation, although it cost them their darksight (darksight = 2) unless they choose otherwise by selecting the colourblind disability in character creation (darksight = 8 but colourblind).*/ diff --git a/code/modules/mob/living/carbon/human/species/unathi.dm b/code/modules/mob/living/carbon/human/species/unathi.dm index bcad7d9342e..f255091a7d6 100644 --- a/code/modules/mob/living/carbon/human/species/unathi.dm +++ b/code/modules/mob/living/carbon/human/species/unathi.dm @@ -38,11 +38,11 @@ brute_mod = 1.05 has_organ = list( - "heart" = /obj/item/organ/internal/heart, - "lungs" = /obj/item/organ/internal/lungs, + "heart" = /obj/item/organ/internal/heart/unathi, + "lungs" = /obj/item/organ/internal/lungs/unathi, "liver" = /obj/item/organ/internal/liver/unathi, - "kidneys" = /obj/item/organ/internal/kidneys, - "brain" = /obj/item/organ/internal/brain, + "kidneys" = /obj/item/organ/internal/kidneys/unathi, + "brain" = /obj/item/organ/internal/brain/unathi, "appendix" = /obj/item/organ/internal/appendix, "eyes" = /obj/item/organ/internal/eyes/unathi //3 darksight. ) diff --git a/code/modules/mob/living/carbon/human/species/vox.dm b/code/modules/mob/living/carbon/human/species/vox.dm index b3ac08580aa..436c3d32b3b 100644 --- a/code/modules/mob/living/carbon/human/species/vox.dm +++ b/code/modules/mob/living/carbon/human/species/vox.dm @@ -62,13 +62,13 @@ ) has_organ = list( - "heart" = /obj/item/organ/internal/heart, + "heart" = /obj/item/organ/internal/heart/vox, "lungs" = /obj/item/organ/internal/lungs/vox, "liver" = /obj/item/organ/internal/liver/vox, - "kidneys" = /obj/item/organ/internal/kidneys, - "brain" = /obj/item/organ/internal/brain, + "kidneys" = /obj/item/organ/internal/kidneys/vox, + "brain" = /obj/item/organ/internal/brain/vox, "appendix" = /obj/item/organ/internal/appendix, - "eyes" = /obj/item/organ/internal/eyes, //Default darksight of 2. + "eyes" = /obj/item/organ/internal/eyes/vox, //Default darksight of 2. "stack" = /obj/item/organ/internal/stack //Not the same as the cortical stack implant Vox Raiders spawn with. The cortical stack implant is used ) //for determining the success of the heist game-mode's 'leave nobody behind' objective, while this is just an organ. @@ -173,6 +173,7 @@ eyes = "blank_eyes" species_traits = list(NO_SCAN, NO_BLOOD, NO_PAIN, IS_WHITELISTED) + dies_at_threshold = TRUE bodyflags = HAS_TAIL dietflags = DIET_OMNI //should inherit this from vox, this is here just in case diff --git a/code/modules/mob/living/carbon/human/species/vulpkanin.dm b/code/modules/mob/living/carbon/human/species/vulpkanin.dm index 3e6ebc1d41d..2ff707ee020 100644 --- a/code/modules/mob/living/carbon/human/species/vulpkanin.dm +++ b/code/modules/mob/living/carbon/human/species/vulpkanin.dm @@ -22,6 +22,7 @@ hunger_drain = 0.11 taste_sensitivity = TASTE_SENSITIVITY_SHARP reagent_tag = PROCESS_ORG + flesh_color = "#966464" base_color = "#CF4D2F" butt_sprite = "vulp" @@ -29,11 +30,11 @@ scream_verb = "yelps" has_organ = list( - "heart" = /obj/item/organ/internal/heart, - "lungs" = /obj/item/organ/internal/lungs, + "heart" = /obj/item/organ/internal/heart/vulpkanin, + "lungs" = /obj/item/organ/internal/lungs/vulpkanin, "liver" = /obj/item/organ/internal/liver/vulpkanin, - "kidneys" = /obj/item/organ/internal/kidneys, - "brain" = /obj/item/organ/internal/brain, + "kidneys" = /obj/item/organ/internal/kidneys/vulpkanin, + "brain" = /obj/item/organ/internal/brain/vulpkanin, "appendix" = /obj/item/organ/internal/appendix, "eyes" = /obj/item/organ/internal/eyes/vulpkanin /*Most Vulpkanin see in full colour as a result of genetic augmentation, although it cost them their darksight (darksight = 2) unless they choose otherwise by selecting the colourblind disability in character creation (darksight = 8 but colourblind).*/ diff --git a/code/modules/mob/living/carbon/human/species/wryn.dm b/code/modules/mob/living/carbon/human/species/wryn.dm index 8c576f9e30e..6069da28f84 100644 --- a/code/modules/mob/living/carbon/human/species/wryn.dm +++ b/code/modules/mob/living/carbon/human/species/wryn.dm @@ -39,7 +39,7 @@ clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS dietflags = DIET_HERB //bees feed off nectar, so bee people feed off plants too - oxy_mod = 0 + dies_at_threshold = TRUE reagent_tag = PROCESS_ORG base_color = "#704300" diff --git a/code/modules/mob/living/carbon/human/status_procs.dm b/code/modules/mob/living/carbon/human/status_procs.dm index e7a65129017..30653023751 100644 --- a/code/modules/mob/living/carbon/human/status_procs.dm +++ b/code/modules/mob/living/carbon/human/status_procs.dm @@ -1,3 +1,9 @@ +/mob/living/carbon/human/SetLoseBreath(amount) + if(NO_BREATHE in dna.species.species_traits) + losebreath = 0 + return FALSE + . = ..() + /mob/living/carbon/human/SetStunned(amount, updating = 1, force = 0) if(dna.species) amount = amount * dna.species.stun_mod diff --git a/code/modules/mob/living/carbon/human/update_stat.dm b/code/modules/mob/living/carbon/human/update_stat.dm index d8c26a91964..5dfd98c0b63 100644 --- a/code/modules/mob/living/carbon/human/update_stat.dm +++ b/code/modules/mob/living/carbon/human/update_stat.dm @@ -15,7 +15,7 @@ if(dna.species && dna.species.can_revive_by_healing) var/obj/item/organ/internal/brain/B = get_int_organ(/obj/item/organ/internal/brain) if(B) - if((health >= (config.health_threshold_dead + config.health_threshold_crit) * 0.5) && getBrainLoss()<120) + if((health >= (HEALTH_THRESHOLD_DEAD + HEALTH_THRESHOLD_CRIT) * 0.5) && getBrainLoss() < 120) update_revive() create_debug_log("revived from healing, trigger reason: [reason]") @@ -30,4 +30,7 @@ /mob/living/carbon/human/can_hear() . = TRUE // Fallback if we don't have a species if(dna.species) - . = dna.species.can_hear(src) \ No newline at end of file + . = dna.species.can_hear(src) + +/mob/living/carbon/human/check_death_method() + return dna.species.dies_at_threshold \ No newline at end of file diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 18e42c98d08..48d8137092a 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -27,8 +27,8 @@ //Start of a breath chain, calls breathe() /mob/living/carbon/handle_breathing(times_fired) - if(times_fired % 4 == 2 || failed_last_breath) - breathe() //Breathe per 4 ticks, unless suffocating + if(times_fired % 2 == 1) + breathe() //Breathe every other tick, unless suffocating else if(istype(loc, /obj/)) var/obj/location_as_object = loc @@ -47,13 +47,13 @@ var/datum/gas_mixture/breath - if(health <= config.health_threshold_crit) + if(health <= HEALTH_THRESHOLD_CRIT && check_death_method()) AdjustLoseBreath(1) //Suffocate if(losebreath > 0) AdjustLoseBreath(-1) - if(prob(10)) + if(prob(75)) emote("gasp") if(istype(loc, /obj/)) var/obj/loc_as_obj = loc @@ -97,7 +97,6 @@ //CRIT if(!breath || (breath.total_moles() == 0) || !lungs) adjustOxyLoss(1) - failed_last_breath = TRUE throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy) return FALSE @@ -121,15 +120,12 @@ if(O2_partialpressure > 0) var/ratio = 1 - O2_partialpressure/safe_oxy_min adjustOxyLoss(min(5*ratio, 3)) - failed_last_breath = TRUE oxygen_used = breath.oxygen*ratio else adjustOxyLoss(3) - failed_last_breath = TRUE throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy) else //Enough oxygen - failed_last_breath = FALSE adjustOxyLoss(-5) oxygen_used = breath.oxygen clear_alert("not_enough_oxy") @@ -406,35 +402,54 @@ handle_hud_icons_health_overlay() /mob/living/carbon/proc/handle_hud_icons_health_overlay() - if(stat == UNCONSCIOUS && health <= config.health_threshold_crit) - var/severity = 0 - switch(health) - if(-20 to -10) severity = 1 - if(-30 to -20) severity = 2 - if(-40 to -30) severity = 3 - if(-50 to -40) severity = 4 - if(-60 to -50) severity = 5 - if(-70 to -60) severity = 6 - if(-80 to -70) severity = 7 - if(-90 to -80) severity = 8 - if(-95 to -90) severity = 9 - if(-INFINITY to -95) severity = 10 - overlay_fullscreen("crit", /obj/screen/fullscreen/crit, severity) - else if(stat == CONSCIOUS) - clear_fullscreen("crit") - if(oxyloss) + if(stat == UNCONSCIOUS && health <= HEALTH_THRESHOLD_CRIT) + if(check_death_method()) var/severity = 0 - switch(oxyloss) - if(10 to 20) severity = 1 - if(20 to 25) severity = 2 - if(25 to 30) severity = 3 - if(30 to 35) severity = 4 - if(35 to 40) severity = 5 - if(40 to 45) severity = 6 - if(45 to INFINITY) severity = 7 - overlay_fullscreen("oxy", /obj/screen/fullscreen/oxy, severity) - else - clear_fullscreen("oxy") + switch(health) + if(-20 to -10) + severity = 1 + if(-30 to -20) + severity = 2 + if(-40 to -30) + severity = 3 + if(-50 to -40) + severity = 4 + if(-60 to -50) + severity = 5 + if(-70 to -60) + severity = 6 + if(-80 to -70) + severity = 7 + if(-90 to -80) + severity = 8 + if(-95 to -90) + severity = 9 + if(-INFINITY to -95) + severity = 10 + overlay_fullscreen("crit", /obj/screen/fullscreen/crit, severity) + else if(stat == CONSCIOUS) + if(check_death_method()) + clear_fullscreen("crit") + if(getOxyLoss()) + var/severity = 0 + switch(getOxyLoss()) + if(10 to 20) + severity = 1 + if(20 to 25) + severity = 2 + if(25 to 30) + severity = 3 + if(30 to 35) + severity = 4 + if(35 to 40) + severity = 5 + if(40 to 45) + severity = 6 + if(45 to INFINITY) + severity = 7 + overlay_fullscreen("oxy", /obj/screen/fullscreen/oxy, severity) + else + clear_fullscreen("oxy") //Fire and Brute damage overlay (BSSR) var/hurtdamage = getBruteLoss() + getFireLoss() + damageoverlaytemp @@ -450,4 +465,4 @@ if(85 to INFINITY) severity = 6 overlay_fullscreen("brute", /obj/screen/fullscreen/brute, severity) else - clear_fullscreen("brute") + clear_fullscreen("brute") \ No newline at end of file diff --git a/code/modules/mob/living/carbon/slime/life.dm b/code/modules/mob/living/carbon/slime/life.dm index 649ec7b3f00..e3bfcb74431 100644 --- a/code/modules/mob/living/carbon/slime/life.dm +++ b/code/modules/mob/living/carbon/slime/life.dm @@ -174,11 +174,11 @@ else health = 150 - (getOxyLoss() + getToxLoss() + getFireLoss() + getBruteLoss() + getCloneLoss()) - if(health < config.health_threshold_dead && stat != 2) + if(health < HEALTH_THRESHOLD_DEAD && check_death_method() && stat != DEAD) death() return - else if(src.health <= config.health_threshold_crit) + else if(src.health <= HEALTH_THRESHOLD_CRIT && check_death_method()) if(!src.reagents.has_reagent("epinephrine")) src.adjustOxyLoss(10) diff --git a/code/modules/mob/living/carbon/update_status.dm b/code/modules/mob/living/carbon/update_status.dm index 22030c78f4b..58c6e09764b 100644 --- a/code/modules/mob/living/carbon/update_status.dm +++ b/code/modules/mob/living/carbon/update_status.dm @@ -3,12 +3,12 @@ return if(stat != DEAD) // if(health <= min_health) - if(health <= config.health_threshold_dead) + if(health <= HEALTH_THRESHOLD_DEAD && check_death_method()) death() create_debug_log("died of damage, trigger reason: [reason]") return // if(paralysis || sleeping || getOxyLoss() > low_oxy_ko || (status_flags & FAKEDEATH) || health <= crit_health) - if(paralysis || sleeping || getOxyLoss() > 50 || (status_flags & FAKEDEATH) || health <= config.health_threshold_crit) + if(paralysis || sleeping || (check_death_method() && getOxyLoss() > 50) || (status_flags & FAKEDEATH) || health <= HEALTH_THRESHOLD_CRIT && check_death_method()) if(stat == CONSCIOUS) KnockOut() create_debug_log("fell unconscious, trigger reason: [reason]") @@ -21,7 +21,7 @@ ..() if(staminaloss) var/total_health = (health - staminaloss) - if(total_health <= config.health_threshold_softcrit && !stat) + if(total_health <= HEALTH_THRESHOLD_CRIT && !stat) to_chat(src, "You're too exhausted to keep going...") Weaken(5) setStaminaLoss(health - 2) diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index 734dd556b48..afca9ad8798 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -104,11 +104,11 @@ /mob/living/proc/getBruteLoss() return bruteloss -/mob/living/proc/adjustBruteLoss(var/amount, updating_health = TRUE) +/mob/living/proc/adjustBruteLoss(amount, updating_health = TRUE) if(status_flags & GODMODE) return FALSE //godmode var/old_bruteloss = bruteloss - bruteloss = min(max(bruteloss + amount, 0),(maxHealth*2)) + bruteloss = max(bruteloss + amount, 0) if(old_bruteloss == bruteloss) updating_health = FALSE . = STATUS_UPDATE_NONE @@ -120,11 +120,15 @@ /mob/living/proc/getOxyLoss() return oxyloss -/mob/living/proc/adjustOxyLoss(var/amount, updating_health = TRUE) +/mob/living/proc/adjustOxyLoss(amount, updating_health = TRUE) if(status_flags & GODMODE) + oxyloss = 0 return FALSE //godmode + if(BREATHLESS in mutations) + oxyloss = 0 + return FALSE var/old_oxyloss = oxyloss - oxyloss = min(max(oxyloss + amount, 0),(maxHealth*2)) + oxyloss = max(oxyloss + amount, 0) if(old_oxyloss == oxyloss) updating_health = FALSE . = STATUS_UPDATE_NONE @@ -135,7 +139,11 @@ /mob/living/proc/setOxyLoss(amount, updating_health = TRUE) if(status_flags & GODMODE) + oxyloss = 0 return FALSE //godmode + if(BREATHLESS in mutations) + oxyloss = 0 + return FALSE var/old_oxyloss = oxyloss oxyloss = amount if(old_oxyloss == oxyloss) @@ -149,11 +157,11 @@ /mob/living/proc/getToxLoss() return toxloss -/mob/living/proc/adjustToxLoss(var/amount, updating_health = TRUE) +/mob/living/proc/adjustToxLoss(amount, updating_health = TRUE) if(status_flags & GODMODE) return FALSE //godmode var/old_toxloss = toxloss - toxloss = min(max(toxloss + amount, 0),(maxHealth*2)) + toxloss = max(toxloss + amount, 0) if(old_toxloss == toxloss) updating_health = FALSE . = STATUS_UPDATE_NONE @@ -162,7 +170,7 @@ if(updating_health) updatehealth("adjustToxLoss") -/mob/living/proc/setToxLoss(var/amount, updating_health = TRUE) +/mob/living/proc/setToxLoss(amount, updating_health = TRUE) if(status_flags & GODMODE) return FALSE //godmode var/old_toxloss = toxloss @@ -178,11 +186,11 @@ /mob/living/proc/getFireLoss() return fireloss -/mob/living/proc/adjustFireLoss(var/amount, updating_health = TRUE) +/mob/living/proc/adjustFireLoss(amount, updating_health = TRUE) if(status_flags & GODMODE) return FALSE //godmode var/old_fireloss = fireloss - fireloss = min(max(fireloss + amount, 0),(maxHealth*2)) + fireloss = max(fireloss + amount, 0) if(old_fireloss == fireloss) updating_health = FALSE . = STATUS_UPDATE_NONE @@ -194,11 +202,11 @@ /mob/living/proc/getCloneLoss() return cloneloss -/mob/living/proc/adjustCloneLoss(var/amount, updating_health = TRUE) +/mob/living/proc/adjustCloneLoss(amount, updating_health = TRUE) if(status_flags & GODMODE) return FALSE //godmode var/old_cloneloss = cloneloss - cloneloss = min(max(cloneloss + amount, 0),(maxHealth*2)) + cloneloss = max(cloneloss + amount, 0) if(old_cloneloss == cloneloss) updating_health = FALSE . = STATUS_UPDATE_NONE @@ -207,8 +215,9 @@ if(updating_health) updatehealth("adjustCloneLoss") -/mob/living/proc/setCloneLoss(var/amount, updating_health = TRUE) - if(status_flags & GODMODE) return 0 //godmode +/mob/living/proc/setCloneLoss(amount, updating_health = TRUE) + if(status_flags & GODMODE) + return FALSE //godmode var/old_cloneloss = cloneloss cloneloss = amount if(old_cloneloss == cloneloss) @@ -235,7 +244,7 @@ if(status_flags & GODMODE) return FALSE var/old_stamloss = staminaloss - staminaloss = min(max(staminaloss + amount, 0),(maxHealth*2)) + staminaloss = max(staminaloss + amount, 0) if(old_stamloss == staminaloss) updating = FALSE . = STATUS_UPDATE_NONE @@ -300,4 +309,4 @@ updatehealth("take overall damage") /mob/living/proc/has_organic_damage() - return (maxHealth - health) + return (maxHealth - health) \ No newline at end of file diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm index 43a811dc3a3..003b5c3d4fe 100644 --- a/code/modules/mob/living/death.dm +++ b/code/modules/mob/living/death.dm @@ -59,7 +59,7 @@ if(!gibbed && deathgasp_on_death) emote("deathgasp") - if(suiciding) + if(mind && suiciding) mind.suicided = TRUE clear_fullscreens() update_sight() @@ -96,3 +96,9 @@ // u no we dead return TRUE + +/mob/living/proc/delayed_gib() + visible_message("[src] starts convulsing violently!", "You feel as if your body is tearing itself apart!") + Weaken(15) + do_jitter_animation(1000, -1) + addtimer(CALLBACK(src, .proc/gib), rand(20, 100)) \ No newline at end of file diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 66f3eec1683..0569c944382 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -25,6 +25,10 @@ handle_diseases() + //Heart Attack, if applicable + if(stat != DEAD) + handle_heartattack() + //Handle temperature/pressure differences between body and environment if(environment) handle_environment(environment) @@ -56,6 +60,9 @@ /mob/living/proc/handle_breathing(times_fired) return +/mob/living/proc/handle_heartattack() + return + /mob/living/proc/handle_mutations_and_radiation() radiation = 0 //so radiation don't accumulate in simple animals return diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index bf933f568d4..52fde3d0d9e 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -246,17 +246,18 @@ set hidden = 1 if(InCritical()) create_attack_log("[src] has ["succumbed to death"] with [round(health, 0.1)] points of health!") - adjustOxyLoss(health - config.health_threshold_dead) + adjustOxyLoss(health - HEALTH_THRESHOLD_DEAD) // super check for weird mobs, including ones that adjust hp // we don't want to go overboard and gib them, though for(var/i = 1 to 5) - if(health < config.health_threshold_dead) + if(health < HEALTH_THRESHOLD_DEAD) break - take_overall_damage(max(5, health - config.health_threshold_dead), 0) + take_overall_damage(max(5, health - HEALTH_THRESHOLD_DEAD), 0) + death() to_chat(src, "You have given up life and succumbed to death.") /mob/living/proc/InCritical() - return (health < 0 && health > -95.0 && stat == UNCONSCIOUS) + return (health < HEALTH_THRESHOLD_CRIT && health > HEALTH_THRESHOLD_DEAD && stat == UNCONSCIOUS) /mob/living/ex_act(severity) ..() @@ -462,7 +463,6 @@ human_mob = src human_mob.set_heartattack(FALSE) human_mob.restore_blood() - human_mob.shock_stage = 0 human_mob.decaylevel = 0 human_mob.remove_all_embedded_objects() @@ -759,7 +759,7 @@ if(!silent) visible_message("[src] tries to put [what] on [who].") if(do_mob(src, who, what.put_on_delay)) - if(what && Adjacent(who)) + if(what && Adjacent(who) && !(what.flags & NODROP)) unEquip(what) who.equip_to_slot_if_possible(what, where, 0, 1) add_attack_logs(src, who, "Equipped [what]") @@ -786,11 +786,11 @@ ..() floating = 0 // If we were without gravity, the bouncing animation got stopped, so we make sure we restart the bouncing after the next movement. -/mob/living/proc/do_jitter_animation(jitteriness) +/mob/living/proc/do_jitter_animation(jitteriness, loop_amount = 6) var/amplitude = min(4, (jitteriness/100) + 1) var/pixel_x_diff = rand(-amplitude, amplitude) var/pixel_y_diff = rand(-amplitude/3, amplitude/3) - animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff , time = 2, loop = 6) + animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff , time = 2, loop = loop_amount) animate(pixel_x = initial(pixel_x) , pixel_y = initial(pixel_y) , time = 2) floating = 0 // If we were without gravity, the bouncing animation got stopped, so we make sure we restart the bouncing after the next movement. diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index f65faaba70d..0641ce380f5 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -179,7 +179,8 @@ var/turf/location = get_turf(src) location.hotspot_expose(700, 50, 1) -/mob/living/fire_act() +/mob/living/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE) + ..() adjust_fire_stacks(3) IgniteMob() diff --git a/code/modules/mob/living/login.dm b/code/modules/mob/living/login.dm index 57e5623cbbf..dcc046f7b00 100644 --- a/code/modules/mob/living/login.dm +++ b/code/modules/mob/living/login.dm @@ -7,7 +7,6 @@ //If they're SSD, remove it so they can wake back up. player_logged = 0 - //Vents if(ventcrawler) to_chat(src, "You can ventcrawl! Use alt+click on vents to quickly travel about the station.") diff --git a/code/modules/mob/living/logout.dm b/code/modules/mob/living/logout.dm index 910a72aeca3..87384669a7c 100644 --- a/code/modules/mob/living/logout.dm +++ b/code/modules/mob/living/logout.dm @@ -9,4 +9,4 @@ if(mind.active) Sleeping(2) player_logged = 1 - last_logout = world.time + last_logout = world.time \ No newline at end of file diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 5f0397becfe..ccf319b0884 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -38,7 +38,7 @@ var/list/ai_verbs_default = list( name = "AI" icon = 'icons/mob/ai.dmi'// icon_state = "ai" - move_resist = MOVE_FORCE_VERY_STRONG + move_resist = MOVE_FORCE_NORMAL density = 1 status_flags = CANSTUN|CANPARALYSE|CANPUSH mob_size = MOB_SIZE_LARGE @@ -534,14 +534,12 @@ var/list/ai_verbs_default = list( if(!isturf(loc)) // if their location isn't a turf return // stop - var/is_anchored = FALSE - if(move_resist == MOVE_FORCE_VERY_STRONG) - move_resist = MOVE_FORCE_VERY_STRONG + if(anchored) + anchored = FALSE else - is_anchored = TRUE - move_resist = MOVE_FORCE_NORMAL + anchored = TRUE - to_chat(src, "[is_anchored ? "You are now anchored." : "You are now unanchored."]") + to_chat(src, "[anchored ? "You are now anchored." : "You are now unanchored."]") /mob/living/silicon/ai/update_canmove() return FALSE @@ -1113,7 +1111,7 @@ var/list/ai_verbs_default = list( user.visible_message("\The [user] decides not to unbolt \the [src].") return user.visible_message("\The [user] finishes unfastening \the [src]!") - anchored = 0 + anchored = FALSE return else user.visible_message("\The [user] starts to bolt \the [src] to the plating...") @@ -1121,7 +1119,7 @@ var/list/ai_verbs_default = list( user.visible_message("\The [user] decides not to bolt \the [src].") return user.visible_message("\The [user] finishes fastening down \the [src]!") - anchored = 1 + anchored = TRUE return else return ..() diff --git a/code/modules/mob/living/silicon/ai/update_status.dm b/code/modules/mob/living/silicon/ai/update_status.dm index 18a35534db8..fd001956c67 100644 --- a/code/modules/mob/living/silicon/ai/update_status.dm +++ b/code/modules/mob/living/silicon/ai/update_status.dm @@ -2,7 +2,7 @@ if(status_flags & GODMODE) return if(stat != DEAD) - if(health <= config.health_threshold_dead) + if(health <= HEALTH_THRESHOLD_DEAD && check_death_method()) death() create_debug_log("died of damage, trigger reason: [reason]") return diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index 752cdc0f631..5f37177f674 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -230,7 +230,7 @@ if(on_fire) overlays += image("icon"='icons/mob/OnFire.dmi', "icon_state"="Generic_mob_burning") -/mob/living/silicon/robot/fire_act() +/mob/living/silicon/robot/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE) if(!on_fire) //Silicons don't gain stacks from hotspots, but hotspots can ignite them IgniteMob() diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 5cbdf9f3fa8..a84af2c8254 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -144,6 +144,7 @@ modules += new /obj/item/robotanalyzer(src) modules += new /obj/item/reagent_scanner/adv(src) modules += new /obj/item/borg_defib(src) + modules += new /obj/item/handheld_defibrillator(src) modules += new /obj/item/roller_holder(src) modules += new /obj/item/reagent_containers/borghypo(src) modules += new /obj/item/reagent_containers/glass/beaker/large(src) @@ -412,6 +413,7 @@ modules += new /obj/item/reagent_scanner/adv(src) modules += new /obj/item/bodyanalyzer/borg/syndicate(src) modules += new /obj/item/borg_defib(src) + modules += new /obj/item/handheld_defibrillator(src) modules += new /obj/item/roller_holder(src) modules += new /obj/item/reagent_containers/borghypo/syndicate(src) modules += new /obj/item/extinguisher/mini(src) @@ -427,6 +429,7 @@ modules += new /obj/item/bonesetter(src) modules += new /obj/item/surgicaldrill(src) modules += new /obj/item/gripper/medical(src) + modules += new /obj/item/gun/medbeam(src) modules += new /obj/item/melee/energy/sword/cyborg/saw(src) //Energy saw -- primary weapon modules += new /obj/item/card/emag(src) modules += new /obj/item/crowbar/cyborg(src) diff --git a/code/modules/mob/living/simple_animal/bot/emote.dm b/code/modules/mob/living/simple_animal/bot/emote.dm index 2ea085464a7..eb6a18e8657 100644 --- a/code/modules/mob/living/simple_animal/bot/emote.dm +++ b/code/modules/mob/living/simple_animal/bot/emote.dm @@ -1,4 +1,4 @@ -/mob/living/simple_animal/bot/emote(var/act, var/m_type=1, var/message = null) +/mob/living/simple_animal/bot/emote(act, m_type=1, message = null) var/param = null if(findtext(act, "-", 1, null)) var/t1 = findtext(act, "-", 1, null) @@ -69,4 +69,6 @@ playsound(src.loc, 'sound/goonstation/voice/robot_scream.ogg', 80, 0) m_type = 2 + if("help") + to_chat(src, "scream(s), yes, no, beep, buzz, ping") ..(act, m_type, message) diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index c37b54938ac..9532daabab8 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -11,6 +11,7 @@ speak_emote = list("purrs", "meows") emote_hear = list("meows", "mews") emote_see = list("shakes its head", "shivers") + var/meow_sound = 'sound/creatures/cat_meow.ogg' //Used in emote. speak_chance = 1 turns_per_move = 5 see_in_dark = 6 @@ -146,6 +147,40 @@ stop_automated_movement = 1 walk_to(src,movement_target,0,3) +/mob/living/simple_animal/pet/cat/emote(act, m_type=1, message = null) + if(stat != CONSCIOUS) + return + + var/on_CD = 0 + act = lowertext(act) + switch(act) + if("meow") + on_CD = handle_emote_CD() + if("hiss") + on_CD = handle_emote_CD() + if("purr") + on_CD = handle_emote_CD() + else + on_CD = 0 + + if(on_CD == 1) + return + + switch(act) + if("meow") + message = "[src] [pick(emote_hear)]!" + m_type = 2 //audible + playsound(src, meow_sound, 50, 0.75) + if("hiss") + message = "[src] hisses!" + m_type = 2 + if("purr") + message = "[src] purrs." + m_type = 2 + if("help") + to_chat(src, "scream, meow, hiss, purr") + + ..() /mob/living/simple_animal/pet/cat/Proc name = "Proc" @@ -168,6 +203,7 @@ icon_living = "Syndicat" icon_dead = "Syndicat_dead" icon_resting = "Syndicat_rest" + meow_sound = null //Need robo-meow. gender = FEMALE mutations = list(BREATHLESS) faction = list("syndicate") diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm index 4d7ff459563..832d92c9d8f 100644 --- a/code/modules/mob/living/simple_animal/friendly/corgi.dm +++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm @@ -13,6 +13,8 @@ speak_emote = list("barks", "woofs") emote_hear = list("barks", "woofs", "yaps","pants") emote_see = list("shakes its head", "shivers") + var/bark_sound = list('sound/creatures/dog_bark1.ogg','sound/creatures/dog_bark2.ogg') //Used in emote. + var/yelp_sound = 'sound/creatures/dog_yelp.ogg' //Used on death. speak_chance = 1 turns_per_move = 10 butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/corgi = 3) @@ -401,6 +403,40 @@ return valid +/mob/living/simple_animal/pet/corgi/death(gibbed) + playsound(src, yelp_sound, 75, 1) + ..() + +/mob/living/simple_animal/pet/corgi/emote(act, m_type=1, message = null) + if(stat != CONSCIOUS) + return + + var/on_CD = 0 + act = lowertext(act) + switch(act) + if("bark") + on_CD = handle_emote_CD() + if("growl") + on_CD = handle_emote_CD() + else + on_CD = 0 + + if(on_CD == 1) + return + + switch(act) + if("bark") + message = "[src] [pick(src.speak_emote)]!" + m_type = 2 //audible + playsound(src, pick(src.bark_sound), 50, 0.85) + if("growl") + message = "[src] growls!" + m_type = 2 //audible + if("help") + to_chat(src, "scream, bark, growl") + + ..() + //IAN! SQUEEEEEEEEE~ /mob/living/simple_animal/pet/corgi/Ian @@ -574,6 +610,8 @@ desc = "It's a borgi." icon_state = "borgi" icon_living = "borgi" + bark_sound = null //No robo-bjork... + yelp_sound = null //Or robo-Yelp. var/emagged = 0 atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 diff --git a/code/modules/mob/living/simple_animal/friendly/crab.dm b/code/modules/mob/living/simple_animal/friendly/crab.dm index 6e49437455e..94ecb71703b 100644 --- a/code/modules/mob/living/simple_animal/friendly/crab.dm +++ b/code/modules/mob/living/simple_animal/friendly/crab.dm @@ -11,9 +11,9 @@ speak_chance = 1 turns_per_move = 5 butcher_results = list(/obj/item/reagent_containers/food/snacks/meat = 1) - response_help = "pets the" - response_disarm = "gently pushes aside the" - response_harm = "stomps the" + response_help = "pets" + response_disarm = "gently pushes aside" + response_harm = "stomps" stop_automated_movement = 1 friendly = "pinches" ventcrawler = 2 diff --git a/code/modules/mob/living/simple_animal/friendly/diona.dm b/code/modules/mob/living/simple_animal/friendly/diona.dm index d4f40c6cf43..07a5fcf0131 100644 --- a/code/modules/mob/living/simple_animal/friendly/diona.dm +++ b/code/modules/mob/living/simple_animal/friendly/diona.dm @@ -32,7 +32,7 @@ melee_damage_upper = 8 attacktext = "bites" attack_sound = 'sound/weapons/bite.ogg' - var/chirp_sound = 'sound/misc/nymphchirp.ogg' //used in emote + var/chirp_sound = 'sound/creatures/nymphchirp.ogg' //used in emote speed = 0 stop_automated_movement = 0 @@ -109,6 +109,8 @@ forceMove(M) else get_scooped(M) + else + ..() /mob/living/simple_animal/diona/proc/merge() if(stat != CONSCIOUS) @@ -278,5 +280,7 @@ message = "\The [src] chirps!" m_type = 2 //audible playsound(src, chirp_sound, 40, 1, 1) + if("help") + to_chat(src, "scream, chirp") ..(act, m_type, message) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index d8a3f793d3a..03f353754fe 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -13,9 +13,9 @@ turns_per_move = 5 see_in_dark = 6 butcher_results = list(/obj/item/reagent_containers/food/snacks/meat = 4) - response_help = "pets the" - response_disarm = "gently pushes aside the" - response_harm = "kicks the" + response_help = "pets" + response_disarm = "gently pushes aside" + response_harm = "kicks" faction = list("neutral") attack_same = 1 attacktext = "kicks" diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index 228b67beecc..c84947c7363 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -10,16 +10,16 @@ speak_emote = list("squeeks","squeaks","squiks") emote_hear = list("squeeks","squeaks","squiks") emote_see = list("runs in a circle", "shakes", "scritches at something") - var/squeak_sound = 'sound/effects/mousesqueek.ogg' + var/squeak_sound = 'sound/creatures/mousesqueak.ogg' speak_chance = 1 turns_per_move = 5 see_in_dark = 6 maxHealth = 5 health = 5 butcher_results = list(/obj/item/reagent_containers/food/snacks/meat = 1) - response_help = "pets the" - response_disarm = "gently pushes aside the" - response_harm = "stamps on the" + response_help = "pets" + response_disarm = "gently pushes aside" + response_harm = "stamps on" density = 0 ventcrawler = 2 pass_flags = PASSTABLE | PASSGRILLE | PASSMOB @@ -74,7 +74,6 @@ desc = "It's a small [mouse_color] rodent, often seen hiding in maintenance areas and making a nuisance of itself." /mob/living/simple_animal/mouse/proc/splat() - playsound(src, squeak_sound, 40, 1) src.health = 0 src.stat = DEAD src.icon_dead = "mouse_[mouse_color]_splat" @@ -102,6 +101,7 @@ /mob/living/simple_animal/mouse/death(gibbed) // Only execute the below if we successfully died + playsound(src, squeak_sound, 40, 1) . = ..(gibbed) if(!.) return FALSE @@ -126,7 +126,7 @@ switch(act) if("squeak") - message = "\The [src] squeaks!" + message = "\The [src] [pick(emote_hear)]!" m_type = 2 //audible playsound(src, squeak_sound, 40, 1) if("help") diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm index 4516a44a935..5ebefeba405 100644 --- a/code/modules/mob/living/simple_animal/hostile/bees.dm +++ b/code/modules/mob/living/simple_animal/hostile/bees.dm @@ -11,7 +11,7 @@ /mob/living/simple_animal/hostile/poison/bees name = "bee" - desc = "buzzy buzzy bee, stingy sti- Ouch!" + desc = "Buzzy buzzy bee, stingy sti- Ouch!" icon_state = "" icon_living = "" icon = 'icons/mob/bees.dmi' @@ -33,25 +33,28 @@ environment_smash = 0 mouse_opacity = MOUSE_OPACITY_OPAQUE pass_flags = PASSTABLE | PASSGRILLE | PASSMOB - flying = 1 - search_objects = 1 //have to find those plant trays! - density = 0 + density = FALSE mob_size = MOB_SIZE_TINY + flying = TRUE + search_objects = TRUE //have to find those plant trays! //Spaceborn beings don't get hurt by space atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 - del_on_death = 1 + del_on_death = TRUE var/datum/reagent/beegent = null //hehe, beegent var/obj/structure/beebox/beehome = null - var/isqueen = FALSE var/idle = 0 + var/isqueen = FALSE + var/bee_syndicate = FALSE var/icon_base = "bee" var/static/list/bee_icons = list() + var/static/beehometypecache = typecacheof(/obj/structure/beebox) + var/static/hydroponicstypecache = typecacheof(/obj/machinery/hydroponics) /mob/living/simple_animal/hostile/poison/bees/Process_Spacemove(movement_dir = 0) - return 1 + return TRUE /mob/living/simple_animal/hostile/poison/bees/New() ..() @@ -65,6 +68,20 @@ beehome = null return ..() +/mob/living/simple_animal/hostile/poison/bees/death(gibbed) + . = ..() + if(!.) + return + if(beehome) + if(beehome.bees) + beehome.bees.Remove(src) + beehome = null + +/mob/living/simple_animal/hostile/poison/bees/examine(mob/user) + ..() + if(!bee_syndicate && !beehome) + to_chat(user, "This bee is homeless!") + /mob/living/simple_animal/hostile/poison/bees/proc/generate_bee_visuals() overlays.Cut() @@ -94,21 +111,45 @@ //We don't attack beekeepers/people dressed as bees//Todo: bee costume /mob/living/simple_animal/hostile/poison/bees/CanAttack(atom/the_target) . = ..() - return . + if(!.) + return FALSE + if(!bee_syndicate && isliving(the_target)) + var/mob/living/H = the_target + return !H.bee_friendly() /mob/living/simple_animal/hostile/poison/bees/Found(atom/A) if(isliving(A)) - var/mob/living/L = A - return !L.bee_friendly() - return 0 + var/mob/living/H = A + return !H.bee_friendly() + if(istype(A, /obj/machinery/hydroponics)) + var/obj/machinery/hydroponics/Hydro = A + if(Hydro.myseed && !Hydro.dead && !Hydro.recent_bee_visit) + wanted_objects |= hydroponicstypecache //so we only hunt them while they're alive/seeded/not visisted + return TRUE + return FALSE /mob/living/simple_animal/hostile/poison/bees/AttackingTarget() - if(beegent && isliving(target)) - var/mob/living/L = target - if(!isnull(target.reagents)) - beegent.reaction_mob(L, INGEST) - L.reagents.add_reagent(beegent.id, rand(1,5)) - target.attack_animal(src) + //Pollinate + if(istype(target, /obj/machinery/hydroponics)) + var/obj/machinery/hydroponics/Hydro = target + pollinate(Hydro) + else if(istype(target, /obj/structure/beebox)) + if(target == beehome) + var/obj/structure/beebox/BB = target + forceMove(BB) + target = null + wanted_objects -= beehometypecache //so we don't attack beeboxes when not going home + return //no don't attack the goddamm box + else + ..() + if(isliving(target)) + var/mob/living/L = target + if(L.reagents) + if(beegent) + beegent.reaction_mob(L, INGEST) + L.reagents.add_reagent(beegent.id, rand(1, 5)) + else + L.reagents.add_reagent("spidertoxin", 5) /mob/living/simple_animal/hostile/poison/bees/proc/assign_reagent(datum/reagent/R) if(istype(R)) @@ -116,81 +157,13 @@ name = "[initial(name)] ([R.name])" generate_bee_visuals() -/mob/living/simple_animal/hostile/poison/bees/handle_automated_action() - . = ..() - if(!.) - return - -/mob/living/simple_animal/hostile/poison/bees/proc/reagent_incompatible(mob/living/simple_animal/hostile/poison/bees/B) - if(!B) - return 0 - if(B.beegent && beegent && B.beegent.id != beegent.id || B.beegent && !beegent || !B.beegent && beegent) - return 1 - return 0 - -//Botany Worker Bees -/mob/living/simple_animal/hostile/poison/bees/worker - //Blank type define in case we need to give them special stuff later, plus organization (currently they are same as base type bee) - - -/mob/living/simple_animal/hostile/poison/bees/worker/Destroy() - if(beehome) - if(beehome.bees) - beehome.bees.Remove(src) - beehome = null - return ..() - -/mob/living/simple_animal/hostile/poison/bees/worker/death(gibbed) - . = ..() - if(!.) - return - if(beehome) - if(beehome.bees) - beehome.bees.Remove(src) - beehome = null - -/mob/living/simple_animal/hostile/poison/bees/worker/examine(mob/user) - ..() - - if(!beehome) - to_chat(user, "This bee is homeless!") - -/mob/living/simple_animal/hostile/poison/bees/worker/Found(atom/A) - if(istype(A, /obj/machinery/hydroponics)) - var/obj/machinery/hydroponics/Hydro = A - if(Hydro.myseed && !Hydro.dead && !Hydro.recent_bee_visit && !Hydro.lid_state) - wanted_objects |= /obj/machinery/hydroponics //so we only hunt them while they're alive/seeded/not visisted and uncovered - return 1 - ..() - -/mob/living/simple_animal/hostile/poison/bees/worker/CanAttack(atom/the_target) - . = ..() - if(!.) - return 0 - if(isliving(the_target)) //Should ignore ghosts and camera mobs already, but just in case - var/mob/living/L = the_target - return !L.bee_friendly() - -/mob/living/simple_animal/hostile/poison/bees/worker/AttackingTarget() - //Pollinate - if(istype(target, /obj/machinery/hydroponics)) - var/obj/machinery/hydroponics/Hydro = target - pollinate(Hydro) - else if(target == beehome) - var/obj/structure/beebox/BB = target - forceMove(BB) - target = null - wanted_objects -= /obj/structure/beebox //so we don't attack beeboxes when not going home - else - ..() - -/mob/living/simple_animal/hostile/poison/bees/worker/proc/pollinate(obj/machinery/hydroponics/Hydro) +/mob/living/simple_animal/hostile/poison/bees/proc/pollinate(obj/machinery/hydroponics/Hydro) if(!istype(Hydro) || !Hydro.myseed || Hydro.dead || Hydro.recent_bee_visit || Hydro.lid_state) target = null return target = null //so we pick a new hydro tray next FindTarget(), instead of loving the same plant for eternity - wanted_objects -= /obj/machinery/hydroponics //so we only hunt them while they're alive/seeded/not visisted and uncovered + wanted_objects -= hydroponicstypecache //so we only hunt them while they're alive/seeded/not visisted Hydro.recent_bee_visit = TRUE spawn(BEE_TRAY_RECENT_VISIT) if(Hydro) @@ -210,68 +183,79 @@ if(beehome) beehome.bee_resources = min(beehome.bee_resources + growth, 100) -/mob/living/simple_animal/hostile/poison/bees/worker/handle_automated_action() +/mob/living/simple_animal/hostile/poison/bees/handle_automated_action() . = ..() if(!.) return - if(!isqueen) - if(loc == beehome) - idle = min(100, ++idle) - if(idle >= BEE_IDLE_ROAMING && prob(BEE_PROB_GOROAM)) - forceMove(get_turf(beehome)) - else - idle = max(0, --idle) - if(idle <= BEE_IDLE_GOHOME && prob(BEE_PROB_GOHOME)) - if(!FindTarget()) - wanted_objects += /obj/structure/beebox //so we don't attack beeboxes when not going home - target = beehome - if(!beehome) //add outselves to a beebox (of the same reagent) if we have no home - for(var/obj/structure/beebox/BB in view(vision_range, src)) - if(reagent_incompatible(BB.queen_bee) || BB.bees.len >= BB.get_max_bees()) - continue - BB.bees |= src - beehome = BB - + if(!bee_syndicate) + if(!isqueen) + if(loc == beehome) + idle = min(100, ++idle) + if(idle >= BEE_IDLE_ROAMING && prob(BEE_PROB_GOROAM)) + forceMove(beehome.drop_location()) + else + idle = max(0, --idle) + if(idle <= BEE_IDLE_GOHOME && prob(BEE_PROB_GOHOME)) + if(!FindTarget()) + wanted_objects |= beehometypecache //so we don't attack beeboxes when not going home + target = beehome + if(!beehome) //add ourselves to a beebox (of the same reagent) if we have no home + for(var/obj/structure/beebox/BB in view(vision_range, src)) + if(reagent_incompatible(BB.queen_bee) || BB.bees.len >= BB.get_max_bees()) + continue + BB.bees |= src + beehome = BB + break // End loop after the first compatible find. //Botany Queen Bee /mob/living/simple_animal/hostile/poison/bees/queen name = "queen bee" - desc = "she's the queen of bees, BZZ BZZ" + desc = "She's the queen of bees, BZZ BZZ" icon_base = "queen" isqueen = TRUE - //the Queen doesn't leave the box on her own, and she CERTAINLY doesn't pollinate by herself +//the Queen doesn't leave the box on her own, and she CERTAINLY doesn't pollinate by herself /mob/living/simple_animal/hostile/poison/bees/queen/Found(atom/A) - return 0 + return FALSE + +//leave pollination for the peasent bees +/mob/living/simple_animal/hostile/poison/bees/queen/AttackingTarget() + ..() + if(beegent && isliving(target)) + var/mob/living/L = target + beegent.reaction_mob(L, TOUCH) + L.reagents.add_reagent(beegent.id, rand(1, 5)) + +//PEASENT BEES +/mob/living/simple_animal/hostile/poison/bees/queen/pollinate() + return + +/mob/living/simple_animal/hostile/poison/bees/proc/reagent_incompatible(mob/living/simple_animal/hostile/poison/bees/B) + if(!B) + return FALSE + if(B.beegent && beegent && B.beegent.id != beegent.id || B.beegent && !beegent || !B.beegent && beegent) + return TRUE + return FALSE -/mob/living/simple_animal/hostile/poison/bees/queen/CanAttack(atom/the_target) - . = ..() - if(!.) - return 0 - if(isliving(the_target)) //Should ignore ghosts and camera mobs already, but just in case - var/mob/living/L = the_target - return !L.bee_friendly() /obj/item/queen_bee name = "queen bee" - desc = "she's the queen of bees, BZZ BZZ" + desc = "She's the queen of bees, BZZ BZZ" icon_state = "queen_item" item_state = "" icon = 'icons/mob/bees.dmi' var/mob/living/simple_animal/hostile/poison/bees/queen/queen + /obj/item/queen_bee/attackby(obj/item/I, mob/user, params) - if(istype(I,/obj/item/reagent_containers/syringe)) + if(istype(I, /obj/item/reagent_containers/syringe)) var/obj/item/reagent_containers/syringe/S = I if(S.reagents.has_reagent("royal_bee_jelly")) //checked twice, because I really don't want royal bee jelly to be duped - if(S.reagents.has_reagent("royal_bee_jelly",5)) + if(S.reagents.has_reagent("royal_bee_jelly", 5)) S.reagents.remove_reagent("royal_bee_jelly", 5) - if(!queen.beegent.can_synth) - to_chat(user, "You inject [src] with the royal bee jelly. It's ineffective! Maybe it's something to do with the [src] reagent.") - return - var/obj/item/queen_bee/qb = new(get_turf(user)) + var/obj/item/queen_bee/qb = new(user.drop_location()) qb.queen = new(qb) if(queen && queen.beegent) qb.queen.assign_reagent(queen.beegent) //Bees use the global singleton instances of reagents, so we don't need to worry about one bee being deleted and her copies losing their reagents. @@ -282,16 +266,17 @@ else var/datum/reagent/R = GLOB.chemical_reagents_list[S.reagents.get_master_reagent_id()] if(R && S.reagents.has_reagent(R.id, 5)) - S.reagents.remove_reagent(R.id,5) + S.reagents.remove_reagent(R.id, 5) queen.assign_reagent(R) - user.visible_message("[user] injects [src]'s genome with [R.name], mutating it's DNA!","You inject [src]'s genome with [R.name], mutating it's DNA!") + user.visible_message("[user] injects [src]'s genome with [R.name], mutating its DNA!", "You inject [src]'s genome with [R.name], mutating its DNA!") name = queen.name else to_chat(user, "You don't have enough units of that chemical to modify the bee's DNA!") - ..() + else + return ..() -/obj/item/queen_bee/bought/New() - ..() +/obj/item/queen_bee/bought/Initialize(mapload) + . = ..() queen = new(src) /obj/item/queen_bee/Destroy() @@ -299,7 +284,6 @@ return ..() - //Syndicate Bees /mob/living/simple_animal/hostile/poison/bees/syndi name = "syndi-bee" @@ -309,10 +293,14 @@ maxHealth = 25 health = 25 faction = list("hostile", "syndicate") - search_objects = 0 //these bees don't care about trivial things like plants, especially when there is havoc to sow - beegent = new /datum/reagent/facid() //prepare to die + search_objects = FALSE //these bees don't care about trivial things like plants, especially when there is havoc to sow + bee_syndicate = TRUE var/list/master_and_friends = list() +/mob/living/simple_animal/hostile/poison/bees/syndi/New() + beegent = GLOB.chemical_reagents_list["facid"] //Prepare to die + ..() + /mob/living/simple_animal/hostile/poison/bees/syndi/Destroy() master_and_friends.Cut() return ..() @@ -320,24 +308,27 @@ /mob/living/simple_animal/hostile/poison/bees/syndi/assign_reagent(datum/reagent/R) return -/mob/living/simple_animal/hostile/poison/bees/syndi/Found(atom/A) - return CanAttack(A) +/mob/living/simple_animal/hostile/poison/bees/syndi/pollinate() // No Pollination + return + +/mob/living/simple_animal/hostile/poison/bees/syndi/Found(atom/A) //Typical usual hostile mob targeting list + return /mob/living/simple_animal/hostile/poison/bees/syndi/CanAttack(atom/the_target) . = ..() if(!.) - return 0 + return FALSE if(isliving(the_target)) var/mob/living/L = the_target if(ishuman(L)) var/mob/living/carbon/human/H = L if(H in master_and_friends) - return 0 - return 1 + return FALSE + return TRUE /mob/living/simple_animal/hostile/poison/bees/syndi/AttackingTarget() ..() if(target && isliving(target)) var/mob/living/L = target if(L.stat) - LoseTarget() + LoseTarget() \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/hellhound.dm b/code/modules/mob/living/simple_animal/hostile/hellhound.dm index 450f6767892..f3e110d0099 100644 --- a/code/modules/mob/living/simple_animal/hostile/hellhound.dm +++ b/code/modules/mob/living/simple_animal/hostile/hellhound.dm @@ -71,7 +71,7 @@ else if(health > (maxHealth*0.25)) msgs += "It is covered in wounds!" if(resting) - if(bruteloss > 0 || fireloss > 0) + if(getBruteLoss() || getFireLoss()) msgs += "It is currently licking its wounds, regenerating the damage to its body!" else msgs += "It is currently resting." @@ -79,7 +79,7 @@ /mob/living/simple_animal/hostile/hellhound/Life(seconds, times_fired) . = ..() - if(stat != DEAD && resting && (bruteloss > 0) || (fireloss > 0)) + if(stat != DEAD && resting && (getBruteLoss() || getFireLoss())) if(life_regen_cycles >= life_regen_cycle_trigger) life_regen_cycles = 0 to_chat(src, "You lick your wounds, helping them close.") @@ -91,7 +91,7 @@ /mob/living/simple_animal/hostile/hellhound/proc/wants_to_rest() if(target) return FALSE - if(bruteloss > 0 || fireloss > 0) + if(getBruteLoss() || getFireLoss()) return TRUE return FALSE diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index ccbd37f2f4c..50568fb37d0 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -53,6 +53,7 @@ if(!targets_from) targets_from = src environment_target_typecache = typecacheof(environment_target_typecache) + wanted_objects = typecacheof(wanted_objects) /mob/living/simple_animal/hostile/Destroy() targets_from = null @@ -205,7 +206,7 @@ return 0 return 1 if(isobj(the_target)) - if(is_type_in_list(the_target, wanted_objects)) + if(is_type_in_typecache(the_target, wanted_objects)) return 1 return 0 diff --git a/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm index 4041e95c6c7..74a28c58c3f 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm @@ -98,7 +98,7 @@ /obj/item/organ/internal/hivelord_core/on_life() ..() - if(owner.health < config.health_threshold_crit) + if(owner.health < HEALTH_THRESHOLD_CRIT) ui_action_click() /obj/item/organ/internal/hivelord_core/afterattack(atom/target, mob/user, proximity_flag) 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 0f37482b3e2..81b384f56b7 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm @@ -238,8 +238,8 @@ if(istype(target, /obj/item/clothing/suit/space/hardsuit/mining) || istype(target, /obj/item/clothing/head/helmet/space/hardsuit/mining) || istype(target, /obj/item/clothing/suit/space/eva/plasmaman/miner) || istype(target, /obj/item/clothing/head/helmet/space/eva/plasmaman/miner)) var/obj/item/clothing/C = target var/current_armor = C.armor - if(current_armor.["melee"] < 60) - current_armor.["melee"] = min(current_armor.["melee"] + 10, 60) + if(current_armor["melee"] < 60) + current_armor["melee"] = min(current_armor["melee"] + 10, 60) to_chat(user, "You strengthen [target], improving its resistance against melee attacks.") qdel(src) else @@ -260,7 +260,7 @@ qdel(src) D.overlays += image("icon"="mecha.dmi", "icon_state"="ripley-g-open") D.desc = "Autonomous Power Loader Unit. Its armour is enhanced with some goliath hide plates." - if(damage_absorption.["brute"] == 0.3) + if(damage_absorption["brute"] == 0.3) D.overlays += image("icon"="mecha.dmi", "icon_state"="ripley-g-full-open") D.desc = "Autonomous Power Loader Unit. It's wearing a fearsome carapace entirely composed of goliath hide plates - the pilot must be an experienced monster hunter." else diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/empress.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/empress.dm index 51028a69111..14353c4dfd0 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/empress.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/empress.dm @@ -24,6 +24,12 @@ canlay = 1000 spider_tier = TS_TIER_5 projectiletype = /obj/item/projectile/terrorqueenspit/empress + icon = 'icons/mob/terrorspider64.dmi' + pixel_x = -16 + mob_size = MOB_SIZE_LARGE + icon_state = "terror_empress" + icon_living = "terror_empress" + icon_dead = "terror_empress_dead" var/datum/action/innate/terrorspider/queen/empress/empresslings/empresslings_action var/datum/action/innate/terrorspider/queen/empress/empresserase/empresserase_action atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) @@ -42,7 +48,7 @@ queenfakelings_action.button.name = "Empress Lings" /mob/living/simple_animal/hostile/poison/terror_spider/queen/empress/LayQueenEggs() - var/eggtype = input("What kind of eggs?") as null|anything in list(TS_DESC_QUEEN, TS_DESC_MOTHER, TS_DESC_PRINCE, TS_DESC_PRINCESS, TS_DESC_RED, TS_DESC_GRAY, TS_DESC_GREEN, TS_DESC_BLACK, TS_DESC_PURPLE, TS_DESC_WHITE) + var/eggtype = input("What kind of eggs?") as null|anything in list(TS_DESC_QUEEN, TS_DESC_MOTHER, TS_DESC_PRINCE, TS_DESC_PRINCESS, TS_DESC_RED, TS_DESC_GRAY, TS_DESC_GREEN, TS_DESC_BLACK, TS_DESC_PURPLE, TS_DESC_WHITE, TS_DESC_BROWN) var/numlings = input("How many in the batch?") as null|anything in list(1, 2, 3, 4, 5, 10, 15, 20, 30, 40, 50) if(eggtype == null || numlings == null) to_chat(src, "Cancelled.") @@ -60,6 +66,8 @@ DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/purple, numlings) if(TS_DESC_WHITE) DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/white, numlings) + if(TS_DESC_BROWN) + DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/brown, numlings) if(TS_DESC_PRINCE) DoLayTerrorEggs(/mob/living/simple_animal/hostile/poison/terror_spider/prince, numlings) if(TS_DESC_PRINCESS) diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/mother.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/mother.dm index 354f99db8af..d1e171d2f55 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/mother.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/mother.dm @@ -38,6 +38,8 @@ if(can_die()) if(spider_awaymission && !is_away_level(z)) canspawn = FALSE + if(degenerate) + canspawn = FALSE if(canspawn) canspawn = FALSE for(var/i in 0 to spawn_count) diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/queen.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/queen.dm index ed2ea164634..2839dedb237 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/queen.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/queen.dm @@ -142,9 +142,8 @@ visible_message("\The [src] looks around warily - then seeks a better nesting ground.") path_to_vent = 1 else - visible_message("\The [src] looks around, searching for the vent that should be there, but isn't. A bluespace portal forms on her, and she is gone.") - qdel(src) - new /obj/effect/portal(get_turf(loc)) + neststep = -1 + message_admins("Warning: [key_name_admin(src)] was spawned in an area without a vent! This is likely a mapping/spawn mistake. This mob's AI has been permanently deactivated.") if(1) // No nest, and we should create one. Start NestMode(), then advance to step 2. if(world.time > (lastnestsetup + nestfrequency)) diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm index 562c90588f8..39c03feb928 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm @@ -71,6 +71,9 @@ var/global/list/ts_spiderling_list = list() speak_emote = list("hisses") emote_hear = list("hisses") + // Sentience Type + sentience_type = SENTIENCE_OTHER + // Languages are handled in terror_spider/New() // Interaction keywords @@ -313,12 +316,12 @@ var/global/list/ts_spiderling_list = list() adjustToxLoss(rand(1,10)) if(regen_points < regen_points_max) regen_points += regen_points_per_tick - if((bruteloss > 0) || (fireloss > 0)) + if(getBruteLoss() || getFireLoss()) if(regen_points > regen_points_per_hp) - if(bruteloss > 0) + if(getBruteLoss()) adjustBruteLoss(-1) regen_points -= regen_points_per_hp - else if(fireloss > 0) + else if(getFireLoss()) adjustFireLoss(-1) regen_points -= regen_points_per_hp if(prob(5)) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 27e544e56d6..02f15a59709 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -266,6 +266,8 @@ if("scream") message = "\The [src] whimpers." m_type = 2 + if("help") + to_chat(src, "scream") ..(act, m_type, message) diff --git a/code/modules/mob/living/stat_states.dm b/code/modules/mob/living/stat_states.dm index fa5530091c9..70cced62aab 100644 --- a/code/modules/mob/living/stat_states.dm +++ b/code/modules/mob/living/stat_states.dm @@ -33,7 +33,7 @@ /mob/living/proc/can_be_revived() . = TRUE // if(health <= min_health) - if(health <= config.health_threshold_dead) + if(health <= HEALTH_THRESHOLD_DEAD) return FALSE // death() is used to make a mob die @@ -71,3 +71,6 @@ spell.updateButtonIcon() return 1 + +/mob/living/proc/check_death_method() + return TRUE \ No newline at end of file diff --git a/code/modules/mob/living/status_procs.dm b/code/modules/mob/living/status_procs.dm index 4e5c778b7fb..d47f21b8d46 100644 --- a/code/modules/mob/living/status_procs.dm +++ b/code/modules/mob/living/status_procs.dm @@ -297,6 +297,9 @@ SetLoseBreath(max(losebreath, amount)) /mob/living/SetLoseBreath(amount) + if(BREATHLESS in mutations) + losebreath = 0 + return FALSE losebreath = max(amount, 0) /mob/living/AdjustLoseBreath(amount, bound_lower = 0, bound_upper = INFINITY) diff --git a/code/modules/mob/living/update_status.dm b/code/modules/mob/living/update_status.dm index daf058bb41b..bec41f68698 100644 --- a/code/modules/mob/living/update_status.dm +++ b/code/modules/mob/living/update_status.dm @@ -110,7 +110,7 @@ if(status_flags & GODMODE) return if(stat != DEAD) - if(health <= config.health_threshold_dead) + if(health <= HEALTH_THRESHOLD_DEAD && check_death_method()) death() create_debug_log("died of damage, trigger reason: [reason]") else if(paralysis || status_flags & FAKEDEATH) diff --git a/code/modules/mob/logout.dm b/code/modules/mob/logout.dm index 762607bd501..f409d184340 100644 --- a/code/modules/mob/logout.dm +++ b/code/modules/mob/logout.dm @@ -16,7 +16,5 @@ send2irc(config.admin_notify_irc, "[key_name(src)] logged out - No active admins, [admincounter[2]] non-admin staff, [admincounter[3]] inactive staff.") ..() - callHook("mob_logout", list("client" = client, "mob" = src)) - return 1 diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index e0d20f01a48..ee04e624f02 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -580,6 +580,10 @@ var/list/slot_equipment_priority = list( \ to_chat(src, "Something is there but you can't see it.") return 1 + var/is_antag = (isAntag(src) || isobserver(src)) //ghosts don't have minds + if(client) + client.update_description_holders(A, is_antag) + face_atom(A) A.examine(src) diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 77c74c4396e..3e9ff0b7ba6 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -173,6 +173,9 @@ //SSD var, changed it up some so people can have special things happen for different mobs when SSD. var/player_logged = 0 + //Ghosted var, set only if a player has manually ghosted out of this mob. + var/player_ghosted = 0 + var/turf/listed_turf = null //the current turf being examined in the stat panel var/list/shouldnt_see = list(/atom/movable/lighting_overlay) //list of objects that this mob shouldn't see in the stat panel. this silliness is needed because of AI alt+click and cult blood runes diff --git a/code/modules/mob/new_player/sprite_accessories/human/human_hair.dm b/code/modules/mob/new_player/sprite_accessories/human/human_hair.dm index 720243eaada..bc9931a8782 100644 --- a/code/modules/mob/new_player/sprite_accessories/human/human_hair.dm +++ b/code/modules/mob/new_player/sprite_accessories/human/human_hair.dm @@ -684,6 +684,73 @@ //////END POLARIS HAIRSTYLES/////// ////////////////////////////////// +////////////////////// +////Ume hairstyles//// +////////////////////// + +/datum/sprite_accessory/hair/eighties_ponytail + name = "80's ponytail" + icon_state = "80_ponytail" + +/datum/sprite_accessory/hair/eighties_ponytailalt + name = "80's ponytail alt" + icon_state = "80_ponytail_alt" + +/datum/sprite_accessory/hair/big_bow + name = "Big bow" + icon_state = "big_bow" + +/datum/sprite_accessory/hair/buns + name = "Buns" + icon_state = "buns" + +/datum/sprite_accessory/hair/himecut_long + name = "Himecut long" + icon_state = "himecut_long" + +/datum/sprite_accessory/hair/himecut_long_ponytail + name = "Himecut long ponytail" + icon_state = "himecut_long_ponytail" + +/datum/sprite_accessory/hair/himecut_ponytail + name = "Himecut ponytail" + icon_state = "himecut_ponytail" + +/datum/sprite_accessory/hair/ombre_twintails + name = "Ombre twintails" + icon_state = "ombre_twintails" + +/datum/sprite_accessory/hair/ombre_twintails_alt + name = "Ombre twintails alt" + icon_state = "ombre_twintails_alt" + +/datum/sprite_accessory/hair/sailor + name = "Sailor" + icon_state = "sailor" + +/datum/sprite_accessory/hair/amanita_short + name = "Amanita short" + icon_state = "amanita_short" + +/datum/sprite_accessory/hair/long_curls + name = "Long curls" + icon_state = "long_curls" + +/datum/sprite_accessory/hair/long_curls_alt + name = "Long curls alt" + icon_state = "long_curls_alt" + +/datum/sprite_accessory/hair/long_buns + name = "Long buns" + icon_state = "long_buns" + +/datum/sprite_accessory/hair/low_twins + name = "Low twins" + icon_state = "low_twins" + +///Ume hairs end here/// + + ///Fluff HairStyles// /datum/sprite_accessory/hair/fluff/pinapple_fluff_hair //Pineapple Salad hair fluff its for a slime..has to go under human name = "Sasook Hair" diff --git a/code/modules/mob/typing_indicator.dm b/code/modules/mob/typing_indicator.dm index 9c6c8f2fa73..9ad5449ee8b 100644 --- a/code/modules/mob/typing_indicator.dm +++ b/code/modules/mob/typing_indicator.dm @@ -39,7 +39,7 @@ var/global/image/typing_indicator set_typing_indicator(1) hud_typing = 1 - var/message = input("","say (text)") as null|text + var/message = typing_input(src, "", "say (text)") hud_typing = 0 set_typing_indicator(0) if(message) @@ -49,9 +49,10 @@ var/global/image/typing_indicator set name = ".Me" set hidden = 1 + set_typing_indicator(1) hud_typing = 1 - var/message = input("","me (text)") as null|text + var/message = typing_input(src, "", "me (text)") hud_typing = 0 set_typing_indicator(0) if(message) diff --git a/code/modules/paperwork/contract.dm b/code/modules/paperwork/contract.dm index 68cc26725cf..c1124bee744 100644 --- a/code/modules/paperwork/contract.dm +++ b/code/modules/paperwork/contract.dm @@ -15,7 +15,7 @@ /obj/item/paper/contract/employment - icon_state = "paper_words" + icon_state = "good_contract" signed = TRUE /obj/item/paper/contract/employment/New(atom/loc, mob/living/nOwner) @@ -37,7 +37,6 @@
Further, SLAVE agrees to transfer ownership of his or her soul to the loyalty department of the omnipresent and helpful watcher of humanity.\
Should transfership of a soul not be possible, a lien shall be placed instead.
Signed,
[target]" - /obj/item/paper/contract/employment/attack(mob/living/M, mob/living/carbon/human/user) var/deconvert = 0 if(M.mind == target && target.soulOwner != target) @@ -58,7 +57,7 @@ var/contractType = 0 burn_state = LAVA_PROOF var/datum/mind/owner - icon_state = "paper_onfire" + icon_state = "evil_contract" /obj/item/paper/contract/infernal/power name = "paper- contract for infernal power" @@ -105,7 +104,7 @@ H.visible_message("[H] holds up a contract claiming his soul, then immediately catches fire. It looks like \he's trying to commit suicide!") H.adjust_fire_stacks(20) H.IgniteMob() - return(FIRELOSS) + return FIRELOSS else ..() diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm index f4808f46d53..13d85941a79 100644 --- a/code/modules/paperwork/faxmachine.dm +++ b/code/modules/paperwork/faxmachine.dm @@ -283,34 +283,25 @@ var/global/list/fax_blacklist = list() use_power(200) - var/obj/item/rcvdcopy - if(istype(copyitem, /obj/item/paper)) - rcvdcopy = copy(copyitem) - else if(istype(copyitem, /obj/item/photo)) - rcvdcopy = photocopy(copyitem) - else if(istype(copyitem, /obj/item/paper_bundle)) - rcvdcopy = bundlecopy(copyitem) - else + if(!(istype(copyitem, /obj/item/paper) || istype(copyitem, /obj/item/paper_bundle) || istype(copyitem, /obj/item/photo))) visible_message("[src] beeps, \"Error transmitting message.\"") return - rcvdcopy.loc = null //hopefully this shouldn't cause trouble - var/datum/fax/admin/A = new /datum/fax/admin() - A.name = rcvdcopy.name + A.name = copyitem.name A.from_department = department A.to_department = destination A.origin = src - A.message = rcvdcopy + A.message = copyitem A.sent_by = sender A.sent_at = world.time //message badmins that a fax has arrived switch(destination) if("Central Command") - message_admins(sender, "CENTCOM FAX", destination, rcvdcopy, "#006100") + message_admins(sender, "CENTCOM FAX", destination, copyitem, "#006100") if("Syndicate") - message_admins(sender, "SYNDICATE FAX", destination, rcvdcopy, "#DC143C") + message_admins(sender, "SYNDICATE FAX", destination, copyitem, "#DC143C") for(var/obj/machinery/photocopier/faxmachine/F in allfaxes) if(F.department == destination) F.receivefax(copyitem) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 36af97b0972..d5ca6b0b0f8 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -401,7 +401,7 @@ add_fingerprint(user) -/obj/item/paper/fire_act() +/obj/item/paper/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE) ..() if(burn_state >= FLAMMABLE) //Only render paper that's burnable to be hard to read. info = "[stars(info)]" @@ -711,7 +711,7 @@ H.reagents.add_reagent(contact_poison, contact_poison_volume) contact_poison = null add_attack_logs(src, user, "Picked up [src], the paper poisoned by [contact_poison_poisoner]") - ..() + . = ..() /obj/item/paper/researchnotes name = "paper - 'Research Notes'" diff --git a/code/modules/paperwork/paper_bundle.dm b/code/modules/paperwork/paper_bundle.dm index da241a9c007..01974ad3694 100644 --- a/code/modules/paperwork/paper_bundle.dm +++ b/code/modules/paperwork/paper_bundle.dm @@ -131,7 +131,7 @@ usr << browse(dat + "[P.name]" \ + "" \ + "

Written on the back:
[P.scribble]" : ]"\ + + "[P.scribble ? "

Written on the back:
[P.scribble]" : ""]"\ + "", "window=[name]") /obj/item/paper_bundle/attack_self(mob/user as mob) diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index a3f41c0ac25..e8643c97cff 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -12,7 +12,7 @@ var/amount = 30 //How much paper is in the bin. var/list/papers = list() //List of papers put in the bin for reference. -/obj/item/paper_bin/fire_act() +/obj/item/paper_bin/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE) if(!amount) return ..() diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 83897e5cbd3..302f2e02342 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -26,7 +26,7 @@ /obj/item/pen/suicide_act(mob/user) to_chat(viewers(user), "[user] starts scribbling numbers over [user.p_them()]self with the [name]! It looks like [user.p_theyre()] trying to commit sudoku.") - return (BRUTELOSS) + return BRUTELOSS /obj/item/pen/blue name = "blue-ink pen" diff --git a/code/modules/paperwork/stamps.dm b/code/modules/paperwork/stamps.dm index 9bb3a09ebb0..8e78f0ce230 100644 --- a/code/modules/paperwork/stamps.dm +++ b/code/modules/paperwork/stamps.dm @@ -15,7 +15,7 @@ /obj/item/stamp/suicide_act(mob/user) user.visible_message("[user] stamps 'VOID' on [user.p_their()] forehead, then promptly falls over, dead.") - return (OXYLOSS) + return OXYLOSS /obj/item/stamp/qm name = "Quartermaster's rubber stamp" diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 410b91bdf48..238d2e43599 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -504,7 +504,7 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list( user.visible_message("[user] is making a noose with the [name]! It looks like [user.p_theyre()] trying to commit suicide.") else user.visible_message("[user] is strangling [user.p_them()]self with the [name]! It looks like [user.p_theyre()] trying to commit suicide.") - return(OXYLOSS) + return OXYLOSS /obj/item/stack/cable_coil/New(loc, length = MAXCOIL, paramcolor = null) ..() diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index 3bc2b5bc39b..192ef9d792e 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -90,7 +90,7 @@ /obj/item/stock_parts/cell/suicide_act(mob/user) to_chat(viewers(user), "[user] is licking the electrodes of the [src]! It looks like [user.p_theyre()] trying to commit suicide.") - return (FIRELOSS) + return FIRELOSS /obj/item/stock_parts/cell/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/reagent_containers/syringe)) diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index dcd884da879..8dda1ed8731 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -586,6 +586,7 @@ // called when on fire /obj/machinery/light/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) + ..() if(prob(max(0, exposed_temperature - 673))) //0% at <400C, 100% at >500C broken() diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 5178c8ff173..d5dfb454e09 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -311,7 +311,7 @@ obj/item/gun/proc/newshot() visible_message("[src]'s light fades and turns off.") /obj/item/gun/pickup(mob/user) - ..() + . = ..() if(azoom) azoom.Grant(user) diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 795b5942845..8c9b0cf66f8 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -154,14 +154,14 @@ var/obj/item/ammo_casing/energy/shot = ammo_type[select] power_supply.use(shot.e_cost) update_icon() - return(FIRELOSS) + return FIRELOSS else user.visible_message("[user] panics and starts choking to death!") - return(OXYLOSS) + return OXYLOSS else user.visible_message("[user] is pretending to blow [user.p_their()] brains out with the [name]! It looks like [user.p_theyre()] trying to commit suicide!
") playsound(loc, 'sound/weapons/empty.ogg', 50, 1, -1) - return (OXYLOSS) + return OXYLOSS /obj/item/gun/energy/vv_edit_var(var_name, var_value) switch(var_name) diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 74ab90fcbc4..623986f5837 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -137,7 +137,7 @@ playsound(loc, 'sound/weapons/kenetic_reload.ogg', 60, 1) user.visible_message("[user] cocks the [name] and pretends to blow [user.p_their()] brains out! It looks like [user.p_theyre()] trying to commit suicide!
") shoot_live_shot() - return (OXYLOSS) + return OXYLOSS // Plasma Cutters // /obj/item/gun/energy/plasmacutter diff --git a/code/modules/projectiles/guns/medbeam.dm b/code/modules/projectiles/guns/medbeam.dm index d77621051e2..face61e79c3 100644 --- a/code/modules/projectiles/guns/medbeam.dm +++ b/code/modules/projectiles/guns/medbeam.dm @@ -54,8 +54,8 @@ feedback_add_details("gun_fired","[type]") /obj/item/gun/medbeam/process() - var/mob/living/carbon/human/H = loc - if(!istype(H)) + var/source = loc + if(!ishuman(source) && !isrobot(source)) LoseTarget() return @@ -68,9 +68,9 @@ last_check = world.time - if(get_dist(H,current_target)>max_range || !los_check(H,current_target)) + if(get_dist(source,current_target)>max_range || !los_check(source,current_target)) LoseTarget() - to_chat(H, "You lose control of the beam!") + to_chat(source, "You lose control of the beam!") return if(current_target) diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm index 6e558dedbd1..9defe7637d4 100644 --- a/code/modules/projectiles/guns/projectile.dm +++ b/code/modules/projectiles/guns/projectile.dm @@ -55,7 +55,7 @@ /obj/item/gun/projectile/proc/can_reload() return !magazine -/obj/item/gun/projectile/proc/reload(obj/item/ammo_box/magazine/AM, mob/user as mob) +/obj/item/gun/projectile/proc/reload(obj/item/ammo_box/magazine/AM, mob/user as mob) user.remove_from_mob(AM) magazine = AM magazine.loc = src @@ -81,7 +81,7 @@ to_chat(user, "You perform a tactical reload on \the [src], replacing the magazine.") magazine.loc = get_turf(loc) magazine.update_icon() - magazine = null + magazine = null reload(AM, user) return TRUE else @@ -165,14 +165,14 @@ if(user.l_hand == src || user.r_hand == src) process_fire(user, user, 0, zone_override = "head") user.visible_message("[user] blows [user.p_their()] brains out with the [name]!") - return(BRUTELOSS) + return BRUTELOSS else user.visible_message("[user] panics and starts choking to death!") - return(OXYLOSS) + return OXYLOSS else user.visible_message("[user] is pretending to blow [user.p_their()] brains out with the [name]! It looks like [user.p_theyre()] trying to commit suicide!") playsound(loc, 'sound/weapons/empty.ogg', 50, 1, -1) - return (OXYLOSS) + return OXYLOSS /obj/item/gun/projectile/proc/sawoff(mob/user) if(sawn_state == SAWN_OFF) diff --git a/code/modules/reagents/chem_splash.dm b/code/modules/reagents/chem_splash.dm index e586e6f806b..c73ffc72ced 100644 --- a/code/modules/reagents/chem_splash.dm +++ b/code/modules/reagents/chem_splash.dm @@ -25,8 +25,7 @@ for(var/datum/reagents/R in reactants) R.trans_to(splash_holder, R.total_volume, threatscale, 1, 1) total_temp += R.chem_temp - splash_holder.chem_temp = (total_temp/reactants.len) + extra_heat // Average temperature of reagents + extra heat. - splash_holder.handle_reactions() // React them now. + splash_holder.set_reagent_temp((total_temp / reactants.len) + extra_heat) // Average temperature of reagents + extra heat. if(splash_holder.total_volume && affected_range >= 0) //The possible reactions didnt use up all reagents, so we spread it around. var/datum/effect_system/steam_spread/steam = new /datum/effect_system/steam_spread() diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index fa2a8d71a9a..66f010b86e3 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -9,7 +9,7 @@ var/const/INGEST = 2 var/total_volume = 0 var/maximum_volume = 100 var/atom/my_atom = null - var/chem_temp = 300 + var/chem_temp = T20C var/list/datum/reagent/addiction_list = new/list() var/flags @@ -166,6 +166,30 @@ var/const/INGEST = 2 handle_reactions() return amount +/datum/reagents/proc/set_reagent_temp(new_temp = T0C, react = TRUE) + chem_temp = new_temp + if(react) + temperature_react() + handle_reactions() + +/datum/reagents/proc/temperature_react() //Calls the temperature reaction procs without changing the temp. + for(var/datum/reagent/current_reagent in reagent_list) + current_reagent.reaction_temperature(chem_temp, 100) + +/datum/reagents/proc/temperature_reagents(exposed_temperature, divisor = 35, change_cap = 15) //This is what you use to change the temp of a reagent holder. + //Do not manually change the reagent unless you know what youre doing. + var/difference = abs(chem_temp - exposed_temperature) + var/change = min(max((difference / divisor), 1), change_cap) + if(exposed_temperature > chem_temp) + chem_temp += change + else if(exposed_temperature < chem_temp) + chem_temp -= change + + chem_temp = max(min(chem_temp, 10000), 0) //Cap for the moment. + temperature_react() + + handle_reactions() + /datum/reagents/proc/trans_id_to(obj/target, reagent, amount=1, preserve_data=1)//Not sure why this proc didn't exist before. It does now! /N if(!target) return @@ -194,8 +218,7 @@ var/const/INGEST = 2 /datum/reagents/proc/metabolize(mob/living/M) if(M) - chem_temp = M.bodytemperature - handle_reactions() + set_reagent_temp(M.bodytemperature) // a bitfield filled in by each reagent's `on_mob_life` to find out which states to update var/update_flags = STATUS_UPDATE_NONE @@ -269,6 +292,8 @@ var/const/INGEST = 2 if(prob(20) && (world.timeofday > (R.last_addiction_dose + ADDICTION_TIME))) //Each addiction lasts 8 minutes before it can end to_chat(M, "You no longer feel reliant on [R.name]!") addiction_list.Remove(R) + qdel(R) + if(update_flags & STATUS_UPDATE_HEALTH) M.updatehealth("reagent metabolism") else if(update_flags & STATUS_UPDATE_STAT) @@ -440,8 +465,8 @@ var/const/INGEST = 2 add_reagent(S, C.result_amount * C.secondary_results[S] * multiplier) var/list/seen = viewers(4, get_turf(my_atom)) - for(var/mob/M in seen) - if(!C.no_message) + for(var/mob/living/M in seen) + if(C.mix_message) to_chat(M, "[bicon(my_atom)] [C.mix_message]") if(istype(my_atom, /obj/item/slime_extract)) @@ -453,7 +478,8 @@ var/const/INGEST = 2 ME2.name = "used slime extract" ME2.desc = "This extract has been used up." - playsound(get_turf(my_atom), C.mix_sound, 80, 1) + if(C.mix_sound) + playsound(get_turf(my_atom), C.mix_sound, 80, 1) C.on_reaction(src, created_volume) reaction_occured = 1 @@ -531,6 +557,35 @@ var/const/INGEST = 2 react_type = "OBJ" else return + + if(react_type == "LIVING" && ishuman(A)) + var/mob/living/carbon/human/H = A + if(method == TOUCH) + var/obj/item/organ/external/head/affecting = H.get_organ("head") + if(affecting) + if(chem_temp > H.dna.species.heat_level_1) + if(H.reagent_safety_check()) + to_chat(H, "You are scalded by the hot chemicals!") + affecting.receive_damage(0, round(log(chem_temp / 50) * 10)) + H.emote("scream") + H.adjust_bodytemperature(min(max((chem_temp - T0C) - 20, 5), 500)) + else if(chem_temp < H.dna.species.cold_level_1) + if(H.reagent_safety_check(FALSE)) + to_chat(H, "You are frostbitten by the freezing cold chemicals!") + affecting.receive_damage(0, round(log(T0C - chem_temp / 50) * 10)) + H.emote("scream") + H.adjust_bodytemperature(- min(max(T0C - chem_temp - 20, 5), 500)) + + if(method == INGEST) + if(chem_temp > H.dna.species.heat_level_1) + to_chat(H, "You scald yourself trying to consume the boiling hot substance!") + H.adjustFireLoss(7) + H.adjust_bodytemperature(min(max((chem_temp - T0C) - 20, 5), 700)) + else if(chem_temp < H.dna.species.cold_level_1) + to_chat(H, "You frostburn yourself trying to consume the freezing cold substance!") + H.adjustFireLoss(7) + H.adjust_bodytemperature(- min(max((T0C - chem_temp) - 20, 5), 700)) + for(var/datum/reagent/R in reagent_list) switch(react_type) if("LIVING") @@ -548,14 +603,14 @@ var/const/INGEST = 2 var/amt = list_reagents[r_id] add_reagent(r_id, amt, data) -/datum/reagents/proc/add_reagent(reagent, amount, list/data=null, reagtemp = 300, no_react = 0) +/datum/reagents/proc/add_reagent(reagent, amount, list/data=null, reagtemp = T20C, no_react = 0) if(!isnum(amount)) return 1 update_total() if(total_volume + amount > maximum_volume) amount = (maximum_volume - total_volume) //Doesnt fit in. Make it disappear. Shouldnt happen. Will happen. if(amount <= 0) return 0 - chem_temp = round(((amount * reagtemp) + (total_volume * chem_temp)) / (total_volume + amount)) //equalize with new chems + chem_temp = (chem_temp * total_volume + reagtemp * amount) / (total_volume + amount) //equalize with new chems for(var/A in reagent_list) @@ -567,6 +622,7 @@ var/const/INGEST = 2 my_atom.on_reagent_change() R.on_merge(data) if(!no_react) + temperature_react() handle_reactions() return 0 @@ -585,6 +641,7 @@ var/const/INGEST = 2 if(my_atom) my_atom.on_reagent_change() if(!no_react) + temperature_react() handle_reactions() return 0 else diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index e827d282e21..258237f0ddd 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -1,38 +1,80 @@ /obj/machinery/chem_dispenser name = "chem dispenser" - density = 1 - anchored = 1 + density = TRUE + anchored = TRUE icon = 'icons/obj/chemical.dmi' icon_state = "dispenser" - use_power = NO_POWER_USE + use_power = IDLE_POWER_USE idle_power_usage = 40 var/ui_title = "Chem Dispenser 5000" - var/energy = 100 - var/max_energy = 100 - var/amount = 30 + var/cell_type = /obj/item/stock_parts/cell/high + var/obj/item/stock_parts/cell/cell + var/powerefficiency = 0.1 + var/amount = 10 + var/recharge_amount = 100 + var/recharge_counter = 0 + var/hackedcheck = FALSE var/obj/item/reagent_containers/beaker = null - var/recharged = 0 - var/hackedcheck = 0 + var/image/icon_beaker = null //cached overlay var/list/dispensable_reagents = list("hydrogen", "lithium", "carbon", "nitrogen", "oxygen", "fluorine", "sodium", "aluminum", "silicon", "phosphorus", "sulfur", "chlorine", "potassium", "iron", "copper", "mercury", "plasma", "radium", "water", "ethanol", "sugar", "iodine", "bromine", "silver") + var/list/upgrade_reagents = list("oil", "ash", "acetone", "saltpetre", "ammonia", "diethylamine", "fuel") var/list/hacked_reagents = list("toxin") var/hack_message = "You disable the safety safeguards, enabling the \"Mad Scientist\" mode." var/unhack_message = "You re-enable the safety safeguards, enabling the \"NT Standard\" mode." - var/list/broken_requirements = list() - var/broken_on_spawn = 0 - var/recharge_delay = 5 - var/image/icon_beaker = null //cached overlay + +/obj/machinery/chem_dispenser/New() + ..() + component_parts = list() + component_parts += new /obj/item/circuitboard/chem_dispenser(null) + component_parts += new /obj/item/stock_parts/matter_bin(null) + component_parts += new /obj/item/stock_parts/matter_bin(null) + component_parts += new /obj/item/stock_parts/capacitor(null) + component_parts += new /obj/item/stock_parts/manipulator(null) + component_parts += new /obj/item/stock_parts/console_screen(null) + component_parts += new cell_type(null) + RefreshParts() + dispensable_reagents = sortList(dispensable_reagents) + +/obj/machinery/chem_dispenser/RefreshParts() + recharge_amount = initial(recharge_amount) + var/newpowereff = 0.0666666 + for(var/obj/item/stock_parts/cell/P in component_parts) + cell = P + for(var/obj/item/stock_parts/matter_bin/M in component_parts) + newpowereff += 0.0166666666 * M.rating + for(var/obj/item/stock_parts/capacitor/C in component_parts) + recharge_amount *= C.rating + for(var/obj/item/stock_parts/manipulator/M in component_parts) + if(M.rating > 3) + dispensable_reagents |= upgrade_reagents + powerefficiency = round(newpowereff, 0.01) + +/obj/machinery/chem_dispenser/Destroy() + QDEL_NULL(beaker) + QDEL_NULL(cell) + return ..() + +/obj/machinery/chem_dispenser/examine(mob/user) + ..() + if(panel_open) + to_chat(user, "[src]'s maintenance hatch is open!") + if(in_range(user, src) || isobserver(user)) + to_chat(user, "The status display reads:
Recharging [recharge_amount] power units per interval.
Power efficiency increased by [round((powerefficiency * 1000) - 100, 1)]%.") -/obj/machinery/chem_dispenser/proc/recharge() - if(stat & (BROKEN|NOPOWER)) return - var/addenergy = 1 - var/oldenergy = energy - energy = min(energy + addenergy, max_energy) - if(energy != oldenergy) - use_power(1500) // This thing uses up alot of power (this is still low as shit for creating reagents from thin air) - SSnanoui.update_uis(src) // update all UIs attached to src +/obj/machinery/chem_dispenser/process() + if(recharge_counter >= 4) + if(!is_operational()) + return + var/usedpower = cell.give(recharge_amount) + if(usedpower) + use_power(15 * recharge_amount) + SSnanoui.update_uis(src) // update all UIs attached to src + recharge_counter = 0 + return + recharge_counter++ /obj/machinery/chem_dispenser/power_change() if(powered()) @@ -42,72 +84,19 @@ stat |= NOPOWER SSnanoui.update_uis(src) // update all UIs attached to src -/obj/machinery/chem_dispenser/process() - - if(recharged < 0) - recharge() - recharged = recharge_delay - else - recharged -= 1 - -/obj/machinery/chem_dispenser/New() - ..() - recharge() - dispensable_reagents = sortList(dispensable_reagents) - - if(broken_on_spawn) - overlays.Cut() - var/amount = pick(3,3,4) - var/list/options = list() - options[/obj/item/stock_parts/capacitor/adv] = "Add an advanced capacitor to fix it." - options[/obj/item/stock_parts/console_screen] = "Replace the console screen to fix it." - options[/obj/item/stock_parts/manipulator/pico] = "Upgrade to a pico manipulator to fix it." - options[/obj/item/stock_parts/matter_bin/super] = "Give it a super matter bin to fix it." - options[/obj/item/stock_parts/cell/super] = "Replace the reagent synthesizer with a super capacity cell to fix it." - options[/obj/item/reagent_scanner/adv] = "Replace the reagent scanner with an advanced reagent scanner to fix it" - options[/obj/item/stock_parts/micro_laser/high] = "Repair the reagent synthesizer with an high-power micro-laser to fix it" - options[/obj/item/reagent_scanner/adv] = "Replace the reagent scanner with an advanced reagent scanner to fix it" - options[/obj/item/stack/nanopaste] = "Apply some nanopaste to the broken nozzles to fix it." - options[/obj/item/stack/sheet/plasteel] = "Surround the outside with a plasteel cover to fix it." - options[/obj/item/stack/sheet/rglass] = "Insert a pane of reinforced glass to fix it." - - while(amount > 0) - amount -= 1 - - var/index = pick(options) - broken_requirements[index] = options[index] - options -= index - - /obj/machinery/chem_dispenser/ex_act(severity) switch(severity) - if(1.0) + if(1) qdel(src) - return - if(2.0) + if(2) if(prob(50)) qdel(src) - return /obj/machinery/chem_dispenser/blob_act() if(prob(50)) qdel(src) - /** - * The ui_interact proc is used to open and update Nano UIs - * If ui_interact is not used then the UI will not update correctly - * ui_interact is currently defined for /atom/movable - * - * @param user /mob The mob who is interacting with this ui - * @param ui_key string A string key to use for this ui. Allows for multiple unique uis on one obj/mob (defaut value "main") - * - * @return nothing - */ /obj/machinery/chem_dispenser/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1) - if(broken_requirements.len) - to_chat(user, "[src] is broken. [broken_requirements[broken_requirements[1]]]") - return - // update the ui if it exists, returns null if no ui is passed/found ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) @@ -121,8 +110,8 @@ var/data[0] data["amount"] = amount - data["energy"] = round(energy) - data["maxEnergy"] = round(max_energy) + data["energy"] = cell.charge ? cell.charge * powerefficiency : "0" //To prevent NaN in the UI. + data["maxEnergy"] = cell.maxcharge * powerefficiency data["isBeakerLoaded"] = beaker ? 1 : 0 var/beakerContents[0] @@ -151,26 +140,32 @@ /obj/machinery/chem_dispenser/Topic(href, href_list) if(..()) - return 1 + return TRUE if(href_list["amount"]) - amount = round(text2num(href_list["amount"]), 5) // round to nearest 5 + amount = round(text2num(href_list["amount"]), 1) // round to nearest 1 if(amount < 0) // Since the user can actually type the commands himself, some sanity checking amount = 0 if(amount > 100) amount = 100 if(href_list["dispense"]) - if(dispensable_reagents.Find(href_list["dispense"]) && beaker != null) - var/obj/item/reagent_containers/glass/B = beaker - var/datum/reagents/R = B.reagents - var/space = R.maximum_volume - R.total_volume + if(!is_operational() || QDELETED(cell)) + return + if(beaker && dispensable_reagents.Find(href_list["dispense"])) + var/datum/reagents/R = beaker.reagents + var/free = R.maximum_volume - R.total_volume + var/actual = min(amount, (cell.charge * powerefficiency) * 10, free) - R.add_reagent(href_list["dispense"], min(amount, energy * 10, space)) - energy = max(energy - min(amount, energy * 10, space) / 10, 0) + if(!cell.use(actual / powerefficiency)) + atom_say("Not enough energy to complete operation!") + return + + R.add_reagent(href_list["dispense"], actual) overlays.Cut() - icon_beaker = image('icons/obj/chemical.dmi', src, "disp_beaker") //randomize beaker overlay position. - icon_beaker.pixel_x = rand(-10,5) + if(!icon_beaker) + icon_beaker = image('icons/obj/chemical.dmi', src, "disp_beaker") //randomize beaker overlay position. + icon_beaker.pixel_x = rand(-10, 5) overlays += icon_beaker if(href_list["remove"]) @@ -178,75 +173,96 @@ if(href_list["removeamount"]) var/amount = text2num(href_list["removeamount"]) if(isnum(amount) && (amount > 0)) - var/obj/item/reagent_containers/glass/B = beaker - var/datum/reagents/R = B.reagents + var/datum/reagents/R = beaker.reagents var/id = href_list["remove"] R.remove_reagent(id, amount) + else if(isnum(amount) && (amount == -1)) //Isolate instead + var/datum/reagents/R = beaker.reagents + var/id = href_list["remove"] + R.isolate_reagent(id) if(href_list["ejectBeaker"]) if(beaker) - var/obj/item/reagent_containers/glass/B = beaker - B.forceMove(loc) + beaker.forceMove(loc) beaker = null overlays.Cut() - add_fingerprint(usr) - return 1 // update UIs attached to this object -/obj/machinery/chem_dispenser/attackby(obj/item/reagent_containers/B, mob/user, params) - if(isrobot(user)) + add_fingerprint(usr) + return TRUE // update UIs attached to this object + +/obj/machinery/chem_dispenser/attackby(obj/item/I, mob/user, params) + if(ismultitool(I)) + if(!hackedcheck) + to_chat(user, hack_message) + dispensable_reagents += hacked_reagents + hackedcheck = TRUE + else + to_chat(user, unhack_message) + dispensable_reagents -= hacked_reagents + hackedcheck = FALSE + SSnanoui.update_uis(src) return - if(broken_requirements.len && B.type == broken_requirements[1]) - if(istype(B,/obj/item/stack)) - var/obj/item/stack/S = B - S.use(1) - else - if(!user.drop_item()) - to_chat(user, "[B] is stuck to you!") - return - qdel(B) - broken_requirements -= broken_requirements[1] - to_chat(user, "You fix [src].") + if(default_deconstruction_screwdriver(user, "[initial(icon_state)]-o", "[initial(icon_state)]", I)) + return + + if(exchange_parts(user, I)) + SSnanoui.update_uis(src) + return + + if(iswrench(I)) + playsound(src, I.usesound, 50, 1) + if(anchored) + anchored = FALSE + to_chat(user, "[src] can now be moved.") + else if(!anchored) + anchored = TRUE + to_chat(user, "[src] is now secured.") + return + + if(panel_open) + if(iscrowbar(I)) + if(beaker) + beaker.forceMove(loc) + beaker = null + if(cell) + cell.forceMove(loc) + cell = null + default_deconstruction_crowbar(I) + return TRUE + + if(isrobot(user)) return if(beaker) to_chat(user, "Something is already loaded into the machine.") return - if(istype(B, /obj/item/reagent_containers/glass) || istype(B, /obj/item/reagent_containers/food/drinks)) - beaker = B - if(!user.drop_item()) - to_chat(user, "[B] is stuck to you!") + if(istype(I, /obj/item/reagent_containers/glass) || istype(I, /obj/item/reagent_containers/food/drinks)) + if(panel_open) + to_chat(user, "Close the maintenance panel first.") return - B.forceMove(src) - to_chat(user, "You set [B] on the machine.") + if(!user.drop_item()) + to_chat(user, "[I] is stuck to you!") + return + beaker = I + I.forceMove(src) + to_chat(user, "You set [I] on the machine.") SSnanoui.update_uis(src) // update all UIs attached to src if(!icon_beaker) icon_beaker = image('icons/obj/chemical.dmi', src, "disp_beaker") //randomize beaker overlay position. - icon_beaker.pixel_x = rand(-10,5) + icon_beaker.pixel_x = rand(-10, 5) overlays += icon_beaker return + return ..() -/obj/machinery/chem_dispenser/attackby(obj/item/B, mob/user, params) - ..() - if(istype(B, /obj/item/multitool)) - if(hackedcheck == 0) - to_chat(user, hack_message) - dispensable_reagents += hacked_reagents - hackedcheck = 1 - return - - else - to_chat(user, unhack_message) - dispensable_reagents -= hacked_reagents - hackedcheck = 0 - return /obj/machinery/chem_dispenser/attack_ai(mob/user) return attack_hand(user) /obj/machinery/chem_dispenser/attack_ghost(mob/user) - return attack_hand(user) + if(user.can_admin_interact()) + return attack_hand(user) /obj/machinery/chem_dispenser/attack_hand(mob/user) if(stat & BROKEN) @@ -259,245 +275,45 @@ name = "soda fountain" desc = "A drink fabricating machine, capable of producing many sugary drinks with just one touch." ui_title = "Soda Dispens-o-matic" - energy = 100 - max_energy = 100 dispensable_reagents = list("water", "ice", "milk", "soymilk", "coffee", "tea", "hot_coco", "cola", "spacemountainwind", "dr_gibb", "space_up", "tonic", "sodawater", "lemon_lime", "grapejuice", "sugar", "orangejuice", "lemonjuice", "limejuice", "tomatojuice", "banana", "watermelonjuice", "carrotjuice", "potato", "berryjuice") - var/list/special_reagents2 = list(list(""), - list("bananahonk", "milkshake", "cafe_latte", "cafe_mocha"), - list("triple_citrus", "icecoffe","icetea")) + upgrade_reagents = list("bananahonk", "milkshake", "cafe_latte", "cafe_mocha", "triple_citrus", "icecoffe","icetea") + hacked_reagents = list("thirteenloko") hack_message = "You change the mode from 'McNano' to 'Pizza King'." unhack_message = "You change the mode from 'Pizza King' to 'McNano'." - hacked_reagents = list("thirteenloko") /obj/machinery/chem_dispenser/soda/New() ..() - component_parts = list() - component_parts += new /obj/item/circuitboard/soda(null) + QDEL_LIST(component_parts) + component_parts += new /obj/item/circuitboard/chem_dispenser/soda(null) component_parts += new /obj/item/stock_parts/matter_bin(null) component_parts += new /obj/item/stock_parts/matter_bin(null) component_parts += new /obj/item/stock_parts/manipulator(null) component_parts += new /obj/item/stock_parts/capacitor(null) component_parts += new /obj/item/stock_parts/console_screen(null) - component_parts += new /obj/item/stock_parts/cell/super(null) + component_parts += new cell_type(null) RefreshParts() -/obj/machinery/chem_dispenser/soda/upgraded/New() - ..() - component_parts = list() - component_parts += new /obj/item/circuitboard/soda(null) - component_parts += new /obj/item/stock_parts/matter_bin/super(null) - component_parts += new /obj/item/stock_parts/matter_bin/super(null) - component_parts += new /obj/item/stock_parts/manipulator/pico(null) - component_parts += new /obj/item/stock_parts/capacitor/super(null) - component_parts += new /obj/item/stock_parts/console_screen(null) - component_parts += new /obj/item/stock_parts/cell/hyper(null) - RefreshParts() - -/obj/machinery/chem_dispenser/soda/RefreshParts() - for(var/obj/item/stock_parts/manipulator/M in component_parts) - for(var/i in 1 to M.rating) - dispensable_reagents = sortList(dispensable_reagents | special_reagents2[i]) - -/obj/machinery/chem_dispenser/soda/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/reagent_containers/glass)) - if(panel_open) - to_chat(user, "Close the maintenance panel first.") - return - return ..() - else - ..() - - if(default_deconstruction_screwdriver(user, "minidispenser-o", "minidispenser", I)) - return - - if(exchange_parts(user, I)) - return - - if(iswrench(I)) - playsound(src, I.usesound, 50, 1) - if(anchored) - anchored = FALSE - to_chat(user, "[src] can now be moved.") - else if(!anchored) - anchored = TRUE - to_chat(user, "[src] is now secured.") - - if(panel_open) - if(iscrowbar(I)) - if(beaker) - var/obj/item/reagent_containers/glass/B = beaker - B.forceMove(loc) - beaker = null - default_deconstruction_crowbar(I) - return TRUE - - /obj/machinery/chem_dispenser/beer icon_state = "booze_dispenser" name = "booze dispenser" ui_title = "Booze Portal 9001" - energy = 100 - max_energy = 100 desc = "A technological marvel, supposedly able to mix just the mixture you'd like to drink the moment you ask for one." dispensable_reagents = list("ice", "cream", "cider", "beer", "kahlua", "whiskey", "wine", "vodka", "gin", "rum", "tequila", "vermouth", "cognac", "ale", "mead", "synthanol") - var/list/special_reagents3 = list(list("iced_beer"), - list("irishcream", "manhattan",), - list("antihol", "synthignon", "bravebull")) + upgrade_reagents = list("iced_beer", "irishcream", "manhattan", "antihol", "synthignon", "bravebull") + hacked_reagents = list("goldschlager", "patron", "absinthe", "ethanol", "nothing", "sake") hack_message = "You disable the 'nanotrasen-are-cheap-bastards' lock, enabling hidden and very expensive boozes." unhack_message = "You re-enable the 'nanotrasen-are-cheap-bastards' lock, disabling hidden and very expensive boozes." - hacked_reagents = list("goldschlager", "patron", "absinthe", "ethanol", "nothing", "sake") /obj/machinery/chem_dispenser/beer/New() ..() - component_parts = list() - component_parts += new /obj/item/circuitboard/beer(null) + QDEL_LIST(component_parts) + component_parts += new /obj/item/circuitboard/chem_dispenser/beer(null) component_parts += new /obj/item/stock_parts/matter_bin(null) component_parts += new /obj/item/stock_parts/matter_bin(null) - component_parts += new /obj/item/stock_parts/manipulator(null) component_parts += new /obj/item/stock_parts/capacitor(null) - component_parts += new /obj/item/stock_parts/console_screen(null) - component_parts += new /obj/item/stock_parts/cell/super(null) - RefreshParts() - -/obj/machinery/chem_dispenser/beer/upgraded/New() - ..() - component_parts = list() - component_parts += new /obj/item/circuitboard/beer(null) - component_parts += new /obj/item/stock_parts/matter_bin/super(null) - component_parts += new /obj/item/stock_parts/matter_bin/super(null) - component_parts += new /obj/item/stock_parts/manipulator/pico(null) - component_parts += new /obj/item/stock_parts/capacitor/super(null) - component_parts += new /obj/item/stock_parts/console_screen(null) - component_parts += new /obj/item/stock_parts/cell/hyper(null) - RefreshParts() - -/obj/machinery/chem_dispenser/beer/RefreshParts() - for(var/obj/item/stock_parts/manipulator/M in component_parts) - for(var/i in 1 to M.rating) - dispensable_reagents = sortList(dispensable_reagents | special_reagents3[i]) - -/obj/machinery/chem_dispenser/beer/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/reagent_containers/glass)) - if(panel_open) - to_chat(user, "Close the maintenance panel first.") - return - return ..() - else - ..() - - if(default_deconstruction_screwdriver(user, "minidispenser-o", "minidispenser", I)) - return - - if(exchange_parts(user, I)) - return - - if(iswrench(I)) - playsound(src, I.usesound, 50, 1) - if(anchored) - anchored = FALSE - to_chat(user, "[src] can now be moved.") - else if(!anchored) - anchored = TRUE - to_chat(user, "[src] is now secured.") - - if(panel_open) - if(iscrowbar(I)) - if(beaker) - var/obj/item/reagent_containers/glass/B = beaker - B.forceMove(loc) - beaker = null - default_deconstruction_crowbar(I) - return TRUE - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/obj/machinery/chem_dispenser/constructable - name = "portable chem dispenser" - icon = 'icons/obj/chemical.dmi' - icon_state = "minidispenser" - energy = 5 - max_energy = 5 - amount = 5 - recharge_delay = 10 - dispensable_reagents = list() - var/list/special_reagents = list(list("hydrogen", "oxygen", "silicon", "phosphorus", "sulfur", "carbon", "nitrogen", "water"), - list("lithium", "sugar", "copper", "mercury", "sodium","iodine","bromine"), - list("ethanol", "chlorine", "potassium", "aluminum","plasma", "radium", "fluorine", "iron", "silver"), - list("oil", "ash", "acetone", "saltpetre", "ammonia", "diethylamine", "fuel")) - -/obj/machinery/chem_dispenser/constructable/New() - ..() - component_parts = list() - component_parts += new /obj/item/circuitboard/chem_dispenser(null) - component_parts += new /obj/item/stock_parts/matter_bin(null) - component_parts += new /obj/item/stock_parts/matter_bin(null) component_parts += new /obj/item/stock_parts/manipulator(null) - component_parts += new /obj/item/stock_parts/capacitor(null) component_parts += new /obj/item/stock_parts/console_screen(null) - component_parts += new /obj/item/stock_parts/cell/super(null) - RefreshParts() - -/obj/machinery/chem_dispenser/constructable/upgraded/New() - ..() - component_parts = list() - component_parts += new /obj/item/circuitboard/chem_dispenser(null) - component_parts += new /obj/item/stock_parts/matter_bin/super(null) - component_parts += new /obj/item/stock_parts/matter_bin/super(null) - component_parts += new /obj/item/stock_parts/manipulator/pico(null) - component_parts += new /obj/item/stock_parts/capacitor/super(null) - component_parts += new /obj/item/stock_parts/console_screen(null) - component_parts += new /obj/item/stock_parts/cell/hyper(null) - RefreshParts() - -/obj/machinery/chem_dispenser/constructable/RefreshParts() - var/time = 0 - var/temp_energy = 0 - var/i - for(var/obj/item/stock_parts/matter_bin/M in component_parts) - temp_energy += M.rating - temp_energy-- - max_energy = temp_energy * 5 //max energy = (bin1.rating + bin2.rating - 1) * 5, 5 on lowest 25 on highest - for(var/obj/item/stock_parts/capacitor/C in component_parts) - time += C.rating - for(var/obj/item/stock_parts/cell/P in component_parts) - time += round(P.maxcharge, 10000) / 10000 - recharge_delay = 10 / (time/2) //delay between recharges, double the usual time on lowest 33% less than usual on highest - for(var/obj/item/stock_parts/manipulator/M in component_parts) - for(i=1, i<=M.rating, i++) - dispensable_reagents = sortList(dispensable_reagents | special_reagents[i]) - -/obj/machinery/chem_dispenser/constructable/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/reagent_containers/glass)) - if(panel_open) - to_chat(user, "Close the maintenance panel first.") - return - ..() - else - ..() - - if(default_deconstruction_screwdriver(user, "minidispenser-o", "minidispenser", I)) - return - - if(exchange_parts(user, I)) - return - - if(istype(I, /obj/item/wrench)) - playsound(src, I.usesound, 50, 1) - if(anchored) - anchored = 0 - to_chat(user, "[src] can now be moved.") - else if(!anchored) - anchored = 1 - to_chat(user, "[src] is now secured.") - - if(panel_open) - if(istype(I, /obj/item/crowbar)) - if(beaker) - var/obj/item/reagent_containers/glass/B = beaker - B.forceMove(loc) - beaker = null - default_deconstruction_crowbar(I) - return 1 + component_parts += new cell_type(null) + RefreshParts() \ No newline at end of file diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm index 1b84afb3d74..848c1ca4ecd 100644 --- a/code/modules/reagents/chemistry/machinery/chem_heater.dm +++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm @@ -7,8 +7,7 @@ use_power = IDLE_POWER_USE idle_power_usage = 40 var/obj/item/reagent_containers/beaker = null - var/desired_temp = 300 - var/heater_coefficient = 0.03 + var/desired_temp = T0C var/on = FALSE /obj/machinery/chem_heater/New() @@ -19,34 +18,22 @@ component_parts += new /obj/item/stock_parts/console_screen(null) RefreshParts() -/obj/machinery/chem_heater/upgraded/New() - ..() - component_parts = list() - component_parts += new /obj/item/circuitboard/chem_heater(null) - component_parts += new /obj/item/stock_parts/micro_laser/ultra(null) - component_parts += new /obj/item/stock_parts/console_screen(null) - RefreshParts() - -/obj/machinery/chem_heater/RefreshParts() - heater_coefficient = 0.03 - for(var/obj/item/stock_parts/micro_laser/M in component_parts) - heater_coefficient *= M.rating - /obj/machinery/chem_heater/process() ..() if(stat & NOPOWER) return - var/state_change = 0 + var/state_change = FALSE if(on) if(beaker) - if(beaker.reagents.chem_temp > desired_temp) - beaker.reagents.chem_temp += min(-1, max((desired_temp - beaker.reagents.chem_temp) * heater_coefficient, -15)) - if(beaker.reagents.chem_temp < desired_temp) - beaker.reagents.chem_temp += max(1, min((desired_temp - beaker.reagents.chem_temp) * heater_coefficient, 15)) - beaker.reagents.chem_temp = round(beaker.reagents.chem_temp) //stops stuff like 456.12312312302 - - beaker.reagents.handle_reactions() - state_change = 1 + if(!beaker.reagents.total_volume) + on = FALSE + SSnanoui.update_uis(src) + return + beaker.reagents.temperature_reagents(desired_temp) + beaker.reagents.temperature_reagents(desired_temp) + if(abs(beaker.reagents.chem_temp - desired_temp) <= 3) + on = FALSE + state_change = TRUE if(state_change) SSnanoui.update_uis(src) @@ -54,7 +41,6 @@ /obj/machinery/chem_heater/proc/eject_beaker() if(beaker) beaker.forceMove(get_turf(src)) - beaker.reagents.handle_reactions() beaker = null icon_state = "mixer0b" on = FALSE @@ -102,15 +88,21 @@ /obj/machinery/chem_heater/attack_hand(mob/user) ui_interact(user) +/obj/machinery/chem_heater/attack_ghost(mob/user) + if(user.can_admin_interact()) + return attack_hand(user) + /obj/machinery/chem_heater/attack_ai(mob/user) add_hiddenprint(user) return attack_hand(user) /obj/machinery/chem_heater/Topic(href, href_list) if(..()) - return 0 + return FALSE if(href_list["toggle_on"]) + if(!beaker.reagents.total_volume) + return FALSE on = !on . = 1 @@ -122,7 +114,7 @@ var/target = input("Please input the target temperature", name) as num desired_temp = Clamp(target, 0, 1000) else - return 0 + return FALSE . = 1 if(href_list["eject_beaker"]) diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index 2bd9f6d4af8..ffd3ae57bd5 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -1,7 +1,7 @@ /obj/machinery/chem_master name = "\improper ChemMaster 3000" - density = 1 - anchored = 1 + density = TRUE + anchored = TRUE icon = 'icons/obj/chemical.dmi' icon_state = "mixer0" use_power = IDLE_POWER_USE @@ -9,28 +9,44 @@ var/obj/item/reagent_containers/beaker = null var/obj/item/storage/pill_bottle/loaded_pill_bottle = null var/mode = 0 - var/condi = 0 + var/condi = FALSE var/useramount = 30 // Last used amount var/pillamount = 10 var/patchamount = 10 var/bottlesprite = "bottle" var/pillsprite = "1" var/client/has_sprites = list() - var/printing = null + var/printing = FALSE /obj/machinery/chem_master/New() + ..() create_reagents(100) + component_parts = list() + component_parts += new /obj/item/circuitboard/chem_master(null) + component_parts += new /obj/item/stock_parts/manipulator(null) + component_parts += new /obj/item/stock_parts/console_screen(null) + component_parts += new /obj/item/reagent_containers/glass/beaker(null) + component_parts += new /obj/item/reagent_containers/glass/beaker(null) + RefreshParts() update_icon() +/obj/machinery/chem_master/Destroy() + QDEL_NULL(beaker) + QDEL_NULL(loaded_pill_bottle) + return ..() + +/obj/machinery/chem_master/RefreshParts() + reagents.maximum_volume = 0 + for(var/obj/item/reagent_containers/glass/beaker/B in component_parts) + reagents.maximum_volume += B.reagents.maximum_volume + /obj/machinery/chem_master/ex_act(severity) switch(severity) - if(1.0) + if(1) qdel(src) - return - if(2.0) + if(2) if(prob(50)) qdel(src) - return /obj/machinery/chem_master/update_icon() overlays.Cut() @@ -50,43 +66,64 @@ stat |= NOPOWER update_icon() -/obj/machinery/chem_master/attackby(obj/item/B, mob/user, params) - if(default_unfasten_wrench(user, B)) +/obj/machinery/chem_master/attackby(obj/item/I, mob/user, params) + if(default_deconstruction_screwdriver(user, "mixer0_nopower", "mixer0", I)) + if(beaker) + beaker.forceMove(get_turf(src)) + beaker = null + reagents.clear_reagents() + if(loaded_pill_bottle) + loaded_pill_bottle.forceMove(get_turf(src)) + loaded_pill_bottle = null + return + + if(exchange_parts(user, I)) + return + + if(panel_open) + if(iscrowbar(I)) + default_deconstruction_crowbar(I) + return TRUE + else + to_chat(user, "You can't use the [name] while it's panel is opened!") + return TRUE + + if(default_unfasten_wrench(user, I)) power_change() return - if(istype(B, /obj/item/reagent_containers/glass) || istype(B, /obj/item/reagent_containers/food/drinks/drinkingglass)) - + if(istype(I, /obj/item/reagent_containers/glass) || istype(I, /obj/item/reagent_containers/food/drinks/drinkingglass)) if(beaker) to_chat(user, "A beaker is already loaded into the machine.") return if(!user.drop_item()) - to_chat(user, "[B] is stuck to you!") + to_chat(user, "[I] is stuck to you!") return - beaker = B - B.forceMove(src) + beaker = I + I.forceMove(src) to_chat(user, "You add the beaker to the machine!") SSnanoui.update_uis(src) update_icon() - else if(istype(B, /obj/item/storage/pill_bottle)) - + else if(istype(I, /obj/item/storage/pill_bottle)) if(loaded_pill_bottle) - to_chat(user, "A pill bottle is already loaded into the machine.") + to_chat(user, "A [loaded_pill_bottle] is already loaded into the machine.") return if(!user.drop_item()) - to_chat(user, "[B] is stuck to you!") + to_chat(user, "[I] is stuck to you!") return - loaded_pill_bottle = B - B.forceMove(src) - to_chat(user, "You add the pill bottle into the dispenser slot!") + + loaded_pill_bottle = I + I.forceMove(src) + to_chat(user, "You add [I] into the dispenser slot!") SSnanoui.update_uis(src) - return + else + return ..() /obj/machinery/chem_master/Topic(href, href_list) if(..()) - return 1 + return TRUE add_fingerprint(usr) usr.set_machine(src) @@ -103,8 +140,8 @@ return if(href_list["print_p"]) - if(!(printing)) - printing = 1 + if(!printing) + printing = TRUE visible_message("[src] rattles and prints out a sheet of paper.") playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1) var/obj/item/paper/P = new /obj/item/paper(loc) @@ -125,7 +162,7 @@ P.info += "Description: [href_list["desc"]]" P.info += "

Notes:
" P.name = "Chemical Analysis - [href_list["name"]]" - printing = null + printing = FALSE if(beaker) var/datum/reagents/R = beaker.reagents @@ -203,10 +240,13 @@ if(count == null) return count = isgoodnumber(count) - if(count > 20) count = 20 //Pevent people from creating huge stacks of pills easily. Maybe move the number to defines? - if(count <= 0) return - var/amount_per_pill = reagents.total_volume/count - if(amount_per_pill > 50) amount_per_pill = 50 + if(count > 20) + count = 20 //Pevent people from creating huge stacks of pills easily. Maybe move the number to defines? + if(count <= 0) + return + var/amount_per_pill = reagents.total_volume / count + if(amount_per_pill > 100) + amount_per_pill = 100 var/name = input(usr,"Name:","Name your pill!","[reagents.get_master_reagent_name()] ([amount_per_pill]u)") as text|null if(!name) return @@ -216,18 +256,19 @@ to_chat(usr, "Not enough reagents to create these pills!") return var/obj/item/reagent_containers/food/pill/P = new/obj/item/reagent_containers/food/pill(loc) - if(!name) name = reagents.get_master_reagent_name() + if(!name) + name = reagents.get_master_reagent_name() P.name = "[name] pill" P.pixel_x = rand(-7, 7) //random position P.pixel_y = rand(-7, 7) P.icon_state = "pill"+pillsprite - reagents.trans_to(P,amount_per_pill) - if(loaded_pill_bottle) + reagents.trans_to(P, amount_per_pill) + if(loaded_pill_bottle && loaded_pill_bottle.type == /obj/item/storage/pill_bottle) if(loaded_pill_bottle.contents.len < loaded_pill_bottle.storage_slots) P.forceMove(loaded_pill_bottle) updateUsrDialog() else - var/name = input(usr,"Name:","Name your bag!",reagents.get_master_reagent_name()) as text|null + var/name = input(usr, "Name:", "Name your bag!", reagents.get_master_reagent_name()) as text|null if(!name) return name = reject_bad_text(name) @@ -236,7 +277,7 @@ P.originalname = name P.name = "[name] pack" P.desc = "A small condiment pack. The label says it contains [name]." - reagents.trans_to(P,10) + reagents.trans_to(P, 10) else if(href_list["createpatch"] || href_list["createpatch_multiple"]) if(!condi) var/count = 1 @@ -247,10 +288,12 @@ count = isgoodnumber(count) if(!count || count <= 0) return - if(count > 20) count = 20 //Pevent people from creating huge stacks of patches easily. Maybe move the number to defines? + if(count > 20) + count = 20 //Pevent people from creating huge stacks of patches easily. Maybe move the number to defines? var/amount_per_patch = reagents.total_volume/count - if(amount_per_patch > 40) amount_per_patch = 40 - var/name = input(usr,"Name:","Name your patch!","[reagents.get_master_reagent_name()] ([amount_per_patch]u)") as text|null + if(amount_per_patch > 40) + amount_per_patch = 40 + var/name = input(usr, "Name:", "Name your patch!", "[reagents.get_master_reagent_name()] ([amount_per_patch]u)") as text|null if(!name) return name = reject_bad_text(name) @@ -263,24 +306,30 @@ P.pixel_y = rand(-7, 7) reagents.trans_to(P,amount_per_patch) if(is_medical_patch) - P.instant_application = 1 + P.instant_application = TRUE P.icon_state = "bandaid_med" + if(loaded_pill_bottle && loaded_pill_bottle.type == /obj/item/storage/pill_bottle/patch_pack) + if(loaded_pill_bottle.contents.len < loaded_pill_bottle.storage_slots) + P.forceMove(loaded_pill_bottle) + updateUsrDialog() + else if(href_list["createbottle"]) if(!condi) - var/name = input(usr,"Name:","Name your bottle!",reagents.get_master_reagent_name()) as text|null + var/name = input(usr, "Name:", "Name your bottle!", reagents.get_master_reagent_name()) as text|null if(!name) return name = reject_bad_text(name) - var/obj/item/reagent_containers/glass/bottle/P = new/obj/item/reagent_containers/glass/bottle(loc) - if(!name) name = reagents.get_master_reagent_name() + var/obj/item/reagent_containers/glass/bottle/reagent/P = new/obj/item/reagent_containers/glass/bottle/reagent(loc) + if(!name) + name = reagents.get_master_reagent_name() P.name = "[name] bottle" P.pixel_x = rand(-7, 7) //random position P.pixel_y = rand(-7, 7) P.icon_state = bottlesprite - reagents.trans_to(P,30) + reagents.trans_to(P, 50) else var/obj/item/reagent_containers/food/condiment/P = new/obj/item/reagent_containers/food/condiment(loc) - reagents.trans_to(P,50) + reagents.trans_to(P, 50) else if(href_list["change_pill"]) #define MAX_PILL_SPRITE 20 //max icon state of the pill sprites var/dat = "" @@ -299,7 +348,7 @@ else if(href_list["change_bottle"]) var/dat = "
" var/j = 0 - for(var/i in list("bottle", "small_bottle", "wide_bottle", "round_bottle")) + for(var/i in list("bottle", "small_bottle", "wide_bottle", "round_bottle", "reagent_bottle")) j++ if(j == 1) dat += "" @@ -318,21 +367,20 @@ usr << browse(null, "window=chem_master_iconsel") SSnanoui.update_uis(src) - return /obj/machinery/chem_master/attack_ai(mob/user) return attack_hand(user) /obj/machinery/chem_master/attack_ghost(mob/user) - return attack_hand(user) + if(user.can_admin_interact()) + return attack_hand(user) /obj/machinery/chem_master/attack_hand(mob/user) if(..()) - return 1 + return TRUE ui_interact(user) - return -/obj/machinery/chem_master/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1) +/obj/machinery/chem_master/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = TRUE) var/datum/asset/chem_master/assets = get_asset_datum(/datum/asset/chem_master) assets.send(user) @@ -380,50 +428,22 @@ return 0 /obj/machinery/chem_master/proc/chemical_safety_check(datum/reagents/R) - var/all_safe = 1 + var/all_safe = TRUE for(var/datum/reagent/A in R.reagent_list) if(!GLOB.safe_chem_list.Find(A.id)) - all_safe = 0 + all_safe = FALSE return all_safe /obj/machinery/chem_master/condimaster name = "\improper CondiMaster 3000" - condi = 1 + condi = TRUE -/obj/machinery/chem_master/constructable - name = "ChemMaster 2999" - desc = "Used to seperate chemicals and distribute them in a variety of forms." - -/obj/machinery/chem_master/constructable/New() +/obj/machinery/chem_master/condimaster/New() ..() - component_parts = list() - component_parts += new /obj/item/circuitboard/chem_master(null) + QDEL_LIST(component_parts) + component_parts += new /obj/item/circuitboard/chem_master/condi_master(null) component_parts += new /obj/item/stock_parts/manipulator(null) component_parts += new /obj/item/stock_parts/console_screen(null) component_parts += new /obj/item/reagent_containers/glass/beaker(null) component_parts += new /obj/item/reagent_containers/glass/beaker(null) - -/obj/machinery/chem_master/constructable/attackby(obj/item/B, mob/user, params) - - if(default_deconstruction_screwdriver(user, "mixer0_nopower", "mixer0", B)) - if(beaker) - beaker.forceMove(get_turf(src)) - beaker = null - reagents.clear_reagents() - if(loaded_pill_bottle) - loaded_pill_bottle.forceMove(get_turf(src)) - loaded_pill_bottle = null - return - - if(exchange_parts(user, B)) - return - - if(panel_open) - if(istype(B, /obj/item/crowbar)) - default_deconstruction_crowbar(B) - return 1 - else - to_chat(user, "You can't use the [name] while it's panel is opened!") - return 1 - else - ..() + RefreshParts() \ No newline at end of file diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index 7e76217fe15..a2ecc811e6a 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -32,6 +32,12 @@ /datum/reagent/Destroy() . = ..() holder = null + if(islist(data)) + data.Cut() + data = null + +/datum/reagent/proc/reaction_temperature(exposed_temperature, exposed_volume) //By default we do nothing. + return /datum/reagent/proc/reaction_mob(mob/living/M, method = TOUCH, volume) //Some reagents transfer on touch, others don't; dependent on if they penetrate the skin or not. if(holder) //for catching rare runtimes diff --git a/code/modules/reagents/chemistry/reagents/alcohol.dm b/code/modules/reagents/chemistry/reagents/alcohol.dm index 88e2d685f57..6c22360face 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol.dm @@ -765,7 +765,7 @@ /datum/reagent/consumable/ethanol/sbiten/on_mob_life(mob/living/M) if(M.bodytemperature < 360) M.bodytemperature = min(360, M.bodytemperature + (50 * TEMPERATURE_DAMAGE_COEFFICIENT)) //310 is the normal bodytemp. 310.055 - ..() + return ..() /datum/reagent/consumable/ethanol/devilskiss name = "Devils Kiss" @@ -819,7 +819,7 @@ /datum/reagent/consumable/ethanol/iced_beer/on_mob_life(mob/living/M) if(M.bodytemperature > 270) M.bodytemperature = max(270, M.bodytemperature - (20 * TEMPERATURE_DAMAGE_COEFFICIENT)) //310 is the normal bodytemp. 310.055 - ..() + return ..() /datum/reagent/consumable/ethanol/grog name = "Grog" @@ -1126,7 +1126,7 @@ /datum/reagent/consumable/ethanol/dragons_breath/reaction_mob(mob/living/M, method=TOUCH, volume) if(method == INGEST && prob(20)) if(M.on_fire) - M.adjust_fire_stacks(3) + M.adjust_fire_stacks(6) /datum/reagent/consumable/ethanol/dragons_breath/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE @@ -1148,7 +1148,7 @@ if(prob(2 * volume)) to_chat(M, "OH GOD OH GOD PLEASE NO!!") if(M.on_fire) - M.adjust_fire_stacks(5) + M.adjust_fire_stacks(20) if(prob(50)) to_chat(M, "IT BURNS!!!!") M.visible_message("[M] is consumed in flames!") @@ -1178,7 +1178,7 @@ if(prob(25)) holder.remove_reagent(id, 15) M.fakevomit() - ..() + return ..() /datum/reagent/consumable/ethanol/synthanol/reaction_mob(mob/living/M, method=TOUCH, volume) if(M.isSynthetic()) diff --git a/code/modules/reagents/chemistry/reagents/blob.dm b/code/modules/reagents/chemistry/reagents/blob.dm index c7dd046664c..1dcd414b702 100644 --- a/code/modules/reagents/chemistry/reagents/blob.dm +++ b/code/modules/reagents/chemistry/reagents/blob.dm @@ -2,6 +2,7 @@ // The 4 damage /datum/reagent/blob description = "" + var/complementary_color = "#000000" var/message = "The blob strikes you" //message sent to any mob hit by the blob var/message_living = null //extension to first mob sent to only living mobs i.e. silicons have no skin to be burnt can_synth = FALSE @@ -11,8 +12,10 @@ /datum/reagent/blob/ripping_tendrils //does brute and a little stamina damage name = "Ripping Tendrils" + description = "Deals High Brute damage, as well as Stamina damage." id = "ripping_tendrils" color = "#7F0000" + complementary_color = "#a15656" message_living = ", and you feel your skin ripping and tearing off" /datum/reagent/blob/ripping_tendrils/reaction_mob(mob/living/M, method=TOUCH, volume) @@ -25,8 +28,10 @@ /datum/reagent/blob/boiling_oil //sets you on fire, does burn damage name = "Boiling Oil" + description = "Deals High Burn damage, and sets the victim aflame." id = "boiling_oil" color = "#B68D00" + complementary_color = "#c0a856" message = "The blob splashes you with burning oil" message_living = ", and you feel your skin char and melt" @@ -40,8 +45,10 @@ /datum/reagent/blob/envenomed_filaments //toxin, hallucination, and some bonus spore toxin name = "Envenomed Filaments" + description = "Deals High Toxin damage, causes Hallucinations, and injects Spores into the bloodstream." id = "envenomed_filaments" color = "#9ACD32" + complementary_color = "#b0cd73" message_living = ", and you feel sick and nauseated" /datum/reagent/blob/envenomed_filaments/reaction_mob(mob/living/M, method=TOUCH, volume) @@ -53,8 +60,10 @@ /datum/reagent/blob/lexorin_jelly //does tons of oxygen damage and a little brute name = "Lexorin Jelly" + description = "Deals Medium Brute damage, but massive amounts of Respiration Damage." id = "lexorin_jelly" color = "#00FFC5" + complementary_color = "#56ebc9" message_living = ", and your lungs feel heavy and weak" /datum/reagent/blob/lexorin_jelly/reaction_mob(mob/living/M, method=TOUCH, volume) @@ -67,8 +76,10 @@ /datum/reagent/blob/kinetic //does semi-random brute damage name = "Kinetic Gelatin" + description = "Deals Randomized damage, between 0.33 to 2.33 times the standard amount." id = "kinetic" color = "#FFA500" + complementary_color = "#ebb756" message = "The blob pummels you" /datum/reagent/blob/kinetic/reaction_mob(mob/living/M, method=TOUCH, volume) @@ -79,8 +90,10 @@ /datum/reagent/blob/cryogenic_liquid //does low burn damage and stamina damage and cools targets down name = "Cryogenic Liquid" + description = "Deals Medium Brute damage, Stamina Damage, and injects Frost Oil into its victims, freezing them to death." id = "cryogenic_liquid" color = "#8BA6E9" + complementary_color = "#a8b7df" message = "The blob splashes you with an icy liquid" message_living = ", and you feel cold and tired" @@ -91,23 +104,12 @@ M.adjustStaminaLoss(0.4*volume) M.reagents.add_reagent("frostoil", 0.4*volume) -/datum/reagent/blob/dark_matter - name = "Dark Matter" - id = "dark_matter" - color = "#61407E" - message = "You feel a thrum as the blob strikes you, and everything flies at you" - -/datum/reagent/blob/dark_matter/reaction_mob(mob/living/M, method=TOUCH, volume) - if(method == TOUCH) - reagent_vortex(M, 0, volume) - volume = ..() - M.apply_damage(0.6*volume, BRUTE) - - /datum/reagent/blob/b_sorium name = "Sorium" + description = "Deals High Brute damage, and sends people flying away." id = "b_sorium" color = "#808000" + complementary_color = "#a2a256" message = "The blob slams into you, and sends you flying" /datum/reagent/blob/b_sorium/reaction_mob(mob/living/M, method=TOUCH, volume) diff --git a/code/modules/reagents/chemistry/reagents/disease.dm b/code/modules/reagents/chemistry/reagents/disease.dm index a9cbbe87691..9ce636b466a 100644 --- a/code/modules/reagents/chemistry/reagents/disease.dm +++ b/code/modules/reagents/chemistry/reagents/disease.dm @@ -114,6 +114,19 @@ M.ForceContractDisease(new /datum/disease/vampire(0)) return ..() +/datum/reagent/bacon_grease + name = "pure bacon grease" + id = "bacon_grease" + description = "Hook me up to an IV of that sweet, sweet stuff!" + reagent_state = LIQUID + color = "#F7E6B1" + can_synth = FALSE + +/datum/reagent/bacon_grease/on_mob_life(mob/living/carbon/M) + if(volume > 4.5) + M.ForceContractDisease(new /datum/disease/critical/heart_failure(0)) + return ..() + /datum/reagent/heartworms name = "Space heartworms" id = "heartworms" diff --git a/code/modules/reagents/chemistry/reagents/drink_cold.dm b/code/modules/reagents/chemistry/reagents/drink_cold.dm index 8e902f014f3..707aab07b54 100644 --- a/code/modules/reagents/chemistry/reagents/drink_cold.dm +++ b/code/modules/reagents/chemistry/reagents/drink_cold.dm @@ -42,7 +42,7 @@ /datum/reagent/consumable/drink/cold/ice/on_mob_life(mob/living/M) M.bodytemperature = max(M.bodytemperature - 5 * TEMPERATURE_DAMAGE_COEFFICIENT, 0) - ..() + return ..() /datum/reagent/consumable/drink/cold/space_cola name = "Cola" diff --git a/code/modules/reagents/chemistry/reagents/food.dm b/code/modules/reagents/chemistry/reagents/food.dm index c4434a92c5e..9b1aca91f8d 100644 --- a/code/modules/reagents/chemistry/reagents/food.dm +++ b/code/modules/reagents/chemistry/reagents/food.dm @@ -448,7 +448,7 @@ /datum/reagent/consumable/egg/on_mob_life(mob/living/M) if(prob(3)) M.reagents.add_reagent("cholesterol", rand(1,2)) - ..() + return ..() /datum/reagent/consumable/corn_starch name = "Corn Starch" @@ -643,9 +643,6 @@ color = "#684435" taste_message = "burritos" -/datum/reagent/consumable/beans/on_mob_life(mob/living/M) - return ..() - /datum/reagent/consumable/bread name = "Bread" id = "bread" @@ -845,10 +842,7 @@ to_chat(M, "Your chest is burning with pain!") update_flags |= M.Stun(1, FALSE) update_flags |= M.Weaken(1, FALSE) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(!H.undergoing_cardiac_arrest()) - H.set_heartattack(TRUE) + M.ForceContractDisease(new /datum/disease/critical/heart_failure(0)) return ..() | update_flags /datum/reagent/fungus diff --git a/code/modules/reagents/chemistry/reagents/medicine.dm b/code/modules/reagents/chemistry/reagents/medicine.dm index 804904723ea..d9c1591a4dc 100644 --- a/code/modules/reagents/chemistry/reagents/medicine.dm +++ b/code/modules/reagents/chemistry/reagents/medicine.dm @@ -5,6 +5,7 @@ /datum/reagent/medicine/on_mob_life(mob/living/M) current_cycle++ holder.remove_reagent(id, (metabolization_rate / M.metabolism_efficiency) * M.digestion_ratio) //medicine reagents stay longer if you have a better metabolism + return STATUS_UPDATE_NONE /datum/reagent/medicine/hydrocodone name = "Hydrocodone" @@ -16,13 +17,6 @@ shock_reduction = 200 taste_message = "numbness" -/datum/reagent/medicine/hydrocodone/on_mob_life(mob/living/M) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(H.traumatic_shock < 100) - H.shock_stage = 0 - return ..() - /datum/reagent/medicine/sterilizine name = "Sterilizine" id = "sterilizine" @@ -412,10 +406,6 @@ var/update_flags = STATUS_UPDATE_NONE if(prob(55)) update_flags |= M.adjustBruteLoss(-2*REAGENTS_EFFECT_MULTIPLIER, FALSE) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(H.traumatic_shock < 100) - H.shock_stage = 0 return ..() | update_flags /datum/reagent/medicine/salbutamol @@ -472,7 +462,7 @@ update_flags |= M.AdjustWeakened(-1, FALSE) update_flags |= M.adjustStaminaLoss(-1*REAGENTS_EFFECT_MULTIPLIER, FALSE) M.AdjustLoseBreath(-1, bound_lower = 5) - if(M.oxyloss > 75) + if(M.getOxyLoss() > 75) update_flags |= M.adjustOxyLoss(-1, FALSE) if(M.health < 0 || M.health > 0 && prob(33)) update_flags |= M.adjustToxLoss(-1, FALSE) @@ -537,6 +527,7 @@ taste_message = "a delightful numbing" /datum/reagent/medicine/morphine/on_mob_life(mob/living/M) + var/update_flags = STATUS_UPDATE_NONE M.AdjustJitter(-25) switch(current_cycle) if(1 to 15) @@ -545,13 +536,9 @@ if(16 to 35) M.Drowsy(20) if(36 to INFINITY) - M.Paralyse(15) + update_flags |= M.Paralyse(15, FALSE) M.Drowsy(20) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(H.traumatic_shock < 100) - H.shock_stage = 0 - ..() + return ..() | update_flags /datum/reagent/medicine/oculine name = "Oculine" @@ -600,7 +587,7 @@ if(prob(4)) M.emote("collapse") M.AdjustLoseBreath(-5, bound_lower = 5) - if(M.oxyloss > 65) + if(M.getOxyLoss() > 65) update_flags |= M.adjustOxyLoss(-10*REAGENTS_EFFECT_MULTIPLIER, FALSE) if(M.health < -25) update_flags |= M.adjustToxLoss(-1, FALSE) @@ -636,7 +623,7 @@ update_flags |= M.adjustBrainLoss(-1, FALSE) holder.remove_reagent("histamine", 15) M.AdjustLoseBreath(-1, bound_lower = 3) - if(M.oxyloss > 35) + if(M.getOxyLoss() > 35) update_flags |= M.adjustOxyLoss(-10*REAGENTS_EFFECT_MULTIPLIER, FALSE) if(M.health < -10 && M.health > -65) update_flags |= M.adjustToxLoss(-1*REAGENTS_EFFECT_MULTIPLIER, FALSE) @@ -700,8 +687,7 @@ if(method == INGEST) if(M.stat == DEAD) if(M.getBruteLoss()+M.getFireLoss()+M.getCloneLoss() >= 150) - M.visible_message("[M]'s body starts convulsing!") - M.gib() + M.delayed_gib() return var/mob/dead/observer/ghost = M.get_ghost() if(ghost) @@ -775,7 +761,7 @@ if(ishuman(M)) var/mob/living/carbon/human/H = M H.update_mutations() - ..() + return ..() /datum/reagent/medicine/antihol name = "Antihol" @@ -789,7 +775,7 @@ M.SetSlur(0) M.AdjustDrunk(-4) M.reagents.remove_all_type(/datum/reagent/consumable/ethanol, 8, 0, 1) - if(M.toxloss <= 25) + if(M.getToxLoss() <= 25) update_flags |= M.adjustToxLoss(-2.0, FALSE) return ..() | update_flags @@ -873,6 +859,7 @@ /datum/reagent/medicine/insulin/on_mob_life(mob/living/M) M.reagents.remove_reagent("sugar", 5) + return ..() /datum/reagent/medicine/teporone name = "Teporone" @@ -889,7 +876,7 @@ M.bodytemperature = max(310, M.bodytemperature - (40 * TEMPERATURE_DAMAGE_COEFFICIENT)) else if(M.bodytemperature < 311) M.bodytemperature = min(310, M.bodytemperature + (40 * TEMPERATURE_DAMAGE_COEFFICIENT)) - ..() + return ..() /datum/reagent/medicine/haloperidol name = "Haloperidol" @@ -932,6 +919,7 @@ taste_message = "sleepiness" /datum/reagent/medicine/ether/on_mob_life(mob/living/M) + var/update_flags = STATUS_UPDATE_NONE M.AdjustJitter(-25) switch(current_cycle) if(1 to 30) @@ -940,9 +928,9 @@ if(31 to 40) M.Drowsy(20) if(41 to INFINITY) - M.Paralyse(15) + update_flags |= M.Paralyse(15, FALSE) M.Drowsy(20) - ..() + return ..() | update_flags /datum/reagent/medicine/syndicate_nanites //Used exclusively by Syndicate medical cyborgs name = "Restorative Nanites" diff --git a/code/modules/reagents/chemistry/reagents/misc.dm b/code/modules/reagents/chemistry/reagents/misc.dm index 7e015a006e8..7d92080ae6b 100644 --- a/code/modules/reagents/chemistry/reagents/misc.dm +++ b/code/modules/reagents/chemistry/reagents/misc.dm @@ -162,7 +162,7 @@ if(!H.dna.species.exotic_blood && !(NO_BLOOD in H.dna.species.species_traits)) if(H.blood_volume < BLOOD_VOLUME_NORMAL) H.blood_volume += 0.8 - ..() + return ..() /datum/reagent/iron/reaction_mob(mob/living/M, method=TOUCH, volume) if(M.has_bane(BANE_IRON) && holder && holder.chem_temp < 150) //If the target is weak to cold iron, then poison them. @@ -205,6 +205,18 @@ taste_message = "motor oil" process_flags = ORGANIC | SYNTHETIC +/datum/reagent/oil/reaction_temperature(exposed_temperature, exposed_volume) + if(exposed_temperature > T0C + 600) + var/turf/T = get_turf(holder.my_atom) + holder.my_atom.visible_message("The oil burns!") + fireflash(T, min(max(0, volume / 40), 8)) + var/datum/effect_system/smoke_spread/bad/BS = new + BS.set_up(1, 0, T) + BS.start() + if(holder) + holder.add_reagent("ash", round(volume * 0.5)) + holder.del_reagent(id) + /datum/reagent/oil/reaction_turf(turf/T, volume) if(volume >= 3 && !isspaceturf(T) && !locate(/obj/effect/decal/cleanable/blood/oil) in T) new /obj/effect/decal/cleanable/blood/oil(T) diff --git a/code/modules/reagents/chemistry/reagents/paradise_pop.dm b/code/modules/reagents/chemistry/reagents/paradise_pop.dm index 08f01bdd381..2294088e54a 100644 --- a/code/modules/reagents/chemistry/reagents/paradise_pop.dm +++ b/code/modules/reagents/chemistry/reagents/paradise_pop.dm @@ -29,9 +29,9 @@ /datum/reagent/consumable/drink/apple_pocalypse/on_mob_life(mob/living/M) if(prob(1)) var/turf/simulated/T = get_turf(M) - goonchem_vortex(T, 0, 2, 1) + goonchem_vortex(T, 1, 0) to_chat(M, "You briefly feel super-massive, like a black hole. Probably just your imagination...") - ..() + return ..() //Berry Banned: This one is tasty and safe to drink, might have a low chance of healing a random damage type? /datum/reagent/consumable/drink/berry_banned @@ -119,7 +119,7 @@ /datum/reagent/consumable/drink/grape_granade/on_mob_life(mob/living/M) if(prob(1)) var/turf/simulated/T = get_turf(M) - goonchem_vortex(T, 1, 1, 2) + goonchem_vortex(T, 0, 0) M.emote("burp") to_chat(M, "You feel ready to burst! Oh wait, just a burp...") else if(prob(25)) diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic.dm index 857b15330d4..d91a76da7fc 100644 --- a/code/modules/reagents/chemistry/reagents/pyrotechnic.dm +++ b/code/modules/reagents/chemistry/reagents/pyrotechnic.dm @@ -1,3 +1,80 @@ +/datum/reagent/phlogiston + name = "phlogiston" + id = "phlogiston" + description = "It appears to be liquid fire." + reagent_state = LIQUID + color = "#FFAF00" + process_flags = ORGANIC | SYNTHETIC + var/temp_fire = 4000 + var/temp_deviance = 1000 + var/size_divisor = 40 + var/mob_burning = 6.6 // 33 + +/datum/reagent/phlogiston/reaction_turf(turf/T, volume) + if(holder.chem_temp <= T0C - 50) + return + var/radius = min(max(0, volume / size_divisor), 8) + fireflash_sm(T, radius, rand(temp_fire - temp_deviance, temp_fire + temp_deviance), 500) + +/datum/reagent/phlogiston/reaction_mob(mob/living/M, method = TOUCH, volume) + if(holder.chem_temp <= T0C - 50) + return + M.adjust_fire_stacks(mob_burning) + M.IgniteMob() + if(method == INGEST) + M.adjustFireLoss(min(max(15, volume * 3), 45)) + to_chat(M, "It burns!") + M.emote("scream") + +/datum/reagent/phlogiston/on_mob_life(mob/living/M) + if(holder.chem_temp <= T0C - 50) + return + M.adjust_fire_stacks(0.4) + M.IgniteMob() + return ..() + +/datum/reagent/phlogiston/firedust + name = "phlogiston dust" + id = "phlogiston_dust" + description = "And this is solid fire. However that works." + temp_fire = 1500 + temp_deviance = 500 + size_divisor = 80 + mob_burning = 3 // 15 + +/datum/reagent/napalm + name = "napalm" + id = "napalm" + description = "A highly flammable jellied fuel." + reagent_state = LIQUID + process_flags = ORGANIC | SYNTHETIC + color = "#C86432" + +/datum/reagent/napalm/reaction_temperature(exposed_temperature, exposed_volume) + if(exposed_temperature > T0C + 100) + var/radius = min(max(0, volume * 0.15), 8) + fireflash_sm(get_turf(holder.my_atom), radius, rand(3000, 6000), 500) + if(holder) + holder.del_reagent(id) + +/datum/reagent/napalm/reaction_turf(turf/T, volume) + if(isspaceturf(T)) + return + if(!T.reagents) + T.create_reagents(volume) + T.reagents.add_reagent("napalm", volume) + +/datum/reagent/napalm/reaction_mob(mob/living/M, method = TOUCH, volume) + if(method == TOUCH) + if(M.on_fire) + M.adjust_fire_stacks(14) + M.emote("scream") + +/datum/reagent/napalm/on_mob_life(mob/living/M) + if(M.on_fire) + M.adjust_fire_stacks(2) + return ..() + /datum/reagent/fuel name = "Welding fuel" id = "fuel" @@ -8,12 +85,54 @@ drink_name = "Glass of welder fuel" drink_desc = "Unless you are an industrial tool, this is probably not safe for consumption." taste_message = "mistakes" + process_flags = ORGANIC | SYNTHETIC + var/max_radius = 7 + var/min_radius = 0 + var/volume_radius_modifier = -0.15 + var/volume_radius_multiplier = 0.09 + var/explosion_threshold = 100 + var/min_explosion_radius = 0 + var/max_explosion_radius = 4 + var/volume_explosion_radius_multiplier = 0.005 + var/volume_explosion_radius_modifier = 0 + var/combustion_temp = T0C + 200 + +/datum/reagent/fuel/on_mob_life(mob/living/M) + if(M.on_fire) + M.adjust_fire_stacks(0.4) + return ..() + +/datum/reagent/fuel/reaction_temperature(exposed_temperature, exposed_volume) + if(exposed_temperature > combustion_temp) + if(volume < 1) + if(holder) + holder.del_reagent(id) + return + var/turf/T = get_turf(holder.my_atom) + var/radius = min(max(min_radius, volume * volume_radius_multiplier + volume_radius_modifier), max_radius) + fireflash_sm(T, radius, 2200 + radius * 250, radius * 50) + if(holder && volume >= explosion_threshold) + if(holder.my_atom) + holder.my_atom.visible_message("[holder.my_atom] explodes!") + message_admins("Fuel explosion ([holder.my_atom], reagent type: [id]) at [COORD(holder.my_atom.loc)]. Last touched by: [holder.my_atom.fingerprintslast ? "[holder.my_atom.fingerprintslast]" : "*null*"].") + log_game("Fuel explosion ([holder.my_atom], reagent type: [id]) at [COORD(holder.my_atom.loc)]. Last touched by: [holder.my_atom.fingerprintslast ? "[holder.my_atom.fingerprintslast]" : "*null*"].") + holder.my_atom.investigate_log("A fuel explosion, last touched by [holder.my_atom.fingerprintslast ? "[holder.my_atom.fingerprintslast]" : "*null*"], triggered at [COORD(holder.my_atom.loc)].", INVESTIGATE_BOMB) + var/boomrange = min(max(min_explosion_radius, round(volume * volume_explosion_radius_multiplier + volume_explosion_radius_modifier)), max_explosion_radius) + explosion(T, -1, -1, boomrange, 1) + if(holder) + holder.del_reagent(id) + +/datum/reagent/fuel/reaction_turf(turf/T, volume) //Don't spill the fuel, or you'll regret it + if(isspaceturf(T)) + return + if(!T.reagents) + T.create_reagents(50) + T.reagents.add_reagent("fuel", volume) /datum/reagent/fuel/reaction_mob(mob/living/M, method=TOUCH, volume)//Splashing people with welding fuel to make them easy to ignite! if(method == TOUCH) - M.adjust_fire_stacks(volume / 10) - return - ..() + if(M.on_fire) + M.adjust_fire_stacks(6) /datum/reagent/plasma name = "Plasma" @@ -23,6 +142,12 @@ color = "#7A2B94" taste_message = "corporate assets going to waste" +/datum/reagent/plasma/reaction_temperature(exposed_temperature, exposed_volume) + if(exposed_temperature >= T0C + 100) + fireflash(get_turf(holder.my_atom), min(max(0, volume / 10), 8)) + if(holder) + holder.del_reagent(id) + /datum/reagent/plasma/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE update_flags |= M.adjustToxLoss(1*REAGENTS_EFFECT_MULTIPLIER, FALSE) @@ -33,10 +158,10 @@ C.adjustPlasma(10) return ..() | update_flags -/datum/reagent/plasma/reaction_mob(mob/living/M, method=TOUCH, volume)//Splashing people with plasma is stronger than fuel! +/datum/reagent/plasma/reaction_mob(mob/living/M, method = TOUCH, volume)//Splashing people with plasma is stronger than fuel! if(method == TOUCH) - M.adjust_fire_stacks(volume / 5) - ..() + if(M.on_fire) + M.adjust_fire_stacks(6) /datum/reagent/thermite @@ -48,11 +173,32 @@ process_flags = ORGANIC | SYNTHETIC taste_message = "rust" -/datum/reagent/thermite/reaction_turf(turf/simulated/wall/W, volume) - if(volume >= 5 && istype(W)) - W.thermite = 1 - W.overlays.Cut() - W.overlays = image('icons/effects/effects.dmi', icon_state = "thermite") +/datum/reagent/thermite/reaction_mob(mob/living/M, method= TOUCH, volume) + if(method == TOUCH) + if(M.on_fire) + M.adjust_fire_stacks(20) + +/datum/reagent/thermite/reaction_temperature(exposed_temperature, exposed_volume) + var/turf/simulated/S = holder.my_atom + if(!istype(S)) + return + + if(exposed_temperature >= T0C + 100) + var/datum/reagents/Holder = holder + var/Id = id + var/Volume = volume + Holder.del_reagent(Id) + fireflash_sm(S, 0, rand(20000, 25000) + Volume * 2500, 0, 0, 1) + +/datum/reagent/thermite/reaction_turf(turf/simulated/S, volume) + if(istype(S)) + if(!S.reagents) + S.create_reagents(volume) + S.reagents.add_reagent("thermite", volume) + S.overlays.Cut() + S.overlays = image('icons/effects/effects.dmi', icon_state = "thermite") + if(S.active_hotspot) + S.reagents.temperature_reagents(S.active_hotspot.temperature, 10, 300) /datum/reagent/glycerol name = "Glycerol" @@ -81,33 +227,24 @@ taste_message = null /datum/reagent/clf3/on_mob_life(mob/living/M) - var/update_flags = STATUS_UPDATE_NONE - M.adjust_fire_stacks(2) - var/burndmg = max(0.3*M.fire_stacks, 0.3) - update_flags |= M.adjustFireLoss(burndmg, FALSE) - return ..() | update_flags + if(M.on_fire) + M.adjust_fire_stacks(1) + return ..() -/datum/reagent/clf3/reaction_turf(turf/simulated/T, volume) - if(prob(1) && istype(T, /turf/simulated/floor/plating)) - var/turf/simulated/floor/plating/F = T - F.ChangeTurf(/turf/space) - if(istype(T, /turf/simulated/floor)) - var/turf/simulated/floor/F = T - if(prob(volume/10)) - F.make_plating() - if(istype(F, /turf/simulated/floor)) - new /obj/effect/hotspot(F) - if(prob(volume/10) && istype(T, /turf/simulated/wall)) - var/turf/simulated/wall/W = T - W.ChangeTurf(/turf/simulated/floor) - if(istype(T, /turf/simulated/shuttle)) - new /obj/effect/hotspot(T) +/datum/reagent/clf3/reaction_turf(turf/T, volume) + if(volume < 3) + return + var/radius = min((volume - 3) * 0.15, 3) + fireflash_sm(T, radius, 4500 + volume * 500, 350) -/datum/reagent/clf3/reaction_mob(mob/living/M, method=TOUCH, volume) - if(method == TOUCH) - M.adjust_fire_stacks(min(volume/5, 10)) +/datum/reagent/clf3/reaction_mob(mob/living/M, method = TOUCH, volume) + if(method == TOUCH || method == INGEST) + M.adjust_fire_stacks(10) M.IgniteMob() - M.bodytemperature += 30 + if(method == INGEST) + M.adjustFireLoss(min(max(30, volume * 6), 90)) + to_chat(M, "It burns!") + M.emote("scream") /datum/reagent/sorium name = "Sorium" @@ -116,11 +253,14 @@ reagent_state = LIQUID color = "#FFA500" -/datum/reagent/sorium_vortex - name = "sorium_vortex" - id = "sorium_vortex" - reagent_state = LIQUID - color = "#FFA500" +/datum/reagent/sorium/reaction_turf(turf/T, volume) // oh no + if(prob(75)) + return + if(isspaceturf(T)) + return + if(!T.reagents) + T.create_reagents(50) + T.reagents.add_reagent("sorium", 5) /datum/reagent/liquid_dark_matter name = "Liquid Dark Matter" @@ -130,11 +270,14 @@ color = "#800080" taste_message = "the end of the world" -/datum/reagent/ldm_vortex - name = "LDM Vortex" - id = "ldm_vortex" - reagent_state = LIQUID - color = "#800080" +/datum/reagent/liquid_dark_matter/reaction_turf(turf/T, volume) //Oh gosh, why + if(prob(75)) + return + if(isspaceturf(T)) + return + if(!T.reagents) + T.create_reagents(50) + T.reagents.add_reagent("liquid_dark_matter", 5) /datum/reagent/blackpowder name = "Black Powder" @@ -157,6 +300,7 @@ description = "Makes a very bright flash." reagent_state = LIQUID color = "#FFFF00" + penetrates_skin = TRUE /datum/reagent/smoke_powder name = "Smoke Powder" @@ -171,42 +315,7 @@ description = "Makes a deafening noise." reagent_state = LIQUID color = "#0000FF" - -/datum/reagent/phlogiston - name = "Phlogiston" - id = "phlogiston" - description = "Catches you on fire and makes you ignite." - reagent_state = LIQUID - color = "#FF9999" - process_flags = ORGANIC | SYNTHETIC - -/datum/reagent/phlogiston/on_mob_life(mob/living/M) - var/update_flags = STATUS_UPDATE_NONE - M.adjust_fire_stacks(1) - var/burndmg = max(0.3*M.fire_stacks, 0.3) - update_flags |= M.adjustFireLoss(burndmg, FALSE) - return ..() | update_flags - -/datum/reagent/phlogiston/reaction_mob(mob/living/M, method=TOUCH, volume) - M.adjust_fire_stacks(1) - M.IgniteMob() - ..() - -/datum/reagent/napalm - name = "Napalm" - id = "napalm" - description = "Very flammable." - reagent_state = LIQUID - color = "#FF9999" - process_flags = ORGANIC | SYNTHETIC - -/datum/reagent/napalm/on_mob_life(mob/living/M) - M.adjust_fire_stacks(1) - return ..() - -/datum/reagent/napalm/reaction_mob(mob/living/M, method=TOUCH, volume) - if(method == TOUCH) - M.adjust_fire_stacks(min(volume/4, 20)) + penetrates_skin = TRUE /datum/reagent/cryostylane name = "Cryostylane" @@ -223,11 +332,16 @@ /datum/reagent/cryostylane/on_tick() if(holder.has_reagent("oxygen")) - holder.remove_reagent("oxygen", 1) - holder.chem_temp -= 10 - holder.handle_reactions() + holder.remove_reagent("oxygen", 2) + holder.remove_reagent("cryostylane", 2) + holder.temperature_reagents(holder.chem_temp - 200) + holder.temperature_reagents(holder.chem_temp - 200) ..() +/datum/reagent/cryostylane/reaction_mob(mob/living/M, method = TOUCH, volume) + if(method == TOUCH) + M.ExtinguishMob() + /datum/reagent/cryostylane/reaction_turf(turf/T, volume) if(volume >= 5) for(var/mob/living/carbon/slime/M in T) @@ -248,9 +362,10 @@ /datum/reagent/pyrosium/on_tick() if(holder.has_reagent("oxygen")) - holder.remove_reagent("oxygen", 1) - holder.chem_temp += 10 - holder.handle_reactions() + holder.remove_reagent("oxygen", 2) + holder.remove_reagent("pyrosium", 2) + holder.temperature_reagents(holder.chem_temp + 200) + holder.temperature_reagents(holder.chem_temp + 200) ..() /datum/reagent/firefighting_foam @@ -264,8 +379,7 @@ /datum/reagent/firefighting_foam/reaction_mob(mob/living/M, method=TOUCH, volume) // Put out fire if(method == TOUCH) - M.adjust_fire_stacks(-(volume / 5)) // more effective than water - M.ExtinguishMob() + M.adjust_fire_stacks(-10) // more effective than water /datum/reagent/firefighting_foam/reaction_obj(obj/O, volume) O.extinguish() @@ -290,6 +404,12 @@ color = "#500064" // rgb: 80, 0, 100 taste_message = "corporate assets going to waste" +/datum/reagent/plasma_dust/reaction_temperature(exposed_temperature, exposed_volume) + if(exposed_temperature >= T0C + 100) + fireflash(get_turf(holder.my_atom), min(max(0, volume / 10), 8)) + if(holder) + holder.del_reagent(id) + /datum/reagent/plasma_dust/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE update_flags |= M.adjustToxLoss(3, FALSE) diff --git a/code/modules/reagents/chemistry/reagents/toxins.dm b/code/modules/reagents/chemistry/reagents/toxins.dm index 510f3ca1368..d337d2a421b 100644 --- a/code/modules/reagents/chemistry/reagents/toxins.dm +++ b/code/modules/reagents/chemistry/reagents/toxins.dm @@ -506,19 +506,11 @@ M.fakevomit() update_flags |= M.adjustToxLoss(2, FALSE) update_flags |= M.adjustBruteLoss(2, FALSE) + if(volume > 40 && prob(4)) + M.delayed_gib() + return return ..() | update_flags -/datum/reagent/venom/overdose_process(mob/living/M) - var/update_flags = STATUS_UPDATE_NONE - if(volume >= 40) - if(prob(4)) - M.visible_message("[M] starts convulsing violently!", "You feel as if your body is tearing itself apart!") - update_flags |= M.Weaken(15, FALSE) - M.AdjustJitter(1000) - spawn(rand(20, 100)) - M.gib() - return list(0, update_flags) - /datum/reagent/neurotoxin2 name = "Neurotoxin" id = "neurotoxin2" @@ -1057,6 +1049,11 @@ update_flags |= M.adjustToxLoss(1, FALSE) return ..() | update_flags +/datum/reagent/pestkiller/reaction_obj(obj/O, volume) + if(istype(O, /obj/effect/decal/ants)) + O.visible_message("The ants die.") + qdel(O) + /datum/reagent/pestkiller/reaction_mob(mob/living/M, method=TOUCH, volume) if(iscarbon(M)) var/mob/living/carbon/C = M @@ -1159,12 +1156,16 @@ M.apply_effect(2, IRRADIATE, 0, negate_armor = 1) if(!M.dna) return + var/did_mutation = FALSE if(prob(15)) randmutb(M) + did_mutation = TRUE if(prob(3)) randmutg(M) - domutcheck(M, null) - M.UpdateAppearance() + did_mutation = TRUE + if(did_mutation) + domutcheck(M, null) + M.UpdateAppearance() return ..() /datum/reagent/ants diff --git a/code/modules/reagents/chemistry/reagents/water.dm b/code/modules/reagents/chemistry/reagents/water.dm index 6d8ea272cfe..5623023659b 100644 --- a/code/modules/reagents/chemistry/reagents/water.dm +++ b/code/modules/reagents/chemistry/reagents/water.dm @@ -23,8 +23,7 @@ /datum/reagent/water/reaction_mob(mob/living/M, method=TOUCH, volume) if(method == TOUCH) // Put out fire - M.adjust_fire_stacks(-(volume / 10)) - M.ExtinguishMob() + M.adjust_fire_stacks(-(volume * 0.2)) if(ishuman(M)) var/mob/living/carbon/human/H = M diff --git a/code/modules/reagents/chemistry/recipes.dm b/code/modules/reagents/chemistry/recipes.dm index 3464b145f6a..a881f191594 100644 --- a/code/modules/reagents/chemistry/recipes.dm +++ b/code/modules/reagents/chemistry/recipes.dm @@ -11,13 +11,11 @@ var/required_other = 0 // an integer required for the reaction to happen var/result_amount = 0 - var/secondary = 0 // set to nonzero if secondary reaction var/list/secondary_results = list() //additional reagents produced by the reaction var/min_temp = 0 //Minimum temperature required for the reaction to occur (heat to/above this). min_temp = 0 means no requirement var/max_temp = 9999 //Maximum temperature allowed for the reaction to occur (cool to/below this). var/mix_message = "The solution begins to bubble." var/mix_sound = 'sound/effects/bubbles.ogg' - var/no_message = 0 /datum/chemical_reaction/proc/on_reaction(datum/reagents/holder, created_volume) return @@ -65,17 +63,18 @@ var/list/chemical_mob_spawn_nicecritters = list() // and possible friendly mobs for(var/j = 1, j <= rand(1, 3), j++) step(C, pick(NORTH,SOUTH,EAST,WEST)) -/proc/goonchem_vortex(turf/simulated/T, setting_type, range, pull_times) - for(var/atom/movable/X in orange(range, T)) +/proc/goonchem_vortex(turf/T, setting_type, volume) + if(setting_type) + new /obj/effect/temp_visual/implosion(T) + playsound(T, 'sound/effects/whoosh.ogg', 25, 1) //credit to Robinhood76 of Freesound.org for this. + else + new /obj/effect/temp_visual/shockwave(T) + playsound(T, 'sound/effects/bang.ogg', 25, 1) + for(var/atom/movable/X in view(2 + setting_type + (volume > 30 ? 1 : 0), T)) if(istype(X, /obj/effect)) continue //stop pulling smoke and hotspots please - if(istype(X, /atom/movable)) - if((X) && !X.anchored && X.move_resist <= MOVE_FORCE_DEFAULT) - if(setting_type) - playsound(T, 'sound/effects/bang.ogg', 25, 1) - for(var/i = 0, i < pull_times, i++) - step_away(X,T) - else - playsound(T, 'sound/effects/whoosh.ogg', 25, 1) //credit to Robinhood76 of Freesound.org for this. - for(var/i = 0, i < pull_times, i++) - step_towards(X,T) \ No newline at end of file + if(X && !X.anchored && X.move_resist <= MOVE_FORCE_DEFAULT) + if(setting_type) + X.throw_at(T, 20 + round(volume * 2), 1 + round(volume / 10)) + else + X.throw_at(get_edge_target_turf(T, get_dir(T, X)), 20 + round(volume * 2), 1 + round(volume / 10)) \ No newline at end of file diff --git a/code/modules/reagents/chemistry/recipes/drinks.dm b/code/modules/reagents/chemistry/recipes/drinks.dm index c348db060ff..2f3eda996b0 100644 --- a/code/modules/reagents/chemistry/recipes/drinks.dm +++ b/code/modules/reagents/chemistry/recipes/drinks.dm @@ -229,7 +229,7 @@ id = "flamingmoe" result = "flamingmoe" required_reagents = list("vodka" = 1, "gin" = 1, "cognac" = 1, "tequila" = 1, "salglu_solution" = 1) //Close enough - min_temp = 374 //Fire makes it good! + min_temp = T0C + 100 //Fire makes it good! result_amount = 5 mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' mix_message = "The concoction bursts into flame!" @@ -701,7 +701,7 @@ id = "applejack" result = "applejack" required_reagents = list("cider" = 2) - max_temp = 270 + max_temp = T0C result_amount = 1 mix_message = "The drink darkens as the water freezes, leaving the concentrated cider behind." mix_sound = null diff --git a/code/modules/reagents/chemistry/recipes/drugs.dm b/code/modules/reagents/chemistry/recipes/drugs.dm index e44ace8f511..d2499a06c54 100644 --- a/code/modules/reagents/chemistry/recipes/drugs.dm +++ b/code/modules/reagents/chemistry/recipes/drugs.dm @@ -15,13 +15,12 @@ result_amount = 5 mix_message = "The mixture violently reacts, leaving behind a few crystalline shards." mix_sound = 'sound/goonstation/effects/crystalshatter.ogg' - min_temp = 390 + min_temp = T0C + 100 /datum/chemical_reaction/crank/on_reaction(datum/reagents/holder, created_volume) var/turf/T = get_turf(holder.my_atom) - for(var/turf/turf in range(1,T)) - new /obj/effect/hotspot(turf) - explosion(T,0,0,2) + fireflash(holder.my_atom, 1) + explosion(T, 0, 0, 2) /datum/chemical_reaction/krokodil name = "Krokodil" @@ -30,7 +29,7 @@ required_reagents = list("diphenhydramine" = 1, "morphine" = 1, "cleaner" = 1, "potassium" = 1, "phosphorus" = 1, "fuel" = 1) result_amount = 6 mix_message = "The mixture dries into a pale blue powder." - min_temp = 380 + min_temp = T0C + 100 mix_sound = 'sound/goonstation/misc/fuse.ogg' /datum/chemical_reaction/methamphetamine @@ -39,7 +38,7 @@ result = "methamphetamine" required_reagents = list("ephedrine" = 1, "iodine" = 1, "phosphorus" = 1, "hydrogen" = 1) result_amount = 4 - min_temp = 374 + min_temp = T0C + 100 /datum/chemical_reaction/methamphetamine/on_reaction(datum/reagents/holder) var/turf/T = get_turf(holder.my_atom) @@ -57,7 +56,7 @@ result = "bath_salts" required_reagents = list("????" = 1, "saltpetre" = 1, "msg" = 1, "cleaner" = 1, "enzyme" = 1, "mugwort" = 1, "mercury" = 1) result_amount = 6 - min_temp = 374 + min_temp = T0C + 100 mix_message = "Tiny cubic crystals precipitate out of the mixture. Huh." mix_sound = 'sound/goonstation/misc/fuse.ogg' diff --git a/code/modules/reagents/chemistry/recipes/food.dm b/code/modules/reagents/chemistry/recipes/food.dm index ec732bba858..5b5efc105d6 100644 --- a/code/modules/reagents/chemistry/recipes/food.dm +++ b/code/modules/reagents/chemistry/recipes/food.dm @@ -124,7 +124,7 @@ result = "corn_syrup" required_reagents = list("corn_starch" = 1, "sacid" = 1) result_amount = 2 - min_temp = 374 + min_temp = T0C + 100 mix_message = "The mixture forms a viscous, clear fluid!" /datum/chemical_reaction/vhfcs @@ -176,7 +176,7 @@ result = "hydrogenated_soybeanoil" required_reagents = list("soybeanoil" = 1, "hydrogen" = 1) result_amount = 2 - min_temp = 520 + min_temp = T0C + 250 mix_message = "The mixture emits a burnt, oily smell." /datum/chemical_reaction/meatslurry @@ -194,7 +194,7 @@ result = "gravy" required_reagents = list("porktonium" = 1, "corn_starch" = 1, "milk" = 1) result_amount = 3 - min_temp = 374 + min_temp = T0C + 100 mix_message = "The substance thickens and takes on a meaty odor." /datum/chemical_reaction/beff @@ -221,7 +221,7 @@ result = "enzyme" required_reagents = list("vomit" = 1, "sugar" = 1) result_amount = 2 - min_temp = 750 + min_temp = T0C + 480 mix_message = "The mixture emits a horrible smell as you heat up the contents. Luckily, enzymes don't stink." mix_sound = 'sound/goonstation/misc/fuse.ogg' @@ -231,6 +231,6 @@ result = "enzyme" required_reagents = list("green_vomit" = 1, "sugar" = 1) result_amount = 2 - min_temp = 750 + min_temp = T0C + 480 mix_message = "The mixture emits a horrible smell as you heat up the contents. Luckily, enzymes don't stink." mix_sound = 'sound/goonstation/misc/fuse.ogg' diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm index 864733f6555..b523bbafb45 100644 --- a/code/modules/reagents/chemistry/recipes/medicine.dm +++ b/code/modules/reagents/chemistry/recipes/medicine.dm @@ -50,7 +50,7 @@ required_reagents = list("ash" = 1, "sodiumchloride" = 1) result_amount = 2 mix_message = "The mixture yields a fine black powder." - min_temp = 380 + min_temp = T0C + 100 mix_sound = 'sound/goonstation/misc/fuse.ogg' /datum/chemical_reaction/silver_sulfadiazine @@ -92,7 +92,7 @@ result = "calomel" required_reagents = list("mercury" = 1, "chlorine" = 1) result_amount = 2 - min_temp = 374 + min_temp = T0C + 100 mix_message = "Stinging vapors rise from the solution." /datum/chemical_reaction/potass_iodide @@ -135,7 +135,7 @@ result = "perfluorodecalin" required_reagents = list("hydrogen" = 1, "fluorine" = 1, "oil" = 1) result_amount = 3 - min_temp = 370 + min_temp = T0C + 100 mix_message = "The mixture rapidly turns into a dense pink liquid." mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' @@ -195,7 +195,7 @@ result = null required_reagents = list("strange_reagent" = 1, "synthflesh" = 1, "blood" = 1) result_amount = 3 - min_temp = 374 + min_temp = T0C + 100 /datum/chemical_reaction/life/on_reaction(datum/reagents/holder, created_volume) chemical_mob_spawn(holder, 1, "Life") @@ -263,12 +263,5 @@ result = "liquid_solder" required_reagents = list("ethanol" = 1, "copper" = 1, "silver" = 1) result_amount = 3 - min_temp = 370 - mix_message = "The solution gently swirls with a metallic sheen." - -/datum/chemical_reaction/corazone - name = "Corazone" - id = "corazone" - result = "corazone" - result_amount = 3 - required_reagents = list("phenol" = 2, "lithium" = 1) + min_temp = T0C + 100 + mix_message = "The solution gently swirls with a metallic sheen." \ No newline at end of file diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm index 0259ed89e86..c40c1213793 100644 --- a/code/modules/reagents/chemistry/recipes/others.dm +++ b/code/modules/reagents/chemistry/recipes/others.dm @@ -74,7 +74,7 @@ result = "diethylamine" required_reagents = list ("ammonia" = 1, "ethanol" = 1) result_amount = 2 - min_temp = 374 + min_temp = T0C + 100 mix_message = "A horrible smell pours forth from the mixture." /datum/chemical_reaction/space_cleaner @@ -98,7 +98,7 @@ id = "plastic_polymers" result = null required_reagents = list("oil" = 5, "sacid" = 2, "ash" = 3) - min_temp = 374 + min_temp = T0C + 100 result_amount = 1 /datum/chemical_reaction/plastic_polymers/on_reaction(datum/reagents/holder, created_volume) @@ -171,16 +171,6 @@ mix_message = "The mixture bubbles and gives off an unpleasant medicinal odor." mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' -/datum/chemical_reaction/ash - name = "Ash" - id = "ash" - result = "ash" - required_reagents = list("oil" = 1) - result_amount = 0.5 - min_temp = 480 - mix_sound = null - no_message = 1 - /datum/chemical_reaction/colorful_reagent name = "colorful_reagent" id = "colorful_reagent" @@ -195,7 +185,7 @@ result = null required_reagents = list("nutriment" = 1, "colorful_reagent" = 1, "strange_reagent" = 1, "blood" = 1) result_amount = 3 - min_temp = 374 + min_temp = T0C + 100 /datum/chemical_reaction/corgium/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) @@ -208,7 +198,7 @@ result = null required_reagents = list("egg" = 1, "colorful_reagent" = 1, "chicken_soup" = 1, "strange_reagent" = 1, "blood" = 1) result_amount = 5 - min_temp = 374 + min_temp = T0C + 100 mix_message = "The substance turns an airy sky-blue and foams up into a new shape." /datum/chemical_reaction/flaptonium/on_reaction(datum/reagents/holder, created_volume) @@ -244,7 +234,7 @@ id = "soapification" result = null required_reagents = list("liquidgibs" = 10, "lye" = 10) // requires two scooped gib tiles - min_temp = 374 + min_temp = T0C + 100 result_amount = 1 @@ -257,7 +247,7 @@ id = "candlefication" result = null required_reagents = list("liquidgibs" = 5, "oxygen" = 5) // - min_temp = 374 + min_temp = T0C + 100 result_amount = 1 /datum/chemical_reaction/candlefication/on_reaction(datum/reagents/holder, created_volume) @@ -295,7 +285,7 @@ id = "jestosterone" result = "jestosterone" required_reagents = list("blood" = 1, "sodiumchloride" = 1, "banana" = 1, "lube" = 1, "space_drugs" = 1) //Or one freshly-squeezed clown - min_temp = 374 + min_temp = T0C + 100 result_amount = 5 mix_message = "The substance quickly shifts colour, cycling from red, to yellow, to green, to blue, and finally settles at a vibrant fuchsia." @@ -338,7 +328,7 @@ result = "ice" required_reagents = list("water" = 1) result_amount = 1 - max_temp = 273 + max_temp = T0C mix_message = "Ice forms as the water freezes." mix_sound = null @@ -348,7 +338,7 @@ result = "water" required_reagents = list("ice" = 1) result_amount = 1 - min_temp = 301 // In Space.....ice melts at 82F...don't ask + min_temp = T0C + 29 // In Space.....ice melts at 82F...don't ask mix_message = "Water pools as the ice melts." mix_sound = null diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index 362aebfcc10..a21a7fcf1c2 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -80,66 +80,68 @@ result = "clf3" required_reagents = list("chlorine" = 1, "fluorine" = 3) result_amount = 2 - min_temp = 424 + min_temp = T0C + 150 /datum/chemical_reaction/clf3/on_reaction(datum/reagents/holder, created_volume) - var/turf/T = get_turf(holder.my_atom) - for(var/turf/turf in range(1,T)) - new /obj/effect/hotspot(turf) + fireflash(holder.my_atom, 1, 7000) /datum/chemical_reaction/sorium name = "Sorium" id = "sorium" result = "sorium" - required_reagents = list("mercury" = 1, "oxygen" = 1, "nitrogen" = 1, "carbon" = 1) + required_reagents = list("mercury" = 1, "carbon" = 1, "nitrogen" = 1, "oxygen" = 1, "stabilizing_agent" = 1) result_amount = 4 + mix_message = "The mixture pops and crackles before settling down." -/datum/chemical_reaction/sorium/on_reaction(datum/reagents/holder, created_volume) - if(holder.has_reagent("stabilizing_agent")) +/datum/chemical_reaction/sorium_explosion + name = "Sorium Explosion" + id = "sorium_explosion" + required_reagents = list("mercury" = 1, "carbon" = 1, "nitrogen" = 1, "oxygen" = 1) + result_amount = 1 + mix_message = "The mixture explodes with a big bang." + +/datum/chemical_reaction/sorium_explosion/on_reaction(datum/reagents/holder, created_volume) + var/turf/T = get_turf(holder.my_atom) + if(!T) return - var/turf/simulated/T = get_turf(holder.my_atom) - goonchem_vortex(T, 1, min(10, created_volume), min(11, created_volume + 1)) - holder.remove_reagent("sorium", created_volume) + goonchem_vortex(T, 0, created_volume) -/datum/chemical_reaction/sorium_vortex +/datum/chemical_reaction/sorium_explosion/sorium name = "sorium_vortex" id = "sorium_vortex" - result = "sorium_vortex" required_reagents = list("sorium" = 1) - result_amount = 1 - min_temp = 474 - -/datum/chemical_reaction/sorium_vortex/on_reaction(datum/reagents/holder, created_volume) - var/turf/simulated/T = get_turf(holder.my_atom) - goonchem_vortex(T, 1, min(10, created_volume), min(11, created_volume + 1)) - holder.remove_reagent("sorium_vortex", created_volume) + min_temp = T0C + 200 + mix_sound = null + mix_message = null /datum/chemical_reaction/liquid_dark_matter name = "Liquid Dark Matter" id = "liquid_dark_matter" result = "liquid_dark_matter" + required_reagents = list("plasma" = 1, "radium" = 1, "carbon" = 1, "stabilizing_agent" = 1) + result_amount = 4 + mix_message = "The mixture begins to glow in a dark purple." + +/datum/chemical_reaction/ldm_implosion + name = "Implosion" + id = "implosion" required_reagents = list("plasma" = 1, "radium" = 1, "carbon" = 1) - result_amount = 3 + result_amount = 1 + mix_message = "The mixture implodes suddenly." -/datum/chemical_reaction/liquid_dark_matter/on_reaction(datum/reagents/holder, created_volume) - if(holder.has_reagent("stabilizing_agent")) - return +/datum/chemical_reaction/ldm_implosion/on_reaction(datum/reagents/holder, created_volume) var/turf/simulated/T = get_turf(holder.my_atom) - goonchem_vortex(T, 0, min(10, created_volume), min(11, created_volume + 1)) - holder.remove_reagent("liquid_dark_matter", created_volume) + if(!T) + return + goonchem_vortex(T, 1, created_volume) -/datum/chemical_reaction/ldm_vortex +/datum/chemical_reaction/ldm_implosion/liquid_dark_matter name = "LDM Vortex" id = "ldm_vortex" - result = "ldm_vortex" required_reagents = list("liquid_dark_matter" = 1) - result_amount = 1 - min_temp = 474 - -/datum/chemical_reaction/ldm_vortex/on_reaction(datum/reagents/holder, created_volume) - var/turf/simulated/T = get_turf(holder.my_atom) - goonchem_vortex(T, 0, min(10, created_volume), min(11, created_volume + 1)) - holder.remove_reagent("ldm_vortex", created_volume) + min_temp = T0C + 200 + mix_sound = null + mix_message = null /datum/chemical_reaction/blackpowder name = "Black Powder" @@ -155,70 +157,97 @@ result = null required_reagents = list("blackpowder" = 1) result_amount = 1 - min_temp = 474 - no_message = 1 + min_temp = T0C + 200 + mix_message = null mix_sound = null /datum/chemical_reaction/blackpowder_explosion/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) do_sparks(2, 1, location) - sleep(rand(20,30)) - blackpowder_detonate(holder, created_volume) + spawn(rand(5, 15)) + blackpowder_detonate(holder, created_volume) /proc/blackpowder_detonate(datum/reagents/holder, created_volume) - var/turf/simulated/T = get_turf(holder.my_atom) + var/turf/T = get_turf(holder.my_atom) var/ex_severe = round(created_volume / 100) var/ex_heavy = round(created_volume / 42) var/ex_light = round(created_volume / 20) var/ex_flash = round(created_volume / 8) - explosion(T,ex_severe,ex_heavy,ex_light,ex_flash, 1) + explosion(T, ex_severe, ex_heavy,ex_light, ex_flash, 1) // If this black powder is in a decal, remove the decal, because it just exploded if(istype(holder.my_atom, /obj/effect/decal/cleanable/dirt/blackpowder)) spawn(0) qdel(holder.my_atom) -datum/chemical_reaction/flash_powder +/datum/chemical_reaction/flash_powder name = "Flash powder" id = "flash_powder" result = "flash_powder" - required_reagents = list("aluminum" = 1, "potassium" = 1, "sulfur" = 1, "chlorine" = 1) - result_amount = 3 + required_reagents = list("aluminum" = 1, "potassium" = 1, "sulfur" = 1, "chlorine" = 1, "stabilizing_agent" = 1) + result_amount = 5 + mix_message = "The chemicals hiss and fizz briefly before falling still." -/datum/chemical_reaction/flash_powder/on_reaction(datum/reagents/holder, created_volume) - if(holder.has_reagent("stabilizing_agent")) - return - var/location = get_turf(holder.my_atom) - do_sparks(2, 1, location) - for(var/mob/living/carbon/C in viewers(5, location)) - if(C.flash_eyes()) - if(get_dist(C, location) < 4) - C.Weaken(5) - continue - C.Stun(5) - holder.remove_reagent("flash_powder", created_volume) - -/datum/chemical_reaction/flash_powder_flash - name = "Flash powder activation" - id = "flash_powder_flash" +/datum/chemical_reaction/flash + name = "Flash" + id = "flash" result = null - required_reagents = list("flash_powder" = 1) - min_temp = 374 + required_reagents = list("aluminum" = 1, "potassium" = 1, "sulfur" = 1, "chlorine" = 1) + mix_message = "The chemicals catch fire, burning brightly and violently!" + mix_sound = 'sound/effects/bang.ogg' -/datum/chemical_reaction/flash_powder_flash/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/flash/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) + if(!location) + return do_sparks(2, 1, location) - for(var/mob/living/carbon/C in viewers(5, location)) - if(C.flash_eyes()) - if(get_dist(C, location) < 4) - C.Weaken(5) - continue - C.Stun(5) + bang(location, holder.my_atom, 5, flash = TRUE, bang = FALSE) + +/datum/chemical_reaction/flash/flash_powder + name = "flash_powder_flash" + id = "flash_powder_flash" + required_reagents = list("flash_powder" = 1) + min_temp = T0C + 100 + mix_message = null + +/datum/chemical_reaction/phlogiston + name = "Phlogiston" + id = "phlogiston" + result = "phlogiston" + required_reagents = list("phosphorus" = 1, "plasma" = 1, "sacid" = 1, "stabilizing_agent" = 1) + result_amount = 4 + mix_message = "The substance becomes sticky and extremely warm." + +/datum/chemical_reaction/phlogiston_dust + name = "Phlogiston Dust" + id = "phlogiston_dust" + result = "phlogiston_dust" + required_reagents = list("phlogiston" = 1, "charcoal" = 1, "phosphorus" = 1, "sulfur" = 1) + result_amount = 2 + mix_message = "The substance becomes a pile of burning dust." + +/datum/chemical_reaction/phlogiston_fire //This MUST be above the smoke recipe. + name = "Phlogiston Fire" + id = "phlogiston_fire" + result = "phlogiston" + required_reagents = list("phosphorus" = 1, "plasma" = 1, "sacid" = 1) + mix_message = "The substance erupts into wild flames." + +/datum/chemical_reaction/phlogiston_fire/on_reaction(datum/reagents/holder, created_volume) + fireflash(get_turf(holder.my_atom), min(max(2, round(created_volume / 10)), 8)) + +/datum/chemical_reaction/napalm + name = "Napalm" + id = "napalm" + result = "napalm" + required_reagents = list("fuel" = 1, "sugar" = 1, "ethanol" = 1) + result_amount = 3 + mix_message = "The mixture congeals into a sticky gel." /datum/chemical_reaction/smoke_powder name = "smoke_powder" id = "smoke_powder" result = "smoke_powder" - required_reagents = list("stabilizing_agent" = 1, "potassium" = 1, "sugar" = 1, "phosphorus" = 1) + required_reagents = list("potassium" = 1, "sugar" = 1, "phosphorus" = 1, "stabilizing_agent" = 1) result_amount = 3 mix_message = "The mixture sets into a greyish powder!" @@ -233,14 +262,12 @@ datum/chemical_reaction/flash_powder /datum/chemical_reaction/smoke/on_reaction(datum/reagents/holder, created_volume) for(var/f_reagent in forbidden_reagents) - if(holder.has_reagent(f_reagent)) - holder.remove_reagent(f_reagent, holder.get_reagent_amount(f_reagent)) + holder.del_reagent(f_reagent) var/location = get_turf(holder.my_atom) var/datum/effect_system/smoke_spread/chem/S = new - S.attach(location) playsound(location, 'sound/effects/smoke.ogg', 50, 1, -3) if(S) - S.set_up(holder, 10, 0, location) + S.set_up(holder, location) if(created_volume < 5) S.start(1) if(created_volume >=5 && created_volume < 10) @@ -249,15 +276,12 @@ datum/chemical_reaction/flash_powder S.start(3) if(created_volume >=15) S.start(4) - if(holder && holder.my_atom) - holder.clear_reagents() /datum/chemical_reaction/smoke/smoke_powder name = "smoke_powder_smoke" id = "smoke_powder_smoke" required_reagents = list("smoke_powder" = 1) - min_temp = 374 - secondary = 1 + min_temp = T0C + 100 result_amount = 1 forbidden_reagents = list("stimulants") mix_sound = null @@ -266,100 +290,30 @@ datum/chemical_reaction/flash_powder name = "sonic_powder" id = "sonic_powder" result = "sonic_powder" + required_reagents = list("oxygen" = 1, "cola" = 1, "phosphorus" = 1, "stabilizing_agent" = 1) + result_amount = 2 + mix_message = "The mixture begins to bubble slighly!" + +/datum/chemical_reaction/sonic_deafen + name = "sonic_deafen" + id = "sonic_deafen" + result = null required_reagents = list("oxygen" = 1, "cola" = 1, "phosphorus" = 1) - result_amount = 3 + mix_message = "The mixture begins to bubble furiously!" + mix_sound = 'sound/effects/bang.ogg' -/datum/chemical_reaction/sonic_powder/on_reaction(datum/reagents/holder, created_volume) - if(holder.has_reagent("stabilizing_agent")) - return +/datum/chemical_reaction/sonic_deafen/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) - playsound(location, 'sound/effects/bang.ogg', 25, 1) - for(var/mob/living/M in hearers(5, location)) - var/ear_safety = 0 - var/distance = max(1,get_dist(src,T)) - if(iscarbon(M)) - var/mob/living/carbon/C = M - if(ishuman(C)) - var/mob/living/carbon/human/H = C - if((H.r_ear && (H.r_ear.flags & EARBANGPROTECT)) || (H.l_ear && (H.l_ear.flags & EARBANGPROTECT)) || (H.head && (H.head.flags & HEADBANGPROTECT))) - ear_safety++ - to_chat(C, "BANG") - if(!ear_safety) - M.Stun(max(10/distance, 3)) - M.Weaken(max(10/distance, 3)) - M.AdjustEarDamage(rand(0, 5), 15) - if(iscarbon(M)) - var/mob/living/carbon/C = M - var/obj/item/organ/internal/ears/ears = C.get_int_organ(/obj/item/organ/internal/ears) - if(istype(ears)) - if(ears.ear_damage >= 15) - to_chat(M, "Your ears start to ring badly!") - if(prob(ears.ear_damage - 5)) - to_chat(M, "You can't hear anything!") - M.BecomeDeaf() - else - if(ears.ear_damage >= 5) - to_chat(M, "Your ears start to ring!") - holder.remove_reagent("sonic_powder", created_volume) + if(!location) + return + bang(location, holder.my_atom, 5, flash = FALSE, bang = TRUE) -/datum/chemical_reaction/sonic_powder_deafen +/datum/chemical_reaction/sonic_deafen/sonic_powder name = "sonic_powder_deafen" id = "sonic_powder_deafen" - result = null required_reagents = list("sonic_powder" = 1) - min_temp = 374 - -/datum/chemical_reaction/sonic_powder_deafen/on_reaction(datum/reagents/holder, created_volume) - var/location = get_turf(holder.my_atom) - playsound(location, 'sound/effects/bang.ogg', 25, 1) - for(var/mob/living/M in hearers(5, location)) - var/ear_safety = 0 - var/distance = max(1,get_dist(src,T)) - if(iscarbon(M)) - var/mob/living/carbon/C = M - if(ishuman(C)) - var/mob/living/carbon/human/H = C - if((H.r_ear && (H.r_ear.flags & EARBANGPROTECT)) || (H.l_ear && (H.l_ear.flags & EARBANGPROTECT)) || (H.head && (H.head.flags & HEADBANGPROTECT))) - ear_safety++ - to_chat(M, "BANG") - if(!ear_safety) - M.Stun(max(10/distance, 3)) - M.Weaken(max(10/distance, 3)) - M.AdjustEarDamage(rand(0, 5), 15) - if(iscarbon(M)) - var/mob/living/carbon/C = M - var/obj/item/organ/internal/ears/ears = C.get_int_organ(/obj/item/organ/internal/ears) - if(istype(ears)) - if(ears.ear_damage >= 15) - to_chat(M, "Your ears start to ring badly!") - if(prob(ears.ear_damage - 5)) - to_chat(M, "You can't hear anything!") - M.BecomeDeaf() - else - if(ears.ear_damage >= 5) - to_chat(M, "Your ears start to ring!") - - -/datum/chemical_reaction/phlogiston - name = "phlogiston" - id = "phlogiston" - result = "phlogiston" - required_reagents = list("phosphorus" = 1, "sacid" = 1, "plasma" = 1) - result_amount = 3 - -/datum/chemical_reaction/phlogiston/on_reaction(datum/reagents/holder, created_volume) - if(holder.has_reagent("stabilizing_agent")) - return - var/turf/simulated/T = get_turf(holder.my_atom) - for(var/turf/simulated/turf in range(min(created_volume/10,4),T)) - new /obj/effect/hotspot(turf) - -/datum/chemical_reaction/napalm - name = "Napalm" - id = "napalm" - result = "napalm" - required_reagents = list("sugar" = 1, "fuel" = 1, "ethanol" = 1 ) - result_amount = 1 + min_temp = T0C + 100 + mix_message = null /datum/chemical_reaction/cryostylane name = "cryostylane" diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm index aa457938afc..afbc94a9455 100644 --- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm +++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm @@ -250,7 +250,7 @@ /datum/chemical_reaction/slimestabilizer/on_reaction(datum/reagents/holder) feedback_add_details("slime_cores_used","[type]") - var/obj/item/slimepotion/stabilizer/P = new /obj/item/slimepotion/stabilizer + var/obj/item/slimepotion/slime/stabilizer/P = new /obj/item/slimepotion/slime/stabilizer P.forceMove(get_turf(holder.my_atom)) //Dark Blue @@ -380,7 +380,7 @@ /datum/chemical_reaction/slimepsteroid/on_reaction(datum/reagents/holder) feedback_add_details("slime_cores_used","[type]") - var/obj/item/slimepotion/steroid/P = new /obj/item/slimepotion/steroid + var/obj/item/slimepotion/slime/steroid/P = new /obj/item/slimepotion/slime/steroid P.forceMove(get_turf(holder.my_atom)) /datum/chemical_reaction/slimejam @@ -423,7 +423,7 @@ /datum/chemical_reaction/slimemutator/on_reaction(datum/reagents/holder) feedback_add_details("slime_cores_used","[type]") - var/obj/item/slimepotion/mutator/P = new /obj/item/slimepotion/mutator + var/obj/item/slimepotion/slime/mutator/P = new /obj/item/slimepotion/slime/mutator P.forceMove(get_turf(holder.my_atom)) /datum/chemical_reaction/slimebloodlust @@ -469,7 +469,7 @@ /datum/chemical_reaction/docility/on_reaction(datum/reagents/holder) feedback_add_details("slime_cores_used","[type]") - var/obj/item/slimepotion/docility/P = new /obj/item/slimepotion/docility + var/obj/item/slimepotion/slime/docility/P = new /obj/item/slimepotion/slime/docility P.forceMove(get_turf(holder.my_atom)) diff --git a/code/modules/reagents/chemistry/recipes/toxins.dm b/code/modules/reagents/chemistry/recipes/toxins.dm index 1531c80542a..cdc10bcbcc5 100644 --- a/code/modules/reagents/chemistry/recipes/toxins.dm +++ b/code/modules/reagents/chemistry/recipes/toxins.dm @@ -4,7 +4,7 @@ result = "formaldehyde" required_reagents = list("ethanol" = 1, "oxygen" = 1, "silver" = 1) result_amount = 3 - min_temp = 420 + min_temp = T0C + 150 mix_message = "Ugh, it smells like the morgue in here." /datum/chemical_reaction/neurotoxin2 @@ -13,9 +13,9 @@ result = "neurotoxin2" required_reagents = list("space_drugs" = 1) result_amount = 1 - min_temp = 674 + min_temp = T0C + 400 mix_sound = null - no_message = 1 + mix_message = null /datum/chemical_reaction/cyanide name = "Cyanide" @@ -23,7 +23,7 @@ result = "cyanide" required_reagents = list("oil" = 1, "ammonia" = 1, "oxygen" = 1) result_amount = 3 - min_temp = 380 + min_temp = T0C + 100 mix_message = "The mixture gives off a faint scent of almonds." mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' @@ -49,7 +49,7 @@ result = "facid" required_reagents = list("sacid" = 1, "fluorine" = 1, "hydrogen" = 1, "potassium" = 1) result_amount = 4 - min_temp = 380 + min_temp = T0C + 100 mix_message = "The mixture deepens to a dark blue, and slowly begins to corrode its container." /datum/chemical_reaction/initropidril @@ -83,7 +83,7 @@ required_reagents = list("chlorine" = 1, "fuel" = 1, "oxygen" = 1, "phosphorus" = 1, "fluorine" = 1, "hydrogen" = 1, "acetone" = 1, "atrazine" = 1) result_amount = 3 mix_message = "The mixture yields a colorless, odorless liquid." - min_temp = 374 + min_temp = T0C + 100 mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' /datum/chemical_reaction/sarin/on_reaction(datum/reagents/holder) @@ -139,7 +139,7 @@ required_reagents = list("plasma" = 1, "silver" = 1, "blackpowder" = 1) result_amount = 3 mix_message = "A jet of sparks flies from the mixture as it merges into a flickering slurry." - min_temp = 400 + min_temp = T0C + 50 mix_sound = null /datum/chemical_reaction/teslium/on_reaction(datum/reagents/holder, created_volume) diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 6d58e42d539..a350d75a4b4 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -44,11 +44,6 @@ R.on_ex_act() ..() -/obj/item/reagent_containers/fire_act() - reagents.chem_temp += 30 - reagents.handle_reactions() - ..() - /obj/item/reagent_containers/attack_self(mob/user) if(has_lid) if(is_open_container()) diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm index 3a9ee271ab5..6aeafd92cf0 100644 --- a/code/modules/reagents/reagent_containers/bottle.dm +++ b/code/modules/reagents/reagent_containers/bottle.dm @@ -44,10 +44,28 @@ /obj/item/reagent_containers/glass/bottle/toxin name = "toxin bottle" - desc = "A small bottle of toxins. Do not drink, it is poisonous." + desc = "A small bottle containing toxic compounds." icon_state = "small_bottle" list_reagents = list("toxin" = 30) +/obj/item/reagent_containers/glass/bottle/atropine + name = "atropine bottle" + desc = "A small bottle containing atropine, used for cardiac emergencies." + icon_state = "small_bottle" + list_reagents = list("atropine" = 30) + +/obj/item/reagent_containers/glass/bottle/saline + name = "saline-glucose bottle" + desc = "A small bottle containing saline-glucose solution." + icon_state = "small_bottle" + list_reagents = list("salglu_solution" = 30) + +/obj/item/reagent_containers/glass/bottle/salicylic + name = "salicylic acid bottle" + desc = "A small bottle containing medicine for pain and fevers." + icon_state = "small_bottle" + list_reagents = list("sal_acid" = 30) + /obj/item/reagent_containers/glass/bottle/cyanide name = "cyanide bottle" desc = "A small bottle of cyanide. Bitter almonds?" @@ -99,25 +117,25 @@ /obj/item/reagent_containers/glass/bottle/morphine name = "Morphine Bottle" - desc = "A small bottle. Contains morphine." - icon_state = "round_bottle" + desc = "A small bottle of morphine, a powerful painkiller." + icon_state = "bottle" list_reagents = list("morphine" = 30) /obj/item/reagent_containers/glass/bottle/ether name = "Ether Bottle" - desc = "A small bottle. Contains ether." + desc = "A small bottle of an ether, a strong anesthetic and sedative." icon_state = "round_bottle" list_reagents = list("ether" = 30) /obj/item/reagent_containers/glass/bottle/charcoal name = "Charcoal Bottle" desc = "A small bottle. Contains charcoal." - icon_state = "round_bottle" + icon_state = "wide_bottle" list_reagents = list("charcoal" = 30) /obj/item/reagent_containers/glass/bottle/epinephrine name = "Epinephrine Bottle" - desc = "A small bottle. Contains epinephrine." + desc = "A small bottle. Contains epinephrine - used to stabilize patients." icon_state = "round_bottle" list_reagents = list("epinephrine" = 30) @@ -236,9 +254,21 @@ /obj/item/reagent_containers/glass/bottle/diphenhydramine name = "diphenhydramine bottle" desc = "A small bottle of diphenhydramine." - icon_state = "bottle" + icon_state = "round_bottle" list_reagents = list("diphenhydramine" = 30) +/obj/item/reagent_containers/glass/bottle/oculine + name = "oculine bottle" + desc = "A small bottle of combined eye and ear medication." + icon_state = "round_bottle" + list_reagents = list("oculine" = 30) + +/obj/item/reagent_containers/glass/bottle/potassium_iodide + name = "potassium iodide bottle" + desc = "A small bottle of potassium iodide." + icon_state = "wide_bottle" + list_reagents = list("potass_iodide" = 30) + /obj/item/reagent_containers/glass/bottle/flu_virion name = "Flu virion culture bottle" desc = "A small bottle. Contains H13N1 flu virion culture in synthblood medium." diff --git a/code/modules/reagents/reagent_containers/glass_containers.dm b/code/modules/reagents/reagent_containers/glass_containers.dm index 23ec5f5cadb..4bd5d25ed3c 100644 --- a/code/modules/reagents/reagent_containers/glass_containers.dm +++ b/code/modules/reagents/reagent_containers/glass_containers.dm @@ -113,7 +113,7 @@ to_chat(user, "You cannot fill [target] while it is sealed.") return - else if(istype(target, /obj/effect/decal/cleanable)) //stops splashing while scooping up fluids + else if(istype(target, /obj/effect/decal)) //stops splashing while scooping up fluids return else if(reagents.total_volume) @@ -124,13 +124,6 @@ /obj/item/reagent_containers/glass/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/clothing/mask/cigarette)) //ciggies are weird - return - if(is_hot(I)) - if(reagents) - reagents.chem_temp += 15 - to_chat(user, "You heat [src] with [I].") - reagents.handle_reactions() if(istype(I, /obj/item/pen) || istype(I, /obj/item/flashlight/pen)) var/tmp_label = sanitize(input(user, "Enter a label for [name]","Label",label_text)) if(length(tmp_label) > MAX_NAME_LEN) @@ -210,8 +203,7 @@ /obj/item/reagent_containers/glass/beaker/proc/heat_beaker() if(reagents) - reagents.chem_temp += 30 - reagents.handle_reactions() + reagents.temperature_reagents(4000) /obj/item/reagent_containers/glass/beaker/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/assembly_holder) && can_assembly) diff --git a/code/modules/reagents/reagent_containers/iv_bag.dm b/code/modules/reagents/reagent_containers/iv_bag.dm index 413621d8257..709b20f070f 100644 --- a/code/modules/reagents/reagent_containers/iv_bag.dm +++ b/code/modules/reagents/reagent_containers/iv_bag.dm @@ -24,7 +24,7 @@ update_icon() /obj/item/reagent_containers/iv_bag/pickup(mob/user) - ..() + . = ..() update_icon() /obj/item/reagent_containers/iv_bag/dropped(mob/user) diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 71b0532650b..4b66482cf1d 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -8,9 +8,10 @@ icon_state = null item_state = "pill" possible_transfer_amounts = null - volume = 50 + volume = 100 consume_sound = null taste = FALSE + antable = FALSE /obj/item/reagent_containers/food/pill/New() ..() @@ -103,7 +104,7 @@ name = "Charcoal pill" desc = "Neutralizes many common toxins." icon_state = "pill17" - list_reagents = list("charcoal" = 25) + list_reagents = list("charcoal" = 50) /obj/item/reagent_containers/food/pill/salicylic name = "Salicylic Acid pill" @@ -121,4 +122,22 @@ name = "Hydrocodone pill" desc = "Used to treat extreme pain." icon_state = "pill6" - list_reagents = list("hydrocodone" = 15) \ No newline at end of file + list_reagents = list("hydrocodone" = 15) + +/obj/item/reagent_containers/food/pill/calomel + name = "calomel pill" + desc = "Can be used to purge impurities, but is highly toxic itself." + icon_state = "pill3" + list_reagents = list("calomel" = 15) + +/obj/item/reagent_containers/food/pill/mutadone + name = "mutadone pill" + desc = "Used to cure genetic abnormalities." + icon_state = "pill18" + list_reagents = list("mutadone" = 20) + +/obj/item/reagent_containers/food/pill/mannitol + name = "mannitol pill" + desc = "Used to treat cranial swelling." + icon_state = "pill19" + list_reagents = list("mannitol" = 20) \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 654dff53b5e..e28ec4c0cff 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -31,7 +31,7 @@ update_icon() /obj/item/reagent_containers/syringe/pickup(mob/user) - ..() + . = ..() update_icon() /obj/item/reagent_containers/syringe/dropped(mob/user) @@ -197,7 +197,7 @@ update_icon() /obj/item/reagent_containers/ld50_syringe/pickup(mob/user) - ..() + . = ..() update_icon() /obj/item/reagent_containers/ld50_syringe/dropped(mob/user) @@ -318,6 +318,11 @@ desc = "Contains insulin - used to treat diabetes." list_reagents = list("insulin" = 15) +/obj/item/reagent_containers/syringe/calomel + name = "Syringe (calomel)" + desc = "Contains calomel, which be used to purge impurities, but is highly toxic itself." + list_reagents = list("calomel" = 15) + /obj/item/reagent_containers/syringe/bioterror name = "bioterror syringe" desc = "Contains several paralyzing reagents." diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index da9f408a7c3..b3c98f82b54 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -22,6 +22,13 @@ reagents.add_reagent(reagent_id, tank_volume) ..() +/obj/structure/reagent_dispensers/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) + ..() + if(reagents) + for(var/i in 1 to 8) + if(reagents) + reagents.temperature_reagents(exposed_temperature) + /obj/structure/reagent_dispensers/proc/boom() visible_message("[src] ruptures!") chem_splash(loc, 5, list(reagents)) @@ -68,6 +75,7 @@ desc = "A tank full of industrial welding fuel. Do not consume." icon_state = "fuel" reagent_id = "fuel" + tank_volume = 4000 var/obj/item/assembly_holder/rig = null var/accepts_rig = 1 @@ -84,14 +92,14 @@ investigate_log("[key_name(P.firer)] triggered a fueltank explosion with [P.name] at [COORD(loc)]", INVESTIGATE_BOMB) boom() -/obj/structure/reagent_dispensers/fueltank/boom(var/rigtrigger = FALSE) // Prevent case where someone who rigged the tank is blamed for the explosion when the rig isn't what triggered the explosion - if(reagents.has_reagent("fuel")) - if(rigtrigger == TRUE) // If the explosion is triggered by an assembly holder - message_admins("A fueltank, last rigged by [lastrigger], exploded at [COORD(loc)]") // Then admin is informed of the last person who rigged the fuel tank - log_game("A fueltank, last rigged by [lastrigger], exploded at [COORD(loc)]") - investigate_log("A fueltank, last rigged by [lastrigger], exploded at [COORD(loc)]", INVESTIGATE_BOMB) - explosion(loc, 0, 1, 5, 7, 10, flame_range = 5) - qdel(src) +/obj/structure/reagent_dispensers/fueltank/boom(rigtrigger = FALSE) // Prevent case where someone who rigged the tank is blamed for the explosion when the rig isn't what triggered the explosion + if(rigtrigger) // If the explosion is triggered by an assembly holder + message_admins("A fueltank, last rigged by [lastrigger], was triggered at [COORD(loc)]") // Then admin is informed of the last person who rigged the fuel tank + log_game("A fueltank, last rigged by [lastrigger], triggered at [COORD(loc)]") + investigate_log("A fueltank, last rigged by [lastrigger], triggered at [COORD(loc)]", INVESTIGATE_BOMB) + if(reagents) + reagents.set_reagent_temp(1000) //uh-oh + qdel(src) /obj/structure/reagent_dispensers/fueltank/blob_act() boom() @@ -99,7 +107,8 @@ /obj/structure/reagent_dispensers/fueltank/ex_act() boom() -/obj/structure/reagent_dispensers/fueltank/fire_act() +/obj/structure/reagent_dispensers/fueltank/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE) + ..() boom() /obj/structure/reagent_dispensers/fueltank/tesla_act() @@ -167,7 +176,7 @@ investigate_log("[key_name(user)] triggered a fueltank explosion at [COORD(loc)]", INVESTIGATE_BOMB) boom() else - ..() + return ..() /obj/structure/reagent_dispensers/fueltank/Move() ..() @@ -295,3 +304,4 @@ anchored = 1 density = 0 accepts_rig = 0 + tank_volume = 1000 diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index 8cf0f52d847..239cb71328e 100755 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -177,7 +177,9 @@ var/obj/structure/closet/crate/O = target if(O.opened) return - if(use(3)) + if(amount >= 3 && do_after_once(user, 15, target = target)) + if(O.opened || !use(3)) + return var/obj/structure/bigDelivery/P = new /obj/structure/bigDelivery(get_turf(O.loc)) P.icon_state = "deliverycrate" P.wrapped = O @@ -189,7 +191,9 @@ var/obj/structure/closet/O = target if(O.opened) return - if(use(3)) + if(amount >= 3 && do_after_once(user, 15, target = target)) + if(O.opened || !use(3)) + return var/obj/structure/bigDelivery/P = new /obj/structure/bigDelivery(get_turf(O.loc)) P.wrapped = O P.init_welded = O.welded diff --git a/code/modules/research/designs/comp_board_designs.dm b/code/modules/research/designs/comp_board_designs.dm index 57da7142b7c..9d555d8cf32 100644 --- a/code/modules/research/designs/comp_board_designs.dm +++ b/code/modules/research/designs/comp_board_designs.dm @@ -212,6 +212,16 @@ build_path = /obj/item/circuitboard/prisoner category = list("Computer Boards") +/datum/design/brigcells + name = "Console Board (Brig Cell Management Console)" + desc = "Allows for the construction of circuit boards used to build a brig cell management console." + id = "brigcells" + req_tech = list("programming" = 2) + build_type = IMPRINTER + materials = list(MAT_GLASS = 1000) + build_path = /obj/item/circuitboard/brigcells + category = list("Computer Boards") + /datum/design/rdconsole name = "Console Board (R&D Console)" desc = "Allows for the construction of circuit boards used to build a new R&D console. Can be swiped with a Scientist level ID to manage access levels." diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index cc6305319c7..a23378f5513 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -163,8 +163,8 @@ category = list("Medical Machinery") /datum/design/chem_dispenser - name = "Machine Board (Portable Chem Dispenser)" - desc = "The circuit board for a Portable Chem Dispenser." + name = "Machine Board (Chem Dispenser)" + desc = "The circuit board for a Chem Dispenser." id = "chem_dispenser" req_tech = list("programming" = 5, "biotech" = 3, "materials" = 4, "plasmatech" = 4) build_type = IMPRINTER @@ -173,8 +173,8 @@ category = list("Medical Machinery") /datum/design/chem_master - name = "Machine Design (Chem Master Board)" - desc = "The circuit board for a Chem Master 2999." + name = "Machine Design (ChemMaster Board)" + desc = "The circuit board for a ChemMaster 3000." id = "chem_master" req_tech = list("biotech" = 3, "materials" = 3, "programming" = 2) build_type = IMPRINTER diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index d5434765e30..d945722770e 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -52,6 +52,16 @@ build_path = /obj/item/healthupgrade category = list("Medical") +/datum/design/handheld_defib + name = "Handheld Defibrillator" + desc = "A smaller defibrillator only capable of treating cardiac arrest." + id = "handheld_defib" + req_tech = list("biotech" = 2, "magnets" = 3) + build_type = PROTOLATHE + materials = list(MAT_METAL = 20, MAT_GLASS = 20) + build_path = /obj/item/handheld_defibrillator + category = list("Medical") + /datum/design/defib name = "Defibrillator" desc = "A device that delivers powerful shocks to detachable paddles that resuscitate incapacitated patients." diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index 2ae4e3ac828..dad2b6698ad 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -318,7 +318,7 @@ R.add_reagent(chosenchem , 15) investigate_log("Experimentor has released [chosenchem] smoke.", "experimentor") var/datum/effect_system/smoke_spread/chem/smoke = new - smoke.set_up(R, 1, 0, src, 0, silent = 1) + smoke.set_up(R, src, TRUE) playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3) smoke.start() qdel(R) @@ -330,7 +330,7 @@ R.my_atom = src R.add_reagent(chosenchem , 15) var/datum/effect_system/smoke_spread/chem/smoke = new - smoke.set_up(R, 1, 0, src, 0, silent = 1) + smoke.set_up(R, src, TRUE) playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3) smoke.start() qdel(R) @@ -417,7 +417,7 @@ R.add_reagent("frostoil" , 15) investigate_log("Experimentor has released frostoil gas.", "experimentor") var/datum/effect_system/smoke_spread/chem/smoke = new - smoke.set_up(R, 1, 0, src, 0, silent = 1) + smoke.set_up(R, src, TRUE) playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3) smoke.start() qdel(R) diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm index 29a3cd26600..b695ca3a1b4 100644 --- a/code/modules/research/xenobiology/xenobio_camera.dm +++ b/code/modules/research/xenobiology/xenobio_camera.dm @@ -26,14 +26,33 @@ var/datum/action/innate/slime_pick_up/slime_up_action = new var/datum/action/innate/feed_slime/feed_slime_action = new var/datum/action/innate/monkey_recycle/monkey_recycle_action = new + var/datum/action/innate/slime_scan/scan_action = new + var/datum/action/innate/feed_potion/potion_action = new + var/datum/action/innate/hotkey_help/hotkey_help = new var/list/stored_slimes = list() var/max_slimes = 5 var/monkeys = 0 + var/obj/item/slimepotion/slime/current_potion + var/obj/machinery/monkey_recycler/connected_recycler icon_screen = "slime_comp" icon_keyboard = "rd_key" +/obj/machinery/computer/camera_advanced/xenobio/New() + ..() + for(var/obj/machinery/monkey_recycler/recycler in GLOB.monkey_recyclers) + if(get_area(recycler.loc) == get_area(loc)) + connected_recycler = recycler + connected_recycler.connected += src + +/obj/machinery/computer/camera_advanced/xenobio/Destroy() + QDEL_NULL(current_potion) + for(var/mob/living/carbon/slime/S in stored_slimes) + S.forceMove(drop_location()) + stored_slimes.Cut() + return ..() + /obj/machinery/computer/camera_advanced/xenobio/CreateEye() eyeobj = new /mob/camera/aiEye/remote/xenobio(get_turf(src)) eyeobj.origin = src @@ -43,26 +62,63 @@ /obj/machinery/computer/camera_advanced/xenobio/GrantActions(mob/living/carbon/user) ..() + if(slime_up_action) slime_up_action.target = src slime_up_action.Grant(user) actions += slime_up_action - + if(slime_place_action) slime_place_action.target = src slime_place_action.Grant(user) actions += slime_place_action - + if(feed_slime_action) feed_slime_action.target = src feed_slime_action.Grant(user) actions += feed_slime_action - + if(monkey_recycle_action) monkey_recycle_action.target = src monkey_recycle_action.Grant(user) actions += monkey_recycle_action + if(scan_action) + scan_action.target = src + scan_action.Grant(user) + actions += scan_action + + if(potion_action) + potion_action.target = src + potion_action.Grant(user) + actions += potion_action + + if(hotkey_help) + hotkey_help.target = src + hotkey_help.Grant(user) + actions += hotkey_help + + RegisterSignal(user, COMSIG_XENO_SLIME_CLICK_CTRL, .proc/XenoSlimeClickCtrl) + RegisterSignal(user, COMSIG_XENO_SLIME_CLICK_ALT, .proc/XenoSlimeClickAlt) + RegisterSignal(user, COMSIG_XENO_SLIME_CLICK_SHIFT, .proc/XenoSlimeClickShift) + RegisterSignal(user, COMSIG_XENO_TURF_CLICK_SHIFT, .proc/XenoTurfClickShift) + RegisterSignal(user, COMSIG_XENO_TURF_CLICK_CTRL, .proc/XenoTurfClickCtrl) + RegisterSignal(user, COMSIG_XENO_MONKEY_CLICK_CTRL, .proc/XenoMonkeyClickCtrl) + + if(!connected_recycler) + for(var/obj/machinery/monkey_recycler/recycler in GLOB.monkey_recyclers) + if(get_area(recycler.loc) == get_area(loc)) + connected_recycler = recycler + connected_recycler.connected += src + +/obj/machinery/computer/camera_advanced/xenobio/remove_eye_control(mob/living/user) + UnregisterSignal(user, COMSIG_XENO_SLIME_CLICK_CTRL) + UnregisterSignal(user, COMSIG_XENO_SLIME_CLICK_ALT) + UnregisterSignal(user, COMSIG_XENO_SLIME_CLICK_SHIFT) + UnregisterSignal(user, COMSIG_XENO_TURF_CLICK_SHIFT) + UnregisterSignal(user, COMSIG_XENO_TURF_CLICK_CTRL) + UnregisterSignal(user, COMSIG_XENO_MONKEY_CLICK_CTRL) + ..() /obj/machinery/computer/camera_advanced/xenobio/attack_hand(mob/user) if(!ishuman(user)) //AIs using it might be weird @@ -71,11 +127,20 @@ /obj/machinery/computer/camera_advanced/xenobio/attackby(obj/item/O, mob/user, params) if(istype(O, /obj/item/reagent_containers/food/snacks/monkeycube)) - monkeys++ - to_chat(user, "You feed [O] to [src]. It now has [monkeys] monkey cubes stored.") - user.drop_item() - qdel(O) - return + if(user.drop_item()) + monkeys++ + to_chat(user, "You feed [O] to [src]. It now has [monkeys] monkey cubes stored.") + qdel(O) + return + else if(istype(O, /obj/item/slimepotion/slime)) + var/replaced = FALSE + if(user.drop_item()) + if(!QDELETED(current_potion)) + current_potion.forceMove(drop_location()) + replaced = TRUE + current_potion = O + to_chat(user, "You load [O] in the console's potion slot[replaced ? ", replacing the one that was there before" : ""].") + return else if(istype(O, /obj/item/storage/bag)) var/obj/item/storage/P = O var/loaded = 0 @@ -87,6 +152,13 @@ if(loaded) to_chat(user, "You fill [src] with the monkey cubes stored in [O]. [src] now has [monkeys] monkey cubes stored.") return + else if(ismultitool(O)) + var/obj/item/multitool/I = O + if(istype(I.buffer, /obj/machinery/monkey_recycler)) + to_chat(user, "You link [src] with [I.buffer] in [I] buffer.") + connected_recycler = I.buffer + connected_recycler.connected += src + return ..() /datum/action/innate/slime_place @@ -163,12 +235,201 @@ var/mob/living/carbon/human/C = owner var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control var/obj/machinery/computer/camera_advanced/xenobio/X = target - + var/obj/machinery/monkey_recycler/recycler = X.connected_recycler + + if(!recycler) + to_chat(owner, "There is no connected monkey recycler. Use a multitool to link one.") + return if(cameranet.checkTurfVis(remote_eye.loc)) for(var/mob/living/carbon/human/M in remote_eye.loc) if(issmall(M) && M.stat) M.visible_message("[M] vanishes as [M.p_theyre()] reclaimed for recycling!") - X.monkeys = round(X.monkeys + 0.2,0.1) + recycler.use_power(500) + X.monkeys = round(X.monkeys + recycler.cube_production/recycler.required_grind, 0.1) qdel(M) else - to_chat(owner, "Target is not near a camera. Cannot proceed.") \ No newline at end of file + to_chat(owner, "Target is not near a camera. Cannot proceed.") + +/datum/action/innate/slime_scan + name = "Scan Slime" + button_icon_state = "slime_scan" + +/datum/action/innate/slime_scan/Activate() + if(!target || !isliving(owner)) + return + var/mob/living/C = owner + var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control + + if(cameranet.checkTurfVis(remote_eye.loc)) + for(var/mob/living/carbon/slime/S in remote_eye.loc) + slime_scan(S, C) + else + to_chat(owner, "Target is not near a camera. Cannot proceed.") + +/datum/action/innate/feed_potion + name = "Apply Potion" + button_icon_state = "slime_potion" + +/datum/action/innate/feed_potion/Activate() + if(!target || !ishuman(owner)) + return + + var/mob/living/carbon/human/C = owner + var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control + var/obj/machinery/computer/camera_advanced/xenobio/X = target + + if(QDELETED(X.current_potion)) + to_chat(owner, "No potion loaded.") + return + + if(cameranet.checkTurfVis(remote_eye.loc)) + for(var/mob/living/carbon/slime/S in remote_eye.loc) + X.current_potion.attack(S, C) + break + else + to_chat(owner, "Target is not near a camera. Cannot proceed.") + +/datum/action/innate/hotkey_help + name = "Hotkey Help" + button_icon_state = "hotkey_help" + +/datum/action/innate/hotkey_help/Activate() + if(!target || !isliving(owner)) + return + to_chat(owner, "Click shortcuts:") + to_chat(owner, "Shift-click a slime to pick it up, or the floor to drop all held slimes.") + to_chat(owner, "Ctrl-click a slime to scan it.") + to_chat(owner, "Alt-click a slime to feed it a potion.") + to_chat(owner, "Ctrl-click or a dead monkey to recycle it, or the floor to place a new monkey.") + +// +// Alternate clicks for slime, monkey and open turf if using a xenobio console + +// Scans slime +/mob/living/carbon/slime/CtrlClick(mob/user) + SEND_SIGNAL(user, COMSIG_XENO_SLIME_CLICK_CTRL, src) + ..() + +//Feeds a potion to slime +/mob/living/carbon/slime/AltClick(mob/user) + SEND_SIGNAL(user, COMSIG_XENO_SLIME_CLICK_ALT, src) + ..() + +//Picks up slime +/mob/living/carbon/slime/ShiftClick(mob/user) + SEND_SIGNAL(user, COMSIG_XENO_SLIME_CLICK_SHIFT, src) + ..() + +//Place slimes +/turf/simulated/ShiftClick(mob/user) + SEND_SIGNAL(user, COMSIG_XENO_TURF_CLICK_SHIFT, src) + ..() + +//Place monkey +/turf/simulated/CtrlClick(mob/user) + SEND_SIGNAL(user, COMSIG_XENO_TURF_CLICK_CTRL, src) + ..() + +//Pick up monkey +/mob/living/carbon/monkey/CtrlClick(mob/user) + SEND_SIGNAL(user, COMSIG_XENO_MONKEY_CLICK_CTRL, src) + ..() + +// Scans slime +/obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickCtrl(mob/living/user, mob/living/carbon/slime/S) + if(!cameranet.checkTurfVis(S.loc)) + to_chat(user, "Target is not near a camera. Cannot proceed.") + return + var/mob/living/C = user + var/mob/camera/aiEye/remote/xenobio/E = C.remote_control + var/area/mobarea = get_area(S.loc) + if(mobarea.name == E.allowed_area || mobarea.xenobiology_compatible) + slime_scan(S, C) + +//Feeds a potion to slime +/obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickAlt(mob/living/user, mob/living/carbon/slime/S) + if(!cameranet.checkTurfVis(S.loc)) + to_chat(user, "Target is not near a camera. Cannot proceed.") + return + var/mob/living/C = user + var/mob/camera/aiEye/remote/xenobio/E = C.remote_control + var/obj/machinery/computer/camera_advanced/xenobio/X = E.origin + var/area/mobarea = get_area(S.loc) + if(QDELETED(X.current_potion)) + to_chat(C, "No potion loaded.") + return + if(mobarea.name == E.allowed_area || mobarea.xenobiology_compatible) + X.current_potion.attack(S, C) + +//Picks up slime +/obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickShift(mob/living/user, mob/living/carbon/slime/S) + if(!cameranet.checkTurfVis(S.loc)) + to_chat(user, "Target is not near a camera. Cannot proceed.") + return + var/mob/living/C = user + var/mob/camera/aiEye/remote/xenobio/E = C.remote_control + var/obj/machinery/computer/camera_advanced/xenobio/X = E.origin + var/area/mobarea = get_area(S.loc) + if(mobarea.name == E.allowed_area || mobarea.xenobiology_compatible) + if(X.stored_slimes.len >= X.max_slimes) + return + if(!S.ckey) + if(S.buckled) + S.buckled.unbuckle_mob() + S.Feedstop() + S.visible_message("[S] vanishes in a flash of light!") + S.forceMove(X) + X.stored_slimes += S + +//Place slimes +/obj/machinery/computer/camera_advanced/xenobio/proc/XenoTurfClickShift(mob/living/user, turf/T) + if(!cameranet.checkTurfVis(T)) + to_chat(user, "Target is not near a camera. Cannot proceed.") + return + var/mob/living/C = user + var/mob/camera/aiEye/remote/xenobio/E = C.remote_control + var/obj/machinery/computer/camera_advanced/xenobio/X = E.origin + var/area/turfarea = get_area(T) + if(turfarea.name == E.allowed_area || turfarea.xenobiology_compatible) + for(var/mob/living/carbon/slime/S in X.stored_slimes) + S.forceMove(T) + S.visible_message("[S] warps in!") + X.stored_slimes -= S + +//Place monkey +/obj/machinery/computer/camera_advanced/xenobio/proc/XenoTurfClickCtrl(mob/living/user, turf/T) + if(!cameranet.checkTurfVis(T)) + to_chat(user, "Target is not near a camera. Cannot proceed.") + return + var/mob/living/C = user + var/mob/camera/aiEye/remote/xenobio/E = C.remote_control + var/obj/machinery/computer/camera_advanced/xenobio/X = E.origin + var/area/turfarea = get_area(T) + + if(turfarea.name == E.allowed_area || turfarea.xenobiology_compatible) + if(X.monkeys >= 1) + var/mob/living/carbon/human/monkey/food = new /mob/living/carbon/human/monkey(T) + food.LAssailant = C + X.monkeys -- + X.monkeys = round(X.monkeys, 0.1) + to_chat(user, "[X] now has [X.monkeys] monkeys left.") + +//Pick up monkey +/obj/machinery/computer/camera_advanced/xenobio/proc/XenoMonkeyClickCtrl(mob/living/user, mob/living/carbon/monkey/M) + if(!cameranet.checkTurfVis(M.loc)) + to_chat(user, "Target is not near a camera. Cannot proceed.") + return + var/mob/living/C = user + var/mob/camera/aiEye/remote/xenobio/E = C.remote_control + var/obj/machinery/computer/camera_advanced/xenobio/X = E.origin + var/area/mobarea = get_area(M.loc) + var/obj/machinery/monkey_recycler/recycler = X.connected_recycler + if(!recycler) + to_chat(C, "There is no connected monkey recycler. Use a multitool to link one.") + return + if(mobarea.name == E.allowed_area || mobarea.xenobiology_compatible) + if(issmall(M) && M.stat) + M.visible_message("[M] vanishes as [M.p_theyre()] reclaimed for recycling!") + recycler.use_power(500) + X.monkeys = round(X.monkeys + recycler.cube_production/recycler.required_grind, 0.1) + qdel(M) diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index 02e6b155025..f60954a83a6 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -132,14 +132,14 @@ to_chat(user, "You cannot transfer [src] to [target]! It appears the potion must be given directly to a slime to absorb.") // le fluff faec return -/obj/item/slimepotion/docility +/obj/item/slimepotion/slime/docility name = "docility potion" desc = "A potent chemical mix that nullifies a slime's hunger, causing it to become docile and tame." icon = 'icons/obj/chemical.dmi' icon_state = "bottle19" var/being_used = 0 -/obj/item/slimepotion/docility/attack(mob/living/carbon/slime/M, mob/user) +/obj/item/slimepotion/slime/docility/attack(mob/living/carbon/slime/M, mob/user) if(!isslime(M)) to_chat(user, "The potion only works on slimes!") return @@ -205,6 +205,7 @@ SM.faction = user.faction SM.master_commander = user SM.sentience_act() + SM.can_collar = 1 to_chat(SM, "All at once it makes sense: you know what you are and who you are! Self awareness is yours!") to_chat(SM, "You are grateful to be self aware and owe [user] a great debt. Serve [user], and assist [user.p_them()] in completing [user.p_their()] goals at any cost.") if(SM.flags_2 & HOLOGRAM_2) //Check to see if it's a holodeck creature @@ -254,19 +255,20 @@ SM.universal_speak = 1 SM.faction = user.faction SM.sentience_act() //Same deal here as with sentience + SM.can_collar = 1 user.death() to_chat(SM, "In a quick flash, you feel your consciousness flow into [SM]!") to_chat(SM, "You are now [SM]. Your allegiances, alliances, and roles are still the same as they were prior to consciousness transfer!") SM.name = "[SM.name] as [user.real_name]" qdel(src) -/obj/item/slimepotion/steroid +/obj/item/slimepotion/slime/steroid name = "slime steroid" desc = "A potent chemical mix that will cause a baby slime to generate more extract." icon = 'icons/obj/chemical.dmi' icon_state = "bottle16" -/obj/item/slimepotion/steroid/attack(mob/living/carbon/slime/M, mob/user) +/obj/item/slimepotion/slime/steroid/attack(mob/living/carbon/slime/M, mob/user) if(!isslime(M))//If target is not a slime. to_chat(user, "The steroid only works on baby slimes!") return ..() @@ -290,13 +292,13 @@ icon = 'icons/obj/chemical.dmi' icon_state = "bottle17" -/obj/item/slimepotion/stabilizer +/obj/item/slimepotion/slime/stabilizer name = "slime stabilizer" desc = "A potent chemical mix that will reduce the chance of a slime mutating." icon = 'icons/obj/chemical.dmi' icon_state = "bottle15" -/obj/item/slimepotion/stabilizer/attack(mob/living/carbon/slime/M, mob/user) +/obj/item/slimepotion/slime/stabilizer/attack(mob/living/carbon/slime/M, mob/user) if(!isslime(M)) to_chat(user, "The stabilizer only works on slimes!") return ..() @@ -311,13 +313,13 @@ M.mutation_chance = Clamp(M.mutation_chance-15,0,100) qdel(src) -/obj/item/slimepotion/mutator +/obj/item/slimepotion/slime/mutator name = "slime mutator" desc = "A potent chemical mix that will increase the chance of a slime mutating." icon = 'icons/obj/chemical.dmi' icon_state = "bottle3" -/obj/item/slimepotion/mutator/attack(mob/living/carbon/slime/M, mob/user) +/obj/item/slimepotion/slime/mutator/attack(mob/living/carbon/slime/M, mob/user) if(!isslime(M)) to_chat(user, "The mutator only works on slimes!") return ..() diff --git a/code/modules/response_team/ert_outfits.dm b/code/modules/response_team/ert_outfits.dm index 368868770c7..b287643901d 100644 --- a/code/modules/response_team/ert_outfits.dm +++ b/code/modules/response_team/ert_outfits.dm @@ -306,7 +306,8 @@ /obj/item/roller = 1, /obj/item/storage/pill_bottle/ert = 1, /obj/item/flashlight = 1, - /obj/item/healthupgrade = 1 + /obj/item/healthupgrade = 1, + /obj/item/handheld_defibrillator = 1 ) /datum/outfit/job/centcom/response_team/medic/red @@ -335,7 +336,8 @@ /obj/item/roller = 1, /obj/item/clothing/shoes/magboots = 1, /obj/item/bodyanalyzer = 1, - /obj/item/healthupgrade = 1 + /obj/item/healthupgrade = 1, + /obj/item/handheld_defibrillator = 1 ) /datum/outfit/job/centcom/response_team/medic/gamma @@ -357,7 +359,8 @@ /obj/item/bodyanalyzer/advanced = 1, /obj/item/extinguisher/mini = 1, /obj/item/roller = 1, - /obj/item/healthanalyzer/advanced = 1 + /obj/item/healthanalyzer/advanced = 1, + /obj/item/handheld_defibrillator = 1 ) diff --git a/code/modules/security_levels/security levels.dm b/code/modules/security_levels/security levels.dm index f5d3fe7e1bf..050326891fb 100644 --- a/code/modules/security_levels/security levels.dm +++ b/code/modules/security_levels/security levels.dm @@ -77,7 +77,7 @@ FA.overlays += image('icons/obj/monitors.dmi', "overlay_red") if(SEC_LEVEL_GAMMA) - security_announcement_up.Announce("Central Command has ordered the Gamma security level on the station. Security is to have weapons equipped at all times, and all civilians are to immediately seek their nearest head for transportation to a secure location. The station's Gamma armory has been unlocked and is ready for use.","Attention! Gamma security level activated!") + security_announcement_up.Announce("Central Command has ordered the Gamma security level on the station. Security is to have weapons equipped at all times, and all civilians are to immediately seek their nearest head for transportation to a secure location. The station's Gamma armory has been unlocked and is ready for use.","Attention! Gamma security level activated!", new_sound = sound('sound/effects/new_siren.ogg')) security_level = SEC_LEVEL_GAMMA move_gamma_ship() @@ -102,7 +102,7 @@ FA.update_icon() if(SEC_LEVEL_EPSILON) - security_announcement_up.Announce("Central Command has ordered the Epsilon security level on the station. Consider all contracts terminated.","Attention! Epsilon security level activated!") + security_announcement_up.Announce("Central Command has ordered the Epsilon security level on the station. Consider all contracts terminated.","Attention! Epsilon security level activated!", new_sound = sound('sound/effects/purge_siren.ogg')) security_level = SEC_LEVEL_EPSILON post_status("alert", "epsilonalert") diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index dfa54f086d1..06e0c2336f0 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -714,6 +714,8 @@ possible_destinations = C.possible_destinations shuttleId = C.shuttleId +/obj/machinery/computer/shuttle/Initialize(mapload) + . = ..() connect() /obj/machinery/computer/shuttle/proc/connect() diff --git a/code/modules/surgery/organs/blood.dm b/code/modules/surgery/organs/blood.dm index 0ff4273daa1..d2d758529aa 100644 --- a/code/modules/surgery/organs/blood.dm +++ b/code/modules/surgery/organs/blood.dm @@ -18,23 +18,11 @@ // Takes care blood loss and regeneration /mob/living/carbon/human/handle_blood() - var/list/blood_data = get_blood_data(get_blood_id())//PROCCEPTION - if(NO_BLOOD in dna.species.species_traits) bleed_rate = 0 return if(bodytemperature >= 225 && !(NOCLONE in mutations)) //cryosleep or husked people do not pump the blood. - - //Blood regeneration if there is some space - if(blood_volume < max_blood && blood_volume) - if(mind) //Handles vampires "eating" blood that isn't their own. - if(mind in ticker.mode.vampires) - if(nutrition >= NUTRITION_LEVEL_WELL_FED) - return //We don't want blood tranfusions making vampires fat. - if(blood_data["donor"] != src) - nutrition += (15 * REAGENTS_METABOLISM) - return //Only process one blood per tick, to maintain the same metabolism as nutriment for non-vampires. if(blood_volume < BLOOD_VOLUME_NORMAL) blood_volume += 0.1 // regenerate blood VERY slowly @@ -56,7 +44,7 @@ if(prob(15)) Paralyse(rand(1,3)) to_chat(src, "You feel extremely [word].") - if(0 to BLOOD_VOLUME_SURVIVE) + if(-INFINITY to BLOOD_VOLUME_SURVIVE) death() var/temp_bleed = 0 diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm index 04626864b94..512de9de9e9 100644 --- a/code/modules/surgery/organs/heart.dm +++ b/code/modules/surgery/organs/heart.dm @@ -160,6 +160,7 @@ /obj/item/organ/internal/heart/cybernetic/upgraded/on_life() if(!ishuman(owner)) return + if(!(status & ORGAN_DEAD) && !attempted_restart && !beating) to_chat(owner, "Your [name] detects a cardiac event and attempts to return to its normal rhythm!") if(prob(20) && emagged) @@ -180,6 +181,28 @@ addtimer(CALLBACK(src, .proc/recharge), 300) addtimer(CALLBACK(src, .proc/message_to_owner, owner, "Your [name] fails to return to its normal rhythm!"), 30) + if(!(status & ORGAN_DEAD) && !attempted_restart && owner.HasDisease(new /datum/disease/critical/heart_failure(0))) + to_chat(owner, "Your [name] detects a cardiac event and attempts to return to its normal rhythm!") + if(prob(40) && emagged) + attempted_restart = TRUE + for(var/datum/disease/critical/heart_failure/HF in owner.viruses) + HF.cure() + addtimer(CALLBACK(src, .proc/message_to_owner, owner, "Your [name] returns to its normal rhythm!"), 30) + addtimer(CALLBACK(src, .proc/recharge), 200) + else if(prob(25)) + attempted_restart = TRUE + for(var/datum/disease/critical/heart_failure/HF in owner.viruses) + HF.cure() + addtimer(CALLBACK(src, .proc/message_to_owner, owner, "Your [name] returns to its normal rhythm!"), 30) + addtimer(CALLBACK(src, .proc/recharge), 200) + else + attempted_restart = TRUE + if(emagged) + addtimer(CALLBACK(src, .proc/recharge), 200) + else + addtimer(CALLBACK(src, .proc/recharge), 300) + addtimer(CALLBACK(src, .proc/message_to_owner, owner, "Your [name] fails to return to its normal rhythm!"), 30) + if(!(status & ORGAN_DEAD)) var/boost = emagged ? 2 : 1 owner.AdjustDrowsy(-4 * boost) @@ -230,7 +253,7 @@ owner.adjustFireLoss(numHigh) if(prob(numMid)) to_chat(owner, "Your [name] lurches awkwardly!") - Stop() + owner.ForceContractDisease(new /datum/disease/critical/heart_failure(0)) if(prob(numMid)) to_chat(owner, "Your [name] stops beating!") Stop() @@ -246,4 +269,4 @@ owner.adjustFireLoss(numMid) if(prob(numLow)) to_chat(owner, "Your [name] lurches awkwardly!") - Stop() \ No newline at end of file + owner.ForceContractDisease(new /datum/disease/critical/heart_failure(0)) \ No newline at end of file diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index 9e437f415a9..47fa74969d0 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -19,20 +19,16 @@ var/safe_toxins_max = 0.05 var/SA_para_min = 1 //Sleeping agent var/SA_sleep_min = 5 //Sleeping agent - var/gas_toxicity_multiplier = 100 - var/oxy_breath_dam_min = MIN_TOXIC_GAS_DAMAGE - var/oxy_breath_dam_max = MAX_TOXIC_GAS_DAMAGE + var/oxy_damage_type = OXY - var/nitro_breath_dam_min = MIN_TOXIC_GAS_DAMAGE - var/nitro_breath_dam_max = MAX_TOXIC_GAS_DAMAGE + var/oxy_breath_dam_multiplier = 1 var/nitro_damage_type = OXY - var/co2_breath_dam_min = MIN_TOXIC_GAS_DAMAGE - var/co2_breath_dam_max = MAX_TOXIC_GAS_DAMAGE + var/nitro_breath_dam_multiplier = 1 var/co2_damage_type = OXY - var/tox_breath_dam_min = MIN_TOXIC_GAS_DAMAGE - var/tox_breath_dam_max = MAX_TOXIC_GAS_DAMAGE + var/co2_breath_dam_multiplier = 1 var/tox_damage_type = TOX + var/tox_breath_dam_multiplier = 1 var/cold_message = "your face freezing and an icicle forming" var/cold_level_1_threshold = 260 @@ -88,12 +84,11 @@ return if(!breath || (breath.total_moles() == 0)) - if(H.health >= config.health_threshold_crit) - H.adjustOxyLoss(HUMAN_MAX_OXYLOSS) - else if(!(NOCRITDAMAGE in H.dna.species.species_traits)) - H.adjustOxyLoss(HUMAN_CRIT_MAX_OXYLOSS) + if(isspaceturf(loc)) + H.adjustOxyLoss(10) + else + H.adjustOxyLoss(5) - H.failed_last_breath = TRUE if(safe_oxygen_min) H.throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy) else if(safe_toxins_min) @@ -104,6 +99,10 @@ H.throw_alert("not_enough_nitro", /obj/screen/alert/not_enough_nitro) return FALSE + + if(H.health < HEALTH_THRESHOLD_CRIT) + return FALSE + var/gas_breathed = 0 //Partial pressures in our breath @@ -118,8 +117,8 @@ //Too much oxygen! //Yes, some species may not like it. if(safe_oxygen_max) if(O2_pp > safe_oxygen_max) - var/ratio = (breath.oxygen/safe_oxygen_max) * gas_toxicity_multiplier - H.apply_damage_type(Clamp(ratio, oxy_breath_dam_min, oxy_breath_dam_max), oxy_damage_type) + var/ratio = breath.oxygen/safe_oxygen_max + H.apply_damage_type(ratio * 325 * oxy_breath_dam_multiplier, oxy_damage_type) H.throw_alert("too_much_oxy", /obj/screen/alert/too_much_oxy) else H.clear_alert("too_much_oxy") @@ -130,8 +129,7 @@ gas_breathed = handle_too_little_breath(H, O2_pp, safe_oxygen_min, breath.oxygen) H.throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy) else - H.failed_last_breath = FALSE - H.adjustOxyLoss(-5) + H.adjustOxyLoss(-HUMAN_MAX_OXYLOSS) gas_breathed = breath.oxygen H.clear_alert("not_enough_oxy") @@ -145,8 +143,8 @@ //Too much nitrogen! if(safe_nitro_max) if(N2_pp > safe_nitro_max) - var/ratio = (breath.nitrogen/safe_nitro_max) * gas_toxicity_multiplier - H.apply_damage_type(Clamp(ratio, nitro_breath_dam_min, nitro_breath_dam_max), nitro_damage_type) + var/ratio = breath.nitrogen/safe_nitro_max + H.apply_damage_type(ratio * 325 * nitro_breath_dam_multiplier, nitro_damage_type) H.throw_alert("too_much_nitro", /obj/screen/alert/too_much_nitro) else H.clear_alert("too_much_nitro") @@ -157,8 +155,7 @@ gas_breathed = handle_too_little_breath(H, N2_pp, safe_nitro_min, breath.nitrogen) H.throw_alert("not_enough_nitro", /obj/screen/alert/not_enough_nitro) else - H.failed_last_breath = FALSE - H.adjustOxyLoss(-5) + H.adjustOxyLoss(-HUMAN_MAX_OXYLOSS) gas_breathed = breath.nitrogen H.clear_alert("not_enough_nitro") @@ -176,9 +173,9 @@ H.co2overloadtime = world.time else if(world.time - H.co2overloadtime > 120) H.Paralyse(3) - H.apply_damage_type(3, co2_damage_type) // Lets hurt em a little, let them know we mean business + H.apply_damage_type(HUMAN_MAX_OXYLOSS * co2_breath_dam_multiplier, co2_damage_type) // Lets hurt em a little, let them know we mean business if(world.time - H.co2overloadtime > 300) // They've been in here 30s now, lets start to kill them for their own good! - H.apply_damage_type(8, co2_damage_type) + H.apply_damage_type(15 * co2_breath_dam_multiplier, co2_damage_type) H.throw_alert("too_much_co2", /obj/screen/alert/too_much_co2) if(prob(20)) // Lets give them some chance to know somethings not right though I guess. H.emote("cough") @@ -193,8 +190,7 @@ gas_breathed = handle_too_little_breath(H, CO2_pp, safe_co2_min, breath.carbon_dioxide) H.throw_alert("not_enough_co2", /obj/screen/alert/not_enough_co2) else - H.failed_last_breath = FALSE - H.adjustOxyLoss(-5) + H.adjustOxyLoss(-HUMAN_MAX_OXYLOSS) gas_breathed = breath.carbon_dioxide H.clear_alert("not_enough_co2") @@ -209,8 +205,8 @@ //Too much toxins! if(safe_toxins_max) if(Toxins_pp > safe_toxins_max) - var/ratio = (breath.toxins/safe_toxins_max) * gas_toxicity_multiplier - H.apply_damage_type(Clamp(ratio, tox_breath_dam_min, tox_breath_dam_max), tox_damage_type) + var/ratio = breath.toxins/safe_toxins_max + H.apply_damage_type(ratio * 325 * tox_breath_dam_multiplier, tox_damage_type) H.throw_alert("too_much_tox", /obj/screen/alert/too_much_tox) else H.clear_alert("too_much_tox") @@ -222,8 +218,7 @@ gas_breathed = handle_too_little_breath(H, Toxins_pp, safe_toxins_min, breath.toxins) H.throw_alert("not_enough_tox", /obj/screen/alert/not_enough_tox) else - H.failed_last_breath = FALSE - H.adjustOxyLoss(-5) + H.adjustOxyLoss(-HUMAN_MAX_OXYLOSS) gas_breathed = breath.toxins H.clear_alert("not_enough_tox") @@ -261,11 +256,9 @@ if(breath_pp > 0) var/ratio = safe_breath_min/breath_pp H.adjustOxyLoss(min(5*ratio, HUMAN_MAX_OXYLOSS)) // Don't fuck them up too fast (space only does HUMAN_MAX_OXYLOSS after all! - H.failed_last_breath = TRUE . = true_pp*ratio/6 else H.adjustOxyLoss(HUMAN_MAX_OXYLOSS) - H.failed_last_breath = TRUE /obj/item/organ/internal/lungs/proc/handle_breath_temperature(datum/gas_mixture/breath, mob/living/carbon/human/H) // called by human/life, handles temperatures @@ -315,7 +308,8 @@ /obj/item/organ/internal/lungs/plasmaman name = "plasma filter" desc = "A spongy rib-shaped mass for filtering plasma from the air." - icon_state = "lungs-plasma" + icon = 'icons/obj/species_organs/plasmaman.dmi' + icon_state = "lungs" safe_oxygen_min = 0 //We don't breath this safe_toxins_min = 16 //We breathe THIS! @@ -324,21 +318,24 @@ /obj/item/organ/internal/lungs/vox name = "Vox lungs" desc = "They're filled with dust....wow." + icon = 'icons/obj/species_organs/vox.dmi' + icon_state = "lungs" safe_oxygen_min = 0 //We don't breathe this safe_oxygen_max = 0.05 //This is toxic to us safe_nitro_min = 16 //We breathe THIS! oxy_damage_type = TOX //And it poisons us + oxy_breath_dam_multiplier = 0.16 /obj/item/organ/internal/lungs/drask - icon = 'icons/obj/surgery_drask.dmi' + icon = 'icons/obj/species_organs/drask.dmi' cold_message = "an invigorating coldness" cold_level_3_threshold = 60 cold_level_1_damage = -COLD_GAS_DAMAGE_LEVEL_1 //They heal when the air is cold cold_level_2_damage = -COLD_GAS_DAMAGE_LEVEL_2 cold_level_3_damage = -COLD_GAS_DAMAGE_LEVEL_3 - cold_damage_types = list(BRUTE = 1, BURN = 0.5) + cold_damage_types = list(BRUTE = 0.5, BURN = 0.25) /obj/item/organ/internal/lungs/cybernetic name = "cybernetic lungs" diff --git a/code/modules/surgery/organs/parasites.dm b/code/modules/surgery/organs/parasites.dm index 536ca7a4f37..f330df260eb 100644 --- a/code/modules/surgery/organs/parasites.dm +++ b/code/modules/surgery/organs/parasites.dm @@ -52,10 +52,11 @@ var/egg_progress = 0 // # of on_life() cycles completed, unlike cycle_num this is reset on each hatch event var/egg_progress_per_hatch = 90 // if egg_progress > this, chance to hatch and reset egg_progress var/eggs_hatched = 0 // num of hatch events completed - var/eggs_max = 3 // max possible spiderlings you can get from a single infection if its left to run for a very long time var/awaymission_checked = FALSE var/awaymission_infection = FALSE // TRUE if infection occurred inside gateway - var/list/types_basic = list(/mob/living/simple_animal/hostile/poison/terror_spider/red, /mob/living/simple_animal/hostile/poison/terror_spider/gray, /mob/living/simple_animal/hostile/poison/terror_spider/green) + var/list/types_basic = list(/mob/living/simple_animal/hostile/poison/terror_spider/red, /mob/living/simple_animal/hostile/poison/terror_spider/gray) + var/list/types_adv = list(/mob/living/simple_animal/hostile/poison/terror_spider/red, /mob/living/simple_animal/hostile/poison/terror_spider/gray, /mob/living/simple_animal/hostile/poison/terror_spider/green) + /obj/item/organ/internal/body_egg/terror_eggs/on_life() // Safety first. @@ -78,19 +79,11 @@ qdel(src) return - // Detect dying hosts, and try to keep them alive (so spiderlings can hatch) at the cost of some growth progress. - if(owner.health < -25) - to_chat(owner,"You feel a strange, blissful senstation.") - owner.adjustBruteLoss(-5) - owner.adjustFireLoss(-5) - owner.adjustToxLoss(-5) - egg_progress += 10 - // Once at least one egg has hatched from you, you'll need help to reach medbay. if(eggs_hatched >= 1) owner.Confused(2) - if(egg_progress > egg_progress_per_hatch && eggs_hatched < eggs_max) + if(egg_progress > egg_progress_per_hatch) egg_progress -= egg_progress_per_hatch hatch_egg() @@ -107,15 +100,22 @@ return extra_progress /obj/item/organ/internal/body_egg/terror_eggs/proc/hatch_egg() + var/infection_completed = FALSE var/obj/structure/spider/spiderling/terror_spiderling/S = new(get_turf(owner)) - if(eggs_hatched >= 2) // on the third egg... - S.grow_as = /mob/living/simple_animal/hostile/poison/terror_spider/princess - else - S.grow_as = pick(types_basic) + switch(eggs_hatched) + if(0) // First spiderling + S.grow_as = pick(types_basic) + if(1) // Second + S.grow_as = pick(types_adv) + if(2) // Last + S.grow_as = /mob/living/simple_animal/hostile/poison/terror_spider/princess + infection_completed = TRUE S.immediate_ventcrawl = TRUE eggs_hatched++ to_chat(owner, "A strange prickling sensation moves across your skin... then suddenly the whole world seems to spin around you!") owner.Paralyse(10) + if(infection_completed && !QDELETED(src)) + qdel(src) /obj/item/organ/internal/body_egg/terror_eggs/remove(var/mob/living/carbon/M, var/special = 0) ..() diff --git a/code/modules/surgery/organs/subtypes/drask.dm b/code/modules/surgery/organs/subtypes/drask.dm index 6e11cf2993e..e457c4cddaa 100644 --- a/code/modules/surgery/organs/subtypes/drask.dm +++ b/code/modules/surgery/organs/subtypes/drask.dm @@ -1,29 +1,29 @@ //DRASK ORGAN /obj/item/organ/internal/drask name = "drask organ" - icon = 'icons/obj/surgery_drask.dmi' + icon = 'icons/obj/species_organs/drask.dmi' icon_state = "innards" desc = "A greenish, slightly translucent organ. It is extremely cold." /obj/item/organ/internal/heart/drask name = "drask heart" - icon = 'icons/obj/surgery_drask.dmi' + icon = 'icons/obj/species_organs/drask.dmi' parent_organ = "head" /obj/item/organ/internal/liver/drask name = "metabolic strainer" - icon = 'icons/obj/surgery_drask.dmi' + icon = 'icons/obj/species_organs/drask.dmi' icon_state = "kidneys" alcohol_intensity = 0.8 /obj/item/organ/internal/brain/drask - icon = 'icons/obj/surgery_drask.dmi' + icon = 'icons/obj/species_organs/drask.dmi' icon_state = "brain2" - mmi_icon = 'icons/obj/surgery_drask.dmi' + mmi_icon = 'icons/obj/species_organs/drask.dmi' mmi_icon_state = "mmi_full" /obj/item/organ/internal/eyes/drask name = "drask eyeballs" - icon = 'icons/obj/surgery_drask.dmi' + icon = 'icons/obj/species_organs/drask.dmi' desc = "Drask eyes. They look even stranger disembodied" dark_view = 5 \ No newline at end of file diff --git a/code/modules/surgery/organs/subtypes/grey.dm b/code/modules/surgery/organs/subtypes/grey.dm index 177e4ae5be1..3e7598fa06f 100644 --- a/code/modules/surgery/organs/subtypes/grey.dm +++ b/code/modules/surgery/organs/subtypes/grey.dm @@ -1,9 +1,15 @@ /obj/item/organ/internal/liver/grey + name = "grey liver" + desc = "A small, odd looking liver" + icon = 'icons/obj/species_organs/grey.dmi' alcohol_intensity = 1.6 /obj/item/organ/internal/brain/grey - icon_state = "brain-x" - mmi_icon_state = "mmi_alien" + desc = "A large brain" + icon = 'icons/obj/species_organs/grey.dmi' + icon_state = "brain2" + mmi_icon = 'icons/obj/species_organs/grey.dmi' + mmi_icon_state = "mmi_full" /obj/item/organ/internal/brain/grey/insert(var/mob/living/carbon/M, var/special = 0) ..() @@ -15,4 +21,18 @@ /obj/item/organ/internal/eyes/grey name = "grey eyeballs" - dark_view = 5 \ No newline at end of file + desc = "They still look creepy and emotionless" + icon = 'icons/obj/species_organs/grey.dmi' + dark_view = 5 + +/obj/item/organ/internal/heart/grey + name = "grey heart" + icon = 'icons/obj/species_organs/grey.dmi' + +/obj/item/organ/internal/lungs/grey + name = "grey lungs" + icon = 'icons/obj/species_organs/grey.dmi' + +/obj/item/organ/internal/kidneys/grey + name = "grey kidneys" + icon = 'icons/obj/species_organs/grey.dmi' \ No newline at end of file diff --git a/code/modules/surgery/organs/subtypes/kidan.dm b/code/modules/surgery/organs/subtypes/kidan.dm index 72290fd624b..3778a7204cc 100644 --- a/code/modules/surgery/organs/subtypes/kidan.dm +++ b/code/modules/surgery/organs/subtypes/kidan.dm @@ -1,6 +1,9 @@ /obj/item/organ/internal/liver/kidan + name = "kidan liver" + icon = 'icons/obj/species_organs/kidan.dmi' alcohol_intensity = 0.5 + #define KIDAN_LANTERN_HUNGERCOST 0.5 #define KIDAN_LANTERN_MINHUNGER 150 #define KIDAN_LANTERN_LIGHT 5 @@ -8,6 +11,7 @@ /obj/item/organ/internal/lantern name = "Bioluminescent Lantern" desc = "A specialized tissue that reacts with oxygen, nutriment and blood to produce light in Kidan." + icon = 'icons/obj/species_organs/kidan.dmi' icon_state = "kid_lantern" origin_tech = "biotech=2" w_class = WEIGHT_CLASS_TINY @@ -107,6 +111,28 @@ . = ..() +/obj/item/organ/internal/eyes/kidan + name = "kidan eyeballs" + icon = 'icons/obj/species_organs/kidan.dmi' + +/obj/item/organ/internal/heart/kidan + name = "kidan heart" + icon = 'icons/obj/species_organs/kidan.dmi' + +/obj/item/organ/internal/brain/kidan + icon = 'icons/obj/species_organs/kidan.dmi' + icon_state = "brain2" + mmi_icon = 'icons/obj/species_organs/kidan.dmi' + mmi_icon_state = "mmi_full" + +/obj/item/organ/internal/lungs/kidan + name = "kidan lungs" + icon = 'icons/obj/species_organs/kidan.dmi' + +/obj/item/organ/internal/kidneys/kidan + name = "kidan kidneys" + icon = 'icons/obj/species_organs/kidan.dmi' + #undef KIDAN_LANTERN_HUNGERCOST #undef KIDAN_LANTERN_MINHUNGER #undef KIDAN_LANTERN_LIGHT \ No newline at end of file diff --git a/code/modules/surgery/organs/subtypes/plasmaman.dm b/code/modules/surgery/organs/subtypes/plasmaman.dm new file mode 100644 index 00000000000..3fd59189fb0 --- /dev/null +++ b/code/modules/surgery/organs/subtypes/plasmaman.dm @@ -0,0 +1,21 @@ +/obj/item/organ/internal/liver/plasmaman + name = "plasmaman liver" + icon = 'icons/obj/species_organs/plasmaman.dmi' + +/obj/item/organ/internal/eyes/plasmaman + name = "plasmaman eyeballs" + icon = 'icons/obj/species_organs/plasmaman.dmi' + +/obj/item/organ/internal/heart/plasmaman + name = "plasmaman heart" + icon = 'icons/obj/species_organs/plasmaman.dmi' + +/obj/item/organ/internal/brain/plasmaman + icon = 'icons/obj/species_organs/plasmaman.dmi' + icon_state = "brain2" + mmi_icon = 'icons/obj/species_organs/plasmaman.dmi' + mmi_icon_state = "mmi_full" + +/obj/item/organ/internal/kidneys/plasmaman + name = "plasmaman kidneys" + icon = 'icons/obj/species_organs/plasmaman.dmi' \ No newline at end of file diff --git a/code/modules/surgery/organs/subtypes/skrell.dm b/code/modules/surgery/organs/subtypes/skrell.dm index 20eae88139c..0443fa4f49f 100644 --- a/code/modules/surgery/organs/subtypes/skrell.dm +++ b/code/modules/surgery/organs/subtypes/skrell.dm @@ -1,9 +1,12 @@ /obj/item/organ/internal/liver/skrell + name = "skrell liver" + icon = 'icons/obj/species_organs/skrell.dmi' alcohol_intensity = 4 /obj/item/organ/internal/headpocket name = "headpocket" desc = "Allows Skrell to hide tiny objects within their head tentacles." + icon = 'icons/obj/species_organs/skrell.dmi' icon_state = "skrell_headpocket" origin_tech = "biotech=2" w_class = WEIGHT_CLASS_TINY @@ -59,3 +62,28 @@ /obj/item/organ/internal/headpocket/hear_message(mob/living/M as mob, msg) pocket.hear_message(M, msg) ..() + +/obj/item/organ/internal/heart/skrell + name = "skrell heart" + desc = "A stream lined heart" + icon = 'icons/obj/species_organs/skrell.dmi' + +/obj/item/organ/internal/brain/skrell + icon = 'icons/obj/species_organs/skrell.dmi' + desc = "A brain with a odd division in the middle." + icon_state = "brain2" + mmi_icon = 'icons/obj/species_organs/skrell.dmi' + mmi_icon_state = "mmi_full" + +/obj/item/organ/internal/lungs/skrell + name = "skrell lungs" + icon = 'icons/obj/species_organs/skrell.dmi' + +/obj/item/organ/internal/kidneys/skrell + name = "skrell kidneys" + icon = 'icons/obj/species_organs/skrell.dmi' + desc = "The smallest kidneys you have ever seen, it probably doesn't even work." + +/obj/item/organ/internal/eyes/skrell + name = "skrell eyeballs" + icon = 'icons/obj/species_organs/skrell.dmi' \ No newline at end of file diff --git a/code/modules/surgery/organs/subtypes/tajaran.dm b/code/modules/surgery/organs/subtypes/tajaran.dm index 1857fc5e45a..d6202a377e6 100644 --- a/code/modules/surgery/organs/subtypes/tajaran.dm +++ b/code/modules/surgery/organs/subtypes/tajaran.dm @@ -1,7 +1,10 @@ /obj/item/organ/internal/liver/tajaran + name = "tajaran liver" + icon = 'icons/obj/species_organs/tajaran.dmi' alcohol_intensity = 1.4 /obj/item/organ/internal/eyes/tajaran + icon = 'icons/obj/species_organs/tajaran.dmi' name = "tajaran eyeballs" colourblind_matrix = MATRIX_TAJ_CBLIND //The colour matrix and darksight parameters that the mob will recieve when they get the disability. replace_colours = LIST_TAJ_REPLACE @@ -12,3 +15,21 @@ colourmatrix = MATRIX_TAJ_CBLIND dark_view = 8 replace_colours = LIST_TAJ_REPLACE + +/obj/item/organ/internal/heart/tajaran + name = "tajaran heart" + icon = 'icons/obj/species_organs/tajaran.dmi' + +/obj/item/organ/internal/brain/tajaran + icon = 'icons/obj/species_organs/tajaran.dmi' + icon_state = "brain2" + mmi_icon = 'icons/obj/species_organs/tajaran.dmi' + mmi_icon_state = "mmi_full" + +/obj/item/organ/internal/lungs/tajaran + name = "tajaran lungs" + icon = 'icons/obj/species_organs/tajaran.dmi' + +/obj/item/organ/internal/kidneys/tajaran + name = "tajaran kidneys" + icon = 'icons/obj/species_organs/tajaran.dmi' \ No newline at end of file diff --git a/code/modules/surgery/organs/subtypes/unathi.dm b/code/modules/surgery/organs/subtypes/unathi.dm index 219ef0447e6..26ad86d4700 100644 --- a/code/modules/surgery/organs/subtypes/unathi.dm +++ b/code/modules/surgery/organs/subtypes/unathi.dm @@ -1,6 +1,30 @@ /obj/item/organ/internal/liver/unathi + name = "unathi liver" + icon = 'icons/obj/species_organs/unathi.dmi' + desc = "A large looking liver" alcohol_intensity = 0.8 /obj/item/organ/internal/eyes/unathi name = "unathi eyeballs" - dark_view = 3 \ No newline at end of file + icon = 'icons/obj/species_organs/unathi.dmi' + dark_view = 3 + +/obj/item/organ/internal/heart/unathi + name = "unathi heart" + desc = "A large looking heart" + icon = 'icons/obj/species_organs/unathi.dmi' + +/obj/item/organ/internal/brain/unathi + icon = 'icons/obj/species_organs/unathi.dmi' + desc = "A smallish looking brain." + icon_state = "brain2" + mmi_icon = 'icons/obj/species_organs/unathi.dmi' + mmi_icon_state = "mmi_full" + +/obj/item/organ/internal/lungs/unathi + name = "unathi lungs" + icon = 'icons/obj/species_organs/unathi.dmi' + +/obj/item/organ/internal/kidneys/unathi + name = "unathi kidneys" + icon = 'icons/obj/species_organs/unathi.dmi' \ No newline at end of file diff --git a/code/modules/surgery/organs/subtypes/vox.dm b/code/modules/surgery/organs/subtypes/vox.dm index 8af6f8bf740..e71393b964d 100644 --- a/code/modules/surgery/organs/subtypes/vox.dm +++ b/code/modules/surgery/organs/subtypes/vox.dm @@ -1,9 +1,12 @@ /obj/item/organ/internal/liver/vox + name = "vox liver" + icon = 'icons/obj/species_organs/vox.dmi' alcohol_intensity = 1.6 /obj/item/organ/internal/stack name = "cortical stack" + icon = 'icons/obj/species_organs/vox.dmi' icon_state = "cortical-stack" parent_organ = "head" organ_tag = "stack" @@ -29,4 +32,23 @@ owner.AdjustConfused(4) if(!stackdamaged) stackdamaged = TRUE - ..() \ No newline at end of file + ..() + +/obj/item/organ/internal/eyes/vox + name = "vox eyeballs" + icon = 'icons/obj/species_organs/vox.dmi' + +/obj/item/organ/internal/heart/vox + name = "vox heart" + icon = 'icons/obj/species_organs/vox.dmi' + +/obj/item/organ/internal/brain/vox + icon = 'icons/obj/species_organs/vox.dmi' + desc = "A brain with spikes on top of it. It has some odd metallic slot with wires on the side." + icon_state = "brain2" + mmi_icon = 'icons/obj/species_organs/vox.dmi' + mmi_icon_state = "mmi_full" + +/obj/item/organ/internal/kidneys/vox + name = "vox kidneys" + icon = 'icons/obj/species_organs/vox.dmi' \ No newline at end of file diff --git a/code/modules/surgery/organs/subtypes/vulpkanin.dm b/code/modules/surgery/organs/subtypes/vulpkanin.dm index 959fbcc926c..2c583c8f84a 100644 --- a/code/modules/surgery/organs/subtypes/vulpkanin.dm +++ b/code/modules/surgery/organs/subtypes/vulpkanin.dm @@ -1,8 +1,11 @@ /obj/item/organ/internal/liver/vulpkanin + name = "vulpkanin liver" + icon = 'icons/obj/species_organs/vulpkanin.dmi' alcohol_intensity = 1.4 /obj/item/organ/internal/eyes/vulpkanin name = "vulpkanin eyeballs" + icon = 'icons/obj/species_organs/vulpkanin.dmi' colourblind_matrix = MATRIX_VULP_CBLIND //The colour matrix and darksight parameters that the mob will recieve when they get the disability. replace_colours = LIST_VULP_REPLACE dark_view = 8 @@ -11,4 +14,22 @@ name = "wolpin eyeballs" colourmatrix = MATRIX_VULP_CBLIND dark_view = 8 - replace_colours = LIST_VULP_REPLACE \ No newline at end of file + replace_colours = LIST_VULP_REPLACE + +/obj/item/organ/internal/heart/vulpkanin + name = "vulpkanin heart" + icon = 'icons/obj/species_organs/vulpkanin.dmi' + +/obj/item/organ/internal/brain/vulpkanin + icon = 'icons/obj/species_organs/vulpkanin.dmi' + icon_state = "brain2" + mmi_icon = 'icons/obj/species_organs/vulpkanin.dmi' + mmi_icon_state = "mmi_full" + +/obj/item/organ/internal/lungs/vulpkanin + name = "vulpkanin lungs" + icon = 'icons/obj/species_organs/vulpkanin.dmi' + +/obj/item/organ/internal/kidneys/vulpkanin + name = "vulpkanin kidneys" + icon = 'icons/obj/species_organs/vulpkanin.dmi' \ No newline at end of file diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm index 53691dd0264..46e4ee0c18b 100644 --- a/code/modules/surgery/tools.dm +++ b/code/modules/surgery/tools.dm @@ -57,10 +57,10 @@ origin_tech = "materials=1;biotech=1" attack_verb = list("drilled") - suicide_act(mob/user) - to_chat(viewers(user), pick("[user] is pressing [src] to [user.p_their()] temple and activating it! It looks like [user.p_theyre()] trying to commit suicide.", - "[user] is pressing [src] to [user.p_their()] chest and activating it! It looks like [user.p_theyre()] trying to commit suicide.")) - return (BRUTELOSS) +/obj/item/surgicaldrill/suicide_act(mob/user) + to_chat(viewers(user), pick("[user] is pressing [src] to [user.p_their()] temple and activating it! It looks like [user.p_theyre()] trying to commit suicide.", + "[user] is pressing [src] to [user.p_their()] chest and activating it! It looks like [user.p_theyre()] trying to commit suicide.")) + return BRUTELOSS /obj/item/surgicaldrill/augment desc = "Effectively a small power drill contained within your arm, edges dulled to prevent tissue damage. May or may not pierce the heavens." @@ -87,11 +87,11 @@ attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") hitsound = 'sound/weapons/bladeslice.ogg' - suicide_act(mob/user) - to_chat(viewers(user), pick("[user] is slitting [user.p_their()] wrists with [src]! It looks like [user.p_theyre()] trying to commit suicide.", - "[user] is slitting [user.p_their()] throat with [src]! It looks like [user.p_theyre()] trying to commit suicide.", - "[user] is slitting [user.p_their()] stomach open with [src]! It looks like [user.p_theyre()] trying to commit seppuku.")) - return (BRUTELOSS) +/obj/item/scalpel/suicide_act(mob/user) + to_chat(viewers(user), pick("[user] is slitting [user.p_their()] wrists with [src]! It looks like [user.p_theyre()] trying to commit suicide.", + "[user] is slitting [user.p_their()] throat with [src]! It looks like [user.p_theyre()] trying to commit suicide.", + "[user] is slitting [user.p_their()] stomach open with [src]! It looks like [user.p_theyre()] trying to commit seppuku.")) + return BRUTELOSS /obj/item/scalpel/augment diff --git a/config/example/config.txt b/config/example/config.txt index ae6f9fefaa7..d93809c32cd 100644 --- a/config/example/config.txt +++ b/config/example/config.txt @@ -7,6 +7,9 @@ ADMIN_LEGACY_SYSTEM ## Add a # infront of this if you want to use the SQL based banning system. The legacy systems use the files in the data folder. You need to set up your database to use the SQL based system. BAN_LEGACY_SYSTEM +## Add a # infront of this to unlimit the builds used to play. Advised is to keep it atleast 1421 due to the middle mouse button locking exploit +MINIMUM_CLIENT_BUILD 1421 + ## Add a # here if you wish to use the setup where jobs have more access. This is intended for servers with low populations - where there are not enough players to fill all roles, so players need to do more than just one job. Also for servers where they don't want people to hide in their own departments. JOBS_HAVE_MINIMAL_ACCESS @@ -321,10 +324,10 @@ PLAYER_REROUTE_CAP 0 #DISABLE_SPACE_RUINS ## Minimum number of space ruins levels to generate -EXTRA_SPACE_RUINS_LEVELS_MIN 2 +EXTRA_SPACE_RUIN_LEVELS_MIN 2 ## Maximum number of space ruins levels to generate -EXTRA_SPACE_RUINS_LEVELS_MAX 4 +EXTRA_SPACE_RUIN_LEVELS_MAX 4 ## Uncomment to disable the OOC/LOOC channel by default. #DISABLE_OOC @@ -396,4 +399,7 @@ DISABLE_HIGH_POP_MC_MODE_AMOUNT 60 ##DEVELOPER_EXPRESS_START ## Uncomment to disable automatic admin for localhost -#DISABLE_LOCALHOST_ADMIN \ No newline at end of file +#DISABLE_LOCALHOST_ADMIN + +## Uncomment to give a confirmation before hitting start now +#START_NOW_CONFIRMATION \ No newline at end of file diff --git a/config/example/game_options.txt b/config/example/game_options.txt index 8a477dd6610..f934ba87b2b 100644 --- a/config/example/game_options.txt +++ b/config/example/game_options.txt @@ -1,10 +1,4 @@ ### HEALTH ### -## level of health at which a mob becomes unconscious (crit) -HEALTH_THRESHOLD_CRIT -50 - -## level of health at which a mob becomes dead -HEALTH_THRESHOLD_DEAD -100 - ## Determines whether bones can be broken through excessive damage to the organ ## 0 means bones can't break, 1 means they can BONES_CAN_BREAK 1 diff --git a/html/changelog.html b/html/changelog.html index eeae1c1713d..d0fd0d59767 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,457 @@ -->
+

07 April 2019

+

Fox McCloud updated:

+
    +
  • Fixes Russian revolvers triggering no matter where you clicked
  • +
+

Kyep updated:

+
    +
  • Ghosting while alive, conscious, and a member of the crew will now result in your body being moved to cryo after 5 minutes, assuming your body isn't killed or restrained in any way in the meantime.
  • +
  • An AI that ghosts while alive gets a dismissable hint that they might consider using OOC -> Wipe Core instead.
  • +
  • Ghosting out of your body while you are alive, and an antag, will result in admins being informed, so that they may replace you as an antag if needed.
  • +
+ +

06 April 2019

+

Fox McCloud updated:

+
    +
  • Fixes people popping out of cloning taking tons of damage
  • +
  • Fixes Teslium recipe
  • +
  • Fixes some reagents not causing status updates
  • +
+

Twinmold updated:

+
    +
  • No longer costs toner to send a fax to Central Command
  • +
+

dovydas12345 updated:

+
    +
  • Fixed diamond statue names and description.
  • +
+

farie82 updated:

+
    +
  • Sec huds work again. No longer does the perp need glasses to be set to arrest. Cool does not equal arrest now
  • +
+ +

04 April 2019

+

Kyep updated:

+
    +
  • Improved the interface for Syndicate Uplinks. They now clearly mark which items are hijack-only and which are not. If you attempt to purchase a hijack-only item without hijack, they will explain why you can't.
  • +
  • Atmos Gas Grenades (the uplink grenade kit) are now split into Knockout grenades (2 N2O grenades, 8 TC, available to all agents), and Plasma Fire grenades (2 plasma fire grenades, 12 TC, only available if you have hijack). This both makes knockout grenades more useful for normal traitors, and also prevents non-hijackers using a plasma fire grenade to cause massive casualties/damage.
  • +
  • Plasma Grenades and the Syndicate Bomb can no longer show up in surplus crates, or be discounted. This means while you can buy one if you intend to, you're not randomly encouraged to bomb your target.
  • +
+ +

03 April 2019

+

Fox McCloud updated:

+
    +
  • Dramatically improves human life performance (sorry, doesn't fix your actual crappy real life)
  • +
  • Blobspores will additionally zomify all players who have 200 damage or more
  • +
  • Holoparasites will additionally die once their host has 200 damage or more
  • +
  • Fixes blob zombies who infect players who have no head being invisible
  • +
+

farie82 updated:

+
    +
  • Death nettle can be picked up again
  • +
  • Auto cloning now doesn't clone a person more than once.
  • +
  • A person in the cloning scanner won't be scanned if he's already being cloned
  • +
+ +

02 April 2019

+

Alonefromhell & AffectedArc07 updated:

+
    +
  • Fixed an edgecase compile error for spacehotel.dmm
  • +
+

Arkatos updated:

+
    +
  • Added Medical Beamgun to a Syndicate Medical Cyborg
  • +
  • Appropriate antagonist sound theme now plays when an antagonist is selected via Traitor Panel
  • +
  • Cult sound theme now plays for a new cult converts
  • +
  • Traitor/Malfunction sound theme now plays for newly autotraitored crew/AI
  • +
+

AzuleUtama updated:

+
    +
  • Cleaned up some outdated code left in uplinks.dm
  • +
+

Fox McCloud updated:

+
    +
  • Fixes some mobs not being able to hear sounds
  • +
  • Fixes the Master Controller not actually shutting down on round end
  • +
  • Adds space ants to the game; leave your food on tables or inside a container to avoid infestation!
  • +
  • Fixes bees not properly generating if they have a reagent in them
  • +
  • Can break bee boxes
  • +
  • Fixes bees breaking things they shouldn't
  • +
  • Fixes bees not properly injecting toxin if they lacked a reagent
  • +
  • purchased bee boxes are no longer wrenched down by default
  • +
  • Adds trick revolver to the syndicate uplink for the clown. Teach those pesky validhunters a lesson!
  • +
  • Adds the ability for admins to start a revolver only summon gun version; there's also a suicidal version that makes half the guns summoned real and the other half trick revolvers
  • +
  • stabilizing agent gets used up in reactions that utilize it
  • +
  • flashbangs spark when they initially go off
  • +
  • Fixes mech users being stunned by their own flashbangs
  • +
  • Fixes necromantic stone not working properly and other edge cases where you had O2 damage and could become O2 damage immune
  • +
+

KasparoVy updated:

+
    +
  • Adds Vox-fitted Tajaran veil sprites.
  • +
  • Removed stray pixel from Vox-fitted gasmask sprites.
  • +
  • Adjusts the Vox-fitted blindfold sprite.
  • +
+

Kyep updated:

+
    +
  • Blob mobs can definitely no longer be spawned in xenobio.
  • +
  • Changed playtime requirements for command jobs. HoS/RD/CE/CMO/AI now require 5h played in their department to be playable. HoP/Captain now require 5h played as a member of the command staff.
  • +
+

Markolie updated:

+
    +
  • Fixed some issues the compiler doesn't spot and some start up issues.
  • +
+

Ty-Omaha updated:

+
    +
  • Start now confirmation is now a config option
  • +
  • Grid check event sound effect
  • +
+

farie82 updated:

+
    +
  • Antidrop give edge case fixed
  • +
  • Can't give items to resting people now
  • +
  • put_in_hands now checks if you actually have hands
  • +
  • Wrapping lockers and crates now takes 1.5 seconds to do
  • +
  • Welding lockers now takes 1.5 seconds to do
  • +
+ +

01 April 2019

+

Arkatos updated:

+
    +
  • New Blob UI buttons for Storage Blob and Split consciousness abilities
  • +
  • New custom icons for Storage Blob and Split consciousness abilities
  • +
  • Added Node Requirement verb to the Blob. This verb, which is activated by default, enforces that resource and factory blob structures are built in a close proximity of the core/node in order to properly function. Players can disable it anytime in the Blob tab.
  • +
  • Remove Blob verb now has a new feature - partial refund for special Blob structures. When Blob Overmind removes special blob structure (such as a factory or node), it will receive 30% of the structure cost back as a refund.
  • +
  • Blob Overminds now show in Check Antagonists admin verb
  • +
  • Blob Mobs now use complementary colors of the Blob Overmind reagent as their own color
  • +
  • Removed Dark Matter from a list of possible Blob reagents
  • +
+

Fox McCloud updated:

+
    +
  • Fixes syndicate medborgs and regular medborgs not having handheld defibs
  • +
  • Fixes multi-tile airlocks breaking and not leaving behind an assembly
  • +
  • Updates the Timer SS
  • +
  • Roundstart ChemMasters are now constructable/deconstructable
  • +
  • Can upgrade ChemMasters. Larger beakers mean a larger reservoir
  • +
  • Mobs that are gibbed with strange reagent and GBS have a bit more of a dramatic flare to them with violent convulsions before exploding into tiny bits
  • +
+

Ty-Omaha updated:

+
    +
  • Modified alert sounds for Code Gamma and Code Epsilon.
  • +
+

dovydas12345 updated:

+
    +
  • Fixes AI's toggle floor bolts ability
  • +
+

farie82 updated:

+
    +
  • Bluespace golems no longer can crash the server
  • +
  • Spontaneous combustion now has a minimum stacksize of 1. No more getting wet from the fire virus
  • +
+ +

30 March 2019

+

Fox McCloud updated:

+
    +
  • Fixes a runtime involving decapitation
  • +
  • playing sounds performs better
  • +
+

Ty-Omaha updated:

+
    +
  • Removes SSD sleep bubbles from ghosts
  • +
+ +

29 March 2019

+

Arkatos updated:

+
    +
  • Fixes #11087 - Swarmers are now locked to their default action intent
  • +
  • Swarmers are now able to open airlocks and windoors (access restrictions still apply)
  • +
  • Added new Wizard item - Bottle of Ooze! This powerful item awakens all-consuming Morph, ready to eat everyone and everything on the station! Be careful though, as Morph diet also includes Wizards.. Costs 1 point in the spellbook.
  • +
  • Added custom icon for Bottle of Ooze
  • +
  • Morph introduction is now properly formatted
  • +
  • Added new Blob UI and icons, ported from /tg/station13
  • +
  • Added new *Blob Help* verb, designated to help out new players playing as Blob
  • +
  • Added descriptions for each Blob reagent
  • +
  • Added complementary colors for each Blob reagent
  • +
  • Blob marker now uses complementary color of Blob reagent as it's own color
  • +
  • Blob shortcuts updated. Blob shortcuts are now: Click = Expand Blob | CTRL Click = Create Shield Blob | Middle Mouse Click = Rally Spores | Alt Click = Remove Blob
  • +
+

Fox McCloud updated:

+
    +
  • Crit has been dramatically overhauled. Treating patients now requires a broader range of medicine. Recommend checking out a guide for how to treat using the new system!
  • +
  • Medical vendors now have styptic and silver sulfadiazine, saline, atropine, mannitol, mutadone, calomel, diphenhydramine, oculine, insulin, morphine, and potassium iodide for helping treat new patients. Amount of Gauze, Advanced Trauma, and Burn packs has also been increased.
  • +
  • Adds new handheld defibs. Utilize these for treating patients with cardiac arrest. Note: these do not revive people from the dead!
  • +
  • Doctors lockers now have a handheld defib in addition to a regular defib.
  • +
  • Medical borgs now have a handheld defib
  • +
  • CPR dramatically buffed. Heavily lowers O2 damage and resets losebreath to 0
  • +
  • Cryoxadone tuned down a little
  • +
  • Health analyzer UI altered ever so slightly for cardiac arerest, so it's easier to find
  • +
  • Added bacon grease reagent to traitor poison bottles; induces immediate cardiac failure
  • +
  • Upgraded Robotic Hearts now attempt to correct both cardiac failure and cardiac arrest tweak; Upgraded Robotic Hearts now do not punish you quite as severely for receiving a shock while having one (EMPs will still destroy you though)
  • +
  • Corazone recipe removed
  • +
  • hotspot sprites updated; fire will also now appear over top of things, rather than underneath it
  • +
  • Roundstart chem dispensers are now construcable/deconstrucable and can be moved
  • +
  • Energy ratio for chem dispensers increased by x10 (how many reagents you can dispense before running out and how quickly it recharges is all the same, however)
  • +
  • Adds the ability to add a single unit of reagent in the chem dispenser
  • +
  • Adds the ability to isolate reagents in the chem dispenser
  • +
  • Portable chem dispenser removed (the circuit board for them now makes full dispensers)
  • +
  • Fixes some suicides dealing damage and gibbing you at the same time
  • +
  • Allows you to suicide with more object types. Currently the only new object type you can suicide with is the gibber
  • +
+

Kyep updated:

+
    +
  • Blob mobs can no longer be spawned in xenobio.
  • +
  • Blob mobs spawned by blob cores can no longer have sentience potions used on them, which would allow whoever controls them to kill the blob with no countermeasure.
  • +
+

Mitchs98 updated:

+
    +
  • Adds in Shrimp & Fish Skewers as well as Cheeseburgers. Shrimp Skewer(Grill): 4 Shrimp(uncooked) + 1 Metal Rod, Fish Skewer(Grill): 2 Salmon Meat + Metal Rod + 10u Flour, Cheese Burger(Microwave): Burger + Cheese Wedge.
  • +
+

farie82 updated:

+
    +
  • Borgs can now only cuff people with two hands. Just like humanoids
  • +
  • You can cuff people with at least one hand now
  • +
+

ingles98 updated:

+
    +
  • Plasma Golems will now report their suicide acts to the Admins.
  • +
+ +

25 March 2019

+

Fox McCloud updated:

+
    +
  • Fixes some reagent performance edges cases
  • +
  • Fixes chem smoke lagging under some circumstances
  • +
  • Fixes smoke not wanting to garbage collect
  • +
  • Fixes flares not returning a qdel hint
  • +
  • Fixes hotspots being slow to ignite turfs around them
  • +
  • Fixes LINDA not conducting temperature through things.
  • +
+

Mitchs98 updated:

+
    +
  • Chitinous Mass is no longer weaponized lag if examined.
  • +
+

farie82 updated:

+
    +
  • Diona nymphs are grabbable and punchable again
  • +
+ +

24 March 2019

+

AffectedArc07 updated:

+
    +
  • Preferences are now in alphabetical order
  • +
+

AzuleUtama updated:

+
    +
  • Added Syndicate MMI for Roboticist Traitors, priced at 2TC. balance: Removed Syndicate MMI from the traitor surgery duffelbag. Price reduced to 2TC.
  • +
+

EmanTheAlmighty updated:

+
    +
  • Can no longer offer Gateway Terror Spiders sentience potions. ( They literally exploded if you did, and that could have been used to effortlessly clear out hordes of them. )
  • +
  • Using the Shadowling ability "Hatch" as a monkey will change your HUD to be the human one.
  • +
  • It is now possible to put a collar on any animal that has gained sentience.
  • +
+

Fox McCloud updated:

+
    +
  • Pills maximum size increased from 50 to 100
  • +
  • Chem Master bottle size increased from 30 to 50
  • +
  • Pill bottles can now hold 50 pills instead of 14
  • +
  • Pill bottles can no longer hold patches
  • +
  • Adds Patch Boxes, which can hold patches, but not pills
  • +
  • Can now use a pill bottle or patch box on someone to apply a pill/patch from the bottle/box to a mob. Usual delays will still apply
  • +
  • Can down an entire pill bottle at once!
  • +
  • Cryostylane and pyrosium reactions now consume 2 of themselves when exposed to oxygen
  • +
  • fires, temperature, and hotspots can heat anything that contains reagents
  • +
  • Having hot/cold chemicals dumped on you or ingesting them will hurt you. Wear a mask or hat to protect from having someone dump the hot/cold things on you.
  • +
  • Chem Heater temperature adjustment tweaked; can no longer set temperature on empty containers.
  • +
  • Chem Heater generally heats faster, but cannot be upgraded
  • +
  • Chem Heater automatically stops around target temperature
  • +
  • Adjusts fire stacks and how they're applied with a few chems. Naplam, Phlogiston, fuel, thermite, and a few others have all received changes. Most direct fire damage removed.
  • +
  • Adds phlogiston dust; a safer, cooler burning Phlogiston.
  • +
  • Water and Firefighting foam will no longer automagically put out mob based fires; they'll reduce fire stacks (when fire stacks hit 0 they put the mob out)
  • +
  • cryostylane puts out mobs instantly
  • +
  • Heating fuel can set it off. Be careful when heating it now
  • +
  • Increased welding fuel tank size from 1000 to 4000 (wall mounted are still 1000)
  • +
  • Sorium and Dark matter now actually throw things
  • +
  • Thermite now gets applied to turfs. You'll have to heat the turf up to ignite it. Anything that can heat can now ignite thermite on walls
  • +
  • Adds fake hotspots. They don't do anything except set you on fire when you cross into them. Chemistry's pyrotechnics use these, for the most part; anything that causes a fireball that's chemistry related uses these
  • +
  • Sorium and Liquid dark matter now have visual effects
  • +
  • Fixes chem smoke being on the wrong layer.
  • +
  • Adds in unidentified tank filled with an unknown experimental gas in deep space. Find it and experiment!
  • +
+

Tails2091 updated:

+
    +
  • New emotes to Cats and Corgis.
  • +
  • Change directories for some creature sounds to be in the creature sound folder.
  • +
  • Two bark sounds, a yelp, and a meow.
  • +
+

farie82 updated:

+
    +
  • Holo firedoors now update atmos correctly after being destroyed
  • +
  • Inflatable walls/doors now update atmos correctly after being destroyed
  • +
  • Alien resin walls now update atmos correctly after being destroyed
  • +
  • Foamed metal walls now update atmos correctly after being destroyed
  • +
  • Pod doors (shouldn't ever happen) now update atmos correctly after being destroyed
  • +
  • Mining flaps now update atmos correctly after being destroyed
  • +
+ +

23 March 2019

+

Arkatos updated:

+
    +
  • Players who enable AntagHUD are now unable to join the round as swarmers
  • +
  • Adds a message explaining why Antag-banned players cannot join the round as cortical borer
  • +
+

Calecute updated:

+
    +
  • South Prison camera now belongs to Prison camera network, thus showind in Prison camera monitor
  • +
+

Kyep updated:

+
    +
  • Admins offering control of a mob with no real_name to ghosts will no longer cause a "Do you want to play as ?" popup. Instead, the ? will be replaced with a descriptive string, such as "the blobbernaut".
  • +
+

Tails2091 updated:

+
    +
  • Lockboxes actually close when locked now.
  • +
+

farie82 updated:

+
    +
  • When disarming a bomb from a guardian you now don't pickup an empty object.
  • +
  • no more organ: spam sorry admins
  • +
+ +

22 March 2019

+

Arkatos updated:

+
    +
  • Updated Tarot Deck description in Wizard's spellbook, credits to /tg/station13
  • +
+

Fox McCloud updated:

+
    +
  • Smoke now has much better sprites and has a new area of denial behavior
  • +
+

Mitchs98 updated:

+
    +
  • Fixed Dionae names so "Embrace of Starsong (as Embrace Of Starsong)" will no longer happen when renaming ID's at a ID Console.
  • +
+

Quantum-M updated:

+
    +
  • Vox Cargo Crate - Contains two vox tanks and two vox masks. Costs 50 cargo points.
  • +
  • Plasmaman Cargo Crate - Contains a Orange plasmaman space suit and helmet, along with a breathing mask and a emergency plasmaman tank. Costs 75 cargo points and requires EVA access.
  • +
+ +

20 March 2019

+

Dave-TH updated:

+
    +
  • Krav Maga gloves can no longer steal the unstealable.
  • +
+

farie82 updated:

+
    +
  • Fixed the middle mousebutton locking exploit
  • +
+ +

17 March 2019

+

AffectedArc07 and Alonefromhell updated:

+
    +
  • Cell management consoles: See the status of all brig cells without having to leave your office
  • +
  • New screen sprite for cell management console
  • +
+

Jazz23 updated:

+
    +
  • Xenobio hotkeys, slime potion thing, remote slime scanner, monkey recycler linking.
  • +
+

Kyep updated:

+
    +
  • It is no longer possible to crawl into a vent while you are simultaneously buckled to a chair or other solid object.
  • +
+

farie82 updated:

+
    +
  • Adds a confirmation to the start now verb. Make it ansari proof
  • +
  • The invisible bumping into something should be fixed now
  • +
  • Fixes the atmos bug
  • +
+ +

16 March 2019

+

Ty-Omaha and Ionward updated:

+
    +
  • Carbon humans (people, not animals) who go SSD will now get ZZZ bubbles to indicate they are SSD
  • +
+ +

15 March 2019

+

Arkatos updated:

+
    +
  • Fixes #10987 - Guardians can now see the action intent they are on
  • +
  • Added custom action intent icons for Guardians
  • +
+

Couls updated:

+
    +
  • Added a new line to the defib examine text
  • +
+ +

14 March 2019

+

Couls updated:

+
    +
  • tweaked shesi's fluff sprite
  • +
+

Quantum-M updated:

+
    +
  • Changes the stamp sprites.
  • +
  • Add new sprites for the infernal and employment contracts.
  • +
  • Different organ sprites for each species
  • +
  • Different MMI sprites based on different species brains.
  • +
+ +

13 March 2019

+

Couls updated:

+
    +
  • universal translate no longer makes emotes over comms impossible
  • +
  • fixed a few typos with simple mobs
  • +
+ +

12 March 2019

+

Arkatos updated:

+
    +
  • Fixes #10261 - Pure Vampires in Traitor+Vampire gamemode will now properly show in AntagHUD
  • +
  • Fixes #9494 - Pure Changelings in Traitor+Changeling gamemode will now properly show in AntagHUD
  • +
+ +

11 March 2019

+

Couls updated:

+
    +
  • Display if karma gains are enabled or not on round start(instead of just disabled)
  • +
  • Fix wrong message when toggling karma
  • +
+

rb303 updated:

+
    +
  • Fluff scarf for Rb303
  • +
+ +

10 March 2019

+

AffectedArc07 updated:

+
    +
  • You will now automatically be given admin rights if you connect to your local server
  • +
  • Mapmerge has been replaced with mapmerge2
  • +
  • Maps are now the TGM format. This means nothing for people who do not make map edits
  • +
  • Discord-related verbs are now under "Special Verbs" instead of "OOC"
  • +
+

Couls updated:

+
    +
  • Toggle karma button in special verbs
  • +
+

Kyep updated:

+
    +
  • Admins can now flag characters as having an event role, which makes them show up when admins look at the antag list, in admin attack logs, on antaghuds, and on the end-round score screen.
  • +
+

Tails2091 updated:

+
    +
  • Added missing simple_animal emote help text.
  • +
+

TheMadTrickster updated:

+
    +
  • added new fixed nice sprites
  • +
  • trashed old ugly buggy sprites
  • +
+

08 March 2019

AzuleUtama updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 7c1992386ec..d6bd92e8040 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -9321,3 +9321,392 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. Jazz23: - tweak: Golems loose their shell when they switch species - rscadd: Mousedrop applies slime speed/chill potions. +2019-03-10: + AffectedArc07: + - rscadd: You will now automatically be given admin rights if you connect to your + local server + - tweak: Mapmerge has been replaced with mapmerge2 + - tweak: Maps are now the TGM format. This means nothing for people who do not make + map edits + - tweak: Discord-related verbs are now under "Special Verbs" instead of "OOC" + Couls: + - rscadd: Toggle karma button in special verbs + Kyep: + - rscadd: Admins can now flag characters as having an event role, which makes them + show up when admins look at the antag list, in admin attack logs, on antaghuds, + and on the end-round score screen. + Tails2091: + - rscadd: Added missing simple_animal emote help text. + TheMadTrickster: + - rscadd: added new fixed nice sprites + - rscdel: trashed old ugly buggy sprites +2019-03-11: + Couls: + - tweak: Display if karma gains are enabled or not on round start(instead of just + disabled) + - bugfix: Fix wrong message when toggling karma + rb303: + - rscadd: Fluff scarf for Rb303 +2019-03-12: + Arkatos: + - bugfix: 'Fixes #10261 - Pure Vampires in Traitor+Vampire gamemode will now properly + show in AntagHUD' + - bugfix: 'Fixes #9494 - Pure Changelings in Traitor+Changeling gamemode will now + properly show in AntagHUD' +2019-03-13: + Couls: + - tweak: universal translate no longer makes emotes over comms impossible + - spellcheck: fixed a few typos with simple mobs +2019-03-14: + Couls: + - tweak: tweaked shesi's fluff sprite + Quantum-M: + - tweak: Changes the stamp sprites. + - imageadd: Add new sprites for the infernal and employment contracts. + - imageadd: Different organ sprites for each species + - imageadd: Different MMI sprites based on different species brains. +2019-03-15: + Arkatos: + - bugfix: 'Fixes #10987 - Guardians can now see the action intent they are on' + - rscadd: Added custom action intent icons for Guardians + Couls: + - rscadd: Added a new line to the defib examine text +2019-03-16: + Ty-Omaha and Ionward: + - rscadd: Carbon humans (people, not animals) who go SSD will now get ZZZ bubbles + to indicate they are SSD +2019-03-17: + AffectedArc07 and Alonefromhell: + - rscadd: 'Cell management consoles: See the status of all brig cells without having + to leave your office' + - imageadd: New screen sprite for cell management console + Jazz23: + - rscadd: Xenobio hotkeys, slime potion thing, remote slime scanner, monkey recycler + linking. + Kyep: + - bugfix: It is no longer possible to crawl into a vent while you are simultaneously + buckled to a chair or other solid object. + farie82: + - tweak: Adds a confirmation to the start now verb. Make it ansari proof + - bugfix: The invisible bumping into something should be fixed now + - bugfix: Fixes the atmos bug +2019-03-20: + Dave-TH: + - bugfix: Krav Maga gloves can no longer steal the unstealable. + farie82: + - bugfix: Fixed the middle mousebutton locking exploit +2019-03-22: + Arkatos: + - tweak: Updated Tarot Deck description in Wizard's spellbook, credits to /tg/station13 + Fox McCloud: + - rscadd: Smoke now has much better sprites and has a new area of denial behavior + Mitchs98: + - bugfix: Fixed Dionae names so "Embrace of Starsong (as Embrace Of Starsong)" will + no longer happen when renaming ID's at a ID Console. + Quantum-M: + - rscadd: Vox Cargo Crate - Contains two vox tanks and two vox masks. Costs 50 cargo + points. + - rscadd: Plasmaman Cargo Crate - Contains a Orange plasmaman space suit and helmet, + along with a breathing mask and a emergency plasmaman tank. Costs 75 cargo points + and requires EVA access. +2019-03-23: + Arkatos: + - bugfix: Players who enable AntagHUD are now unable to join the round as swarmers + - rscadd: Adds a message explaining why Antag-banned players cannot join the round + as cortical borer + Calecute: + - bugfix: South Prison camera now belongs to Prison camera network, thus showind + in Prison camera monitor + Kyep: + - bugfix: Admins offering control of a mob with no real_name to ghosts will no longer + cause a "Do you want to play as ?" popup. Instead, the ? will be replaced with + a descriptive string, such as "the blobbernaut". + Tails2091: + - bugfix: Lockboxes actually close when locked now. + farie82: + - bugfix: When disarming a bomb from a guardian you now don't pickup an empty object. + - bugfix: 'no more organ: spam sorry admins' +2019-03-24: + AffectedArc07: + - tweak: Preferences are now in alphabetical order + AzuleUtama: + - rscadd: 'Added Syndicate MMI for Roboticist Traitors, priced at 2TC. balance: + Removed Syndicate MMI from the traitor surgery duffelbag. Price reduced to 2TC.' + EmanTheAlmighty: + - tweak: Can no longer offer Gateway Terror Spiders sentience potions. ( They literally + exploded if you did, and that could have been used to effortlessly clear out + hordes of them. ) + - tweak: Using the Shadowling ability "Hatch" as a monkey will change your HUD to + be the human one. + - tweak: It is now possible to put a collar on any animal that has gained sentience. + Fox McCloud: + - tweak: Pills maximum size increased from 50 to 100 + - tweak: Chem Master bottle size increased from 30 to 50 + - tweak: Pill bottles can now hold 50 pills instead of 14 + - rscdel: Pill bottles can no longer hold patches + - rscadd: Adds Patch Boxes, which can hold patches, but not pills + - rscadd: Can now use a pill bottle or patch box on someone to apply a pill/patch + from the bottle/box to a mob. Usual delays will still apply + - rscadd: Can down an entire pill bottle at once! + - tweak: Cryostylane and pyrosium reactions now consume 2 of themselves when exposed + to oxygen + - rscadd: fires, temperature, and hotspots can heat anything that contains reagents + - rscadd: Having hot/cold chemicals dumped on you or ingesting them will hurt you. + Wear a mask or hat to protect from having someone dump the hot/cold things on + you. + - tweak: Chem Heater temperature adjustment tweaked; can no longer set temperature + on empty containers. + - tweak: Chem Heater generally heats faster, but cannot be upgraded + - tweak: Chem Heater automatically stops around target temperature + - tweak: Adjusts fire stacks and how they're applied with a few chems. Naplam, Phlogiston, + fuel, thermite, and a few others have all received changes. Most direct fire + damage removed. + - rscadd: Adds phlogiston dust; a safer, cooler burning Phlogiston. + - tweak: Water and Firefighting foam will no longer automagically put out mob based + fires; they'll reduce fire stacks (when fire stacks hit 0 they put the mob out) + - tweak: cryostylane puts out mobs instantly + - tweak: Heating fuel can set it off. Be careful when heating it now + - tweak: Increased welding fuel tank size from 1000 to 4000 (wall mounted are still + 1000) + - tweak: Sorium and Dark matter now actually throw things + - tweak: Thermite now gets applied to turfs. You'll have to heat the turf up to + ignite it. Anything that can heat can now ignite thermite on walls + - rscadd: Adds fake hotspots. They don't do anything except set you on fire when + you cross into them. Chemistry's pyrotechnics use these, for the most part; + anything that causes a fireball that's chemistry related uses these + - rscadd: Sorium and Liquid dark matter now have visual effects + - bugfix: Fixes chem smoke being on the wrong layer. + - rscadd: Adds in unidentified tank filled with an unknown experimental gas in deep + space. Find it and experiment! + Tails2091: + - rscadd: New emotes to Cats and Corgis. + - tweak: Change directories for some creature sounds to be in the creature sound + folder. + - soundadd: Two bark sounds, a yelp, and a meow. + farie82: + - bugfix: Holo firedoors now update atmos correctly after being destroyed + - bugfix: Inflatable walls/doors now update atmos correctly after being destroyed + - bugfix: Alien resin walls now update atmos correctly after being destroyed + - bugfix: Foamed metal walls now update atmos correctly after being destroyed + - bugfix: Pod doors (shouldn't ever happen) now update atmos correctly after being + destroyed + - bugfix: Mining flaps now update atmos correctly after being destroyed +2019-03-25: + Fox McCloud: + - bugfix: Fixes some reagent performance edges cases + - bugfix: Fixes chem smoke lagging under some circumstances + - bugfix: Fixes smoke not wanting to garbage collect + - bugfix: Fixes flares not returning a qdel hint + - bugfix: Fixes hotspots being slow to ignite turfs around them + - bugfix: Fixes LINDA not conducting temperature through things. + Mitchs98: + - bugfix: Chitinous Mass is no longer weaponized lag if examined. + farie82: + - bugfix: Diona nymphs are grabbable and punchable again +2019-03-29: + Arkatos: + - bugfix: 'Fixes #11087 - Swarmers are now locked to their default action intent' + - tweak: Swarmers are now able to open airlocks and windoors (access restrictions + still apply) + - rscadd: Added new Wizard item - Bottle of Ooze! This powerful item awakens all-consuming + Morph, ready to eat everyone and everything on the station! Be careful though, + as Morph diet also includes Wizards.. Costs 1 point in the spellbook. + - imageadd: Added custom icon for Bottle of Ooze + - tweak: Morph introduction is now properly formatted + - rscadd: Added new Blob UI and icons, ported from /tg/station13 + - rscadd: Added new *Blob Help* verb, designated to help out new players playing + as Blob + - rscadd: Added descriptions for each Blob reagent + - rscadd: Added complementary colors for each Blob reagent + - tweak: Blob marker now uses complementary color of Blob reagent as it's own color + - tweak: 'Blob shortcuts updated. Blob shortcuts are now: Click = Expand Blob | + CTRL Click = Create Shield Blob | Middle Mouse Click = Rally Spores | Alt Click + = Remove Blob' + Fox McCloud: + - rscadd: Crit has been dramatically overhauled. Treating patients now requires + a broader range of medicine. Recommend checking out a guide for how to treat + using the new system! + - rscadd: Medical vendors now have styptic and silver sulfadiazine, saline, atropine, + mannitol, mutadone, calomel, diphenhydramine, oculine, insulin, morphine, and + potassium iodide for helping treat new patients. Amount of Gauze, Advanced Trauma, + and Burn packs has also been increased. + - rscadd: 'Adds new handheld defibs. Utilize these for treating patients with cardiac + arrest. Note: these do not revive people from the dead!' + - rscadd: Doctors lockers now have a handheld defib in addition to a regular defib. + - rscadd: Medical borgs now have a handheld defib + - tweak: CPR dramatically buffed. Heavily lowers O2 damage and resets losebreath + to 0 + - tweak: Cryoxadone tuned down a little + - tweak: Health analyzer UI altered ever so slightly for cardiac arerest, so it's + easier to find + - rscadd: Added bacon grease reagent to traitor poison bottles; induces immediate + cardiac failure + - tweak: Upgraded Robotic Hearts now attempt to correct both cardiac failure and + cardiac arrest tweak; Upgraded Robotic Hearts now do not punish you quite as + severely for receiving a shock while having one (EMPs will still destroy you + though) + - rscdel: Corazone recipe removed + - tweak: hotspot sprites updated; fire will also now appear over top of things, + rather than underneath it + - rscadd: Roundstart chem dispensers are now construcable/deconstrucable and can + be moved + - tweak: Energy ratio for chem dispensers increased by x10 (how many reagents you + can dispense before running out and how quickly it recharges is all the same, + however) + - rscadd: Adds the ability to add a single unit of reagent in the chem dispenser + - rscadd: Adds the ability to isolate reagents in the chem dispenser + - rscdel: Portable chem dispenser removed (the circuit board for them now makes + full dispensers) + - bugfix: Fixes some suicides dealing damage and gibbing you at the same time + - rscadd: Allows you to suicide with more object types. Currently the only new object + type you can suicide with is the gibber + Kyep: + - tweak: Blob mobs can no longer be spawned in xenobio. + - tweak: Blob mobs spawned by blob cores can no longer have sentience potions used + on them, which would allow whoever controls them to kill the blob with no countermeasure. + Mitchs98: + - rscadd: 'Adds in Shrimp & Fish Skewers as well as Cheeseburgers. Shrimp Skewer(Grill): + 4 Shrimp(uncooked) + 1 Metal Rod, Fish Skewer(Grill): 2 Salmon Meat + Metal + Rod + 10u Flour, Cheese Burger(Microwave): Burger + Cheese Wedge.' + farie82: + - bugfix: Borgs can now only cuff people with two hands. Just like humanoids + - tweak: You can cuff people with at least one hand now + ingles98: + - bugfix: Plasma Golems will now report their suicide acts to the Admins. +2019-03-30: + Fox McCloud: + - bugfix: Fixes a runtime involving decapitation + - tweak: playing sounds performs better + Ty-Omaha: + - tweak: Removes SSD sleep bubbles from ghosts +2019-04-01: + Arkatos: + - rscadd: New Blob UI buttons for Storage Blob and Split consciousness abilities + - imageadd: New custom icons for Storage Blob and Split consciousness abilities + - rscadd: Added Node Requirement verb to the Blob. This verb, which is activated + by default, enforces that resource and factory blob structures are built in + a close proximity of the core/node in order to properly function. Players can + disable it anytime in the Blob tab. + - rscadd: Remove Blob verb now has a new feature - partial refund for special Blob + structures. When Blob Overmind removes special blob structure (such as a factory + or node), it will receive 30% of the structure cost back as a refund. + - tweak: Blob Overminds now show in Check Antagonists admin verb + - tweak: Blob Mobs now use complementary colors of the Blob Overmind reagent as + their own color + - rscdel: Removed Dark Matter from a list of possible Blob reagents + Fox McCloud: + - bugfix: Fixes syndicate medborgs and regular medborgs not having handheld defibs + - bugfix: Fixes multi-tile airlocks breaking and not leaving behind an assembly + - tweak: Updates the Timer SS + - rscadd: Roundstart ChemMasters are now constructable/deconstructable + - tweak: Can upgrade ChemMasters. Larger beakers mean a larger reservoir + - rscadd: Mobs that are gibbed with strange reagent and GBS have a bit more of a + dramatic flare to them with violent convulsions before exploding into tiny bits + Ty-Omaha: + - tweak: Modified alert sounds for Code Gamma and Code Epsilon. + dovydas12345: + - bugfix: Fixes AI's toggle floor bolts ability + farie82: + - bugfix: Bluespace golems no longer can crash the server + - tweak: Spontaneous combustion now has a minimum stacksize of 1. No more getting + wet from the fire virus +2019-04-02: + Alonefromhell & AffectedArc07: + - bugfix: Fixed an edgecase compile error for spacehotel.dmm + Arkatos: + - rscadd: Added Medical Beamgun to a Syndicate Medical Cyborg + - tweak: Appropriate antagonist sound theme now plays when an antagonist is selected + via Traitor Panel + - tweak: Cult sound theme now plays for a new cult converts + - tweak: Traitor/Malfunction sound theme now plays for newly autotraitored crew/AI + AzuleUtama: + - tweak: Cleaned up some outdated code left in uplinks.dm + Fox McCloud: + - bugfix: Fixes some mobs not being able to hear sounds + - bugfix: Fixes the Master Controller not actually shutting down on round end + - rscadd: Adds space ants to the game; leave your food on tables or inside a container + to avoid infestation! + - bugfix: Fixes bees not properly generating if they have a reagent in them + - rscadd: Can break bee boxes + - bugfix: Fixes bees breaking things they shouldn't + - bugfix: Fixes bees not properly injecting toxin if they lacked a reagent + - tweak: purchased bee boxes are no longer wrenched down by default + - rscadd: Adds trick revolver to the syndicate uplink for the clown. Teach those + pesky validhunters a lesson! + - rscadd: Adds the ability for admins to start a revolver only summon gun version; + there's also a suicidal version that makes half the guns summoned real and the + other half trick revolvers + - tweak: stabilizing agent gets used up in reactions that utilize it + - tweak: flashbangs spark when they initially go off + - bugfix: Fixes mech users being stunned by their own flashbangs + - bugfix: Fixes necromantic stone not working properly and other edge cases where + you had O2 damage and could become O2 damage immune + KasparoVy: + - rscadd: Adds Vox-fitted Tajaran veil sprites. + - rscdel: Removed stray pixel from Vox-fitted gasmask sprites. + - tweak: Adjusts the Vox-fitted blindfold sprite. + Kyep: + - bugfix: Blob mobs can definitely no longer be spawned in xenobio. + - tweak: Changed playtime requirements for command jobs. HoS/RD/CE/CMO/AI now require + 5h played in their department to be playable. HoP/Captain now require 5h played + as a member of the command staff. + Markolie: + - bugfix: Fixed some issues the compiler doesn't spot and some start up issues. + Ty-Omaha: + - tweak: Start now confirmation is now a config option + - rscadd: Grid check event sound effect + farie82: + - bugfix: Antidrop give edge case fixed + - bugfix: Can't give items to resting people now + - bugfix: put_in_hands now checks if you actually have hands + - tweak: Wrapping lockers and crates now takes 1.5 seconds to do + - tweak: Welding lockers now takes 1.5 seconds to do +2019-04-03: + Fox McCloud: + - bugfix: Dramatically improves human life performance (sorry, doesn't fix your + actual crappy real life) + - tweak: Blobspores will additionally zomify all players who have 200 damage or + more + - tweak: Holoparasites will additionally die once their host has 200 damage or more + - bugfix: Fixes blob zombies who infect players who have no head being invisible + farie82: + - bugfix: Death nettle can be picked up again + - bugfix: Auto cloning now doesn't clone a person more than once. + - tweak: A person in the cloning scanner won't be scanned if he's already being + cloned +2019-04-04: + Kyep: + - tweak: Improved the interface for Syndicate Uplinks. They now clearly mark which + items are hijack-only and which are not. If you attempt to purchase a hijack-only + item without hijack, they will explain why you can't. + - tweak: Atmos Gas Grenades (the uplink grenade kit) are now split into Knockout + grenades (2 N2O grenades, 8 TC, available to all agents), and Plasma Fire grenades + (2 plasma fire grenades, 12 TC, only available if you have hijack). This both + makes knockout grenades more useful for normal traitors, and also prevents non-hijackers + using a plasma fire grenade to cause massive casualties/damage. + - tweak: Plasma Grenades and the Syndicate Bomb can no longer show up in surplus + crates, or be discounted. This means while you can buy one if you intend to, + you're not randomly encouraged to bomb your target. +2019-04-06: + Fox McCloud: + - bugfix: Fixes people popping out of cloning taking tons of damage + - bugfix: Fixes Teslium recipe + - bugfix: Fixes some reagents not causing status updates + Twinmold: + - bugfix: No longer costs toner to send a fax to Central Command + dovydas12345: + - spellcheck: Fixed diamond statue names and description. + farie82: + - bugfix: Sec huds work again. No longer does the perp need glasses to be set to + arrest. Cool does not equal arrest now +2019-04-07: + Fox McCloud: + - bugfix: Fixes Russian revolvers triggering no matter where you clicked + Kyep: + - rscadd: Ghosting while alive, conscious, and a member of the crew will now result + in your body being moved to cryo after 5 minutes, assuming your body isn't killed + or restrained in any way in the meantime. + - rscadd: An AI that ghosts while alive gets a dismissable hint that they might + consider using OOC -> Wipe Core instead. + - rscadd: Ghosting out of your body while you are alive, and an antag, will result + in admins being informed, so that they may replace you as an antag if needed. diff --git a/html/changelogs/AutoChangeLog-pr-10975.yml b/html/changelogs/AutoChangeLog-pr-10975.yml deleted file mode 100644 index cf52ab8307d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-10975.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "AffectedArc07" -delete-after: True -changes: - - rscadd: "You will now automatically be given admin rights if you connect to your local server" diff --git a/html/changelogs/AutoChangeLog-pr-10978.yml b/html/changelogs/AutoChangeLog-pr-10978.yml deleted file mode 100644 index c7c72ef7a0a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-10978.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "AffectedArc07" -delete-after: True -changes: - - tweak: "Mapmerge has been replaced with mapmerge2" - - tweak: "Maps are now the TGM format. This means nothing for people who do not make map edits" diff --git a/html/changelogs/AutoChangeLog-pr-10989.yml b/html/changelogs/AutoChangeLog-pr-10989.yml deleted file mode 100644 index 47ebfdbf015..00000000000 --- a/html/changelogs/AutoChangeLog-pr-10989.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "AffectedArc07" -delete-after: True -changes: - - tweak: "Discord-related verbs are now under \"Special Verbs\" instead of \"OOC\"" diff --git a/html/changelogs/AutoChangeLog-pr-10996.yml b/html/changelogs/AutoChangeLog-pr-10996.yml deleted file mode 100644 index 864311e9d1d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-10996.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Couls" -delete-after: True -changes: - - rscadd: "Toggle karma button in special verbs" diff --git a/html/changelogs/AutoChangeLog-pr-11006.yml b/html/changelogs/AutoChangeLog-pr-11006.yml deleted file mode 100644 index 16e49ace14f..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11006.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Kyep" -delete-after: True -changes: - - rscadd: "Admins can now flag characters as having an event role, which makes them show up when admins look at the antag list, in admin attack logs, on antaghuds, and on the end-round score screen." diff --git a/html/changelogs/AutoChangeLog-pr-11026.yml b/html/changelogs/AutoChangeLog-pr-11026.yml new file mode 100644 index 00000000000..aa1d9fa5b04 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11026.yml @@ -0,0 +1,5 @@ +author: "farie82" +delete-after: True +changes: + - rscadd: "Gives you the option to disable text popup spam. Aka if enabled you won't get popups after you pressed T and had a lagspike and you typed a sentence containing a lot of T's. Default is off" + - tweak: "Now checks if OOC and LOOC are enabled before showing the popup" diff --git a/html/changelogs/AutoChangeLog-pr-11096.yml b/html/changelogs/AutoChangeLog-pr-11096.yml new file mode 100644 index 00000000000..d21076abf65 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11096.yml @@ -0,0 +1,7 @@ +author: "Arkatos" +delete-after: True +changes: + - tweak: "Guardians can no longer change action intents on their own" + - bugfix: "Fixes #10900 - Guardians can no longer attack their host while inside them" + - rscadd: "Explosive and Support Guardians now get precise cooldown shown (instead of just static estimate) before their bomb and beacon abitilites are ready to be used again, respectively" + - tweak: "HARM action intent icon for Guardians updated" diff --git a/html/changelogs/AutoChangeLog-pr-11161.yml b/html/changelogs/AutoChangeLog-pr-11161.yml new file mode 100644 index 00000000000..50cb5f843ce --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11161.yml @@ -0,0 +1,9 @@ +author: "Kyep" +delete-after: True +changes: + - bugfix: "Empress of terror (admin-only mob) is no longer incorrectly prevented from laying brown spider eggs." + - tweak: "Admins are now able to spawn a queen of terror in a room without a vent. Previously, queens would not allow this. Now, this just results in an alert to admins (since its probably a mistake) and deactivates the mob AI (but leaves it available for player control)." + - rscadd: "If there are player controlled terror spiders, admins using check antags panel will now be able to see eggs/spiderlings currently growing on the station. These counters only count eggs/spiderlings on station, and ignore fake spiderlings." + - bugfix: "Empress of terror's 'erase brood' ability no longer incorrectly causes mothers of terror to spawn spiderlings on death. +sprite: Empress of terror now has its own sprite." + - tweak: "White spider infections have been nerfed a bit. They no longer provide passive healing or increase infection progress while their host/victim is in crit. Also, the first spiderling to emerge from an infection can no longer be a green. Finally, the eggs now self-delete after the third spiderling emerges, so even in the event they aren't treated with surgery, the host isn't left with confused movement forever." diff --git a/html/changelogs/AutoChangeLog-pr-11182.yml b/html/changelogs/AutoChangeLog-pr-11182.yml new file mode 100644 index 00000000000..a6b762c2d10 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11182.yml @@ -0,0 +1,4 @@ +author: "Arkatos" +delete-after: True +changes: + - tweak: "Shadowling Glare ability reworked - The further Shadowling is from their glared target, the shorter stun their target gets. Stuns also have a delay before they kick in, based on the distance, however targets will be slowed and muted before stun takes effect. Targets on the tile just next to them are still stunned and muted for 10 seconds without any delay." diff --git a/icons/atmos/tank.dmi b/icons/atmos/tank.dmi index bf98899fb8e..3a6e2031cbc 100644 Binary files a/icons/atmos/tank.dmi and b/icons/atmos/tank.dmi differ diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index 95099bb00f3..97256ff448a 100644 Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ diff --git a/icons/goonstation/effects/64x64.dmi b/icons/goonstation/effects/64x64.dmi new file mode 100644 index 00000000000..17910cfdfb1 Binary files /dev/null and b/icons/goonstation/effects/64x64.dmi differ diff --git a/icons/goonstation/effects/effects.dmi b/icons/goonstation/effects/effects.dmi new file mode 100644 index 00000000000..8f38e42718e Binary files /dev/null and b/icons/goonstation/effects/effects.dmi differ diff --git a/icons/goonstation/effects/fire.dmi b/icons/goonstation/effects/fire.dmi index 48a1f9b90e6..03d0de0e38d 100644 Binary files a/icons/goonstation/effects/fire.dmi and b/icons/goonstation/effects/fire.dmi differ diff --git a/icons/goonstation/mob/inhands/items_lefthand.dmi b/icons/goonstation/mob/inhands/items_lefthand.dmi index 042c15f279b..cb8d5d66284 100644 Binary files a/icons/goonstation/mob/inhands/items_lefthand.dmi and b/icons/goonstation/mob/inhands/items_lefthand.dmi differ diff --git a/icons/goonstation/mob/inhands/items_righthand.dmi b/icons/goonstation/mob/inhands/items_righthand.dmi index 051f205bac7..1698af9855e 100644 Binary files a/icons/goonstation/mob/inhands/items_righthand.dmi and b/icons/goonstation/mob/inhands/items_righthand.dmi differ diff --git a/icons/goonstation/objects/objects.dmi b/icons/goonstation/objects/objects.dmi index 8dadb400668..99ddeac3d10 100644 Binary files a/icons/goonstation/objects/objects.dmi and b/icons/goonstation/objects/objects.dmi differ diff --git a/icons/mob/actions/actions.dmi b/icons/mob/actions/actions.dmi index 08e645c5c9b..d21323c80b1 100644 Binary files a/icons/mob/actions/actions.dmi and b/icons/mob/actions/actions.dmi differ diff --git a/icons/mob/blob.dmi b/icons/mob/blob.dmi index 56c39b9a75d..4797c79496e 100644 Binary files a/icons/mob/blob.dmi and b/icons/mob/blob.dmi differ diff --git a/icons/mob/guardian.dmi b/icons/mob/guardian.dmi index b318bba573d..a10e1e0b0ec 100644 Binary files a/icons/mob/guardian.dmi and b/icons/mob/guardian.dmi differ diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index 73df78f3f11..4cdf9b38920 100644 Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi index f8f6ea63db1..68ebe9f6e91 100644 Binary files a/icons/mob/hud.dmi and b/icons/mob/hud.dmi differ diff --git a/icons/mob/inhands/equipment/instruments_lefthand.dmi b/icons/mob/inhands/equipment/instruments_lefthand.dmi index e88c8da2d1c..4ffaa7d8c05 100644 Binary files a/icons/mob/inhands/equipment/instruments_lefthand.dmi and b/icons/mob/inhands/equipment/instruments_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/instruments_righthand.dmi b/icons/mob/inhands/equipment/instruments_righthand.dmi index 7b783c726e8..68899a4a7db 100644 Binary files a/icons/mob/inhands/equipment/instruments_righthand.dmi and b/icons/mob/inhands/equipment/instruments_righthand.dmi differ diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi index 3efddb08c4b..fe096499427 100644 Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ diff --git a/icons/mob/species/vox/eyes.dmi b/icons/mob/species/vox/eyes.dmi index 99ee47ac1fa..3d9a6c77bf8 100644 Binary files a/icons/mob/species/vox/eyes.dmi and b/icons/mob/species/vox/eyes.dmi differ diff --git a/icons/mob/species/vox/mask.dmi b/icons/mob/species/vox/mask.dmi index 7022c296574..971978ccff4 100644 Binary files a/icons/mob/species/vox/mask.dmi and b/icons/mob/species/vox/mask.dmi differ diff --git a/icons/mob/sprite_accessories/human/human_hair.dmi b/icons/mob/sprite_accessories/human/human_hair.dmi index 05a0b030052..4534c797cc3 100644 Binary files a/icons/mob/sprite_accessories/human/human_hair.dmi and b/icons/mob/sprite_accessories/human/human_hair.dmi differ diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index 6463ef602b2..fdbea753a29 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ diff --git a/icons/mob/terrorspider64.dmi b/icons/mob/terrorspider64.dmi new file mode 100644 index 00000000000..392ad43b3a7 Binary files /dev/null and b/icons/mob/terrorspider64.dmi differ diff --git a/icons/mob/ties.dmi b/icons/mob/ties.dmi index db92d8c21a6..b7d3b243994 100644 Binary files a/icons/mob/ties.dmi and b/icons/mob/ties.dmi differ diff --git a/icons/obj/bureaucracy.dmi b/icons/obj/bureaucracy.dmi index 56620c267b1..adf304513c7 100644 Binary files a/icons/obj/bureaucracy.dmi and b/icons/obj/bureaucracy.dmi differ diff --git a/icons/obj/chemical.dmi b/icons/obj/chemical.dmi index f692814d18c..9c9f6d38e94 100644 Binary files a/icons/obj/chemical.dmi and b/icons/obj/chemical.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index 3004a130246..418f221c78f 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index 7a728d811c3..a3e93ba32af 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/icons/obj/computer.dmi b/icons/obj/computer.dmi index c51b8d7050b..ac416274ebe 100644 Binary files a/icons/obj/computer.dmi and b/icons/obj/computer.dmi differ diff --git a/icons/obj/custom_items.dmi b/icons/obj/custom_items.dmi index 1dae65d3237..e1ca3d3380e 100644 Binary files a/icons/obj/custom_items.dmi and b/icons/obj/custom_items.dmi differ diff --git a/icons/obj/species_organs/drask.dmi b/icons/obj/species_organs/drask.dmi new file mode 100644 index 00000000000..95915450fcc Binary files /dev/null and b/icons/obj/species_organs/drask.dmi differ diff --git a/icons/obj/species_organs/grey.dmi b/icons/obj/species_organs/grey.dmi new file mode 100644 index 00000000000..647febdc67b Binary files /dev/null and b/icons/obj/species_organs/grey.dmi differ diff --git a/icons/obj/species_organs/kidan.dmi b/icons/obj/species_organs/kidan.dmi new file mode 100644 index 00000000000..8969d64c669 Binary files /dev/null and b/icons/obj/species_organs/kidan.dmi differ diff --git a/icons/obj/species_organs/plasmaman.dmi b/icons/obj/species_organs/plasmaman.dmi new file mode 100644 index 00000000000..e5b19f5d3a6 Binary files /dev/null and b/icons/obj/species_organs/plasmaman.dmi differ diff --git a/icons/obj/species_organs/skrell.dmi b/icons/obj/species_organs/skrell.dmi new file mode 100644 index 00000000000..998370f7344 Binary files /dev/null and b/icons/obj/species_organs/skrell.dmi differ diff --git a/icons/obj/species_organs/tajaran.dmi b/icons/obj/species_organs/tajaran.dmi new file mode 100644 index 00000000000..673e5d29a4e Binary files /dev/null and b/icons/obj/species_organs/tajaran.dmi differ diff --git a/icons/obj/species_organs/unathi.dmi b/icons/obj/species_organs/unathi.dmi new file mode 100644 index 00000000000..018816c4068 Binary files /dev/null and b/icons/obj/species_organs/unathi.dmi differ diff --git a/icons/obj/species_organs/vox.dmi b/icons/obj/species_organs/vox.dmi new file mode 100644 index 00000000000..cb9626fa9ff Binary files /dev/null and b/icons/obj/species_organs/vox.dmi differ diff --git a/icons/obj/species_organs/vulpkanin.dmi b/icons/obj/species_organs/vulpkanin.dmi new file mode 100644 index 00000000000..42d1338a8e1 Binary files /dev/null and b/icons/obj/species_organs/vulpkanin.dmi differ diff --git a/icons/obj/surgery_drask.dmi b/icons/obj/surgery_drask.dmi deleted file mode 100644 index 082d3e0f4f2..00000000000 Binary files a/icons/obj/surgery_drask.dmi and /dev/null differ diff --git a/icons/obj/wizard.dmi b/icons/obj/wizard.dmi index 108e5603b25..07c8be38ed9 100644 Binary files a/icons/obj/wizard.dmi and b/icons/obj/wizard.dmi differ diff --git a/nano/templates/brig_cells.tmpl b/nano/templates/brig_cells.tmpl new file mode 100644 index 00000000000..652c8926378 --- /dev/null +++ b/nano/templates/brig_cells.tmpl @@ -0,0 +1,34 @@ + +
    + +
+ + + + + + + + + + + + + {{for data.cells}} + + + + + + + + + + {{/for}} + +
CellOccupantCrimesBrigged ByTime Brigged ForTime LeftRelease
{{:value.cell_id}}{{:value.occupant}}{{:value.crimes}}{{:value.brigged_by}}{{:value.time_set}}{{:value.time_left}}{{:helper.link('Release', null, {'release' : value.ref}, null, 'infoButton')}}
+
+
\ No newline at end of file diff --git a/nano/templates/chem_dispenser.tmpl b/nano/templates/chem_dispenser.tmpl index f8988e35e43..74d694530c9 100644 --- a/nano/templates/chem_dispenser.tmpl +++ b/nano/templates/chem_dispenser.tmpl @@ -16,6 +16,7 @@ Used In File(s): \code\modules\reagents\Chemistry-Machinery.dm Dispense:
+ {{:helper.link('1', 'gear', {'amount' : 1}, (data.amount == 1) ? 'selected' : null)}} {{:helper.link('5', 'gear', {'amount' : 5}, (data.amount == 5) ? 'selected' : null)}} {{:helper.link('10', 'gear', {'amount' : 10}, (data.amount == 10) ? 'selected' : null)}} {{:helper.link('20', 'gear', {'amount' : 20}, (data.amount == 20) ? 'selected' : null)}} @@ -70,6 +71,7 @@ Used In File(s): \code\modules\reagents\Chemistry-Machinery.dm
+ {{:helper.link('Isolate', null, {'remove' : value.id, 'removeamount' : -1})}} {{:helper.link('1', null, {'remove' : value.id, 'removeamount' : 1})}} {{:helper.link('5', null, {'remove' : value.id, 'removeamount' : 5})}} {{:helper.link('10', null, {'remove' : value.id, 'removeamount' : 10})}} diff --git a/nano/templates/chem_master.tmpl b/nano/templates/chem_master.tmpl index 1ccfcadfe70..385237727db 100644 --- a/nano/templates/chem_master.tmpl +++ b/nano/templates/chem_master.tmpl @@ -42,7 +42,7 @@ {{/for}} diff --git a/paradise.dme b/paradise.dme index efa75177cce..b22da751ecc 100644 --- a/paradise.dme +++ b/paradise.dme @@ -131,6 +131,7 @@ #include "code\_onclick\hud\alert.dm" #include "code\_onclick\hud\alien.dm" #include "code\_onclick\hud\alien_larva.dm" +#include "code\_onclick\hud\blob_overmind.dm" #include "code\_onclick\hud\bot.dm" #include "code\_onclick\hud\constructs.dm" #include "code\_onclick\hud\devil.dm" @@ -279,6 +280,7 @@ #include "code\datums\diseases\brainrot.dm" #include "code\datums\diseases\cold.dm" #include "code\datums\diseases\cold9.dm" +#include "code\datums\diseases\critical.dm" #include "code\datums\diseases\fake_gbs.dm" #include "code\datums\diseases\flu.dm" #include "code\datums\diseases\fluspanish.dm" @@ -665,6 +667,7 @@ #include "code\game\machinery\computer\arcade.dm" #include "code\game\machinery\computer\atmos_alert.dm" #include "code\game\machinery\computer\atmos_control.dm" +#include "code\game\machinery\computer\brigcells.dm" #include "code\game\machinery\computer\buildandrepair.dm" #include "code\game\machinery\computer\camera.dm" #include "code\game\machinery\computer\camera_advanced.dm" @@ -786,6 +789,7 @@ #include "code\game\objects\effects\decals\Cleanable\robots.dm" #include "code\game\objects\effects\decals\Cleanable\tracks.dm" #include "code\game\objects\effects\effect_system\effect_system.dm" +#include "code\game\objects\effects\effect_system\effects_chem_smoke.dm" #include "code\game\objects\effects\effect_system\effects_explosion.dm" #include "code\game\objects\effects\effect_system\effects_foam.dm" #include "code\game\objects\effects\effect_system\effects_other.dm" @@ -829,6 +833,7 @@ #include "code\game\objects\items\devices\flash.dm" #include "code\game\objects\items\devices\flashlight.dm" #include "code\game\objects\items\devices\floor_painter.dm" +#include "code\game\objects\items\devices\handheld_defib.dm" #include "code\game\objects\items\devices\instruments.dm" #include "code\game\objects\items\devices\laserpointer.dm" #include "code\game\objects\items\devices\lightreplacer.dm" @@ -1731,9 +1736,9 @@ #include "code\modules\mob\living\carbon\human\inventory.dm" #include "code\modules\mob\living\carbon\human\life.dm" #include "code\modules\mob\living\carbon\human\login.dm" +#include "code\modules\mob\living\carbon\human\logout.dm" #include "code\modules\mob\living\carbon\human\npcs.dm" #include "code\modules\mob\living\carbon\human\say.dm" -#include "code\modules\mob\living\carbon\human\shock.dm" #include "code\modules\mob\living\carbon\human\status_procs.dm" #include "code\modules\mob\living\carbon\human\update_icons.dm" #include "code\modules\mob\living\carbon\human\update_stat.dm" @@ -2351,6 +2356,7 @@ #include "code\modules\surgery\organs\subtypes\kidan.dm" #include "code\modules\surgery\organs\subtypes\machine.dm" #include "code\modules\surgery\organs\subtypes\nucleation.dm" +#include "code\modules\surgery\organs\subtypes\plasmaman.dm" #include "code\modules\surgery\organs\subtypes\shadow.dm" #include "code\modules\surgery\organs\subtypes\skrell.dm" #include "code\modules\surgery\organs\subtypes\standard.dm" diff --git a/sound/Attributions.txt b/sound/Attributions.txt index 262699e9c3f..729562855ba 100644 --- a/sound/Attributions.txt +++ b/sound/Attributions.txt @@ -1 +1,5 @@ -items/thermal_drill.ogg was sampled from Builders Drilling.wav under a Sampling Plus 1.0 license. It was uploaded by Koops on 2010-05-10. Source (http://soundbible.com/1420-Builders-Drilling.html) \ No newline at end of file +items/thermal_drill.ogg was sampled from Builders Drilling.wav under a Sampling Plus 1.0 license. It was uploaded by Koops on 2010-05-10. Source (http://soundbible.com/1420-Builders-Drilling.html) + +ambience/aurora_caelus.ogg is Music for Manatees by Kevin Macleod. It is under a CC-BY 3.0 license. It has been cropped and fades out. + +creatures/dog_yelp.ogg is DogYelp.wav. It is under a CC-BY 3.0 license. It has been cropped, EQ'd, and compressed to .ogg. Source (https://freesound.org/people/TobiasKosmos/sounds/163280/) \ No newline at end of file diff --git a/sound/ambience/license.txt b/sound/ambience/license.txt deleted file mode 100644 index 5376422f21f..00000000000 --- a/sound/ambience/license.txt +++ /dev/null @@ -1,2 +0,0 @@ -aurora_caelus.ogg is Music for Manatees, by Kevin Macleod. It has been licensed under CC-BY 3.0 license. - It has been cropped for use ingame, and also fades out. \ No newline at end of file diff --git a/sound/creatures/cat_meow.ogg b/sound/creatures/cat_meow.ogg new file mode 100644 index 00000000000..f52cbd2a172 Binary files /dev/null and b/sound/creatures/cat_meow.ogg differ diff --git a/sound/misc/caw.ogg b/sound/creatures/caw.ogg similarity index 100% rename from sound/misc/caw.ogg rename to sound/creatures/caw.ogg diff --git a/sound/creatures/dog_bark1.ogg b/sound/creatures/dog_bark1.ogg new file mode 100644 index 00000000000..809f3897c88 Binary files /dev/null and b/sound/creatures/dog_bark1.ogg differ diff --git a/sound/creatures/dog_bark2.ogg b/sound/creatures/dog_bark2.ogg new file mode 100644 index 00000000000..e4e27b0f862 Binary files /dev/null and b/sound/creatures/dog_bark2.ogg differ diff --git a/sound/creatures/dog_yelp.ogg b/sound/creatures/dog_yelp.ogg new file mode 100644 index 00000000000..22f1586014d Binary files /dev/null and b/sound/creatures/dog_yelp.ogg differ diff --git a/sound/misc/hoot.ogg b/sound/creatures/hoot.ogg similarity index 100% rename from sound/misc/hoot.ogg rename to sound/creatures/hoot.ogg diff --git a/sound/effects/mousesqueek.ogg b/sound/creatures/mousesqueak.ogg similarity index 100% rename from sound/effects/mousesqueek.ogg rename to sound/creatures/mousesqueak.ogg diff --git a/sound/misc/nymphchirp.ogg b/sound/creatures/nymphchirp.ogg similarity index 100% rename from sound/misc/nymphchirp.ogg rename to sound/creatures/nymphchirp.ogg diff --git a/sound/effects/new_siren.ogg b/sound/effects/new_siren.ogg new file mode 100644 index 00000000000..24c4ecca9a1 Binary files /dev/null and b/sound/effects/new_siren.ogg differ diff --git a/sound/effects/powerloss.ogg b/sound/effects/powerloss.ogg new file mode 100644 index 00000000000..9a0835ecdb6 Binary files /dev/null and b/sound/effects/powerloss.ogg differ diff --git a/strings/chemistry_tools.json b/strings/chemistry_tools.json index 4a079102a69..5bf45fc6e58 100644 --- a/strings/chemistry_tools.json +++ b/strings/chemistry_tools.json @@ -468,6 +468,7 @@ "prions", "spidereggs", "concentrated_initro", - "heartworms" + "heartworms", + "bacon_grease" ] } diff --git a/tools/mapmerge2/README.md b/tools/mapmerge2/README.md index 1cd29510100..0ff4d21ac2e 100644 --- a/tools/mapmerge2/README.md +++ b/tools/mapmerge2/README.md @@ -13,17 +13,20 @@ version of the map while maintaining all the actual changes. It requires an old version of the map to use as a reference and a new version of the map which contains the desired changes. -## Installation/Usage +## Installation -To install Python dependencies, run `Install Requirements.bat` +To install Python dependencies, run `requirements-install.bat`, or run +`python -m pip install -r requirements.txt` directly. See the [Git hooks] +documentation to install the Git pre-commit hook which runs the map merger +automatically, or use `tools/mapmerge/Prepare Maps.bat` to save backups before +running `mapmerge.bat`. -**BEFORE** making a map edit, run `Prepare Maps.bat` to create your backups. *These are required to run mapmerge successfully.* - -**AFTER** you have made your edit, run `Run Mapmerge.bat` to merge the maps. +For up-to-date installation and detailed troubleshooting instructions, visit +the [Map Merger] wiki article. ## Code Structure -All the scripts are inside the `/src/` folder. Frontend scripts are meant to be run directly. They obey the environment +Frontend scripts are meant to be run directly. They obey the environment variables `TGM` to set whether files are saved in TGM (1) or DMM (0) format, and `MAPROOT` to determine where maps are kept. By default, TGM is used and the map root is autodetected. Each script may either prompt for the desired map @@ -31,12 +34,19 @@ or be run with command-line parameters indicating which maps to act on. The scripts include: * `convert.py` for converting maps to and from the TGM format. Used by - `Convert DMM to TGM.bat` and `Convert TGM to DMM.bat`. + `tgm2dmm.bat` and `dmm2tgm.bat`. * `mapmerge.py` for running the map merge on map backups saved by - `Prepare Maps.bat`. Used by `Run Mapmerge.bat` + `Prepare Maps.bat`. Used by `mapmerge.bat` Implementation modules: * `dmm.py` includes the map reader and writer. * `mapmerge.py` includes the implementation of the map merge operation. * `frontend.py` includes the common code for the frontend scripts. + +`precommit.py` is run by the [Git hooks] if installed, and merges the new +version of any map saved in the index (`git add`ed) with the old version stored +in Git when run. + +[Map Merger]: https://tgstation13.org/wiki/Map_Merger +[Git hooks]: ../hooks/README.md diff --git a/tools/mapmerge2/src/convert.py b/tools/mapmerge2/convert.py similarity index 100% rename from tools/mapmerge2/src/convert.py rename to tools/mapmerge2/convert.py diff --git a/tools/mapmerge2/dmi.py b/tools/mapmerge2/dmi.py new file mode 100644 index 00000000000..f0a8182c9f0 --- /dev/null +++ b/tools/mapmerge2/dmi.py @@ -0,0 +1,253 @@ +# Tools for working with modern DreamMaker icon files (PNGs + metadata) + +import math +from PIL import Image +from PIL.PngImagePlugin import PngInfo + +DEFAULT_SIZE = 32, 32 +LOOP_UNLIMITED = 0 +LOOP_ONCE = 1 + +NORTH = 1 +SOUTH = 2 +EAST = 4 +WEST = 8 +SOUTHEAST = SOUTH|EAST +SOUTHWEST = SOUTH|WEST +NORTHEAST = NORTH|EAST +NORTHWEST = NORTH|WEST + +CARDINALS = [NORTH, SOUTH, EAST, WEST] +DIR_ORDER = [SOUTH, NORTH, EAST, WEST, SOUTHEAST, SOUTHWEST, NORTHEAST, NORTHWEST] +DIR_NAMES = { + 'SOUTH': SOUTH, + 'NORTH': NORTH, + 'EAST': EAST, + 'WEST': WEST, + 'SOUTHEAST': SOUTHEAST, + 'SOUTHWEST': SOUTHWEST, + 'NORTHEAST': NORTHEAST, + 'NORTHWEST': NORTHWEST, + **{str(x): x for x in DIR_ORDER}, + **{x: x for x in DIR_ORDER}, + '0': SOUTH, + None: SOUTH, +} + +class Dmi: + version = "4.0" + + def __init__(self, width, height): + self.width = width + self.height = height + self.states = [] + + @classmethod + def from_file(cls, fname): + image = Image.open(fname) + + # no metadata = regular image file + if 'Description' not in image.info: + dmi = Dmi(*image.size) + state = dmi.state("") + state.frame(image) + return dmi + + # read metadata + metadata = image.info['Description'] + line_iter = iter(metadata.splitlines()) + assert next(line_iter) == "# BEGIN DMI" + assert next(line_iter) == f"version = {cls.version}" + + dmi = Dmi(*DEFAULT_SIZE) + state = None + + for line in line_iter: + if line == "# END DMI": + break + key, value = line.lstrip().split(" = ") + if key == 'width': + dmi.width = int(value) + elif key == 'height': + dmi.height = int(value) + elif key == 'state': + state = dmi.state(unescape(value)) + elif key == 'dirs': + state.dirs = int(value) + elif key == 'frames': + state._nframes = int(value) + elif key == 'delay': + state.delays = [parse_num(x) for x in value.split(',')] + elif key == 'loop': + state.loop = int(value) + elif key == 'rewind': + state.rewind = parse_bool(value) + elif key == 'hotspot': + x, y, frm = [int(x) for x in value.split(',')] + state.hotspot(frm - 1, x, y) + elif key == 'movement': + state.movement = parse_bool(value) + else: + raise NotImplementedError(key) + + # cut image into frames + width, height = image.size + gridwidth = width // dmi.width + i = 0 + for state in dmi.states: + for frame in range(state._nframes): + for dir in range(state.dirs): + px = dmi.width * (i % gridwidth) + py = dmi.height * (i // gridwidth) + im = image.crop((px, py, px + dmi.width, py + dmi.height)) + assert im.size == (dmi.width, dmi.height) + state.frames.append(im) + i += 1 + state._nframes = None + + return dmi + + def state(self, *args, **kwargs): + s = State(self, *args, **kwargs) + self.states.append(s) + return s + + @property + def default_state(self): + return self.states[0] + + def get_state(self, name): + for state in self.states: + if state.name == name: + return state + raise KeyError(name) + return self.default_state + + def _assemble_comment(self): + comment = "# BEGIN DMI\n" + comment += f"version = {self.version}\n" + comment += f"\twidth = {self.width}\n" + comment += f"\theight = {self.height}\n" + for state in self.states: + comment += f"state = {escape(state.name)}\n" + comment += f"\tdirs = {state.dirs}\n" + comment += f"\tframes = {state.framecount}\n" + if state.framecount > 1 and len(state.delays): #any(x != 1 for x in state.delays): + comment += "\tdelay = " + ",".join(map(str, state.delays)) + "\n" + if state.loop != 0: + comment += f"\tloop = {state.loop}\n" + if state.rewind: + comment += "\trewind = 1\n" + if state.movement: + comment += "\tmovement = 1\n" + if state.hotspots and any(state.hotspots): + current = None + for i, value in enumerate(state.hotspots): + if value != current: + x, y = value + comment += f"\thotspot = {x},{y},{i + 1}\n" + current = value + comment += "# END DMI" + return comment + + def to_file(self, filename, *, palette=False): + # assemble comment + comment = self._assemble_comment() + + # assemble spritesheet + W, H = self.width, self.height + num_frames = sum(len(state.frames) for state in self.states) + sqrt = math.ceil(math.sqrt(num_frames)) + output = Image.new('RGBA', (sqrt * W, math.ceil(num_frames / sqrt) * H)) + + i = 0 + for state in self.states: + for frame in state.frames: + output.paste(frame, ((i % sqrt) * W, (i // sqrt) * H)) + i += 1 + + # save + pnginfo = PngInfo() + pnginfo.add_text('Description', comment, zip=True) + if palette: + output = output.convert('P') + output.save(filename, 'png', optimize=True, pnginfo=pnginfo) + +class State: + def __init__(self, dmi, name, *, loop=LOOP_UNLIMITED, rewind=False, movement=False, dirs=1): + self.dmi = dmi + self.name = name + self.loop = loop + self.rewind = rewind + self.movement = movement + self.dirs = dirs + + self._nframes = None # used during loading only + self.frames = [] + self.delays = [] + self.hotspots = None + + @property + def framecount(self): + if self._nframes is not None: + return self._nframes + else: + return len(self.frames) // self.dirs + + def frame(self, image, *, delay=1): + assert image.size == (self.dmi.width, self.dmi.height) + self.delays.append(delay) + self.frames.append(image) + + def hotspot(self, first_frame, x, y): + if self.hotspots is None: + self.hotspots = [None] * self.framecount + for i in range(first_frame, self.framecount): + self.hotspots[i] = x, y + + def _frame_index(self, frame=0, dir=None): + ofs = DIR_ORDER.index(DIR_NAMES[dir]) + if ofs >= self.dirs: + ofs = 0 + return frame * self.dirs + ofs + + def get_frame(self, *args, **kwargs): + return self.frames[self._frame_index(*args, **kwargs)] + +def escape(text): + assert '\\' not in text and '"' not in text + return f'"{text}"' + +def unescape(text, quote='"'): + if text == 'null': + return None + if not (text.startswith(quote) and text.endswith(quote)): + raise ValueError(text) + text = text[1:-1] + assert '\\' not in text and quote not in text + return text + +def parse_num(value): + if '.' in value: + return float(value) + return int(value) + +def parse_bool(value): + if value not in ('0', '1'): + raise ValueError(value) + return value == '1' + +if __name__ == '__main__': + # test: can we load every DMI in the tree + import os + + count = 0 + for dirpath, dirnames, filenames in os.walk('.'): + if '.git' in dirnames: + dirnames.remove('.git') + for filename in filenames: + if filename.endswith('.dmi'): + Dmi.from_file(os.path.join(dirpath, filename)) + count += 1 + + print(f"Successfully parsed {count} dmi files") diff --git a/tools/mapmerge2/src/dmm.py b/tools/mapmerge2/dmm.py similarity index 85% rename from tools/mapmerge2/src/dmm.py rename to tools/mapmerge2/dmm.py index d76f07e32c6..8bb1dca3537 100644 --- a/tools/mapmerge2/src/dmm.py +++ b/tools/mapmerge2/dmm.py @@ -58,6 +58,23 @@ class DMM: raise RuntimeError("ran out of keys, this shouldn't happen") + def overwrite_key(self, key, fixed, bad_keys): + try: + self.dictionary[key] = fixed + return None + except bidict.DuplicationError: + old_key = self.dictionary.inv[fixed] + bad_keys[key] = old_key + print(f"Merging '{num_to_key(key, self.key_length)}' into '{num_to_key(old_key, self.key_length)}'") + return old_key + + def reassign_bad_keys(self, bad_keys): + if not bad_keys: + return + for k, v in self.grid.items(): + # reassign the grid entries which used the old key + self.grid[k] = bad_keys.get(v, v) + def _presave_checks(self): # last-second handling of bogus keys to help prevent and fix broken maps self._ensure_free_keys(0) @@ -70,9 +87,16 @@ class DMM: new_key = bad_keys[k] = self.generate_new_key() self.dictionary.forceput(new_key, self.dictionary[k]) print(f" {num_to_key(k, self.key_length, True)} -> {num_to_key(new_key, self.key_length)}") - for k, v in self.grid.items(): - # reassign the grid entries which used the old key - self.grid[k] = bad_keys.get(v, v) + + # handle entries in the dictionary which have atoms in the wrong order + keys = list(self.dictionary.keys()) + for key in keys: + value = self.dictionary[key] + if is_bad_atom_ordering(num_to_key(key, self.key_length, True), value): + fixed = tuple(fix_atom_ordering(value)) + self.overwrite_key(key, fixed, bad_keys) + + self.reassign_bad_keys(bad_keys) def _ensure_free_keys(self, desired): # ensure that free keys exist by increasing the key length if necessary @@ -179,6 +203,45 @@ def parse_map_atom(atom): return path, vars +def is_bad_atom_ordering(key, atoms): + seen_turfs = 0 + seen_areas = 0 + can_fix = False + for each in atoms: + if each.startswith('/turf'): + if seen_turfs == 1: + print(f"Warning: key '{key}' has multiple turfs!") + if seen_areas: + print(f"Warning: key '{key}' has area before turf (autofixing...)") + can_fix = True + seen_turfs += 1 + elif each.startswith('/area'): + if seen_areas == 1: + print(f"Warning: key '{key}' has multiple areas!!!") + seen_areas += 1 + else: + if (seen_turfs or seen_areas) and not can_fix: + print(f"Warning: key '{key}' has movable after turf or area (autofixing...)") + can_fix = True + if not seen_areas or not seen_turfs: + print(f"Warning: key '{key}' is missing either a turf or area") + return can_fix + +def fix_atom_ordering(atoms): + movables = [] + turfs = [] + areas = [] + for each in atoms: + if each.startswith('/turf'): + turfs.append(each) + elif each.startswith('/area'): + areas.append(each) + else: + movables.append(each) + movables.extend(turfs) + movables.extend(areas) + return movables + # ---------- # TGM writer @@ -307,7 +370,7 @@ def _parse(map_raw_text): continue elif in_comment_line: continue - elif char == "\t": + elif char in "\r\t": continue if char == "/" and not in_quote_block: @@ -415,6 +478,9 @@ def _parse(map_raw_text): # grid block for char in it: + if char == "\r": + continue + if in_coord_block: if char == ",": if reading_coord == "x": diff --git a/tools/mapmerge2/Convert DMM to TGM.bat b/tools/mapmerge2/dmm2tgm.bat similarity index 68% rename from tools/mapmerge2/Convert DMM to TGM.bat rename to tools/mapmerge2/dmm2tgm.bat index c100d61fe71..bcf6150c2ea 100644 --- a/tools/mapmerge2/Convert DMM to TGM.bat +++ b/tools/mapmerge2/dmm2tgm.bat @@ -1,5 +1,5 @@ @echo off set MAPROOT=../../_maps/ set TGM=1 -python ./src/convert.py +python convert.py pause diff --git a/tools/mapmerge2/src/frontend.py b/tools/mapmerge2/frontend.py similarity index 100% rename from tools/mapmerge2/src/frontend.py rename to tools/mapmerge2/frontend.py diff --git a/tools/mapmerge2/map_scripts/cornersfix.txt b/tools/mapmerge2/map_scripts/cornersfix.txt new file mode 100644 index 00000000000..d9ff8a20232 --- /dev/null +++ b/tools/mapmerge2/map_scripts/cornersfix.txt @@ -0,0 +1,30 @@ +/obj/effect/turf_decal/stripes/corner {dir=1} : /obj/item/bear_armor {@OLD;dir=8} +/obj/effect/turf_decal/stripes/corner {dir=2} : /obj/effect/turf_decal/stripes/corner {@OLD;dir=@SKIP} +/obj/effect/turf_decal/stripes/corner {dir=4} : /obj/effect/turf_decal/stripes/corner {@OLD;dir=1} +/obj/effect/turf_decal/stripes/corner {dir=8} : /obj/effect/turf_decal/stripes/corner {@OLD;dir=4} +/obj/item/bear_armor {dir=8} : /obj/effect/turf_decal/stripes/corner {@OLD} +/obj/effect/turf_decal/stripes/red/corner {dir=1} : /obj/item/bear_armor {@OLD;dir=8} +/obj/effect/turf_decal/stripes/red/corner {dir=2} : /obj/effect/turf_decal/stripes/red/corner {@OLD;dir=@SKIP} +/obj/effect/turf_decal/stripes/red/corner {dir=4} : /obj/effect/turf_decal/stripes/red/corner {@OLD;dir=1} +/obj/effect/turf_decal/stripes/red/corner {dir=8} : /obj/effect/turf_decal/stripes/red/corner {@OLD;dir=4} +/obj/item/bear_armor {dir=8} : /obj/effect/turf_decal/stripes/red/corner {@OLD} +/obj/effect/turf_decal/stripes/white/corner {dir=1} : /obj/item/bear_armor {@OLD;dir=8} +/obj/effect/turf_decal/stripes/white/corner {dir=2} : /obj/effect/turf_decal/stripes/white/corner {@OLD;dir=@SKIP} +/obj/effect/turf_decal/stripes/white/corner {dir=4} : /obj/effect/turf_decal/stripes/white/corner {@OLD;dir=1} +/obj/effect/turf_decal/stripes/white/corner {dir=8} : /obj/effect/turf_decal/stripes/white/corner {@OLD;dir=4} +/obj/item/bear_armor {dir=8} : /obj/effect/turf_decal/stripes/white/corner {@OLD} +/obj/effect/turf_decal/box/corners {dir=1} : /obj/item/bear_armor {@OLD;dir=8} +/obj/effect/turf_decal/box/corners {dir=2} : /obj/effect/turf_decal/box/corners {@OLD;dir=@SKIP} +/obj/effect/turf_decal/box/corners {dir=4} : /obj/effect/turf_decal/box/corners {@OLD;dir=1} +/obj/effect/turf_decal/box/corners {dir=8} : /obj/effect/turf_decal/box/corners {@OLD;dir=4} +/obj/item/bear_armor {dir=8} : /obj/effect/turf_decal/box/corners {@OLD} +/obj/effect/turf_decal/box/red/corners {dir=1} : /obj/item/bear_armor {@OLD;dir=8} +/obj/effect/turf_decal/box/red/corners {dir=2} : /obj/effect/turf_decal/box/red/corners {@OLD;dir=@SKIP} +/obj/effect/turf_decal/box/red/corners {dir=4} : /obj/effect/turf_decal/box/red/corners {@OLD;dir=1} +/obj/effect/turf_decal/box/red/corners {dir=8} : /obj/effect/turf_decal/box/red/corners {@OLD;dir=4} +/obj/item/bear_armor {dir=8} : /obj/effect/turf_decal/box/red/corners {@OLD} +/obj/effect/turf_decal/box/white/corners {dir=1} : /obj/item/bear_armor {@OLD;dir=8} +/obj/effect/turf_decal/box/white/corners {dir=2} : /obj/effect/turf_decal/box/white/corners {@OLD;dir=@SKIP} +/obj/effect/turf_decal/box/white/corners {dir=4} : /obj/effect/turf_decal/box/white/corners {@OLD;dir=1} +/obj/effect/turf_decal/box/white/corners {dir=8} : /obj/effect/turf_decal/box/white/corners {@OLD;dir=4} +/obj/item/bear_armor {dir=8} : /obj/effect/turf_decal/box/white/corners {@OLD} \ No newline at end of file diff --git a/tools/mapmerge2/map_scripts/turfs2decals.txt b/tools/mapmerge2/map_scripts/turfs2decals.txt new file mode 100644 index 00000000000..13ae02baf73 --- /dev/null +++ b/tools/mapmerge2/map_scripts/turfs2decals.txt @@ -0,0 +1,465 @@ +/turf/open/floor/circuit/killroom : /turf/open/floor/circuit/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/airless/asteroid : /obj/effect/turf_decal/sand , /turf/open/floor/plasteel/airless {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/airless/bar : /obj/effect/turf_decal/tile/bar , /obj/effect/turf_decal/tile/bar {dir=1} , /turf/open/floor/plasteel/airless {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/arrival {dir=1} : /obj/effect/turf_decal/tile/blue {dir=4} , /turf/open/floor/plasteel/white/corner {@OLD;dir=1} +/turf/open/floor/plasteel/arrival {dir=@UNSET} : /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel/white/corner {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/arrival {dir=2} : /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel/white/corner {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/arrival {dir=4} : /obj/effect/turf_decal/tile/blue {dir=4} , /turf/open/floor/plasteel/white/corner {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/arrival {dir=5} : /obj/effect/turf_decal/tile/blue {dir=4} , /turf/open/floor/plasteel/cafeteria {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/arrival {dir=6} : /obj/effect/turf_decal/tile/blue {dir=4} , /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel/white/corner {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/arrival {dir=8} : /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel/white/corner {@OLD;dir=1} +/turf/open/floor/plasteel/arrival {dir=9} : /obj/effect/turf_decal/tile/blue {dir=4} , /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel/white/corner {@OLD;dir=1} +/turf/open/floor/plasteel/arrival {dir=10} : /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel/cafeteria {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/arrival/corner {dir=1} : /turf/open/floor/plasteel/white/corner {@OLD} +/turf/open/floor/plasteel/arrival/corner {dir=@UNSET} : /turf/open/floor/plasteel/white/corner {@OLD} +/turf/open/floor/plasteel/arrival/corner {dir=2} : /turf/open/floor/plasteel/white/corner {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/arrival/corner {dir=4} : /obj/effect/turf_decal/tile/blue {dir=@OLD} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/arrival/corner {dir=8} : /obj/effect/turf_decal/tile/blue {dir=@OLD} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/asteroid : /obj/effect/turf_decal/sand , /turf/open/floor/plasteel +/turf/open/floor/plasteel/bar : /obj/effect/turf_decal/tile/bar , /obj/effect/turf_decal/tile/bar {dir=1} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/barber : /obj/effect/turf_decal/tile/blue {dir=4} , /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel/cafeteria {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/blue : /obj/effect/turf_decal/tile/blue {dir=1} , /obj/effect/turf_decal/tile/blue , /obj/effect/turf_decal/tile/blue {dir=4} , /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/blue/side {dir=1} : /obj/effect/turf_decal/tile/blue {dir=1} , /obj/effect/turf_decal/tile/blue {dir=4} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/blue/side {dir=@UNSET} : /obj/effect/turf_decal/tile/blue , /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/blue/side {dir=2} : /obj/effect/turf_decal/tile/blue , /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/blue/side {dir=4} : /obj/effect/turf_decal/tile/blue , /obj/effect/turf_decal/tile/blue {dir=4} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/blue/side {dir=5} : /obj/effect/turf_decal/tile/blue {dir=1} , /obj/effect/turf_decal/tile/blue , /obj/effect/turf_decal/tile/blue {dir=4} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/blue/side {dir=6} : /obj/effect/turf_decal/tile/blue , /obj/effect/turf_decal/tile/blue {dir=4} , /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/blue/side {dir=8} : /obj/effect/turf_decal/tile/blue {dir=1} , /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/blue/side {dir=9} : /obj/effect/turf_decal/tile/blue {dir=1} , /obj/effect/turf_decal/tile/blue {dir=4} , /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/blue/side {dir=10} : /obj/effect/turf_decal/tile/blue {dir=1} , /obj/effect/turf_decal/tile/blue , /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/blue/corner : /obj/effect/turf_decal/tile/blue {dir=@OLD} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/blueyellow : /obj/effect/turf_decal/tile/blue {dir=1} , /obj/effect/turf_decal/tile/blue , /obj/effect/turf_decal/tile/yellow {dir=4} , /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/blueyellow/side {dir=1} : /obj/effect/turf_decal/tile/blue {dir=1} , /obj/effect/turf_decal/tile/yellow {dir=4} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/blueyellow/side {dir=@UNSET} : /obj/effect/turf_decal/tile/blue , /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/blueyellow/side {dir=2} : /obj/effect/turf_decal/tile/blue , /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/blueyellow/side {dir=4} : /obj/effect/turf_decal/tile/blue , /obj/effect/turf_decal/tile/yellow {dir=4} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/blueyellow/side {dir=5} : /obj/effect/turf_decal/tile/blue {dir=1} , /obj/effect/turf_decal/tile/blue , /obj/effect/turf_decal/tile/yellow {dir=4} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/blueyellow/side {dir=6} : /obj/effect/turf_decal/tile/blue , /obj/effect/turf_decal/tile/yellow {dir=4} , /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/blueyellow/side {dir=8} : /obj/effect/turf_decal/tile/blue {dir=1} , /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/blueyellow/side {dir=9} : /obj/effect/turf_decal/tile/blue {dir=1} , /obj/effect/turf_decal/tile/yellow {dir=4} , /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/blueyellow/side {dir=10} : /obj/effect/turf_decal/tile/blue {dir=1} , /obj/effect/turf_decal/tile/blue , /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/brown {dir=1} : /obj/effect/turf_decal/tile/brown {dir=1} , /obj/effect/turf_decal/tile/brown {dir=4} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/brown {dir=@UNSET} : /obj/effect/turf_decal/tile/brown , /obj/effect/turf_decal/tile/brown {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/brown {dir=2} : /obj/effect/turf_decal/tile/brown , /obj/effect/turf_decal/tile/brown {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/brown {dir=4} : /obj/effect/turf_decal/tile/brown , /obj/effect/turf_decal/tile/brown {dir=4} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/brown {dir=5} : /obj/effect/turf_decal/tile/brown {dir=1} , /obj/effect/turf_decal/tile/brown , /obj/effect/turf_decal/tile/brown {dir=4} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/brown {dir=6} : /obj/effect/turf_decal/tile/brown , /obj/effect/turf_decal/tile/brown {dir=4} , /obj/effect/turf_decal/tile/brown {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/brown {dir=8} : /obj/effect/turf_decal/tile/brown {dir=1} , /obj/effect/turf_decal/tile/brown {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/brown {dir=9} : /obj/effect/turf_decal/tile/brown {dir=1} , /obj/effect/turf_decal/tile/brown {dir=4} , /obj/effect/turf_decal/tile/brown {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/brown {dir=10} : /obj/effect/turf_decal/tile/brown {dir=1} , /obj/effect/turf_decal/tile/brown , /obj/effect/turf_decal/tile/brown {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/brown/corner : /obj/effect/turf_decal/tile/brown {dir=@OLD} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/brown/telecomms {dir=1} : /obj/effect/turf_decal/tile/brown {dir=1} , /obj/effect/turf_decal/tile/brown {dir=4} , /turf/open/floor/plasteel/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/brown/telecomms {dir=@UNSET} : /obj/effect/turf_decal/tile/brown , /obj/effect/turf_decal/tile/brown {dir=8} , /turf/open/floor/plasteel/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/brown/telecomms {dir=2} : /obj/effect/turf_decal/tile/brown , /obj/effect/turf_decal/tile/brown {dir=8} , /turf/open/floor/plasteel/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/brown/telecomms {dir=4} : /obj/effect/turf_decal/tile/brown , /obj/effect/turf_decal/tile/brown {dir=4} , /turf/open/floor/plasteel/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/brown/telecomms {dir=5} : /obj/effect/turf_decal/tile/brown {dir=1} , /obj/effect/turf_decal/tile/brown , /obj/effect/turf_decal/tile/brown {dir=4} , /turf/open/floor/plasteel/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/brown/telecomms {dir=6} : /obj/effect/turf_decal/tile/brown , /obj/effect/turf_decal/tile/brown {dir=4} , /obj/effect/turf_decal/tile/brown {dir=8} , /turf/open/floor/plasteel/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/brown/telecomms {dir=8} : /obj/effect/turf_decal/tile/brown {dir=1} , /obj/effect/turf_decal/tile/brown {dir=8} , /turf/open/floor/plasteel/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/brown/telecomms {dir=9} : /obj/effect/turf_decal/tile/brown {dir=1} , /obj/effect/turf_decal/tile/brown {dir=4} , /obj/effect/turf_decal/tile/brown {dir=8} , /turf/open/floor/plasteel/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/brown/telecomms {dir=10} : /obj/effect/turf_decal/tile/brown {dir=1} , /obj/effect/turf_decal/tile/brown , /obj/effect/turf_decal/tile/brown {dir=8} , /turf/open/floor/plasteel/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/brown/telecomms/mainframe {dir=1} : /obj/effect/turf_decal/tile/brown {dir=1} , /obj/effect/turf_decal/tile/brown {dir=4} , /turf/open/floor/plasteel/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/brown/telecomms/mainframe {dir=@UNSET} : /obj/effect/turf_decal/tile/brown , /obj/effect/turf_decal/tile/brown {dir=8} , /turf/open/floor/plasteel/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/brown/telecomms/mainframe {dir=2} : /obj/effect/turf_decal/tile/brown , /obj/effect/turf_decal/tile/brown {dir=8} , /turf/open/floor/plasteel/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/brown/telecomms/mainframe {dir=4} : /obj/effect/turf_decal/tile/brown , /obj/effect/turf_decal/tile/brown {dir=4} , /turf/open/floor/plasteel/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/brown/telecomms/mainframe {dir=5} : /obj/effect/turf_decal/tile/brown {dir=1} , /obj/effect/turf_decal/tile/brown , /obj/effect/turf_decal/tile/brown {dir=4} , /turf/open/floor/plasteel/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/brown/telecomms/mainframe {dir=6} : /obj/effect/turf_decal/tile/brown , /obj/effect/turf_decal/tile/brown {dir=4} , /obj/effect/turf_decal/tile/brown {dir=8} , /turf/open/floor/plasteel/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/brown/telecomms/mainframe {dir=8} : /obj/effect/turf_decal/tile/brown {dir=1} , /obj/effect/turf_decal/tile/brown {dir=8} , /turf/open/floor/plasteel/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/brown/telecomms/mainframe {dir=9} : /obj/effect/turf_decal/tile/brown {dir=1} , /obj/effect/turf_decal/tile/brown {dir=4} , /obj/effect/turf_decal/tile/brown {dir=8} , /turf/open/floor/plasteel/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/brown/telecomms/mainframe {dir=10} : /obj/effect/turf_decal/tile/brown {dir=1} , /obj/effect/turf_decal/tile/brown , /obj/effect/turf_decal/tile/brown {dir=8} , /turf/open/floor/plasteel/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/brownold {dir=1} : /obj/effect/turf_decal/tile/brown {dir=1} , /obj/effect/turf_decal/tile/brown {dir=4} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/brownold {dir=@UNSET} : /obj/effect/turf_decal/tile/brown , /obj/effect/turf_decal/tile/brown {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/brownold {dir=2} : /obj/effect/turf_decal/tile/brown , /obj/effect/turf_decal/tile/brown {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/brownold {dir=4} : /obj/effect/turf_decal/tile/brown , /obj/effect/turf_decal/tile/brown {dir=4} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/brownold {dir=5} : /obj/effect/turf_decal/tile/brown {dir=1} , /obj/effect/turf_decal/tile/brown , /obj/effect/turf_decal/tile/brown {dir=4} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/brownold {dir=6} : /obj/effect/turf_decal/tile/brown , /obj/effect/turf_decal/tile/brown {dir=4} , /obj/effect/turf_decal/tile/brown {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/brownold {dir=8} : /obj/effect/turf_decal/tile/brown {dir=1} , /obj/effect/turf_decal/tile/brown {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/brownold {dir=9} : /obj/effect/turf_decal/tile/brown {dir=1} , /obj/effect/turf_decal/tile/brown {dir=4} , /obj/effect/turf_decal/tile/brown {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/brownold {dir=10} : /obj/effect/turf_decal/tile/brown {dir=1} , /obj/effect/turf_decal/tile/brown , /obj/effect/turf_decal/tile/brown {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/brownold/corner : /obj/effect/turf_decal/tile/brown {dir=@OLD} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/caution {dir=1} : /obj/effect/turf_decal/tile/yellow {dir=4} , /turf/open/floor/plasteel/dark/corner {@OLD;dir=1} +/turf/open/floor/plasteel/caution {dir=@UNSET} : /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel/dark/corner {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/caution {dir=2} : /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel/dark/corner {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/caution {dir=4} : /obj/effect/turf_decal/tile/yellow {dir=4} , /turf/open/floor/plasteel/dark/corner {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/caution {dir=5} : /obj/effect/turf_decal/tile/yellow {dir=4} , /turf/open/floor/plasteel/checker {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/caution {dir=6} : /obj/effect/turf_decal/tile/yellow {dir=4} , /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel/dark/corner {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/caution {dir=8} : /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel/dark/corner {@OLD;dir=1} +/turf/open/floor/plasteel/caution {dir=9} : /obj/effect/turf_decal/tile/yellow {dir=4} , /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel/dark/corner {@OLD;dir=1} +/turf/open/floor/plasteel/caution {dir=10} : /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel/checker {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/caution/corner {dir=1} : /turf/open/floor/plasteel/dark/corner {@OLD} +/turf/open/floor/plasteel/caution/corner {dir=@UNSET} : /turf/open/floor/plasteel/dark/corner {@OLD} +/turf/open/floor/plasteel/caution/corner {dir=2} : /turf/open/floor/plasteel/dark/corner {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/caution/corner {dir=4} : /obj/effect/turf_decal/tile/yellow {dir=@OLD} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/caution/corner {dir=8} : /obj/effect/turf_decal/tile/yellow {dir=@OLD} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/cmo : /obj/effect/turf_decal/tile/blue {dir=4} , /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/dark/telecomms/mainframe : /turf/open/floor/plasteel/dark/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/dark/telecomms/server : /turf/open/floor/plasteel/dark/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/dark/telecomms/server/walkway : /turf/open/floor/plasteel/dark/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkblue : /obj/effect/turf_decal/tile/blue {dir=1} , /obj/effect/turf_decal/tile/blue , /obj/effect/turf_decal/tile/blue {dir=4} , /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkblue/side {dir=1} : /obj/effect/turf_decal/tile/blue {dir=1} , /obj/effect/turf_decal/tile/blue {dir=4} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkblue/side {dir=@UNSET} : /obj/effect/turf_decal/tile/blue , /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkblue/side {dir=2} : /obj/effect/turf_decal/tile/blue , /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkblue/side {dir=4} : /obj/effect/turf_decal/tile/blue , /obj/effect/turf_decal/tile/blue {dir=4} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkblue/side {dir=5} : /obj/effect/turf_decal/tile/blue {dir=1} , /obj/effect/turf_decal/tile/blue , /obj/effect/turf_decal/tile/blue {dir=4} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkblue/side {dir=6} : /obj/effect/turf_decal/tile/blue , /obj/effect/turf_decal/tile/blue {dir=4} , /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkblue/side {dir=8} : /obj/effect/turf_decal/tile/blue {dir=1} , /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkblue/side {dir=9} : /obj/effect/turf_decal/tile/blue {dir=1} , /obj/effect/turf_decal/tile/blue {dir=4} , /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkblue/side {dir=10} : /obj/effect/turf_decal/tile/blue {dir=1} , /obj/effect/turf_decal/tile/blue , /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkblue/corner : /obj/effect/turf_decal/tile/blue {dir=@OLD} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkblue/side/telecomms {dir=1} : /obj/effect/turf_decal/tile/blue {dir=1} , /obj/effect/turf_decal/tile/blue {dir=4} , /turf/open/floor/plasteel/dark/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkblue/side/telecomms {dir=@UNSET} : /obj/effect/turf_decal/tile/blue , /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel/dark/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkblue/side/telecomms {dir=2} : /obj/effect/turf_decal/tile/blue , /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel/dark/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkblue/side/telecomms {dir=4} : /obj/effect/turf_decal/tile/blue , /obj/effect/turf_decal/tile/blue {dir=4} , /turf/open/floor/plasteel/dark/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkblue/side/telecomms {dir=5} : /obj/effect/turf_decal/tile/blue {dir=1} , /obj/effect/turf_decal/tile/blue , /obj/effect/turf_decal/tile/blue {dir=4} , /turf/open/floor/plasteel/dark/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkblue/side/telecomms {dir=6} : /obj/effect/turf_decal/tile/blue , /obj/effect/turf_decal/tile/blue {dir=4} , /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel/dark/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkblue/side/telecomms {dir=8} : /obj/effect/turf_decal/tile/blue {dir=1} , /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel/dark/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkblue/side/telecomms {dir=9} : /obj/effect/turf_decal/tile/blue {dir=1} , /obj/effect/turf_decal/tile/blue {dir=4} , /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel/dark/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkblue/side/telecomms {dir=10} : /obj/effect/turf_decal/tile/blue {dir=1} , /obj/effect/turf_decal/tile/blue , /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel/dark/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkbrown : /obj/effect/turf_decal/tile/brown {dir=1} , /obj/effect/turf_decal/tile/brown , /obj/effect/turf_decal/tile/brown {dir=4} , /obj/effect/turf_decal/tile/brown {dir=8} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkbrown/side {dir=1} : /obj/effect/turf_decal/tile/brown {dir=1} , /obj/effect/turf_decal/tile/brown {dir=4} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkbrown/side {dir=@UNSET} : /obj/effect/turf_decal/tile/brown , /obj/effect/turf_decal/tile/brown {dir=8} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkbrown/side {dir=2} : /obj/effect/turf_decal/tile/brown , /obj/effect/turf_decal/tile/brown {dir=8} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkbrown/side {dir=4} : /obj/effect/turf_decal/tile/brown , /obj/effect/turf_decal/tile/brown {dir=4} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkbrown/side {dir=5} : /obj/effect/turf_decal/tile/brown {dir=1} , /obj/effect/turf_decal/tile/brown , /obj/effect/turf_decal/tile/brown {dir=4} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkbrown/side {dir=6} : /obj/effect/turf_decal/tile/brown , /obj/effect/turf_decal/tile/brown {dir=4} , /obj/effect/turf_decal/tile/brown {dir=8} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkbrown/side {dir=8} : /obj/effect/turf_decal/tile/brown {dir=1} , /obj/effect/turf_decal/tile/brown {dir=8} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkbrown/side {dir=9} : /obj/effect/turf_decal/tile/brown {dir=1} , /obj/effect/turf_decal/tile/brown {dir=4} , /obj/effect/turf_decal/tile/brown {dir=8} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkbrown/side {dir=10} : /obj/effect/turf_decal/tile/brown {dir=1} , /obj/effect/turf_decal/tile/brown , /obj/effect/turf_decal/tile/brown {dir=8} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkbrown/corner : /obj/effect/turf_decal/tile/brown {dir=@OLD} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkgreen : /obj/effect/turf_decal/tile/green {dir=1} , /obj/effect/turf_decal/tile/green , /obj/effect/turf_decal/tile/green {dir=4} , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkgreen/side {dir=1} : /obj/effect/turf_decal/tile/green {dir=1} , /obj/effect/turf_decal/tile/green {dir=4} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkgreen/side {dir=@UNSET} : /obj/effect/turf_decal/tile/green , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkgreen/side {dir=2} : /obj/effect/turf_decal/tile/green , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkgreen/side {dir=4} : /obj/effect/turf_decal/tile/green , /obj/effect/turf_decal/tile/green {dir=4} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkgreen/side {dir=5} : /obj/effect/turf_decal/tile/green {dir=1} , /obj/effect/turf_decal/tile/green , /obj/effect/turf_decal/tile/green {dir=4} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkgreen/side {dir=6} : /obj/effect/turf_decal/tile/green , /obj/effect/turf_decal/tile/green {dir=4} , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkgreen/side {dir=8} : /obj/effect/turf_decal/tile/green {dir=1} , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkgreen/side {dir=9} : /obj/effect/turf_decal/tile/green {dir=1} , /obj/effect/turf_decal/tile/green {dir=4} , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkgreen/side {dir=10} : /obj/effect/turf_decal/tile/green {dir=1} , /obj/effect/turf_decal/tile/green , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkgreen/corner : /obj/effect/turf_decal/tile/green {dir=@OLD} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkgreen/side/telecomms {dir=1} : /obj/effect/turf_decal/tile/green {dir=1} , /obj/effect/turf_decal/tile/green {dir=4} , /turf/open/floor/plasteel/dark/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkgreen/side/telecomms {dir=@UNSET} : /obj/effect/turf_decal/tile/green , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel/dark/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkgreen/side/telecomms {dir=2} : /obj/effect/turf_decal/tile/green , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel/dark/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkgreen/side/telecomms {dir=4} : /obj/effect/turf_decal/tile/green , /obj/effect/turf_decal/tile/green {dir=4} , /turf/open/floor/plasteel/dark/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkgreen/side/telecomms {dir=5} : /obj/effect/turf_decal/tile/green {dir=1} , /obj/effect/turf_decal/tile/green , /obj/effect/turf_decal/tile/green {dir=4} , /turf/open/floor/plasteel/dark/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkgreen/side/telecomms {dir=6} : /obj/effect/turf_decal/tile/green , /obj/effect/turf_decal/tile/green {dir=4} , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel/dark/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkgreen/side/telecomms {dir=8} : /obj/effect/turf_decal/tile/green {dir=1} , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel/dark/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkgreen/side/telecomms {dir=9} : /obj/effect/turf_decal/tile/green {dir=1} , /obj/effect/turf_decal/tile/green {dir=4} , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel/dark/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkgreen/side/telecomms {dir=10} : /obj/effect/turf_decal/tile/green {dir=1} , /obj/effect/turf_decal/tile/green , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel/dark/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkpurple : /obj/effect/turf_decal/tile/purple {dir=1} , /obj/effect/turf_decal/tile/purple , /obj/effect/turf_decal/tile/purple {dir=4} , /obj/effect/turf_decal/tile/purple {dir=8} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkpurple/side {dir=1} : /obj/effect/turf_decal/tile/purple {dir=1} , /obj/effect/turf_decal/tile/purple {dir=4} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkpurple/side {dir=@UNSET} : /obj/effect/turf_decal/tile/purple , /obj/effect/turf_decal/tile/purple {dir=8} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkpurple/side {dir=2} : /obj/effect/turf_decal/tile/purple , /obj/effect/turf_decal/tile/purple {dir=8} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkpurple/side {dir=4} : /obj/effect/turf_decal/tile/purple , /obj/effect/turf_decal/tile/purple {dir=4} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkpurple/side {dir=5} : /obj/effect/turf_decal/tile/purple {dir=1} , /obj/effect/turf_decal/tile/purple , /obj/effect/turf_decal/tile/purple {dir=4} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkpurple/side {dir=6} : /obj/effect/turf_decal/tile/purple , /obj/effect/turf_decal/tile/purple {dir=4} , /obj/effect/turf_decal/tile/purple {dir=8} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkpurple/side {dir=8} : /obj/effect/turf_decal/tile/purple {dir=1} , /obj/effect/turf_decal/tile/purple {dir=8} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkpurple/side {dir=9} : /obj/effect/turf_decal/tile/purple {dir=1} , /obj/effect/turf_decal/tile/purple {dir=4} , /obj/effect/turf_decal/tile/purple {dir=8} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkpurple/side {dir=10} : /obj/effect/turf_decal/tile/purple {dir=1} , /obj/effect/turf_decal/tile/purple , /obj/effect/turf_decal/tile/purple {dir=8} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkpurple/corner : /obj/effect/turf_decal/tile/purple {dir=@OLD} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkpurple/side/telecomms {dir=1} : /obj/effect/turf_decal/tile/purple {dir=1} , /obj/effect/turf_decal/tile/purple {dir=4} , /turf/open/floor/plasteel/dark/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkpurple/side/telecomms {dir=@UNSET} : /obj/effect/turf_decal/tile/purple , /obj/effect/turf_decal/tile/purple {dir=8} , /turf/open/floor/plasteel/dark/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkpurple/side/telecomms {dir=2} : /obj/effect/turf_decal/tile/purple , /obj/effect/turf_decal/tile/purple {dir=8} , /turf/open/floor/plasteel/dark/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkpurple/side/telecomms {dir=4} : /obj/effect/turf_decal/tile/purple , /obj/effect/turf_decal/tile/purple {dir=4} , /turf/open/floor/plasteel/dark/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkpurple/side/telecomms {dir=5} : /obj/effect/turf_decal/tile/purple {dir=1} , /obj/effect/turf_decal/tile/purple , /obj/effect/turf_decal/tile/purple {dir=4} , /turf/open/floor/plasteel/dark/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkpurple/side/telecomms {dir=6} : /obj/effect/turf_decal/tile/purple , /obj/effect/turf_decal/tile/purple {dir=4} , /obj/effect/turf_decal/tile/purple {dir=8} , /turf/open/floor/plasteel/dark/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkpurple/side/telecomms {dir=8} : /obj/effect/turf_decal/tile/purple {dir=1} , /obj/effect/turf_decal/tile/purple {dir=8} , /turf/open/floor/plasteel/dark/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkpurple/side/telecomms {dir=9} : /obj/effect/turf_decal/tile/purple {dir=1} , /obj/effect/turf_decal/tile/purple {dir=4} , /obj/effect/turf_decal/tile/purple {dir=8} , /turf/open/floor/plasteel/dark/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkpurple/side/telecomms {dir=10} : /obj/effect/turf_decal/tile/purple {dir=1} , /obj/effect/turf_decal/tile/purple , /obj/effect/turf_decal/tile/purple {dir=8} , /turf/open/floor/plasteel/dark/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkred : /obj/effect/turf_decal/tile/red {dir=1} , /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/red {dir=4} , /obj/effect/turf_decal/tile/red {dir=8} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkred/side {dir=1} : /obj/effect/turf_decal/tile/red {dir=1} , /obj/effect/turf_decal/tile/red {dir=4} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkred/side {dir=@UNSET} : /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/red {dir=8} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkred/side {dir=2} : /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/red {dir=8} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkred/side {dir=4} : /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/red {dir=4} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkred/side {dir=5} : /obj/effect/turf_decal/tile/red {dir=1} , /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/red {dir=4} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkred/side {dir=6} : /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/red {dir=4} , /obj/effect/turf_decal/tile/red {dir=8} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkred/side {dir=8} : /obj/effect/turf_decal/tile/red {dir=1} , /obj/effect/turf_decal/tile/red {dir=8} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkred/side {dir=9} : /obj/effect/turf_decal/tile/red {dir=1} , /obj/effect/turf_decal/tile/red {dir=4} , /obj/effect/turf_decal/tile/red {dir=8} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkred/side {dir=10} : /obj/effect/turf_decal/tile/red {dir=1} , /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/red {dir=8} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkred/corner : /obj/effect/turf_decal/tile/red {dir=@OLD} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkred/side/telecomms {dir=1} : /obj/effect/turf_decal/tile/red {dir=1} , /obj/effect/turf_decal/tile/red {dir=4} , /turf/open/floor/plasteel/dark/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkred/side/telecomms {dir=@UNSET} : /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/red {dir=8} , /turf/open/floor/plasteel/dark/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkred/side/telecomms {dir=2} : /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/red {dir=8} , /turf/open/floor/plasteel/dark/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkred/side/telecomms {dir=4} : /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/red {dir=4} , /turf/open/floor/plasteel/dark/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkred/side/telecomms {dir=5} : /obj/effect/turf_decal/tile/red {dir=1} , /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/red {dir=4} , /turf/open/floor/plasteel/dark/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkred/side/telecomms {dir=6} : /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/red {dir=4} , /obj/effect/turf_decal/tile/red {dir=8} , /turf/open/floor/plasteel/dark/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkred/side/telecomms {dir=8} : /obj/effect/turf_decal/tile/red {dir=1} , /obj/effect/turf_decal/tile/red {dir=8} , /turf/open/floor/plasteel/dark/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkred/side/telecomms {dir=9} : /obj/effect/turf_decal/tile/red {dir=1} , /obj/effect/turf_decal/tile/red {dir=4} , /obj/effect/turf_decal/tile/red {dir=8} , /turf/open/floor/plasteel/dark/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkred/side/telecomms {dir=10} : /obj/effect/turf_decal/tile/red {dir=1} , /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/red {dir=8} , /turf/open/floor/plasteel/dark/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkyellow : /obj/effect/turf_decal/tile/yellow {dir=1} , /obj/effect/turf_decal/tile/yellow , /obj/effect/turf_decal/tile/yellow {dir=4} , /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkyellow/side {dir=1} : /obj/effect/turf_decal/tile/yellow {dir=1} , /obj/effect/turf_decal/tile/yellow {dir=4} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkyellow/side {dir=@UNSET} : /obj/effect/turf_decal/tile/yellow , /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkyellow/side {dir=2} : /obj/effect/turf_decal/tile/yellow , /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkyellow/side {dir=4} : /obj/effect/turf_decal/tile/yellow , /obj/effect/turf_decal/tile/yellow {dir=4} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkyellow/side {dir=5} : /obj/effect/turf_decal/tile/yellow {dir=1} , /obj/effect/turf_decal/tile/yellow , /obj/effect/turf_decal/tile/yellow {dir=4} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkyellow/side {dir=6} : /obj/effect/turf_decal/tile/yellow , /obj/effect/turf_decal/tile/yellow {dir=4} , /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkyellow/side {dir=8} : /obj/effect/turf_decal/tile/yellow {dir=1} , /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkyellow/side {dir=9} : /obj/effect/turf_decal/tile/yellow {dir=1} , /obj/effect/turf_decal/tile/yellow {dir=4} , /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkyellow/side {dir=10} : /obj/effect/turf_decal/tile/yellow {dir=1} , /obj/effect/turf_decal/tile/yellow , /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkyellow/corner : /obj/effect/turf_decal/tile/yellow {dir=@OLD} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkyellow/side/telecomms {dir=1} : /obj/effect/turf_decal/tile/yellow {dir=1} , /obj/effect/turf_decal/tile/yellow {dir=4} , /turf/open/floor/plasteel/dark/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkyellow/side/telecomms {dir=@UNSET} : /obj/effect/turf_decal/tile/yellow , /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel/dark/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkyellow/side/telecomms {dir=2} : /obj/effect/turf_decal/tile/yellow , /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel/dark/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkyellow/side/telecomms {dir=4} : /obj/effect/turf_decal/tile/yellow , /obj/effect/turf_decal/tile/yellow {dir=4} , /turf/open/floor/plasteel/dark/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkyellow/side/telecomms {dir=5} : /obj/effect/turf_decal/tile/yellow {dir=1} , /obj/effect/turf_decal/tile/yellow , /obj/effect/turf_decal/tile/yellow {dir=4} , /turf/open/floor/plasteel/dark/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkyellow/side/telecomms {dir=6} : /obj/effect/turf_decal/tile/yellow , /obj/effect/turf_decal/tile/yellow {dir=4} , /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel/dark/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkyellow/side/telecomms {dir=8} : /obj/effect/turf_decal/tile/yellow {dir=1} , /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel/dark/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkyellow/side/telecomms {dir=9} : /obj/effect/turf_decal/tile/yellow {dir=1} , /obj/effect/turf_decal/tile/yellow {dir=4} , /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel/dark/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/darkyellow/side/telecomms {dir=10} : /obj/effect/turf_decal/tile/yellow {dir=1} , /obj/effect/turf_decal/tile/yellow , /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel/dark/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/escape {dir=1} : /obj/effect/turf_decal/tile/red {dir=4} , /turf/open/floor/plasteel/white/corner {@OLD;dir=1} +/turf/open/floor/plasteel/escape {dir=@UNSET} : /obj/effect/turf_decal/tile/red {dir=8} , /turf/open/floor/plasteel/white/corner {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/escape {dir=2} : /obj/effect/turf_decal/tile/red {dir=8} , /turf/open/floor/plasteel/white/corner {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/escape {dir=4} : /obj/effect/turf_decal/tile/red {dir=4} , /turf/open/floor/plasteel/white/corner {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/escape {dir=5} : /obj/effect/turf_decal/tile/red {dir=4} , /turf/open/floor/plasteel/cafeteria {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/escape {dir=6} : /obj/effect/turf_decal/tile/red {dir=4} , /obj/effect/turf_decal/tile/red {dir=8} , /turf/open/floor/plasteel/white/corner {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/escape {dir=8} : /obj/effect/turf_decal/tile/red {dir=8} , /turf/open/floor/plasteel/white/corner {@OLD;dir=1} +/turf/open/floor/plasteel/escape {dir=9} : /obj/effect/turf_decal/tile/red {dir=4} , /obj/effect/turf_decal/tile/red {dir=8} , /turf/open/floor/plasteel/white/corner {@OLD;dir=1} +/turf/open/floor/plasteel/escape {dir=10} : /obj/effect/turf_decal/tile/red {dir=8} , /turf/open/floor/plasteel/cafeteria {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/escape/corner {dir=1} : /turf/open/floor/plasteel/white/corner {@OLD} +/turf/open/floor/plasteel/escape/corner {dir=@UNSET} : /turf/open/floor/plasteel/white/corner {@OLD} +/turf/open/floor/plasteel/escape/corner {dir=2} : /turf/open/floor/plasteel/white/corner {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/escape/corner {dir=4} : /obj/effect/turf_decal/tile/red {dir=@OLD} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/escape/corner {dir=8} : /obj/effect/turf_decal/tile/red {dir=@OLD} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/green : /obj/effect/turf_decal/tile/green {dir=1} , /obj/effect/turf_decal/tile/green , /obj/effect/turf_decal/tile/green {dir=4} , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/green/side {dir=1} : /obj/effect/turf_decal/tile/green {dir=1} , /obj/effect/turf_decal/tile/green {dir=4} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/green/side {dir=@UNSET} : /obj/effect/turf_decal/tile/green , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/green/side {dir=2} : /obj/effect/turf_decal/tile/green , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/green/side {dir=4} : /obj/effect/turf_decal/tile/green , /obj/effect/turf_decal/tile/green {dir=4} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/green/side {dir=5} : /obj/effect/turf_decal/tile/green {dir=1} , /obj/effect/turf_decal/tile/green , /obj/effect/turf_decal/tile/green {dir=4} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/green/side {dir=6} : /obj/effect/turf_decal/tile/green , /obj/effect/turf_decal/tile/green {dir=4} , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/green/side {dir=8} : /obj/effect/turf_decal/tile/green {dir=1} , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/green/side {dir=9} : /obj/effect/turf_decal/tile/green {dir=1} , /obj/effect/turf_decal/tile/green {dir=4} , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/green/side {dir=10} : /obj/effect/turf_decal/tile/green {dir=1} , /obj/effect/turf_decal/tile/green , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/green/corner : /obj/effect/turf_decal/tile/green {dir=@OLD} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/green/side/telecomms {dir=1} : /obj/effect/turf_decal/tile/green {dir=1} , /obj/effect/turf_decal/tile/green {dir=4} , /turf/open/floor/plasteel/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/green/side/telecomms {dir=@UNSET} : /obj/effect/turf_decal/tile/green , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/green/side/telecomms {dir=2} : /obj/effect/turf_decal/tile/green , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/green/side/telecomms {dir=4} : /obj/effect/turf_decal/tile/green , /obj/effect/turf_decal/tile/green {dir=4} , /turf/open/floor/plasteel/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/green/side/telecomms {dir=5} : /obj/effect/turf_decal/tile/green {dir=1} , /obj/effect/turf_decal/tile/green , /obj/effect/turf_decal/tile/green {dir=4} , /turf/open/floor/plasteel/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/green/side/telecomms {dir=6} : /obj/effect/turf_decal/tile/green , /obj/effect/turf_decal/tile/green {dir=4} , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/green/side/telecomms {dir=8} : /obj/effect/turf_decal/tile/green {dir=1} , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/green/side/telecomms {dir=9} : /obj/effect/turf_decal/tile/green {dir=1} , /obj/effect/turf_decal/tile/green {dir=4} , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/green/side/telecomms {dir=10} : /obj/effect/turf_decal/tile/green {dir=1} , /obj/effect/turf_decal/tile/green , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/greenblue : /obj/effect/turf_decal/tile/blue {dir=1} , /obj/effect/turf_decal/tile/blue , /obj/effect/turf_decal/tile/green {dir=4} , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/greenblue/side {dir=1} : /obj/effect/turf_decal/tile/blue {dir=1} , /obj/effect/turf_decal/tile/green {dir=4} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/greenblue/side {dir=@UNSET} : /obj/effect/turf_decal/tile/blue , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/greenblue/side {dir=2} : /obj/effect/turf_decal/tile/blue , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/greenblue/side {dir=4} : /obj/effect/turf_decal/tile/blue , /obj/effect/turf_decal/tile/green {dir=4} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/greenblue/side {dir=5} : /obj/effect/turf_decal/tile/blue {dir=1} , /obj/effect/turf_decal/tile/blue , /obj/effect/turf_decal/tile/green {dir=4} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/greenblue/side {dir=6} : /obj/effect/turf_decal/tile/blue , /obj/effect/turf_decal/tile/green {dir=4} , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/greenblue/side {dir=8} : /obj/effect/turf_decal/tile/blue {dir=1} , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/greenblue/side {dir=9} : /obj/effect/turf_decal/tile/blue {dir=1} , /obj/effect/turf_decal/tile/green {dir=4} , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/greenblue/side {dir=10} : /obj/effect/turf_decal/tile/blue {dir=1} , /obj/effect/turf_decal/tile/blue , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/greenyellow : /obj/effect/turf_decal/tile/yellow {dir=1} , /obj/effect/turf_decal/tile/yellow , /obj/effect/turf_decal/tile/green {dir=4} , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/greenyellow/side {dir=1} : /obj/effect/turf_decal/tile/yellow {dir=1} , /obj/effect/turf_decal/tile/green {dir=4} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/greenyellow/side {dir=@UNSET} : /obj/effect/turf_decal/tile/yellow , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/greenyellow/side {dir=2} : /obj/effect/turf_decal/tile/yellow , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/greenyellow/side {dir=4} : /obj/effect/turf_decal/tile/yellow , /obj/effect/turf_decal/tile/green {dir=4} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/greenyellow/side {dir=5} : /obj/effect/turf_decal/tile/yellow {dir=1} , /obj/effect/turf_decal/tile/yellow , /obj/effect/turf_decal/tile/green {dir=4} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/greenyellow/side {dir=6} : /obj/effect/turf_decal/tile/yellow , /obj/effect/turf_decal/tile/green {dir=4} , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/greenyellow/side {dir=8} : /obj/effect/turf_decal/tile/yellow {dir=1} , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/greenyellow/side {dir=9} : /obj/effect/turf_decal/tile/yellow {dir=1} , /obj/effect/turf_decal/tile/green {dir=4} , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/greenyellow/side {dir=10} : /obj/effect/turf_decal/tile/yellow {dir=1} , /obj/effect/turf_decal/tile/yellow , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/hydrofloor : /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/neutral : /obj/effect/turf_decal/tile/neutral {dir=1} , /obj/effect/turf_decal/tile/neutral , /obj/effect/turf_decal/tile/neutral {dir=4} , /obj/effect/turf_decal/tile/neutral {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/neutral/side {dir=1} : /obj/effect/turf_decal/tile/neutral {dir=1} , /obj/effect/turf_decal/tile/neutral {dir=4} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/neutral/side {dir=@UNSET} : /obj/effect/turf_decal/tile/neutral , /obj/effect/turf_decal/tile/neutral {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/neutral/side {dir=2} : /obj/effect/turf_decal/tile/neutral , /obj/effect/turf_decal/tile/neutral {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/neutral/side {dir=4} : /obj/effect/turf_decal/tile/neutral , /obj/effect/turf_decal/tile/neutral {dir=4} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/neutral/side {dir=5} : /obj/effect/turf_decal/tile/neutral {dir=1} , /obj/effect/turf_decal/tile/neutral , /obj/effect/turf_decal/tile/neutral {dir=4} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/neutral/side {dir=6} : /obj/effect/turf_decal/tile/neutral , /obj/effect/turf_decal/tile/neutral {dir=4} , /obj/effect/turf_decal/tile/neutral {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/neutral/side {dir=8} : /obj/effect/turf_decal/tile/neutral {dir=1} , /obj/effect/turf_decal/tile/neutral {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/neutral/side {dir=9} : /obj/effect/turf_decal/tile/neutral {dir=1} , /obj/effect/turf_decal/tile/neutral {dir=4} , /obj/effect/turf_decal/tile/neutral {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/neutral/side {dir=10} : /obj/effect/turf_decal/tile/neutral {dir=1} , /obj/effect/turf_decal/tile/neutral , /obj/effect/turf_decal/tile/neutral {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/neutral/corner : /obj/effect/turf_decal/tile/neutral {dir=@OLD} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/neutral/side/telecomms {dir=1} : /obj/effect/turf_decal/tile/neutral {dir=1} , /obj/effect/turf_decal/tile/neutral {dir=4} , /turf/open/floor/plasteel/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/neutral/side/telecomms {dir=@UNSET} : /obj/effect/turf_decal/tile/neutral , /obj/effect/turf_decal/tile/neutral {dir=8} , /turf/open/floor/plasteel/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/neutral/side/telecomms {dir=2} : /obj/effect/turf_decal/tile/neutral , /obj/effect/turf_decal/tile/neutral {dir=8} , /turf/open/floor/plasteel/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/neutral/side/telecomms {dir=4} : /obj/effect/turf_decal/tile/neutral , /obj/effect/turf_decal/tile/neutral {dir=4} , /turf/open/floor/plasteel/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/neutral/side/telecomms {dir=5} : /obj/effect/turf_decal/tile/neutral {dir=1} , /obj/effect/turf_decal/tile/neutral , /obj/effect/turf_decal/tile/neutral {dir=4} , /turf/open/floor/plasteel/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/neutral/side/telecomms {dir=6} : /obj/effect/turf_decal/tile/neutral , /obj/effect/turf_decal/tile/neutral {dir=4} , /obj/effect/turf_decal/tile/neutral {dir=8} , /turf/open/floor/plasteel/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/neutral/side/telecomms {dir=8} : /obj/effect/turf_decal/tile/neutral {dir=1} , /obj/effect/turf_decal/tile/neutral {dir=8} , /turf/open/floor/plasteel/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/neutral/side/telecomms {dir=9} : /obj/effect/turf_decal/tile/neutral {dir=1} , /obj/effect/turf_decal/tile/neutral {dir=4} , /obj/effect/turf_decal/tile/neutral {dir=8} , /turf/open/floor/plasteel/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/neutral/side/telecomms {dir=10} : /obj/effect/turf_decal/tile/neutral {dir=1} , /obj/effect/turf_decal/tile/neutral , /obj/effect/turf_decal/tile/neutral {dir=8} , /turf/open/floor/plasteel/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/orange : /obj/effect/turf_decal/tile/yellow {dir=1} , /obj/effect/turf_decal/tile/yellow , /obj/effect/turf_decal/tile/yellow {dir=4} , /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/orange/side {dir=1} : /obj/effect/turf_decal/tile/yellow {dir=1} , /obj/effect/turf_decal/tile/yellow {dir=4} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/orange/side {dir=@UNSET} : /obj/effect/turf_decal/tile/yellow , /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/orange/side {dir=2} : /obj/effect/turf_decal/tile/yellow , /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/orange/side {dir=4} : /obj/effect/turf_decal/tile/yellow , /obj/effect/turf_decal/tile/yellow {dir=4} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/orange/side {dir=5} : /obj/effect/turf_decal/tile/yellow {dir=1} , /obj/effect/turf_decal/tile/yellow , /obj/effect/turf_decal/tile/yellow {dir=4} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/orange/side {dir=6} : /obj/effect/turf_decal/tile/yellow , /obj/effect/turf_decal/tile/yellow {dir=4} , /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/orange/side {dir=8} : /obj/effect/turf_decal/tile/yellow {dir=1} , /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/orange/side {dir=9} : /obj/effect/turf_decal/tile/yellow {dir=1} , /obj/effect/turf_decal/tile/yellow {dir=4} , /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/orange/side {dir=10} : /obj/effect/turf_decal/tile/yellow {dir=1} , /obj/effect/turf_decal/tile/yellow , /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/orange/corner : /obj/effect/turf_decal/tile/yellow {dir=@OLD} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/purple : /obj/effect/turf_decal/tile/purple {dir=1} , /obj/effect/turf_decal/tile/purple , /obj/effect/turf_decal/tile/purple {dir=4} , /obj/effect/turf_decal/tile/purple {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/purple/side {dir=1} : /obj/effect/turf_decal/tile/purple {dir=1} , /obj/effect/turf_decal/tile/purple {dir=4} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/purple/side {dir=@UNSET} : /obj/effect/turf_decal/tile/purple , /obj/effect/turf_decal/tile/purple {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/purple/side {dir=2} : /obj/effect/turf_decal/tile/purple , /obj/effect/turf_decal/tile/purple {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/purple/side {dir=4} : /obj/effect/turf_decal/tile/purple , /obj/effect/turf_decal/tile/purple {dir=4} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/purple/side {dir=5} : /obj/effect/turf_decal/tile/purple {dir=1} , /obj/effect/turf_decal/tile/purple , /obj/effect/turf_decal/tile/purple {dir=4} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/purple/side {dir=6} : /obj/effect/turf_decal/tile/purple , /obj/effect/turf_decal/tile/purple {dir=4} , /obj/effect/turf_decal/tile/purple {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/purple/side {dir=8} : /obj/effect/turf_decal/tile/purple {dir=1} , /obj/effect/turf_decal/tile/purple {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/purple/side {dir=9} : /obj/effect/turf_decal/tile/purple {dir=1} , /obj/effect/turf_decal/tile/purple {dir=4} , /obj/effect/turf_decal/tile/purple {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/purple/side {dir=10} : /obj/effect/turf_decal/tile/purple {dir=1} , /obj/effect/turf_decal/tile/purple , /obj/effect/turf_decal/tile/purple {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/purple/corner : /obj/effect/turf_decal/tile/purple {dir=@OLD} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/red : /obj/effect/turf_decal/tile/red {dir=1} , /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/red {dir=4} , /obj/effect/turf_decal/tile/red {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/red/side {dir=1} : /obj/effect/turf_decal/tile/red {dir=1} , /obj/effect/turf_decal/tile/red {dir=4} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/red/side {dir=@UNSET} : /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/red {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/red/side {dir=2} : /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/red {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/red/side {dir=4} : /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/red {dir=4} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/red/side {dir=5} : /obj/effect/turf_decal/tile/red {dir=1} , /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/red {dir=4} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/red/side {dir=6} : /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/red {dir=4} , /obj/effect/turf_decal/tile/red {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/red/side {dir=8} : /obj/effect/turf_decal/tile/red {dir=1} , /obj/effect/turf_decal/tile/red {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/red/side {dir=9} : /obj/effect/turf_decal/tile/red {dir=1} , /obj/effect/turf_decal/tile/red {dir=4} , /obj/effect/turf_decal/tile/red {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/red/side {dir=10} : /obj/effect/turf_decal/tile/red {dir=1} , /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/red {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/red/corner : /obj/effect/turf_decal/tile/red {dir=@OLD} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/redblue : /obj/effect/turf_decal/tile/red {dir=1} , /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/blue {dir=4} , /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/redblue/redside {dir=1} : /obj/effect/turf_decal/tile/red {dir=1} , /obj/effect/turf_decal/tile/blue {dir=4} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/redblue/redside {dir=@UNSET} : /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/redblue/redside {dir=2} : /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/redblue/redside {dir=4} : /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/blue {dir=4} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/redblue/redside {dir=5} : /obj/effect/turf_decal/tile/red {dir=1} , /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/blue {dir=4} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/redblue/redside {dir=6} : /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/blue {dir=4} , /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/redblue/redside {dir=8} : /obj/effect/turf_decal/tile/red {dir=1} , /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/redblue/redside {dir=9} : /obj/effect/turf_decal/tile/red {dir=1} , /obj/effect/turf_decal/tile/blue {dir=4} , /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/redblue/redside {dir=10} : /obj/effect/turf_decal/tile/red {dir=1} , /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/redblue/blueside {dir=1} : /obj/effect/turf_decal/tile/red {dir=1} , /obj/effect/turf_decal/tile/blue {dir=4} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/redblue/blueside {dir=@UNSET} : /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/redblue/blueside {dir=2} : /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/redblue/blueside {dir=4} : /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/blue {dir=4} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/redblue/blueside {dir=5} : /obj/effect/turf_decal/tile/red {dir=1} , /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/blue {dir=4} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/redblue/blueside {dir=6} : /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/blue {dir=4} , /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/redblue/blueside {dir=8} : /obj/effect/turf_decal/tile/red {dir=1} , /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/redblue/blueside {dir=9} : /obj/effect/turf_decal/tile/red {dir=1} , /obj/effect/turf_decal/tile/blue {dir=4} , /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/redblue/blueside {dir=10} : /obj/effect/turf_decal/tile/red {dir=1} , /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/redgreen : /obj/effect/turf_decal/tile/red {dir=1} , /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/green {dir=4} , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/redgreen/side {dir=1} : /obj/effect/turf_decal/tile/red {dir=1} , /obj/effect/turf_decal/tile/green {dir=4} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/redgreen/side {dir=@UNSET} : /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/redgreen/side {dir=2} : /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/redgreen/side {dir=4} : /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/green {dir=4} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/redgreen/side {dir=5} : /obj/effect/turf_decal/tile/red {dir=1} , /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/green {dir=4} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/redgreen/side {dir=6} : /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/green {dir=4} , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/redgreen/side {dir=8} : /obj/effect/turf_decal/tile/red {dir=1} , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/redgreen/side {dir=9} : /obj/effect/turf_decal/tile/red {dir=1} , /obj/effect/turf_decal/tile/green {dir=4} , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/redgreen/side {dir=10} : /obj/effect/turf_decal/tile/red {dir=1} , /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/redgreen : /obj/effect/turf_decal/tile/red {dir=1} , /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/green {dir=4} , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/redgreen/side {dir=1} : /obj/effect/turf_decal/tile/red {dir=1} , /obj/effect/turf_decal/tile/green {dir=4} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/redgreen/side {dir=@UNSET} : /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/redgreen/side {dir=2} : /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/redgreen/side {dir=4} : /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/green {dir=4} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/redgreen/side {dir=5} : /obj/effect/turf_decal/tile/red {dir=1} , /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/green {dir=4} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/redgreen/side {dir=6} : /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/green {dir=4} , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/redgreen/side {dir=8} : /obj/effect/turf_decal/tile/red {dir=1} , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/redgreen/side {dir=9} : /obj/effect/turf_decal/tile/red {dir=1} , /obj/effect/turf_decal/tile/green {dir=4} , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/redgreen/side {dir=10} : /obj/effect/turf_decal/tile/red {dir=1} , /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/redyellow : /obj/effect/turf_decal/tile/red {dir=1} , /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/yellow {dir=4} , /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/redyellow/side {dir=1} : /obj/effect/turf_decal/tile/red {dir=1} , /obj/effect/turf_decal/tile/yellow {dir=4} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/redyellow/side {dir=@UNSET} : /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/redyellow/side {dir=2} : /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/redyellow/side {dir=4} : /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/yellow {dir=4} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/redyellow/side {dir=5} : /obj/effect/turf_decal/tile/red {dir=1} , /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/yellow {dir=4} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/redyellow/side {dir=6} : /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/yellow {dir=4} , /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/redyellow/side {dir=8} : /obj/effect/turf_decal/tile/red {dir=1} , /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/redyellow/side {dir=9} : /obj/effect/turf_decal/tile/red {dir=1} , /obj/effect/turf_decal/tile/yellow {dir=4} , /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/redyellow/side {dir=10} : /obj/effect/turf_decal/tile/red {dir=1} , /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/vault : /obj/effect/turf_decal/tile/neutral {dir=1} , /obj/effect/turf_decal/tile/neutral , /obj/effect/turf_decal/tile/neutral {dir=4} , /obj/effect/turf_decal/tile/neutral {dir=8} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/vault/airless : /obj/effect/turf_decal/tile/neutral {dir=1} , /obj/effect/turf_decal/tile/neutral , /obj/effect/turf_decal/tile/neutral {dir=4} , /obj/effect/turf_decal/tile/neutral {dir=8} , /turf/open/floor/plasteel/dark/airless {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/vault/snowdin : /obj/effect/turf_decal/tile/neutral {dir=1} , /obj/effect/turf_decal/tile/neutral , /obj/effect/turf_decal/tile/neutral {dir=4} , /obj/effect/turf_decal/tile/neutral {dir=8} , /turf/open/floor/plasteel/dark/snowdin {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/vault/telecomms : /obj/effect/turf_decal/tile/neutral {dir=1} , /obj/effect/turf_decal/tile/neutral , /obj/effect/turf_decal/tile/neutral {dir=4} , /obj/effect/turf_decal/tile/neutral {dir=8} , /turf/open/floor/plasteel/dark/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/vault/telecomms/mainframe : /obj/effect/turf_decal/tile/neutral {dir=1} , /obj/effect/turf_decal/tile/neutral , /obj/effect/turf_decal/tile/neutral {dir=4} , /obj/effect/turf_decal/tile/neutral {dir=8} , /turf/open/floor/plasteel/dark/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/vault/killroom : /obj/effect/turf_decal/tile/neutral {dir=1} , /obj/effect/turf_decal/tile/neutral , /obj/effect/turf_decal/tile/neutral {dir=4} , /obj/effect/turf_decal/tile/neutral {dir=8} , /turf/open/floor/plasteel/dark/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/vault/side {dir=1} : /obj/effect/turf_decal/tile/neutral {dir=1} , /obj/effect/turf_decal/tile/neutral {dir=4} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/vault/side {dir=@UNSET} : /obj/effect/turf_decal/tile/neutral , /obj/effect/turf_decal/tile/neutral {dir=8} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/vault/side {dir=2} : /obj/effect/turf_decal/tile/neutral , /obj/effect/turf_decal/tile/neutral {dir=8} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/vault/side {dir=4} : /obj/effect/turf_decal/tile/neutral , /obj/effect/turf_decal/tile/neutral {dir=4} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/vault/side {dir=5} : /obj/effect/turf_decal/tile/neutral {dir=1} , /obj/effect/turf_decal/tile/neutral , /obj/effect/turf_decal/tile/neutral {dir=4} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/vault/side {dir=6} : /obj/effect/turf_decal/tile/neutral , /obj/effect/turf_decal/tile/neutral {dir=4} , /obj/effect/turf_decal/tile/neutral {dir=8} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/vault/side {dir=8} : /obj/effect/turf_decal/tile/neutral {dir=1} , /obj/effect/turf_decal/tile/neutral {dir=8} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/vault/side {dir=9} : /obj/effect/turf_decal/tile/neutral {dir=1} , /obj/effect/turf_decal/tile/neutral {dir=4} , /obj/effect/turf_decal/tile/neutral {dir=8} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/vault/side {dir=10} : /obj/effect/turf_decal/tile/neutral {dir=1} , /obj/effect/turf_decal/tile/neutral , /obj/effect/turf_decal/tile/neutral {dir=8} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/vault/corner : /obj/effect/turf_decal/tile/neutral {dir=@OLD} , /turf/open/floor/plasteel/dark {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whiteblue : /obj/effect/turf_decal/tile/blue {dir=1} , /obj/effect/turf_decal/tile/blue , /obj/effect/turf_decal/tile/blue {dir=4} , /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whiteblue/side {dir=1} : /obj/effect/turf_decal/tile/blue {dir=1} , /obj/effect/turf_decal/tile/blue {dir=4} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whiteblue/side {dir=@UNSET} : /obj/effect/turf_decal/tile/blue , /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whiteblue/side {dir=2} : /obj/effect/turf_decal/tile/blue , /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whiteblue/side {dir=4} : /obj/effect/turf_decal/tile/blue , /obj/effect/turf_decal/tile/blue {dir=4} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whiteblue/side {dir=5} : /obj/effect/turf_decal/tile/blue {dir=1} , /obj/effect/turf_decal/tile/blue , /obj/effect/turf_decal/tile/blue {dir=4} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whiteblue/side {dir=6} : /obj/effect/turf_decal/tile/blue , /obj/effect/turf_decal/tile/blue {dir=4} , /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whiteblue/side {dir=8} : /obj/effect/turf_decal/tile/blue {dir=1} , /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whiteblue/side {dir=9} : /obj/effect/turf_decal/tile/blue {dir=1} , /obj/effect/turf_decal/tile/blue {dir=4} , /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whiteblue/side {dir=10} : /obj/effect/turf_decal/tile/blue {dir=1} , /obj/effect/turf_decal/tile/blue , /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whiteblue/corner : /obj/effect/turf_decal/tile/blue {dir=@OLD} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whiteblue/side/telecomms {dir=1} : /obj/effect/turf_decal/tile/blue {dir=1} , /obj/effect/turf_decal/tile/blue {dir=4} , /turf/open/floor/plasteel/white/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whiteblue/side/telecomms {dir=@UNSET} : /obj/effect/turf_decal/tile/blue , /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel/white/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whiteblue/side/telecomms {dir=2} : /obj/effect/turf_decal/tile/blue , /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel/white/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whiteblue/side/telecomms {dir=4} : /obj/effect/turf_decal/tile/blue , /obj/effect/turf_decal/tile/blue {dir=4} , /turf/open/floor/plasteel/white/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whiteblue/side/telecomms {dir=5} : /obj/effect/turf_decal/tile/blue {dir=1} , /obj/effect/turf_decal/tile/blue , /obj/effect/turf_decal/tile/blue {dir=4} , /turf/open/floor/plasteel/white/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whiteblue/side/telecomms {dir=6} : /obj/effect/turf_decal/tile/blue , /obj/effect/turf_decal/tile/blue {dir=4} , /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel/white/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whiteblue/side/telecomms {dir=8} : /obj/effect/turf_decal/tile/blue {dir=1} , /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel/white/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whiteblue/side/telecomms {dir=9} : /obj/effect/turf_decal/tile/blue {dir=1} , /obj/effect/turf_decal/tile/blue {dir=4} , /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel/white/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whiteblue/side/telecomms {dir=10} : /obj/effect/turf_decal/tile/blue {dir=1} , /obj/effect/turf_decal/tile/blue , /obj/effect/turf_decal/tile/blue {dir=8} , /turf/open/floor/plasteel/white/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whitegreen : /obj/effect/turf_decal/tile/green {dir=1} , /obj/effect/turf_decal/tile/green , /obj/effect/turf_decal/tile/green {dir=4} , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whitegreen/side {dir=1} : /obj/effect/turf_decal/tile/green {dir=1} , /obj/effect/turf_decal/tile/green {dir=4} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whitegreen/side {dir=@UNSET} : /obj/effect/turf_decal/tile/green , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whitegreen/side {dir=2} : /obj/effect/turf_decal/tile/green , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whitegreen/side {dir=4} : /obj/effect/turf_decal/tile/green , /obj/effect/turf_decal/tile/green {dir=4} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whitegreen/side {dir=5} : /obj/effect/turf_decal/tile/green {dir=1} , /obj/effect/turf_decal/tile/green , /obj/effect/turf_decal/tile/green {dir=4} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whitegreen/side {dir=6} : /obj/effect/turf_decal/tile/green , /obj/effect/turf_decal/tile/green {dir=4} , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whitegreen/side {dir=8} : /obj/effect/turf_decal/tile/green {dir=1} , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whitegreen/side {dir=9} : /obj/effect/turf_decal/tile/green {dir=1} , /obj/effect/turf_decal/tile/green {dir=4} , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whitegreen/side {dir=10} : /obj/effect/turf_decal/tile/green {dir=1} , /obj/effect/turf_decal/tile/green , /obj/effect/turf_decal/tile/green {dir=8} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whitegreen/corner : /obj/effect/turf_decal/tile/green {dir=@OLD} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whitepurple : /obj/effect/turf_decal/tile/purple {dir=1} , /obj/effect/turf_decal/tile/purple , /obj/effect/turf_decal/tile/purple {dir=4} , /obj/effect/turf_decal/tile/purple {dir=8} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whitepurple/side {dir=1} : /obj/effect/turf_decal/tile/purple {dir=1} , /obj/effect/turf_decal/tile/purple {dir=4} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whitepurple/side {dir=@UNSET} : /obj/effect/turf_decal/tile/purple , /obj/effect/turf_decal/tile/purple {dir=8} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whitepurple/side {dir=2} : /obj/effect/turf_decal/tile/purple , /obj/effect/turf_decal/tile/purple {dir=8} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whitepurple/side {dir=4} : /obj/effect/turf_decal/tile/purple , /obj/effect/turf_decal/tile/purple {dir=4} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whitepurple/side {dir=5} : /obj/effect/turf_decal/tile/purple {dir=1} , /obj/effect/turf_decal/tile/purple , /obj/effect/turf_decal/tile/purple {dir=4} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whitepurple/side {dir=6} : /obj/effect/turf_decal/tile/purple , /obj/effect/turf_decal/tile/purple {dir=4} , /obj/effect/turf_decal/tile/purple {dir=8} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whitepurple/side {dir=8} : /obj/effect/turf_decal/tile/purple {dir=1} , /obj/effect/turf_decal/tile/purple {dir=8} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whitepurple/side {dir=9} : /obj/effect/turf_decal/tile/purple {dir=1} , /obj/effect/turf_decal/tile/purple {dir=4} , /obj/effect/turf_decal/tile/purple {dir=8} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whitepurple/side {dir=10} : /obj/effect/turf_decal/tile/purple {dir=1} , /obj/effect/turf_decal/tile/purple , /obj/effect/turf_decal/tile/purple {dir=8} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whitepurple/corner : /obj/effect/turf_decal/tile/purple {dir=@OLD} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whitepurple/side/telecomms {dir=1} : /obj/effect/turf_decal/tile/purple {dir=1} , /obj/effect/turf_decal/tile/purple {dir=4} , /turf/open/floor/plasteel/white/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whitepurple/side/telecomms {dir=@UNSET} : /obj/effect/turf_decal/tile/purple , /obj/effect/turf_decal/tile/purple {dir=8} , /turf/open/floor/plasteel/white/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whitepurple/side/telecomms {dir=2} : /obj/effect/turf_decal/tile/purple , /obj/effect/turf_decal/tile/purple {dir=8} , /turf/open/floor/plasteel/white/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whitepurple/side/telecomms {dir=4} : /obj/effect/turf_decal/tile/purple , /obj/effect/turf_decal/tile/purple {dir=4} , /turf/open/floor/plasteel/white/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whitepurple/side/telecomms {dir=5} : /obj/effect/turf_decal/tile/purple {dir=1} , /obj/effect/turf_decal/tile/purple , /obj/effect/turf_decal/tile/purple {dir=4} , /turf/open/floor/plasteel/white/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whitepurple/side/telecomms {dir=6} : /obj/effect/turf_decal/tile/purple , /obj/effect/turf_decal/tile/purple {dir=4} , /obj/effect/turf_decal/tile/purple {dir=8} , /turf/open/floor/plasteel/white/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whitepurple/side/telecomms {dir=8} : /obj/effect/turf_decal/tile/purple {dir=1} , /obj/effect/turf_decal/tile/purple {dir=8} , /turf/open/floor/plasteel/white/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whitepurple/side/telecomms {dir=9} : /obj/effect/turf_decal/tile/purple {dir=1} , /obj/effect/turf_decal/tile/purple {dir=4} , /obj/effect/turf_decal/tile/purple {dir=8} , /turf/open/floor/plasteel/white/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whitepurple/side/telecomms {dir=10} : /obj/effect/turf_decal/tile/purple {dir=1} , /obj/effect/turf_decal/tile/purple , /obj/effect/turf_decal/tile/purple {dir=8} , /turf/open/floor/plasteel/white/telecomms {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whitered : /obj/effect/turf_decal/tile/red {dir=1} , /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/red {dir=4} , /obj/effect/turf_decal/tile/red {dir=8} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whitered/side {dir=1} : /obj/effect/turf_decal/tile/red {dir=1} , /obj/effect/turf_decal/tile/red {dir=4} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whitered/side {dir=@UNSET} : /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/red {dir=8} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whitered/side {dir=2} : /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/red {dir=8} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whitered/side {dir=4} : /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/red {dir=4} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whitered/side {dir=5} : /obj/effect/turf_decal/tile/red {dir=1} , /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/red {dir=4} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whitered/side {dir=6} : /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/red {dir=4} , /obj/effect/turf_decal/tile/red {dir=8} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whitered/side {dir=8} : /obj/effect/turf_decal/tile/red {dir=1} , /obj/effect/turf_decal/tile/red {dir=8} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whitered/side {dir=9} : /obj/effect/turf_decal/tile/red {dir=1} , /obj/effect/turf_decal/tile/red {dir=4} , /obj/effect/turf_decal/tile/red {dir=8} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whitered/side {dir=10} : /obj/effect/turf_decal/tile/red {dir=1} , /obj/effect/turf_decal/tile/red , /obj/effect/turf_decal/tile/red {dir=8} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whitered/corner : /obj/effect/turf_decal/tile/red {dir=@OLD} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whiteyellow : /obj/effect/turf_decal/tile/yellow {dir=1} , /obj/effect/turf_decal/tile/yellow , /obj/effect/turf_decal/tile/yellow {dir=4} , /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whiteyellow/side {dir=1} : /obj/effect/turf_decal/tile/yellow {dir=1} , /obj/effect/turf_decal/tile/yellow {dir=4} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whiteyellow/side {dir=@UNSET} : /obj/effect/turf_decal/tile/yellow , /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whiteyellow/side {dir=2} : /obj/effect/turf_decal/tile/yellow , /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whiteyellow/side {dir=4} : /obj/effect/turf_decal/tile/yellow , /obj/effect/turf_decal/tile/yellow {dir=4} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whiteyellow/side {dir=5} : /obj/effect/turf_decal/tile/yellow {dir=1} , /obj/effect/turf_decal/tile/yellow , /obj/effect/turf_decal/tile/yellow {dir=4} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whiteyellow/side {dir=6} : /obj/effect/turf_decal/tile/yellow , /obj/effect/turf_decal/tile/yellow {dir=4} , /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whiteyellow/side {dir=8} : /obj/effect/turf_decal/tile/yellow {dir=1} , /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whiteyellow/side {dir=9} : /obj/effect/turf_decal/tile/yellow {dir=1} , /obj/effect/turf_decal/tile/yellow {dir=4} , /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whiteyellow/side {dir=10} : /obj/effect/turf_decal/tile/yellow {dir=1} , /obj/effect/turf_decal/tile/yellow , /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/whiteyellow/corner : /obj/effect/turf_decal/tile/yellow {dir=@OLD} , /turf/open/floor/plasteel/white {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/yellow : /obj/effect/turf_decal/tile/yellow {dir=1} , /obj/effect/turf_decal/tile/yellow , /obj/effect/turf_decal/tile/yellow {dir=4} , /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/yellow/side {dir=1} : /obj/effect/turf_decal/tile/yellow {dir=1} , /obj/effect/turf_decal/tile/yellow {dir=4} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/yellow/side {dir=@UNSET} : /obj/effect/turf_decal/tile/yellow , /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/yellow/side {dir=2} : /obj/effect/turf_decal/tile/yellow , /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/yellow/side {dir=4} : /obj/effect/turf_decal/tile/yellow , /obj/effect/turf_decal/tile/yellow {dir=4} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/yellow/side {dir=5} : /obj/effect/turf_decal/tile/yellow {dir=1} , /obj/effect/turf_decal/tile/yellow , /obj/effect/turf_decal/tile/yellow {dir=4} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/yellow/side {dir=6} : /obj/effect/turf_decal/tile/yellow , /obj/effect/turf_decal/tile/yellow {dir=4} , /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/yellow/side {dir=8} : /obj/effect/turf_decal/tile/yellow {dir=1} , /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/yellow/side {dir=9} : /obj/effect/turf_decal/tile/yellow {dir=1} , /obj/effect/turf_decal/tile/yellow {dir=4} , /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/yellow/side {dir=10} : /obj/effect/turf_decal/tile/yellow {dir=1} , /obj/effect/turf_decal/tile/yellow , /obj/effect/turf_decal/tile/yellow {dir=8} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} +/turf/open/floor/plasteel/yellow/corner : /obj/effect/turf_decal/tile/yellow {dir=@OLD} , /turf/open/floor/plasteel {@OLD;dir=@SKIP} \ No newline at end of file diff --git a/tools/mapmerge2/Run Mapmerge.bat b/tools/mapmerge2/mapmerge.bat similarity index 67% rename from tools/mapmerge2/Run Mapmerge.bat rename to tools/mapmerge2/mapmerge.bat index 12d7896330e..5a066226b3c 100644 --- a/tools/mapmerge2/Run Mapmerge.bat +++ b/tools/mapmerge2/mapmerge.bat @@ -1,5 +1,5 @@ @echo off set MAPROOT=../../_maps/ set TGM=1 -python ./src/mapmerge.py +python mapmerge.py pause diff --git a/tools/mapmerge2/src/mapmerge.py b/tools/mapmerge2/mapmerge.py similarity index 100% rename from tools/mapmerge2/src/mapmerge.py rename to tools/mapmerge2/mapmerge.py diff --git a/tools/mapmerge2/merge_driver_dmi.py b/tools/mapmerge2/merge_driver_dmi.py new file mode 100644 index 00000000000..37c0abd9543 --- /dev/null +++ b/tools/mapmerge2/merge_driver_dmi.py @@ -0,0 +1,177 @@ +#!/usr/bin/env python3 +import sys +import dmi + +def images_equal(left, right): + if left.size != right.size: + return False + w, h = left.size + left_load, right_load = left.load(), right.load() + for y in range(0, h): + for x in range(0, w): + lpixel, rpixel = left_load[x, y], right_load[x, y] + # quietly ignore changes where both pixels are fully transparent + if lpixel != rpixel and (lpixel[3] != 0 or rpixel[3] != 0): + return False + return True + +def states_equal(left, right): + result = True + + # basic properties + for attr in ('loop', 'rewind', 'movement', 'dirs', 'delays', 'hotspots', 'framecount'): + lval, rval = getattr(left, attr), getattr(right, attr) + if lval != rval: + result = False + + # frames + for (left_frame, right_frame) in zip(left.frames, right.frames): + if not images_equal(left_frame, right_frame): + result = False + + return result + +def key_of(state): + return (state.name, state.movement) + +def dictify(sheet): + result = {} + for state in sheet.states: + k = key_of(state) + if k in result: + print(f" duplicate {k!r}") + result[k] = state + return result + +def three_way_merge(base, left, right): + base_dims = base.width, base.height + if base_dims != (left.width, left.height) or base_dims != (right.width, right.height): + print("Dimensions have changed:") + print(f" Base: {base.width} x {base.height}") + print(f" Ours: {left.width} x {left.height}") + print(f" Theirs: {right.width} x {right.height}") + return True, None + + base_states, left_states, right_states = dictify(base), dictify(left), dictify(right) + + new_left = {k: v for k, v in left_states.items() if k not in base_states} + new_right = {k: v for k, v in right_states.items() if k not in base_states} + new_both = {} + conflicts = [] + for key, state in list(new_left.items()): + in_right = new_right.get(key, None) + if in_right: + if states_equal(state, in_right): + # allow it + new_both[key] = state + else: + # generate conflict states + print(f" C: {state.name!r}: added differently in both!") + state.name = f"{state.name} !CONFLICT! left" + conflicts.append(state) + in_right.name = f"{state.name} !CONFLICT! right" + conflicts.append(in_right) + # don't add it a second time + del new_left[key] + del new_right[key] + + final_states = [] + # add states that are currently in the base + for state in base.states: + in_left = left_states.get(key_of(state), None) + in_right = right_states.get(key_of(state), None) + left_equals = in_left and states_equal(state, in_left) + right_equals = in_right and states_equal(state, in_right) + + if not in_left and not in_right: + # deleted in both left and right, it's just deleted + print(f" {state.name!r}: deleted in both") + elif not in_left: + # left deletes + print(f" {state.name!r}: deleted in left") + if not right_equals: + print(f" ... but modified in right") + final_states.append(in_right) + elif not in_right: + # right deletes + print(f" {state.name!r}: deleted in right") + if not left_equals: + print(f" ... but modified in left") + final_states.append(in_left) + elif left_equals and right_equals: + # changed in neither + #print(f"Same in both: {state.name!r}") + final_states.append(state) + elif left_equals: + # changed only in right + print(f" {state.name!r}: changed in left") + final_states.append(in_right) + elif right_equals: + # changed only in left + print(f" {state.name!r}: changed in right") + final_states.append(in_left) + elif states_equal(in_left, in_right): + # changed in both, to the same thing + print(f" {state.name!r}: changed same in both") + final_states.append(in_left) # either or + else: + # changed in both + name = state.name + print(f" C: {name!r}: changed differently in both!") + state.name = f"{name} !CONFLICT! base" + conflicts.append(state) + in_left.name = f"{name} !CONFLICT! left" + conflicts.append(in_left) + in_right.name = f"{name} !CONFLICT! right" + conflicts.append(in_right) + + # add states which both left and right added the same + for key, state in new_both.items(): + print(f" {state.name!r}: added same in both") + final_states.append(state) + + # add states that are brand-new in the left + for key, state in new_left.items(): + print(f" {state.name!r}: added in left") + final_states.append(state) + + # add states that are brand-new in the right + for key, state in new_right.items(): + print(f" {state.name!r}: added in right") + final_states.append(state) + + final_states.extend(conflicts) + merged = dmi.Dmi(base.width, base.height) + merged.states = final_states + return len(conflicts), merged + +def main(path, original, left, right): + print(f"Merging icon: {path}") + + icon_orig = dmi.Dmi.from_file(original) + icon_left = dmi.Dmi.from_file(left) + icon_right = dmi.Dmi.from_file(right) + + trouble, merged = three_way_merge(icon_orig, icon_left, icon_right) + if merged: + merged.to_file(left) + if trouble: + print("!!! Manual merge required!") + if merged: + print(" A best-effort merge was performed. You must edit the icon and remove all") + print(" icon states marked with !CONFLICT!, leaving only the desired icon.") + else: + print(" The icon was totally unable to be merged, you must start with one version") + print(" or the other and manually resolve the conflict.") + print(" Information about which states conflicted is listed above.") + return trouble + +if __name__ == '__main__': + if len(sys.argv) != 6: + print("DMI merge driver called with wrong number of arguments") + print(" usage: merge-driver-dmi %P %O %A %B %L") + exit(1) + + # "left" is also the file that ought to be overwritten + _, path, original, left, right, conflict_size_marker = sys.argv + exit(main(path, original, left, right)) diff --git a/tools/mapmerge2/precommit.py b/tools/mapmerge2/precommit.py new file mode 100644 index 00000000000..f5ea49a50ea --- /dev/null +++ b/tools/mapmerge2/precommit.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python3 +import os +import pygit2 +import dmm +from mapmerge import merge_map + +def main(repo): + if repo.index.conflicts: + print("You need to resolve merge conflicts first.") + return 1 + + try: + repo.lookup_reference('MERGE_HEAD') + print("Not running mapmerge for merge commit.") + return 0 + except KeyError: + pass + + changed = 0 + for path, status in repo.status().items(): + if path.endswith(".dmm") and (status & (pygit2.GIT_STATUS_INDEX_MODIFIED | pygit2.GIT_STATUS_INDEX_NEW)): + # read the index + index_entry = repo.index[path] + index_map = dmm.DMM.from_bytes(repo[index_entry.id].read_raw()) + + try: + head_blob = repo[repo[repo.head.target].tree[path].id] + except KeyError: + # New map, no entry in HEAD + print(f"Converting new map: {path}", flush=True) + assert (status & pygit2.GIT_STATUS_INDEX_NEW) + merged_map = index_map + else: + # Entry in HEAD, merge the index over it + print(f"Merging map: {path}", flush=True) + assert not (status & pygit2.GIT_STATUS_INDEX_NEW) + head_map = dmm.DMM.from_bytes(head_blob.read_raw()) + merged_map = merge_map(index_map, head_map) + + # write to the index + blob_id = repo.create_blob(merged_map.to_bytes()) + repo.index.add(pygit2.IndexEntry(path, blob_id, index_entry.mode)) + changed += 1 + + # write to the working directory if that's clean + if status & (pygit2.GIT_STATUS_WT_DELETED | pygit2.GIT_STATUS_WT_MODIFIED): + print(f"Warning: {path} has unindexed changes, not overwriting them") + else: + merged_map.to_file(os.path.join(repo.workdir, path)) + + if changed: + repo.index.write() + print(f"Merged {changed} maps.") + return 0 + +if __name__ == '__main__': + exit(main(pygit2.Repository(pygit2.discover_repository(os.getcwd())))) diff --git a/tools/mapmerge2/Install Requirements.bat b/tools/mapmerge2/requirements-install.bat similarity index 100% rename from tools/mapmerge2/Install Requirements.bat rename to tools/mapmerge2/requirements-install.bat diff --git a/tools/mapmerge2/requirements.txt b/tools/mapmerge2/requirements.txt index 095843b2d2a..adb42438e7e 100644 --- a/tools/mapmerge2/requirements.txt +++ b/tools/mapmerge2/requirements.txt @@ -1,3 +1,3 @@ -pygit2==0.26.0 +pygit2==0.27.2 bidict==0.13.1 Pillow==5.1.0 diff --git a/tools/mapmerge2/Convert TGM to DMM.bat b/tools/mapmerge2/tgm2dmm.bat similarity index 68% rename from tools/mapmerge2/Convert TGM to DMM.bat rename to tools/mapmerge2/tgm2dmm.bat index 9fb6d5419dd..2748533febf 100644 --- a/tools/mapmerge2/Convert TGM to DMM.bat +++ b/tools/mapmerge2/tgm2dmm.bat @@ -1,5 +1,5 @@ @echo off set MAPROOT=../../_maps/ set TGM=0 -python ./src/convert.py +python convert.py pause diff --git a/tools/mapmerge2/update_paths.py b/tools/mapmerge2/update_paths.py new file mode 100644 index 00000000000..6359b6bb303 --- /dev/null +++ b/tools/mapmerge2/update_paths.py @@ -0,0 +1,163 @@ +# A script and syntax for applying path updates to maps. +import re +import os +import argparse +import frontend +from dmm import * + +desc = """ +Update dmm files given update file/string. +Replacement syntax example: + /turf/open/floor/plasteel/warningline : /obj/effect/turf_decal {dir = @OLD ;tag = @SKIP;icon_state = @SKIP} + /turf/open/floor/plasteel/warningline : /obj/effect/turf_decal {@OLD} , /obj/thing {icon_state = @OLD:name; name = "meme"} + /turf/open/floor/plasteel/warningline{dir=2} : /obj/thing +New paths properties: + @OLD - if used as property name copies all modified properties from original path to this one + property = @SKIP - will not copy this property through when global @OLD is used. + property = @OLD - will copy this modified property from original object even if global @OLD is not used + property = @OLD:name - will copy [name] property from original object even if global @OLD is not used + Anything else is copied as written. +Old paths properties: + Will be used as a filter. + property = @UNSET - will apply the rule only if the property is not mapedited +""" + +default_map_directory = "../../_maps" +replacement_re = re.compile('\s*([^{]*)\s*(\{(.*)\})?') + +#urgent todo: replace with actual parser, this is slow as janitor in crit +split_re = re.compile('((?:[A-Za-z0-9_\-$]+)\s*=\s*(?:"(?:.+?)"|[^";]*)|@OLD)') + + +def props_to_string(props): + return "{{{0}}}".format(";".join([k+" = "+props[k] for k in props])) + + +def string_to_props(propstring, verbose = False): + props = dict() + for raw_prop in re.split(split_re, propstring): + if not raw_prop or raw_prop.strip() == ';': + continue + prop = raw_prop.split('=', maxsplit=1) + props[prop[0].strip()] = prop[1].strip() if len(prop) > 1 else None + if verbose: + print("{0} to {1}".format(propstring, props)) + return props + + +def parse_rep_string(replacement_string, verbose = False): + # translates /blah/blah {meme = "test",} into path,prop dictionary tuple + match = re.match(replacement_re, replacement_string) + path = match.group(1) + props = match.group(3) + if props: + prop_dict = string_to_props(props, verbose) + else: + prop_dict = dict() + return path.strip(), prop_dict + + +def update_path(dmm_data, replacement_string, verbose=False): + old_path_part, new_path_part = replacement_string.split(':', maxsplit=1) + old_path, old_path_props = parse_rep_string(old_path_part, verbose) + new_paths = list() + for replacement_def in new_path_part.split(','): + new_path, new_path_props = parse_rep_string(replacement_def, verbose) + new_paths.append((new_path, new_path_props)) + + def replace_def(match): + if match.group(2): + old_props = string_to_props(match.group(2), verbose) + else: + old_props = dict() + for filter_prop in old_path_props: + if filter_prop not in old_props: + if old_path_props[filter_prop] == "@UNSET": + continue + else: + return [match.group(0)] + else: + if old_props[filter_prop] != old_path_props[filter_prop] or old_path_props[filter_prop] == "@UNSET": + return [match.group(0)] #does not match current filter, skip the change. + if verbose: + print("Found match : {0}".format(match.group(0))) + out_paths = [] + for new_path, new_props in new_paths: + out = new_path + out_props = dict() + for prop_name, prop_value in new_props.items(): + if prop_name == "@OLD": + out_props = dict(old_props) + continue + if prop_value == "@SKIP": + out_props.pop(prop_name, None) + continue + if prop_value.startswith("@OLD"): + params = prop_value.split(":") + if prop_name in old_props: + out_props[prop_name] = old_props[params[1]] if len(params) > 1 else old_props[prop_name] + continue + out_props[prop_name] = prop_value + if out_props: + out += props_to_string(out_props) + out_paths.append(out) + if verbose: + print("Replacing with: {0}".format(out_paths)) + return out_paths + + def get_result(element): + p = re.compile("{0}\s*({{(.*)}})?$".format(re.escape(old_path))) + match = p.match(element) + if match: + return replace_def(match) # = re.sub(p,replace_def,element) + else: + return [element] + + bad_keys = {} + keys = list(dmm_data.dictionary.keys()) + for definition_key in keys: + def_value = dmm_data.dictionary[definition_key] + new_value = tuple(y for x in def_value for y in get_result(x)) + if new_value != def_value: + dmm_data.overwrite_key(definition_key, new_value, bad_keys) + dmm_data.reassign_bad_keys(bad_keys) + + +def update_map(map_filepath, updates, verbose=False): + print("Updating: {0}".format(map_filepath)) + dmm_data = DMM.from_file(map_filepath) + for update_string in updates: + update_path(dmm_data, update_string, verbose) + dmm_data.to_file(map_filepath, True) + + +def update_all_maps(map_directory, updates, verbose=False): + for root, _, files in os.walk(map_directory): + for filepath in files: + if filepath.endswith(".dmm"): + path = os.path.join(root, filepath) + update_map(path, updates, verbose) + + +def main(args): + if args.inline: + updates = [args.update_source] + else: + with open(args.update_source) as f: + updates = [line for line in f if line and not line.startswith("#") and not line.isspace()] + + if args.map: + update_map(args.map, updates, verbose=args.verbose) + else: + map_directory = args.directory or frontend.read_settings().map_folder + update_all_maps(map_directory, updates, verbose=args.verbose) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description=desc, formatter_class=argparse.RawTextHelpFormatter) + parser.add_argument("update_source", help="update file path / line of update notation") + parser.add_argument("--map", "-m", help="path to update, defaults to all maps in maps directory") + parser.add_argument("--directory", "-d", help="path to maps directory, defaults to _maps/") + parser.add_argument("--inline", "-i", help="treat update source as update string instead of path", action="store_true") + parser.add_argument("--verbose", "-v", help="toggle detailed update information", action="store_true") + main(parser.parse_args())
- {{:helper.link('Create pill (50u max)', 'arrow-right', {'createpill': 1})}} + {{:helper.link('Create pill (100u max)', 'arrow-right', {'createpill': 1})}} {{:helper.link('Multiple', 'arrow-right', {'createpill_multiple': 1})}} @@ -64,7 +64,7 @@
- {{:helper.link('Create bottle (30u max)', 'arrow-right', {'createbottle': 1})}} + {{:helper.link('Create bottle (50u max)', 'arrow-right', {'createbottle': 1})}} {{:helper.link('Style', 'pencil', {'change_bottle': 1})}} diff --git a/nano/templates/uplink.tmpl b/nano/templates/uplink.tmpl index c67dbca9c61..3058bb10bbb 100644 --- a/nano/templates/uplink.tmpl +++ b/nano/templates/uplink.tmpl @@ -46,7 +46,7 @@ Used In File(s): \code\game\objects\items\devices\uplinks.dm {{for value.items :itemValue:itemIndex}}
- {{:helper.link( itemValue.Name, 'gear', {'buy_item' : itemValue.obj_path, 'cost' : itemValue.Cost}, itemValue.Cost > data.crystals ? 'disabled' : null, null)}} - {{:itemValue.Cost}} + {{:helper.link( itemValue.Name, 'gear', {'buy_item' : itemValue.obj_path, 'cost' : itemValue.Cost}, itemValue.Cost > data.crystals ? 'disabled' : null, null)}} - {{:itemValue.Cost}} {{if itemValue.hijack_only}}(HIJACK AGENTS ONLY){{/if}}