diff --git a/_maps/RandomRuins/StationRuins/Lavaland/Mining_Station/Mining_Station_Public_01.dmm b/_maps/RandomRuins/StationRuins/Lavaland/Mining_Station/Mining_Station_Public_01.dmm index fec45c7310..3118ad3f5f 100644 --- a/_maps/RandomRuins/StationRuins/Lavaland/Mining_Station/Mining_Station_Public_01.dmm +++ b/_maps/RandomRuins/StationRuins/Lavaland/Mining_Station/Mining_Station_Public_01.dmm @@ -64,6 +64,9 @@ /turf/open/floor/plating, /area/mine/living_quarters) "aN" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, /turf/open/floor/plasteel/white, /area/mine/laborcamp) "aW" = ( @@ -82,24 +85,10 @@ "bg" = ( /turf/closed/wall, /area/mine/eva) -"bH" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/atmos_waste{ - dir = 4; - piping_layer = 3 - }, -/obj/structure/lattice/catwalk, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/mine/living_quarters) -"bI" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel, +"bn" = ( +/obj/structure/cable, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, /area/mine/living_quarters) "bX" = ( /obj/machinery/door/window/southleft, @@ -174,13 +163,6 @@ }, /turf/open/floor/plasteel, /area/mine/living_quarters) -"di" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown, -/turf/open/floor/plasteel, -/area/mine/living_quarters) "dk" = ( /obj/structure/table, /obj/item/stack/packageWrap, @@ -192,12 +174,6 @@ }, /turf/open/floor/plasteel, /area/mine/eva) -"dC" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/mine/living_quarters) "dL" = ( /obj/machinery/atmospherics/components/binary/pump/on, /obj/structure/cable{ @@ -220,6 +196,15 @@ }, /turf/open/floor/plasteel, /area/mine/production) +"dU" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/sign/warning/electricshock{ + pixel_y = -32 + }, +/turf/open/floor/plating, +/area/mine/laborcamp/security) "dZ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -301,6 +286,21 @@ }, /turf/open/floor/plasteel, /area/mine/laborcamp) +"fx" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plating, +/area/mine/laborcamp/security) +"fA" = ( +/obj/machinery/power/terminal{ + dir = 4 + }, +/obj/machinery/power/port_gen/pacman{ + anchored = 1 + }, +/turf/open/floor/plating, +/area/mine/laborcamp/security) "fN" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 @@ -308,6 +308,12 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 5 }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/mine/laborcamp/security) "fO" = ( @@ -349,9 +355,18 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/mine/production) +"gn" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "gs" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/mine/laborcamp) "gP" = ( @@ -376,6 +391,15 @@ }, /turf/open/floor/plasteel/white, /area/mine/laborcamp) +"hb" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/power/smes{ + charge = 5e+006 + }, +/turf/open/floor/plating, +/area/mine/laborcamp/security) "hf" = ( /obj/item/twohanded/required/kirbyplants/random, /turf/open/floor/plasteel, @@ -387,14 +411,6 @@ }, /turf/open/floor/plasteel, /area/mine/living_quarters) -"hv" = ( -/obj/machinery/camera{ - c_tag = "Crew Area Hallway West"; - dir = 1; - network = list("mine") - }, -/turf/open/floor/plasteel, -/area/mine/living_quarters) "hy" = ( /obj/machinery/camera{ c_tag = "Labor Camp External"; @@ -415,25 +431,21 @@ /turf/open/floor/plasteel, /area/mine/living_quarters) "hP" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/atmos_waste{ + dir = 4; + piping_layer = 3 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/mine/living_quarters) "hQ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/atmos_waste{ + dir = 1; + piping_layer = 3 }, -/turf/open/floor/plasteel, -/area/mine/living_quarters) +/obj/structure/lattice/catwalk, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/mine/laborcamp/security) "ia" = ( /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, @@ -582,6 +594,14 @@ }, /turf/open/floor/plasteel, /area/mine/living_quarters) +"kP" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/mine/laborcamp) "kR" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 @@ -630,6 +650,9 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 6 }, +/obj/structure/cable{ + icon_state = "2-4" + }, /turf/open/floor/plasteel, /area/mine/laborcamp) "lI" = ( @@ -715,6 +738,9 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 4 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel, /area/mine/laborcamp/security) "mN" = ( @@ -733,13 +759,11 @@ }, /turf/open/floor/plasteel, /area/mine/laborcamp/security) -"nv" = ( +"nx" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable{ - icon_state = "0-2" - }, +/obj/structure/cable, /turf/open/floor/plating, -/area/mine/living_quarters) +/area/mine/laborcamp/security) "ny" = ( /obj/machinery/computer/prisoner, /obj/effect/turf_decal/tile/red{ @@ -772,11 +796,17 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 10 }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, /obj/structure/cable{ - icon_state = "1-2" + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "4-8" }, /turf/open/floor/plasteel, /area/mine/laborcamp/security) @@ -790,6 +820,14 @@ }, /turf/open/floor/plasteel, /area/mine/production) +"nL" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/mine/laborcamp/security) "nN" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -805,6 +843,19 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/mine/production) +"nX" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plating, +/area/mine/laborcamp/security) "oo" = ( /obj/machinery/conveyor{ id = "mining_internal" @@ -828,6 +879,9 @@ /obj/machinery/door/airlock/medical/glass{ name = "Infirmary" }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel/white, /area/mine/laborcamp) "oy" = ( @@ -886,6 +940,22 @@ }, /turf/open/floor/plasteel, /area/mine/eva) +"pu" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/mine/living_quarters) "pK" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, @@ -947,6 +1017,15 @@ }, /turf/open/floor/plating, /area/mine/living_quarters) +"qx" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/structure/sign/poster/official/random{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/mine/living_quarters) "qH" = ( /obj/structure/extinguisher_cabinet{ pixel_x = 30 @@ -1071,6 +1150,12 @@ "si" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/mine/laborcamp/security) "sj" = ( @@ -1151,15 +1236,25 @@ }, /turf/open/floor/plasteel, /area/mine/laborcamp) +"td" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/mine/laborcamp) "tk" = ( /obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer3, -/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, /obj/structure/cable{ icon_state = "4-8" }, /obj/structure/cable{ icon_state = "1-4" }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, /turf/open/floor/plasteel, /area/mine/living_quarters) "tr" = ( @@ -1183,16 +1278,6 @@ }, /turf/open/floor/plasteel, /area/mine/production) -"uh" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/mine/living_quarters) "uG" = ( /obj/structure/table, /obj/item/clothing/glasses/meson, @@ -1258,6 +1343,13 @@ }, /turf/open/floor/plasteel, /area/mine/laborcamp) +"vA" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "vE" = ( /obj/effect/turf_decal/tile/brown{ dir = 1 @@ -1285,6 +1377,16 @@ }, /turf/open/floor/plasteel, /area/mine/eva) +"vM" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/chair, +/turf/open/floor/plasteel, +/area/mine/living_quarters) "wd" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -1356,6 +1458,9 @@ /area/mine/production) "xd" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable{ + icon_state = "2-8" + }, /turf/open/floor/plasteel, /area/mine/laborcamp) "xh" = ( @@ -1399,6 +1504,9 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ dir = 1 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel, /area/mine/laborcamp/security) "yt" = ( @@ -1416,6 +1524,13 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/mine/production) +"yQ" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/mine/laborcamp/security) "yR" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/plasteel, @@ -1435,12 +1550,26 @@ }, /turf/open/floor/plating, /area/mine/living_quarters) +"zk" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/mine/laborcamp/security) "zo" = ( /obj/structure/table, /turf/open/floor/carpet, /area/mine/living_quarters) "zx" = ( /obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, /turf/open/floor/plating, /area/mine/laborcamp) "zy" = ( @@ -1502,14 +1631,10 @@ /turf/open/floor/plasteel, /area/mine/living_quarters) "Ah" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/structure/cable{ icon_state = "1-2" }, -/obj/structure/cable{ - icon_state = "2-8" - }, /turf/open/floor/plasteel, /area/mine/laborcamp/security) "Aj" = ( @@ -1602,6 +1727,16 @@ /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, /area/mine/living_quarters) +"BD" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Mining Station Maintenance"; + req_access_txt = "48" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/mine/laborcamp/security) "BO" = ( /obj/machinery/door/airlock{ name = "Labor Camp Storage" @@ -1638,6 +1773,12 @@ }, /turf/open/floor/plasteel, /area/mine/production) +"Cl" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "Cm" = ( /obj/machinery/vending/snack, /obj/effect/turf_decal/tile/bar, @@ -1646,6 +1787,13 @@ }, /turf/open/floor/plasteel, /area/mine/living_quarters) +"Cw" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/mine/laborcamp) "Cy" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -1748,18 +1896,6 @@ }, /turf/open/floor/plasteel, /area/mine/production) -"Em" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/mine/living_quarters) "Ev" = ( /obj/machinery/light/small{ dir = 4 @@ -1792,7 +1928,9 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/machinery/vending/security, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel, /area/mine/laborcamp/security) "EH" = ( @@ -1805,6 +1943,9 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 9 }, +/obj/structure/cable{ + icon_state = "1-8" + }, /turf/open/floor/plasteel, /area/mine/laborcamp) "FC" = ( @@ -1825,19 +1966,6 @@ }, /turf/open/floor/plasteel, /area/mine/laborcamp) -"Ge" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/turf/open/floor/plating, -/area/mine/living_quarters) "Gt" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ dir = 1 @@ -1845,9 +1973,6 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/structure/cable{ - icon_state = "4-8" - }, /turf/open/floor/plasteel, /area/mine/laborcamp/security) "GM" = ( @@ -1891,6 +2016,9 @@ dir = 10 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/mine/laborcamp) "Hh" = ( @@ -1964,11 +2092,6 @@ }, /turf/open/floor/plasteel, /area/mine/laborcamp) -"HR" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/turf/open/floor/plating, -/area/mine/living_quarters) "HS" = ( /obj/machinery/conveyor{ dir = 10; @@ -2038,6 +2161,9 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel, /area/mine/laborcamp/security) "II" = ( @@ -2053,6 +2179,9 @@ /obj/structure/table, /obj/effect/turf_decal/tile/red, /obj/machinery/recharger, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel, /area/mine/laborcamp/security) "IS" = ( @@ -2073,19 +2202,6 @@ }, /turf/open/floor/carpet, /area/mine/living_quarters) -"Jc" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/turf/open/floor/plating, -/area/mine/living_quarters) "Jl" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, /obj/effect/turf_decal/tile/purple{ @@ -2267,12 +2383,6 @@ }, /turf/open/floor/plasteel, /area/mine/production) -"KR" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/mine/living_quarters) "KS" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -2347,10 +2457,11 @@ /turf/open/floor/plasteel, /area/mine/laborcamp/security) "LG" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 1 +/obj/structure/cable{ + icon_state = "0-2" }, -/turf/open/floor/plasteel, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, /area/mine/living_quarters) "LL" = ( /obj/effect/turf_decal/tile/red{ @@ -2392,6 +2503,13 @@ }, /turf/open/floor/plasteel, /area/mine/production) +"Mh" = ( +/obj/structure/table, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/mine/laborcamp) "Mj" = ( /obj/structure/sink{ dir = 4; @@ -2492,12 +2610,6 @@ }, /turf/open/floor/plating, /area/mine/living_quarters) -"ML" = ( -/obj/structure/chair{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/mine/living_quarters) "MM" = ( /obj/machinery/light{ dir = 8 @@ -2702,16 +2814,16 @@ /turf/open/floor/plasteel, /area/mine/living_quarters) "Qr" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, -/obj/machinery/door/airlock/security/glass{ - name = "Labor Camp Monitoring"; - req_access_txt = "2" +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "1-8" }, /obj/structure/cable{ - icon_state = "1-2" + icon_state = "1-4" }, -/turf/open/floor/plasteel, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, /area/mine/laborcamp/security) "Qx" = ( /obj/structure/chair{ @@ -2738,6 +2850,12 @@ }, /turf/open/floor/plasteel, /area/mine/eva) +"QL" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp/security) "Rf" = ( /obj/machinery/mineral/unloading_machine{ dir = 1; @@ -2755,6 +2873,9 @@ req_access_txt = "2"; security_level = 6 }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/mine/laborcamp) "Ru" = ( @@ -2837,6 +2958,12 @@ /area/mine/living_quarters) "Sp" = ( /obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, /turf/open/floor/plating, /area/mine/laborcamp/security) "Sq" = ( @@ -2904,7 +3031,7 @@ dir = 8 }, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "1-8" }, /turf/open/floor/plasteel, /area/mine/laborcamp/security) @@ -2951,6 +3078,9 @@ desc = "Powered by the tears and sweat of laborers."; name = "Prison Ofitser" }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/mine/laborcamp/security) "Un" = ( @@ -3099,19 +3229,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/plasteel/dark, /area/mine/maintenance) -"WX" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/open/floor/plasteel, -/area/mine/living_quarters) "WY" = ( /obj/machinery/door/airlock{ id_tag = "miningdorm1"; @@ -3170,12 +3287,6 @@ }, /turf/open/floor/plasteel, /area/mine/living_quarters) -"XR" = ( -/obj/structure/sign/poster/official/random{ - pixel_y = 32 - }, -/turf/open/floor/plasteel, -/area/mine/living_quarters) "XU" = ( /obj/machinery/power/smes{ charge = 5e+006 @@ -3211,9 +3322,6 @@ dir = 1; network = list("labor") }, -/obj/structure/cable{ - icon_state = "4-8" - }, /turf/open/floor/plasteel, /area/mine/laborcamp/security) "Yi" = ( @@ -3291,13 +3399,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, /turf/open/floor/plasteel, /area/mine/living_quarters) -"Zu" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 4 - }, -/obj/structure/lattice/catwalk, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/mine/living_quarters) "Zw" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -4329,9 +4430,9 @@ cd cd HO cd -zI -zI -VT +RF +RF +RF VT VT VT @@ -4386,9 +4487,9 @@ HU cd Jr cd -my -wV -VT +fA +fx +RF VT uJ VT @@ -4443,13 +4544,13 @@ at cd Op cd -wV -wV -wV +hb +dU +RF +VT VT VT VT -Lm Lm wz wz @@ -4486,8 +4587,8 @@ JY JY JY zx -zx -zx +kP +td cd cd cd @@ -4501,15 +4602,15 @@ NH NH Ya Mn -Mn +BD Mn Dv Mn -nv -Ge -HR -VN -Lm +wV +VT +VT +VT +wz Lm Lm Lm @@ -4542,9 +4643,9 @@ JY JY JY JY -zx -wB +Cw wB +Mh cd AH NH @@ -4562,11 +4663,11 @@ EB MM LC Mn -xH -dC -hf -VN -bH +wV +wV +VT +VT +Lm Lm Lm Lm @@ -4603,13 +4704,13 @@ cd eh aN ow -NH -NH -NH -NH +Cl +Cl +Cl +gn vo ly -xd +vA Hg gs gs @@ -4619,11 +4720,11 @@ si fN TC Mn -ML -dC -oy -VN -Zu +wV +my +VT +VT +VT Lm Lm Lm @@ -4664,7 +4765,7 @@ fs NH Wt xd -xd +vA Fx Yf uR @@ -4676,13 +4777,13 @@ Hx mL Yg Mn -XR -dC -Ag -VN -Jc -HR -VN +zI +VT +VT +VT +VT +wz +Lm Lm Lm Lm @@ -4732,14 +4833,14 @@ LL Hx xS Gt -Sp -FE -Em -cD -Ag -sm -uh -VN +Dv +my +VT +VT +VT +VT +wz +Lm Lm Lm Lm @@ -4791,12 +4892,12 @@ nJ Ah Qr hQ -bI -hQ -hQ -WX -hv -VN +VT +VT +VT +Lm +Lm +Lm Lm Lm Lm @@ -4846,13 +4947,13 @@ WL Hx IG UJ -Sp -Ag -Ag -di -KR +yQ +my +my +VT +Lm hP -Ag +Lm VN VN VN @@ -4901,15 +5002,15 @@ Ya Mn kB Oh -Hx +QL sR Al Al Al Al LG -hP -Ag +pu +bn VN zy If @@ -4955,7 +5056,7 @@ my my my zI -Sp +Dv ny ig IK @@ -4964,9 +5065,9 @@ Al wC wC Al -Ag -hP -Ag +hf +vM +xH VN Ru Ag @@ -5013,16 +5114,16 @@ my my zI Sp -Sp -Sp -Sp -Sp +zk +nL +nX +nx Al Uz Ue Al -EH -hP +qx +sm aW VN Dr diff --git a/_maps/shuttles/pirate_default.dmm b/_maps/shuttles/pirate_default.dmm index 1c8670d5b6..c002e66d53 100644 --- a/_maps/shuttles/pirate_default.dmm +++ b/_maps/shuttles/pirate_default.dmm @@ -89,7 +89,7 @@ /turf/open/floor/pod/dark, /area/shuttle/pirate) "aj" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal, +/turf/closed/wall/r_wall/syndicate/pirate/nodiagonal, /area/shuttle/pirate) "ak" = ( /obj/machinery/airalarm/all_access{ @@ -419,6 +419,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 }, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/shuttle/pirate) "aK" = ( @@ -463,21 +464,19 @@ /turf/open/floor/plating, /area/shuttle/pirate) "aQ" = ( -/obj/machinery/porta_turret/syndicate/energy{ +/obj/machinery/porta_turret/syndicate/energy/pirate{ dir = 1; faction = list("pirate"); - icon_state = "standard_lethal"; - mode = 1 + icon_state = "standard_lethal" }, -/turf/closed/wall/mineral/plastitanium/nodiagonal, +/turf/closed/wall/r_wall/syndicate/pirate/nodiagonal, /area/shuttle/pirate) "aR" = ( -/obj/machinery/porta_turret/syndicate/energy{ +/obj/machinery/porta_turret/syndicate/energy/pirate{ faction = list("pirate"); - icon_state = "standard_lethal"; - mode = 1 + icon_state = "standard_lethal" }, -/turf/closed/wall/mineral/plastitanium, +/turf/closed/wall/r_wall/syndicate/pirate, /area/shuttle/pirate) "aS" = ( /obj/effect/turf_decal/stripes/line, @@ -486,7 +485,7 @@ /area/shuttle/pirate) "aU" = ( /obj/structure/sign/departments/engineering, -/turf/closed/wall/mineral/plastitanium/nodiagonal, +/turf/closed/wall/r_wall/syndicate/pirate/nodiagonal, /area/shuttle/pirate) "aV" = ( /obj/effect/mob_spawn/human/pirate{ @@ -867,37 +866,36 @@ dir = 1 }, /obj/docking_port/mobile/pirate{ - callTime = 100; - dheight = 0; - dir = 1; dwidth = 11; height = 16; - id = "pirateship"; launch_status = 0; movement_force = list("KNOCKDOWN" = 0, "THROW" = 0); name = "Pirate Ship"; port_direction = 2; - preferred_direction = 1; width = 17 }, /obj/docking_port/stationary{ - dir = 1; dwidth = 11; height = 16; id = "pirateship_home"; name = "Deep Space"; width = 17 }, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/shuttle/pirate) +"db" = ( +/obj/structure/shuttle/engine/heater, +/obj/effect/spawner/structure/window/plastitanium/pirate, +/turf/open/floor/plating/airless, +/area/shuttle/pirate) "df" = ( -/obj/machinery/porta_turret/syndicate/energy{ +/obj/machinery/porta_turret/syndicate/energy/pirate{ dir = 4; faction = list("pirate"); - icon_state = "standard_lethal"; - mode = 1 + icon_state = "standard_lethal" }, -/turf/closed/wall/mineral/plastitanium, +/turf/closed/wall/r_wall/syndicate/pirate, /area/shuttle/pirate) "dy" = ( /obj/structure/chair/wood/normal, @@ -988,7 +986,7 @@ id = "piratebridge" }, /obj/structure/grille, -/obj/structure/window/plastitanium, +/obj/structure/window/plastitanium/pirate, /turf/open/floor/plating, /area/shuttle/pirate) "ez" = ( @@ -1016,7 +1014,7 @@ /turf/open/floor/plasteel, /area/shuttle/pirate) "fW" = ( -/turf/closed/wall/mineral/plastitanium, +/turf/closed/wall/r_wall/syndicate/pirate, /area/shuttle/pirate) "fY" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ @@ -1084,13 +1082,12 @@ /turf/open/floor/plasteel/showroomfloor, /area/shuttle/pirate) "wR" = ( -/obj/machinery/porta_turret/syndicate/energy{ +/obj/machinery/porta_turret/syndicate/energy/pirate{ dir = 8; faction = list("pirate"); - icon_state = "standard_lethal"; - mode = 1 + icon_state = "standard_lethal" }, -/turf/closed/wall/mineral/plastitanium, +/turf/closed/wall/r_wall/syndicate/pirate, /area/shuttle/pirate) "yi" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -1326,7 +1323,7 @@ aU be aD aG -ep +db aH "} (9,1,1) = {" @@ -1344,7 +1341,7 @@ mU aL bP bX -ep +db aK "} (10,1,1) = {" @@ -1362,7 +1359,7 @@ aj bO bQ bk -ep +db er "} (11,1,1) = {" diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm index 0efd5a1f79..c4c9d815a0 100644 --- a/code/__DEFINES/components.dm +++ b/code/__DEFINES/components.dm @@ -187,10 +187,10 @@ #define SPEECH_MESSAGE 1 // #define SPEECH_BUBBLE_TYPE 2 #define SPEECH_SPANS 3 - /* #define SPEECH_SANITIZE 4 +// #define SPEECH_SANITIZE 4 #define SPEECH_LANGUAGE 5 - #define SPEECH_IGNORE_SPAM 6 - #define SPEECH_FORCED 7 */ +// #define SPEECH_IGNORE_SPAM 6 +// #define SPEECH_FORCED 7 // /mob/living signals #define COMSIG_LIVING_FULLY_HEAL "living_fully_healed" //from base of /mob/living/fully_heal(): (admin_revive) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index ea1ccfa97b..d144254a50 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -110,6 +110,7 @@ #define TRAIT_NOHARDCRIT "nohardcrit" #define TRAIT_NOSOFTCRIT "nosoftcrit" #define TRAIT_MINDSHIELD "mindshield" +#define TRAIT_HIJACKER "hijacker" #define TRAIT_SIXTHSENSE "sixthsense" #define TRAIT_DISSECTED "dissected" #define TRAIT_FEARLESS "fearless" diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index 3985659b71..beb005b8d1 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -44,6 +44,12 @@ index = findtext(t, char, index + length(char)) return t +/proc/sanitize_name(t,list/repl_chars = null) + if(t == "space" || t == "floor" || t == "wall" || t == "r-wall" || t == "monkey" || t == "unknown" || t == "inactive ai") //prevents these common metagamey names + alert("Invalid name.") + return "" + return sanitize(t) + /proc/sanitize_filename(t) return sanitize_simple(t, list("\n"="", "\t"="", "/"="", "\\"="", "?"="", "%"="", "*"="", ":"="", "|"="", "\""="", "<"="", ">"="")) @@ -775,4 +781,4 @@ GLOBAL_LIST_INIT(binary, list("0","1")) #define is_alpha(X) ((text2ascii(X) <= 122) && (text2ascii(X) >= 97)) -#define is_digit(X) ((length(X) == 1) && (length(text2num(X)) == 1)) \ No newline at end of file +#define is_digit(X) ((length(X) == 1) && (length(text2num(X)) == 1)) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 86dde3d6a6..9cced1fdc7 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1537,4 +1537,9 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) if(190) return "." if(189) - return "-" \ No newline at end of file + return "-" + +/proc/generate_items_inside(list/items_list, where_to) + for(var/each_item in items_list) + for(var/i in 1 to items_list[each_item]) + new each_item(where_to) diff --git a/code/controllers/configuration/entries/plushies.dm b/code/controllers/configuration/entries/plushies.dm new file mode 100644 index 0000000000..20ad02d399 --- /dev/null +++ b/code/controllers/configuration/entries/plushies.dm @@ -0,0 +1,6 @@ +/datum/config_entry/number/snowflake_plushie_prob + config_entry_value = 50 + +/datum/config_entry/keyed_list/snowflake_plushies + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_TEXT diff --git a/code/datums/action.dm b/code/datums/action.dm index 8659a9e7c4..54c719a6d5 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -544,6 +544,70 @@ cooldown = world.time owner.playsound_local(box, 'sound/misc/box_deploy.ogg', 50, TRUE) +/datum/action/item_action/removeAPCs + name = "Relinquish APC" + desc = "Let go of an APC, relinquish control back to the station." + icon_icon = 'icons/obj/implants.dmi' + button_icon_state = "hijackx" + +/datum/action/item_action/removeAPCs/Trigger() + var/list/areas = list() + for (var/area/a in owner.siliconaccessareas) + areas[a.name] = a + var/removeAPC = input("Select an APC to remove:","Remove APC Control",1) as null|anything in areas + if (!removeAPC) + return + var/area/area = areas[removeAPC] + var/obj/machinery/power/apc/apc = area.get_apc() + if (!apc || !(area in owner.siliconaccessareas)) + return + apc.hijacker = null + apc.update_icon() + apc.set_hijacked_lighting() + owner.toggleSiliconAccessArea(area) + +/datum/action/item_action/accessAPCs + name = "Access APC Interface" + desc = "Open the APC's interface." + icon_icon = 'icons/obj/implants.dmi' + button_icon_state = "hijacky" + +/datum/action/item_action/accessAPCs/Trigger() + var/list/areas = list() + for (var/area/a in owner.siliconaccessareas) + areas[a.name] = a + var/accessAPC = input("Select an APC to access:","Access APC Interface",1) as null|anything in areas + if (!accessAPC) + return + var/area/area = areas[accessAPC] + var/obj/machinery/power/apc/apc = area.get_apc() + if (!apc || !(area in owner.siliconaccessareas)) + return + apc.ui_interact(owner) + +/datum/action/item_action/stealthmodetoggle + name = "Toggle Stealth Mode" + desc = "Toggles the stealth mode on the hijack implant." + icon_icon = 'icons/obj/implants.dmi' + button_icon_state = "hijackz" + +/datum/action/item_action/stealthmodetoggle/Trigger() + var/obj/item/implant/hijack/H = target + if (!istype(H)) + return + if (H.stealthcooldown > world.time) + to_chat(owner,"The hijack implant's stealth mode toggle is still rebooting!") + return + H.stealthmode = !H.stealthmode + for (var/area/area in H.imp_in.siliconaccessareas) + var/obj/machinery/power/apc/apc = area.get_apc() + if (apc) + apc.set_hijacked_lighting() + apc.update_icon() + H.stealthcooldown = world.time + 15 SECONDS + H.toggle_eyes() + to_chat(owner,"You toggle the hijack implant's stealthmode [H.stealthmode ? "on" : "off"].") + /datum/action/item_action/flash name = "Flash" diff --git a/code/datums/components/crafting/recipes/recipes_primal.dm b/code/datums/components/crafting/recipes/recipes_primal.dm index 1be479e4e1..1fc684eddc 100644 --- a/code/datums/components/crafting/recipes/recipes_primal.dm +++ b/code/datums/components/crafting/recipes/recipes_primal.dm @@ -1,10 +1,3 @@ -/datum/crafting_recipe/bonearmor - name = "Bone Armor" - result = /obj/item/clothing/suit/armor/bone - time = 30 - reqs = list(/obj/item/stack/sheet/bone = 6) - category = CAT_PRIMAL - /datum/crafting_recipe/bonetalisman name = "Bone Talisman" result = /obj/item/clothing/accessory/talisman @@ -29,13 +22,6 @@ /obj/item/stack/sheet/sinew = 1) category = CAT_PRIMAL -/datum/crafting_recipe/skullhelm - name = "Skull Helmet" - result = /obj/item/clothing/head/helmet/skull - time = 30 - reqs = list(/obj/item/stack/sheet/bone = 4) - category = CAT_PRIMAL - /datum/crafting_recipe/goliathcloak name = "Goliath Cloak" result = /obj/item/clothing/suit/hooded/cloak/goliath @@ -62,13 +48,6 @@ /obj/item/stack/sheet/sinew = 2) category = CAT_PRIMAL -/datum/crafting_recipe/bonedagger - name = "Bone Dagger" - result = /obj/item/kitchen/knife/combat/bone - time = 20 - reqs = list(/obj/item/stack/sheet/bone = 2) - category = CAT_PRIMAL - /datum/crafting_recipe/bonespear name = "Bone Spear" result = /obj/item/twohanded/bonespear diff --git a/code/datums/components/uplink.dm b/code/datums/components/uplink.dm index 5057253522..d467f66b6a 100644 --- a/code/datums/components/uplink.dm +++ b/code/datums/components/uplink.dm @@ -25,6 +25,7 @@ GLOBAL_LIST_EMPTY(uplinks) var/unlock_code var/failsafe_code var/datum/ui_state/checkstate + var/debug = FALSE /datum/component/uplink/Initialize(_owner, _lockable = TRUE, _enabled = FALSE, datum/game_mode/_gamemode, starting_tc = 20, datum/ui_state/_checkstate) if(!isitem(parent)) @@ -152,7 +153,7 @@ GLOBAL_LIST_EMPTY(uplinks) if(I.restricted_roles.len) var/is_inaccessible = 1 for(var/R in I.restricted_roles) - if(R == user.mind.assigned_role) + if(R == user.mind.assigned_role || debug) is_inaccessible = 0 if(is_inaccessible) continue @@ -294,4 +295,4 @@ GLOBAL_LIST_EMPTY(uplinks) if(!T) return explosion(T,1,2,3) - qdel(parent) //Alternatively could brick the uplink. \ No newline at end of file + qdel(parent) //Alternatively could brick the uplink. diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm index cf14da36a0..c7b9758bcb 100644 --- a/code/datums/diseases/advance/symptoms/heal.dm +++ b/code/datums/diseases/advance/symptoms/heal.dm @@ -448,9 +448,11 @@ symptom_delay_max = 1 passive_message = "Your skin glows faintly for a moment." var/cellular_damage = FALSE - threshold_desc = "Transmission 6: Additionally heals cellular damage and toxin lovers.
\ - Resistance 7: Increases healing speed." - + threshold_desc = list( + "Transmission 6" = "Additionally heals cellular damage and toxin lovers.", + "Resistance 7" = "Increases healing speed.", + ) + /datum/symptom/heal/radiation/Start(datum/disease/advance/A) if(!..()) return diff --git a/code/datums/elements/mob_holder.dm b/code/datums/elements/mob_holder.dm index 5b471a0dc7..04f84ee008 100644 --- a/code/datums/elements/mob_holder.dm +++ b/code/datums/elements/mob_holder.dm @@ -1,5 +1,5 @@ /datum/element/mob_holder - element_flags = ELEMENT_BESPOKE + element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH id_arg_index = 2 var/worn_state var/alt_worn @@ -47,7 +47,7 @@ return FALSE source.visible_message("[user] starts picking up [source].", \ "[user] starts picking you up!") - if(!do_after(user, 20, target = src) || source.buckled) + if(!do_after(user, 20, target = source) || source.buckled) return FALSE source.visible_message("[user] picks up [source]!", \ diff --git a/code/datums/elements/wuv.dm b/code/datums/elements/wuv.dm index 55bc9bafad..fffb90c681 100644 --- a/code/datums/elements/wuv.dm +++ b/code/datums/elements/wuv.dm @@ -1,6 +1,6 @@ /datum/element/wuv //D'awwwww - element_flags = ELEMENT_BESPOKE + element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH id_arg_index = 2 //the for the me emote proc call when petted. var/pet_emote diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index faa7eec392..b2177a860a 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -144,9 +144,8 @@ GLOBAL_LIST_EMPTY(family_heirlooms) /datum/quirk/nearsighted/on_spawn() var/mob/living/carbon/human/H = quirk_holder var/obj/item/clothing/glasses/regular/glasses = new(get_turf(H)) - H.put_in_hands(glasses) - H.equip_to_slot(glasses, SLOT_GLASSES) - H.regenerate_icons() //this is to remove the inhand icon, which persists even if it's not in their hands + if(!H.equip_to_slot_if_possible(glasses, SLOT_GLASSES)) + H.put_in_hands(glasses) /datum/quirk/nyctophobia name = "Nyctophobia" diff --git a/code/datums/wires/airlock.dm b/code/datums/wires/airlock.dm index 315cfa59d6..b6699540c3 100644 --- a/code/datums/wires/airlock.dm +++ b/code/datums/wires/airlock.dm @@ -52,7 +52,7 @@ /datum/wires/airlock/interactable(mob/user) var/obj/machinery/door/airlock/A = holder - if(!issilicon(user) && A.isElectrified() && A.shock(user, 100)) + if(!A.hasSiliconAccessInArea(user) && A.isElectrified() && A.shock(user, 100)) return FALSE if(A.panel_open) return TRUE diff --git a/code/datums/wires/vending.dm b/code/datums/wires/vending.dm index 0c66f26a92..114791e873 100644 --- a/code/datums/wires/vending.dm +++ b/code/datums/wires/vending.dm @@ -12,7 +12,7 @@ /datum/wires/vending/interactable(mob/user) var/obj/machinery/vending/V = holder - if(!issilicon(user) && V.seconds_electrified && V.shock(user, 100)) + if(!V.hasSiliconAccessInArea(user) && V.seconds_electrified && V.shock(user, 100)) return FALSE if(V.panel_open) return TRUE diff --git a/code/game/gamemodes/gangs/gangs.dm b/code/game/gamemodes/gangs/gangs.dm index 9151107d6f..0dc4a520ef 100644 --- a/code/game/gamemodes/gangs/gangs.dm +++ b/code/game/gamemodes/gangs/gangs.dm @@ -6,7 +6,8 @@ GLOBAL_LIST_EMPTY(gangs) name = "gang war" config_tag = "gang" antag_flag = ROLE_GANG - restricted_jobs = list("Security Officer", "Warden", "Detective", "AI", "Cyborg","Captain", "Head of Personnel", "Head of Security") + restricted_jobs = list("AI", "Cyborg") + protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") required_players = 15 required_enemies = 0 recommended_enemies = 2 diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index b6dc09eb59..b5ab859797 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -182,7 +182,7 @@ /obj/machinery/sleeper/AltClick(mob/user) . = ..() - if(!user.canUseTopic(src, !issilicon(user))) + if(!user.canUseTopic(src, !hasSiliconAccessInArea(user))) return if(state_open) close_machine() diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index 44739fcbc0..2272d3db46 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -229,7 +229,7 @@ Class Procs: return !(stat & (NOPOWER|BROKEN|MAINT)) /obj/machinery/can_interact(mob/user) - var/silicon = issiliconoradminghost(user) + var/silicon = hasSiliconAccessInArea(user) || IsAdminGhost(user) if((stat & (NOPOWER|BROKEN)) && !(interaction_flags_machine & INTERACT_MACHINE_OFFLINE)) return FALSE if(panel_open && !(interaction_flags_machine & INTERACT_MACHINE_OPEN)) diff --git a/code/game/machinery/announcement_system.dm b/code/game/machinery/announcement_system.dm index 56227cdd53..5a597f7280 100644 --- a/code/game/machinery/announcement_system.dm +++ b/code/game/machinery/announcement_system.dm @@ -105,7 +105,7 @@ GLOBAL_LIST_EMPTY(announcement_systems) /obj/machinery/announcement_system/ui_interact(mob/user) . = ..() - if(!user.canUseTopic(src, !issilicon(user))) + if(!user.canUseTopic(src, !hasSiliconAccessInArea(user))) return if(stat & BROKEN) visible_message("[src] buzzes.", "You hear a faint buzz.") @@ -123,7 +123,7 @@ GLOBAL_LIST_EMPTY(announcement_systems) /obj/machinery/announcement_system/Topic(href, href_list) if(..()) return - if(!usr.canUseTopic(src, !issilicon(usr))) + if(!usr.canUseTopic(src, !hasSiliconAccessInArea(usr))) return if(stat & BROKEN) visible_message("[src] buzzes.", "You hear a faint buzz.") @@ -132,13 +132,13 @@ GLOBAL_LIST_EMPTY(announcement_systems) if(href_list["ArrivalTopic"]) var/NewMessage = stripped_input(usr, "Enter in the arrivals announcement configuration.", "Arrivals Announcement Config", arrival) - if(!usr.canUseTopic(src, !issilicon(usr))) + if(!usr.canUseTopic(src, !hasSiliconAccessInArea(usr))) return if(NewMessage) arrival = NewMessage else if(href_list["NewheadTopic"]) var/NewMessage = stripped_input(usr, "Enter in the departmental head announcement configuration.", "Head Departmental Announcement Config", newhead) - if(!usr.canUseTopic(src, !issilicon(usr))) + if(!usr.canUseTopic(src, !hasSiliconAccessInArea(usr))) return if(NewMessage) newhead = NewMessage @@ -157,7 +157,7 @@ GLOBAL_LIST_EMPTY(announcement_systems) . = attack_ai(user) /obj/machinery/announcement_system/attack_ai(mob/user) - if(!user.canUseTopic(src, !issilicon(user))) + if(!user.canUseTopic(src, !hasSiliconAccessInArea(user))) return if(stat & BROKEN) to_chat(user, "[src]'s firmware appears to be malfunctioning!") diff --git a/code/game/machinery/computer/arcade/minesweeper.dm b/code/game/machinery/computer/arcade/minesweeper.dm index 641ef1c9cd..3e32c4ceeb 100644 --- a/code/game/machinery/computer/arcade/minesweeper.dm +++ b/code/game/machinery/computer/arcade/minesweeper.dm @@ -304,12 +304,12 @@ /obj/machinery/computer/arcade/minesweeper/proc/custom_generation(mob/user) playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, 0, extrarange = -3, falloff = 10) //Entered into the menu so ping sound var/new_rows = input(user, "How many rows do you want? (Minimum: 4, Maximum: 30)", "Minesweeper Rows") as null|num - if(!new_rows || !user.canUseTopic(src, !issilicon(user))) + if(!new_rows || !user.canUseTopic(src, !hasSiliconAccessInArea(user))) return FALSE new_rows = CLAMP(new_rows + 1, 4, 30) playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, 0, extrarange = -3, falloff = 10) var/new_columns = input(user, "How many columns do you want? (Minimum: 4, Maximum: 50)", "Minesweeper Squares") as null|num - if(!new_columns || !user.canUseTopic(src, !issilicon(user))) + if(!new_columns || !user.canUseTopic(src, !hasSiliconAccessInArea(user))) return FALSE new_columns = CLAMP(new_columns + 1, 4, 50) playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, 0, extrarange = -3, falloff = 10) @@ -317,7 +317,7 @@ var/lower_limit = round(grid_area*0.156) var/upper_limit = round(grid_area*0.85) var/new_mine_limit = input(user, "How many mines do you want? (Minimum: [lower_limit], Maximum: [upper_limit])", "Minesweeper Mines") as null|num - if(!new_mine_limit || !user.canUseTopic(src, !issilicon(user))) + if(!new_mine_limit || !user.canUseTopic(src, !hasSiliconAccessInArea(user))) return FALSE playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, 0, extrarange = -3, falloff = 10) rows = new_rows diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 1d54e8f772..211ff13486 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -36,7 +36,7 @@ return ..() /obj/machinery/computer/security/can_interact(mob/user) - if((!issilicon(user) && !Adjacent(user)) || is_blind(user) || !in_view_range(user, src)) + if((!hasSiliconAccessInArea(user) && !Adjacent(user)) || is_blind(user) || !in_view_range(user, src)) return FALSE return ..() diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index 6703bae525..b0e80b63d2 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -171,7 +171,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) /obj/machinery/computer/card/AltClick(mob/user) . = ..() - if(!user.canUseTopic(src, !issilicon(user)) || !is_operational()) + if(!user.canUseTopic(src, !hasSiliconAccessInArea(user)) || !is_operational()) return if(inserted_modify_id) if(id_eject(user, inserted_modify_id)) @@ -360,7 +360,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) if(..()) return - if(!usr.canUseTopic(src, !issilicon(usr)) || !is_operational()) + if(!usr.canUseTopic(src, !hasSiliconAccessInArea(usr)) || !is_operational()) usr.unset_machine() usr << browse(null, "window=id_com") return @@ -392,7 +392,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) inserted_scan_id = id_to_insert updateUsrDialog() if ("auth") - if ((!( authenticated ) && (inserted_scan_id || issilicon(usr)) || mode)) + if ((!( authenticated ) && (inserted_scan_id || hasSiliconAccessInArea(usr)) || mode)) if (check_access(inserted_scan_id)) region_access = list() head_subordinates = list() @@ -426,7 +426,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) get_subordinates("Quartermaster") if(region_access) authenticated = 1 - else if ((!( authenticated ) && issilicon(usr)) && (!inserted_modify_id)) + else if ((!( authenticated ) && hasSiliconAccessInArea(usr)) && (!inserted_modify_id)) to_chat(usr, "You can't modify an ID without an ID inserted to modify! Once one is in the modify slot on the computer, you can log in.") if ("logout") region_access = null @@ -481,7 +481,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) if ("reg") if (authenticated) var/t2 = inserted_modify_id - if ((authenticated && inserted_modify_id == t2 && (in_range(src, usr) || issilicon(usr)) && isturf(loc))) + if ((authenticated && inserted_modify_id == t2 && (in_range(src, usr) || hasSiliconAccessInArea(usr)) && isturf(loc))) var/newName = reject_bad_name(href_list["reg"]) if(newName) inserted_modify_id.registered_name = newName diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 59574bc603..9d0053c9b2 100755 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -449,7 +449,7 @@ var/datum/browser/popup = new(user, "communications", "Communications Console", 400, 500) popup.set_title_image(user.browse_rsc_icon(icon, icon_state)) - if(issilicon(user)) + if(issilicon(user) || (hasSiliconAccessInArea(user) && !in_range(user,src))) var/dat2 = interact_ai(user) // give the AI a different interact proc to limit its access if(dat2) dat += dat2 diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm index a31f6c71c8..5049a10d2b 100644 --- a/code/game/machinery/computer/dna_console.dm +++ b/code/game/machinery/computer/dna_console.dm @@ -64,7 +64,7 @@ if(!user) return var/datum/browser/popup = new(user, "scannernew", "DNA Modifier Console", 800, 630) // Set up the popup browser window - if(!(in_range(src, user) || issilicon(user))) + if(!(in_range(src, user) || hasSiliconAccessInArea(user))) popup.close() return popup.add_stylesheet("scannernew", 'html/browser/scannernew.css') @@ -318,7 +318,7 @@ return if(!isturf(usr.loc)) return - if(!((isturf(loc) && in_range(src, usr)) || issilicon(usr))) + if(!((isturf(loc) && in_range(src, usr)) || hasSiliconAccessInArea(usr))) return if(current_screen == "working") return diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index ecbde43044..f8dac1b100 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -190,7 +190,7 @@ if(!(active2 in GLOB.data_core.medical)) active2 = null - if(usr.contents.Find(src) || (in_range(src, usr) && isturf(loc)) || issilicon(usr) || IsAdminGhost(usr)) + if(usr.contents.Find(src) || (in_range(src, usr) && isturf(loc)) || hasSiliconAccessInArea(usr) || IsAdminGhost(usr)) usr.set_machine(src) if(href_list["temp"]) temp = null @@ -216,7 +216,7 @@ else if(href_list["login"]) var/mob/M = usr var/obj/item/card/id/I = M.get_idcard(TRUE) - if(issilicon(M)) + if(hasSiliconAccessInArea(M)) active1 = null active2 = null authenticated = 1 @@ -569,7 +569,7 @@ if(user) if(message) if(authenticated) - if(user.canUseTopic(src, !issilicon(user))) + if(user.canUseTopic(src, !hasSiliconAccessInArea(user))) if(!record1 || record1 == active1) if(!record2 || record2 == active2) return 1 diff --git a/code/game/machinery/computer/pod.dm b/code/game/machinery/computer/pod.dm index 1388e3c8de..53f7cb7e32 100644 --- a/code/game/machinery/computer/pod.dm +++ b/code/game/machinery/computer/pod.dm @@ -86,7 +86,7 @@ /obj/machinery/computer/pod/Topic(href, href_list) if(..()) return - if(usr.contents.Find(src) || (in_range(src, usr) && isturf(loc)) || issilicon(usr)) + if(usr.contents.Find(src) || (in_range(src, usr) && isturf(loc)) || hasSiliconAccessInArea(usr)) usr.set_machine(src) if(href_list["power"]) var/t = text2num(href_list["power"]) diff --git a/code/game/machinery/computer/prisoner/management.dm b/code/game/machinery/computer/prisoner/management.dm index 496e14b8f1..4b4b39740a 100644 --- a/code/game/machinery/computer/prisoner/management.dm +++ b/code/game/machinery/computer/prisoner/management.dm @@ -87,7 +87,7 @@ /obj/machinery/computer/prisoner/management/Topic(href, href_list) if(..()) return - if(usr.contents.Find(src) || (in_range(src, usr) && isturf(loc)) || issilicon(usr)) + if(usr.contents.Find(src) || (in_range(src, usr) && isturf(loc)) || hasSiliconAccessInArea(usr)) usr.set_machine(src) if(href_list["id"]) diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index 42e31b2ea6..25f4237439 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -265,7 +265,7 @@ What a mess.*/ active1 = null if(!( GLOB.data_core.security.Find(active2) )) active2 = null - if(usr.contents.Find(src) || (in_range(src, usr) && isturf(loc)) || issilicon(usr) || IsAdminGhost(usr)) + if(usr.contents.Find(src) || (in_range(src, usr) && isturf(loc)) || hasSiliconAccessInArea(usr) || IsAdminGhost(usr)) usr.set_machine(src) switch(href_list["choice"]) // SORTING! @@ -299,7 +299,7 @@ What a mess.*/ if("Log In") var/mob/M = usr var/obj/item/card/id/I = M.get_idcard(TRUE) - if(issilicon(M)) + if(hasSiliconAccessInArea(M)) var/mob/living/silicon/borg = M active1 = null active2 = null @@ -802,7 +802,7 @@ What a mess.*/ /obj/machinery/computer/secure_data/proc/canUseSecurityRecordsConsole(mob/user, message1 = 0, record1, record2) if(user) if(authenticated) - if(user.canUseTopic(src, !issilicon(user))) + if(user.canUseTopic(src, !hasSiliconAccessInArea(user))) if(!trim(message1)) return 0 if(!record1 || record1 == active1) diff --git a/code/game/machinery/computer/teleporter.dm b/code/game/machinery/computer/teleporter.dm index 518f38fc35..6710258626 100644 --- a/code/game/machinery/computer/teleporter.dm +++ b/code/game/machinery/computer/teleporter.dm @@ -140,7 +140,7 @@ obj/machinery/computer/teleporter/ui_interact(mob/user, ui_key = "main", datum/t L[avoid_assoc_duplicate_keys(M.real_name, areaindex)] = M var/desc = input("Please select a location to lock in.", "Locking Computer") as null|anything in L - if(!user.canUseTopic(src, !issilicon(user), NO_DEXTERY)) //check if we are still around + if(!user.canUseTopic(src, !hasSiliconAccessInArea(user), NO_DEXTERY)) //check if we are still around return target = L[desc] if(imp_t) @@ -168,7 +168,7 @@ obj/machinery/computer/teleporter/ui_interact(mob/user, ui_key = "main", datum/t to_chat(user, "No active connected stations located.") return var/desc = input("Please select a station to lock in.", "Locking Computer") as null|anything in L - if(!user.canUseTopic(src, !issilicon(user), NO_DEXTERY)) //again, check if we are still around + if(!user.canUseTopic(src, !hasSiliconAccessInArea(user), NO_DEXTERY)) //again, check if we are still around return var/obj/machinery/teleport/station/target_station = L[desc] if(!target_station || !target_station.teleporter_hub) diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm index 6bedfb0a10..6b0f00ca2e 100644 --- a/code/game/machinery/dance_machine.dm +++ b/code/game/machinery/dance_machine.dm @@ -53,7 +53,7 @@ /obj/machinery/jukebox/ui_interact(mob/user) . = ..() - if(!user.canUseTopic(src, !issilicon(user))) + if(!user.canUseTopic(src, !hasSiliconAccessInArea(user))) return if (!anchored) to_chat(user,"This device must be anchored by a wrench!") diff --git a/code/game/machinery/dish_drive.dm b/code/game/machinery/dish_drive.dm index 7f21d1c1b3..31e6a3cfeb 100644 --- a/code/game/machinery/dish_drive.dm +++ b/code/game/machinery/dish_drive.dm @@ -98,7 +98,7 @@ /obj/machinery/dish_drive/AltClick(mob/living/user) . = ..() - if(user.canUseTopic(src, !issilicon(user))) + if(user.canUseTopic(src, !hasSiliconAccessInArea(user))) do_the_dishes(TRUE) return TRUE diff --git a/code/game/machinery/dna_scanner.dm b/code/game/machinery/dna_scanner.dm index cff2e361bd..60b5a52a10 100644 --- a/code/game/machinery/dna_scanner.dm +++ b/code/game/machinery/dna_scanner.dm @@ -172,7 +172,7 @@ /obj/machinery/dna_scannernew/AltClick(mob/user) . = ..() - if(!user.canUseTopic(src, !issilicon(user))) + if(!user.canUseTopic(src, !hasSiliconAccessInArea(user))) return interact(user) return TRUE diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index f28d520114..863f1e7b46 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -676,7 +676,7 @@ else . += "It looks very robust." - if(issilicon(user) && (!stat & BROKEN)) + if(hasSiliconAccessInArea(user) && (!stat & BROKEN)) . += "Shift-click [src] to [ density ? "open" : "close"] it." . += "Ctrl-click [src] to [ locked ? "raise" : "drop"] its bolts." . += "Alt-click [src] to [ secondsElectrified ? "un-electrify" : "permanently electrify"] it." @@ -1322,9 +1322,9 @@ if(density && !open(2)) //The airlock is still closed, but something prevented it opening. (Another player noticed and bolted/welded the airlock in time!) to_chat(user, "Despite your efforts, [src] managed to resist your attempts to open it!") -/obj/machinery/door/airlock/hostile_lockdown(mob/origin) +/obj/machinery/door/airlock/hostile_lockdown(mob/origin, aicontrolneeded = TRUE) // Must be powered and have working AI wire. - if(canAIControl(src) && !stat) + if((aicontrolneeded && canAIControl(src) && !stat) || !aicontrolneeded) locked = FALSE //For airlocks that were bolted open. safe = FALSE //DOOR CRUSH close() @@ -1334,9 +1334,9 @@ LAZYADD(shockedby, "\[[TIME_STAMP("hh:mm:ss", FALSE)]\] [key_name(origin)]") -/obj/machinery/door/airlock/disable_lockdown() +/obj/machinery/door/airlock/disable_lockdown(aicontrolneeded = TRUE) // Must be powered and have working AI wire. - if(canAIControl(src) && !stat) + if((aicontrolneeded && canAIControl(src) && !stat) || !aicontrolneeded) unbolt() set_electrified(NOT_ELECTRIFIED) open() @@ -1528,7 +1528,7 @@ . = TRUE /obj/machinery/door/airlock/proc/user_allowed(mob/user) - return (issilicon(user) && canAIControl(user)) || IsAdminGhost(user) + return (hasSiliconAccessInArea(user) && canAIControl(user)) || IsAdminGhost(user) /obj/machinery/door/airlock/proc/shock_restore(mob/user) if(!user_allowed(user)) diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index 7097de1f3b..df5a6ced52 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -514,7 +514,7 @@ GLOBAL_LIST_EMPTY(allCasters) if(active_user && !isobserver(active_user) && get_dist(active_user,src)<=1 && usr!=active_user) to_chat(usr, "You must wait for [active_user] to finish and move away.") return - if ((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && isturf(loc))) || issilicon(usr) || isobserver(usr)) + if ((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && isturf(loc))) || hasSiliconAccessInArea(usr) || isobserver(usr)) usr.set_machine(src) scan_user(usr) if(href_list["set_channel_name"]) diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index a27cb9b78c..60085e0bf8 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -348,6 +348,26 @@ spark_system.start() //creates some sparks because they look cool qdel(cover) //deletes the cover - no need on keeping it there! +//turret healing +/obj/machinery/porta_turret/examine(mob/user) + . = ..() + if(obj_integrity < max_integrity) + . += "Use a welder to fix it." + +/obj/machinery/porta_turret/welder_act(mob/living/user, obj/item/I) + . = TRUE + if(obj_integrity < max_integrity) + if(!I.tool_start_check(user, amount=0)) + return + user.visible_message("[user] is welding the turret.", \ + "You begin repairing the turret...", \ + "You hear welding.") + if(I.use_tool(src, user, 40, volume=50)) + obj_integrity = max_integrity + user.visible_message("[user.name] has repaired [src].", \ + "You finish repairing the turret.") + else + to_chat(user, "The turret doesn't need repairing.") /obj/machinery/porta_turret/process() @@ -672,6 +692,7 @@ lethal_projectile_sound = 'sound/weapons/laser.ogg' desc = "An energy blaster auto-turret." + /obj/machinery/porta_turret/syndicate/energy/heavy icon_state = "standard_stun" base_icon_state = "standard" @@ -683,6 +704,11 @@ lethal_projectile_sound = 'sound/weapons/lasercannonfire.ogg' desc = "An energy blaster auto-turret." +/obj/machinery/porta_turret/syndicate/energy/pirate + max_integrity = 260 + integrity_failure = 20 + armor = list("melee" = 50, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 50, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90) + /obj/machinery/porta_turret/syndicate/setup() return @@ -839,7 +865,7 @@ /obj/machinery/turretid/examine(mob/user) . = ..() - if(issilicon(user) && (!stat & BROKEN)) + if(hasSiliconAccessInArea(user) && (!stat & BROKEN)) . += "Ctrl-click [src] to [ enabled ? "disable" : "enable"] turrets." . += "Alt-click [src] to set turrets to [ lethal ? "stun" : "kill"]." @@ -854,7 +880,7 @@ to_chat(user, "You link \the [M.buffer] with \the [src]") return - if (issilicon(user)) + if (hasSiliconAccessInArea(user)) return attack_hand(user) if ( get_dist(src, user) == 0 ) // trying to unlock the interface @@ -895,7 +921,7 @@ /obj/machinery/turretid/ui_interact(mob/user) . = ..() if ( get_dist(src, user) > 0 ) - if ( !(issilicon(user) || IsAdminGhost(user)) ) + if ( !(hasSiliconAccessInArea(user) || IsAdminGhost(user)) ) to_chat(user, "You are too far away.") user.unset_machine() user << browse(null, "window=turretid") @@ -903,10 +929,10 @@ var/t = "" - if(locked && !(issilicon(user) || IsAdminGhost(user))) + if(locked && !(hasSiliconAccessInArea(user) || IsAdminGhost(user))) t += "
Swipe ID card to unlock interface
" else - if(!issilicon(user) && !IsAdminGhost(user)) + if(!hasSiliconAccessInArea(user) && !IsAdminGhost(user)) t += "
Swipe ID card to lock interface
" t += "Turrets [enabled?"activated":"deactivated"] - [enabled?"Disable":"Enable"]?
" t += "Currently set for [lethal?"lethal":"stun repeatedly"] - Change to [lethal?"Stun repeatedly":"Lethal"]?
" @@ -920,7 +946,7 @@ if(..()) return if (locked) - if(!(issilicon(usr) || IsAdminGhost(usr))) + if(!(hasSiliconAccessInArea(usr) || IsAdminGhost(usr))) to_chat(usr, "Control panel is locked!") return if (href_list["toggleOn"]) diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index 16016b8e18..b4288310b0 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -124,7 +124,7 @@ . = ..() if(.) return - if(locked && !issilicon(user)) + if(locked && !hasSiliconAccessInArea(user)) to_chat(user, "The machine is locked, you are unable to use it!") return if(panel_open) @@ -370,7 +370,7 @@ if(!anchored) to_chat(user, "\The [src] needs to be firmly secured to the floor first!") return - if(locked && !issilicon(user)) + if(locked && !hasSiliconAccessInArea(user)) to_chat(user, "The controls are locked!") return if(!power) diff --git a/code/game/machinery/telecomms/computers/logbrowser.dm b/code/game/machinery/telecomms/computers/logbrowser.dm index c1db49605c..f2b2c594b7 100644 --- a/code/game/machinery/telecomms/computers/logbrowser.dm +++ b/code/game/machinery/telecomms/computers/logbrowser.dm @@ -196,7 +196,7 @@ var/newnet = stripped_input(usr, "Which network do you want to view?", "Comm Monitor", network) - if(newnet && ((usr in range(1, src)) || issilicon(usr))) + if(newnet && ((usr in range(1, src)) || hasSiliconAccessInArea(usr))) if(length(newnet) > 15) temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -" diff --git a/code/game/machinery/telecomms/computers/message.dm b/code/game/machinery/telecomms/computers/message.dm index 884c2bb37d..5e39997872 100644 --- a/code/game/machinery/telecomms/computers/message.dm +++ b/code/game/machinery/telecomms/computers/message.dm @@ -260,7 +260,7 @@ if(..()) return - if(usr.contents.Find(src) || (in_range(src, usr) && isturf(loc)) || issilicon(usr)) + if(usr.contents.Find(src) || (in_range(src, usr) && isturf(loc)) || hasSiliconAccessInArea(usr)) //Authenticate if (href_list["auth"]) if(LINKED_SERVER_NONRESPONSIVE) diff --git a/code/game/machinery/telecomms/computers/telemonitor.dm b/code/game/machinery/telecomms/computers/telemonitor.dm index aebef711a9..23c03514ca 100644 --- a/code/game/machinery/telecomms/computers/telemonitor.dm +++ b/code/game/machinery/telecomms/computers/telemonitor.dm @@ -108,7 +108,7 @@ if(href_list["network"]) var/newnet = stripped_input(usr, "Which network do you want to view?", "Comm Monitor", network) - if(newnet && ((usr in range(1, src)) || issilicon(usr))) + if(newnet && ((usr in range(1, src)) || hasSiliconAccessInArea(usr))) if(length(newnet) > 15) temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -" diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm index 8cd8b479d8..4de8929b6b 100644 --- a/code/game/machinery/telecomms/machine_interactions.dm +++ b/code/game/machinery/telecomms/machine_interactions.dm @@ -30,7 +30,7 @@ /obj/machinery/telecomms/ui_interact(mob/user) . = ..() // You need a multitool to use this, or be silicon - if(!issilicon(user)) + if(!hasSiliconAccessInArea(user)) // istype returns false if the value is null if(!istype(user.get_active_held_item(), /obj/item/multitool)) return @@ -97,7 +97,7 @@ var/obj/item/multitool/P = null // Let's double check - if(!issilicon(user) && istype(user.get_active_held_item(), /obj/item/multitool)) + if(!hasSiliconAccessInArea(user) && istype(user.get_active_held_item(), /obj/item/multitool)) P = user.get_active_held_item() else if(isAI(user)) var/mob/living/silicon/ai/U = user @@ -162,7 +162,7 @@ if(..()) return - if(!issilicon(usr)) + if(!hasSiliconAccessInArea(usr)) if(!istype(usr.get_active_held_item(), /obj/item/multitool)) return @@ -270,6 +270,6 @@ updateUsrDialog() /obj/machinery/telecomms/proc/canAccess(mob/user) - if(issilicon(user) || in_range(user, src)) + if(hasSiliconAccessInArea(user) || in_range(user, src)) return TRUE return FALSE diff --git a/code/game/machinery/transformer.dm b/code/game/machinery/transformer.dm index 3ff2424d83..4ed2473260 100644 --- a/code/game/machinery/transformer.dm +++ b/code/game/machinery/transformer.dm @@ -27,7 +27,7 @@ /obj/machinery/transformer/examine(mob/user) . = ..() - if(cooldown && (issilicon(user) || isobserver(user))) + if(cooldown && (hasSiliconAccessInArea(user) || isobserver(user))) . += "It will be ready in [DisplayTimeText(cooldown_timer - world.time)]." /obj/machinery/transformer/Destroy() diff --git a/code/game/objects/effects/spawners/structure.dm b/code/game/objects/effects/spawners/structure.dm index a5a4dfb44b..cdf3f3e6b4 100644 --- a/code/game/objects/effects/spawners/structure.dm +++ b/code/game/objects/effects/spawners/structure.dm @@ -163,6 +163,10 @@ again. icon_state = "plastitaniumwindow_spawner" spawn_list = list(/obj/structure/grille, /obj/structure/window/plastitanium) +//plastitanium pirate window + +/obj/effect/spawner/structure/window/plastitanium/pirate + spawn_list = list(/obj/structure/grille, /obj/structure/window/plastitanium/pirate) //ice window diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index 1bef477a30..f40b7f5c49 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -542,3 +542,14 @@ update_label("John Doe", "Clowny") /obj/item/card/id/knight/captain id_color = "#FFD700" + +/obj/item/card/id/debug + name = "\improper Debug ID" + desc = "A debug ID card. Has ALL the all access, you really shouldn't have this." + icon_state = "ert_janitor" + assignment = "Jannie" + +/obj/item/card/id/debug/Initialize() + access = get_all_accesses()+get_all_centcom_access()+get_all_syndicate_access() + . = ..() + diff --git a/code/game/objects/items/debug_items.dm b/code/game/objects/items/debug_items.dm new file mode 100644 index 0000000000..c7aaab6a26 --- /dev/null +++ b/code/game/objects/items/debug_items.dm @@ -0,0 +1,102 @@ +/* This file contains standalone items for debug purposes. */ + +/obj/item/debug/human_spawner + name = "human spawner" + desc = "Spawn a human by aiming at a turf and clicking. Use in hand to change type." + icon = 'icons/obj/guns/magic.dmi' + icon_state = "nothingwand" + item_state = "wand" + lefthand_file = 'icons/mob/inhands/items_lefthand.dmi' + righthand_file = 'icons/mob/inhands/items_righthand.dmi' + w_class = WEIGHT_CLASS_SMALL + var/datum/species/selected_species + var/valid_species = list() + +/obj/item/debug/human_spawner/afterattack(atom/target, mob/user, proximity) + ..() + if(isturf(target)) + var/mob/living/carbon/human/H = new /mob/living/carbon/human(target) + if(selected_species) + H.set_species(selected_species) + +/obj/item/debug/human_spawner/attack_self(mob/user) + ..() + var/choice = input("Select a species", "Human Spawner", null) in GLOB.species_list + selected_species = GLOB.species_list[choice] + +/* Revive this once we purge all the istype checks for tools for tool_behaviour +/obj/item/debug/omnitool + name = "omnitool" + desc = "The original hypertool, born before them all. Use it in hand to unleash it's true power." + icon = 'icons/obj/device.dmi' + icon_state = "hypertool" + item_state = "hypertool" + toolspeed = 0.1 + tool_behaviour = null + +/obj/item/debug/omnitool/examine() + . = ..() + . += " The mode is: [tool_behaviour]" + +/obj/item/debug/omnitool/proc/check_menu(mob/user) + if(!istype(user)) + return FALSE + if(user.incapacitated() || !user.Adjacent(src)) + return FALSE + return TRUE + +/obj/item/debug/omnitool/attack_self(mob/user) + if(!user) + return + var/list/tool_list = list( + "Crowbar" = image(icon = 'icons/obj/tools.dmi', icon_state = "crowbar"), + "Multitool" = image(icon = 'icons/obj/device.dmi', icon_state = "multitool"), + "Screwdriver" = image(icon = 'icons/obj/tools.dmi', icon_state = "screwdriver_map"), + "Wirecutters" = image(icon = 'icons/obj/tools.dmi', icon_state = "cutters_map"), + "Wrench" = image(icon = 'icons/obj/tools.dmi', icon_state = "wrench"), + "Welding Tool" = image(icon = 'icons/obj/tools.dmi', icon_state = "miniwelder"), + "Analyzer" = image(icon = 'icons/obj/device.dmi', icon_state = "analyzer"), + "Mining Tool" = image(icon = 'icons/obj/mining.dmi', icon_state = "minipick"), + "Shovel" = image(icon = 'icons/obj/mining.dmi', icon_state = "spade"), + "Retractor" = image(icon = 'icons/obj/surgery.dmi', icon_state = "retractor"), + "Hemostat" = image(icon = 'icons/obj/surgery.dmi', icon_state = "hemostat"), + "Cautery" = image(icon = 'icons/obj/surgery.dmi', icon_state = "cautery"), + "Drill" = image(icon = 'icons/obj/surgery.dmi', icon_state = "drill"), + "Scalpel" = image(icon = 'icons/obj/surgery.dmi', icon_state = "scalpel"), + "Saw" = image(icon = 'icons/obj/surgery.dmi', icon_state = "saw") + ) + var/tool_result = show_radial_menu(user, src, tool_list, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE) + if(!check_menu(user)) + return + switch(tool_result) + if("Crowbar") + tool_behaviour = TOOL_CROWBAR + if("Multitool") + tool_behaviour = TOOL_MULTITOOL + if("Screwdriver") + tool_behaviour = TOOL_SCREWDRIVER + if("Wirecutters") + tool_behaviour = TOOL_WIRECUTTER + if("Wrench") + tool_behaviour = TOOL_WRENCH + if("Welding Tool") + tool_behaviour = TOOL_WELDER + if("Analyzer") + tool_behaviour = TOOL_ANALYZER + if("Mining Tool") + tool_behaviour = TOOL_MINING + if("Shovel") + tool_behaviour = TOOL_SHOVEL + if("Retractor") + tool_behaviour = TOOL_RETRACTOR + if("Hemostat") + tool_behaviour = TOOL_HEMOSTAT + if("Cautery") + tool_behaviour = TOOL_CAUTERY + if("Drill") + tool_behaviour = TOOL_DRILL + if("Scalpel") + tool_behaviour = TOOL_SCALPEL + if("Saw") + tool_behaviour = TOOL_SAW +*/ diff --git a/code/game/objects/items/dehy_carp.dm b/code/game/objects/items/dehy_carp.dm index 55d1a2c78a..03ff354ffb 100644 --- a/code/game/objects/items/dehy_carp.dm +++ b/code/game/objects/items/dehy_carp.dm @@ -8,6 +8,7 @@ var/mob/owner = null //Carp doesn't attack owner, set when using in hand var/owned = 0 //Boolean, no owner to begin with var/mobtype = /mob/living/simple_animal/hostile/carp //So admins can change what mob spawns via var fuckery + can_random_spawn = FALSE //Attack self /obj/item/toy/plush/carpplushie/dehy_carp/attack_self(mob/user) diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 6bac77258d..fe8f3ca626 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -721,7 +721,7 @@ GLOBAL_LIST_EMPTY(PDAs) return /obj/item/pda/proc/remove_id(mob/user) - if(issilicon(user) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + if(hasSiliconAccessInArea(user) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) return do_remove_id(user) @@ -916,7 +916,7 @@ GLOBAL_LIST_EMPTY(PDAs) remove_pen() /obj/item/pda/proc/toggle_light() - if(issilicon(usr) || !usr.canUseTopic(src, BE_CLOSE)) + if(hasSiliconAccessInArea(usr) || !usr.canUseTopic(src, BE_CLOSE)) return if(fon) fon = FALSE @@ -928,7 +928,7 @@ GLOBAL_LIST_EMPTY(PDAs) /obj/item/pda/proc/remove_pen() - if(issilicon(usr) || !usr.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + if(hasSiliconAccessInArea(usr) || !usr.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) return if(inserted_item) diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm index 4f4a6fc4e8..7576fe83cc 100644 --- a/code/game/objects/items/devices/PDA/cart.dm +++ b/code/game/objects/items/devices/PDA/cart.dm @@ -609,7 +609,7 @@ Code: /obj/item/cartridge/Topic(href, href_list) ..() - if(!usr.canUseTopic(src, !issilicon(usr))) + if(!usr.canUseTopic(src, !hasSiliconAccessInArea(usr))) usr.unset_machine() usr << browse(null, "window=pda") return diff --git a/code/game/objects/items/implants/implant_hijack.dm b/code/game/objects/items/implants/implant_hijack.dm new file mode 100644 index 0000000000..8a08232859 --- /dev/null +++ b/code/game/objects/items/implants/implant_hijack.dm @@ -0,0 +1,121 @@ +#define HIJACK_APC_MAX_AMOUNT 5 + +/obj/item/implant/hijack + name = "hijack implant" + desc = "Allows you to control the machinery in a room by hacking into the APC." + actions_types = list(/datum/action/item_action/hands_free/activate, /datum/action/item_action/removeAPCs, /datum/action/item_action/accessAPCs, /datum/action/item_action/stealthmodetoggle) + activated = 1 + var/toggled = FALSE + icon_state = "hijack" + var/eye_color + var/stealthmode = FALSE + var/stealthcooldown = 0 + var/hijacking = FALSE + +/obj/item/implant/hijack/activate() + . = ..() + toggled = !toggled + imp_in.click_intercept = toggled ? src : null + imp_in.siliconaccesstoggle = toggled ? TRUE : FALSE + to_chat(imp_in,"You turn [toggled ? "on" : "off"] [src]'s silicon interactions.") + toggle_eyes() + +/obj/item/implant/hijack/proc/toggle_eyes() + if (!ishuman(imp_in)) + return + var/on = toggled && !stealthmode + var/mob/living/carbon/human/H = imp_in + H.eye_color = on ? "ff0" : eye_color + H.dna.update_ui_block(DNA_EYE_COLOR_BLOCK) + H.update_body() + +/obj/item/implant/hijack/implant(mob/living/target, mob/user, silent = FALSE) + if(..()) + ADD_TRAIT(target, TRAIT_HIJACKER, "implant") + if (ishuman(target)) + var/mob/living/carbon/human/H = target + eye_color = H.eye_color + return TRUE + +/obj/item/implant/hijack/removed(mob/target, silent = FALSE, special = 0) + if(..()) + REMOVE_TRAIT(target, TRAIT_HIJACKER, "implant") + for (var/area/area in imp_in.siliconaccessareas) + imp_in.toggleSiliconAccessArea(area) + var/obj/machinery/power/apc/apc = area.get_apc() + if (apc) + apc.hijacker = null + apc.set_hijacked_lighting() + apc.update_icon() + if (ishuman(target)) + var/mob/living/carbon/human/H = target + H.eye_color = eye_color + return TRUE + +/obj/item/implant/hijack/proc/InterceptClickOn(mob/living/user,params,atom/object) + if (isitem(object) || !toggled || user.incapacitated()) + return + if (stealthmode == FALSE && istype(object,/obj/machinery/power/apc) && !user.CanReach(object)) + if (hijack_remotely(object)) + return + if (stealthmode && !user.CanReach(object)) + return + if (!object.hasSiliconAccessInArea(imp_in)) + return + var/list/modifiers = params2list(params) + imp_in.face_atom(object) + if (modifiers["shift"] && modifiers["ctrl"]) + object.AICtrlShiftClick(imp_in) + return TRUE + if (modifiers["shift"]) + object.AIShiftClick(imp_in) + return TRUE + if (modifiers["ctrl"]) + object.AICtrlClick(imp_in) + return TRUE + if (modifiers["alt"]) + object.AIAltClick(imp_in) + return TRUE + if (user.get_active_held_item()) + return + if (user.CanReach(object)) + object.attack_robot(imp_in) + else + object.attack_ai(imp_in) + return TRUE + +/obj/item/implant/hijack/proc/hijack_remotely(obj/machinery/power/apc/apc) + if (apc.hijacker || hijacking) + return FALSE //can't remotely hijack an already hijacked APC + hijacking = TRUE + to_chat(imp_in, "Establishing remote connection with APC.") + if (!do_after(imp_in, 4 SECONDS,target=apc)) + to_chat(imp_in, "Aborting.") + hijacking = FALSE + return TRUE + if (LAZYLEN(imp_in.siliconaccessareas) >= HIJACK_APC_MAX_AMOUNT) + to_chat(src,"You are connected to too many APCs! Too many more will fry your brain.") + hijacking = FALSE + return TRUE + imp_in.light_power = 2 + imp_in.light_range = 2 + imp_in.light_color = COLOR_YELLOW + imp_in.update_light() + imp_in.visible_message("[imp_in] starts glowing a with a hollow yellow light!") + to_chat(imp_in, "Beginning hijack of APC.") + if (do_after(imp_in, 21 SECONDS,target=apc)) + apc.hijacker = imp_in + stealthmode = FALSE + apc.set_hijacked_lighting() + imp_in.toggleSiliconAccessArea(apc.area) + apc.update_icon() + stealthcooldown = world.time + 1 MINUTES + 30 SECONDS + toggle_eyes() + else + to_chat(imp_in, "Aborting.") + hijacking = FALSE + imp_in.light_power = 0 + imp_in.light_range = 0 + imp_in.light_color = COLOR_YELLOW + imp_in.update_light() + return TRUE \ No newline at end of file diff --git a/code/game/objects/items/implants/implanter.dm b/code/game/objects/items/implants/implanter.dm index ab902369cc..a0e27f14f0 100644 --- a/code/game/objects/items/implants/implanter.dm +++ b/code/game/objects/items/implants/implanter.dm @@ -74,4 +74,8 @@ /obj/item/implanter/stealth name = "implanter (stealth)" - imp_type = /obj/item/implant/stealth \ No newline at end of file + imp_type = /obj/item/implant/stealth + +/obj/item/implanter/hijack + name = "implanter (hijack)" + imp_type = /obj/item/implant/hijack \ No newline at end of file diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm index 705dcad6c6..a2a8cb3150 100644 --- a/code/game/objects/items/plushes.dm +++ b/code/game/objects/items/plushes.dm @@ -31,7 +31,16 @@ var/normal_desc //--end of love :'(-- -/obj/item/toy/plush/Initialize() + var/snowflake_id //if we set from a config snowflake plushie. + var/can_random_spawn = TRUE //if this is FALSE, don't spawn this for random plushies. + +/obj/item/toy/plush/random_snowflake/Initialize(mapload, set_snowflake_id) + . = ..() + var/list/configlist = CONFIG_GET(keyed_list/snowflake_plushies) + var/id = pick(configlist) + set_snowflake_from_config(id) + +/obj/item/toy/plush/Initialize(mapload, set_snowflake_id) . = ..() AddComponent(/datum/component/squeak, squeak_override) @@ -50,6 +59,9 @@ normal_desc = desc + if(set_snowflake_id) + set_snowflake_from_config(set_snowflake_id) + /obj/item/toy/plush/Destroy() QDEL_NULL(grenade) @@ -97,6 +109,44 @@ return ..() +/obj/item/toy/plush/proc/set_snowflake_from_config(id) + var/list/configlist = CONFIG_GET(keyed_list/snowflake_plushies) + var/list/jsonlist = configlist[id] + ASSERT(jsonlist) + jsonlist = json_decode(jsonlist) + if(jsonlist["inherit_from"]) + var/path = text2path(jsonlist["inherit_from"]) + if(!ispath(path, /obj/item/toy/plush)) + stack_trace("Invalid path for inheritance") + else + var/obj/item/toy/plush/P = new path //can't initial() lists + name = P.name + desc = P.desc + icon_state = P.icon_state + item_state = P.item_state + icon = P.icon + squeak_override = P.squeak_override + attack_verb = P.attack_verb + gender = P.gender + qdel(P) + if(jsonlist["name"]) + name = jsonlist["name"] + if(jsonlist["desc"]) + desc = jsonlist["desc"] + if(jsonlist["gender"]) + gender = jsonlist["gender"] + if(jsonlist["icon_state"]) + icon_state = jsonlist["icon_state"] + item_state = jsonlist["item_state"] + icon = 'config/plushies/sprites.dmi' + if(jsonlist["attack_verb"]) + attack_verb = jsonlist["attack_verb"] + if(jsonlist["squeak_override"]) + squeak_override = jsonlist["squeak_override"] + if(squeak_override) + var/datum/component/squeak/S = GetComponent(/datum/component/squeak) + S?.override_squeak_sounds = squeak_override + /obj/item/toy/plush/handle_atom_del(atom/A) if(A == grenade) grenade = null @@ -367,13 +417,22 @@ if(mood_message) desc += mood_message +GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths()) +/proc/valid_plushie_paths() + . = list() + for(var/i in subtypesof(/obj/item/toy/plush)) + var/obj/item/toy/plush/abstract = i + if(!initial(abstract.can_random_spawn)) + continue + . += i + /obj/item/toy/plush/random name = "Illegal plushie" desc = "Something fucked up" - var/blacklisted_plushes = list(/obj/item/toy/plush/carpplushie/dehy_carp, /obj/item/toy/plush/awakenedplushie, /obj/item/toy/plush/random) + can_random_spawn = FALSE /obj/item/toy/plush/random/Initialize() - var/newtype = pick(subtypesof(/obj/item/toy/plush) - typecacheof(blacklisted_plushes)) + var/newtype = prob(CONFIG_GET(number/snowflake_plushie_prob))? /obj/item/toy/plush/random_snowflake : pick(GLOB.valid_plushie_paths) new newtype(loc) return INITIALIZE_HINT_QDEL @@ -504,115 +563,12 @@ attack_verb = list("clawed", "hissed", "tail slapped") squeak_override = list('sound/weapons/slash.ogg' = 1) -/obj/item/toy/plush/lizardplushie/durgit - icon_state = "durgit" - item_state = "durgit" - squeak_override = list('modular_citadel/sound/voice/weh.ogg' = 1) //Durgit's the origin of the sound - -/obj/item/toy/plush/lizardplushie/rio - icon_state = "rio" - item_state = "rio" - -/obj/item/toy/plush/lizardplushie/dan - icon_state = "dan" - item_state = "dan" - -/obj/item/toy/plush/lizardplushie/urinsu - icon_state = "urinsu" - item_state = "urinsu" - -/obj/item/toy/plush/lizardplushie/arfrehn - icon_state = "arfrehn" - item_state = "arfrehn" - -/obj/item/toy/plush/lizardplushie/soars - icon_state = "soars" - item_state = "soars" - -/obj/item/toy/plush/lizardplushie/ghostie - icon_state = "ghostie" - item_state = "ghostie" - -/obj/item/toy/plush/lizardplushie/amber - icon_state = "amber" - item_state = "amber" - -/obj/item/toy/plush/lizardplushie/cyan - icon_state = "cyan" - item_state = "cyan" - -/obj/item/toy/plush/lizardplushie/meena - icon_state = "meena" - item_state = "meena" - -/obj/item/toy/plush/lizardplushie/stalks - icon_state = "stalks" - item_state = "stalks" - /obj/item/toy/plush/lizardplushie/kobold + name = "kobold plushie" + desc = "An adorable stuffed toy that resembles a kobold." icon_state = "kobold" item_state = "kobold" -/obj/item/toy/plush/lizardplushie/gorgi - icon_state = "gorgi" - item_state = "gorgi" - -/obj/item/toy/plush/lizardplushie/almaz - icon_state = "almaz" - item_state = "almaz" - squeak_override = list('modular_citadel/sound/voice/raptor_purr.ogg' = 1) - -/obj/item/toy/plush/lizardplushie/garou - icon_state = "garou" - item_state = "garou" - -/obj/item/toy/plush/lizardplushie/augments - icon_state = "augments" - item_state = "augments" - squeak_override = list('modular_citadel/sound/voice/weh.ogg' = 1) //I have no mouth and I must weh - attack_verb = list("hugged", "patted", "snugged", "booped") - -/obj/item/toy/plush/lizardplushie/xekov - icon_state = "xekov" - item_state = "xekov" - -/obj/item/toy/plush/lizardplushie/greg - icon_state = "greg" - item_state = "greg" - -/obj/item/toy/plush/lizardplushie/sin - icon_state = "sin" - item_state = "sin" - desc = "An adorable stuffed toy that resembles a lizardperson.. It faintly smells of sulfur." - -/obj/item/toy/plush/lizardplushie/ends - icon_state = "ends" - item_state = "ends" - -/obj/item/toy/plush/lizardplushie/lyssa - icon_state = "lyssa" - item_state = "lyssa" - -/obj/item/toy/plush/snakeplushie - name = "snake plushie" - desc = "An adorable stuffed toy that resembles a snake. Not to be mistaken for the real thing." - icon_state = "plushie_snake" - item_state = "plushie_snake" - attack_verb = list("bitten", "hissed", "tail slapped") - squeak_override = list('modular_citadel/sound/voice/hiss.ogg' = 1) - -/obj/item/toy/plush/snakeplushie/sasha - icon_state = "sasha" - item_state = "sasha" - -/obj/item/toy/plush/snakeplushie/shay - icon_state = "shay" - item_state = "shay" - -/obj/item/toy/plush/snakeplushie/vulken - icon_state = "vulken" - item_state = "vulken" - /obj/item/toy/plush/nukeplushie name = "operative plushie" desc = "A stuffed toy that resembles a syndicate nuclear operative. The tag claims operatives to be purely fictitious." @@ -630,29 +586,17 @@ squeak_override = list('sound/effects/blobattack.ogg' = 1) gender = FEMALE //given all the jokes and drawings, I'm not sure the xenobiologists would make a slimeboy -/obj/item/toy/plush/slimeplushie/annie - desc = "An adorable stuffed toy that resembles a slimey crewmember." - icon_state = "annie" - item_state = "annie" - -/obj/item/toy/plush/slimeplushie/paxton - desc = "An adorable stuffed toy that resembles a slimey crewmember." - icon_state = "paxton" - item_state = "paxton" - attack_verb = list("CQC'd", "jabroni'd", "powergamed", "robusted", "cakehatted") - gender = MALE - /obj/item/toy/plush/awakenedplushie name = "awakened plushie" desc = "An ancient plushie that has grown enlightened to the true nature of reality." icon_state = "plushie_awake" item_state = "plushie_awake" + can_random_spawn = FALSE /obj/item/toy/plush/awakenedplushie/ComponentInitialize() . = ..() AddComponent(/datum/component/edit_complainer) - /obj/item/toy/plush/beeplushie name = "bee plushie" desc = "A cute toy that resembles an even cuter bee." @@ -668,21 +612,7 @@ icon_state = "bumble" item_state = "bumble" squeak_override = list('modular_citadel/sound/voice/mothsqueak.ogg' = 1) - -/obj/item/toy/plush/mothplushie/nameko - icon_state = "nameko" - item_state = "nameko" - -/obj/item/toy/plush/mothplushie/suru - icon_state = "suru" - item_state = "suru" - -/obj/item/toy/plush/xeno - name = "xenohybrid plushie" - desc = "An adorable stuffed toy that resmembles a xenomorphic crewmember." - icon_state = "seras" - item_state = "seras" - squeak_override = list('sound/voice/hiss2.ogg' = 1) + can_random_spawn = FALSE /obj/item/toy/plush/lampplushie name = "lamp plushie" @@ -736,20 +666,6 @@ icon_state = "scrubpuppy" item_state = "scrubpuppy" -/obj/item/toy/plush/borgplushie/seeking - icon_state = "seeking" - item_state = "seeking" - -/obj/item/toy/plush/borgplushie/neeb - icon_state = "neeb" - item_state = "neeb" - -/obj/item/toy/plush/borgplushie/bhijn - desc = "An adorable stuffed toy of a IPC." - icon_state = "bhijn" - item_state = "bhijn" - attack_verb = list("closed", "reworked", "merged") - /obj/item/toy/plush/aiplush name = "AI plushie" desc = "A little stuffed toy AI core... it appears to be malfunctioning." @@ -758,246 +674,22 @@ attack_verb = list("hacked", "detonated", "overloaded") squeak_override = list('sound/machines/beep.ogg' = 9, 'sound/machines/buzz-two.ogg' = 1) -/obj/item/toy/plush/bird - name = "bird plushie" - desc = "An adorable stuffed plushie that resembles an avian." - icon_state = "sylas" - item_state = "sylas" - attack_verb = list("peeped", "beeped", "poofed") - squeak_override = list('modular_citadel/sound/voice/peep.ogg' = 1) - -/obj/item/toy/plush/bird/esela - icon_state = "esela" - item_state = "esela" - -/obj/item/toy/plush/bird/jahonna - icon_state = "jahonna" - item_state = "jahonna" - -/obj/item/toy/plush/bird/krick - icon_state = "krick" - item_state = "krick" - -/obj/item/toy/plush/bird/birddi - icon_state = "birddi" - item_state = "birddi" - -/obj/item/toy/plush/bird/jewel - icon_state = "jewel" - item_state = "jewel" - -/obj/item/toy/plush/sergal - name = "sergal plushie" - desc = "An adorable stuffed plushie that resembles a sagaru." - icon_state = "faux" - item_state = "faux" - squeak_override = list('modular_citadel/sound/voice/merp.ogg' = 1) - -/obj/item/toy/plush/sergal/gladwyn - icon_state = "gladwyn" - item_state = "gladwyn" - -/obj/item/toy/plush/sergal/jermaine - icon_state = "jermaine" - item_state = "jermaine" - -/obj/item/toy/plush/mammal - name = "mammal plushie" - desc = "An adorable stuffed toy resembling some sort of crew member." - icon_state = "dubious" - item_state = "dubious" - -/obj/item/toy/plush/mammal/gavin - icon_state = "gavin" - item_state = "gavin" - -/obj/item/toy/plush/mammal/blep - icon_state = "blep" - item_state = "blep" - -/obj/item/toy/plush/mammal/circe - desc = "A luxuriously soft toy that resembles a nine-tailed kitsune." - icon_state = "circe" - item_state = "circe" - attack_verb = list("medicated", "tailhugged", "kissed") - -/obj/item/toy/plush/mammal/robin - icon_state = "robin" - item_state = "robin" - -/obj/item/toy/plush/mammal/pavel - icon_state = "pavel" - item_state = "pavel" - -/obj/item/toy/plush/mammal/mason - icon_state = "mason" - item_state = "mason" - -/obj/item/toy/plush/mammal/oten - icon_state = "oten" - item_state = "oten" - -/obj/item/toy/plush/mammal/ray - icon_state = "ray" - item_state = "ray" - -/obj/item/toy/plush/mammal/redtail - icon_state = "redtail" - item_state = "redtail" - -/obj/item/toy/plush/mammal/dawud - icon_state = "dawud" - item_state = "dawud" - -/obj/item/toy/plush/mammal/edgar - icon_state = "edgar" - item_state = "edgar" - attack_verb = list("collared", "tricked", "headpatted") - -/obj/item/toy/plush/mammal/frank - icon_state = "frank" - item_state = "frank" - -/obj/item/toy/plush/mammal/poojawa - icon_state = "poojawa" - item_state = "poojawa" - -/obj/item/toy/plush/mammal/hazel - icon_state = "hazel" - item_state = "hazel" - -/obj/item/toy/plush/mammal/joker - icon_state = "joker" - item_state = "joker" - -/obj/item/toy/plush/mammal/gunther - icon_state = "gunther" - item_state = "gunther" - /obj/item/toy/plush/mammal/fox icon_state = "fox" item_state = "fox" -/obj/item/toy/plush/mammal/rae - desc = "An adorable stuffed toy of an artic fox." - icon_state = "rae" - item_state = "rae" +/obj/item/toy/plush/snakeplushie + name = "snake plushie" + desc = "An adorable stuffed toy that resembles a snake. Not to be mistaken for the real thing." + icon_state = "plushie_snake" + item_state = "plushie_snake" + attack_verb = list("bitten", "hissed", "tail slapped") + squeak_override = list('modular_citadel/sound/voice/hiss.ogg' = 1) -/obj/item/toy/plush/mammal/zed - desc = "A masked stuffed toy that resembles a fierce miner. He even comes with his own little crusher!" - icon_state = "zed" - item_state = "zed" - attack_verb = list("ENDED", "CRUSHED", "GNOMED") - -/obj/item/toy/plush/mammal/justin - icon_state = "justin" - item_state = "justin" - attack_verb = list("buttslapped", "fixed") - -/obj/item/toy/plush/mammal/reece - icon_state = "reece" - item_state = "reece" - attack_verb = list("healed", "cured", "demoted") - -/obj/item/toy/plush/mammal/redwood - desc = "An adorable stuffed toy resembling a Nanotrasen Captain. That just happens to be a bunny." - icon_state = "redwood" - item_state = "redwood" - attack_verb = list("ordered", "bapped", "reprimanded") - -/obj/item/toy/plush/mammal/marisol - desc = "An adorable stuffed toy resembling a demi-wolf security officer." - icon_state = "marisol" - item_state = "marisol" - attack_verb = list("arrested", "harmbattoned", "lasered") - -/obj/item/toy/plush/mammal/minty - desc = "An adorable stuffed toy resembling some sort of crew member. It smells like mint.." - icon_state = "minty" - item_state = "minty" - attack_verb = list("freshened", "brushed") - -/obj/item/toy/plush/mammal/dog - desc = "An adorable stuffed toy that resembles a canine." - icon_state = "katlin" - item_state = "katlin" - attack_verb = list("barked", "boofed", "borked") - squeak_override = list( - 'modular_citadel/sound/voice/bark1.ogg' = 1, - 'modular_citadel/sound/voice/bark2.ogg' = 1 - ) - -/obj/item/toy/plush/mammal/dog/frost - icon_state = "frost" - item_state = "frost" - -/obj/item/toy/plush/mammal/dog/atticus - icon_state = "atticus" - item_state = "atticus" - -/obj/item/toy/plush/mammal/dog/fletch - icon_state = "fletch" - item_state = "fletch" - -/obj/item/toy/plush/mammal/dog/vincent - icon_state = "vincent" - item_state = "vincent" - -/obj/item/toy/plush/mammal/dog/zigfried - desc = "An adorable stuffed toy of a very good boy." - icon_state = "zigfried" - item_state = "zigfried" - -/obj/item/toy/plush/mammal/dog/nikolai - icon_state = "nikolai" - item_state = "nikolai" - -/obj/item/toy/plush/mammal/dog/flynn - icon_state = "flynn" - item_state = "flynn" - -/obj/item/toy/plush/mammal/dog/fritz - icon_state = "fritz" - item_state = "fritz" - attack_verb = list("barked", "boofed", "shotgun'd") - obj_flags = UNIQUE_RENAME - unique_reskin = list("Goodboye" = "fritz", "Badboye" = "fritz_bad") - -/obj/item/toy/plush/mammal/dog/jesse - desc = "An adorable wolf toy that resembles a cream-colored wolf. He has a little pride flag!" - icon_state = "jesse" - item_state = "jesse" - attack_verb = list("greeted", "merc'd", "howdy'd") - -/obj/item/toy/plush/catgirl - name = "feline plushie" - desc = "An adorable stuffed toy that resembles a feline." - icon_state = "bailey" - item_state = "bailey" - attack_verb = list("headbutt", "scritched", "bit") - squeak_override = list('modular_citadel/sound/voice/nya.ogg' = 1) - -/obj/item/toy/plush/catgirl/mikeel - desc = "An adorable stuffed toy of some tauric cat person." - icon_state = "mikeel" - item_state = "mikeel" - -/obj/item/toy/plush/catgirl/skylar - desc = "An adorable stuffed toy that resembles a degenerate." - icon_state = "skylar2" - item_state = "skylar2" - attack_verb = list("powergamed", "merged", "tabled") - squeak_override = list('sound/effects/meow1.ogg' = 1) - -/obj/item/toy/plush/catgirl/drew - icon_state = "drew" - item_state = "drew" - -/obj/item/toy/plush/catgirl/trilby - desc = "A masked stuffed toy that resembles a feline scientist." - icon_state = "trilby" - item_state = "trilby" - attack_verb = list("PR'd", "coded", "remembered") +/obj/item/toy/plush/mammal + name = "mammal plushie" + desc = "An adorable stuffed toy resembling some sort of crew member." + can_random_spawn = FALSE /obj/item/toy/plush/catgirl/fermis name = "medcat plushie" @@ -1007,20 +699,36 @@ attack_verb = list("cuddled", "petpatted", "wigglepurred") squeak_override = list('modular_citadel/sound/voice/merowr.ogg' = 1) -/obj/item/toy/plush/catgirl/mariaf - desc = "An adorable stuffed toy that resembles a very tall cat girl." - icon_state = "mariaf" - item_state = "mariaf" - attack_verb = list("hugged", "stabbed", "licked") +/obj/item/toy/plush/xeno + name = "xenohybrid plushie" + desc = "An adorable stuffed toy that resmembles a xenomorphic crewmember." + squeak_override = list('sound/voice/hiss2.ogg' = 1) + can_random_spawn = FALSE -/obj/item/toy/plush/catgirl/maya - desc = "An adorable stuffed toy that resembles an angry cat girl. She has her own tiny nuke disk!" - icon_state = "maya" - item_state = "maya" - attack_verb = list("nuked", "arrested", "harmbatonned") +/obj/item/toy/plush/bird + name = "bird plushie" + desc = "An adorable stuffed plushie that resembles an avian." + attack_verb = list("peeped", "beeped", "poofed") + squeak_override = list('modular_citadel/sound/voice/peep.ogg' = 1) + can_random_spawn = FALSE -/obj/item/toy/plush/catgirl/marisa - desc = "An adorable stuffed toy that resembles a crew member, or maybe a witch. Having it makes you feel you can win." - icon_state = "marisa" - item_state = "marisa" - attack_verb = list("blasted", "sparked", "dazzled") +/obj/item/toy/plush/sergal + name = "sergal plushie" + desc = "An adorable stuffed plushie that resembles a sagaru." + squeak_override = list('modular_citadel/sound/voice/merp.ogg' = 1) + can_random_spawn = FALSE + +/obj/item/toy/plush/mammal/dog + desc = "An adorable stuffed toy that resembles a canine." + attack_verb = list("barked", "boofed", "borked") + squeak_override = list( + 'modular_citadel/sound/voice/bark1.ogg' = 1, + 'modular_citadel/sound/voice/bark2.ogg' = 1 + ) + +/obj/item/toy/plush/catgirl + name = "feline plushie" + desc = "An adorable stuffed toy that resembles a feline." + attack_verb = list("headbutt", "scritched", "bit") + squeak_override = list('modular_citadel/sound/voice/nya.ogg' = 1) + can_random_spawn = FALSE diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 21de34faa1..7879f50ada 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -1,7 +1,11 @@ /* Glass stack types * Contains: * Glass sheets + * Plasma glass * Reinforced glass sheets + * Reinforced plasma glass + * Titanium glass + * Plastitanium glass * Glass shards - TODO: Move this into code/game/object/item/weapons */ @@ -373,4 +377,8 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list( throwforce = 11 icon_state = "plasmalarge" materials = list(MAT_PLASMA=MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS=MINERAL_MATERIAL_AMOUNT) - icon_prefix = "plasma" \ No newline at end of file + icon_prefix = "plasma" + +/obj/item/shard/plasma/alien + name = "alien shard" + desc = "A nasty looking shard of advanced alloy glass." \ No newline at end of file diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 53b78b2ecf..828ed96387 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -401,6 +401,8 @@ GLOBAL_LIST_INIT(abductor_recipes, list ( \ new/datum/stack_recipe("alien bed", /obj/structure/bed/abductor, 2, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("alien locker", /obj/structure/closet/abductor, 2, time = 15, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("alien table frame", /obj/structure/table_frame/abductor, 1, time = 15, one_per_turf = 1, on_floor = 1), \ + new/datum/stack_recipe("alien bar stool", /obj/item/chair/stool/bar/alien, 1, time = 20, one_per_turf = 1, on_floor = 1), \ + new/datum/stack_recipe("alien stool", /obj/item/chair/stool/alien, 1, time = 20, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("alien airlock assembly", /obj/structure/door_assembly/door_assembly_abductor, 4, time = 20, one_per_turf = 1, on_floor = 1), \ null, \ new/datum/stack_recipe("alien floor tile", /obj/item/stack/tile/mineral/abductor, 1, 4, 20), \ diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 78741a115b..45911afc73 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -699,6 +699,16 @@ GLOBAL_LIST_INIT(bronze_recipes, list ( \ /* * Bones */ + +GLOBAL_LIST_INIT(bone_recipes, list( + new /datum/stack_recipe("Bone Dagger", /obj/item/kitchen/knife/combat/bone, 2, time = 20), \ + new /datum/stack_recipe("Skull Helmet", /obj/item/clothing/head/helmet/skull, 4, time = 30), \ + new /datum/stack_recipe("Bone Armor", /obj/item/clothing/suit/armor/bone, 6, time = 30))) + +/obj/item/stack/sheet/bone/Initialize(mapload, new_amount, merge = TRUE) + recipes = GLOB.bone_recipes + . = ..() + /obj/item/stack/sheet/bone name = "bones" icon = 'icons/obj/mining.dmi' @@ -715,6 +725,10 @@ GLOBAL_LIST_INIT(bronze_recipes, list ( \ grind_results = list(/datum/reagent/carbon = 10) merge_type = /obj/item/stack/sheet/bone + /* + * Plastic + */ + GLOBAL_LIST_INIT(plastic_recipes, list( new /datum/stack_recipe("see-through plastic flaps", /obj/structure/plasticflaps, 5, one_per_turf = TRUE, on_floor = TRUE, time = 40), \ new /datum/stack_recipe("opaque plastic flaps", /obj/structure/plasticflaps/opaque, 5, one_per_turf = TRUE, on_floor = TRUE, time = 40), \ diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm index daddc403b2..c4e6c57318 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -1288,3 +1288,62 @@ /obj/item/storage/box/marshmallow/PopulateContents() for (var/i in 1 to 5) new /obj/item/reagent_containers/food/snacks/marshmallow(src) + +/obj/item/storage/box/material/PopulateContents() //less uranium because radioactive + var/static/items_inside = list( + /obj/item/stack/sheet/metal/fifty=1,\ + /obj/item/stack/sheet/glass/fifty=1,\ + /obj/item/stack/sheet/rglass=50,\ + /obj/item/stack/sheet/plasmaglass=50,\ + /obj/item/stack/sheet/titaniumglass=50,\ + /obj/item/stack/sheet/plastitaniumglass=50,\ + /obj/item/stack/sheet/plasteel=50,\ + /obj/item/stack/sheet/mineral/plastitanium=50,\ + /obj/item/stack/sheet/mineral/titanium=50,\ + /obj/item/stack/sheet/mineral/gold=50,\ + /obj/item/stack/sheet/mineral/silver=50,\ + /obj/item/stack/sheet/mineral/plasma=50,\ + /obj/item/stack/sheet/mineral/uranium=50,\ + /obj/item/stack/sheet/mineral/diamond=50,\ + /obj/item/stack/sheet/bluespace_crystal=50,\ + /obj/item/stack/sheet/mineral/bananium=50,\ + /obj/item/stack/sheet/mineral/wood=50,\ + /obj/item/stack/sheet/plastic/fifty=1,\ + /obj/item/stack/sheet/runed_metal/fifty=1 + ) + generate_items_inside(items_inside, src) + +/obj/item/storage/box/debugtools + name = "box of debug tools" + icon_state = "syndiebox" + +/obj/item/storage/box/debugtools/PopulateContents() + var/static/items_inside = list( + /obj/item/flashlight/emp/debug=1,\ + /obj/item/pda=1,\ + /obj/item/modular_computer/tablet/preset/advanced=1,\ + /obj/item/geiger_counter=1,\ + /obj/item/construction/rcd/combat/admin=1,\ + /obj/item/pipe_dispenser=1,\ + /obj/item/card/emag=1,\ + /obj/item/healthanalyzer/advanced=1,\ + /obj/item/disk/tech_disk/debug=1,\ + /obj/item/uplink/debug=1,\ + /obj/item/uplink/nuclear/debug=1,\ + /obj/item/storage/box/beakers/bluespace=1,\ + /obj/item/storage/box/beakers/variety=1,\ + /obj/item/storage/box/material=1,\ + /obj/item/storage/belt/medical/surgery_belt_adv + ) + generate_items_inside(items_inside, src) + +/obj/item/storage/box/beakers/variety + name = "beaker variety box" + +/obj/item/storage/box/beakers/variety/PopulateContents() + new /obj/item/reagent_containers/glass/beaker(src) + new /obj/item/reagent_containers/glass/beaker/large(src) + new /obj/item/reagent_containers/glass/beaker/plastic(src) + new /obj/item/reagent_containers/glass/beaker/meta(src) + new /obj/item/reagent_containers/glass/beaker/noreact(src) + new /obj/item/reagent_containers/glass/beaker/bluespace(src) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 45b9715b04..7fbdddbdc4 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -125,7 +125,7 @@ if ((M.client && M.machine == src)) is_in_use = TRUE ui_interact(M) - if(isAI(usr) || iscyborg(usr) || IsAdminGhost(usr)) + if(isAI(usr) || iscyborg(usr) || IsAdminGhost(usr) || hasSiliconAccessInArea(usr)) if (!(usr in nearby)) if (usr.client && usr.machine==src) // && M.machine == src is omitted because if we triggered this by using the dialog, it doesn't matter if our machine changed in between triggering it and this - the dialog is probably still supposed to refresh. is_in_use = TRUE diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm index 9fa4d730b6..cc1a3c0922 100644 --- a/code/game/objects/structures/beds_chairs/chair.dm +++ b/code/game/objects/structures/beds_chairs/chair.dm @@ -370,6 +370,43 @@ item_state = "stool_bar" origin_type = /obj/structure/chair/stool/bar +////////////////////////// +//Alien(Disco) Stools!//// +////////////////////////// + +/obj/structure/chair/stool/alien + name = "alien stool" + desc = "A hard stool made of advanced alien alloy." + icon_state = "stoolalien" + icon = 'icons/obj/abductor.dmi' + item_chair = /obj/item/chair/stool/alien + buildstacktype = /obj/item/stack/sheet/mineral/abductor + buildstackamount = 1 + +/obj/structure/chair/stool/bar/alien + name = "bronze bar stool" + desc = "A hard bar stool made of advanced alien alloy." + icon_state = "baralien" + icon = 'icons/obj/abductor.dmi' + item_chair = /obj/item/chair/stool/bar/alien + buildstacktype = /obj/item/stack/sheet/mineral/abductor + buildstackamount = 1 + +/obj/item/chair/stool/alien + name = "stool" + icon_state = "stoolalien_toppled" + item_state = "stoolalien" + icon = 'icons/obj/abductor.dmi' + origin_type = /obj/structure/chair/stool/alien + break_chance = 0 //It's too sturdy. + +/obj/item/chair/stool/bar/alien + name = "bar stool" + icon_state = "baralien_toppled" + item_state = "baralien" + icon = 'icons/obj/abductor.dmi' + origin_type = /obj/structure/chair/stool/bar/alien + ////////////////////////// //Brass & Bronze stools!// ////////////////////////// diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 7696a13bb2..bf891ef223 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -168,7 +168,7 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an /obj/structure/bodycontainer/morgue/AltClick(mob/user) . = ..() - if(!user.canUseTopic(src, !issilicon(user))) + if(!user.canUseTopic(src, !hasSiliconAccessInArea(user))) return beeper = !beeper to_chat(user, "You turn the speaker function [beeper ? "on" : "off"].") diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 14a7e445c1..d4925c8604 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -595,6 +595,14 @@ /obj/structure/window/plastitanium/unanchored anchored = FALSE +//pirate ship windows +/obj/structure/window/plastitanium/pirate + desc = "Yarr this window be explosion proof!" + explosion_block = 30 + +/obj/structure/window/plastitanium/pirate/unanchored + anchored = FALSE + /obj/structure/window/reinforced/clockwork name = "brass window" desc = "A paper-thin pane of translucent yet reinforced brass." diff --git a/code/game/turfs/simulated/wall/mineral_walls.dm b/code/game/turfs/simulated/wall/mineral_walls.dm index d55cb0b475..b04f4f0aa0 100644 --- a/code/game/turfs/simulated/wall/mineral_walls.dm +++ b/code/game/turfs/simulated/wall/mineral_walls.dm @@ -302,4 +302,4 @@ /turf/closed/wall/mineral/plastitanium/copyTurf(turf/T) . = ..() - T.transform = transform + T.transform = transform \ No newline at end of file diff --git a/code/game/turfs/simulated/wall/reinf_walls.dm b/code/game/turfs/simulated/wall/reinf_walls.dm index 8eab4c34fe..a1d2c1757c 100644 --- a/code/game/turfs/simulated/wall/reinf_walls.dm +++ b/code/game/turfs/simulated/wall/reinf_walls.dm @@ -258,3 +258,22 @@ /turf/closed/wall/r_wall/syndicate/overspace icon_state = "map-overspace" fixed_underlay = list("space"=1) + +/////////////////////Pirate Ship walls///////////////////// + +/turf/closed/wall/r_wall/syndicate/pirate + desc = "Yarr just try to blow this to smithereens!" + explosion_block = 30 + canSmoothWith = list(/turf/closed/wall/r_wall/syndicate/pirate, /obj/machinery/door/airlock/shuttle, /obj/machinery/door/airlock, /obj/structure/window/plastitanium/pirate, /obj/structure/shuttle/engine, /obj/structure/falsewall/plastitanium) + +/turf/closed/wall/r_wall/syndicate/pirate/nodiagonal + smooth = SMOOTH_MORE + icon_state = "map-shuttle_nd" + +/turf/closed/wall/r_wall/syndicate/pirate/nosmooth + icon = 'icons/turf/shuttle.dmi' + icon_state = "wall" + +/turf/closed/wall/r_wall/syndicate/pirate/overspace + icon_state = "map-overspace" + fixed_underlay = list("space"=1) diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index f7c5dce30f..e85cf1efa6 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -245,7 +245,7 @@ /obj/machinery/airalarm/ui_data(mob/user) var/data = list( "locked" = locked, - "siliconUser" = user.has_unlimited_silicon_privilege, + "siliconUser" = user.has_unlimited_silicon_privilege || hasSiliconAccessInArea(user), "emagged" = (obj_flags & EMAGGED ? 1 : 0), "danger_level" = danger_level, ) @@ -288,7 +288,7 @@ "danger_level" = cur_tlv.get_danger_level(environment.gases[gas_id] * partial_pressure) )) - if(!locked || user.has_unlimited_silicon_privilege) + if(!locked || user.has_unlimited_silicon_privilege || hasSiliconAccessInArea(user)) data["vents"] = list() for(var/id_tag in A.air_vent_names) var/long_name = A.air_vent_names[id_tag] @@ -368,7 +368,7 @@ /obj/machinery/airalarm/ui_act(action, params) if(..() || buildstage != 2) return - if((locked && !usr.has_unlimited_silicon_privilege) || (usr.has_unlimited_silicon_privilege && aidisabled)) + if((locked && !usr.has_unlimited_silicon_privilege && !hasSiliconAccessInArea(usr)) || (usr.has_unlimited_silicon_privilege && aidisabled)) return var/device_id = params["id_tag"] switch(action) @@ -840,7 +840,7 @@ /obj/machinery/airalarm/AltClick(mob/user) . = ..() - if(!user.canUseTopic(src, !issilicon(user)) || !isturf(loc)) + if(!user.canUseTopic(src, !hasSiliconAccessInArea(user)) || !isturf(loc)) return togglelock(user) return TRUE diff --git a/code/modules/awaymissions/bluespaceartillery.dm b/code/modules/awaymissions/bluespaceartillery.dm index deb05920e2..ee4090b680 100644 --- a/code/modules/awaymissions/bluespaceartillery.dm +++ b/code/modules/awaymissions/bluespaceartillery.dm @@ -44,7 +44,7 @@ return if(reload < reload_cooldown) return - if(usr.contents.Find(src) || (in_range(src, usr) && isturf(loc)) || issilicon(usr)) + if(usr.contents.Find(src) || (in_range(src, usr) && isturf(loc)) || hasSiliconAccessInArea(usr)) priority_announce("Bluespace artillery fire detected. Brace for impact.") message_admins("[ADMIN_LOOKUPFLW(usr)] has launched an artillery strike.") var/list/L = list() diff --git a/code/modules/cargo/supplypod_beacon.dm b/code/modules/cargo/supplypod_beacon.dm index 006f1a8084..668698d2e9 100644 --- a/code/modules/cargo/supplypod_beacon.dm +++ b/code/modules/cargo/supplypod_beacon.dm @@ -77,7 +77,7 @@ /obj/item/supplypod_beacon/AltClick(mob/user) . = ..() - if (!user.canUseTopic(src, !issilicon(user))) + if (!user.canUseTopic(src, !hasSiliconAccessInArea(user))) return if (express_console) unlink_console() diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 7df10b56f7..b60856001e 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -488,4 +488,47 @@ if(client && client.prefs.uses_glasses_colour && glasses_equipped) add_client_colour(G.glass_colour_type) else - remove_client_colour(G.glass_colour_type) \ No newline at end of file + remove_client_colour(G.glass_colour_type) + +/obj/item/clothing/glasses/debug + name = "debug glasses" + desc = "Medical, security and diagnostic hud. Alt click to toggle xray." + icon_state = "nvgmeson" + item_state = "nvgmeson" + flags_cover = GLASSESCOVERSEYES + darkness_view = 8 + flash_protect = 2 + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + glass_colour_type = FALSE + clothing_flags = SCAN_REAGENTS + vision_flags = SEE_TURFS + var/list/hudlist = list(DATA_HUD_MEDICAL_ADVANCED, DATA_HUD_DIAGNOSTIC_ADVANCED, DATA_HUD_SECURITY_ADVANCED) + var/xray = FALSE + +/obj/item/clothing/glasses/debug/equipped(mob/user, slot) + . = ..() + if(slot != ITEM_SLOT_EYES) + return + if(ishuman(user)) + for(var/hud in hudlist) + var/datum/atom_hud/H = GLOB.huds[hud] + H.add_hud_to(user) + +/obj/item/clothing/glasses/debug/dropped(mob/user) + . = ..() + if(ishuman(user)) + for(var/hud in hudlist) + var/datum/atom_hud/H = GLOB.huds[hud] + H.remove_hud_from(user) + +/obj/item/clothing/glasses/debug/AltClick(mob/user) + . = ..() + if(ishuman(user)) + if(xray) + vision_flags -= SEE_MOBS|SEE_OBJS + else + vision_flags += SEE_MOBS|SEE_OBJS + xray = !xray + var/mob/living/carbon/human/H = user + H.update_sight() + diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index 1e8f26e7fe..e6c68f2662 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -39,6 +39,12 @@ /obj/item/clothing/mask/gas/welding/attack_self(mob/user) weldingvisortoggle(user) +/obj/item/clothing/mask/gas/welding/up + +/obj/item/clothing/mask/gas/welding/up/Initialize() + ..() + visor_toggling() + // ******************************************************************** diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm index 4c8f9bdab2..7c1121d137 100644 --- a/code/modules/clothing/outfits/standard.dm +++ b/code/modules/clothing/outfits/standard.dm @@ -427,14 +427,27 @@ /datum/outfit/debug //Debug objs plus hardsuit name = "Debug outfit" uniform = /obj/item/clothing/under/patriotsuit - suit = /obj/item/clothing/suit/space/hardsuit/syndi/elite - shoes = /obj/item/clothing/shoes/magboots/advance - suit_store = /obj/item/tank/internals/oxygen - mask = /obj/item/clothing/mask/gas/welding - belt = /obj/item/storage/belt/utility/chief/full - gloves = /obj/item/clothing/gloves/combat - id = /obj/item/card/id/ert - glasses = /obj/item/clothing/glasses/meson/night + suit = /obj/item/clothing/suit/space/hardsuit/syndi/elite/debug + glasses = /obj/item/clothing/glasses/debug ears = /obj/item/radio/headset/headset_cent/commander + mask = /obj/item/clothing/mask/gas/welding/up + gloves = /obj/item/clothing/gloves/combat + belt = /obj/item/storage/belt/utility/chief/full + l_pocket = /obj/item/gun/magic/wand/resurrection/debug + r_pocket = /obj/item/gun/magic/wand/death/debug + shoes = /obj/item/clothing/shoes/magboots/advance/debug + id = /obj/item/card/id/debug + suit_store = /obj/item/tank/internals/oxygen back = /obj/item/storage/backpack/holding - backpack_contents = list(/obj/item/card/emag=1, /obj/item/flashlight/emp/debug=1, /obj/item/construction/rcd/combat=1, /obj/item/gun/magic/wand/resurrection/debug=1, /obj/item/melee/transforming/energy/axe=1) + box = /obj/item/storage/box/debugtools + internals_slot = ITEM_SLOT_SUITSTORE + backpack_contents = list( + /obj/item/melee/transforming/energy/axe=1,\ + /obj/item/storage/part_replacer/bluespace/tier4=1,\ + /obj/item/debug/human_spawner=1,\ + ) + +/datum/outfit/debug/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + var/obj/item/card/id/W = H.wear_id + W.registered_name = H.real_name + W.update_label() diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index 8864add0d8..1acb7628a3 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -30,8 +30,9 @@ magpulse = !magpulse icon_state = "[magboot_state][magpulse]" to_chat(user, "You [magpulse ? "enable" : "disable"] the mag-pulse traction system.") - user.update_inv_shoes() //so our mob-overlays update - user.update_gravity(user.has_gravity()) + if(user) + user.update_inv_shoes() //so our mob-overlays update + user.update_gravity(user.has_gravity()) for(var/X in actions) var/datum/action/A = X A.UpdateButtonIcon() @@ -52,6 +53,11 @@ slowdown_active = SHOES_SLOWDOWN resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF +/obj/item/clothing/shoes/magboots/advance/debug + +/obj/item/clothing/shoes/magboots/advance/debug/Initialize() + attack_self(src) + /obj/item/clothing/shoes/magboots/syndie desc = "Reverse-engineered magnetic boots that have a heavy magnetic pull. Property of Gorlex Marauders." name = "blood-red magboots" diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index 703fe26287..fab41c9876 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -269,7 +269,7 @@ item_state = "syndie_helm" item_color = "syndi" armor = list("melee" = 40, "bullet" = 50, "laser" = 30, "energy" = 15, "bomb" = 35, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 90) - on = TRUE + on = FALSE var/obj/item/clothing/suit/space/hardsuit/syndi/linkedsuit = null actions_types = list(/datum/action/item_action/toggle_helmet_mode) visor_flags_inv = HIDEMASK|HIDEEYES|HIDEFACE|HIDEFACIALHAIR @@ -367,6 +367,12 @@ on = FALSE resistance_flags = FIRE_PROOF | ACID_PROOF +/obj/item/clothing/head/helmet/space/hardsuit/syndi/elite/debug + +/obj/item/clothing/head/helmet/space/hardsuit/syndi/elite/debug/Initialize() + . = ..() + soundloop.volume = 0 + /obj/item/clothing/suit/space/hardsuit/syndi/elite name = "elite syndicate hardsuit" desc = "An elite version of the syndicate hardsuit, with improved armour and fireproofing. It is in travel mode." @@ -380,6 +386,9 @@ resistance_flags = FIRE_PROOF | ACID_PROOF mutantrace_variation = STYLE_DIGITIGRADE|STYLE_SNEK_TAURIC|STYLE_PAW_TAURIC +/obj/item/clothing/suit/space/hardsuit/syndi/elite/debug + helmettype = /obj/item/clothing/head/helmet/space/hardsuit/syndi/elite/debug + slowdown = 0 //The Owl Hardsuit /obj/item/clothing/head/helmet/space/hardsuit/syndi/owl diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index e9b96af8eb..b61918c4b8 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -325,17 +325,16 @@ body_parts_covered = CHEST|ARMS /obj/item/clothing/suit/ran - name = "Shikigami costume" + name = "shikigami costume" desc = "A costume that looks like a certain shikigami, is super fluffy." icon_state = "ran_suit" item_state = "ran_suit" body_parts_covered = CHEST|GROIN|LEGS flags_inv = HIDEJUMPSUIT|HIDETAUR heat_protection = CHEST|GROIN|LEGS //fluffy tails! -//2061 /obj/item/clothing/head/ran - name = "Shikigami hat" + name = "shikigami hat" desc = "A hat that looks like it keeps any fluffy ears contained super warm, has little charms over it." icon_state = "ran_hat" item_state = "ran_hat" @@ -880,7 +879,6 @@ blood_overlay_type = "armor" body_parts_covered = CHEST resistance_flags = NONE - mutantrace_variation = NONE armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 5, "bio" = 0, "rad" = 0, "fire" = -5, "acid" = -15) //nylon sucks against acid /obj/item/clothing/suit/assu_suit diff --git a/code/modules/events/holiday/vday.dm b/code/modules/events/holiday/vday.dm index 13c516960a..899a083b7d 100644 --- a/code/modules/events/holiday/vday.dm +++ b/code/modules/events/holiday/vday.dm @@ -140,7 +140,7 @@ /obj/item/valentine/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) - if( !(ishuman(user) || isobserver(user) || issilicon(user)) ) + if( !(ishuman(user) || isobserver(user) || hasSiliconAccessInArea(user)) ) user << browse("[name][stars(message)]", "window=[name]") onclose(user, "[name]") else diff --git a/code/modules/events/pirates.dm b/code/modules/events/pirates.dm index 8bc5491970..ab9ab96678 100644 --- a/code/modules/events/pirates.dm +++ b/code/modules/events/pirates.dm @@ -177,6 +177,7 @@ shuttleId = "pirateship" icon_screen = "syndishuttle" icon_keyboard = "syndie_key" + resistance_flags = INDESTRUCTIBLE light_color = LIGHT_COLOR_RED possible_destinations = "pirateship_away;pirateship_home;pirateship_custom" @@ -184,6 +185,7 @@ name = "pirate shuttle navigation computer" desc = "Used to designate a precise transit location for the pirate shuttle." shuttleId = "pirateship" + resistance_flags = INDESTRUCTIBLE lock_override = CAMERA_LOCK_STATION shuttlePortId = "pirateship_custom" x_offset = 9 @@ -226,6 +228,7 @@ desc = "This sophisticated machine scans the nearby space for items of value." icon = 'icons/obj/machines/research.dmi' icon_state = "tdoppler" + resistance_flags = INDESTRUCTIBLE density = TRUE var/cooldown = 300 var/next_use = 0 @@ -259,6 +262,7 @@ name = "cargo hold pad" icon = 'icons/obj/telescience.dmi' icon_state = "lpad-idle-o" + resistance_flags = INDESTRUCTIBLE var/idle_state = "lpad-idle-o" var/warmup_state = "lpad-idle" var/sending_state = "lpad-beam" @@ -272,6 +276,7 @@ /obj/machinery/computer/piratepad_control name = "cargo hold control terminal" + resistance_flags = INDESTRUCTIBLE var/status_report = "Idle" var/obj/machinery/piratepad/pad var/warmup_time = 100 diff --git a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm index e4d36b29d2..e908662658 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm @@ -55,7 +55,7 @@ if(!operating) . += "Alt-click [src] to turn it on." - if(!in_range(user, src) && !issilicon(user) && !isobserver(user)) + if(!in_range(user, src) && !hasSiliconAccessInArea(user) && !isobserver(user)) . += "You're too far away to examine [src]'s contents and display!" return if(operating) @@ -63,7 +63,7 @@ return if(length(ingredients)) - if(issilicon(user)) + if(hasSiliconAccessInArea(user)) . += "\The [src] camera shows:" else . += "\The [src] contains:" @@ -187,14 +187,14 @@ /obj/machinery/microwave/AltClick(mob/user) . = ..() - if(user.canUseTopic(src, !issilicon(usr))) + if(user.canUseTopic(src, !hasSiliconAccessInArea(user))) cook() return TRUE /obj/machinery/microwave/ui_interact(mob/user) . = ..() - if(operating || panel_open || !anchored || !user.canUseTopic(src, !issilicon(user))) + if(operating || panel_open || !anchored || !user.canUseTopic(src, !hasSiliconAccessInArea(user))) return if(isAI(user) && (stat & NOPOWER)) return @@ -206,10 +206,10 @@ to_chat(user, "\The [src] is empty.") return - var/choice = show_radial_menu(user, src, isAI(user) ? ai_radial_options : radial_options, require_near = !issilicon(user)) + var/choice = show_radial_menu(user, src, isAI(user) ? ai_radial_options : radial_options, require_near = !hasSiliconAccessInArea(user)) // post choice verification - if(operating || panel_open || !anchored || !user.canUseTopic(src, !issilicon(user))) + if(operating || panel_open || !anchored || !user.canUseTopic(src, !hasSiliconAccessInArea(user))) return if(isAI(user) && (stat & NOPOWER)) return diff --git a/code/modules/holodeck/computer.dm b/code/modules/holodeck/computer.dm index d551222836..b5cbed8b79 100644 --- a/code/modules/holodeck/computer.dm +++ b/code/modules/holodeck/computer.dm @@ -92,7 +92,7 @@ data["emagged"] = TRUE data["emag_programs"] = emag_programs data["program"] = program - data["can_toggle_safety"] = issilicon(user) || IsAdminGhost(user) + data["can_toggle_safety"] = hasSiliconAccessInArea(user) || IsAdminGhost(user) return data @@ -109,7 +109,7 @@ if(A) load_program(A) if("safety") - if(!issilicon(usr) && !IsAdminGhost(usr)) + if(!hasSiliconAccessInArea(usr) && !IsAdminGhost(usr)) var/msg = "[key_name(usr)] attempted to emag the holodeck using a href they shouldn't have!" message_admins(msg) log_admin(msg) diff --git a/code/modules/hydroponics/gene_modder.dm b/code/modules/hydroponics/gene_modder.dm index 8f2900c8a6..fb9bb8ba7b 100644 --- a/code/modules/hydroponics/gene_modder.dm +++ b/code/modules/hydroponics/gene_modder.dm @@ -105,7 +105,7 @@ return var/datum/browser/popup = new(user, "plantdna", "Plant DNA Manipulator", 450, 600) - if(!(in_range(src, user) || issilicon(user))) + if(!(in_range(src, user) || hasSiliconAccessInArea(user))) popup.close() return diff --git a/code/modules/integrated_electronics/core/printer.dm b/code/modules/integrated_electronics/core/printer.dm index f0aa10f2da..ea52b6d461 100644 --- a/code/modules/integrated_electronics/core/printer.dm +++ b/code/modules/integrated_electronics/core/printer.dm @@ -107,7 +107,7 @@ interact(user) /obj/item/integrated_circuit_printer/interact(mob/user) - if(!(in_range(src, user) || issilicon(user))) + if(!(in_range(src, user) || hasSiliconAccessInArea(user))) return if(isnull(current_category)) diff --git a/code/modules/jobs/access.dm b/code/modules/jobs/access.dm index 81f47b9a1e..eddb18b25e 100644 --- a/code/modules/jobs/access.dm +++ b/code/modules/jobs/access.dm @@ -4,7 +4,7 @@ //check if it doesn't require any access at all if(src.check_access(null)) return TRUE - if(issilicon(M)) + if(hasSiliconAccessInArea(M)) if(ispAI(M)) return FALSE return TRUE //AI can do whatever it wants diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 3559edc0fb..a20bab3bae 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -479,32 +479,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp pixel_y = 0 animate(src, pixel_y = 2, time = 10, loop = -1) -/mob/dead/observer/verb/observe() - set name = "Observe" - set category = "Ghost" - - var/list/creatures = getpois() - - reset_perspective(null) - - var/eye_name = null - - eye_name = input("Please, select a player!", "Observe", null, null) as null|anything in creatures - - if (!eye_name) - return - - var/mob/mob_eye = creatures[eye_name] - //Istype so we filter out points of interest that are not mobs - if(client && mob_eye && istype(mob_eye)) - client.eye = mob_eye - if(mob_eye.hud_used) - client.screen = list() - LAZYINITLIST(mob_eye.observers) - mob_eye.observers |= src - mob_eye.hud_used.show_hud(mob_eye.hud_used.hud_version, src) - observetarget = mob_eye - /mob/dead/observer/verb/jumptomob() //Moves the ghost instead of just changing the ghosts's eye -Nodrak set category = "Ghost" set name = "Jump to Mob" @@ -831,6 +805,32 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp client.screen = list() hud_used.show_hud(hud_used.hud_version) +/mob/dead/observer/verb/observe() + set name = "Observe" + set category = "OOC" + + var/list/creatures = getpois() + + reset_perspective(null) + + var/eye_name = null + + eye_name = input("Please, select a player!", "Observe", null, null) as null|anything in creatures + + if (!eye_name) + return + + var/mob/mob_eye = creatures[eye_name] + //Istype so we filter out points of interest that are not mobs + if(client && mob_eye && istype(mob_eye)) + client.eye = mob_eye + if(mob_eye.hud_used) + client.screen = list() + LAZYINITLIST(mob_eye.observers) + mob_eye.observers |= src + mob_eye.hud_used.show_hud(mob_eye.hud_used.hud_version, src) + observetarget = mob_eye + /mob/dead/observer/verb/register_pai_candidate() set category = "Ghost" set name = "pAI Setup" diff --git a/code/modules/mob/dead/observer/say.dm b/code/modules/mob/dead/observer/say.dm index 2c4743f7d3..8712f39531 100644 --- a/code/modules/mob/dead/observer/say.dm +++ b/code/modules/mob/dead/observer/say.dm @@ -22,7 +22,7 @@ . = say_dead(message) /mob/dead/observer/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode, atom/movable/source) - . = ..() + SEND_SIGNAL(src, COMSIG_MOVABLE_HEAR, args) //parent calls can't overwrite the current proc args. var/atom/movable/to_follow = speaker if(radio_freq) var/atom/movable/virtualspeaker/V = speaker @@ -36,4 +36,3 @@ // Recompose the message, because it's scrambled by default message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode, FALSE, source) to_chat(src, "[link] [message]") - diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index b560699a58..7a5fca3562 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -99,6 +99,10 @@ . += "[t_He] [t_has] [glasses.get_examine_string(user)] covering [t_his] eyes." else if(eye_color == BLOODCULT_EYE && iscultist(src) && HAS_TRAIT(src, TRAIT_CULT_EYES)) . += "[t_His] eyes are glowing an unnatural red!" + else if(HAS_TRAIT(src, TRAIT_HIJACKER)) + var/obj/item/implant/hijack/H = user.getImplant(/obj/item/implant/hijack) + if (H && !H.stealthmode && H.toggled) + . += "[t_His] eyes are flickering a bright yellow!" //ears if(ears && !(SLOT_EARS in obscured)) diff --git a/code/modules/mob/living/carbon/human/species_types/dwarves.dm b/code/modules/mob/living/carbon/human/species_types/dwarves.dm index f5f238908c..15422b2cdd 100644 --- a/code/modules/mob/living/carbon/human/species_types/dwarves.dm +++ b/code/modules/mob/living/carbon/human/species_types/dwarves.dm @@ -54,21 +54,20 @@ GLOBAL_LIST_INIT(dwarf_last, world.file2list("strings/names/dwarf_last.txt")) // //Dwarf Speech handling - Basically a filter/forces them to say things. The IC helper /datum/species/dwarf/proc/handle_speech(datum/source, list/speech_args) var/message = speech_args[SPEECH_MESSAGE] - if(message[1] != "*") - message = " [message]" //Credits to goonstation for the strings list. - var/list/dwarf_words = strings("dwarf_replacement.json", "dwarf") //thanks to regex too. + if(speech_args[SPEECH_LANGUAGE] != /datum/language/dwarf) // No accent if they speak their language + if(message[1] != "*") + message = " [message]" //Credits to goonstation for the strings list. + var/list/dwarf_words = strings("dwarf_replacement.json", "dwarf") //thanks to regex too. + for(var/key in dwarf_words) //Theres like 1459 words or something man. + var/value = dwarf_words[key] //Thus they will always be in character. + if(islist(value)) //Whether they like it or not. + value = pick(value) //This could be drastically reduced if needed though. + message = replacetextEx(message, " [uppertext(key)]", " [uppertext(value)]") + message = replacetextEx(message, " [capitalize(key)]", " [capitalize(value)]") + message = replacetextEx(message, " [key]", " [value]") //Also its scottish. - for(var/key in dwarf_words) //Theres like 1459 words or something man. - var/value = dwarf_words[key] //Thus they will always be in character. - if(islist(value)) //Whether they like it or not. - value = pick(value) //This could be drastically reduced if needed though. - - message = replacetextEx(message, " [uppertext(key)]", " [uppertext(value)]") - message = replacetextEx(message, " [capitalize(key)]", " [capitalize(value)]") - message = replacetextEx(message, " [key]", " [value]") //Also its scottish. - - if(prob(3)) - message += pick(" By Armok!") + if(prob(3)) + message += " By Armok!" speech_args[SPEECH_MESSAGE] = trim(message) //This mostly exists because my testdwarf's liver died while trying to also not die due to no alcohol. diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 0fb48f65b1..b20511986d 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -224,7 +224,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list( . = "[.]" /mob/living/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode, atom/movable/source) - . = ..() + SEND_SIGNAL(src, COMSIG_MOVABLE_HEAR, args) //parent calls can't overwrite the current proc args. if(!client) return var/deaf_message diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 33cbdb7cc9..ed0d0d02e8 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -315,10 +315,10 @@ var/is_anchored = FALSE if(move_resist == MOVE_FORCE_OVERPOWERING) move_resist = MOVE_FORCE_NORMAL + REMOVE_TRAIT(src, TRAIT_NO_TELEPORT, src) else is_anchored = TRUE move_resist = MOVE_FORCE_OVERPOWERING - REMOVE_TRAIT(src, TRAIT_NO_TELEPORT, src) ADD_TRAIT(src, TRAIT_NO_TELEPORT, src) to_chat(src, "You are now [is_anchored ? "" : "un"]anchored.") diff --git a/code/modules/mob/living/silicon/login.dm b/code/modules/mob/living/silicon/login.dm index 2f133259ca..7b1854b940 100644 --- a/code/modules/mob/living/silicon/login.dm +++ b/code/modules/mob/living/silicon/login.dm @@ -7,4 +7,7 @@ var/datum/antagonist/bloodsucker/V = mind.has_antag_datum(/datum/antagonist/bloodsucker) if(V) mind.remove_antag_datum(V) + var/datum/antagonist/gang/G = mind.has_antag_datum(/datum/antagonist/gang) + if(G) + mind.remove_antag_datum(G) ..() diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index 69aacbf1d6..6112a1e800 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -810,14 +810,14 @@ Pass a positive integer as an argument to override a bot's default speed. switch(href_list["operation"]) if("patrol") - if(!issilicon(usr) && !IsAdminGhost(usr) && !(bot_core.allowed(usr) || !locked)) + if(!hasSiliconAccessInArea(usr) && !IsAdminGhost(usr) && !(bot_core.allowed(usr) || !locked)) return TRUE auto_patrol = !auto_patrol bot_reset() if("remote") remote_disabled = !remote_disabled if("hack") - if(!issilicon(usr) && !IsAdminGhost(usr)) + if(!hasSiliconAccessInArea(usr) && !IsAdminGhost(usr)) var/msg = "[key_name(usr)] attempted to hack a bot with a href that shouldn't be available!" message_admins(msg) log_admin(msg) @@ -836,7 +836,7 @@ Pass a positive integer as an argument to override a bot's default speed. to_chat(usr, "[text_dehack]") bot_reset() if("ejectpai") - if(paicard && (!locked || issilicon(usr) || IsAdminGhost(usr))) + if(paicard && (!locked || hasSiliconAccessInArea(usr) || IsAdminGhost(usr))) to_chat(usr, "You eject [paicard] from [bot_name]") ejectpai(usr) update_controls() @@ -863,13 +863,13 @@ Pass a positive integer as an argument to override a bot's default speed. if(emagged == 2) //An emagged bot cannot be controlled by humans, silicons can if one hacked it. if(!hacked) //Manually emagged by a human - access denied to all. return TRUE - else if(!issilicon(user) && !IsAdminGhost(user)) //Bot is hacked, so only silicons and admins are allowed access. + else if(!hasSiliconAccessInArea(user) && !IsAdminGhost(user)) //Bot is hacked, so only silicons and admins are allowed access. return TRUE return FALSE /mob/living/simple_animal/bot/proc/hack(mob/user) var/hack - if(issilicon(user) || IsAdminGhost(user)) //Allows silicons or admins to toggle the emag status of a bot. + if(hasSiliconAccessInArea(user) || IsAdminGhost(user)) //Allows silicons or admins to toggle the emag status of a bot. hack += "[emagged == 2 ? "Software compromised! Unit may exhibit dangerous or erratic behavior." : "Unit operating normally. Release safety lock?"]
" hack += "Harm Prevention Safety System: [emagged ? "DANGER" : "Engaged"]
" else if(!locked) //Humans with access can use this option to hide a bot from the AI's remote control panel and PDA control. @@ -878,7 +878,7 @@ Pass a positive integer as an argument to override a bot's default speed. /mob/living/simple_animal/bot/proc/showpai(mob/user) var/eject = "" - if((!locked || issilicon(usr) || IsAdminGhost(usr))) + if((!locked || hasSiliconAccessInArea(usr) || IsAdminGhost(usr))) if(paicard || allow_pai) eject += "Personality card status: " if(paicard) diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm index cdb8ac820c..0e48723f37 100644 --- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm +++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm @@ -298,7 +298,7 @@ Status: [on ? "On" : "Off"]
Behaviour controls are [locked ? "locked" : "unlocked"]
Maintenance panel panel is [open ? "opened" : "closed"]"}) - if(!locked || issilicon(user)|| IsAdminGhost(user)) + if(!locked || hasSiliconAccessInArea(user)|| IsAdminGhost(user)) dat += "
Clean Blood: [blood ? "Yes" : "No"]" dat += "
Clean Trash: [trash ? "Yes" : "No"]" dat += "
Exterminate Pests: [pests ? "Yes" : "No"]" diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm index 4e479dc75b..6d304c6782 100644 --- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm +++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm @@ -110,7 +110,7 @@ Maintenance panel panel is [open ? "opened" : "closed"]
"}, "[on ? "On" : "Off"]" ) - if(!locked || issilicon(user)|| IsAdminGhost(user)) + if(!locked || hasSiliconAccessInArea(user)|| IsAdminGhost(user)) if(!lasercolor) dat += text({"
Arrest Unidentifiable Persons: []
diff --git a/code/modules/mob/living/simple_animal/bot/firebot.dm b/code/modules/mob/living/simple_animal/bot/firebot.dm index 2b52da6821..6ab4dc36db 100644 --- a/code/modules/mob/living/simple_animal/bot/firebot.dm +++ b/code/modules/mob/living/simple_animal/bot/firebot.dm @@ -111,7 +111,7 @@ dat += "Maintenance panel panel is [open ? "opened" : "closed"]
" dat += "Behaviour controls are [locked ? "locked" : "unlocked"]
" - if(!locked || issilicon(user) || IsAdminGhost(user)) + if(!locked || hasSiliconAccessInArea(user) || IsAdminGhost(user)) dat += "Extinguish Fires: [extinguish_fires ? "Yes" : "No"]
" dat += "Extinguish People: [extinguish_people ? "Yes" : "No"]
" dat += "Patrol Station: [auto_patrol ? "Yes" : "No"]
" diff --git a/code/modules/mob/living/simple_animal/bot/floorbot.dm b/code/modules/mob/living/simple_animal/bot/floorbot.dm index cae707ce46..1bf3883ea7 100644 --- a/code/modules/mob/living/simple_animal/bot/floorbot.dm +++ b/code/modules/mob/living/simple_animal/bot/floorbot.dm @@ -83,7 +83,7 @@ dat += "None Loaded
" dat += "Behaviour controls are [locked ? "locked" : "unlocked"]
" - if(!locked || issilicon(user) || IsAdminGhost(user)) + if(!locked || hasSiliconAccessInArea(user) || IsAdminGhost(user)) dat += "Add tiles to new hull plating: [autotile ? "Yes" : "No"]
" dat += "Place floor tiles: [placetiles ? "Yes" : "No"]
" dat += "Replace existing floor tiles with custom tiles: [replacetiles ? "Yes" : "No"]
" diff --git a/code/modules/mob/living/simple_animal/bot/honkbot.dm b/code/modules/mob/living/simple_animal/bot/honkbot.dm index d844237a61..e491cff74a 100644 --- a/code/modules/mob/living/simple_animal/bot/honkbot.dm +++ b/code/modules/mob/living/simple_animal/bot/honkbot.dm @@ -90,7 +90,7 @@ Maintenance panel panel is [open ? "opened" : "closed"]"}, "[on ? "On" : "Off"]" ) - if(!locked || issilicon(user) || IsAdminGhost(user)) + if(!locked || hasSiliconAccessInArea(user) || IsAdminGhost(user)) dat += text({"
Auto Patrol: []"}, "[auto_patrol ? "On" : "Off"]" ) diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm index a4496dd1f5..bb29cd3526 100644 --- a/code/modules/mob/living/simple_animal/bot/medbot.dm +++ b/code/modules/mob/living/simple_animal/bot/medbot.dm @@ -148,7 +148,7 @@ else dat += "None Loaded" dat += "
Behaviour controls are [locked ? "locked" : "unlocked"]
" - if(!locked || issilicon(user) || IsAdminGhost(user)) + if(!locked || hasSiliconAccessInArea(user) || IsAdminGhost(user)) dat += "Healing Threshold: " dat += "-- " dat += "- " diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index 0e8e009ca8..b23f3f2baa 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -279,7 +279,7 @@ // TODO: remove this; PDAs currently depend on it /mob/living/simple_animal/bot/mulebot/get_controls(mob/user) - var/ai = issilicon(user) + var/ai = hasSiliconAccessInArea(user) var/dat dat += "

Multiple Utility Load Effector Mk. V

" dat += "ID: [id]
" diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index 8302346a00..461fa9cf2a 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -110,7 +110,7 @@ Maintenance panel panel is [open ? "opened" : "closed"]"}, "[on ? "On" : "Off"]" ) - if(!locked || issilicon(user) || IsAdminGhost(user)) + if(!locked || hasSiliconAccessInArea(user) || IsAdminGhost(user)) dat += text({"
Arrest Unidentifiable Persons: []
Arrest for Unauthorized Weapons: []
@@ -131,7 +131,7 @@ Auto Patrol: []"}, /mob/living/simple_animal/bot/secbot/Topic(href, href_list) if(..()) return 1 - if(!issilicon(usr) && !IsAdminGhost(usr) && !(bot_core.allowed(usr) || !locked)) + if(!hasSiliconAccessInArea(usr) && !IsAdminGhost(usr) && !(bot_core.allowed(usr) || !locked)) return TRUE switch(href_list["operation"]) if("idcheck") diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm index f02d21c2af..873051c336 100644 --- a/code/modules/mob/living/simple_animal/friendly/dog.dm +++ b/code/modules/mob/living/simple_animal/friendly/dog.dm @@ -19,7 +19,7 @@ /mob/living/simple_animal/pet/dog/ComponentInitialize() . = ..() - AddElement(/datum/element/wuv, "yaps_happily!", EMOTE_AUDIBLE, /datum/mood_event/pet_animal, "growls!", EMOTE_AUDIBLE) + AddElement(/datum/element/wuv, "yaps happily!", EMOTE_AUDIBLE, /datum/mood_event/pet_animal, "growls!", EMOTE_AUDIBLE) AddElement(/datum/element/mob_holder, held_icon) //Corgis and pugs are now under one dog subtype diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 35c7510ad9..0e39f43263 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -808,7 +808,7 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0) //Can the mob interact() with an atom? /mob/proc/can_interact_with(atom/A) - return IsAdminGhost(src) || Adjacent(A) + return IsAdminGhost(src) || Adjacent(A) || A.hasSiliconAccessInArea(src) //Can the mob use Topic to interact with machines /mob/proc/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE) diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 1402b78908..7d446e4ef0 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -121,4 +121,7 @@ var/mob/audiovisual_redirect //Mob to redirect messages, speech, and sounds to - var/voluntary_ghosted = FALSE //whether or not they voluntarily ghosted. + var/siliconaccessareas = list() + var/siliconaccesstoggle = FALSE + + var/voluntary_ghosted = FALSE //whether or not they voluntarily ghosted. \ No newline at end of file diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index d78d23c234..f4133bcf9d 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -402,6 +402,32 @@ It's fairly easy to fix if dealing with single letters but not so much with comp return return TRUE +/atom/proc/hasSiliconAccessInArea(mob/user) + return user && (issilicon(user) || (user.siliconaccesstoggle && (get_area(src) in user.siliconaccessareas))) + +/mob/proc/toggleSiliconAccessArea(area/area) + if (area in siliconaccessareas) + siliconaccessareas -= area + to_chat(src,"You lost control of [area]!") + return FALSE + else + if (LAZYLEN(siliconaccessareas) < HIJACK_APC_MAX_AMOUNT) + siliconaccessareas += area + to_chat(src,"You successfully took control of [area].") + else + to_chat(src,"You are connected to too many APCs! Too many more will fry your brain.") + return FALSE + return TRUE + +/mob/proc/getImplant(type) + if (!istype(src,/mob/living)) + return + var/mob/living/L = src + for (var/I in L.implants) + if (istype(I,type)) + return I + return null + /proc/canGhostWrite(var/mob/A, var/obj/target, var/desc="", var/allow_all=FALSE) if(allow_all & TRUE) if(!target.GetComponent(/datum/component/anti_magic)) diff --git a/code/modules/modular_computers/computers/item/computer_ui.dm b/code/modules/modular_computers/computers/item/computer_ui.dm index 3e67a14874..11f5145478 100644 --- a/code/modules/modular_computers/computers/item/computer_ui.dm +++ b/code/modules/modular_computers/computers/item/computer_ui.dm @@ -14,7 +14,7 @@ return 0 // Robots don't really need to see the screen, their wireless connection works as long as computer is on. - if(!screen_on && !issilicon(user)) + if(!screen_on && !hasSiliconAccessInArea(user)) if(ui) ui.close() return 0 diff --git a/code/modules/modular_computers/file_system/program.dm b/code/modules/modular_computers/file_system/program.dm index f661f0ec10..b54bc9f2be 100644 --- a/code/modules/modular_computers/file_system/program.dm +++ b/code/modules/modular_computers/file_system/program.dm @@ -87,7 +87,7 @@ if(IsAdminGhost(user)) return TRUE - if(issilicon(user)) + if(computer && computer.hasSiliconAccessInArea(user)) return TRUE if(ishuman(user)) diff --git a/code/modules/oracle_ui/hookup_procs.dm b/code/modules/oracle_ui/hookup_procs.dm index 0a092caf30..18d7bbfd8c 100644 --- a/code/modules/oracle_ui/hookup_procs.dm +++ b/code/modules/oracle_ui/hookup_procs.dm @@ -35,9 +35,9 @@ return ..() /obj/machinery/oui_canview(mob/user) - if(user.has_unlimited_silicon_privilege) + if(user.has_unlimited_silicon_privilege || hasSiliconAccessInArea(user)) return TRUE - if(!can_interact()) + if(!can_interact(user)) return FALSE if(iscyborg(user)) return can_see(user, src, 7) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 6a674fa6b1..b15b701272 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -106,6 +106,8 @@ var/update_overlay = -1 var/icon_update_needed = FALSE var/obj/machinery/computer/apc_control/remote_control = null + var/mob/living/carbon/hijacker + var/hijackerlast = FALSE /obj/machinery/power/apc/unlocked locked = FALSE @@ -260,7 +262,7 @@ . += "Alt-Click the APC to [ locked ? "unlock" : "lock"] the interface." - if(issilicon(user)) + if(area.hasSiliconAccessInArea(user)) . += "Ctrl-Click the APC to switch the breaker [ operating ? "off" : "on"]." // update the APC icon to show the three base states @@ -299,12 +301,15 @@ if(!(update_state & UPSTATE_ALLGOOD)) SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) - + var/hijackerreturn + if (hijacker) + var/obj/item/implant/hijack/H = hijacker.getImplant(/obj/item/implant/hijack) + hijackerreturn = H && !H.stealthmode if(update & 2) SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) if(!(stat & (BROKEN|MAINT)) && update_state & UPSTATE_ALLGOOD) SSvis_overlays.add_vis_overlay(src, icon, "apcox-[locked]", ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE, dir) - SSvis_overlays.add_vis_overlay(src, icon, "apco3-[charging]", ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE, dir) + SSvis_overlays.add_vis_overlay(src, icon, "apco3-[hijackerreturn ? "3" : charging]", ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE, dir) if(operating) SSvis_overlays.add_vis_overlay(src, icon, "apco0-[equipment]", ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE, dir) SSvis_overlays.add_vis_overlay(src, icon, "apco1-[lighting]", ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE, dir) @@ -319,6 +324,8 @@ light_color = LIGHT_COLOR_BLUE if(APC_FULLY_CHARGED) light_color = LIGHT_COLOR_GREEN + if (hijackerreturn) + light_color = LIGHT_COLOR_YELLOW set_light(lon_range) else if(update_state & UPSTATE_BLUESCREEN) light_color = LIGHT_COLOR_BLUE @@ -387,14 +394,19 @@ else if(environ==2) update_overlay |= APC_UPOVERLAY_ENVIRON2 - var/results = 0 - if(last_update_state == update_state && last_update_overlay == update_overlay) + var/hijackerreturn + if (hijacker) + var/obj/item/implant/hijack/H = hijacker.getImplant(/obj/item/implant/hijack) + hijackerreturn = H && !H.stealthmode + if(last_update_state == update_state && last_update_overlay == update_overlay && hijackerreturn ? hijackerlast : !hijackerlast) return 0 if(last_update_state != update_state) results += 1 - if(last_update_overlay != update_overlay) + if(last_update_overlay != update_overlay || hijackerreturn ? !hijackerlast : hijackerlast) results += 2 + if (hijackerreturn ? !hijackerlast : hijackerlast) + hijackerlast = hijackerreturn ? TRUE : FALSE return results // Used in process so it doesn't update the icon too much @@ -534,7 +546,7 @@ /obj/machinery/power/apc/attackby(obj/item/W, mob/living/user, params) - if(issilicon(user) && get_dist(src,user)>1) + if(area.hasSiliconAccessInArea(user) && get_dist(src,user)>1) return attack_hand(user) if (istype(W, /obj/item/stock_parts/cell) && opened) @@ -741,7 +753,7 @@ /obj/machinery/power/apc/AltClick(mob/user) . = ..() - if(!user.canUseTopic(src, !issilicon(user)) || !isturf(loc)) + if(!user.canUseTopic(src, !area.hasSiliconAccessInArea(user)) || !isturf(loc)) return togglelock(user) return TRUE @@ -756,7 +768,7 @@ else if(stat & (BROKEN|MAINT)) to_chat(user, "Nothing happens!") else - if(allowed(usr) && !wires.is_cut(WIRE_IDSCAN) && !malfhack) + if((allowed(usr) || area.hasSiliconAccessInArea(usr)) && !wires.is_cut(WIRE_IDSCAN) && !malfhack) locked = !locked to_chat(user, "You [ locked ? "lock" : "unlock"] the APC interface.") update_icon() @@ -833,6 +845,11 @@ if((stat & MAINT) && !opened) //no board; no interface return +/obj/machinery/power/apc/oui_canview(mob/user) + if(user.has_unlimited_silicon_privilege || area.hasSiliconAccessInArea(user)) + return TRUE + return ..() + /obj/machinery/power/apc/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) @@ -842,8 +859,12 @@ ui.open() /obj/machinery/power/apc/ui_data(mob/user) + var/obj/item/implant/hijack/H = user.getImplant(/obj/item/implant/hijack) + var/abilitiesavail = FALSE + if (H && !H.stealthmode && H.toggled) + abilitiesavail = TRUE var/list/data = list( - "locked" = locked && !(integration_cog && is_servant_of_ratvar(user)), + "locked" = locked && !(integration_cog && is_servant_of_ratvar(user)) && !area.hasSiliconAccessInArea(user), "lock_nightshift" = nightshift_requires_auth, "failTime" = failure_timer, "isOperating" = operating, @@ -853,11 +874,14 @@ "chargingStatus" = charging, "totalLoad" = DisplayPower(lastused_total), "coverLocked" = coverlocked, - "siliconUser" = user.has_unlimited_silicon_privilege || user.using_power_flow_console(), + "siliconUser" = user.has_unlimited_silicon_privilege || user.using_power_flow_console() || area.hasSiliconAccessInArea(user), "malfStatus" = get_malf_status(user), "emergencyLights" = !emergency_lights, "nightshiftLights" = nightshift_lights, - + "hijackable" = HAS_TRAIT(user,TRAIT_HIJACKER), + "hijacker" = hijacker == user ? TRUE : FALSE, + "drainavail" = cell && cell.percent() >= 85 && abilitiesavail, + "lockdownavail" = cell && cell.percent() >= 35 && abilitiesavail, "powerChannels" = list( list( "title" = "Equipment", @@ -925,17 +949,12 @@ /obj/machinery/power/apc/proc/can_use(mob/user, loud = 0) //used by attack_hand() and Topic() if(IsAdminGhost(user)) return TRUE + if (user == hijacker || (area.hasSiliconAccessInArea(user) && !aidisabled)) + return TRUE if(user.has_unlimited_silicon_privilege) var/mob/living/silicon/ai/AI = user var/mob/living/silicon/robot/robot = user - if ( \ - src.aidisabled || \ - malfhack && istype(malfai) && \ - ( \ - (istype(AI) && (malfai!=AI && malfai != AI.parent)) || \ - (istype(robot) && (robot in malfai.connected_robots)) \ - ) \ - ) + if (src.aidisabled || malfhack && istype(malfai) && ((istype(AI) && (malfai!=AI && malfai != AI.parent)) || (istype(robot) && (robot in malfai.connected_robots)))) if(!loud) to_chat(user, "\The [src] has eee disabled!") return FALSE @@ -945,11 +964,15 @@ . = ..() if (!. && !QDELETED(remote_control)) . = remote_control.can_interact(user) + if (hijacker == user && area.hasSiliconAccessInArea(user)) + return TRUE /obj/machinery/power/apc/ui_status(mob/user) . = ..() if (!QDELETED(remote_control) && user == remote_control.operator) . = UI_INTERACTIVE + if (user == hijacker && area.hasSiliconAccessInArea(user)) + . = UI_INTERACTIVE /obj/machinery/power/apc/ui_act(action, params) if(..() || !can_use(usr, 1)) @@ -959,7 +982,10 @@ failure_timer = 0 update_icon() update() - var/authorized = (!locked || usr.has_unlimited_silicon_privilege || (integration_cog && (is_servant_of_ratvar(usr)))) + if (action == "hijack" && can_use(usr, 1)) //don't need auth for hijack button + hijack(usr) + return + var/authorized = (!locked || usr.has_unlimited_silicon_privilege || area.hasSiliconAccessInArea(usr) || (integration_cog && (is_servant_of_ratvar(usr)))) if((action == "toggle_nightshift") && (!nightshift_requires_auth || authorized)) toggle_nightshift_lights() return TRUE @@ -967,7 +993,7 @@ return switch(action) if("lock") - if(usr.has_unlimited_silicon_privilege) + if(usr.has_unlimited_silicon_privilege || area.hasSiliconAccessInArea(usr)) if((obj_flags & EMAGGED) || (stat & (BROKEN|MAINT))) to_chat(usr, "The APC does not respond to the command.") else @@ -1001,7 +1027,7 @@ update() return TRUE if("overload") - if(usr.has_unlimited_silicon_privilege) + if(usr.has_unlimited_silicon_privilege || area.hasSiliconAccessInArea(usr)) overload_lighting() return TRUE if("hack") @@ -1023,7 +1049,26 @@ L.no_emergency = emergency_lights INVOKE_ASYNC(L, /obj/machinery/light/.proc/update, FALSE) CHECK_TICK - return TRUE + if("drain") + cell.use(cell.charge) + hijacker.toggleSiliconAccessArea(area) + hijacker = null + set_hijacked_lighting() + update_icon() + var/obj/item/implant/hijack/H = usr.getImplant(/obj/item/implant/hijack) + H.stealthcooldown = world.time + 2 MINUTES + energy_fail(30 SECONDS * (cell.charge / cell.maxcharge)) + if("lockdown") + var/celluse = rand(20,35) + celluse = celluse /100 + for (var/obj/machinery/door/D in GLOB.airlocks) + if (get_area(D) == area) + INVOKE_ASYNC(D,/obj/machinery/door.proc/hostile_lockdown,usr, FALSE) + addtimer(CALLBACK(D,/obj/machinery/door.proc/disable_lockdown, FALSE), 30 SECONDS) + cell.charge -= cell.maxcharge*celluse + var/obj/item/implant/hijack/H = usr.getImplant(/obj/item/implant/hijack) + H.stealthcooldown = world.time + 3 MINUTES + return TRUE /obj/machinery/power/apc/proc/toggle_breaker() if(!is_operational() || failure_timer) @@ -1032,6 +1077,39 @@ update() update_icon() +/obj/machinery/power/apc/proc/hijack(mob/living/L) + if (!istype(L)) + return + if (hijacker && hijacker != L) + var/obj/item/implant/hijack/H = L.getImplant(/obj/item/implant/hijack) + to_chat(L, "Someone already has control of this APC. Beginning counter-hijack.") + H.hijacking = TRUE + if (do_after(L,20 SECONDS,target=src)) + hijacker.toggleSiliconAccessArea(area) + if (L.toggleSiliconAccessArea(area)) + hijacker = L + update_icon() + set_hijacked_lighting() + H.hijacking = FALSE + return + else + to_chat(L, "Aborting.") + H.hijacking = FALSE + return + to_chat(L, "Beginning hijack of APC.") + var/obj/item/implant/hijack/H = L.getImplant(/obj/item/implant/hijack) + H.hijacking = TRUE + if (do_after(L,H.stealthmode ? 12 SECONDS : 5 SECONDS,target=src)) + if (L.toggleSiliconAccessArea(area)) + hijacker = L + update_icon() + set_hijacked_lighting() + H.hijacking = FALSE + else + to_chat(L, "Aborting.") + H.hijacking = FALSE + return + /obj/machinery/power/apc/proc/malfhack(mob/living/silicon/ai/malf) if(!istype(malf)) return @@ -1438,6 +1516,17 @@ L.update(FALSE) CHECK_TICK +/obj/machinery/power/apc/proc/set_hijacked_lighting() + set waitfor = FALSE + var/hijackerreturn + if (hijacker) + var/obj/item/implant/hijack/H = hijacker.getImplant(/obj/item/implant/hijack) + hijackerreturn = H && !H.stealthmode + for(var/obj/machinery/light/L in area) + L.hijacked = hijackerreturn + L.update(FALSE) + CHECK_TICK + /obj/machinery/power/apc/proc/update_nightshift_auth_requirement() nightshift_requires_auth = nightshift_toggle_requires_auth() diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 441eb27621..5ca09036ad 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -220,6 +220,7 @@ var/bulb_emergency_colour = "#FF3232" // determines the colour of the light while it's in emergency mode var/bulb_emergency_pow_mul = 0.75 // the multiplier for determining the light's power in emergency mode var/bulb_emergency_pow_min = 0.5 // the minimum value for the light's power in emergency mode + var/hijacked = FALSE // if true, the light is in a hijacked area /obj/machinery/light/broken status = LIGHT_BROKEN @@ -298,7 +299,10 @@ if(emergency_mode || (A && A.fire)) icon_state = "[base_state]_emergency" else - icon_state = "[base_state]" + if (hijacked) + icon_state = "[base_state]_hijacked" + else + icon_state = "[base_state]" if(on) var/mutable_appearance/glowybit = mutable_appearance(overlayicon, base_state, ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE) glowybit.alpha = CLAMP(light_power*250, 30, 200) @@ -326,6 +330,10 @@ var/area/A = get_base_area(src) if (A && A.fire) CO = bulb_emergency_colour + else if (hijacked) + BR = BR * 1.5 + PO = PO * 1.5 + CO = color ? color : LIGHT_COLOR_YELLOW else if (nightshift_enabled) BR = nightshift_brightness PO = nightshift_light_power @@ -355,7 +363,7 @@ if(on != on_gs) on_gs = on if(on) - static_power_used = brightness * 14.4 //20W per unit luminosity + static_power_used = brightness * 14.4 * (hijacked ? 2 : 1) //20W per unit luminosity addStaticPower(static_power_used, STATIC_LIGHT) else removeStaticPower(static_power_used, STATIC_LIGHT) diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm index 52236ab695..57bbd13cf7 100644 --- a/code/modules/projectiles/guns/magic/wand.dm +++ b/code/modules/projectiles/guns/magic/wand.dm @@ -73,6 +73,12 @@ user.adjustOxyLoss(500) charges-- +/obj/item/gun/magic/wand/death/debug + desc = "In some obscure circles, this is known as the 'cloning tester's friend'." + max_charges = 500 + variable_charges = FALSE + can_charge = TRUE + recharge_rate = 1 ///////////////////////////////////// //WAND OF HEALING diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index 0abdc9a739..f41a6956a1 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -319,7 +319,7 @@ if(!is_operational()) return var/name = stripped_input(usr,"Name","What do you want to name this recipe?", "Recipe", MAX_NAME_LEN) - if(!usr.canUseTopic(src, !issilicon(usr))) + if(!usr.canUseTopic(src, !hasSiliconAccessInArea(usr))) return if(saved_recipes[name] && alert("\"[name]\" already exists, do you want to overwrite it?",, "Yes", "No") == "No") return diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index 44148c85a7..66c663e2e4 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -261,7 +261,7 @@ return vol_each = min(reagents.total_volume / amount, 50) var/name = html_decode(stripped_input(usr,"Name:","Name your pill!", "[reagents.get_master_reagent_name()] ([vol_each]u)", MAX_NAME_LEN)) - if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, !issilicon(usr))) + if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, !hasSiliconAccessInArea(usr))) return var/obj/item/reagent_containers/pill/P var/target_loc = drop_location() @@ -288,7 +288,7 @@ reagents.trans_to(P,vol_each) else var/name = html_decode(stripped_input(usr, "Name:", "Name your pack!", reagents.get_master_reagent_name(), MAX_NAME_LEN)) - if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, !issilicon(usr))) + if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, !hasSiliconAccessInArea(usr))) return var/obj/item/reagent_containers/food/condiment/pack/P = new/obj/item/reagent_containers/food/condiment/pack(drop_location()) @@ -314,7 +314,7 @@ return vol_each = min(reagents.total_volume / amount, 40) var/name = html_decode(stripped_input(usr,"Name:","Name your patch!", "[reagents.get_master_reagent_name()] ([vol_each]u)", MAX_NAME_LEN)) - if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, !issilicon(usr))) + if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, !hasSiliconAccessInArea(usr))) return var/obj/item/reagent_containers/pill/P @@ -332,7 +332,7 @@ if(condi) var/name = html_decode(stripped_input(usr, "Name:","Name your bottle!", (reagents.total_volume ? reagents.get_master_reagent_name() : " "), MAX_NAME_LEN)) - if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, !issilicon(usr))) + if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, !hasSiliconAccessInArea(usr))) return var/obj/item/reagent_containers/food/condiment/P = new(drop_location()) P.originalname = name @@ -345,7 +345,7 @@ amount_full = round(reagents.total_volume / 30) vol_part = ((reagents.total_volume*1000) % 30000) / 1000 //% operator doesn't support decimals. var/name = html_decode(stripped_input(usr, "Name:","Name your bottle!", (reagents.total_volume ? reagents.get_master_reagent_name() : " "), MAX_NAME_LEN)) - if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, !issilicon(usr))) + if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, !hasSiliconAccessInArea(usr))) return var/obj/item/reagent_containers/glass/bottle/P @@ -373,7 +373,7 @@ amount_full = round(reagents.total_volume / 60) vol_part = reagents.total_volume % 60 var/name = html_decode(stripped_input(usr, "Name:","Name your hypovial!", (reagents.total_volume ? reagents.get_master_reagent_name() : " "), MAX_NAME_LEN)) - if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, !issilicon(usr))) + if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, !hasSiliconAccessInArea(usr))) return var/obj/item/reagent_containers/glass/bottle/vial/small/P @@ -408,7 +408,7 @@ vol_each = min(reagents.total_volume / amount, 20) var/name = html_decode(stripped_input(usr,"Name:","Name your SmartDart!", "[reagents.get_master_reagent_name()] ([vol_each]u)", MAX_NAME_LEN)) - if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, !issilicon(usr))) + if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, !hasSiliconAccessInArea(usr))) return var/obj/item/reagent_containers/syringe/dart/D diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm index bba5371ef8..8870ef8ed5 100644 --- a/code/modules/reagents/chemistry/machinery/pandemic.dm +++ b/code/modules/reagents/chemistry/machinery/pandemic.dm @@ -170,7 +170,7 @@ if(!A.mutable) return if(A) - var/new_name = stripped_input(usr, "Name the disease", "New name", "", MAX_NAME_LEN) + var/new_name = sanitize_name(html_encode(params["name"])) if(!new_name || ..()) return A.AssignName(new_name) diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm index 7e1b7ec018..b17c2dfb37 100644 --- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm +++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm @@ -142,7 +142,7 @@ /obj/machinery/reagentgrinder/ui_interact(mob/user) // The microwave Menu //I am reasonably certain that this is not a microwave . = ..() - if(operating || !user.canUseTopic(src, !issilicon(user))) + if(operating || !user.canUseTopic(src, !hasSiliconAccessInArea(user))) return var/list/options = list() @@ -170,10 +170,10 @@ for(var/key in options) choice = key else - choice = show_radial_menu(user, src, options, require_near = !issilicon(user)) + choice = show_radial_menu(user, src, options, require_near = !hasSiliconAccessInArea(user)) // post choice verification - if(operating || (isAI(user) && stat & NOPOWER) || !user.canUseTopic(src, !issilicon(user))) + if(operating || (isAI(user) && stat & NOPOWER) || !user.canUseTopic(src, !hasSiliconAccessInArea(user))) return switch(choice) @@ -190,7 +190,7 @@ /obj/machinery/reagentgrinder/examine(mob/user) . = ..() - if(!in_range(user, src) && !issilicon(user) && !isobserver(user)) + if(!in_range(user, src) && !hasSiliconAccessInArea(user) && !isobserver(user)) . += "You're too far away to examine [src]'s contents and display!" return diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index 810124b2ba..7a3a7eeec2 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -725,11 +725,15 @@ All effects don't start immediately, but rather get worse over time; the rate is var/dorf_mode /datum/reagent/consumable/ethanol/manly_dorf/on_mob_metabolize(mob/living/M) + var/real_dorf = isdwarf(M) //_species(H, /datum/species/dwarf) if(ishuman(M)) var/mob/living/carbon/human/H = M - if(H.dna.check_mutation(DWARFISM) || HAS_TRAIT(H, TRAIT_ALCOHOL_TOLERANCE)) + if(H.dna.check_mutation(DWARFISM) || HAS_TRAIT(H, TRAIT_ALCOHOL_TOLERANCE) || real_dorf) to_chat(H, "Now THAT is MANLY!") - boozepwr = 5 //We've had worse in the mines + if(real_dorf) + boozepwr = 100 // Don't want dwarves to die because of a low booze power + else + boozepwr = 5 //We've had worse in the mines dorf_mode = TRUE /datum/reagent/consumable/ethanol/manly_dorf/on_mob_life(mob/living/carbon/M) diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index e8913f9ce4..6d37f30884 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -994,7 +994,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) /datum/reagent/medicine/stimulants/on_mob_metabolize(mob/living/L) ..() - L.add_movespeed_modifier(type, update=TRUE, priority=100, multiplicative_slowdown=-1, blacklisted_movetypes=(FLYING|FLOATING)) + L.add_movespeed_modifier(type, update=TRUE, priority=100, multiplicative_slowdown=-0.5, blacklisted_movetypes=(FLYING|FLOATING)) /datum/reagent/medicine/stimulants/on_mob_end_metabolize(mob/living/L) L.remove_movespeed_modifier(type) diff --git a/code/modules/research/designs/tool_designs.dm b/code/modules/research/designs/tool_designs.dm index 300fe6c68a..cf1c0563d5 100644 --- a/code/modules/research/designs/tool_designs.dm +++ b/code/modules/research/designs/tool_designs.dm @@ -27,7 +27,7 @@ desc = "A tool that can construct and deconstruct walls, airlocks and floors on the fly." id = "rcd_loaded" build_type = PROTOLATHE - materials = list(MAT_METAL = MINERAL_MATERIAL_AMOUNT, MAT_GLASS = MINERAL_MATERIAL_AMOUNT) // costs more than what it did in the autolathe, this one comes loaded. + materials = list(MAT_METAL = 36000) // costs more than what it did in the autolathe, this one comes loaded. build_path = /obj/item/construction/rcd/loaded category = list("Tool Designs") departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index d33ef29155..71cfe7c0f5 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -52,13 +52,12 @@ Nothing else in the console has ID requirements. research_control = FALSE /proc/CallMaterialName(ID) + if(GLOB.chemical_reagents_list[ID]) + var/datum/reagent/reagent = GLOB.chemical_reagents_list[ID] + return reagent.name if (ID[1] == "$" && GLOB.materials_list[ID]) var/datum/material/material = GLOB.materials_list[ID] return material.name - - else if(GLOB.chemical_reagents_list[ID]) - var/datum/reagent/reagent = GLOB.chemical_reagents_list[ID] - return reagent.name return "ERROR: Report This" /obj/machinery/computer/rdconsole/proc/SyncRDevices() //Makes sure it is properly sync'ed up with the devices attached to it (if any). diff --git a/code/modules/research/stock_parts.dm b/code/modules/research/stock_parts.dm index e29cf28f34..5037f23cd1 100644 --- a/code/modules/research/stock_parts.dm +++ b/code/modules/research/stock_parts.dm @@ -60,6 +60,7 @@ If you create T5+ please take a pass at gene_modder.dm [L40]. Max_values MUST fi new /obj/item/stock_parts/manipulator(src) new /obj/item/stock_parts/micro_laser(src) new /obj/item/stock_parts/matter_bin(src) + new /obj/item/stock_parts/cell/high(src) /obj/item/storage/part_replacer/bluespace/tier2 @@ -70,6 +71,7 @@ If you create T5+ please take a pass at gene_modder.dm [L40]. Max_values MUST fi new /obj/item/stock_parts/manipulator/nano(src) new /obj/item/stock_parts/micro_laser/high(src) new /obj/item/stock_parts/matter_bin/adv(src) + new /obj/item/stock_parts/cell/super(src) /obj/item/storage/part_replacer/bluespace/tier3 @@ -80,6 +82,7 @@ If you create T5+ please take a pass at gene_modder.dm [L40]. Max_values MUST fi new /obj/item/stock_parts/manipulator/pico(src) new /obj/item/stock_parts/micro_laser/ultra(src) new /obj/item/stock_parts/matter_bin/super(src) + new /obj/item/stock_parts/cell/hyper(src) /obj/item/storage/part_replacer/bluespace/tier4 @@ -90,6 +93,7 @@ If you create T5+ please take a pass at gene_modder.dm [L40]. Max_values MUST fi new /obj/item/stock_parts/manipulator/femto(src) new /obj/item/stock_parts/micro_laser/quadultra(src) new /obj/item/stock_parts/matter_bin/bluespace(src) + new /obj/item/stock_parts/cell/bluespace(src) /obj/item/storage/part_replacer/cargo //used in a cargo crate diff --git a/code/modules/spells/spell_types/wizard.dm b/code/modules/spells/spell_types/wizard.dm index e098fe389d..44fdd1eb55 100644 --- a/code/modules/spells/spell_types/wizard.dm +++ b/code/modules/spells/spell_types/wizard.dm @@ -248,6 +248,7 @@ mutations = list(BLINDMUT) duration = 300 sound = 'sound/magic/blind.ogg' + /obj/effect/proc_holder/spell/aoe_turf/repulse name = "Repulse" desc = "This spell throws everything around the user away." @@ -266,15 +267,22 @@ action_icon_state = "repulse" /obj/effect/proc_holder/spell/aoe_turf/repulse/cast(list/targets,mob/user = usr, stun_amt = 50) + var/list/mobs = list() + var/list/objs = list() var/list/thrownatoms = list() var/atom/throwtarget var/distfromcaster playMagSound() for(var/turf/T in targets) //Done this way so things don't get thrown all around hilariously. - for(var/atom/movable/AM in T) - thrownatoms += AM - + for(var/mob/M in T) + mobs += M + for(var/obj/O in T) + objs += O + thrownatoms = mobs + objs //mobs first + var/safety = 50 for(var/am in thrownatoms) + if(!safety) + break var/atom/movable/AM = am if(AM == user || AM.anchored) continue @@ -299,6 +307,7 @@ M.Knockdown(stun_amt, override_hardstun = stun_amt * 0.2) to_chat(M, "You're thrown back by [user]!") AM.throw_at(throwtarget, ((CLAMP((maxthrow - (CLAMP(distfromcaster - 2, 0, distfromcaster))), 3, maxthrow))), 1,user)//So stuff gets tossed around at the same time. + safety-- /obj/effect/proc_holder/spell/aoe_turf/repulse/xeno //i fixed conflicts only to find out that this is in the WIZARD file instead of the xeno file?! name = "Tail Sweep" diff --git a/code/modules/tgui/states.dm b/code/modules/tgui/states.dm index fc30d171fb..959f096d05 100644 --- a/code/modules/tgui/states.dm +++ b/code/modules/tgui/states.dm @@ -103,7 +103,7 @@ return UI_CLOSE var/dist = get_dist(src_object, src) - if(dist <= 1) // Open and interact if 1-0 tiles away. + if(dist <= 1 || src_object.hasSiliconAccessInArea(src)) // Open and interact if 1-0 tiles away. return UI_INTERACTIVE else if(dist <= 2) // View only if 2-3 tiles away. return UI_UPDATE diff --git a/code/modules/uplink/uplink_devices.dm b/code/modules/uplink/uplink_devices.dm index 2bcfb40c45..9c09a7334a 100644 --- a/code/modules/uplink/uplink_devices.dm +++ b/code/modules/uplink/uplink_devices.dm @@ -57,3 +57,22 @@ /obj/item/pen/uplink/Initialize(mapload, owner, tc_amount = 20) . = ..() AddComponent(/datum/component/uplink, owner, TRUE, FALSE, null, tc_amount) + +/obj/item/uplink/debug + name = "debug uplink" + +/obj/item/uplink/debug/Initialize(mapload, owner, tc_amount = 9000) + . = ..() + var/datum/component/uplink/hidden_uplink = GetComponent(/datum/component/uplink) + hidden_uplink.name = "debug uplink" + hidden_uplink.debug = TRUE + +/obj/item/uplink/nuclear/debug + name = "debug nuclear uplink" + +/obj/item/uplink/nuclear/debug/Initialize(mapload, owner, tc_amount = 9000) + . = ..() + var/datum/component/uplink/hidden_uplink = GetComponent(/datum/component/uplink) + hidden_uplink.set_gamemode(/datum/game_mode/nuclear) + hidden_uplink.name = "debug nuclear uplink" + hidden_uplink.debug = TRUE diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index b75f212ba9..52f6efd3df 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -157,6 +157,7 @@ category = "Role-Restricted" exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) surplus = 0 + cant_discount = TRUE /datum/uplink_item/badass category = "(Pointless) Badassery" @@ -164,4 +165,4 @@ //Discounts (dynamically filled above) /datum/uplink_item/discounts - category = "Discounted Gear" \ No newline at end of file + category = "Discounted Gear" diff --git a/code/modules/uplink/uplink_items/uplink_implants.dm b/code/modules/uplink/uplink_items/uplink_implants.dm index d8a31a9b9c..02b8b1e01d 100644 --- a/code/modules/uplink/uplink_items/uplink_implants.dm +++ b/code/modules/uplink/uplink_items/uplink_implants.dm @@ -29,6 +29,22 @@ item = /obj/item/storage/box/syndie_kit/imp_freedom cost = 5 +/datum/uplink_item/implants/hijack + name = "Hijack Implant" + desc = "An implant that will let you hack into the APCs on station, allowing you to control them at will and the machinery within those rooms." + item = /obj/item/implanter/hijack + cost = 14 //really overkill, 14 tc, can still get caught in a room you haven't hijacked and you're fucked. + surplus = 0 //nope not having hijack implants with surplus crates nope nope nope nope + restricted = TRUE + +/datum/uplink_item/implants/radio + name = "Internal Syndicate Radio Implant" + desc = "An implant injected into the body, allowing the use of an internal Syndicate radio. \ + Used just like a regular headset, but can be disabled to use external headsets normally and to avoid detection." + item = /obj/item/storage/box/syndie_kit/imp_radio + cost = 4 + restricted = TRUE + /datum/uplink_item/implants/microbomb name = "Microbomb Implant" desc = "An implant injected into the body, and later activated either manually or automatically upon death. \ @@ -47,14 +63,6 @@ include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) restricted = TRUE -/datum/uplink_item/implants/radio - name = "Internal Syndicate Radio Implant" - desc = "An implant injected into the body, allowing the use of an internal Syndicate radio. \ - Used just like a regular headset, but can be disabled to use external headsets normally and to avoid detection." - item = /obj/item/storage/box/syndie_kit/imp_radio - cost = 4 - restricted = TRUE - /datum/uplink_item/implants/reviver name = "Reviver Implant" desc = "This implant will attempt to revive and heal you if you lose consciousness. Comes with an autosurgeon." diff --git a/config/config.txt b/config/config.txt index 4d8dcfb00c..b91e8fce33 100644 --- a/config/config.txt +++ b/config/config.txt @@ -6,6 +6,7 @@ $include comms.txt $include antag_rep.txt $include donator_groupings.txt $include dynamic_config.txt +$include plushies/defines.txt # You can use the @ character at the beginning of a config option to lock it from being edited in-game # Example usage: diff --git a/config/plushies/defines.txt b/config/plushies/defines.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/config/plushies/plushie_config.txt b/config/plushies/plushie_config.txt new file mode 100644 index 0000000000..7cd1d88f3e --- /dev/null +++ b/config/plushies/plushie_config.txt @@ -0,0 +1,2 @@ +# EXAMPLE +# SNOWFLAKE_PLUSHIES example {"name":"example","desc":"thanks, coders.","icon_state":"","attack_verb":["thumped","whomped","bumped"],"squeak_override":{"sound/weapons/magout.ogg":1}} diff --git a/config/plushies/sprites.dmi b/config/plushies/sprites.dmi new file mode 100644 index 0000000000..2970010b2b Binary files /dev/null and b/config/plushies/sprites.dmi differ diff --git a/html/changelogs/AutoChangeLog-pr-10277.yml b/html/changelogs/AutoChangeLog-pr-10277.yml new file mode 100644 index 0000000000..d2c873d010 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10277.yml @@ -0,0 +1,4 @@ +author: "kevinz000" +delete-after: True +changes: + - refactor: "Custom snowflake plushies are now in config rather than code." diff --git a/html/changelogs/AutoChangeLog-pr-10596.yml b/html/changelogs/AutoChangeLog-pr-10596.yml new file mode 100644 index 0000000000..7f56a256a0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10596.yml @@ -0,0 +1,5 @@ +author: "Seris02" +delete-after: True +changes: + - rscadd: "hijack implant" + - code_imp: "changed mentions of the issilion proc to hasSiliconAccessInArea based on what the proc is used for" diff --git a/html/changelogs/AutoChangeLog-pr-10926.yml b/html/changelogs/AutoChangeLog-pr-10926.yml new file mode 100644 index 0000000000..9662402d1b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10926.yml @@ -0,0 +1,9 @@ +author: "keronshb" +delete-after: True +changes: + - rscadd: "Added repairable turrets" + - rscadd: "Adds Tiny Fans to the pirate ship" + - tweak: "changes some reinforced windows to plastinanium pirate windows" + - tweak: "made the pirate shuttle + turrets bomb resistant" + - tweak: "made most pirate machines + consoles indestructible" + - tweak: "increased pirate turret health" diff --git a/html/changelogs/AutoChangeLog-pr-10936.yml b/html/changelogs/AutoChangeLog-pr-10936.yml new file mode 100644 index 0000000000..2303f157ab --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10936.yml @@ -0,0 +1,4 @@ +author: "kevinz000" +delete-after: True +changes: + - balance: "Cyborgization will now de-gang people, even gangheads." diff --git a/html/changelogs/AutoChangeLog-pr-10937.yml b/html/changelogs/AutoChangeLog-pr-10937.yml new file mode 100644 index 0000000000..1c56882ccc --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10937.yml @@ -0,0 +1,4 @@ +author: "Arturlang" +delete-after: True +changes: + - admin: "The debug outfit is now kitted out for whatever debbuging needs." diff --git a/html/changelogs/AutoChangeLog-pr-10948.yml b/html/changelogs/AutoChangeLog-pr-10948.yml new file mode 100644 index 0000000000..f9da9463fc --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10948.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - bugfix: "Stopped role restricted uplink items from being discounted despite not being purchasable most times." diff --git a/html/changelogs/AutoChangeLog-pr-10961.yml b/html/changelogs/AutoChangeLog-pr-10961.yml new file mode 100644 index 0000000000..eaaafab472 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10961.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - bugfix: "Fixed an issue with the nearsighted prescription glasses taking over worn eyewear." diff --git a/html/changelogs/AutoChangeLog-pr-10967.yml b/html/changelogs/AutoChangeLog-pr-10967.yml new file mode 100644 index 0000000000..f242dd57bc --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10967.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - bugfix: "Fixed AI unanchoring not properly removing the no teleport trait. My bad." diff --git a/html/changelogs/AutoChangeLog-pr-10971.yml b/html/changelogs/AutoChangeLog-pr-10971.yml new file mode 100644 index 0000000000..e7882646f8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10971.yml @@ -0,0 +1,4 @@ +author: "Trilbyspaceclone" +delete-after: True +changes: + - rscadd: "Alien stools and chairs" diff --git a/html/changelogs/AutoChangeLog-pr-10972.yml b/html/changelogs/AutoChangeLog-pr-10972.yml new file mode 100644 index 0000000000..9cc2e64687 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10972.yml @@ -0,0 +1,4 @@ +author: "Trilbyspaceclone" +delete-after: True +changes: + - tweak: "Bone armor/Dagger are now crafting from bones rather then crafting menu" diff --git a/html/changelogs/AutoChangeLog-pr-10976.yml b/html/changelogs/AutoChangeLog-pr-10976.yml new file mode 100644 index 0000000000..34ef082829 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10976.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - bugfix: "Fixed another issue with hering comsig." diff --git a/html/changelogs/AutoChangeLog-pr-10981.yml b/html/changelogs/AutoChangeLog-pr-10981.yml new file mode 100644 index 0000000000..df0d7990cb --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10981.yml @@ -0,0 +1,4 @@ +author: "IHOPMommyLich" +delete-after: True +changes: + - tweak: "Changed the multiplicative_slowdown of Stimulants from -1 to -0.5" diff --git a/html/changelogs/AutoChangeLog-pr-10984.yml b/html/changelogs/AutoChangeLog-pr-10984.yml new file mode 100644 index 0000000000..137536b430 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10984.yml @@ -0,0 +1,4 @@ +author: "Trilbyspaceclone" +delete-after: True +changes: + - balance: "Heads of staff have been better screened by NT before being promoted" diff --git a/html/changelogs/AutoChangeLog-pr-10988.yml b/html/changelogs/AutoChangeLog-pr-10988.yml new file mode 100644 index 0000000000..ebd9de7689 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10988.yml @@ -0,0 +1,4 @@ +author: "YakumoChen" +delete-after: True +changes: + - tweak: "Observe is back in the OOC tab" diff --git a/html/changelogs/AutoChangeLog-pr-10989.yml b/html/changelogs/AutoChangeLog-pr-10989.yml new file mode 100644 index 0000000000..0a5b2ad3c8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10989.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - bugfix: "A little fix concerning some R&D and reagents." diff --git a/html/changelogs/AutoChangeLog-pr-10996.yml b/html/changelogs/AutoChangeLog-pr-10996.yml new file mode 100644 index 0000000000..8bb7646cd6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10996.yml @@ -0,0 +1,6 @@ +author: "PersianXerxes" +delete-after: True +changes: + - rscadd: "SMES and PACMAN attached to gulag Security to power electrified windows +remove: Removed Sec vendor from gulag Security" + - tweak: "Separation of gulag and public mining" diff --git a/html/changelogs/AutoChangeLog-pr-11000.yml b/html/changelogs/AutoChangeLog-pr-11000.yml new file mode 100644 index 0000000000..5e496af81f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11000.yml @@ -0,0 +1,4 @@ +author: "Seris02" +delete-after: True +changes: + - balance: "makes RCDs cost a better amount" diff --git a/html/changelogs/AutoChangeLog-pr-11001.yml b/html/changelogs/AutoChangeLog-pr-11001.yml new file mode 100644 index 0000000000..1cfa8977b4 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11001.yml @@ -0,0 +1,4 @@ +author: "Arturlang" +delete-after: True +changes: + - bugfix: "Fixed the pandemic naming and the radiation healing symptom UI crashing" diff --git a/icons/mob/suit_digi.dmi b/icons/mob/suit_digi.dmi index bb00742a17..c6bda60d38 100644 Binary files a/icons/mob/suit_digi.dmi and b/icons/mob/suit_digi.dmi differ diff --git a/icons/obj/abductor.dmi b/icons/obj/abductor.dmi index fd0893b300..75f84347b6 100644 Binary files a/icons/obj/abductor.dmi and b/icons/obj/abductor.dmi differ diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index 8c2abcd3b9..28fc29cd71 100644 Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ diff --git a/icons/obj/implants.dmi b/icons/obj/implants.dmi index 8dc2f08fdc..a6d4697673 100644 Binary files a/icons/obj/implants.dmi and b/icons/obj/implants.dmi differ diff --git a/icons/obj/lighting.dmi b/icons/obj/lighting.dmi index 396d681f22..675005da91 100644 Binary files a/icons/obj/lighting.dmi and b/icons/obj/lighting.dmi differ diff --git a/icons/obj/plushes.dmi b/icons/obj/plushes.dmi index c6f25f1b29..3abb25d8b2 100644 Binary files a/icons/obj/plushes.dmi and b/icons/obj/plushes.dmi differ diff --git a/icons/obj/power.dmi b/icons/obj/power.dmi index 1ba953d284..1f84da44d4 100644 Binary files a/icons/obj/power.dmi and b/icons/obj/power.dmi differ diff --git a/modular_citadel/code/modules/custom_loadout/custom_items.dm b/modular_citadel/code/modules/custom_loadout/custom_items.dm index 03a4a56147..e1d204c74d 100644 --- a/modular_citadel/code/modules/custom_loadout/custom_items.dm +++ b/modular_citadel/code/modules/custom_loadout/custom_items.dm @@ -557,3 +557,13 @@ icon = 'icons/obj/custom.dmi' alternate_worn_icon = 'icons/mob/custom_w.dmi' mutantrace_variation = NONE + +/obj/item/toy/plush/mammal/dog/fritz + icon = 'icons/obj/custom.dmi' + icon_state = "fritz" + item_state = "fritz" + attack_verb = list("barked", "boofed", "shotgun'd") + obj_flags = UNIQUE_RENAME + unique_reskin = list("Goodboye" = "fritz", "Badboye" = "fritz_bad") + mutantrace_variation = NONE + diff --git a/tgstation.dme b/tgstation.dme index 28ae7eee99..a747c823db 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -233,6 +233,7 @@ #include "code\controllers\configuration\entries\fail2topic.dm" #include "code\controllers\configuration\entries\game_options.dm" #include "code\controllers\configuration\entries\general.dm" +#include "code\controllers\configuration\entries\plushies.dm" #include "code\controllers\subsystem\acid.dm" #include "code\controllers\subsystem\adjacent_air.dm" #include "code\controllers\subsystem\air.dm" @@ -867,6 +868,7 @@ #include "code\game\objects\items\cosmetics.dm" #include "code\game\objects\items\courtroom.dm" #include "code\game\objects\items\crayons.dm" +#include "code\game\objects\items\debug_items.dm" #include "code\game\objects\items\defib.dm" #include "code\game\objects\items\dehy_carp.dm" #include "code\game\objects\items\dice.dm" @@ -979,6 +981,7 @@ #include "code\game\objects\items\implants\implant_exile.dm" #include "code\game\objects\items\implants\implant_explosive.dm" #include "code\game\objects\items\implants\implant_freedom.dm" +#include "code\game\objects\items\implants\implant_hijack.dm" #include "code\game\objects\items\implants\implant_krav_maga.dm" #include "code\game\objects\items\implants\implant_mindshield.dm" #include "code\game\objects\items\implants\implant_misc.dm" diff --git a/tgui-next/packages/tgui/interfaces/Apc.js b/tgui-next/packages/tgui/interfaces/Apc.js index d74c3e8e57..c899ea8ae7 100644 --- a/tgui-next/packages/tgui/interfaces/Apc.js +++ b/tgui-next/packages/tgui/interfaces/Apc.js @@ -201,6 +201,29 @@ export const Apc = props => { onClick={() => act('toggle_nightshift')} /> )} /> + {data.hijackable && ( +
+