diff --git a/SpacemanDMM.toml b/SpacemanDMM.toml index b1c71c30062..fced4d4090e 100644 --- a/SpacemanDMM.toml +++ b/SpacemanDMM.toml @@ -1,12 +1,38 @@ -[langserver] -dreamchecker = true - +# Keep the keys in this file alphabetical please [code_standards] -disallow_relative_type_definitions = true disallow_relative_proc_definitions = true +disallow_relative_type_definitions = true + +[debugger] +engine = "auxtools" [dmdoc] use_typepath_names = true -[debugger] -engine = "auxtools" +[langserver] +dreamchecker = true + +[map_renderer] +hide_invisible = [ + "/obj/effect/landmark", + "/obj/effect/mapping_helpers", + "/obj/effect/spawner/random_barrier", + "/obj/effect/spawner/random_spawners", +] + +[map_renderer.fancy_layers] +# -10 +"/turf/simulated/floor/plating" = -10 +"/turf/space" = -10 +# -2 +"/turf/simulated/floor/bluegrid" = -2 +"/turf/simulated/floor/carpet" = -2 +"/turf/simulated/floor/engine" = -2 +"/turf/simulated/floor/plasteel" = -2 +"/turf/simulated/floor/wood" = -2 +"/turf/simulated/wall" = -2 + +[map_renderer.render_passes] +icon-smoothing = false +icon-smoothing-2016 = true +smart-cables = false diff --git a/_maps/map_files/RandomRuins/SpaceRuins/clownmime.dmm b/_maps/map_files/RandomRuins/SpaceRuins/clownmime.dmm index 853fed945a1..f3c7a0b0e89 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/clownmime.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/clownmime.dmm @@ -146,7 +146,7 @@ /turf/simulated/floor/plating/airless, /area/space/nearstation) "F" = ( -/obj/structure/computerframe/HONKputer, +/obj/structure/computerframe, /turf/simulated/floor/plasteel/airless, /area/space/nearstation) "G" = ( diff --git a/_maps/map_files/RandomRuins/SpaceRuins/syndie_space_base.dmm b/_maps/map_files/RandomRuins/SpaceRuins/syndie_space_base.dmm index afd69a7b5dd..810ff076094 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/syndie_space_base.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/syndie_space_base.dmm @@ -1,4 +1,76 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + tag = "" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/fans/tiny, +/obj/machinery/door/poddoor{ + id_tag = "SSBtestchamber"; + name = "Syndicate Test Lab Blast Door" + }, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered/syndicate_space_base/testlab) +"ab" = ( +/obj/machinery/door_control{ + id = "SSBtestchamber"; + name = "Blast Door Control" + }, +/turf/simulated/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_space_base/testlab) +"ac" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/fans/tiny, +/obj/machinery/door/poddoor{ + id_tag = "SSBtestchamber"; + name = "Syndicate Test Lab Blast Door" + }, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered/syndicate_space_base/testlab) +"ad" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/camera/emp_proof{ + c_tag = "Test Lab West"; + dir = 4; + network = list("SyndicateTestLab") + }, +/turf/simulated/floor/engine, +/area/ruin/unpowered/syndicate_space_base/testlab) +"ae" = ( +/obj/machinery/camera/emp_proof{ + c_tag = "Test Lab East"; + dir = 9; + network = list("SyndicateTestLab") + }, +/turf/simulated/floor/engine, +/area/ruin/unpowered/syndicate_space_base/testlab) "aj" = ( /obj/effect/spawner/window/reinforced, /turf/simulated/floor/plasteel{ @@ -17,7 +89,6 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; tag = "" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -87,7 +158,6 @@ specialfunctions = 4 }, /turf/simulated/floor/plasteel{ - dir = 2; icon_state = "brown" }, /area/ruin/unpowered/syndicate_space_base/cargo) @@ -169,8 +239,7 @@ /area/ruin/unpowered/syndicate_space_base/virology) "cB" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 5; - level = 1 + dir = 5 }, /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -181,7 +250,6 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_y = 0; tag = "" }, /obj/machinery/light, @@ -192,8 +260,7 @@ "cD" = ( /obj/machinery/atmospherics/pipe/manifold/visible{ dir = 4; - initialize_directions = 11; - level = 2 + initialize_directions = 11 }, /obj/machinery/meter, /turf/simulated/floor/plating, @@ -218,8 +285,7 @@ dir = 8 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 5; - level = 1 + dir = 5 }, /turf/simulated/floor/engine, /area/ruin/unpowered/syndicate_space_base/testlab) @@ -256,8 +322,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 4; - initialize_directions = 11; - level = 1 + initialize_directions = 11 }, /turf/simulated/floor/plasteel{ icon_state = "floorgrime" @@ -339,7 +404,6 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_y = 0; tag = "" }, /obj/machinery/atmospherics/unary/vent_scrubber/on, @@ -391,7 +455,6 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; tag = "" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -408,7 +471,6 @@ /obj/machinery/kitchen_machine/microwave, /obj/structure/table, /turf/simulated/floor/plasteel{ - dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)" }, @@ -459,7 +521,6 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; tag = "" }, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ @@ -477,7 +538,6 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; tag = "" }, /turf/simulated/floor/engine, @@ -523,7 +583,6 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; tag = "" }, /obj/machinery/door/firedoor, @@ -562,7 +621,6 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; tag = "" }, /turf/simulated/floor/plasteel{ @@ -613,8 +671,7 @@ "gZ" = ( /obj/machinery/light, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4; - level = 1 + dir = 4 }, /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -651,8 +708,7 @@ /area/ruin/unpowered/syndicate_space_base/chemistry) "hq" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4; - level = 1 + dir = 4 }, /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -704,8 +760,7 @@ "hR" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4; - level = 1 + dir = 4 }, /obj/effect/spawner/window/reinforced, /turf/simulated/floor/plasteel{ @@ -717,12 +772,10 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_y = 0; tag = "" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4; - level = 1 + dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -734,14 +787,12 @@ "hX" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 4; - initialize_directions = 11; - level = 1 + initialize_directions = 11 }, /obj/structure/cable{ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; tag = "" }, /obj/structure/cable{ @@ -790,7 +841,6 @@ dir = 4 }, /turf/simulated/floor/plasteel{ - dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)" }, @@ -801,7 +851,6 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; tag = "" }, /obj/machinery/door/firedoor, @@ -944,8 +993,7 @@ "jS" = ( /obj/machinery/atmospherics/pipe/manifold/visible{ dir = 4; - initialize_directions = 11; - level = 2 + initialize_directions = 11 }, /obj/machinery/meter, /turf/simulated/floor/plasteel{ @@ -1073,7 +1121,6 @@ /obj/machinery/optable, /obj/machinery/light, /turf/simulated/floor/plasteel{ - dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)" }, @@ -1147,7 +1194,6 @@ }, /obj/effect/decal/cleanable/dirt, /obj/structure/cable/yellow{ - d1 = 0; d2 = 2; icon_state = "0-2" }, @@ -1191,18 +1237,6 @@ icon_state = "dark" }, /area/ruin/unpowered/syndicate_space_base/telecomms) -"mE" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/fans/tiny, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/ruin/unpowered/syndicate_space_base/testlab) "mP" = ( /obj/machinery/power/generator, /obj/structure/cable/yellow, @@ -1211,9 +1245,7 @@ "mX" = ( /obj/structure/sink{ dir = 4; - icon_state = "sink"; - pixel_x = 10; - pixel_y = 0 + pixel_x = 10 }, /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -1230,7 +1262,6 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_y = 0; tag = "" }, /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ @@ -1251,7 +1282,6 @@ }, /obj/structure/table, /turf/simulated/floor/plasteel{ - dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)" }, @@ -1291,7 +1321,6 @@ /area/ruin/unpowered/syndicate_space_base/testlab) "ny" = ( /turf/simulated/floor/plasteel{ - dir = 2; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)" }, @@ -1316,7 +1345,6 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_y = 0; tag = "" }, /turf/simulated/floor/plasteel{ @@ -1350,8 +1378,7 @@ "ob" = ( /obj/machinery/door/airlock/hatch/syndicate, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4; - level = 1 + dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -1366,12 +1393,10 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_y = 0; tag = "" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4; - level = 1 + dir = 4 }, /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -1404,14 +1429,6 @@ icon_state = "brown" }, /area/ruin/unpowered/syndicate_space_base/cargo) -"ol" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/engine, -/area/ruin/unpowered/syndicate_space_base/testlab) "ow" = ( /obj/structure/closet/crate/medical, /obj/item/storage/firstaid/fire{ @@ -1438,8 +1455,7 @@ tag = "90Curve" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4; - level = 1 + dir = 4 }, /turf/simulated/floor/plasteel, /area/ruin/unpowered/syndicate_space_base/cargo) @@ -1476,7 +1492,6 @@ /obj/machinery/light, /obj/machinery/cryopod/offstation, /turf/simulated/floor/plasteel{ - dir = 2; icon_state = "darkblue" }, /area/ruin/unpowered/syndicate_space_base/dormitories) @@ -1488,26 +1503,13 @@ /area/ruin/unpowered/syndicate_space_base/bar) "pA" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4; - level = 1 + dir = 4 }, /obj/effect/spawner/window/reinforced, /turf/simulated/floor/plasteel{ icon_state = "dark" }, /area/ruin/unpowered/syndicate_space_base/engineering) -"pG" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4; - level = 1 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/ruin/unpowered/syndicate_space_base/main) "pI" = ( /obj/structure/table/reinforced, /obj/item/retractor, @@ -1532,7 +1534,6 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; tag = "" }, /obj/machinery/door/firedoor, @@ -1550,7 +1551,6 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/computer/operating, /turf/simulated/floor/plasteel{ - dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)" }, @@ -1573,8 +1573,7 @@ "qN" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 4; - initialize_directions = 11; - level = 1 + initialize_directions = 11 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plasteel{ @@ -1614,7 +1613,6 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; tag = "" }, /turf/simulated/floor/plasteel{ @@ -1627,12 +1625,10 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_y = 0; tag = "" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4; - level = 1 + dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -1666,8 +1662,7 @@ /area/ruin/unpowered/syndicate_space_base/arrivals) "rK" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4; - level = 1 + dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -1716,13 +1711,6 @@ icon_state = "dark" }, /area/ruin/unpowered/syndicate_space_base/arrivals) -"sw" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4; - level = 1 - }, -/turf/simulated/floor/engine, -/area/ruin/unpowered/syndicate_space_base/testlab) "sz" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/navbeacon/invisible{ @@ -1733,7 +1721,6 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; tag = "" }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -1762,14 +1749,12 @@ /area/ruin/unpowered/syndicate_space_base/telecomms) "tf" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4; - level = 1 + dir = 4 }, /obj/structure/cable{ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_y = 0; tag = "" }, /obj/machinery/alarm/syndicate{ @@ -1794,7 +1779,6 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; tag = "" }, /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ @@ -1813,8 +1797,7 @@ dir = 6 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 6; - level = 1 + dir = 6 }, /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -1861,32 +1844,6 @@ icon_state = "dark" }, /area/ruin/unpowered/syndicate_space_base/main) -"un" = ( -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8"; - pixel_y = 0; - tag = "" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4; - level = 1 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/fans/tiny, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/ruin/unpowered/syndicate_space_base/testlab) "uq" = ( /turf/simulated/floor/plasteel{ icon_state = "freezerfloor" @@ -1938,7 +1895,6 @@ /area/ruin/unpowered/syndicate_space_base/engineering) "uJ" = ( /turf/simulated/floor/plasteel{ - dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)" }, @@ -1964,13 +1920,11 @@ }, /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 4; - initialize_directions = 11; - level = 1 + initialize_directions = 11 }, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 1; - initialize_directions = 11; - level = 1 + initialize_directions = 11 }, /turf/simulated/floor/engine, /area/ruin/unpowered/syndicate_space_base/testlab) @@ -1980,7 +1934,6 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_y = 0; tag = "" }, /obj/machinery/door/firedoor, @@ -2005,7 +1958,6 @@ "vk" = ( /obj/machinery/kitchen_machine/grill, /turf/simulated/floor/plasteel{ - dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)" }, @@ -2029,7 +1981,6 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; tag = "" }, /obj/structure/cable{ @@ -2127,8 +2078,7 @@ "wc" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 1; - initialize_directions = 11; - level = 1 + initialize_directions = 11 }, /turf/simulated/floor/plating, /area/ruin/unpowered/syndicate_space_base/engineering) @@ -2164,7 +2114,6 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; tag = "" }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -2233,6 +2182,12 @@ icon_state = "white" }, /area/ruin/unpowered/syndicate_space_base/virology) +"wD" = ( +/obj/machinery/computer/arcade, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered/syndicate_space_base/arrivals) "wJ" = ( /obj/structure/window/plasmareinforced{ dir = 1 @@ -2240,8 +2195,7 @@ /obj/effect/turf_decal/caution/red, /obj/machinery/atmospherics/pipe/manifold/visible{ dir = 4; - initialize_directions = 11; - level = 2 + initialize_directions = 11 }, /obj/machinery/meter, /turf/simulated/floor/plasteel{ @@ -2252,21 +2206,18 @@ /obj/item/kitchen/rollingpin, /obj/structure/table, /turf/simulated/floor/plasteel{ - dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)" }, /area/ruin/unpowered/syndicate_space_base/bar) "wX" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4; - level = 1 + dir = 4 }, /obj/structure/cable{ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_y = 0; tag = "" }, /obj/structure/cable{ @@ -2354,7 +2305,6 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; tag = "" }, /obj/structure/cable{ @@ -2370,14 +2320,12 @@ /area/ruin/unpowered/syndicate_space_base/main) "xN" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4; - level = 1 + dir = 4 }, /obj/structure/cable{ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_y = 0; tag = "" }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -2408,7 +2356,6 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_y = 0; tag = "" }, /turf/simulated/floor/plasteel{ @@ -2420,7 +2367,6 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; tag = "" }, /obj/structure/cable{ @@ -2486,9 +2432,7 @@ }, /area/ruin/unpowered/syndicate_space_base/telecomms) "zs" = ( -/obj/structure/sign/biohazard{ - pixel_y = 0 - }, +/obj/structure/sign/biohazard, /turf/simulated/wall/mineral/plastitanium/nodiagonal, /area/ruin/unpowered/syndicate_space_base/virology) "zG" = ( @@ -2622,8 +2566,7 @@ icon_state = "1-2" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4; - level = 1 + dir = 4 }, /turf/simulated/floor/plating, /area/ruin/unpowered/syndicate_space_base/engineering) @@ -2676,7 +2619,6 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; tag = "" }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -2695,8 +2637,7 @@ /area/ruin/unpowered/syndicate_space_base/main) "Ce" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4; - level = 1 + dir = 4 }, /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -2710,15 +2651,13 @@ /area/ruin/unpowered/syndicate_space_base/arrivals) "Cj" = ( /obj/item/reagent_containers/food/condiment/saltshaker{ - pixel_x = -3; - pixel_y = 0 + pixel_x = -3 }, /obj/item/reagent_containers/food/condiment/peppermill{ pixel_x = 3 }, /obj/structure/table, /turf/simulated/floor/plasteel{ - dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)" }, @@ -2774,7 +2713,6 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; tag = "" }, /obj/machinery/atmospherics/unary/vent_pump/on, @@ -2783,8 +2721,7 @@ "Dp" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 4; - initialize_directions = 11; - level = 1 + initialize_directions = 11 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plasteel{ @@ -2814,7 +2751,6 @@ dir = 8 }, /turf/simulated/floor/plasteel{ - dir = 2; icon_state = "darkblue" }, /area/ruin/unpowered/syndicate_space_base/dormitories) @@ -2826,7 +2762,6 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; tag = "" }, /turf/simulated/floor/plating, @@ -2864,7 +2799,6 @@ /obj/item/clothing/gloves/combat, /obj/machinery/light, /turf/simulated/floor/plasteel{ - dir = 2; icon_state = "darkred" }, /area/ruin/unpowered/syndicate_space_base/cargo) @@ -2878,8 +2812,7 @@ /area/ruin/unpowered/syndicate_space_base/virology) "El" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4; - level = 1 + dir = 4 }, /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -2902,7 +2835,6 @@ dir = 1 }, /obj/structure/cable/yellow{ - d1 = 0; d2 = 2; icon_state = "0-2" }, @@ -2927,7 +2859,6 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; tag = "" }, /obj/machinery/door/firedoor, @@ -2999,7 +2930,6 @@ /area/ruin/unpowered/syndicate_space_base/engineering) "EX" = ( /turf/simulated/floor/plasteel{ - dir = 2; icon_state = "darkbluecorners" }, /area/ruin/unpowered/syndicate_space_base/dormitories) @@ -3041,7 +2971,6 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; tag = "" }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -3060,7 +2989,6 @@ dir = 4 }, /turf/simulated/floor/plasteel{ - dir = 2; icon_state = "darkblue" }, /area/ruin/unpowered/syndicate_space_base/dormitories) @@ -3119,7 +3047,6 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; tag = "" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -3133,12 +3060,10 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; tag = "" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4; - level = 1 + dir = 4 }, /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -3173,7 +3098,6 @@ "Go" = ( /obj/machinery/cooker/deepfryer, /turf/simulated/floor/plasteel{ - dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)" }, @@ -3191,8 +3115,7 @@ /area/ruin/unpowered/syndicate_space_base/dormitories) "GJ" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4; - level = 1 + dir = 4 }, /obj/structure/extinguisher_cabinet{ pixel_x = -5; @@ -3202,7 +3125,6 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_y = 0; tag = "" }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -3227,7 +3149,6 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_y = 0; tag = "" }, /obj/machinery/door/firedoor, @@ -3243,8 +3164,7 @@ /area/ruin/unpowered/syndicate_space_base/engineering) "GY" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4; - level = 1 + dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 10 @@ -3281,7 +3201,6 @@ "HB" = ( /obj/structure/sink{ dir = 8; - icon_state = "sink"; pixel_x = -12; pixel_y = 2 }, @@ -3357,8 +3276,7 @@ /area/ruin/unpowered/syndicate_space_base/bar) "Iv" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4; - level = 1 + dir = 4 }, /turf/simulated/floor/plasteel, /area/ruin/unpowered/syndicate_space_base/cargo) @@ -3377,7 +3295,6 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; tag = "" }, /turf/simulated/floor/plasteel{ @@ -3480,7 +3397,6 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; tag = "" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -3494,7 +3410,6 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_y = 0; tag = "" }, /obj/structure/cable{ @@ -3547,7 +3462,6 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; tag = "" }, /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ @@ -3581,7 +3495,6 @@ /obj/machinery/processor, /obj/structure/table, /turf/simulated/floor/plasteel{ - dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)" }, @@ -3681,7 +3594,6 @@ /obj/item/reagent_containers/food/drinks/shaker, /obj/structure/table, /turf/simulated/floor/plasteel{ - dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)" }, @@ -3706,7 +3618,6 @@ shock_proof = 1 }, /obj/structure/cable/yellow{ - d1 = 0; d2 = 2; icon_state = "0-2" }, @@ -3723,7 +3634,6 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; tag = "" }, /obj/structure/cable{ @@ -3734,8 +3644,7 @@ }, /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 4; - initialize_directions = 11; - level = 1 + initialize_directions = 11 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plasteel{ @@ -3828,14 +3737,12 @@ /area/ruin/unpowered/syndicate_space_base/engineering) "Mi" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4; - level = 1 + dir = 4 }, /obj/structure/cable{ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_y = 0; tag = "" }, /obj/structure/cable{ @@ -3885,7 +3792,6 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; tag = "" }, /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ @@ -3972,7 +3878,6 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_y = 0; tag = "" }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -4002,12 +3907,10 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_y = 0; tag = "" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4; - level = 1 + dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -4019,7 +3922,6 @@ "Ot" = ( /obj/machinery/light, /turf/simulated/floor/plasteel{ - dir = 2; icon_state = "darkred" }, /area/ruin/unpowered/syndicate_space_base/arrivals) @@ -4094,7 +3996,6 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_y = 0; tag = "" }, /turf/simulated/floor/plasteel{ @@ -4137,7 +4038,6 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; tag = "" }, /obj/machinery/door/firedoor, @@ -4151,8 +4051,7 @@ "QO" = ( /obj/machinery/light, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4; - level = 1 + dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -4216,7 +4115,6 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; tag = "" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -4267,7 +4165,6 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; tag = "" }, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ @@ -4321,8 +4218,7 @@ /area/ruin/unpowered/syndicate_space_base/dormitories) "SQ" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4; - level = 1 + dir = 4 }, /turf/simulated/floor/plating, /area/ruin/unpowered/syndicate_space_base/engineering) @@ -4386,8 +4282,7 @@ "Tl" = ( /obj/machinery/atmospherics/pipe/manifold/visible{ dir = 4; - initialize_directions = 11; - level = 2 + initialize_directions = 11 }, /turf/simulated/floor/plating, /area/ruin/unpowered/syndicate_space_base/engineering) @@ -4461,7 +4356,6 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_y = 0; tag = "" }, /obj/machinery/alarm/syndicate{ @@ -4486,8 +4380,7 @@ /area/ruin/unpowered/syndicate_space_base/cargo) "Us" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4; - level = 1 + dir = 4 }, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, /turf/simulated/floor/plasteel{ @@ -4531,7 +4424,6 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; tag = "" }, /obj/effect/turf_decal/stripes/line{ @@ -4602,14 +4494,12 @@ dir = 8 }, /turf/simulated/floor/plasteel{ - dir = 2; icon_state = "darkblue" }, /area/ruin/unpowered/syndicate_space_base/dormitories) "VQ" = ( /obj/machinery/shower{ dir = 8; - icon_state = "shower"; tag = "icon-shower (WEST)" }, /obj/item/soap/syndie, @@ -4625,7 +4515,6 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; tag = "" }, /turf/simulated/floor/plasteel{ @@ -4635,7 +4524,6 @@ "Wi" = ( /obj/machinery/kitchen_machine/candy_maker, /turf/simulated/floor/plasteel{ - dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)" }, @@ -4662,8 +4550,6 @@ /area/ruin/unpowered/syndicate_space_base/engineering) "Wz" = ( /obj/structure/sign/lifestar{ - desc = "The Star of Life, a symbol of Medical Aid."; - icon_state = "lifestar"; name = "Medbay" }, /turf/simulated/wall/mineral/plastitanium/nodiagonal, @@ -4674,7 +4560,6 @@ }, /obj/structure/table, /turf/simulated/floor/plasteel{ - dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)" }, @@ -4714,7 +4599,6 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; tag = "" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -4763,7 +4647,6 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; tag = "" }, /turf/simulated/floor/plasteel{ @@ -4774,20 +4657,17 @@ /area/ruin/unpowered/syndicate_space_base/chemistry) "Ya" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4; - level = 1 + dir = 4 }, /obj/structure/cable{ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_y = 0; tag = "" }, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 1; - initialize_directions = 11; - level = 1 + initialize_directions = 11 }, /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -4798,7 +4678,6 @@ d1 = 1; d2 = 2; icon_state = "1-2"; - pixel_y = 0; tag = "" }, /obj/machinery/door/firedoor, @@ -4862,7 +4741,6 @@ d1 = 4; d2 = 8; icon_state = "4-8"; - pixel_y = 0; tag = "" }, /turf/simulated/floor/plating, @@ -4926,6 +4804,13 @@ icon_state = "dark" }, /area/ruin/unpowered/syndicate_space_base/main) +"ZG" = ( +/obj/machinery/computer/security/telescreen{ + name = "Test Lab Monitor"; + network = list("SyndicateTestLab") + }, +/turf/simulated/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_space_base/testlab) "ZR" = ( /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -6761,7 +6646,7 @@ El uk uk yz -pG +ZB uk uk uk @@ -6837,8 +6722,8 @@ TD TD rr CM -TD -TD +ZG +ab TD CM ZR @@ -6897,13 +6782,13 @@ ia ia ia TD -un +aa TD ia ia ia TD -mE +ac TD AV AV @@ -7022,7 +6907,7 @@ fH fH RC uN -ol +ad RF RF dH @@ -7082,7 +6967,7 @@ TD Rn Vl Vl -sw +Ri Vc Vl Vl @@ -7144,7 +7029,7 @@ TD Vl Vl Vl -sw +Ri Vc Vl Vl @@ -7206,7 +7091,7 @@ TD Vl Vl Vl -sw +Ri Vc Vl Vl @@ -7268,7 +7153,7 @@ TD Vl Vl Vl -sw +Ri Vc Vl Vl @@ -7376,7 +7261,7 @@ yZ qF qF Em -ss +wD WG WG aj @@ -7952,7 +7837,7 @@ qv Vl Vl Vl -Vl +ae Vl Vl Vl diff --git a/_maps/map_files/generic/centcomm.dmm b/_maps/map_files/generic/centcomm.dmm index c03b3cdd09c..9bb63d73f29 100644 --- a/_maps/map_files/generic/centcomm.dmm +++ b/_maps/map_files/generic/centcomm.dmm @@ -25,8 +25,7 @@ /area/syndicate_mothership) "ai" = ( /obj/item/radio/intercom/syndicate{ - pixel_x = 32; - pixel_y = 0 + pixel_x = 32 }, /turf/simulated/floor/plasteel/dark, /area/syndicate_mothership) @@ -35,7 +34,6 @@ /obj/item/clothing/under/dress/dress_saloon, /obj/item/clothing/head/hairflower, /turf/simulated/floor/holofloor{ - dir = 2; icon_state = "cult"; tag = "icon-cult" }, @@ -50,7 +48,6 @@ /obj/effect/landmark/costume/random, /obj/structure/rack/holorack, /turf/simulated/floor/holofloor{ - dir = 2; icon_state = "cult"; tag = "icon-cult" }, @@ -68,7 +65,6 @@ /obj/structure/chair/stool/holostool, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/holofloor{ - dir = 2; icon_state = "asteroid"; tag = "icon-asteroid" }, @@ -85,7 +81,6 @@ /area/space) "ar" = ( /turf/simulated/floor/holofloor{ - dir = 2; icon = 'icons/turf/floors/plating.dmi'; icon_state = "asteroid"; tag = "icon-asteroid" @@ -109,7 +104,6 @@ /obj/structure/table/holotable/wood, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/holofloor{ - dir = 2; icon_state = "asteroid"; tag = "icon-asteroid" }, @@ -191,7 +185,6 @@ "aL" = ( /obj/structure/flora/ausbushes/fullgrass, /turf/simulated/floor/holofloor{ - dir = 2; icon = 'icons/turf/floors/plating.dmi'; icon_state = "asteroid"; tag = "icon-asteroid" @@ -210,7 +203,6 @@ /area/space) "aO" = ( /turf/simulated/floor/holofloor{ - dir = 2; icon_state = "cult"; tag = "icon-cult" }, @@ -268,7 +260,6 @@ "aX" = ( /obj/structure/flora/ausbushes/sparsegrass, /turf/simulated/floor/holofloor{ - dir = 2; icon = 'icons/turf/floors/plating.dmi'; icon_state = "asteroid"; tag = "icon-asteroid" @@ -277,7 +268,6 @@ "aY" = ( /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/holofloor{ - dir = 2; icon_state = "asteroid"; tag = "icon-asteroid" }, @@ -301,7 +291,6 @@ "bb" = ( /obj/structure/table/holotable/wood, /turf/simulated/floor/holofloor{ - dir = 2; icon_state = "grimy"; tag = "icon-grimy" }, @@ -316,7 +305,6 @@ /area/holodeck/source_meetinghall) "bd" = ( /turf/simulated/floor/holofloor{ - dir = 2; icon = 'icons/turf/floors/plating.dmi'; icon_state = "asteroid7"; tag = "icon-asteroid7" @@ -516,7 +504,6 @@ /area/space) "bX" = ( /turf/simulated/floor/holofloor{ - dir = 2; icon_state = "green" }, /area/holodeck/source_emptycourt) @@ -570,7 +557,6 @@ /area/holodeck/source_snowfield) "cm" = ( /turf/simulated/floor/holofloor{ - dir = 2; icon_state = "grimy"; tag = "icon-grimy" }, @@ -704,8 +690,7 @@ /area/centcom/evac) "cI" = ( /obj/structure/shuttle/engine/propulsion{ - dir = 8; - icon_state = "propulsion" + dir = 8 }, /turf/simulated/floor/plating/airless, /area/shuttle/specops) @@ -763,7 +748,6 @@ "cW" = ( /obj/machinery/light/spot{ dir = 1; - icon_state = "tube1"; tag = "icon-tube1 (NORTH)" }, /turf/simulated/floor/plasteel/dark, @@ -773,7 +757,6 @@ /obj/machinery/kitchen_machine/microwave/upgraded, /obj/machinery/light/spot{ dir = 1; - icon_state = "tube1"; tag = "icon-tube1 (NORTH)" }, /turf/simulated/floor/plasteel/freezer, @@ -833,7 +816,6 @@ /obj/item/camera, /obj/machinery/light/spot{ dir = 1; - icon_state = "tube1"; tag = "icon-tube1 (NORTH)" }, /turf/simulated/floor/plasteel{ @@ -855,7 +837,6 @@ "di" = ( /obj/machinery/light/spot{ dir = 1; - icon_state = "tube1"; tag = "icon-tube1 (NORTH)" }, /turf/simulated/floor/beach/away/sand, @@ -880,14 +861,12 @@ id_tag = "vox_southeast_lock"; locked = 1; req_access_txt = "152"; - req_one_access = null; - req_one_access_txt = "0" + req_one_access = null }, /turf/simulated/floor/plating/nitrogen, /area/shuttle/vox) "dp" = ( /turf/simulated/floor/holofloor{ - dir = 2; icon_state = "red" }, /area/holodeck/source_basketball) @@ -1027,16 +1006,13 @@ "dQ" = ( /obj/machinery/light/spot{ dir = 1; - icon_state = "tube1"; tag = "icon-tube1 (NORTH)" }, /turf/simulated/floor/plasteel/grimy, /area/ninja/outpost) "dR" = ( /obj/structure/table, -/obj/machinery/recharger{ - pixel_y = 0 - }, +/obj/machinery/recharger, /turf/simulated/floor/plasteel/freezer, /area/ninja/holding) "dS" = ( @@ -1131,7 +1107,6 @@ /area/syndicate_mothership) "el" = ( /turf/simulated/floor/holofloor{ - dir = 2; icon_state = "green" }, /area/holodeck/source_basketball) @@ -1166,15 +1141,6 @@ icon_state = "cafeteria" }, /area/ninja/holding) -"eq" = ( -/obj/machinery/light{ - dir = 4; - icon_state = "tube1" - }, -/turf/simulated/floor/plasteel{ - icon_state = "bar" - }, -/area/syndicate_mothership) "eu" = ( /obj/structure/chair/stool, /obj/machinery/computer/security/telescreen{ @@ -1237,8 +1203,7 @@ req_access_txt = "150" }, /obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 5; - icon_state = "intact" + dir = 5 }, /turf/simulated/floor/mineral/plastitanium/red, /area/shuttle/syndicate) @@ -1252,14 +1217,12 @@ "eG" = ( /obj/structure/shuttle/engine/propulsion{ dir = 1; - icon_state = "propulsion"; tag = "icon-propulsion (NORTH)" }, /turf/simulated/floor/plating/airless, /area/shuttle/syndicate_elite) "eH" = ( /turf/simulated/floor/holofloor{ - dir = 2; icon_state = "green" }, /area/holodeck/source_boxingcourt) @@ -1333,7 +1296,6 @@ "eT" = ( /obj/machinery/light/spot{ dir = 1; - icon_state = "tube1"; tag = "icon-tube1 (NORTH)" }, /obj/machinery/computer/syndicate_depot/teleporter, @@ -1369,7 +1331,6 @@ /obj/machinery/door_control{ id = "syndicate_sit_1"; name = "Blast Doors"; - pixel_x = 0; pixel_y = -23; req_access_txt = "150" }, @@ -1409,7 +1370,6 @@ }, /obj/machinery/light/spot{ dir = 8; - icon_state = "tube1"; tag = "icon-tube1 (WEST)" }, /turf/simulated/floor/engine, @@ -1454,7 +1414,7 @@ /turf/simulated/floor/wood, /area/syndicate_mothership) "fe" = ( -/obj/machinery/cryopod/right, +/obj/machinery/cryopod/offstation/right, /turf/simulated/floor/plasteel/dark, /area/centcom/specops) "ff" = ( @@ -1490,7 +1450,7 @@ /turf/simulated/floor/engine/cult, /area/wizard_station) "fl" = ( -/obj/machinery/cryopod, +/obj/machinery/cryopod/offstation, /turf/simulated/floor/plasteel/dark, /area/centcom/specops) "fm" = ( @@ -1512,7 +1472,6 @@ /obj/machinery/vending/magivend, /obj/machinery/light/spot{ dir = 1; - icon_state = "tube1"; tag = "icon-tube1 (NORTH)" }, /turf/simulated/floor/engine/cult, @@ -1566,8 +1525,7 @@ width = 9 }, /obj/machinery/door/airlock/titanium/glass{ - id_tag = "s_docking_airlock"; - req_one_access_txt = "0" + id_tag = "s_docking_airlock" }, /obj/docking_port/stationary{ dir = 8; @@ -1640,8 +1598,6 @@ /area/ninja/holding) "fL" = ( /obj/machinery/computer/cryopod{ - density = 0; - pixel_x = 0; pixel_y = 32 }, /turf/simulated/floor/plasteel, @@ -1696,14 +1652,11 @@ /area/holodeck/source_thunderdomecourt) "fU" = ( /obj/structure/table/wood, -/obj/machinery/recharger{ - pixel_y = 0 - }, +/obj/machinery/recharger, /turf/simulated/floor/engine/cult, /area/wizard_station) "fV" = ( /obj/machinery/power/apc{ - dir = 2; name = "Gamma Armory APC"; pixel_y = -24 }, @@ -1712,15 +1665,13 @@ icon_state = "0-4" }, /obj/structure/sign/securearea{ - pixel_x = -32; - pixel_y = 0 + pixel_x = -32 }, /turf/simulated/floor/mineral/plastitanium/red, /area/shuttle/gamma/space) "fW" = ( /obj/machinery/light/spot{ dir = 8; - icon_state = "tube1"; tag = "icon-tube1 (WEST)" }, /turf/simulated/floor/engine/cult, @@ -1742,7 +1693,6 @@ "ga" = ( /obj/machinery/light/spot{ dir = 8; - icon_state = "tube1"; tag = "icon-tube1 (WEST)" }, /turf/simulated/floor/plasteel/dark, @@ -1750,7 +1700,6 @@ "gb" = ( /obj/machinery/light/spot{ dir = 4; - icon_state = "tube1"; tag = "icon-tube1 (EAST)" }, /turf/simulated/floor/plasteel/dark, @@ -1777,7 +1726,6 @@ "gg" = ( /obj/machinery/light/spot{ dir = 1; - icon_state = "tube1"; tag = "icon-tube1 (NORTH)" }, /turf/simulated/floor/plasteel/dark, @@ -2003,7 +1951,6 @@ /area/space) "hd" = ( /obj/docking_port/stationary/transit{ - dir = 1; dwidth = 1; height = 4; id = "pod1_transit"; @@ -2028,7 +1975,6 @@ /area/syndicate_mothership) "hh" = ( /obj/docking_port/stationary/transit{ - dir = 1; dwidth = 1; height = 4; id = "pod2_transit"; @@ -2040,7 +1986,6 @@ "hi" = ( /obj/docking_port/stationary{ area_type = /area/syndicate_mothership; - dir = 1; dwidth = 11; height = 18; id = "emergency_syndicate"; @@ -2173,8 +2118,7 @@ /area/shuttle/syndicate) "ic" = ( /obj/structure/closet/fireaxecabinet{ - pixel_x = 32; - pixel_y = 0 + pixel_x = 32 }, /obj/machinery/light{ dir = 1; @@ -2188,7 +2132,6 @@ /area/shuttle/escape) "id" = ( /turf/simulated/floor/plasteel{ - dir = 2; icon_state = "browncorner" }, /area/shuttle/escape) @@ -2216,7 +2159,6 @@ /area/syndicate_mothership) "ij" = ( /obj/item/radio/intercom/syndicate{ - pixel_x = 0; pixel_y = 25 }, /obj/item/twohanded/required/kirbyplants, @@ -2315,16 +2257,13 @@ }, /obj/structure/sink{ dir = 4; - icon_state = "sink"; - pixel_x = 11; - pixel_y = 0 + pixel_x = 11 }, /turf/simulated/floor/plasteel/freezer, /area/syndicate_mothership) "iB" = ( /obj/machinery/light{ - dir = 8; - icon_state = "tube1" + dir = 8 }, /turf/simulated/floor/plasteel{ icon_state = "bar" @@ -2562,7 +2501,6 @@ "jq" = ( /obj/machinery/light/spot{ dir = 4; - icon_state = "tube1"; tag = "icon-tube1 (EAST)" }, /obj/structure/closet/syndicate/sst, @@ -2585,7 +2523,6 @@ "jt" = ( /obj/machinery/light/small{ dir = 4; - icon_state = "bulb1"; tag = "icon-bulb1 (EAST)" }, /obj/structure/chair/comfy/shuttle{ @@ -2604,7 +2541,6 @@ "jw" = ( /obj/machinery/light/small{ dir = 8; - icon_state = "bulb1"; tag = "icon-bulb1 (WEST)" }, /obj/structure/chair/comfy/shuttle{ @@ -2701,13 +2637,11 @@ /area/syndicate_mothership) "jH" = ( /obj/machinery/door/window{ - dir = 4; name = "Infirmary"; req_access_txt = "150" }, /obj/machinery/light/spot{ dir = 1; - icon_state = "tube1"; tag = "icon-tube1 (NORTH)" }, /turf/simulated/floor/mineral/plastitanium/red, @@ -2726,7 +2660,6 @@ /area/syndicate_mothership) "jM" = ( /obj/machinery/door/window{ - dir = 4; name = "Uplink Management Control"; req_access_txt = "151" }, @@ -2858,20 +2791,17 @@ /area/shuttle/assault_pod) "kn" = ( /obj/machinery/sleeper/syndie{ - dir = 2; - icon_state = "sleeper_s-open" + dir = 2 }, /turf/simulated/floor/plasteel/dark, /area/syndicate_mothership) "kp" = ( /obj/machinery/light/spot{ dir = 1; - icon_state = "tube1"; tag = "icon-tube1 (NORTH)" }, /obj/machinery/sleeper/syndie{ - dir = 2; - icon_state = "sleeper_s-open" + dir = 2 }, /turf/simulated/floor/plasteel/dark, /area/syndicate_mothership) @@ -2880,8 +2810,7 @@ /area/syndicate_mothership) "ks" = ( /obj/machinery/light{ - dir = 8; - icon_state = "tube1" + dir = 8 }, /turf/simulated/floor/plasteel/dark, /area/syndicate_mothership) @@ -2964,14 +2893,13 @@ /obj/item/storage/fancy/crayons, /obj/machinery/light/spot{ dir = 1; - icon_state = "tube1"; tag = "icon-tube1 (NORTH)" }, /turf/simulated/floor/plasteel/dark, /area/syndicate_mothership) "kL" = ( /obj/structure/table, -/obj/item/gun/energy/ionrifle, +/obj/item/gun/energy/ionrifle/carbine, /turf/simulated/floor/plasteel/dark, /area/syndicate_mothership) "kM" = ( @@ -3040,7 +2968,6 @@ /obj/structure/closet/secure_closet/personal, /obj/machinery/light/spot{ dir = 4; - icon_state = "tube1"; tag = "icon-tube1 (EAST)" }, /turf/simulated/floor/carpet, @@ -3165,7 +3092,6 @@ /obj/structure/reagent_dispensers/beerkeg, /obj/machinery/light/spot{ dir = 1; - icon_state = "tube1"; tag = "icon-tube1 (NORTH)" }, /turf/simulated/floor/plasteel{ @@ -3187,7 +3113,6 @@ "lv" = ( /obj/machinery/light/spot{ dir = 1; - icon_state = "tube1"; tag = "icon-tube1 (NORTH)" }, /turf/simulated/floor/plasteel/freezer, @@ -3247,7 +3172,6 @@ /obj/structure/chair/stool, /obj/machinery/light/spot{ dir = 4; - icon_state = "tube1"; tag = "icon-tube1 (EAST)" }, /turf/simulated/floor/plasteel{ @@ -3381,7 +3305,6 @@ "me" = ( /obj/structure/table, /obj/machinery/processor{ - pixel_x = 0; pixel_y = 10 }, /turf/simulated/floor/plasteel{ @@ -3391,7 +3314,6 @@ "mf" = ( /obj/machinery/camera{ c_tag = "CentComm Special Ops. Mass Drivers"; - dir = 2; network = list("ERT","CentComm") }, /turf/simulated/floor/plasteel/dark{ @@ -3424,7 +3346,6 @@ "mj" = ( /obj/machinery/camera{ c_tag = "CentComm Special Ops. Assault Armor Storage"; - dir = 2; network = list("ERT","CentComm") }, /turf/simulated/floor/plasteel/dark{ @@ -3447,7 +3368,6 @@ /obj/structure/table, /obj/machinery/light/spot{ dir = 4; - icon_state = "tube1"; tag = "icon-tube1 (EAST)" }, /turf/simulated/floor/plasteel{ @@ -3464,7 +3384,6 @@ "mn" = ( /obj/machinery/mass_driver{ dir = 8; - drive_range = 50; id_tag = "ASSAULT3"; name = "gravpult" }, @@ -3552,7 +3471,6 @@ "mB" = ( /obj/machinery/mass_driver{ dir = 8; - drive_range = 50; id_tag = "ASSAULT2"; name = "gravpult" }, @@ -3655,7 +3573,6 @@ /obj/machinery/sleeper/upgraded, /obj/machinery/light/spot{ dir = 4; - icon_state = "tube1"; tag = "icon-tube1 (EAST)" }, /turf/simulated/floor/carpet, @@ -3746,7 +3663,6 @@ "nl" = ( /obj/machinery/mass_driver{ dir = 8; - drive_range = 50; id_tag = "ASSAULT1"; name = "gravpult" }, @@ -3765,8 +3681,7 @@ /area/syndicate_mothership) "nr" = ( /obj/item/radio/intercom/syndicate{ - pixel_x = -32; - pixel_y = 0 + pixel_x = -32 }, /turf/simulated/floor/plasteel/dark, /area/syndicate_mothership) @@ -3795,7 +3710,6 @@ /obj/item/card/id/centcom, /obj/machinery/light/spot{ dir = 4; - icon_state = "tube1"; tag = "icon-tube1 (EAST)" }, /obj/item/door_remote/centcomm, @@ -3950,7 +3864,6 @@ "nN" = ( /obj/machinery/mass_driver{ dir = 8; - drive_range = 50; id_tag = "ASSAULT0"; name = "gravpult" }, @@ -3968,8 +3881,7 @@ /area/centcom/specops) "nP" = ( /obj/machinery/mech_bay_recharge_port/upgraded/unsimulated{ - dir = 8; - icon_state = "recharge_port" + dir = 8 }, /turf/simulated/floor/plasteel/dark, /area/syndicate_mothership) @@ -4043,7 +3955,6 @@ "ol" = ( /obj/machinery/camera{ c_tag = "CentComm Special Ops. Bathroom"; - dir = 2; network = list("ERT","CentComm") }, /obj/structure/table/reinforced, @@ -4088,7 +3999,6 @@ ailock = 1; check_synth = 1; name = "Gamma Turret Control Panel"; - pixel_x = 0; req_access = list(114) }, /turf/simulated/floor/plasteel{ @@ -4111,7 +4021,6 @@ /obj/item/storage/box/cups, /obj/machinery/camera{ c_tag = "CentComm Special Ops. Ready Room North"; - dir = 2; network = list("ERT","CentComm") }, /turf/simulated/floor/plasteel/dark, @@ -4137,7 +4046,6 @@ }, /obj/machinery/camera{ c_tag = "CentComm Special Ops. Starting Room"; - dir = 2; network = list("ERT","CentComm") }, /turf/simulated/floor/plasteel/dark{ @@ -4171,14 +4079,11 @@ /obj/item/gun/projectile/shotgun/automatic/combat, /obj/item/gun/projectile/shotgun/automatic/combat, /obj/machinery/status_display{ - density = 0; layer = 4; - pixel_x = 0; pixel_y = 32 }, /obj/machinery/light/spot{ dir = 8; - icon_state = "tube1"; tag = "icon-tube1 (WEST)" }, /turf/simulated/floor/mineral/plastitanium/red, @@ -4190,7 +4095,6 @@ /obj/item/gun/energy/sniperrifle, /obj/machinery/light/spot{ dir = 4; - icon_state = "tube1"; tag = "icon-tube1 (EAST)" }, /obj/machinery/ai_status_display{ @@ -4360,8 +4264,7 @@ /area/shuttle/escape) "pa" = ( /obj/structure/sign/securearea{ - pixel_x = 32; - pixel_y = 0 + pixel_x = 32 }, /turf/simulated/floor/mineral/plastitanium/red, /area/shuttle/gamma/space) @@ -4468,8 +4371,7 @@ /obj/structure/cable{ d1 = 4; d2 = 8; - icon_state = "4-8"; - pixel_x = 0 + icon_state = "4-8" }, /obj/machinery/mech_bay_recharge_port/upgraded, /turf/simulated/floor/mineral/plastitanium/red, @@ -4482,12 +4384,6 @@ /obj/machinery/computer/mech_bay_power_console, /turf/simulated/floor/mineral/plastitanium/red, /area/shuttle/gamma/space) -"pt" = ( -/obj/machinery/door/airlock/titanium{ - req_access_txt = "0" - }, -/turf/simulated/floor/plating, -/area/shuttle/gamma/space) "pu" = ( /obj/mecha/combat/durand/loaded{ operation_req_access = list(1) @@ -4495,8 +4391,7 @@ /obj/structure/cable{ d1 = 4; d2 = 8; - icon_state = "4-8"; - pixel_x = 0 + icon_state = "4-8" }, /turf/simulated/floor/mineral/plastitanium/red, /area/shuttle/gamma/space) @@ -4554,7 +4449,6 @@ "pK" = ( /obj/machinery/camera{ c_tag = "CentComm Special Ops. Bathroom"; - dir = 2; network = list("ERT","CentComm") }, /turf/simulated/floor/plasteel/freezer, @@ -4562,15 +4456,13 @@ "pL" = ( /obj/machinery/door/airlock/centcom{ name = "Bathroom"; - opacity = 1; - req_access_txt = "0" + opacity = 1 }, /turf/simulated/floor/plasteel/dark, /area/centcom/specops) "pN" = ( /obj/machinery/door_control{ desc = "A remote control switch to block view of the singularity."; - icon_state = "doorctrl0"; id = "GRAVPULTS"; name = "Gravity Catapults"; pixel_x = -6; @@ -4579,7 +4471,6 @@ }, /obj/machinery/door_control{ desc = "A remote control switch to block view of the singularity."; - icon_state = "doorctrl0"; id = "ASSAULT"; name = "Mech Storage"; pixel_x = 6; @@ -4588,7 +4479,6 @@ }, /obj/machinery/door_control{ desc = "A remote control switch to block view of the singularity."; - icon_state = "doorctrl0"; id = "CCTELE"; name = "Teleporter Access"; pixel_x = -6; @@ -4619,8 +4509,7 @@ "pR" = ( /obj/machinery/computer/station_alert, /obj/structure/sign/poster/official/nanotrasen_logo{ - pixel_x = 32; - pixel_y = 0 + pixel_x = 32 }, /turf/simulated/floor/plasteel{ dir = 5; @@ -4646,7 +4535,6 @@ "pW" = ( /obj/machinery/newscaster{ layer = 3.3; - pixel_x = 0; pixel_y = -27 }, /turf/simulated/floor/plasteel/dark, @@ -4654,7 +4542,6 @@ "pX" = ( /obj/machinery/door_control{ desc = "A remote control switch to connect the ready room to the rest of Centcom."; - icon_state = "doorctrl0"; id = "SPECOPS"; name = "Ready Room"; pixel_x = -6; @@ -4663,7 +4550,6 @@ }, /obj/machinery/door_control{ desc = "A remote control switch to block view of the singularity."; - icon_state = "doorctrl0"; id = "specopsoffice"; name = "Privacy Shutters"; pixel_x = 6; @@ -4672,7 +4558,6 @@ }, /obj/machinery/door_control{ desc = "A remote control switch to block view of the singularity."; - icon_state = "doorctrl0"; id = "CCGAMMA"; name = "Gamma Lockdown"; pixel_x = -6; @@ -4694,14 +4579,11 @@ "qb" = ( /obj/structure/sink{ dir = 4; - icon_state = "sink"; - pixel_x = 11; - pixel_y = 0 + pixel_x = 11 }, /obj/structure/mirror{ dir = 4; - pixel_x = 32; - pixel_y = 0 + pixel_x = 32 }, /turf/simulated/floor/plasteel/freezer, /area/centcom/specops) @@ -4779,8 +4661,7 @@ "qu" = ( /obj/machinery/door/airlock/centcom{ name = "Bathroom"; - opacity = 1; - req_access_txt = "0" + opacity = 1 }, /turf/simulated/floor/plasteel/freezer, /area/centcom/specops) @@ -4809,8 +4690,7 @@ "qy" = ( /obj/machinery/door/airlock/centcom{ name = "Unit 4"; - opacity = 1; - req_access_txt = "0" + opacity = 1 }, /turf/simulated/floor/plasteel/freezer, /area/centcom/bathroom) @@ -4841,7 +4721,6 @@ "qC" = ( /obj/machinery/shower{ dir = 4; - icon_state = "shower"; pixel_x = 5; tag = "icon-shower (EAST)" }, @@ -4851,7 +4730,6 @@ "qD" = ( /obj/machinery/shower{ dir = 8; - icon_state = "shower"; pixel_x = -5; tag = "icon-shower (WEST)" }, @@ -4960,7 +4838,6 @@ /obj/structure/table, /obj/machinery/door_control{ desc = "A remote control switch for port-side blast doors."; - icon_state = "doorctrl0"; id = "CentComPort"; name = "Security Doors"; pixel_y = -4; @@ -5015,8 +4892,7 @@ "re" = ( /obj/machinery/door/airlock/centcom{ name = "Unit 3"; - opacity = 1; - req_access_txt = "0" + opacity = 1 }, /turf/simulated/floor/plasteel/freezer, /area/centcom/bathroom) @@ -5051,9 +4927,7 @@ "rl" = ( /obj/structure/sink{ dir = 4; - icon_state = "sink"; - pixel_x = 11; - pixel_y = 0 + pixel_x = 11 }, /obj/structure/mirror{ pixel_x = 32 @@ -5080,8 +4954,7 @@ "ro" = ( /obj/machinery/door/airlock/centcom{ name = "Unit 2"; - opacity = 1; - req_access_txt = "0" + opacity = 1 }, /turf/simulated/floor/plasteel/freezer, /area/centcom/bathroom) @@ -5130,8 +5003,7 @@ "rx" = ( /obj/machinery/door/airlock/centcom{ name = "Bathroom"; - opacity = 1; - req_access_txt = "0" + opacity = 1 }, /turf/simulated/floor/plasteel/freezer, /area/centcom/evac) @@ -5160,8 +5032,7 @@ "rD" = ( /obj/machinery/door/airlock/centcom{ name = "Unit 1"; - opacity = 1; - req_access_txt = "0" + opacity = 1 }, /turf/simulated/floor/plasteel/freezer, /area/centcom/bathroom) @@ -5180,8 +5051,7 @@ icon_state = "door_locked"; id_tag = "emergency_away"; name = "Arrival Airlock"; - req_access = null; - req_access_txt = "0" + req_access = null }, /turf/simulated/floor/plating, /area/centcom/evac) @@ -5195,7 +5065,6 @@ "rJ" = ( /obj/structure/shuttle/engine/propulsion{ dir = 1; - icon_state = "propulsion"; tag = "icon-propulsion (NORTH)" }, /turf/simulated/floor/plating/airless, @@ -5221,7 +5090,6 @@ /area/centcom/evac) "rO" = ( /obj/docking_port/stationary{ - dir = 1; dwidth = 1; height = 4; id = "pod1_away"; @@ -5232,7 +5100,6 @@ /area/space) "rP" = ( /obj/docking_port/stationary{ - dir = 1; dwidth = 1; height = 4; id = "pod2_away"; @@ -5245,7 +5112,6 @@ /obj/structure/window/reinforced, /obj/structure/shuttle/engine/heater{ dir = 1; - icon_state = "heater"; tag = "icon-heater (NORTH)" }, /turf/simulated/floor/plating/airless, @@ -5258,14 +5124,12 @@ desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; - name = "EXTERNAL AIRLOCK"; - pixel_x = 0 + name = "EXTERNAL AIRLOCK" }, /turf/simulated/wall/indestructible/riveted, /area/centcom/evac) "rW" = ( /obj/docking_port/mobile/emergency{ - dir = 4; dwidth = 11; height = 18; width = 29 @@ -5310,8 +5174,7 @@ "sc" = ( /obj/structure/table, /obj/item/storage/firstaid/regular{ - pixel_x = 2; - pixel_y = 0 + pixel_x = 2 }, /obj/item/storage/firstaid/regular{ pixel_x = -2; @@ -5331,18 +5194,14 @@ "sg" = ( /obj/machinery/vending/wallmed{ name = "Emergency NanoMed"; - pixel_x = -30; - pixel_y = 0; - req_access_txt = "0" + pixel_x = -30 }, /turf/simulated/floor/mineral/titanium/blue, /area/centcom/evac) "si" = ( /obj/machinery/vending/wallmed{ name = "Emergency NanoMed"; - pixel_x = 30; - pixel_y = 0; - req_access_txt = "0" + pixel_x = 30 }, /turf/simulated/floor/mineral/titanium/blue, /area/centcom/evac) @@ -5383,8 +5242,7 @@ /area/centcom/evac) "st" = ( /obj/structure/closet/secure_closet/bar{ - req_access = null; - req_access_txt = "0" + req_access = null }, /turf/simulated/floor/wood, /area/centcom/evac) @@ -5400,8 +5258,7 @@ "sx" = ( /obj/machinery/door/airlock/centcom{ name = "Rest Area"; - opacity = 1; - req_access_txt = "0" + opacity = 1 }, /turf/simulated/floor/wood, /area/centcom/evac) @@ -5409,7 +5266,6 @@ /obj/machinery/computer/secure_data, /obj/machinery/light/spot{ dir = 8; - icon_state = "tube1"; tag = "icon-tube1 (WEST)" }, /turf/simulated/floor/mineral/plastitanium/red, @@ -5431,9 +5287,7 @@ /area/centcom/evac) "sC" = ( /obj/machinery/door/window/northright{ - base_state = "right"; dir = 4; - icon_state = "right"; name = "Security Desk"; req_access_txt = "104" }, @@ -5491,8 +5345,7 @@ /area/centcom/evac) "sL" = ( /obj/machinery/door/airlock/hatch{ - name = "Infirmary"; - req_access_txt = "0" + name = "Infirmary" }, /turf/simulated/floor/mineral/titanium/yellow, /area/centcom/evac) @@ -5522,25 +5375,21 @@ desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; - name = "EXTERNAL AIRLOCK"; - pixel_x = 0 + name = "EXTERNAL AIRLOCK" }, /turf/simulated/wall/indestructible/fakeglass, /area/centcom/ferry) "sR" = ( /obj/machinery/door/airlock/centcom{ name = "Medical Treatment Post"; - opacity = 1; - req_access_txt = "0" + opacity = 1 }, /turf/simulated/floor/plasteel, /area/centcom/evac) "sS" = ( /obj/machinery/vending/wallmed{ name = "Emergency NanoMed"; - pixel_x = -30; - pixel_y = 0; - req_access_txt = "0" + pixel_x = -30 }, /turf/simulated/floor/mineral/titanium, /area/centcom/evac) @@ -5552,7 +5401,6 @@ /area/tdome/tdomeobserve) "sU" = ( /obj/structure/table{ - dir = 2; icon_state = "tabledir" }, /obj/item/reagent_containers/food/drinks/cans/cola, @@ -5631,8 +5479,7 @@ "td" = ( /obj/machinery/door/airlock/external{ id_tag = "ferry_away"; - name = "Ferry Airlock"; - req_access_txt = "0" + name = "Ferry Airlock" }, /turf/simulated/floor/plating, /area/centcom/ferry) @@ -5678,9 +5525,7 @@ "tk" = ( /obj/machinery/vending/wallmed{ name = "Emergency NanoMed"; - pixel_x = 30; - pixel_y = 0; - req_access_txt = "0" + pixel_x = 30 }, /obj/machinery/vending/snack, /turf/simulated/floor/mineral/titanium/blue, @@ -5712,8 +5557,7 @@ /area/centcom/evac) "tp" = ( /obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 9; - icon_state = "intact" + dir = 9 }, /turf/simulated/floor/plasteel/white, /area/centcom/evac) @@ -5787,16 +5631,9 @@ /area/centcom/evac) "tx" = ( /obj/structure/table, -/obj/item/reagent_containers/glass/beaker/cryoxadone{ - pixel_x = 0; - pixel_y = 0 - }, -/obj/item/reagent_containers/glass/beaker/cryoxadone{ - pixel_x = 0; - pixel_y = 0 - }, +/obj/item/reagent_containers/glass/beaker/cryoxadone, +/obj/item/reagent_containers/glass/beaker/cryoxadone, /turf/simulated/floor/plasteel{ - dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)" }, @@ -5810,7 +5647,6 @@ name = "Canister: \[O2] (CRYO)" }, /turf/simulated/floor/plasteel{ - dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)" }, @@ -5833,7 +5669,6 @@ /obj/item/storage/firstaid/adv, /obj/item/storage/firstaid/brute, /turf/simulated/floor/plasteel{ - dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)" }, @@ -6051,11 +5886,9 @@ /obj/structure/table, /obj/machinery/door_control{ desc = "A remote control switch for port-side blast doors."; - icon_state = "doorctrl0"; id = "thunderdome"; name = "Main Blast Doors"; pixel_x = -3; - pixel_y = 0; req_access_txt = "104" }, /turf/simulated/floor/plasteel{ @@ -6072,7 +5905,6 @@ /area/tdome/tdomeadmin) "uc" = ( /turf/simulated/floor/plasteel{ - dir = 2; icon_state = "greencorner" }, /area/centcom/control) @@ -6112,10 +5944,8 @@ /obj/structure/table, /obj/machinery/door_control{ desc = "A remote control switch for port-side blast doors."; - icon_state = "doorctrl0"; id = "thunderdomehea"; name = "Ranged Gear"; - pixel_x = 0; pixel_y = 5; req_access_txt = "104" }, @@ -6128,10 +5958,8 @@ /obj/structure/table, /obj/machinery/door_control{ desc = "A remote control switch for port-side blast doors."; - icon_state = "doorctrl0"; id = "thunderdomeaxe"; name = "Specialist Supply"; - pixel_x = 0; pixel_y = 5; req_access_txt = "104" }, @@ -6141,10 +5969,8 @@ /obj/structure/table, /obj/machinery/door_control{ desc = "A remote control switch for port-side blast doors."; - icon_state = "doorctrl0"; id = "thunderdomegen"; name = "General Equiptment"; - pixel_x = 0; pixel_y = 5; req_access_txt = "104" }, @@ -6186,7 +6012,6 @@ "uq" = ( /obj/machinery/camera{ c_tag = "CentComm Special Ops. Bathroom"; - dir = 2; network = list("ERT","CentComm") }, /turf/simulated/floor/plasteel/dark, @@ -6729,15 +6554,13 @@ /area/admin) "vN" = ( /obj/machinery/door/airlock/hatch{ - name = "Clothing Storage"; - req_access_txt = "0" + name = "Clothing Storage" }, /turf/simulated/floor/plasteel, /area/admin) "vO" = ( /obj/machinery/door/airlock/hatch{ - name = "Mecha Room"; - req_access_txt = "0" + name = "Mecha Room" }, /turf/simulated/floor/plasteel, /area/admin) @@ -6787,8 +6610,7 @@ /area/admin) "wc" = ( /obj/machinery/door/airlock/hatch{ - name = "External Airlock"; - req_access_txt = "0" + name = "External Airlock" }, /turf/simulated/floor/plasteel, /area/admin) @@ -6828,8 +6650,7 @@ /area/space) "wl" = ( /obj/machinery/door/airlock/hatch{ - name = "Armory"; - req_access_txt = "0" + name = "Armory" }, /turf/simulated/floor/plasteel, /area/admin) @@ -7037,8 +6858,7 @@ opacity = 0 }, /obj/machinery/door/airlock/hatch{ - name = "Chem Lab"; - req_access_txt = "0" + name = "Chem Lab" }, /turf/simulated/floor/plasteel/freezer, /area/admin) @@ -7089,7 +6909,6 @@ "wM" = ( /obj/structure/mirror{ dir = 4; - pixel_x = 0; pixel_y = -32 }, /turf/simulated/floor/plasteel, @@ -7117,11 +6936,9 @@ /obj/item/gun/energy/pulse/pistol, /obj/machinery/door_control{ desc = "A remote control switch to lock down the admin lab."; - icon_state = "doorctrl0"; id = "ADMINCHEMLOCKDOWN"; name = "Lockdown"; - pixel_y = 24; - req_access_txt = "0" + pixel_y = 24 }, /turf/simulated/floor/carpet, /area/admin) @@ -7248,8 +7065,7 @@ "xl" = ( /obj/structure/table, /obj/machinery/door/window/southleft{ - name = "security checkpoint"; - req_access_txt = "0" + name = "security checkpoint" }, /turf/simulated/floor/carpet, /area/admin) @@ -7301,8 +7117,7 @@ /area/admin) "xr" = ( /obj/machinery/door/airlock/hatch{ - name = "Tool Storage"; - req_access_txt = "0" + name = "Tool Storage" }, /turf/simulated/floor/plasteel/dark, /area/admin) @@ -7371,8 +7186,7 @@ /obj/structure/table, /obj/item/grenade/syndieminibomb{ pixel_x = 4; - pixel_y = 2; - pixel_z = 0 + pixel_y = 2 }, /obj/item/grenade/syndieminibomb{ pixel_x = -1 @@ -7381,9 +7195,7 @@ /area/admin) "xE" = ( /obj/structure/table, -/obj/machinery/recharger{ - pixel_y = 0 - }, +/obj/machinery/recharger, /obj/item/toy/cards/deck/syndicate/black, /turf/simulated/floor/plasteel/dark, /area/admin) @@ -7409,8 +7221,7 @@ }, /obj/machinery/door/airlock/hatch{ desc = "Uh oh."; - name = "Operating Theater"; - req_access_txt = "0" + name = "Operating Theater" }, /turf/simulated/floor/plasteel/freezer, /area/admin) @@ -7426,8 +7237,7 @@ "xO" = ( /obj/machinery/door/airlock/hatch{ desc = "You've heard rumors of the horrors that go on within this lab."; - name = "Laboratory (DANGER!)"; - req_access_txt = "0" + name = "Laboratory (DANGER!)" }, /turf/simulated/floor/plasteel, /area/admin) @@ -7485,10 +7295,7 @@ pixel_x = -3; pixel_y = -3 }, -/obj/item/card/id{ - pixel_x = 0; - pixel_y = 0 - }, +/obj/item/card/id, /obj/item/card/id/admin{ pixel_x = 3; pixel_y = 3 @@ -7531,8 +7338,7 @@ /area/admin) "yl" = ( /obj/machinery/door/airlock/public/glass{ - name = "Computer Hub"; - req_access_txt = "0" + name = "Computer Hub" }, /obj/machinery/door/poddoor{ density = 0; @@ -7553,8 +7359,7 @@ "yn" = ( /obj/machinery/door/airlock/hatch{ desc = "For all your shady business needs"; - name = "Gambling Den"; - req_access_txt = "0" + name = "Gambling Den" }, /turf/simulated/floor/wood, /area/admin) @@ -7585,8 +7390,7 @@ /area/centcom/evac) "yw" = ( /obj/machinery/light{ - dir = 4; - icon_state = "tube1" + dir = 4 }, /turf/simulated/floor/plasteel, /area/trader_station/sol) @@ -7701,11 +7505,8 @@ /obj/structure/table, /obj/machinery/door_control{ desc = "A remote control switch to lock down external access to the admin room."; - icon_state = "doorctrl0"; id = "ADMINLOCKDOWN"; - name = "Lockdown"; - pixel_y = 0; - req_access_txt = "0" + name = "Lockdown" }, /turf/simulated/floor/plasteel, /area/admin) @@ -7716,9 +7517,7 @@ /area/centcom/evac) "yX" = ( /obj/structure/table/reinforced, -/obj/machinery/recharger{ - pixel_y = 0 - }, +/obj/machinery/recharger, /turf/simulated/floor/mineral/plastitanium/red, /area/centcom/evac) "yY" = ( @@ -7750,15 +7549,13 @@ "zd" = ( /obj/machinery/door/airlock/hatch{ desc = "Danger: May contain robustness"; - name = "Dojo"; - req_access_txt = "0" + name = "Dojo" }, /turf/simulated/floor/plasteel/dark, /area/admin) "ze" = ( /obj/machinery/door/airlock/public/glass{ - name = "Shuttle Bay"; - req_access_txt = "0" + name = "Shuttle Bay" }, /turf/simulated/floor/plasteel, /area/admin) @@ -7902,8 +7699,7 @@ id_tag = "vox_northwest_lock"; locked = 1; req_access_txt = "152"; - req_one_access = null; - req_one_access_txt = "0" + req_one_access = null }, /turf/simulated/floor/plating/nitrogen, /area/shuttle/vox) @@ -7933,14 +7729,12 @@ "zM" = ( /obj/machinery/door/window{ dir = 1; - name = "Suit Storage"; - req_access_txt = "0" + name = "Suit Storage" }, /turf/simulated/floor/engine, /area/admin) "zN" = ( /obj/machinery/door/poddoor/shutters{ - dir = 4; id_tag = "commandcenter"; name = "Privacy Shutters" }, @@ -7952,8 +7746,7 @@ /area/centcom/evac) "zP" = ( /obj/machinery/door/airlock{ - name = "Toilet"; - req_access_txt = "0" + name = "Toilet" }, /turf/simulated/floor/plasteel, /area/trader_station/sol) @@ -7978,8 +7771,7 @@ id_tag = "vox_northeast_lock"; locked = 1; req_access_txt = "152"; - req_one_access = null; - req_one_access_txt = "0" + req_one_access = null }, /obj/docking_port/mobile{ dir = 2; @@ -8073,9 +7865,7 @@ }, /obj/structure/sink{ dir = 4; - icon_state = "sink"; - pixel_x = 11; - pixel_y = 0 + pixel_x = 11 }, /turf/simulated/floor/plasteel/freezer, /area/trader_station/sol) @@ -8106,8 +7896,7 @@ /obj/machinery/door/window{ dir = 8; name = "Toilet"; - opacity = 1; - req_access_txt = "0" + opacity = 1 }, /turf/simulated/floor/plasteel/freezer, /area/trader_station/sol) @@ -8118,7 +7907,6 @@ /obj/structure/window/reinforced, /obj/structure/shuttle/engine/heater{ dir = 1; - icon_state = "heater"; tag = "icon-heater (NORTH)" }, /turf/simulated/floor/plating/airless, @@ -8180,8 +7968,7 @@ /area/admin) "AI" = ( /obj/machinery/door/airlock/hatch{ - name = "Teleporter Access"; - req_access_txt = "0" + name = "Teleporter Access" }, /obj/machinery/door/poddoor{ density = 0; @@ -8284,7 +8071,6 @@ "AY" = ( /obj/machinery/light/spot{ dir = 8; - icon_state = "tube1"; tag = "icon-tube1 (WEST)" }, /obj/machinery/pdapainter, @@ -8294,7 +8080,6 @@ /obj/structure/table, /obj/machinery/light/spot{ dir = 4; - icon_state = "tube1"; tag = "icon-tube1 (EAST)" }, /obj/item/storage/backpack/satchel, @@ -8304,7 +8089,6 @@ "Ba" = ( /obj/machinery/light/spot{ dir = 8; - icon_state = "tube1"; tag = "icon-tube1 (WEST)" }, /obj/machinery/vending/tool, @@ -8394,8 +8178,7 @@ /area/syndicate_mothership) "Bt" = ( /obj/structure/chair/comfy/red{ - dir = 1; - icon_state = "comfychair" + dir = 1 }, /obj/effect/landmark{ name = "Syndicate Officer" @@ -8635,7 +8418,6 @@ frequency = 1331; icon_state = "door_locked"; id_tag = "synd_outer"; - locked = 0; name = "Ship External Access"; req_access = null; req_access_txt = "150" @@ -8747,7 +8529,6 @@ "CO" = ( /obj/machinery/door/window{ base_state = "right"; - dir = 4; icon_state = "right"; name = "Equipment Room"; req_access_txt = "150" @@ -8770,7 +8551,6 @@ /obj/item/clothing/gloves/color/latex/nitrile, /obj/item/clothing/mask/breath, /turf/simulated/floor/plasteel{ - dir = 2; icon_state = "cmo" }, /area/shuttle/escape) @@ -8781,8 +8561,7 @@ id_tag = "vox_southwest_lock"; locked = 1; req_access_txt = "152"; - req_one_access = null; - req_one_access_txt = "0" + req_one_access = null }, /turf/simulated/floor/plating/nitrogen, /area/shuttle/vox) @@ -8835,8 +8614,7 @@ req_access_txt = "101" }, /obj/machinery/light{ - dir = 8; - icon_state = "tube1" + dir = 8 }, /turf/simulated/floor/mineral/plastitanium/red, /area/shuttle/administration) @@ -8894,7 +8672,6 @@ frequency = 1441; id_tag = "syndicate_jail_airlock_control"; name = "Syndicate Jail Access Controller"; - pixel_x = 0; pixel_y = 24; req_access_txt = "150"; tag_exterior_door = "syndicate_jail_airlock_external"; @@ -8907,7 +8684,6 @@ dir = 4 }, /turf/simulated/floor/plasteel{ - dir = 2; icon_state = "cmo" }, /area/shuttle/escape) @@ -8929,7 +8705,6 @@ "DP" = ( /obj/machinery/light/spot{ dir = 1; - icon_state = "tube1"; tag = "icon-tube1 (NORTH)" }, /obj/effect/spawner/lootdrop/trade_sol/donksoft, @@ -8990,7 +8765,6 @@ dir = 1 }, /turf/simulated/floor/holofloor{ - dir = 2; icon_state = "green" }, /area/holodeck/source_basketball) @@ -9085,7 +8859,6 @@ "EM" = ( /obj/item/radio/intercom{ dir = 8; - name = "station intercom (General)"; pixel_x = -28 }, /obj/machinery/recharge_station, @@ -9182,7 +8955,6 @@ /area/shuttle/administration) "Fc" = ( /obj/machinery/door/window{ - dir = 4; name = "Equipment Room"; req_access_txt = "150" }, @@ -9271,9 +9043,7 @@ dir = 1 }, /obj/structure/table, -/obj/machinery/recharger{ - pixel_y = 0 - }, +/obj/machinery/recharger, /turf/simulated/floor/mineral/plastitanium/red/nitrogen, /area/shuttle/vox) "Fr" = ( @@ -9309,7 +9079,6 @@ /obj/item/stock_parts/cell/high, /obj/machinery/light/small{ dir = 8; - icon_state = "bulb1"; tag = "icon-bulb1 (WEST)" }, /turf/simulated/floor/plasteel{ @@ -9331,7 +9100,6 @@ "FG" = ( /obj/machinery/light/spot{ dir = 1; - icon_state = "tube1"; tag = "icon-tube1 (NORTH)" }, /turf/simulated/floor/mineral/titanium/blue, @@ -9428,8 +9196,7 @@ master_tag = "synd_airlock"; name = "interior access button"; pixel_x = 25; - pixel_y = 25; - req_access_txt = "0" + pixel_y = 25 }, /turf/simulated/floor/mineral/plastitanium/red, /area/shuttle/syndicate) @@ -9469,12 +9236,10 @@ "GL" = ( /obj/structure/table/reinforced, /obj/machinery/light{ - dir = 8; - icon_state = "tube1" + dir = 8 }, /obj/item/reagent_containers/food/drinks/mug/med, /turf/simulated/floor/plasteel{ - dir = 2; icon_state = "cmo" }, /area/shuttle/escape) @@ -9530,8 +9295,7 @@ dir = 8 }, /obj/machinery/light{ - dir = 4; - icon_state = "tube1" + dir = 4 }, /turf/simulated/floor/plasteel{ dir = 1; @@ -9569,7 +9333,6 @@ /area/shuttle/syndicate) "Hp" = ( /turf/simulated/floor/holofloor{ - dir = 2; icon_state = "rampbottom"; tag = "icon-rampbottom" }, @@ -9644,7 +9407,6 @@ "HN" = ( /obj/machinery/light/spot{ dir = 1; - icon_state = "tube1"; tag = "icon-tube1 (NORTH)" }, /turf/simulated/floor/plasteel/dark, @@ -9687,8 +9449,7 @@ /area/tdome) "Ic" = ( /obj/machinery/light{ - dir = 8; - icon_state = "tube1" + dir = 8 }, /obj/structure/chair/comfy/shuttle{ dir = 4 @@ -9715,8 +9476,7 @@ "Ij" = ( /obj/item/twohanded/required/kirbyplants, /obj/machinery/light{ - dir = 4; - icon_state = "tube1" + dir = 4 }, /turf/simulated/floor/plasteel, /area/shuttle/escape) @@ -9765,7 +9525,6 @@ name = "Bolt Cell Doors"; normaldoorcontrol = 1; pixel_x = 6; - pixel_y = 0; req_access_txt = "150"; specialfunctions = 4 }, @@ -9774,7 +9533,6 @@ name = "Bolt Jail Door"; normaldoorcontrol = 1; pixel_x = -5; - pixel_y = 0; req_access_txt = "150"; specialfunctions = 4 }, @@ -9785,7 +9543,6 @@ dir = 1 }, /turf/simulated/floor/holofloor{ - dir = 2; icon_state = "asteroid7"; tag = "icon-asteroid7" }, @@ -9828,7 +9585,6 @@ /obj/item/clothing/under/color/green, /obj/item/holo/esword/green, /turf/simulated/floor/holofloor{ - dir = 2; icon_state = "green" }, /area/holodeck/source_thunderdomecourt) @@ -9836,8 +9592,7 @@ /obj/structure/table, /obj/item/grenade/syndieminibomb{ pixel_x = 4; - pixel_y = 2; - pixel_z = 0 + pixel_y = 2 }, /obj/item/grenade/syndieminibomb{ pixel_x = -1 @@ -9850,9 +9605,7 @@ }, /obj/structure/sink{ dir = 4; - icon_state = "sink"; - pixel_x = 11; - pixel_y = 0 + pixel_x = 11 }, /turf/simulated/floor/mineral/plastitanium/red, /area/shuttle/syndicate) @@ -9923,7 +9676,6 @@ "Jn" = ( /obj/machinery/light/spot{ dir = 8; - icon_state = "tube1"; tag = "icon-tube1 (WEST)" }, /turf/simulated/floor/mineral/plastitanium/red, @@ -9955,7 +9707,6 @@ /area/shuttle/escape) "Jx" = ( /turf/simulated/floor/plasteel{ - dir = 2; icon_state = "cmo" }, /area/shuttle/escape) @@ -10057,9 +9808,7 @@ /area/vox_station) "Kw" = ( /obj/structure/table, -/obj/machinery/recharger{ - pixel_y = 0 - }, +/obj/machinery/recharger, /turf/simulated/floor/mineral/plastitanium/red, /area/shuttle/syndicate) "Kx" = ( @@ -10069,7 +9818,6 @@ "Ky" = ( /obj/machinery/door/poddoor/shutters{ density = 0; - dir = 4; icon_state = "open"; id_tag = "adminshuttleshutters"; name = "Blast Shutters"; @@ -10102,7 +9850,6 @@ "KF" = ( /obj/item/radio/intercom{ dir = 8; - name = "station intercom (General)"; pixel_x = -28 }, /obj/structure/chair/comfy/shuttle{ @@ -10132,7 +9879,6 @@ "KM" = ( /obj/machinery/light/spot{ dir = 8; - icon_state = "tube1"; tag = "icon-tube1 (WEST)" }, /obj/structure/chair/comfy/shuttle{ @@ -10147,7 +9893,6 @@ }, /obj/machinery/light/spot{ dir = 1; - icon_state = "tube1"; tag = "icon-tube1 (NORTH)" }, /obj/structure/chair/comfy/shuttle, @@ -10228,7 +9973,6 @@ "Li" = ( /obj/machinery/light/spot{ dir = 4; - icon_state = "tube1"; tag = "icon-tube1 (EAST)" }, /turf/simulated/floor/mineral/plastitanium/red, @@ -10236,7 +9980,6 @@ "Lj" = ( /obj/machinery/light/spot{ dir = 8; - icon_state = "tube1"; tag = "icon-tube1 (WEST)" }, /turf/simulated/floor/mineral/plastitanium/red, @@ -10250,7 +9993,6 @@ "Lm" = ( /obj/machinery/door/poddoor/shutters{ density = 0; - dir = 4; icon_state = "open"; id_tag = "voxshutters"; name = "Blast Shutters"; @@ -10303,7 +10045,6 @@ /obj/item/storage/box/handcuffs, /obj/machinery/light/spot{ dir = 8; - icon_state = "tube1"; tag = "icon-tube1 (WEST)" }, /turf/simulated/floor/mineral/plastitanium/red, @@ -10331,7 +10072,6 @@ /obj/item/storage/backpack/medic, /obj/item/storage/belt/medical, /turf/simulated/floor/plasteel{ - dir = 2; icon_state = "cmo" }, /area/shuttle/escape) @@ -10406,7 +10146,6 @@ id = "syndicate_elite"; name = "Blast Doors"; pixel_x = -25; - pixel_y = 0; req_access_txt = "150" }, /obj/machinery/door/poddoor{ @@ -10461,7 +10200,6 @@ "MB" = ( /obj/machinery/light/spot{ dir = 1; - icon_state = "tube1"; tag = "icon-tube1 (NORTH)" }, /turf/simulated/floor/mineral/titanium/blue, @@ -10492,8 +10230,7 @@ "MI" = ( /obj/item/twohanded/required/kirbyplants, /obj/machinery/light{ - dir = 8; - icon_state = "tube1" + dir = 8 }, /turf/simulated/floor/plasteel, /area/shuttle/escape) @@ -10546,7 +10283,6 @@ "Nb" = ( /obj/machinery/light/spot{ dir = 8; - icon_state = "tube1"; tag = "icon-tube1 (WEST)" }, /turf/simulated/floor/mineral/plastitanium/red, @@ -10565,7 +10301,6 @@ /obj/machinery/clonepod/upgraded, /obj/machinery/light/spot{ dir = 1; - icon_state = "tube1"; tag = "icon-tube1 (NORTH)" }, /turf/simulated/floor/mineral/titanium, @@ -10592,7 +10327,6 @@ "Nv" = ( /obj/machinery/light/spot{ dir = 4; - icon_state = "tube1"; tag = "icon-tube1 (EAST)" }, /turf/simulated/floor/plasteel/dark, @@ -10621,8 +10355,7 @@ /area/shuttle/escape) "NB" = ( /obj/machinery/light{ - dir = 4; - icon_state = "tube1" + dir = 4 }, /turf/simulated/floor/plating/nitrogen, /area/shuttle/vox) @@ -10695,8 +10428,7 @@ dir = 4 }, /obj/structure/shuttle/engine/heater{ - dir = 8; - icon_state = "heater" + dir = 8 }, /turf/simulated/floor/plating/airless, /area/shuttle/specops) @@ -10706,7 +10438,6 @@ "NY" = ( /obj/machinery/light/spot{ dir = 1; - icon_state = "tube1"; tag = "icon-tube1 (NORTH)" }, /obj/structure/chair/comfy/shuttle{ @@ -10799,16 +10530,14 @@ "Oy" = ( /obj/machinery/door/airlock/medical/glass{ id_tag = null; - name = "Escape Shuttle Infirmary"; - req_access_txt = "0" + name = "Escape Shuttle Infirmary" }, /obj/effect/decal/warning_stripes/south, /turf/simulated/floor/plasteel, /area/shuttle/escape) "Oz" = ( /obj/machinery/light{ - dir = 8; - icon_state = "tube1" + dir = 8 }, /turf/simulated/floor/plasteel, /area/shuttle/escape) @@ -10902,7 +10631,6 @@ "Pl" = ( /obj/machinery/light/spot{ dir = 8; - icon_state = "tube1"; tag = "icon-tube1 (WEST)" }, /obj/machinery/suit_storage_unit/syndicate/secure, @@ -10938,8 +10666,7 @@ /area/shuttle/administration) "PD" = ( /obj/structure/shuttle/engine/propulsion{ - dir = 8; - icon_state = "propulsion" + dir = 8 }, /turf/simulated/floor/plating/airless, /area/shuttle/trade/sol) @@ -10961,7 +10688,6 @@ /obj/item/tank/internals/nitrogen, /obj/machinery/light/spot{ dir = 4; - icon_state = "tube1"; tag = "icon-tube1 (EAST)" }, /turf/simulated/floor/mineral/plastitanium/red/nitrogen, @@ -11039,7 +10765,6 @@ }, /obj/structure/bed/roller, /turf/simulated/floor/plasteel{ - dir = 2; icon_state = "cmo" }, /area/shuttle/escape) @@ -11127,8 +10852,7 @@ "QD" = ( /obj/machinery/door/airlock/medical/glass{ id_tag = null; - name = "Escape Shuttle Infirmary"; - req_access_txt = "0" + name = "Escape Shuttle Infirmary" }, /turf/simulated/floor/plasteel{ dir = 8; @@ -11150,8 +10874,7 @@ /area/shuttle/escape) "QH" = ( /obj/structure/reagent_dispensers/fueltank/chem{ - pixel_x = -32; - pixel_y = 0 + pixel_x = -32 }, /turf/simulated/floor/plasteel{ dir = 1; @@ -11165,7 +10888,6 @@ "QK" = ( /obj/machinery/light/spot{ dir = 8; - icon_state = "tube1"; tag = "icon-tube1 (WEST)" }, /obj/structure/chair/comfy/shuttle{ @@ -11184,7 +10906,6 @@ /area/syndicate_mothership/jail) "QQ" = ( /turf/simulated/floor/holofloor{ - dir = 2; icon = 'icons/turf/floors/plating.dmi'; icon_state = "asteroid6"; tag = "icon-asteroid6" @@ -11192,7 +10913,6 @@ /area/holodeck/source_desert) "QR" = ( /obj/machinery/atmospherics/unary/vent_pump/high_volume{ - dir = 2; frequency = 1331; id_tag = "synd_pump" }, @@ -11237,7 +10957,6 @@ "Re" = ( /obj/machinery/light/spot{ dir = 8; - icon_state = "tube1"; tag = "icon-tube1 (WEST)" }, /obj/machinery/sleeper/syndie{ @@ -11255,7 +10974,6 @@ /obj/structure/window/reinforced, /obj/structure/shuttle/engine/heater{ dir = 1; - icon_state = "heater"; tag = "icon-heater (NORTH)" }, /turf/simulated/floor/plating/airless, @@ -11281,7 +10999,6 @@ "Rn" = ( /obj/machinery/light/spot{ dir = 4; - icon_state = "tube1"; tag = "icon-tube1 (EAST)" }, /obj/machinery/door_control{ @@ -11289,16 +11006,14 @@ layer = 3; name = "Loading Doors"; pixel_x = 24; - pixel_y = 8; - req_access_txt = "0" + pixel_y = 8 }, /obj/machinery/door_control{ id = "QMLoaddoor"; layer = 3; name = "Loading Doors"; pixel_x = 24; - pixel_y = -8; - req_access_txt = "0" + pixel_y = -8 }, /turf/simulated/floor/mineral/titanium/blue, /area/shuttle/supply) @@ -11351,7 +11066,6 @@ "RF" = ( /obj/structure/shuttle/engine/propulsion{ dir = 1; - icon_state = "propulsion"; tag = "icon-propulsion (NORTH)" }, /turf/simulated/floor/plating/airless, @@ -11438,8 +11152,7 @@ desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; - name = "EXTERNAL AIRLOCK"; - pixel_x = 0 + name = "EXTERNAL AIRLOCK" }, /turf/simulated/wall/mineral/plastitanium, /area/shuttle/syndicate) @@ -11449,7 +11162,6 @@ "Sp" = ( /obj/item/flag/med, /turf/simulated/floor/plasteel{ - dir = 2; icon_state = "cmo" }, /area/shuttle/escape) @@ -11472,9 +11184,7 @@ /turf/simulated/floor/mineral/plastitanium/red/brig, /area/shuttle/escape) "Sv" = ( -/obj/machinery/atmospherics/unary/tank/air{ - dir = 2 - }, +/obj/machinery/atmospherics/unary/tank/air, /turf/simulated/wall/mineral/plastitanium, /area/shuttle/syndicate) "Sy" = ( @@ -11500,7 +11210,6 @@ "SH" = ( /obj/machinery/light/spot{ dir = 8; - icon_state = "tube1"; tag = "icon-tube1 (WEST)" }, /turf/simulated/floor/mineral/titanium/blue, @@ -11542,7 +11251,6 @@ /obj/item/clothing/head/helmet/riot/knight/blue, /obj/item/holo/claymore/blue, /turf/simulated/floor/holofloor{ - dir = 2; icon_state = "blue" }, /area/holodeck/source_knightarena) @@ -11620,8 +11328,7 @@ network = list("SS13","Research Outpost","Mining Outpost","Telecomms") }, /obj/structure/sign/poster/official/nanotrasen_logo{ - pixel_x = -32; - pixel_y = 0 + pixel_x = -32 }, /turf/simulated/floor/plasteel{ dir = 9; @@ -11655,7 +11362,6 @@ "TQ" = ( /obj/structure/holowindow, /turf/simulated/floor/holofloor{ - dir = 2; icon_state = "asteroid7"; tag = "icon-asteroid7" }, @@ -11743,7 +11449,6 @@ /area/shuttle/syndicate) "Uv" = ( /turf/simulated/floor/holofloor{ - dir = 2; icon = 'icons/turf/floors/plating.dmi'; icon_state = "asteroid5"; tag = "icon-asteroid5" @@ -11755,9 +11460,7 @@ /area/shuttle/syndicate) "Uy" = ( /obj/structure/table/holotable, -/obj/machinery/readybutton{ - pixel_y = 0 - }, +/obj/machinery/readybutton, /turf/simulated/floor/holofloor{ dir = 6; icon_state = "green" @@ -11778,7 +11481,6 @@ "UC" = ( /obj/machinery/light/spot{ dir = 8; - icon_state = "tube1"; tag = "icon-tube1 (WEST)" }, /obj/structure/window/reinforced, @@ -11790,7 +11492,6 @@ "UD" = ( /obj/machinery/door/window{ base_state = "right"; - dir = 4; icon_state = "right"; name = "Infirmary"; req_access_txt = "150" @@ -11855,7 +11556,6 @@ "Va" = ( /obj/machinery/camera{ c_tag = "CentComm Special Ops. Shuttle"; - dir = 2; network = list("ERT","CentComm") }, /obj/structure/chair/comfy/shuttle, @@ -11882,7 +11582,6 @@ }, /obj/machinery/light/spot{ dir = 1; - icon_state = "tube1"; tag = "icon-tube1 (NORTH)" }, /turf/simulated/floor/mineral/plastitanium/red, @@ -12027,7 +11726,6 @@ /area/shuttle/syndicate) "VZ" = ( /turf/simulated/floor/holofloor{ - dir = 2; icon_state = "asteroid7"; tag = "icon-asteroid7" }, @@ -12068,7 +11766,6 @@ "Wh" = ( /obj/machinery/door/airlock/command/glass{ name = "Escape Shuttle Cockpit"; - req_access_txt = "0"; req_one_access_txt = "2;19" }, /turf/simulated/floor/plasteel{ @@ -12109,7 +11806,6 @@ "Wp" = ( /obj/machinery/light/spot{ dir = 1; - icon_state = "tube1"; tag = "icon-tube1 (NORTH)" }, /obj/structure/chair/comfy/shuttle, @@ -12150,7 +11846,6 @@ "WL" = ( /obj/machinery/light/spot{ dir = 4; - icon_state = "tube1"; tag = "icon-tube1 (EAST)" }, /obj/structure/chair/comfy/shuttle{ @@ -12197,7 +11892,6 @@ "Xi" = ( /obj/machinery/light/spot{ dir = 1; - icon_state = "tube1"; tag = "icon-tube1 (NORTH)" }, /obj/machinery/door_control{ @@ -12205,16 +11899,14 @@ name = "Blast door control"; pixel_x = -5; pixel_y = 35; - req_access = list(101); - req_access_txt = "0" + req_access = list(101) }, /obj/machinery/door_control{ id = "adminshuttleshutters"; name = "Shutter control"; pixel_x = 5; pixel_y = 35; - req_access = list(101); - req_access_txt = "0" + req_access = list(101) }, /obj/structure/chair/comfy/shuttle{ dir = 4 @@ -12273,7 +11965,6 @@ id = "syndicate_sit_1"; name = "Blast Doors"; pixel_x = -25; - pixel_y = 0; req_access_txt = "150" }, /obj/structure/fans/tiny, @@ -12314,7 +12005,6 @@ "XC" = ( /obj/machinery/light/spot{ dir = 4; - icon_state = "tube1"; tag = "icon-tube1 (EAST)" }, /turf/simulated/floor/mineral/titanium, @@ -12322,7 +12012,6 @@ "XG" = ( /obj/structure/bed/roller, /turf/simulated/floor/plasteel{ - dir = 2; icon_state = "cmo" }, /area/shuttle/escape) @@ -12332,7 +12021,6 @@ "XJ" = ( /obj/machinery/light/spot{ dir = 8; - icon_state = "tube1"; tag = "icon-tube1 (WEST)" }, /obj/machinery/access_button{ @@ -12386,7 +12074,6 @@ /area/shuttle/vox) "Ya" = ( /obj/machinery/atm{ - pixel_x = 0; pixel_y = 32 }, /obj/structure/chair/comfy/shuttle{ @@ -12396,9 +12083,7 @@ /area/shuttle/trade/sol) "Yc" = ( /obj/structure/table/holotable, -/obj/machinery/readybutton{ - pixel_y = 0 - }, +/obj/machinery/readybutton, /turf/simulated/floor/holofloor{ dir = 9; icon_state = "red" @@ -12438,7 +12123,6 @@ "Yl" = ( /obj/machinery/light/spot{ dir = 4; - icon_state = "tube1"; tag = "icon-tube1 (EAST)" }, /turf/simulated/floor/mineral/plastitanium/red, @@ -12544,7 +12228,6 @@ "Za" = ( /obj/structure/shuttle/engine/heater{ dir = 8; - icon_state = "heater"; tag = "icon-heater (WEST)" }, /obj/structure/window/plasmareinforced{ @@ -12575,7 +12258,6 @@ "Zi" = ( /obj/machinery/sleeper, /turf/simulated/floor/plasteel{ - dir = 2; icon_state = "cmo" }, /area/shuttle/escape) @@ -12605,7 +12287,6 @@ }, /obj/machinery/light/spot{ dir = 8; - icon_state = "tube1"; tag = "icon-tube1 (WEST)" }, /turf/simulated/floor/plating/nitrogen, @@ -12644,7 +12325,6 @@ }, /obj/machinery/light/spot{ dir = 4; - icon_state = "tube1"; tag = "icon-tube1 (EAST)" }, /turf/simulated/floor/plating/nitrogen, @@ -12661,7 +12341,6 @@ "ZK" = ( /obj/machinery/light/spot{ dir = 8; - icon_state = "tube1"; tag = "icon-tube1 (WEST)" }, /turf/simulated/floor/mineral/plastitanium/red, @@ -26968,7 +26647,7 @@ fm of of of -pt +pn of of of @@ -56466,7 +56145,7 @@ aN Yi ik hn -eq +hD iL ex hn diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index 2558653c510..42afde1f494 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -743,3 +743,11 @@ ///SSalarm signals #define COMSIG_TRIGGERED_ALARM "ssalarm_triggered" #define COMSIG_CANCELLED_ALARM "ssalarm_cancelled" + +// /obj/machinery/door signals +#define COMSIG_DOOR_OPEN "door_open" +#define COMSIG_DOOR_CLOSE "door_close" + +// /obj/machinery/door/airlock signals +#define COMSIG_AIRLOCK_OPEN "airlock_open" +#define COMSIG_AIRLOCK_CLOSE "airlock_close" diff --git a/code/__DEFINES/gamemode.dm b/code/__DEFINES/gamemode.dm index 9aee8f85eba..042fdc6e3e9 100644 --- a/code/__DEFINES/gamemode.dm +++ b/code/__DEFINES/gamemode.dm @@ -32,7 +32,6 @@ #define SPECIAL_ROLE_FREE_GOLEM "Free Golem" #define SPECIAL_ROLE_GOLEM "Golem" #define SPECIAL_ROLE_HEAD_REV "Head Revolutionary" -#define SPECIAL_ROLE_HONKSQUAD "Honksquad" #define SPECIAL_ROLE_REV "Revolutionary" #define SPECIAL_ROLE_MORPH "Morph" #define SPECIAL_ROLE_MULTIVERSE "Multiverse Traveller" diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index a7f14a0ffe1..22ecbc1208e 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -22,8 +22,6 @@ #define iseffect(A) (istype(A, /obj/effect)) -#define is_cleanable(A) (istype(A, /obj/effect/decal/cleanable) || istype(A, /obj/effect/rune)) //if something is cleanable - #define isclothing(A) (istype(A, /obj/item/clothing)) #define is_pen(W) (istype(W, /obj/item/pen)) diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index ad182c9f9c4..3d38b8716b6 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -489,3 +489,8 @@ /// Send to the mentor Discord webhook #define DISCORD_WEBHOOK_MENTOR "MENTOR" + +// Hallucination severities +#define HALLUCINATE_MINOR 1 +#define HALLUCINATE_MODERATE 2 +#define HALLUCINATE_MAJOR 3 diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index a023063ca7f..b714a79a4c5 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -277,6 +277,11 @@ #define HEARING_PROTECTION_MAJOR 2 #define HEARING_PROTECTION_TOTAL 3 +// Defines used in /mob/living/carbon/human/update_health_hud to override the health status +#define HEALTH_HUD_OVERRIDE_NONE 0 +#define HEALTH_HUD_OVERRIDE_CRIT 1 +#define HEALTH_HUD_OVERRIDE_DEAD 2 +#define HEALTH_HUD_OVERRIDE_HEALTHY 3 // Eye protection #define FLASH_PROTECTION_SENSITIVE -1 #define FLASH_PROTECTION_NONE 0 diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm index 85c15c1971c..45c7a5d0f99 100644 --- a/code/__DEFINES/role_preferences.dm +++ b/code/__DEFINES/role_preferences.dm @@ -39,11 +39,16 @@ #define ROLE_ERT "emergency response team" #define ROLE_NYMPH "Dionaea" #define ROLE_GSPIDER "giant spider" +#define ROLE_TSPIDER "terror spider" #define ROLE_DRONE "drone" #define ROLE_DEATHSQUAD "deathsquad" #define ROLE_EVENTMISC "eventmisc" #define ROLE_GHOST "ghost role" +// Misc jobban categories +#define ROLEBAN_AHUD "AntagHUD" +#define ROLEBAN_RECORDS "Records" + //Missing assignment means it's not a gamemode specific role, IT'S NOT A BUG OR ERROR. //The gamemode specific ones are just so the gamemodes can query whether a player is old enough //(in game days played) to play that role diff --git a/code/__DEFINES/rolebans.dm b/code/__DEFINES/rolebans.dm index ad6f1324afa..58670bcbb77 100644 --- a/code/__DEFINES/rolebans.dm +++ b/code/__DEFINES/rolebans.dm @@ -18,6 +18,7 @@ GLOBAL_LIST_INIT(antag_roles, list( ROLE_GUARDIAN, ROLE_MORPH, ROLE_GSPIDER, + ROLE_TSPIDER, )) // Bannable other roles @@ -26,6 +27,6 @@ GLOBAL_LIST_INIT(other_roles, list( ROLE_NYMPH, ROLE_ERT, ROLE_GHOST, - "AntagHUD", - "Records" + ROLEBAN_AHUD, + ROLEBAN_RECORDS )) diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm index 0d7a945ffde..fea2756f664 100644 --- a/code/__HELPERS/_logging.dm +++ b/code/__HELPERS/_logging.dm @@ -140,6 +140,14 @@ GLOBAL_PROTECT(log_end) /proc/log_tgui(text) rustg_log_write(GLOB.tgui_log, "[text][GLOB.log_end]") +#ifdef REFERENCE_TRACKING +/proc/log_gc(text) + rustg_log_write(GLOB.gc_log, "[text][GLOB.log_end]") + for(var/client/C in GLOB.admins) + if(check_rights(R_DEBUG, FALSE, C.mob) && (C.prefs.toggles & PREFTOGGLE_CHAT_DEBUGLOGS)) + to_chat(C, "GC DEBUG: [text]") +#endif + /proc/log_sql(text) rustg_log_write(GLOB.sql_log, "[text][GLOB.log_end]") SEND_TEXT(world.log, text) // Redirect it to DD too diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 63e527b59f2..561ab7ca198 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -308,7 +308,7 @@ if(G.client != null) if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD)) if(!G.client.is_afk(afk_bracket) && (be_special_type in G.client.prefs.be_special)) - if(!override_jobban || (!jobban_isbanned(G, roletext) && !jobban_isbanned(G,"Syndicate"))) + if(!override_jobban || (!jobban_isbanned(G, roletext) && !jobban_isbanned(G, ROLE_SYNDICATE))) if(override_age || player_old_enough_antag(G.client,be_special_type)) candidates += G.client afk_bracket += 600 // Add a minute to the bracket, for every attempt @@ -324,7 +324,7 @@ if(G.client != null) if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD)) if(!G.client.is_afk(afk_bracket) && (be_special_type in G.client.prefs.be_special)) - if(!override_jobban || (!jobban_isbanned(G, roletext) && !jobban_isbanned(G,"Syndicate"))) + if(!override_jobban || (!jobban_isbanned(G, roletext) && !jobban_isbanned(G, ROLE_SYNDICATE))) if(override_age || player_old_enough_antag(G.client,be_special_type)) candidates += G afk_bracket += 600 // Add a minute to the bracket, for every attempt diff --git a/code/__HELPERS/traits.dm b/code/__HELPERS/traits.dm index 4241cee9e9b..a6d288d6af0 100644 --- a/code/__HELPERS/traits.dm +++ b/code/__HELPERS/traits.dm @@ -119,6 +119,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_XENO_HOST "xeno_host" //Tracks whether we're gonna be a baby alien's mummy. #define TRAIT_SHOCKIMMUNE "shock_immunity" #define TRAIT_TESLA_SHOCKIMMUNE "tesla_shock_immunity" +#define TRAIT_TELEKINESIS "telekinesis" #define TRAIT_RESISTHEAT "resist_heat" #define TRAIT_RESISTHEATHANDS "resist_heat_handsonly" //For when you want to be able to touch hot things, but still want fire to be an issue. #define TRAIT_RESISTCOLD "resist_cold" diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 5f95d44efc4..8478d8c0c91 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -31,19 +31,20 @@ return 1 -/proc/Get_Angle(atom/movable/start,atom/movable/end)//For beams. - if(!start || !end) return 0 +/proc/get_angle(atom/movable/start, atom/movable/end)//For beams. + if(!start || !end) + return 0 var/dy var/dx - dy=(32*end.y+end.pixel_y)-(32*start.y+start.pixel_y) - dx=(32*end.x+end.pixel_x)-(32*start.x+start.pixel_x) + dy = (32 * end.y + end.pixel_y) - (32 * start.y + start.pixel_y) + dx = (32 * end.x + end.pixel_x) - (32 * start.x + start.pixel_x) if(!dy) - return (dx>=0)?90:270 - .=arctan(dx/dy) - if(dy<0) - .+=180 - else if(dx<0) - .+=360 + return (dx >= 0) ? 90 : 270 + . = arctan(dx / dy) + if(dy < 0) + . += 180 + else if(dx < 0) + . += 360 //Returns location. Returns null if no location was found. /proc/get_teleport_loc(turf/location,mob/target,distance = 1, density = 0, errorx = 0, errory = 0, eoffsetx = 0, eoffsety = 0) @@ -1246,10 +1247,6 @@ GLOBAL_LIST_INIT(wall_items, typecacheof(list(/obj/machinery/power/apc, /obj/mac return 1 return 0 - -/proc/get_angle(atom/a, atom/b) - return atan2(b.y - a.y, b.x - a.x) - /proc/atan2(x, y) if(!x && !y) return 0 return y >= 0 ? arccos(x / sqrt(x * x + y * y)) : -arccos(x / sqrt(x * x + y * y)) diff --git a/code/_compile_options.dm b/code/_compile_options.dm index 21e3765ddde..f409af92aaa 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -9,13 +9,15 @@ #define UNIT_TESTS #endif -#ifdef TESTING -//#define GC_FAILURE_HARD_LOOKUP //makes paths that fail to GC call find_references before del'ing. - //implies FIND_REF_NO_CHECK_TICK +/***** All toggles for the GC ref finder *****/ -//#define FIND_REF_NO_CHECK_TICK //Sets world.loop_checks to false and prevents find references from sleeping +// #define REFERENCE_TRACKING // Uncomment to enable ref finding -#endif +// #define GC_FAILURE_HARD_LOOKUP //makes paths that fail to GC call find_references before del'ing. + +// #define FIND_REF_NO_CHECK_TICK //Sets world.loop_checks to false and prevents find references from sleeping + +/***** End toggles for the GC ref finder *****/ #define IS_MODE_COMPILED(MODE) (ispath(text2path("/datum/game_mode/"+(MODE)))) diff --git a/code/_globalvars/lists/misc.dm b/code/_globalvars/lists/misc.dm index b5fd84ef6d6..2873a626590 100644 --- a/code/_globalvars/lists/misc.dm +++ b/code/_globalvars/lists/misc.dm @@ -30,7 +30,8 @@ GLOBAL_LIST_INIT(restricted_camera_networks, list( "UO45", "UO45R", "UO71", - "Xeno" + "Xeno", + "SyndicateTestLab" )) //Those networks can only be accessed by preexisting terminals. AIs and new terminals can't use them. GLOBAL_LIST_INIT(ruin_landmarks, list()) diff --git a/code/_globalvars/lists/reagents.dm b/code/_globalvars/lists/reagents.dm index 833da2a9879..0684be758cd 100644 --- a/code/_globalvars/lists/reagents.dm +++ b/code/_globalvars/lists/reagents.dm @@ -40,7 +40,7 @@ GLOBAL_LIST_INIT(drinks, list("beer2","hot_coco","orangejuice","tomatojuice","li "booger","bloodymary","gargleblaster","bravebull","tequilasunrise","toxinsspecial", "beepskysmash","salglu_solution","irishcream","manlydorf","longislandicedtea", "moonshine","b52","irishcoffee","margarita","blackrussian","manhattan", - "manhattan_proj","whiskeysoda","antifreeze","barefoot","snowwhite","demonsblood", + "manhattan_proj","whiskeysoda","adminfreeze","antifreeze","barefoot","snowwhite","demonsblood", "vodkatonic","ginfizz","bahama_mama","singulo","sbiten","devilskiss","red_mead", "mead","iced_beer","grog","aloe","andalusia","alliescocktail","soy_latte", "cafe_latte","acidspit","amasec","neurotoxin","hippiesdelight","bananahonk", diff --git a/code/_globalvars/logging.dm b/code/_globalvars/logging.dm index c111aff28cf..06a4fc52a46 100644 --- a/code/_globalvars/logging.dm +++ b/code/_globalvars/logging.dm @@ -24,6 +24,11 @@ GLOBAL_PROTECT(chat_debug_log) GLOBAL_VAR(round_id) GLOBAL_PROTECT(round_id) +#ifdef REFERENCE_TRACKING +GLOBAL_VAR(gc_log) +GLOBAL_PROTECT(gc_log) +#endif + GLOBAL_LIST_EMPTY(jobMax) GLOBAL_PROTECT(jobMax) GLOBAL_LIST_EMPTY(admin_log) diff --git a/code/_globalvars/misc.dm b/code/_globalvars/misc.dm index 554fa2581a4..40dfb374170 100644 --- a/code/_globalvars/misc.dm +++ b/code/_globalvars/misc.dm @@ -33,44 +33,6 @@ GLOBAL_VAR_INIT(gravity_is_on, 1) //basically unused, just one admin verb.. // Recall time limit: 2 hours GLOBAL_VAR_INIT(recall_time_limit, 72000) //apparently used for the comm console -//////SCORE STUFF -//Goonstyle scoreboard -GLOBAL_VAR_INIT(score_crewscore, 0) // this is the overall var/score for the whole round -GLOBAL_VAR_INIT(score_stuffshipped, 0) // how many useful items have cargo shipped out? -GLOBAL_VAR_INIT(score_stuffharvested, 0) // how many harvests have hydroponics done? -GLOBAL_VAR_INIT(score_oremined, 0) // obvious -GLOBAL_VAR_INIT(score_researchdone, 0) -GLOBAL_VAR_INIT(score_eventsendured, 0) // how many random events did the station survive? -GLOBAL_VAR_INIT(score_powerloss, 0) // how many APCs have poor charge? -GLOBAL_VAR_INIT(score_escapees, 0) // how many people got out alive? -GLOBAL_VAR_INIT(score_deadcrew, 0) // dead bodies on the station, oh no -GLOBAL_VAR_INIT(score_mess, 0) // how much poo, puke, gibs, etc went uncleaned -GLOBAL_VAR_INIT(score_meals, 0) -GLOBAL_VAR_INIT(score_disease, 0) // how many rampant, uncured diseases are on board the station -GLOBAL_VAR_INIT(score_deadcommand, 0) // used during rev, how many command staff perished -GLOBAL_VAR_INIT(score_arrested, 0) // how many traitors/revs/whatever are alive in the brig -GLOBAL_VAR_INIT(score_traitorswon, 0) // how many traitors were successful? -GLOBAL_VAR_INIT(score_allarrested, 0) // did the crew catch all the enemies alive? -GLOBAL_VAR_INIT(score_opkilled, 0) // used during nuke mode, how many operatives died? -GLOBAL_VAR_INIT(score_disc, 0) // is the disc safe and secure? -GLOBAL_VAR_INIT(score_nuked, 0) // was the station blown into little bits? -GLOBAL_VAR_INIT(score_nuked_penalty, 0) //penalty for getting blown to bits - - // these ones are mainly for the stat panel -GLOBAL_VAR_INIT(score_powerbonus, 0) // if all APCs on the station are running optimally, big bonus -GLOBAL_VAR_INIT(score_messbonus, 0) // if there are no messes on the station anywhere, huge bonus -GLOBAL_VAR_INIT(score_deadaipenalty, 0) // is the AI dead? if so, big penalty -GLOBAL_VAR_INIT(score_foodeaten, 0) // nom nom nom -GLOBAL_VAR_INIT(score_clownabuse, 0) // how many times a clown was punched, struck or otherwise maligned -GLOBAL_VAR(score_richestname) // this is all stuff to show who was the richest alive on the shuttle -GLOBAL_VAR(score_richestjob) // kinda pointless if you dont have a money system i guess -GLOBAL_VAR_INIT(score_richestcash, 0) -GLOBAL_VAR(score_richestkey) -GLOBAL_VAR(score_dmgestname) // who had the most damage on the shuttle (but was still alive) -GLOBAL_VAR(score_dmgestjob) -GLOBAL_VAR_INIT(score_dmgestdamage, 0) -GLOBAL_VAR(score_dmgestkey) - #define TAB "    " GLOBAL_VAR_INIT(timezoneOffset, 0) // The difference betwen midnight (of the host computer) and 0 world.ticks. diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm index da0fb3b8fc2..39551da14b6 100644 --- a/code/_globalvars/traits.dm +++ b/code/_globalvars/traits.dm @@ -24,6 +24,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_XENO_HOST" = TRAIT_XENO_HOST, "TRAIT_SHOCKIMMUNE" = TRAIT_SHOCKIMMUNE, "TRAIT_TESLA_SHOCKIMMUNE" = TRAIT_TESLA_SHOCKIMMUNE, + "TRAIT_TELEKINESIS" = TRAIT_TELEKINESIS, "TRAIT_RESISTHEAT" = TRAIT_RESISTHEAT, "TRAIT_RESISTHEATHANDS" = TRAIT_RESISTHEATHANDS, "TRAIT_RESISTCOLD" = TRAIT_RESISTCOLD, diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm index a907a5dfc45..b023aaa4dd0 100644 --- a/code/_onclick/ai.dm +++ b/code/_onclick/ai.dm @@ -215,11 +215,3 @@ if(!ai_control_check(user)) return toggle_light(user) - -// AI-CONTROLLED SLIP GENERATOR IN AI CORE - -/obj/machinery/ai_slipper/AICtrlClick(mob/living/silicon/ai/user) //Turns liquid dispenser on or off - ToggleOn() - -/obj/machinery/ai_slipper/AIAltClick() //Dispenses liquid if on - Activate() diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm index 2bf62cdc5c7..40fcfc82671 100644 --- a/code/_onclick/cyborg.dm +++ b/code/_onclick/cyborg.dm @@ -17,7 +17,7 @@ if(is_ventcrawling(src)) // To stop drones interacting with anything while ventcrawling return - if(stat == DEAD) + if(stat == DEAD || lockcharge || IsWeakened() || stunned || paralysis || low_power_mode) return var/list/modifiers = params2list(params) @@ -169,16 +169,6 @@ /obj/machinery/power/apc/BorgCtrlClick(mob/living/silicon/robot/user) // turns off/on APCs. Forwards to AI code. AICtrlClick(user) - -// AI SLIPPER - -/obj/machinery/ai_slipper/BorgCtrlClick(mob/living/silicon/robot/user) //Turns liquid dispenser on or off - ToggleOn() - -/obj/machinery/ai_slipper/BorgAltClick(mob/living/silicon/robot/user) //Dispenses liquid if on - Activate() - - // TURRETCONTROL /obj/machinery/turretid/BorgCtrlClick(mob/living/silicon/robot/user) //turret control on/off. Forwards to AI code. diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index b2338937ebc..7eed9f0e2ef 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -45,7 +45,7 @@ if(HAS_TRAIT(src, TRAIT_LASEREYES) && a_intent == INTENT_HARM) LaserEyes(A) - if(dna.GetSEState(GLOB.teleblock)) + if(HAS_TRAIT(src, TRAIT_TELEKINESIS)) A.attack_tk(src) if(isturf(A) && get_dist(src, A) <= 1) diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm index 342af86c0b6..5e22e548a99 100644 --- a/code/_onclick/telekinesis.dm +++ b/code/_onclick/telekinesis.dm @@ -39,7 +39,7 @@ /obj/item/attack_tk(mob/user) if(user.stat || !isturf(loc)) return - if(user.dna?.GetSEState(GLOB.teleblock) && !user.get_active_hand()) // both should already be true to get here + if(HAS_TRAIT(user, TRAIT_TELEKINESIS) && !user.get_active_hand()) // both should already be true to get here var/obj/item/tk_grab/O = new(src) O.form_grab(user, src) else @@ -109,7 +109,7 @@ if(!host || host != user) qdel(src) return - if(!host.dna?.GetSEState(GLOB.teleblock)) + if(!HAS_TRAIT(host, TRAIT_TELEKINESIS)) qdel(src) return if(isobj(target) && !isturf(target.loc)) @@ -139,6 +139,12 @@ else + if(focus.buckled_mobs) + to_chat(user, "This object is too heavy to move with something buckled to it!") + return + if(length(focus.client_mobs_in_contents)) + to_chat(user, "This object is too heavy to move with something inside of it!") + return apply_focus_overlay() focus.throw_at(target, 10, 1, user) last_throw = world.time diff --git a/code/controllers/subsystem/chat_pings.dm b/code/controllers/subsystem/chat_pings.dm new file mode 100644 index 00000000000..ad013cab3d6 --- /dev/null +++ b/code/controllers/subsystem/chat_pings.dm @@ -0,0 +1,16 @@ +SUBSYSTEM_DEF(chat_pings) + name = "Chat Pings" + flags = SS_NO_INIT + runlevels = RUNLEVEL_INIT | RUNLEVEL_LOBBY | RUNLEVEL_SETUP | RUNLEVEL_GAME | RUNLEVEL_POSTGAME // ALL OF THEM + wait = 30 SECONDS // Chat pings every 30 seconds + /// List of all held chat datums + var/list/datum/chatOutput/chat_datums = list() // Do NOT put this in Initialize(). You will cause issues. + +/datum/controller/subsystem/chat_pings/fire(resumed) + for(var/datum/chatOutput/CO as anything in chat_datums) + CO.updatePing() + if(MC_TICK_CHECK) + return + +/datum/controller/subsystem/chat_pings/stat_entry() + ..("P: [length(chat_datums)]") diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm index e50c372584a..e66b93b6eda 100644 --- a/code/controllers/subsystem/garbage.dm +++ b/code/controllers/subsystem/garbage.dm @@ -26,8 +26,9 @@ SUBSYSTEM_DEF(garbage) //Queue var/list/queues - #ifdef TESTING + #ifdef REFERENCE_TRACKING var/list/reference_find_on_fail = list() + var/ref_search_stop = FALSE #endif @@ -137,7 +138,7 @@ SUBSYSTEM_DEF(garbage) ++gcedlasttick ++totalgcs pass_counts[level]++ - #ifdef TESTING + #ifdef REFERENCE_TRACKING reference_find_on_fail -= refID //It's deleted we don't care anymore. #endif if(MC_TICK_CHECK) @@ -146,20 +147,27 @@ SUBSYSTEM_DEF(garbage) // Something's still referring to the qdel'd object. fail_counts[level]++ + #ifdef REFERENCE_TRACKING + var/ref_searching = FALSE + #endif switch(level) if(GC_QUEUE_CHECK) - #ifdef TESTING - if(reference_find_on_fail[refID]) - D.find_references() + #ifdef REFERENCE_TRACKING + if(reference_find_on_fail[refID] && !ref_search_stop) + INVOKE_ASYNC(D, /datum/proc/find_references) + ref_searching = TRUE #ifdef GC_FAILURE_HARD_LOOKUP - else - D.find_references() + else if (!ref_search_stop) + INVOKE_ASYNC(D, /datum/proc/find_references) + ref_searching = TRUE #endif reference_find_on_fail -= refID #endif var/type = D.type var/datum/qdel_item/I = items[type] - testing("GC: -- \ref[src] | [type] was unable to be GC'd --") + #ifdef REFERENCE_TRACKING + log_gc("GC: -- \ref[src] | [type] was unable to be GC'd --") + #endif I.failures++ if(GC_QUEUE_HARDDELETE) HardDelete(D) @@ -169,6 +177,11 @@ SUBSYSTEM_DEF(garbage) Queue(D, level + 1) + #ifdef REFERENCE_TRACKING + if(ref_searching) + return + #endif + if(MC_TICK_CHECK) return if(count) @@ -243,10 +256,14 @@ SUBSYSTEM_DEF(garbage) /datum/qdel_item/New(mytype) name = "[mytype]" -#ifdef TESTING -/proc/qdel_and_find_ref_if_fail(datum/D, force = FALSE) - SSgarbage.reference_find_on_fail["\ref[D]"] = TRUE - qdel(D, force) +#ifdef REFERENCE_TRACKING +/proc/qdel_and_find_ref_if_fail(datum/thing_to_del, force = FALSE) + thing_to_del.qdel_and_find_ref_if_fail(force) + +/datum/proc/qdel_and_find_ref_if_fail(force = FALSE) + SSgarbage.reference_find_on_fail["\ref[src]"] = TRUE + qdel(src, force) + #endif // Should be treated as a replacement for the 'del' keyword. @@ -304,38 +321,39 @@ SUBSYSTEM_DEF(garbage) SSgarbage.HardDelete(D) if(QDEL_HINT_FINDREFERENCE)//qdel will, if TESTING is enabled, display all references to this object, then queue the object for deletion. SSgarbage.Queue(D) - #ifdef TESTING + #ifdef REFERENCE_TRACKING D.find_references() #endif if(QDEL_HINT_IFFAIL_FINDREFERENCE) SSgarbage.Queue(D) - #ifdef TESTING + #ifdef REFERENCE_TRACKING SSgarbage.reference_find_on_fail["\ref[D]"] = TRUE #endif else - #ifdef TESTING + #ifdef REFERENCE_TRACKING if(!I.no_hint) - testing("WARNING: [D.type] is not returning a qdel hint. It is being placed in the queue. Further instances of this type will also be queued.") + log_gc("WARNING: [D.type] is not returning a qdel hint. It is being placed in the queue. Further instances of this type will also be queued.") #endif I.no_hint++ SSgarbage.Queue(D) else if(D.gc_destroyed == GC_CURRENTLY_BEING_QDELETED) CRASH("[D.type] destroy proc was called multiple times, likely due to a qdel loop in the Destroy logic") -#ifdef TESTING +#ifdef REFERENCE_TRACKING -/datum/verb/find_refs() +/datum/proc/find_refs() set category = "Debug" set name = "Find References" - set src in world + if(!check_rights(R_DEBUG)) + return find_references(FALSE) /datum/proc/find_references(skip_alert) running_find_references = type if(usr && usr.client) if(usr.client.running_find_references) - testing("CANCELLED search for references to a [usr.client.running_find_references].") + log_gc("CANCELLED search for references to a [usr.client.running_find_references].") usr.client.running_find_references = null running_find_references = null //restart the garbage collector @@ -354,20 +372,27 @@ SUBSYSTEM_DEF(garbage) if(usr && usr.client) usr.client.running_find_references = type - testing("Beginning search for references to a [type].") - last_find_references = world.time + log_gc("Beginning search for references to a [type].") + var/starting_time = world.time - DoSearchVar(GLOB) //globals + DoSearchVar(GLOB, "GLOB") //globals + log_gc("Finished searching globals") for(var/datum/thing in world) //atoms (don't beleive it's lies) - DoSearchVar(thing, "World -> [thing]") + DoSearchVar(thing, "World -> [thing.type]", search_time = starting_time) + + log_gc("Finished searching atoms") for(var/datum/thing) //datums - DoSearchVar(thing, "World -> [thing]") + DoSearchVar(thing, "World -> [thing.type]", search_time = starting_time) + + log_gc("Finished searching datums") for(var/client/thing) //clients - DoSearchVar(thing, "World -> [thing]") + DoSearchVar(thing, "World -> [thing.type]", search_time = starting_time) - testing("Completed search for references to a [type].") + log_gc("Finished searching clients") + + log_gc("Completed search for references to a [type].") if(usr && usr.client) usr.client.running_find_references = null running_find_references = null @@ -376,58 +401,86 @@ SUBSYSTEM_DEF(garbage) SSgarbage.can_fire = 1 SSgarbage.next_fire = world.time + world.tick_lag -/datum/verb/qdel_then_find_references() +/datum/proc/qdel_then_find_references() set category = "Debug" set name = "qdel() then Find References" - set src in world + if(!check_rights(R_DEBUG)) + return - qdel(src, TRUE) //Force. + qdel(src, TRUE) //force a qdel if(!running_find_references) find_references(TRUE) -/datum/verb/qdel_then_if_fail_find_references() +/datum/proc/qdel_then_if_fail_find_references() set category = "Debug" set name = "qdel() then Find References if GC failure" - set src in world + if(!check_rights(R_DEBUG)) + return qdel_and_find_ref_if_fail(src, TRUE) -/datum/proc/DoSearchVar(X, Xname, recursive_limit = 64) - if(usr && usr.client && !usr.client.running_find_references) - return - if(!recursive_limit) +/datum/proc/DoSearchVar(potential_container, container_name, recursive_limit = 64, search_time = world.time) + if((usr?.client && !usr.client.running_find_references) || SSgarbage.ref_search_stop) return - if(istype(X, /datum)) - var/datum/D = X - if(D.last_find_references == last_find_references) + if(!recursive_limit) + log_gc("Recursion limit reached. [container_name]") + return + + //Check each time you go down a layer. This makes it a bit slow, but it won't effect the rest of the game at all + #ifndef FIND_REF_NO_CHECK_TICK + CHECK_TICK + #endif + + if(istype(potential_container, /datum)) + var/datum/datum_container = potential_container + if(datum_container.last_find_references == search_time) return - D.last_find_references = last_find_references - var/list/L = D.vars + datum_container.last_find_references = search_time + var/list/vars_list = datum_container.vars - for(var/varname in L) - if(varname == "vars") + for(var/varname in vars_list) + #ifndef FIND_REF_NO_CHECK_TICK + CHECK_TICK + #endif + if(varname == "vars" || varname == "vis_locs") //Fun fact, vis_locs don't count for references continue - var/variable = L[varname] + var/variable = vars_list[varname] if(variable == src) - testing("Found [src.type] \ref[src] in [D.type]'s [varname] var. [Xname]") + log_gc("Found [type] \ref[src] in [datum_container.type]'s \ref[datum_container] [varname] var. [container_name]") + continue - else if(islist(variable)) - DoSearchVar(variable, "[Xname] -> list", recursive_limit - 1) + if(islist(variable)) + DoSearchVar(variable, "[container_name] \ref[datum_container] -> [varname] (list)", recursive_limit - 1, search_time) - else if(islist(X)) - var/normal = IS_NORMAL_LIST(X) - for(var/I in X) - if(I == src) - testing("Found [src.type] \ref[src] in list [Xname].") + else if(islist(potential_container)) + var/normal = IS_NORMAL_LIST(potential_container) + var/list/potential_cache = potential_container + for(var/element_in_list in potential_cache) + #ifndef FIND_REF_NO_CHECK_TICK + CHECK_TICK + #endif + //Check normal entrys + if(element_in_list == src) + log_gc("Found [type] \ref[src] in list [container_name].") + continue - else if(I && !isnum(I) && normal && X[I] == src) - testing("Found [src.type] \ref[src] in list [Xname]\[[I]\]") - - else if(islist(I)) - DoSearchVar(I, "[Xname] -> list", recursive_limit - 1) + var/assoc_val = null + if(!isnum(element_in_list) && normal) + assoc_val = potential_cache[element_in_list] + //Check assoc entrys + if(assoc_val == src) + log_gc("Found [type] \ref[src] in list [container_name]\[[element_in_list]\]") + continue + //We need to run both of these checks, since our object could be hiding in either of them + //Check normal sublists + if(islist(element_in_list)) + DoSearchVar(element_in_list, "[container_name] -> [element_in_list] (list)", recursive_limit - 1, search_time) + //Check assoc sublists + if(islist(assoc_val)) + DoSearchVar(potential_container[element_in_list], "[container_name]\[[element_in_list]\] -> [assoc_val] (list)", recursive_limit - 1, search_time) #ifndef FIND_REF_NO_CHECK_TICK CHECK_TICK diff --git a/code/controllers/subsystem/ghost_spawns.dm b/code/controllers/subsystem/ghost_spawns.dm index e0234c2616a..96ac8f09116 100644 --- a/code/controllers/subsystem/ghost_spawns.dm +++ b/code/controllers/subsystem/ghost_spawns.dm @@ -164,7 +164,7 @@ SUBSYSTEM_DEF(ghost_spawns) if(!player_old_enough_antag(M.client, role)) return if(role_text) - if(jobban_isbanned(M, role_text) || jobban_isbanned(M, "Syndicate")) + if(jobban_isbanned(M, role_text) || jobban_isbanned(M, ROLE_SYNDICATE)) return if(config.use_exp_restrictions && min_hours) if(M.client.get_exp_type_num(EXP_TYPE_LIVING) < min_hours * 60) diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index e4f5a6d6ecf..c46301713e0 100644 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -61,6 +61,8 @@ SUBSYSTEM_DEF(ticker) var/end_state = "undefined" /// Time the real reboot kicks in var/real_reboot_time = 0 + /// Datum used to generate the end of round scoreboard. + var/datum/scoreboard/score = null /datum/controller/subsystem/ticker/Initialize() login_music = pick(\ @@ -136,6 +138,7 @@ SUBSYSTEM_DEF(ticker) /datum/controller/subsystem/ticker/proc/setup() cultdat = setupcult() + score = new() // Create and announce mode if(GLOB.master_mode == "secret") @@ -482,7 +485,8 @@ SUBSYSTEM_DEF(ticker) if(findtext("[handler]","auto_declare_completion_")) call(mode, handler)() - scoreboard() + // Display the scoreboard window + score.scoreboard() // Declare the completion of the station goals mode.declare_station_goal_completion() diff --git a/code/datums/beam.dm b/code/datums/beam.dm index 3b5c9d2f5fb..23388c3f61b 100644 --- a/code/datums/beam.dm +++ b/code/datums/beam.dm @@ -58,7 +58,7 @@ return ..() /datum/beam/proc/Draw() - var/Angle = round(Get_Angle(origin,target)) + var/Angle = round(get_angle(origin, target)) var/matrix/rot_matrix = matrix() rot_matrix.Turn(Angle) diff --git a/code/datums/cache/crew.dm b/code/datums/cache/crew.dm index 343c975520b..8eba4030d4a 100644 --- a/code/datums/cache/crew.dm +++ b/code/datums/cache/crew.dm @@ -49,6 +49,7 @@ GLOBAL_DATUM_INIT(crew_repository, /datum/repository/crew, new()) if(C.sensor_mode >= SUIT_SENSOR_VITAL) crewmemberData["stat"] = H.stat + crewmemberData["health"] = H.health crewmemberData["oxy"] = round(H.getOxyLoss(), 1) crewmemberData["tox"] = round(H.getToxLoss(), 1) crewmemberData["fire"] = round(H.getFireLoss(), 1) diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index 38b1dd5954d..a79eb2105ae 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -163,7 +163,7 @@ GLOBAL_VAR_INIT(record_id_num, 1001) G.fields["photo"] = get_id_photo(H) G.fields["photo-south"] = "data:image/png;base64,[icon2base64(icon(G.fields["photo"], dir = SOUTH))]" G.fields["photo-west"] = "data:image/png;base64,[icon2base64(icon(G.fields["photo"], dir = WEST))]" - if(H.gen_record && !jobban_isbanned(H, "Records")) + if(H.gen_record && !jobban_isbanned(H, ROLEBAN_RECORDS)) G.fields["notes"] = H.gen_record else G.fields["notes"] = "No notes found." @@ -183,7 +183,7 @@ GLOBAL_VAR_INIT(record_id_num, 1001) M.fields["alg_d"] = "No allergies have been detected in this patient." M.fields["cdi"] = "None" M.fields["cdi_d"] = "No diseases have been diagnosed at the moment." - if(H.med_record && !jobban_isbanned(H, "Records")) + if(H.med_record && !jobban_isbanned(H, ROLEBAN_RECORDS)) M.fields["notes"] = H.med_record else M.fields["notes"] = "No notes found." @@ -199,7 +199,7 @@ GLOBAL_VAR_INIT(record_id_num, 1001) S.fields["ma_crim"] = "None" S.fields["ma_crim_d"] = "No major crime convictions." S.fields["notes"] = "No notes." - if(H.sec_record && !jobban_isbanned(H, "Records")) + if(H.sec_record && !jobban_isbanned(H, ROLEBAN_RECORDS)) S.fields["notes"] = H.sec_record else S.fields["notes"] = "No notes found." diff --git a/code/datums/datum.dm b/code/datums/datum.dm index 8d3ec92cf40..68acd8c8d61 100644 --- a/code/datums/datum.dm +++ b/code/datums/datum.dm @@ -10,7 +10,7 @@ var/var_edited = FALSE //Warranty void if seal is broken var/tmp/unique_datum_id = null -#ifdef TESTING +#ifdef REFERENCE_TRACKING var/running_find_references var/last_find_references = 0 #endif diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index 675b59b965c..503389eb769 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -742,6 +742,24 @@ log_admin("[key_name_admin(usr)] has turned [key_name_admin(H)] into a skeleton") href_list["datumrefresh"] = href_list["make_skeleton"] + else if(href_list["hallucinate"]) + if(!check_rights(R_SERVER | R_EVENT)) + return + + var/mob/living/carbon/C = locateUID(href_list["hallucinate"]) + if(!istype(C)) + to_chat(usr, "This can only be used on instances of type /mob/living/carbon") + return + + var/haltype = input(usr, "Select the hallucination type:", "Hallucinate") as null|anything in subtypesof(/obj/effect/hallucination) + if(!haltype) + return + + C.hallucinate(haltype) + message_admins("[key_name(usr)] has given [key_name(C)] the [haltype] hallucination") + log_admin("[key_name_admin(usr)] has given [key_name_admin(C)] the [haltype] hallucination") + href_list["datumrefresh"] = href_list["hallucinate"] + else if(href_list["offer_control"]) if(!check_rights(R_ADMIN)) return diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm index d099da71bf9..94efb17f630 100644 --- a/code/datums/diseases/_disease.dm +++ b/code/datums/diseases/_disease.dm @@ -50,6 +50,10 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease)) var/stage = 1 var/max_stages = 0 var/stage_prob = 4 + /// The fraction of stages the virus must at least be at to show up on medical HUDs. Rounded up. + var/discovery_threshold = 0.5 + /// If TRUE, this virus will show up on medical HUDs. Automatically set when it reaches mid-stage. + var/discovered = FALSE //Other var/list/viable_mobtypes = list() //typepaths of viable mobs @@ -82,6 +86,9 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease)) if(!cure) if(prob(stage_prob)) stage = min(stage + 1,max_stages) + if(!discovered && stage >= CEILING(max_stages * discovery_threshold, 1)) // Once we reach a late enough stage, medical HUDs can pick us up even if we regress + discovered = TRUE + affected_mob.med_hud_set_status() else if(prob(cure_chance)) stage = max(stage - 1, 1) diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm index fdfafa89314..4098e15e2af 100644 --- a/code/datums/diseases/transformation.dm +++ b/code/datums/diseases/transformation.dm @@ -15,6 +15,7 @@ var/list/stage3 = list("You feel utterly plain.") var/list/stage4 = list("You feel white bread.") var/list/stage5 = list("Oh the humanity!") + var/transformation_text = null var/new_form = /mob/living/carbon/human /datum/disease/transformation/stage_act() @@ -44,6 +45,8 @@ return if(affected_mob.notransform) return + if(transformation_text) + to_chat(affected_mob, transformation_text) affected_mob.notransform = 1 affected_mob.canmove = 0 affected_mob.icon = null @@ -243,4 +246,5 @@ stage3 = list("Your appendages are melting away.", "Your limbs begin to lose their shape.") stage4 = list("You're ravenous.") stage5 = list("You have become a morph.") + transformation_text = "This transformation does NOT make you an antagonist if you were not one already. If you were not an antagonist, you should not eat any steal objectives or the contents of the armory." new_form = /mob/living/simple_animal/hostile/morph diff --git a/code/datums/holocall.dm b/code/datums/holocall.dm index 369c01cce42..04220cc7ce2 100644 --- a/code/datums/holocall.dm +++ b/code/datums/holocall.dm @@ -4,6 +4,7 @@ . = ..() var/obj/machinery/hologram/holopad/H = origin H.move_hologram(eye_user, loc) + ai_detector_visible = FALSE // Holocalls dont trigger the Ai Detector //this datum manages it's own references diff --git a/code/datums/outfits/outfit_admin.dm b/code/datums/outfits/outfit_admin.dm index 16383b05352..c42fb4f2dfe 100644 --- a/code/datums/outfits/outfit_admin.dm +++ b/code/datums/outfits/outfit_admin.dm @@ -84,7 +84,7 @@ shoes = /obj/item/clothing/shoes/magboots/syndie r_pocket = /obj/item/radio/uplink/nuclear l_pocket = /obj/item/pinpointer/advpinpointer - l_hand = /obj/item/tank/jetpack/oxygen/harness + l_hand = /obj/item/tank/internals/oxygen/red backpack_contents = list( /obj/item/storage/box/survival_syndi = 1, @@ -836,7 +836,7 @@ apply_to_card(I, H, get_all_accesses(), "Space Explorer") /datum/outfit/admin/hardsuit - name = "Hardsuit Generic" + name = "Hardsuit - Generic" back = /obj/item/tank/jetpack/oxygen mask = /obj/item/clothing/mask/breath shoes = /obj/item/clothing/shoes/magboots @@ -857,34 +857,34 @@ apply_to_card(I, H, get_all_accesses(), "Hardsuit Tester") /datum/outfit/admin/hardsuit/engineer - name = "Engineer Hardsuit" + name = "Hardsuit - Engineer" suit = /obj/item/clothing/suit/space/hardsuit/engine /datum/outfit/admin/hardsuit/ce - name = "CE Hardsuit" + name = "Hardsuit - CE" suit = /obj/item/clothing/suit/space/hardsuit/engine/elite shoes = /obj/item/clothing/shoes/magboots/advance /datum/outfit/admin/hardsuit/mining - name = "Mining Hardsuit" + name = "Hardsuit - Mining" suit = /obj/item/clothing/suit/space/hardsuit/mining /datum/outfit/admin/hardsuit/syndi - name = "Syndi Hardsuit" + name = "Hardsuit - Syndi" suit = /obj/item/clothing/suit/space/hardsuit/syndi shoes = /obj/item/clothing/shoes/magboots/syndie /datum/outfit/admin/hardsuit/wizard - name = "Wizard Hardsuit" + name = "Hardsuit - Wizard" suit = /obj/item/clothing/suit/space/hardsuit/shielded/wizard shoes = /obj/item/clothing/shoes/magboots /datum/outfit/admin/hardsuit/medical - name = "Medical Hardsuit" + name = "Hardsuit - Medical" suit = /obj/item/clothing/suit/space/hardsuit/medical /datum/outfit/admin/hardsuit/atmos - name = "Atmos Hardsuit" + name = "Hardsuit - Atmos" suit = /obj/item/clothing/suit/space/hardsuit/engine/atmos @@ -1146,20 +1146,20 @@ apply_to_card(I, H, get_all_accesses(), "Wizard") /datum/outfit/admin/wizard/red - name = "Red Wizard" + name = "Wizard - Red Wizard" suit = /obj/item/clothing/suit/wizrobe/red head = /obj/item/clothing/head/wizard/red /datum/outfit/admin/wizard/marisa - name = "Marisa Wizard" + name = "Wizard - Marisa Wizard" suit = /obj/item/clothing/suit/wizrobe/marisa shoes = /obj/item/clothing/shoes/sandal/marisa head = /obj/item/clothing/head/wizard/marisa /datum/outfit/admin/wizard/arch - name = "Arch Wizard" + name = "Wizard - Arch Wizard" suit = /obj/item/clothing/suit/wizrobe/magusred head = /obj/item/clothing/head/wizard/magus @@ -1223,3 +1223,68 @@ var/obj/item/radio/headset/R = H.l_ear if(istype(R)) R.flags |= NODROP + +/datum/outfit/admin/honksquad + name = "Honksquad" + + uniform = /obj/item/clothing/under/rank/clown + mask = /obj/item/clothing/mask/gas/clown_hat + back = /obj/item/storage/backpack/clown + id = /obj/item/card/id/clown + + backpack_contents = list( + /obj/item/storage/box/survival = 1, + /obj/item/bikehorn = 1, + /obj/item/stamp/clown = 1, + /obj/item/toy/crayon/rainbow = 1, + /obj/item/reagent_containers/spray/waterflower = 1, + /obj/item/reagent_containers/food/snacks/grown/banana = 1, + ) + + shoes = /obj/item/clothing/shoes/clown_shoes + suit = /obj/item/clothing/suit/storage/det_suit + pda = /obj/item/pda/clown + l_ear = /obj/item/radio/headset + r_pocket = /obj/item/reagent_containers/food/pill/patch/jestosterone + +/datum/outfit/admin/honksquad/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + . = ..() + if(H.gender == FEMALE) + uniform = /obj/item/clothing/under/rank/clown/sexy + mask = /obj/item/clothing/mask/gas/clown_hat/sexy + + if(prob(50)) + // You have to do it like this to make it work with assoc lists without a runtime. + // Trust me. + backpack_contents.Add(/obj/item/gun/energy/clown) + backpack_contents[/obj/item/gun/energy/clown] = 1 // Amount. Not boolean. Do not TRUE this. You turkey. + else + backpack_contents.Add(/obj/item/gun/throw/piecannon) + backpack_contents[/obj/item/gun/throw/piecannon] = 1 + +/datum/outfit/admin/honksquad/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + . = ..() + if(visualsOnly) + return + + // Setup their clumsy gene + H.dna.SetSEState(GLOB.clumsyblock, TRUE) + H.check_mutations = TRUE + + // Setup their headset + var/obj/item/radio/R = H.l_ear + if(istype(R)) + R.set_frequency(DTH_FREQ) // Clowns can be part of "special operations" + + // And their PDA + var/obj/item/pda/P = H.wear_pda + if(istype(P)) + P.owner = H.real_name + P.ownjob = "Clown" + P.name = "PDA-[H.real_name] ([P.ownjob])" + + // And their ID + var/obj/item/card/id/I = H.wear_id + if(istype(I)) + apply_to_card(I, H, list(ACCESS_CLOWN), "Clown") + H.sec_hud_set_ID() diff --git a/code/datums/outfits/plasmamen.dm b/code/datums/outfits/plasmamen.dm index ed1484852e1..51bbf5a0f2f 100644 --- a/code/datums/outfits/plasmamen.dm +++ b/code/datums/outfits/plasmamen.dm @@ -7,140 +7,140 @@ mask = /obj/item/clothing/mask/breath /datum/outfit/plasmaman/bar - name = "Bartender Plasmaman" + name = "Plasmaman Bartender" head = /obj/item/clothing/head/helmet/space/plasmaman/white uniform = /obj/item/clothing/under/plasmaman/enviroslacks /datum/outfit/plasmaman/chef - name = "Chef Plasmaman" + name = "Plasmaman Chef" head = /obj/item/clothing/head/helmet/space/plasmaman/chef uniform = /obj/item/clothing/under/plasmaman/chef /datum/outfit/plasmaman/botany - name = "Botany Plasmaman" + name = "Plasmaman Botany" head = /obj/item/clothing/head/helmet/space/plasmaman/botany uniform = /obj/item/clothing/under/plasmaman/botany /datum/outfit/plasmaman/librarian - name = "Librarian Plasmaman" + name = "Plasmaman Librarian" head = /obj/item/clothing/head/helmet/space/plasmaman/librarian uniform = /obj/item/clothing/under/plasmaman/librarian /datum/outfit/plasmaman/chaplain - name = "Chaplain Plasmaman" + name = "Plasmaman Chaplain" head = /obj/item/clothing/head/helmet/space/plasmaman/chaplain uniform = /obj/item/clothing/under/plasmaman/chaplain /datum/outfit/plasmaman/janitor - name = "Janitor Plasmaman" + name = "Plasmaman Janitor" head = /obj/item/clothing/head/helmet/space/plasmaman/janitor uniform = /obj/item/clothing/under/plasmaman/janitor /datum/outfit/plasmaman/security - name = "Security Plasmaman" + name = "Plasmaman Security" head = /obj/item/clothing/head/helmet/space/plasmaman/security uniform = /obj/item/clothing/under/plasmaman/security /datum/outfit/plasmaman/detective - name = "Detective Plasmaman" + name = "Plasmaman Detective" head = /obj/item/clothing/head/helmet/space/plasmaman/white uniform = /obj/item/clothing/under/plasmaman/enviroslacks l_ear = /obj/item/radio/headset/headset_sec /datum/outfit/plasmaman/warden - name = "Warden Plasmaman" + name = "Plasmaman Warden" head = /obj/item/clothing/head/helmet/space/plasmaman/security/warden uniform = /obj/item/clothing/under/plasmaman/security/warden /datum/outfit/plasmaman/hos - name = "Head of Security Plasmaman" + name = "Plasmaman Head of Security" head = /obj/item/clothing/head/helmet/space/plasmaman/security/hos uniform = /obj/item/clothing/under/plasmaman/security/hos /datum/outfit/plasmaman/cargo - name = "Cargo Plasmaman" + name = "Plasmaman Cargo" head = /obj/item/clothing/head/helmet/space/plasmaman/cargo uniform = /obj/item/clothing/under/plasmaman/cargo /datum/outfit/plasmaman/mining - name = "Mining Plasmaman" + name = "Plasmaman Mining" head = /obj/item/clothing/head/helmet/space/plasmaman/mining uniform = /obj/item/clothing/under/plasmaman/mining /datum/outfit/plasmaman/medical - name = "Medical Plasmaman" + name = "Plasmaman Medical" head = /obj/item/clothing/head/helmet/space/plasmaman/medical uniform = /obj/item/clothing/under/plasmaman/medical /datum/outfit/plasmaman/cmo - name = "Chief Medical Officer Plasmaman" + name = "Plasmaman Chief Medical Officer" head = /obj/item/clothing/head/helmet/space/plasmaman/cmo uniform = /obj/item/clothing/under/plasmaman/cmo /datum/outfit/plasmaman/viro - name = "Virology Plasmaman" + name = "Plasmaman Virology" head = /obj/item/clothing/head/helmet/space/plasmaman/viro uniform = /obj/item/clothing/under/plasmaman/viro /datum/outfit/plasmaman/chemist - name = "Chemist Plasmaman" + name = "Plasmaman Chemist" head = /obj/item/clothing/head/helmet/space/plasmaman/chemist uniform = /obj/item/clothing/under/plasmaman/chemist /datum/outfit/plasmaman/genetics - name = "Genetics Plasmaman" + name = "Plasmaman Genetics" head = /obj/item/clothing/head/helmet/space/plasmaman/genetics uniform = /obj/item/clothing/under/plasmaman/genetics /datum/outfit/plasmaman/science - name = "Science Plasmaman" + name = "Plasmaman Science" head = /obj/item/clothing/head/helmet/space/plasmaman/science uniform = /obj/item/clothing/under/plasmaman/science /datum/outfit/plasmaman/rd - name = "Research Director Plasmaman" + name = "Plasmaman Research Director" head = /obj/item/clothing/head/helmet/space/plasmaman/rd uniform = /obj/item/clothing/under/plasmaman/rd /datum/outfit/plasmaman/robotics - name = "Robotics Plasmaman" + name = "Plasmaman Robotics" head = /obj/item/clothing/head/helmet/space/plasmaman/robotics uniform = /obj/item/clothing/under/plasmaman/robotics /datum/outfit/plasmaman/engineering - name = "Engineering Plasmaman" + name = "Plasmaman Engineering" head = /obj/item/clothing/head/helmet/space/plasmaman/engineering uniform = /obj/item/clothing/under/plasmaman/engineering /datum/outfit/plasmaman/ce - name = "Chief Engineer Plasmaman" + name = "Plasmaman Chief Engineer" head = /obj/item/clothing/head/helmet/space/plasmaman/engineering/ce uniform = /obj/item/clothing/under/plasmaman/engineering/ce /datum/outfit/plasmaman/atmospherics - name = "Atmospherics Plasmaman" + name = "Plasmaman Atmospherics" head = /obj/item/clothing/head/helmet/space/plasmaman/atmospherics uniform = /obj/item/clothing/under/plasmaman/atmospherics @@ -160,25 +160,25 @@ mask = /obj/item/clothing/mask/gas/clown_hat /datum/outfit/plasmaman/hop - name = "Head of Personnel Plasmaman" + name = "Plasmaman Head of Personnel" head = /obj/item/clothing/head/helmet/space/plasmaman/hop uniform = /obj/item/clothing/under/plasmaman/hop /datum/outfit/plasmaman/captain - name = "Captain Plasmaman" + name = "Plasmaman Captain" head = /obj/item/clothing/head/helmet/space/plasmaman/captain uniform = /obj/item/clothing/under/plasmaman/captain /datum/outfit/plasmaman/blueshield - name = "Blueshield Plasmaman" + name = "Plasmaman Blueshield" head = /obj/item/clothing/head/helmet/space/plasmaman/blueshield uniform = /obj/item/clothing/under/plasmaman/blueshield /datum/outfit/plasmaman/wizard - name = "Wizard Plasmaman" + name = "Plasmaman Wizard" head = /obj/item/clothing/head/helmet/space/plasmaman/wizard uniform = /obj/item/clothing/under/plasmaman/wizard diff --git a/code/datums/spell.dm b/code/datums/spell.dm index db668cd609a..6590876ea2f 100644 --- a/code/datums/spell.dm +++ b/code/datums/spell.dm @@ -503,8 +503,8 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) revert_cast(user) return FALSE - perform(targets, user = user, make_attack_logs = create_logs) remove_ranged_ability(user) + perform(targets, user = user, make_attack_logs = create_logs) return TRUE /* Checks if a target is valid diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index 5ee45d3291f..2bf9f914ad0 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -572,9 +572,10 @@ GLOBAL_LIST_INIT(all_supply_groups, list(SUPPLY_EMERGENCY,SUPPLY_SECURITY,SUPPLY containername = "electrical maintenance crate" /datum/supply_packs/vending/engivend - name = "EngiVend Supply Crate" - cost = 15 - contains = list(/obj/item/vending_refill/engivend) + name = "Engineering Vendor Supply Crate" + cost = 20 + contains = list(/obj/item/vending_refill/engivend, + /obj/item/vending_refill/youtool) containername = "engineering supply crate" /datum/supply_packs/engineering/powergamermitts diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index 9394344a6f3..10ee68c1104 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -1017,6 +1017,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) cost = 11 surplus = 0 cant_discount = TRUE + hijack_only = TRUE /datum/uplink_item/explosives/emp_bomb name = "EMP bomb" @@ -1426,7 +1427,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) name = "Power Sink" desc = "When screwed to wiring attached to an electric grid, then activated, this large device places excessive load on the grid, causing a stationwide blackout. The sink cannot be carried because of its excessive size. Ordering this sends you a small beacon that will teleport the power sink to your location on activation." reference = "PS" - item = /obj/item/powersink + item = /obj/item/radio/beacon/syndicate/power_sink cost = 10 /datum/uplink_item/device_tools/singularity_beacon diff --git a/code/game/atoms.dm b/code/game/atoms.dm index d9cc6ab55c0..fc5e1d8eb5f 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -1072,7 +1072,7 @@ GLOBAL_LIST_EMPTY(blood_splatter_icons) Returning TRUE here will override the above proc's result. */ /atom/proc/CanAStarPassTo(ID, dir, obj/destination) - return TRUE + return FALSE /** Call this when you want to present a renaming prompt to the user. @@ -1139,3 +1139,11 @@ GLOBAL_LIST_EMPTY(blood_splatter_icons) else name = "[prefix][t]" return t + +/atom/proc/set_angle(degrees) + var/matrix/M = matrix() + M.Turn(degrees) + // If we aint 0, make it NN transform + if(degrees) + appearance_flags |= PIXEL_SCALE + transform = M diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index 61097b2c796..10e704fb314 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -90,6 +90,8 @@ /mob/living/carbon/proc/has_virus() for(var/thing in viruses) var/datum/disease/D = thing + if(!D.discovered) // Early-stage viruses should not show up on med HUD (though health analywers can still pick them up) + continue if((!(D.visibility_flags & HIDDEN_SCANNER)) && (D.severity != NONTHREAT)) return TRUE return FALSE diff --git a/code/game/dna/mutations/powers.dm b/code/game/dna/mutations/powers.dm index e8fa3998df3..c0e20372a19 100644 --- a/code/game/dna/mutations/powers.dm +++ b/code/game/dna/mutations/powers.dm @@ -185,6 +185,7 @@ activation_messages = list("You feel smarter.") deactivation_messages = list("You feel dumber.") instability = GENE_INSTABILITY_MAJOR + traits_to_add = list(TRAIT_TELEKINESIS) activation_prob = 15 /datum/mutation/tk/New() diff --git a/code/game/gamemodes/autotraitor/autotraitor.dm b/code/game/gamemodes/autotraitor/autotraitor.dm index 92352f782fd..f0dbb68ec15 100644 --- a/code/game/gamemodes/autotraitor/autotraitor.dm +++ b/code/game/gamemodes/autotraitor/autotraitor.dm @@ -84,7 +84,7 @@ traitorcount += 1 continue if(ishuman(player) || isAI(player)) - if((ROLE_TRAITOR in player.client.prefs.be_special) && !player.client.skip_antag && !jobban_isbanned(player, ROLE_TRAITOR) && !jobban_isbanned(player, "Syndicate")) + if((ROLE_TRAITOR in player.client.prefs.be_special) && !player.client.skip_antag && !jobban_isbanned(player, ROLE_TRAITOR) && !jobban_isbanned(player, ROLE_SYNDICATE)) possible_traitors += player.mind for(var/datum/mind/player in possible_traitors) for(var/job in restricted_jobs) @@ -144,7 +144,7 @@ if(SSshuttle.emergency.mode >= SHUTTLE_ESCAPE) return //message_admins("Late Join Check") - if(character.client && (ROLE_TRAITOR in character.client.prefs.be_special) && !character.client.skip_antag && !jobban_isbanned(character, ROLE_TRAITOR) && !jobban_isbanned(character, "Syndicate")) + if(character.client && (ROLE_TRAITOR in character.client.prefs.be_special) && !character.client.skip_antag && !jobban_isbanned(character, ROLE_TRAITOR) && !jobban_isbanned(character, ROLE_SYNDICATE)) //message_admins("Late Joiner has Be Syndicate") //message_admins("Checking number of players") var/playercount = 0 diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm index ba674aae658..85d776ad662 100644 --- a/code/game/gamemodes/blob/blob.dm +++ b/code/game/gamemodes/blob/blob.dm @@ -57,7 +57,7 @@ GLOBAL_LIST_EMPTY(blob_nodes) /datum/game_mode/blob/proc/get_blob_candidates() var/list/candidates = list() for(var/mob/living/carbon/human/player in GLOB.player_list) - if(!player.stat && player.mind && !player.client.skip_antag && !player.mind.special_role && !jobban_isbanned(player, "Syndicate") && (ROLE_BLOB in player.client.prefs.be_special)) + if(!player.stat && player.mind && !player.client.skip_antag && !player.mind.special_role && !jobban_isbanned(player, ROLE_SYNDICATE) && (ROLE_BLOB in player.client.prefs.be_special)) candidates += player return candidates diff --git a/code/game/gamemodes/changeling/changeling_power.dm b/code/game/gamemodes/changeling/changeling_power.dm index 47f83b4618b..5741447cd58 100644 --- a/code/game/gamemodes/changeling/changeling_power.dm +++ b/code/game/gamemodes/changeling/changeling_power.dm @@ -93,5 +93,7 @@ the same goes for Remove(). if you override Remove(), call parent or else your p /datum/action/changeling/proc/transform_dna(mob/living/carbon/human/H, datum/dna/D) if(!D) return - - H.change_dna(D, TRUE) + var/changesSpecies = TRUE + if (H.dna.species.name == D.species.name) + changesSpecies = FALSE + H.change_dna(D, changesSpecies) diff --git a/code/game/gamemodes/changeling/powers/digitalcamo.dm b/code/game/gamemodes/changeling/powers/digitalcamo.dm index 29385d33636..ddb6a6c03c4 100644 --- a/code/game/gamemodes/changeling/powers/digitalcamo.dm +++ b/code/game/gamemodes/changeling/powers/digitalcamo.dm @@ -1,11 +1,11 @@ /datum/action/changeling/digitalcamo name = "Digital Camouflage" desc = "By evolving the ability to distort our form and proprotions, we defeat common altgorithms used to detect lifeforms on cameras." - helptext = "We cannot be tracked by camera while using this skill. However, humans looking at us will find us... uncanny." + helptext = "We cannot be tracked by camera while using this skill." button_icon_state = "digital_camo" dna_cost = 1 -//Prevents AIs tracking you but makes you easily detectable to the human-eye. +//Prevents AIs tracking you. /datum/action/changeling/digitalcamo/sting_action(mob/user) if(user.digitalcamo) diff --git a/code/game/gamemodes/changeling/powers/mutations.dm b/code/game/gamemodes/changeling/powers/mutations.dm index f0569db3909..792665a52f3 100644 --- a/code/game/gamemodes/changeling/powers/mutations.dm +++ b/code/game/gamemodes/changeling/powers/mutations.dm @@ -243,7 +243,6 @@ damage_type = BRUTE range = 8 hitsound = 'sound/weapons/thudswoosh.ogg' - var/chain var/obj/item/ammo_casing/magic/tentacle/source //the item that shot it /obj/item/projectile/tentacle/New(obj/item/ammo_casing/magic/tentacle/tentacle_casing) diff --git a/code/game/gamemodes/changeling/powers/revive.dm b/code/game/gamemodes/changeling/powers/revive.dm index 8ebe5ba48d8..7c523a09453 100644 --- a/code/game/gamemodes/changeling/powers/revive.dm +++ b/code/game/gamemodes/changeling/powers/revive.dm @@ -7,51 +7,7 @@ //Revive from regenerative stasis /datum/action/changeling/revive/sting_action(mob/living/carbon/user) - user.setToxLoss(0, FALSE) - user.setOxyLoss(0, FALSE) - user.setCloneLoss(0, FALSE) - user.setBrainLoss(0, FALSE) - user.SetParalysis(0, FALSE) - user.SetStunned(0, FALSE) - user.SetWeakened(0, FALSE) - user.radiation = 0 - user.SetEyeBlind(0, FALSE) - user.SetEyeBlurry(0, FALSE) - user.RestoreEars() - user.heal_overall_damage(user.getBruteLoss(), user.getFireLoss(), updating_health = FALSE) - user.cure_blind(null, FALSE) - user.CureDeaf() - user.cure_nearsighted(null, FALSE) - user.reagents.clear_reagents() - user.germ_level = 0 - user.timeofdeath = 0 - if(ishuman(user)) - var/mob/living/carbon/human/H = user - H.restore_blood() - H.next_pain_time = 0 - H.dna.species.create_organs(H) - // Now that recreating all organs is necessary, the rest of this organ stuff probably - // isn't, but I don't want to remove it, just in case. - for(var/organ_name in H.bodyparts_by_name) - var/obj/item/organ/external/O = H.bodyparts_by_name[organ_name] - if(!O) - continue - O.brute_dam = 0 - O.burn_dam = 0 - O.damage_state = "00" - O.germ_level = 0 - QDEL_NULL(O.hidden) - O.open = 0 - O.internal_bleeding = FALSE - O.perma_injury = 0 - O.status = 0 - O.trace_chemicals.Cut() - for(var/obj/item/organ/internal/IO in H.internal_organs) - IO.rejuvenate() - IO.trace_chemicals.Cut() - H.remove_all_embedded_objects() - for(var/datum/disease/critical/C in user.viruses) - C.cure() + user.revive() REMOVE_TRAIT(user, TRAIT_FAKEDEATH, "changeling") user.updatehealth("revive sting") user.update_blind_effects() diff --git a/code/game/gamemodes/cult/blood_magic.dm b/code/game/gamemodes/cult/blood_magic.dm index c1b4f6a98d5..47a979fd108 100644 --- a/code/game/gamemodes/cult/blood_magic.dm +++ b/code/game/gamemodes/cult/blood_magic.dm @@ -848,8 +848,12 @@ uses += max(1, temp) /obj/item/melee/blood_magic/manipulator/attack_self(mob/living/user) - var/list/options = list("Blood Orb (50)", "Blood Recharge (75)", "Blood Spear (150)", "Blood Bolt Barrage (300)") - var/choice = input(user, "Choose a greater blood rite...", "Greater Blood Rites") as null|anything in options + var/list/options = list("Blood Orb (50)" = image(icon = 'icons/obj/cult.dmi', icon_state = "summoning_orb"), + "Blood Recharge (75)" = image(icon = 'icons/mob/actions/actions_cult.dmi', icon_state = "blood_charge"), + "Blood Spear (150)" = image(icon = 'icons/mob/actions/actions_cult.dmi', icon_state = "bloodspear"), + "Blood Bolt Barrage (300)" = image(icon = 'icons/mob/actions/actions_cult.dmi', icon_state = "blood_barrage")) + var/choice = show_radial_menu(user, src, options) + switch(choice) if("Blood Orb (50)") if(uses < BLOOD_ORB_COST) diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index 67a18cbfc45..8c725b41898 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -130,6 +130,9 @@ To draw a rune, use a ritual dagger. visible_message("[src] suddenly appears!") alpha = initial(alpha) +/obj/effect/rune/is_cleanable() + return TRUE + /* There are a few different procs each rune runs through when a cultist activates it. @@ -991,6 +994,9 @@ structure_check() searches for nearby cultist structures required for the invoca /obj/effect/rune/narsie/cult_conceal() //can't hide this, and you wouldn't want to return +/obj/effect/rune/narsie/is_cleanable() //No, you can't just yeet a cleaning grenade to remove it. + return FALSE + /obj/effect/rune/narsie/invoke(list/invokers) if(used) return diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 343f8bf27ae..7fdf66c7a1f 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -238,7 +238,7 @@ // Assemble a list of active players without jobbans. for(var/mob/new_player/player in GLOB.player_list) if(player.client && player.ready && player.has_valid_preferences()) - if(!jobban_isbanned(player, "Syndicate") && !jobban_isbanned(player, roletext)) + if(!jobban_isbanned(player, ROLE_SYNDICATE) && !jobban_isbanned(player, roletext)) if(player_old_enough_antag(player.client,role)) players += player diff --git a/code/game/gamemodes/miniantags/borer/borer.dm b/code/game/gamemodes/miniantags/borer/borer.dm index 0342c1d4707..ea62734f383 100644 --- a/code/game/gamemodes/miniantags/borer/borer.dm +++ b/code/game/gamemodes/miniantags/borer/borer.dm @@ -128,8 +128,8 @@ if(cannotPossess(user)) to_chat(user, "Upon using the antagHUD you forfeited the ability to join the round.") return - if(jobban_isbanned(user, "Syndicate")) - to_chat(user, "You are banned from antagonists!") + if(jobban_isbanned(user, ROLE_SYNDICATE) || jobban_isbanned(user, ROLE_BORER)) + to_chat(user, "You are banned from playing this antagonist!") return if(key) return diff --git a/code/game/gamemodes/miniantags/guardian/types/fire.dm b/code/game/gamemodes/miniantags/guardian/types/fire.dm index bf8a908e979..9f9e12baaa6 100644 --- a/code/game/gamemodes/miniantags/guardian/types/fire.dm +++ b/code/game/gamemodes/miniantags/guardian/types/fire.dm @@ -30,9 +30,8 @@ /mob/living/simple_animal/hostile/guardian/fire/AttackingTarget() . = ..() if(toggle) - if(. && ishuman(target) && !summoner) - spawn(0) - new /obj/effect/hallucination/delusion(target.loc, target, force_kind = "custom", duration = 200, skip_nearby = 0, custom_icon = icon_state, custom_icon_file = icon) + if(. && iscarbon(target)) + new /obj/effect/hallucination/delusion(get_turf(target), target, icon, icon_state) else if(prob(45)) if(ismovable(target)) diff --git a/code/game/gamemodes/miniantags/guardian/types/ranged.dm b/code/game/gamemodes/miniantags/guardian/types/ranged.dm index dab7dfb1eca..184b4e625b5 100644 --- a/code/game/gamemodes/miniantags/guardian/types/ranged.dm +++ b/code/game/gamemodes/miniantags/guardian/types/ranged.dm @@ -10,6 +10,7 @@ melee_damage_lower = 10 melee_damage_upper = 10 damage_transfer = 0.9 + can_strip = TRUE projectiletype = /obj/item/projectile/guardian ranged_cooldown_time = 5 //fast! projectilesound = 'sound/effects/hit_on_shattered_glass.ogg' @@ -35,6 +36,7 @@ alpha = 255 range = 13 incorporeal_move = 0 + can_strip = TRUE to_chat(src, "You switch to combat mode.") toggle = FALSE else @@ -46,6 +48,7 @@ alpha = 60 range = 255 incorporeal_move = 1 + can_strip = FALSE //spiritual pickpocketting is forbidden to_chat(src, "You switch to scout mode.") toggle = TRUE else diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index b5dc159caf0..fafa2c4e4a1 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -188,6 +188,9 @@ M.regenerate_icons() M.update_body() + if(!the_bomb) + the_bomb = locate(/obj/machinery/nuclearbomb/syndicate) in GLOB.poi_list + if(the_bomb) synd_mind.store_memory("Syndicate [the_bomb.name] Code: [the_bomb.r_code]") to_chat(synd_mind.current, "The code for \the [the_bomb.name] is: [the_bomb.r_code]") @@ -436,54 +439,55 @@ return newname -/datum/game_mode/nuclear/set_scoreboard_gvars() +/datum/game_mode/nuclear/set_scoreboard_vars() + var/datum/scoreboard/scoreboard = SSticker.score var/foecount = 0 + for(var/datum/mind/M in SSticker.mode.syndicates) foecount++ if(!M || !M.current) - GLOB.score_opkilled++ + scoreboard.score_ops_killed++ continue if(M.current.stat == DEAD) - GLOB.score_opkilled++ + scoreboard.score_ops_killed++ else if(M.current.restrained()) - GLOB.score_arrested++ + scoreboard.score_arrested++ - if(foecount == GLOB.score_arrested) - GLOB.score_allarrested = 1 + if(foecount == scoreboard.score_arrested) + scoreboard.all_arrested = TRUE // how the hell did they manage that - for(var/obj/machinery/nuclearbomb/nuke in GLOB.machines) - if(nuke.r_code == "Nope") continue + var/obj/machinery/nuclearbomb/syndicate/nuke = locate() in GLOB.poi_list + if(nuke?.r_code != "Nope") var/area/A = get_area(nuke) var/list/thousand_penalty = list(/area/solar) var/list/fiftythousand_penalty = list(/area/security/main, /area/security/brig, /area/security/armoury, /area/security/checkpoint2) if(is_type_in_list(A, thousand_penalty)) - GLOB.score_nuked_penalty = 1000 + scoreboard.nuked_penalty = 1000 else if(is_type_in_list(A, fiftythousand_penalty)) - GLOB.score_nuked_penalty = 50000 + scoreboard.nuked_penalty = 50000 else if(istype(A, /area/engine)) - GLOB.score_nuked_penalty = 100000 + scoreboard.nuked_penalty = 100000 else - GLOB.score_nuked_penalty = 10000 + scoreboard.nuked_penalty = 10000 - break - - var/killpoints = GLOB.score_opkilled * 250 - var/arrestpoints = GLOB.score_arrested * 1000 - GLOB.score_crewscore += killpoints - GLOB.score_crewscore += arrestpoints - if(GLOB.score_nuked) - GLOB.score_crewscore -= GLOB.score_nuked_penalty + var/killpoints = scoreboard.score_ops_killed * 250 + var/arrestpoints = scoreboard.score_arrested * 1000 + scoreboard.crewscore += killpoints + scoreboard.crewscore += arrestpoints + if(scoreboard.nuked) + scoreboard.crewscore -= scoreboard.nuked_penalty /datum/game_mode/nuclear/get_scoreboard_stats() + var/datum/scoreboard/scoreboard = SSticker.score var/foecount = 0 var/crewcount = 0 @@ -530,11 +534,11 @@ dat += "
" - dat += "Operatives Arrested: [GLOB.score_arrested] ([GLOB.score_arrested * 1000] Points)
" - dat += "All Operatives Arrested: [GLOB.score_allarrested ? "Yes" : "No"] (Score tripled)
" + dat += "Operatives Arrested: [scoreboard.score_arrested] ([scoreboard.score_arrested * 1000] Points)
" + dat += "All Operatives Arrested: [scoreboard.all_arrested ? "Yes" : "No"] (Score tripled)
" - dat += "Operatives Killed: [GLOB.score_opkilled] ([GLOB.score_opkilled * 1000] Points)
" - dat += "Station Destroyed: [GLOB.score_nuked ? "Yes" : "No"] (-[GLOB.score_nuked_penalty] Points)
" + dat += "Operatives Killed: [scoreboard.score_ops_killed] ([scoreboard.score_ops_killed * 1000] Points)
" + dat += "Station Destroyed: [scoreboard.nuked ? "Yes" : "No"] (-[scoreboard.nuked_penalty] Points)
" dat += "
" return dat diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index a89f12f06ce..b4452295c31 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -370,44 +370,45 @@ text += "
" to_chat(world, text) -/datum/game_mode/revolution/set_scoreboard_gvars() +/datum/game_mode/revolution/set_scoreboard_vars() + var/datum/scoreboard/scoreboard = SSticker.score var/foecount = 0 + for(var/datum/mind/M in SSticker.mode.head_revolutionaries) foecount++ if(!M || !M.current) - GLOB.score_opkilled++ + scoreboard.score_ops_killed++ continue if(M.current.stat == DEAD) - GLOB.score_opkilled++ + scoreboard.score_ops_killed++ else if(M.current.restrained()) - GLOB.score_arrested++ + scoreboard.score_arrested++ - if(foecount == GLOB.score_arrested) - GLOB.score_allarrested = 1 + if(foecount == scoreboard.score_arrested) + scoreboard.all_arrested = TRUE - for(var/thing in GLOB.human_list) - var/mob/living/carbon/human/player = thing - if(player.mind) - var/role = player.mind.assigned_role - if(role in list("Captain", "Head of Security", "Head of Personnel", "Chief Engineer", "Research Director")) - if(player.stat == DEAD) - GLOB.score_deadcommand++ + for(var/I in GLOB.human_list) + var/mob/living/carbon/human/H = I + if(H.stat == DEAD && H.mind?.assigned_role) + if(H.mind.assigned_role in list("Captain", "Head of Security", "Head of Personnel", "Chief Engineer", "Research Director")) + scoreboard.score_dead_command++ - var/arrestpoints = GLOB.score_arrested * 1000 - var/killpoints = GLOB.score_opkilled * 500 - var/comdeadpts = GLOB.score_deadcommand * 500 - if(GLOB.score_traitorswon) - GLOB.score_crewscore -= 10000 + var/arrestpoints = scoreboard.score_arrested * 1000 + var/killpoints = scoreboard.score_ops_killed * 500 + var/comdeadpts = scoreboard.score_dead_command * 500 + if(scoreboard.score_greentext) + scoreboard.crewscore -= 10000 - GLOB.score_crewscore += arrestpoints - GLOB.score_crewscore += killpoints - GLOB.score_crewscore -= comdeadpts + scoreboard.crewscore += arrestpoints + scoreboard.crewscore += killpoints + scoreboard.crewscore -= comdeadpts /datum/game_mode/revolution/get_scoreboard_stats() + var/datum/scoreboard/scoreboard = SSticker.score var/foecount = 0 var/comcount = 0 var/revcount = 0 @@ -444,12 +445,12 @@ dat += "Number of Surviving Loyal Crew: [loycount]
" dat += "
" - dat += "Revolution Heads Arrested: [GLOB.score_arrested] ([GLOB.score_arrested * 1000] Points)
" - dat += "All Revolution Heads Arrested: [GLOB.score_allarrested ? "Yes" : "No"] (Score tripled)
" + dat += "Revolution Heads Arrested: [scoreboard.score_arrested] ([scoreboard.score_arrested * 1000] Points)
" + dat += "All Revolution Heads Arrested: [scoreboard.all_arrested ? "Yes" : "No"] (Score tripled)
" - dat += "Revolution Heads Slain: [GLOB.score_opkilled] ([GLOB.score_opkilled * 500] Points)
" - dat += "Command Staff Slain: [GLOB.score_deadcommand] (-[GLOB.score_deadcommand * 500] Points)
" - dat += "Revolution Successful: [GLOB.score_traitorswon ? "Yes" : "No"] (-[GLOB.score_traitorswon * 10000] Points)
" + dat += "Revolution Heads Slain: [scoreboard.score_ops_killed] ([scoreboard.score_ops_killed * 500] Points)
" + dat += "Command Staff Slain: [scoreboard.score_dead_command] (-[scoreboard.score_dead_command * 500] Points)
" + dat += "Revolution Successful: [scoreboard.score_greentext ? "Yes" : "No"] (-[scoreboard.score_greentext * 10000] Points)
" dat += "
" return dat diff --git a/code/game/gamemodes/scoreboard.dm b/code/game/gamemodes/scoreboard.dm index 143f6d0c8d1..33b1a9341a2 100644 --- a/code/game/gamemodes/scoreboard.dm +++ b/code/game/gamemodes/scoreboard.dm @@ -1,3 +1,5 @@ +GLOBAL_VAR(scoreboard) // Variable to save the scoreboard string once it's been generated + //Thresholds for Score Ratings #define SINGULARITY_DESERVES_BETTER -3500 #define SINGULARITY_FODDER -3000 @@ -14,190 +16,275 @@ #define PRIDE_OF_SCIENCE 4000 #define NANOTRANSEN_FINEST 5000 -/datum/controller/subsystem/ticker/proc/scoreboard() - //Print a list of antagonists to the server log +/datum/scoreboard + /// Overall combined score for the whole round. + var/crewscore = 0 + /// How many useful items have cargo shipped out? + var/score_things_shipped = 0 + /// How many harvests have hydroponics done? + var/score_things_harvested = 0 + /// How much ore has been mined on the mining z level? + var/score_ore_mined = 0 + /// How much research was done by science? + var/score_research_done = 0 + /// How many random events did the station survive? + var/score_events_endured = 0 + /// How many APCs have poor charge? + var/score_power_loss = 0 + /// How many people got out alive? + var/score_escapees = 0 + /// How many people /didn't/ get out alive? + var/score_dead_crew = 0 + /// How much blood, puke, stains etc went uncleaned? + var/score_mess = 0 + /// How many meals were made? + var/score_meals = 0 + /// How many rampant, uncured diseases are on board the station? + var/score_disease = 0 + /// How many command members died? (Revolution) + var/score_dead_command = 0 + /// How many antagonists are alive in the brig? (Nuke ops & Revolution) + var/score_arrested = 0 + /// How many operatives were killed? (Nuke ops & Revolution) + var/score_ops_killed = 0 + /// How much noms were had by the crew? + var/score_food_eaten = 0 + /// How many times was the clown punched, struck, or otherwise maligned? + var/score_clown_abuse = 0 + + // Booleans // + /// Were the antagonists successful? + var/score_greentext = FALSE + /// Did the crew catch all of the antags alive? + var/all_arrested = FALSE + /// Is the NAD safe and secure? + var/disc_secure = FALSE + + // Points penalties/bonuses // + /// If all APCs on the station are running optimally, big bonus. + var/power_bonus = FALSE + /// If there are no messes on the station anywhere, huge bonus. + var/mess_bonus = FALSE + /// If the AI is dead, big points penalty. + var/dead_ai = FALSE + /// Was the station blown into little bits? + var/nuked = FALSE + /// Points penalty for being blown to little bits. + var/nuked_penalty = 0 + + // Player Stats // + /// What was the name of the richest person on the shuttle? + var/richest_name = "" + /// What was the ckey of the richest person on the shuttle? + var/richest_key = "" + /// What was the job of the richest person on the shuttle? + var/richest_job = "" + /// How much money did the richest person on the shuttle have? + var/richest_cash = 0 + + /// What was the name of the most injured person on the shuttle? + var/damaged_name + /// What was the ckey of the most injured person on the shuttle? + var/damaged_key + /// What was the job of the most injured person on the shuttle? + var/damaged_job + /// How damaged was the most injured person on the shuttle? + var/damaged_health + + +/datum/scoreboard/proc/scoreboard() + // Print a list of antagonists to the server log. + log_antags() + + for(var/_I in GLOB.mob_list) + var/mob/M = _I + if(is_station_level(M.z)) + check_station_player(M) + else if(SSshuttle.emergency.mode >= SHUTTLE_ENDGAME && istype(get_area(M), SSshuttle.emergency.areaInstance)) + check_shuttle_player(M) + + check_apc_power() + check_cleanables() + + generate_scoreboard() + +/datum/scoreboard/proc/log_antags() var/list/total_antagonists = list() - //Look into all mobs in world, dead or alive - for(var/datum/mind/Mind in SSticker.minds) - var/temprole = Mind.special_role - if(temprole) //if they are an antagonist of some sort. - if(temprole in total_antagonists) //If the role exists already, add the name to it - total_antagonists[temprole] += ", [Mind.name]([Mind.key])" - else - total_antagonists.Add(temprole) //If the role doesnt exist in the list, create it and add the mob - total_antagonists[temprole] += ": [Mind.name]([Mind.key])" + // Look into all mobs in the world, dead or alive + for(var/mind in SSticker.minds) + var/datum/mind/M = mind + var/role = M.special_role - //Now print them all into the log! + // If they're an antagonist of some sort. + if(role) + if(total_antagonists[role]) // If the role exists already, add the name to it. + total_antagonists[role] += ", [M.name]([M.key])" + else // If the role doesn't exist in the list, create it and add the mob + total_antagonists[role] += ": [M.name]([M.key])" + + // Now print them all into the log! log_game("Antagonists at round end were...") - for(var/i in total_antagonists) - log_game("[i]s[total_antagonists[i]].") - - // Score Calculation and Display - - // Who is alive/dead, who escaped - for(var/mob/living/silicon/ai/I in GLOB.mob_list) - if(I.stat == DEAD && is_station_level(I.z)) - GLOB.score_deadaipenalty++ - GLOB.score_deadcrew++ - - for(var/thing in GLOB.human_list) - var/mob/living/carbon/human/I = thing - if(I.stat == DEAD && is_station_level(I.z)) - GLOB.score_deadcrew++ - - if(SSshuttle.emergency.mode >= SHUTTLE_ENDGAME) - for(var/mob/living/player in GLOB.mob_list) - if(player.client) - if(player.stat != DEAD) - var/turf/location = get_turf(player.loc) - var/area/escape_zone = locate(/area/shuttle/escape) - if(location in escape_zone) - GLOB.score_escapees++ + for(var/I in total_antagonists) + log_game("[I]s[total_antagonists[I]].") +/datum/scoreboard/proc/check_station_player(mob/M) + if(!is_station_level(M.z) || M.stat < DEAD) + return + if(isAI(M)) + dead_ai = TRUE + score_dead_crew++ + else if(ishuman(M)) + score_dead_crew++ - var/cash_score = 0 - var/dmg_score = 0 +/datum/scoreboard/proc/check_shuttle_player(mob/M) + if(!M.mind || M.stat == DEAD || !ishuman(M)) + return + var/mob/living/carbon/human/H = M - if(SSshuttle.emergency.mode >= SHUTTLE_ENDGAME) - for(var/thing in GLOB.human_list) - var/mob/living/carbon/human/E = thing - cash_score = 0 - dmg_score = 0 - var/turf/location = get_turf(E.loc) - var/area/escape_zone = SSshuttle.emergency.areaInstance + score_escapees++ - if(E.stat != DEAD && (location in escape_zone)) // Escapee Scores - cash_score = get_score_container_worth(E) + var/cash_score = get_score_container_worth(H) + if(cash_score > richest_cash) + richest_cash = cash_score + richest_name = H.real_name + richest_job = H.job + richest_key = H.key - if(cash_score > GLOB.score_richestcash) - GLOB.score_richestcash = cash_score - GLOB.score_richestname = E.real_name - GLOB.score_richestjob = E.job - GLOB.score_richestkey = E.key + var/damage_score = H.getBruteLoss() + H.getFireLoss() + H.getToxLoss() + H.getOxyLoss() + if(damage_score > damaged_health) + damaged_health = damage_score + damaged_name = H.real_name + damaged_job = H.job + damaged_key = H.key - dmg_score = E.getBruteLoss() + E.getFireLoss() + E.getToxLoss() + E.getOxyLoss() - if(dmg_score > GLOB.score_dmgestdamage) - GLOB.score_dmgestdamage = dmg_score - GLOB.score_dmgestname = E.real_name - GLOB.score_dmgestjob = E.job - GLOB.score_dmgestkey = E.key +// A recursive function to properly determine the wealthiest escapee +/datum/scoreboard/proc/get_score_container_worth(atom/C, level = 0) + . = 0 + if(level >= 5) + // in case the containers recurse or something + return 0 - if(SSticker && SSticker.mode) - SSticker.mode.set_scoreboard_gvars() + for(var/obj/item/card/id/id in C.contents) + var/datum/money_account/A = get_money_account(id.associated_account_number) + // has an account? + if(A) + . += A.money + for(var/obj/item/stack/spacecash/cash in C.contents) + . += cash.amount + for(var/obj/item/storage/S in C.contents) + . += .(S, level + 1) + +/datum/scoreboard/proc/check_apc_power() + for(var/_A in GLOB.apcs) + var/obj/machinery/power/apc/A = _A + if(!is_station_level(A.z)) + continue + var/obj/item/stock_parts/cell/C = A.cell + if(!C || C.charge < 2300) + score_power_loss++ //200 charge leeway + +/datum/scoreboard/proc/check_cleanables() + for(var/obj/effect/decal/cleanable/C in world) + if(!is_station_level(C.z)) + continue + if(istype(C, /obj/effect/decal/cleanable/blood/gibs)) + score_mess += 3 + else if(istype(C, /obj/effect/decal/cleanable/blood)) + score_mess += 1 + else if(istype(C, /obj/effect/decal/cleanable/vomit)) + score_mess += 1 - // Check station's power levels - for(var/thing in GLOB.apcs) - var/obj/machinery/power/apc/A = thing - if(!is_station_level(A.z)) continue - for(var/obj/item/stock_parts/cell/C in A.contents) - if(C.charge < 2300) - GLOB.score_powerloss++ //200 charge leeway +/datum/scoreboard/proc/generate_scoreboard() + // Point modifiers + var/points_events_endured = score_events_endured * 50 + var/points_research_done = score_research_done * 30 + var/points_disease = score_disease * 30 + var/points_dead_crew = score_dead_crew * 25 + var/points_escapees = score_escapees * 25 + var/points_power_loss = score_power_loss * 20 + var/points_things_harvested = score_things_harvested * 5 + var/points_things_shipped = score_things_shipped * 5 + var/points_meals = score_meals * 5 + var/points_ore_mined = score_ore_mined * 2 + // Bonuses + crewscore += points_events_endured + crewscore += points_research_done + crewscore += points_escapees + crewscore += points_things_harvested + crewscore += points_things_shipped + crewscore += points_meals + crewscore += points_ore_mined - // Check how much uncleaned mess is on the station - for(var/obj/effect/decal/cleanable/M in world) - if(!is_station_level(M.z)) continue - if(istype(M, /obj/effect/decal/cleanable/blood/gibs)) - GLOB.score_mess += 3 + if(!score_power_loss) + crewscore += 2500 + power_bonus = TRUE - if(istype(M, /obj/effect/decal/cleanable/blood)) - GLOB.score_mess += 1 + if(!score_mess) + crewscore += 1500 + mess_bonus = TRUE - if(istype(M, /obj/effect/decal/cleanable/vomit)) - GLOB.score_mess += 1 + if(all_arrested) // This only seems to be implemented for Rev and Nukies. -DaveKorhal + crewscore *= 3 // This needs to be here for the bonus to be applied properly + // Penalties + crewscore -= points_dead_crew + crewscore -= points_power_loss + crewscore -= points_disease + crewscore -= score_mess - // Bonus Modifiers - var/deathpoints = GLOB.score_deadcrew * 25 //done - var/researchpoints = GLOB.score_researchdone * 30 - var/eventpoints = GLOB.score_eventsendured * 50 - var/escapoints = GLOB.score_escapees * 25 //done - var/harvests = GLOB.score_stuffharvested * 5 - var/shipping = GLOB.score_stuffshipped * 5 - var/mining = GLOB.score_oremined * 2 //done, might want polishing - var/meals = GLOB.score_meals * 5 - var/power = GLOB.score_powerloss * 20 - var/messpoints - if(GLOB.score_mess != 0) - messpoints = GLOB.score_mess //done - var/plaguepoints = GLOB.score_disease * 30 + if(dead_ai) + crewscore -= 250 - // Good Things - GLOB.score_crewscore += shipping - GLOB.score_crewscore += harvests - GLOB.score_crewscore += mining - GLOB.score_crewscore += researchpoints - GLOB.score_crewscore += eventpoints - GLOB.score_crewscore += escapoints - - if(power == 0) - GLOB.score_crewscore += 2500 - GLOB.score_powerbonus = 1 - - - GLOB.score_crewscore += meals - if(GLOB.score_allarrested) // This only seems to be implemented for Rev and Nukies. -DaveKorhal - GLOB.score_crewscore *= 3 // This needs to be here for the bonus to be applied properly - - - GLOB.score_crewscore -= deathpoints - if(GLOB.score_deadaipenalty) - GLOB.score_crewscore -= 250 - GLOB.score_crewscore -= power - - - GLOB.score_crewscore -= messpoints - GLOB.score_crewscore -= plaguepoints - - // Show the score - might add "ranks" later - to_chat(world, "The crew's final score is:") - to_chat(world, "[GLOB.score_crewscore]") - // Generate the score panel - var/dat = "Round Statistics and Score

" - if(mode) - dat += mode.get_scoreboard_stats() + var/list/dat = list("Round Statistics and Score

") + if(SSticker.mode) + dat += SSticker.mode.get_scoreboard_stats() dat += {" General Statistics
The Good
- Ore Mined: [GLOB.score_oremined] ([GLOB.score_oremined * 2] Points)
"} - if(SSshuttle.emergency.mode == SHUTTLE_ENDGAME) dat += "Shuttle Escapees: [GLOB.score_escapees] ([GLOB.score_escapees * 25] Points)
" - dat += {" - Whole Station Powered: [GLOB.score_powerbonus ? "Yes" : "No"] ([GLOB.score_powerbonus * 2500] Points)

+ Ore Mined: [score_ore_mined] ([points_ore_mined] Points)
"} + if(score_escapees) + dat += "Shuttle Escapees: [score_escapees] ([points_escapees] Points)
" + dat += "Whole Station Powered: [power_bonus ? "Yes" : "No"] ([power_bonus * 2500] Points)
" + dat += "Whole Station Cleaned: [mess_bonus ? "Yes" : "No"] ([mess_bonus * 1500] Points)

" - The Bad
- Dead bodies on Station: [GLOB.score_deadcrew] (-[GLOB.score_deadcrew * 25] Points)
- Uncleaned Messes: [GLOB.score_mess] (-[GLOB.score_mess] Points)
- Station Power Issues: [GLOB.score_powerloss] (-[GLOB.score_powerloss * 20] Points)
- AI Destroyed: [GLOB.score_deadaipenalty ? "Yes" : "No"] (-[GLOB.score_deadaipenalty * 250] Points)

+ dat += "The Bad
" + dat += "Dead bodies on Station: [score_dead_crew] (-[points_dead_crew] Points)
" + if(!mess_bonus) + dat += "Uncleaned Messes: [score_mess] (-[score_mess] Points)
" + if(!power_bonus) + dat += "Station Power Issues: [score_power_loss] (-[points_power_loss] Points)
" + dat += {" + AI Destroyed: [dead_ai ? "Yes" : "No"] (-[dead_ai * 250] Points)

The Weird
- Food Eaten: [GLOB.score_foodeaten] bites/sips
- Times a Clown was Abused: [GLOB.score_clownabuse]

- "} - if(GLOB.score_escapees) - dat += {"Richest Escapee: [GLOB.score_richestname], [GLOB.score_richestjob]: $[num2text(GLOB.score_richestcash,50)] ([GLOB.score_richestkey])
- Most Battered Escapee: [GLOB.score_dmgestname], [GLOB.score_dmgestjob]: [GLOB.score_dmgestdamage] damage ([GLOB.score_dmgestkey])
"} + Food Eaten: [score_food_eaten] bites/sips.
+ Times a Clown was Abused: [score_clown_abuse]

"} + if(score_escapees) + dat += "Richest Escapee: [richest_name], [richest_job]: $[num2text(richest_cash, 50)] ([richest_key])
" + if(damaged_health) + dat += "Most Battered Escapee: [damaged_name], [damaged_job]: [damaged_health] damage ([damaged_key])
" else if(SSshuttle.emergency.mode <= SHUTTLE_STRANDED) dat += "The station wasn't evacuated!
" else dat += "No-one escaped!
" - dat += mode.declare_job_completion() + dat += SSticker.mode.declare_job_completion() dat += {"

- FINAL SCORE: [GLOB.score_crewscore]
+ FINAL SCORE: [crewscore]
"} var/score_rating = "The Aristocrats!" - switch(GLOB.score_crewscore) - if(-99999 to SINGULARITY_DESERVES_BETTER) score_rating = "Even the Singularity Deserves Better" + switch(crewscore) + if(-INFINITY to SINGULARITY_DESERVES_BETTER) score_rating = "Even the Singularity Deserves Better" if(SINGULARITY_DESERVES_BETTER+1 to SINGULARITY_FODDER) score_rating = "Singularity Fodder" if(SINGULARITY_FODDER+1 to ALL_FIRED) score_rating = "You're All Fired" if(ALL_FIRED+1 to WASTE_OF_OXYGEN) score_rating = "A Waste of Perfectly Good Oxygen" @@ -214,33 +301,20 @@ if(NANOTRANSEN_FINEST to INFINITY) score_rating = "Nanotrasen's Finest" dat += "RATING: [score_rating]" - src << browse(dat, "window=roundstats;size=500x600") + GLOB.scoreboard = jointext(dat, "") for(var/mob/E in GLOB.player_list) - if(E.client && !E.get_preference(PREFTOGGLE_DISABLE_SCOREBOARD)) - E << browse(dat, "window=roundstats;size=500x600") + if(E.client) + to_chat(E, "The crew's final score is:") + to_chat(E, "[crewscore]") + if(!E.get_preference(PREFTOGGLE_DISABLE_SCOREBOARD)) + E << browse(GLOB.scoreboard, "window=roundstats;size=500x600") -// A recursive function to properly determine the wealthiest escapee -/datum/controller/subsystem/ticker/proc/get_score_container_worth(atom/C, level=0) - if(level >= 5) - // in case the containers recurse or something - return 0 - else - . = 0 - for(var/obj/item/card/id/id in C.contents) - var/datum/money_account/A = get_money_account(id.associated_account_number) - // has an account? - if(A) - . += A.money - for(var/obj/item/stack/spacecash/cash in C.contents) - . += cash.amount - for(var/obj/item/storage/S in C.contents) - . += .(S, level + 1) /datum/game_mode/proc/get_scoreboard_stats() return null -/datum/game_mode/proc/set_scoreboard_gvars() +/datum/game_mode/proc/set_scoreboard_vars() return null #undef SINGULARITY_DESERVES_BETTER diff --git a/code/game/gamemodes/vampire/vampire_powers.dm b/code/game/gamemodes/vampire/vampire_powers.dm index 4e06cb02df1..0340352412a 100644 --- a/code/game/gamemodes/vampire/vampire_powers.dm +++ b/code/game/gamemodes/vampire/vampire_powers.dm @@ -9,6 +9,7 @@ action_background_icon_state = "bg_vampire" var/required_blood = 0 var/gain_desc = null + var/deduct_blood_on_cast = TRUE //Do we want to take the blood when this is cast, or at a later point? /obj/effect/proc_holder/spell/vampire/New() ..() @@ -99,6 +100,8 @@ var/datum/vampire/vampire = usr.mind.vampire if(required_blood <= vampire.bloodusable) + if(!deduct_blood_on_cast) //don't take the blood yet if this is false! + return vampire.bloodusable -= required_blood else // stop!! @@ -288,8 +291,10 @@ gain_desc = "You have gained the Enthrall ability which at a heavy blood cost allows you to enslave a human that is not loyal to any other for a random period of time." action_icon_state = "vampire_enthrall" required_blood = 300 + deduct_blood_on_cast = FALSE /obj/effect/proc_holder/spell/vampire/targetted/enthrall/cast(list/targets, mob/user = usr) + var/datum/vampire/vampire = user.mind.vampire for(var/mob/living/target in targets) user.visible_message("[user] bites [target]'s neck!", "You bite [target]'s neck and begin the flow of power.") to_chat(target, "You feel the tendrils of evil invade your mind.") @@ -299,6 +304,7 @@ if(do_mob(user, target, 50)) if(can_enthrall(user, target)) handle_enthrall(user, target) + vampire.bloodusable -= required_blood //we take the blood after enthralling, not before else revert_cast(user) to_chat(user, "You or your target either moved or you dont have enough usable blood.") @@ -418,7 +424,7 @@ name = "Mist Form (30)" desc = "You take on the form of mist for a short period of time." gain_desc = "You have gained the Mist Form ability which allows you to take on the form of mist for a short period and pass over any obstacle in your path." - action_icon_state = "jaunt" + action_icon_state = "mist" charge_max = 600 required_blood = 30 centcom_cancast = 0 @@ -430,28 +436,23 @@ var/originalloc = get_turf(user.loc) var/obj/effect/dummy/spell_jaunt/holder = new /obj/effect/dummy/spell_jaunt(originalloc) var/atom/movable/overlay/animation = new /atom/movable/overlay(originalloc) - animation.name = "water" + animation.name = "blood" animation.density = 0 animation.anchored = 1 animation.icon = 'icons/mob/mob.dmi' - animation.icon_state = "liquify" + animation.icon_state = "empty" animation.layer = 5 animation.master = holder U.ExtinguishMob() - flick("liquify", animation) + flick("mist", animation) user.forceMove(holder) user.client.eye = holder - var/datum/effect_system/steam_spread/steam = new /datum/effect_system/steam_spread() - steam.set_up(10, 0, originalloc) - steam.start() sleep(jaunt_duration) var/mobloc = get_turf(user.loc) animation.loc = mobloc - steam.location = mobloc - steam.start() user.canmove = 0 sleep(20) - flick("reappear",animation) + flick("mist_reappear", animation) sleep(5) if(!user.Move(mobloc)) for(var/direction in list(1,2,4,8,5,6,9,10)) @@ -470,7 +471,7 @@ name = "Shadowstep (30)" desc = "Vanish into the shadows." gain_desc = "You have gained the ability to shadowstep, which makes you disappear into nearby shadows at the cost of blood." - action_icon_state = "blink" + action_icon_state = "shadowblink" charge_max = 20 required_blood = 30 centcom_cancast = 0 diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm index 37f1bbf4c6d..574042abc08 100644 --- a/code/game/gamemodes/wizard/soulstone.dm +++ b/code/game/gamemodes/wizard/soulstone.dm @@ -366,7 +366,7 @@ qdel(SS) /proc/make_new_construct(mob/living/simple_animal/hostile/construct/c_type, mob/target, mob/user, cult_override = FALSE) - if(jobban_isbanned(target, "cultist")) + if(jobban_isbanned(target, ROLE_CULTIST)) return var/mob/living/simple_animal/hostile/construct/C = new c_type(get_turf(target)) C.faction |= "\ref[user]" diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index 6d93e452d73..67ad3a2ebae 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -446,7 +446,7 @@ /datum/spellbook_entry/item/warp_cubes name = "Warp Cubes" - desc = "Two magic cubes, that when they are twisted in hand, teleports the user to the location of the other cube instantly. Great for silently teleporting to a fixed location, or teleporting you to an appretnance, or vice versa. Do not leave on the wizard den, it will not work." + desc = "Two magic cubes, that when they are twisted in hand, teleports the user to the location of the other cube instantly. Great for silently teleporting to a fixed location, or teleporting you to an apprentice, or vice versa. Do not leave on the wizard den, it will not work." item_path = /obj/item/warp_cube/red log_name = "WC" cost = 1 @@ -479,7 +479,7 @@ /datum/spellbook_entry/item/singularity_hammer name = "Singularity Hammer" - desc = "A hammer that creates an intensely powerful field of gravity where it strikes, pulling everthing nearby to the point of impact." + desc = "A hammer that creates an intensely powerful field of gravity where it strikes, pulling everything nearby to the point of impact." item_path = /obj/item/twohanded/singularityhammer log_name = "SI" category = "Weapons and Armors" diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm index fd3e1a0442b..8f313c185dc 100644 --- a/code/game/jobs/job/job.dm +++ b/code/game/jobs/job/job.dm @@ -225,7 +225,7 @@ to_chat(H, "Failed to locate a storage object on your mob, either you spawned with no hands free and no backpack or this is a bug.") qdel(G) - qdel(gear_leftovers) + gear_leftovers.Cut() return 1 diff --git a/code/game/machinery/ai_slipper.dm b/code/game/machinery/ai_slipper.dm index 45cd917c39b..a9cc35874bb 100644 --- a/code/game/machinery/ai_slipper.dm +++ b/code/game/machinery/ai_slipper.dm @@ -4,133 +4,66 @@ icon_state = "liquid_dispenser" layer = 3 plane = FLOOR_PLANE - anchored = 1.0 + anchored = TRUE max_integrity = 200 armor = list(melee = 50, bullet = 20, laser = 20, energy = 20, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 30) var/uses = 20 - var/disabled = TRUE - var/lethal = 0 - var/locked = TRUE - var/cooldown_time = 0 - var/cooldown_timeleft = 0 + var/cooldown_time = 10 SECONDS var/cooldown_on = FALSE req_access = list(ACCESS_AI_UPLOAD) +/obj/machinery/ai_slipper/examine(mob/user) + . = ..() + . += "A small counter shows it has: [uses] use\s remaining." + /obj/machinery/ai_slipper/power_change() - if(stat & BROKEN) - update_icon() + if(powered()) + stat &= ~NOPOWER else - if( powered() ) - stat &= ~NOPOWER - else - stat |= NOPOWER - disabled = TRUE - update_icon() - -/obj/machinery/ai_slipper/proc/setState(enabled, uses) - disabled = disabled - uses = uses - power_change() - -/obj/machinery/ai_slipper/attackby(obj/item/W, mob/user, params) - if(stat & (NOPOWER|BROKEN)) - return - if(istype(user, /mob/living/silicon)) - return attack_hand(user) - if(allowed(usr)) // trying to unlock the interface - locked = !locked - to_chat(user, "You [locked ? "lock" : "unlock"] the device.") - if(locked) - if(user.machine == src) - user.unset_machine() - user << browse(null, "window=ai_slipper") - else - if(user.machine == src) - attack_hand(usr) - return - return ..() - -/obj/machinery/ai_slipper/proc/ToggleOn() - if(stat & (NOPOWER|BROKEN)) - return - disabled = !disabled + stat |= NOPOWER update_icon() -/obj/machinery/ai_slipper/proc/Activate() +/obj/machinery/ai_slipper/attack_ai(mob/user) + add_hiddenprint(user) + return attack_hand(user) + +/obj/machinery/ai_slipper/attack_ghost(mob/user) + if(user.can_advanced_admin_interact()) + Activate(user) + +/obj/machinery/ai_slipper/attack_hand(mob/user) + if(stat & (NOPOWER|BROKEN)) + to_chat(user, "[src] has no power or is broken!") + return + if(!allowed(user)) + to_chat(user, "Access denied.") + return + Activate(user) + +/obj/machinery/ai_slipper/proc/Activate(mob/user) if(stat & (NOPOWER|BROKEN)) return - if(cooldown_on || disabled) + if(!uses) + to_chat(user, "[src] is empty!") + return + if(cooldown_on) + to_chat(user, "[src] is still recharging!") return else new /obj/effect/particle_effect/foam(loc) uses-- cooldown_on = TRUE - cooldown_time = world.timeofday + 100 - slip_process() + power_change() + addtimer(CALLBACK(src, .proc/recharge), cooldown_time) /obj/machinery/ai_slipper/update_icon() - if(stat & (NOPOWER|BROKEN) || disabled) + if(stat & (NOPOWER|BROKEN) || cooldown_on || !uses) icon_state = "liquid_dispenser" else icon_state = "liquid_dispenser_on" -/obj/machinery/ai_slipper/attack_ai(mob/user) - return attack_hand(user) - -/obj/machinery/ai_slipper/attack_ghost(mob/user) - return attack_hand(user) - -/obj/machinery/ai_slipper/attack_hand(mob/user) - if(stat & (NOPOWER|BROKEN)) +/obj/machinery/ai_slipper/proc/recharge() + if(!uses) return - - if(get_dist(src, user) > 1 && (!issilicon(user) && !user.can_admin_interact())) - to_chat(user, "Too far away.") - user.unset_machine() - user << browse(null, "window=ai_slipper") - return - - user.set_machine(src) - var/area/myarea = get_area(src) - var/t = "AI Liquid Dispenser ([myarea.name])
" - - if(locked && (!issilicon(user) && !user.can_admin_interact())) - t += "(Swipe ID card to unlock control panel.)
" - else - t += text("Dispenser [] - []?
\n", disabled ? "deactivated" : "activated", disabled ? "Enable" : "Disable") - t += text("Uses Left: [uses]. Activate the dispenser?
\n") - - user << browse(t, "window=computer;size=575x450") - onclose(user, "computer") - -/obj/machinery/ai_slipper/Topic(href, href_list) - if(..()) - return 1 - - if(locked && (!issilicon(usr) && !usr.can_admin_interact())) - to_chat(usr, "Control panel is locked!") - return 1 - - if(href_list["toggleOn"]) - ToggleOn() - - if(href_list["toggleUse"]) - Activate() - - attack_hand(usr) - -/obj/machinery/ai_slipper/proc/slip_process() - while(cooldown_time - world.timeofday > 0) - var/ticksleft = cooldown_time - world.timeofday - - if(ticksleft > 1e5) - cooldown_time = world.timeofday + 10 // midnight rollover - - - cooldown_timeleft = (ticksleft / 10) - sleep(5) - if(uses <= 0) - return - if(uses >= 0) - cooldown_on = FALSE + cooldown_on = FALSE power_change() diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index 3abc12a169d..78895d0d099 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -1,53 +1,18 @@ -/obj/structure/computerframe - density = 1 - anchored = 0 - name = "computer frame" - icon = 'icons/obj/stock_parts.dmi' - icon_state = "0" - max_integrity = 100 - var/state = 0 - var/obj/item/circuitboard/circuit = null - var/base_mineral = /obj/item/stack/sheet/metal - -/obj/structure/computerframe/deconstruct(disassembled = TRUE) - if(!(flags & NODECONSTRUCT)) - drop_computer_parts() - return ..() // will qdel the frame - -/obj/structure/computerframe/obj_break(damage_flag) - deconstruct() - -/obj/structure/computerframe/proc/drop_computer_parts() - new base_mineral(loc, 5) - if(circuit) - circuit.forceMove(loc) - circuit = null - if(state >= 3) - var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( loc ) - A.amount = 5 - if(state >= 4) - new /obj/item/stack/sheet/glass(loc, 2) - /obj/item/circuitboard - density = 0 - anchored = 0 - w_class = WEIGHT_CLASS_SMALL + /// Use `board_name` instead of this. name = "circuit board" icon = 'icons/obj/module.dmi' icon_state = "id_mod" item_state = "electronic" origin_tech = "programming=2" + w_class = WEIGHT_CLASS_SMALL materials = list(MAT_GLASS=200) - var/id = null - var/frequency = null + usesound = 'sound/items/deconstruct.ogg' + /// Use this instead of `name`. Formats as: `circuit board ([board_name])` + var/board_name = null var/build_path = null var/board_type = "computer" var/list/req_components = null - var/powernet = null - var/list/records = null - var/contain_parts = 1 - toolspeed = 1 - usesound = 'sound/items/deconstruct.ogg' /obj/item/circuitboard/computer board_type = "computer" @@ -55,6 +20,16 @@ /obj/item/circuitboard/machine board_type = "machine" +/obj/item/circuitboard/Initialize(mapload) + . = ..() + format_board_name() + +/obj/item/circuitboard/proc/format_board_name() + if(board_name) // Should always have this, but just in case. + name = "[initial(name)] ([board_name])" + else + name = "[initial(name)]" + /obj/item/circuitboard/examine(mob/user) . = ..() if(LAZYLEN(req_components)) @@ -67,601 +42,597 @@ . += "Required components: [english_list(nice_list)]." /obj/item/circuitboard/message_monitor - name = "Circuit board (Message Monitor)" + board_name = "Message Monitor" build_path = /obj/machinery/computer/message_monitor origin_tech = "programming=2" + /obj/item/circuitboard/camera - name = "Circuit board (Camera Monitor)" + board_name = "Camera Monitor" build_path = /obj/machinery/computer/security origin_tech = "programming=2;combat=2" /obj/item/circuitboard/camera/telescreen - name = "Circuit board (Telescreen)" + board_name = "Telescreen" build_path = /obj/machinery/computer/security/telescreen + /obj/item/circuitboard/camera/telescreen/entertainment - name = "Circuit board (Entertainment Monitor)" + board_name = "Entertainment Monitor" build_path = /obj/machinery/computer/security/telescreen/entertainment + /obj/item/circuitboard/camera/wooden_tv - name = "Circuit board (Wooden TV)" + board_name = "Wooden TV" build_path = /obj/machinery/computer/security/wooden_tv + /obj/item/circuitboard/camera/mining - name = "Circuit board (Outpost Camera Monitor)" + board_name = "Outpost Camera Monitor" build_path = /obj/machinery/computer/security/mining + /obj/item/circuitboard/camera/engineering - name = "Circuit board (Engineering Camera Monitor)" + board_name = "Engineering Camera Monitor" build_path = /obj/machinery/computer/security/engineering - /obj/item/circuitboard/xenobiology - name = "Circuit board (Xenobiology Console)" + board_name = "Xenobiology Console" build_path = /obj/machinery/computer/camera_advanced/xenobio origin_tech = "programming=3;biotech=3" + /obj/item/circuitboard/aicore - name = "Circuit board (AI Core)" + board_name = "AI Core" origin_tech = "programming=3" board_type = "other" + /obj/item/circuitboard/aiupload - name = "Circuit board (AI Upload)" + board_name = "AI Upload" build_path = /obj/machinery/computer/aiupload origin_tech = "programming=4;engineering=4" + /obj/item/circuitboard/borgupload - name = "Circuit board (Cyborg Upload)" + board_name = "Cyborg Upload" build_path = /obj/machinery/computer/borgupload origin_tech = "programming=4;engineering=4" + /obj/item/circuitboard/med_data - name = "Circuit board (Medical Records)" + board_name = "Medical Records" build_path = /obj/machinery/computer/med_data origin_tech = "programming=2;biotech=2" + /obj/item/circuitboard/pandemic - name = "circuit board (PanD.E.M.I.C. 2200)" + board_name = "PanD.E.M.I.C. 2200" build_path = /obj/machinery/computer/pandemic origin_tech = "programming=2;biotech=2" + /obj/item/circuitboard/scan_consolenew - name = "Circuit board (DNA Machine)" + board_name = "DNA Machine" build_path = /obj/machinery/computer/scan_consolenew origin_tech = "programming=2;biotech=2" + /obj/item/circuitboard/communications - name = "Circuit board (Communications Console)" + board_name = "Communications Console" build_path = /obj/machinery/computer/communications origin_tech = "programming=3;magnets=3" + /obj/item/circuitboard/card - name = "Circuit board (ID Computer)" + board_name = "ID Computer" build_path = /obj/machinery/computer/card origin_tech = "programming=3" + /obj/item/circuitboard/card/minor - name = "Circuit board (Dept ID Computer)" + board_name = "Dept ID Computer" build_path = /obj/machinery/computer/card/minor var/target_dept = TARGET_DEPT_GENERIC + /obj/item/circuitboard/card/minor/hos - name = "Circuit board (Sec ID Computer)" + board_name = "Sec ID Computer" build_path = /obj/machinery/computer/card/minor/hos target_dept = TARGET_DEPT_SEC + /obj/item/circuitboard/card/minor/cmo - name = "Circuit board (Medical ID Computer)" + board_name = "Medical ID Computer" build_path = /obj/machinery/computer/card/minor/cmo target_dept = TARGET_DEPT_MED + /obj/item/circuitboard/card/minor/rd - name = "Circuit board (Science ID Computer)" + board_name = "Science ID Computer" build_path = /obj/machinery/computer/card/minor/rd target_dept = TARGET_DEPT_SCI + /obj/item/circuitboard/card/minor/ce - name = "Circuit board (Engineering ID Computer)" + board_name = "Engineering ID Computer" build_path = /obj/machinery/computer/card/minor/ce target_dept = TARGET_DEPT_ENG + /obj/item/circuitboard/card/centcom - name = "Circuit board (CentComm ID Computer)" + board_name = "CentComm ID Computer" build_path = /obj/machinery/computer/card/centcom + /obj/item/circuitboard/teleporter - name = "Circuit board (Teleporter Console)" + board_name = "Teleporter Console" build_path = /obj/machinery/computer/teleporter origin_tech = "programming=3;bluespace=3;plasmatech=3" + /obj/item/circuitboard/secure_data - name = "Circuit board (Security Records)" + board_name = "Security Records" build_path = /obj/machinery/computer/secure_data origin_tech = "programming=2;combat=2" + /obj/item/circuitboard/stationalert_engineering - name = "Circuit Board (Station Alert Console (Engineering))" + board_name = "Station Alert Console - Engineering" build_path = /obj/machinery/computer/station_alert + /obj/item/circuitboard/stationalert - name = "Circuit Board (Station Alert Console)" + board_name = "Station Alert Console" build_path = /obj/machinery/computer/station_alert + /obj/item/circuitboard/atmos_alert - name = "Circuit Board (Atmospheric Alert Computer)" + board_name = "Atmospheric Alert Computer" build_path = /obj/machinery/computer/atmos_alert + /obj/item/circuitboard/atmoscontrol - name = "Circuit Board (Central Atmospherics Computer)" + board_name = "Central Atmospherics Computer" build_path = /obj/machinery/computer/atmoscontrol + /obj/item/circuitboard/air_management - name = "Circuit board (Atmospheric Monitor)" + board_name = "Atmospheric Monitor" build_path = /obj/machinery/computer/general_air_control + /obj/item/circuitboard/injector_control - name = "Circuit board (Injector Control)" + board_name = "Injector Control" build_path = /obj/machinery/computer/general_air_control/fuel_injection + /obj/item/circuitboard/pod - name = "Circuit board (Massdriver Control)" + board_name = "Massdriver Control" build_path = /obj/machinery/computer/pod + /obj/item/circuitboard/pod/deathsquad - name = "Circuit board (Deathsquad Massdriver control)" + board_name = "Deathsquad Massdriver Control" build_path = /obj/machinery/computer/pod/deathsquad + /obj/item/circuitboard/robotics - name = "Circuit board (Robotics Control Console)" + board_name = "Robotics Control Console" build_path = /obj/machinery/computer/robotics origin_tech = "programming=3" + /obj/item/circuitboard/drone_control - name = "Circuit board (Drone Control)" + board_name = "Drone Control" build_path = /obj/machinery/computer/drone_control origin_tech = "programming=3" + /obj/item/circuitboard/cloning - name = "Circuit board (Cloning Machine Console)" + board_name = "Cloning Machine Console" build_path = /obj/machinery/computer/cloning origin_tech = "programming=2;biotech=2" + /obj/item/circuitboard/arcade/battle - name = "circuit board (Arcade Battle)" + board_name = "Arcade Battle" build_path = /obj/machinery/computer/arcade/battle origin_tech = "programming=1" + /obj/item/circuitboard/arcade/orion_trail - name = "circuit board (Orion Trail)" + board_name = "Orion Trail" build_path = /obj/machinery/computer/arcade/orion_trail origin_tech = "programming=1" + /obj/item/circuitboard/solar_control - name = "Circuit board (Solar Control)" + board_name = "Solar Control" build_path = /obj/machinery/power/solar_control origin_tech = "programming=2;powerstorage=2" + /obj/item/circuitboard/powermonitor - name = "Circuit board (Power Monitor)" + board_name = "Power Monitor" build_path = /obj/machinery/computer/monitor origin_tech = "programming=2;powerstorage=2" + /obj/item/circuitboard/powermonitor/secret - name = "Circuit board (Outdated Power Monitor)" + board_name = "Outdated Power Monitor" build_path = /obj/machinery/computer/monitor/secret origin_tech = "programming=2;powerstorage=2" + /obj/item/circuitboard/olddoor - name = "Circuit board (DoorMex)" + board_name = "DoorMex" build_path = /obj/machinery/computer/pod/old + /obj/item/circuitboard/syndicatedoor - name = "Circuit board (ProComp Executive)" + board_name = "ProComp Executive" build_path = /obj/machinery/computer/pod/old/syndicate + /obj/item/circuitboard/swfdoor - name = "Circuit board (Magix)" + board_name = "Magix" build_path = /obj/machinery/computer/pod/old/swf + /obj/item/circuitboard/prisoner - name = "Circuit board (Prisoner Management)" + board_name = "Prisoner Management" build_path = /obj/machinery/computer/prisoner + /obj/item/circuitboard/brigcells - name = "Circuit board (Brig Cell Control)" + board_name = "Brig Cell Control" build_path = /obj/machinery/computer/brigcells + /obj/item/circuitboard/sm_monitor - name = "Circuit board (Supermatter Monitoring Console)" + board_name = "Supermatter Monitoring Console" build_path = /obj/machinery/computer/sm_monitor origin_tech = "programming=2;powerstorage=2" -// RD console circuits, so that {de,re}constructing one of the special consoles doesn't ruin everything forever +// RD console circuits, so that de/reconstructing one of the special consoles doesn't ruin everything forever /obj/item/circuitboard/rdconsole - name = "Circuit Board (RD Console)" + board_name = "RD Console" desc = "Swipe a Scientist level ID or higher to reconfigure." build_path = /obj/machinery/computer/rdconsole/core req_access = list(ACCESS_TOX) // This is for adjusting the type of computer we're building - in case something messes up the pre-existing robotics or mechanics consoles - var/access_types = list("R&D Core", "Robotics", "E.X.P.E.R.I-MENTOR", "Mechanics", "Public") - id = 1 + var/list/access_types = list("R&D Core", "Robotics", "E.X.P.E.R.I-MENTOR", "Mechanics", "Public") + /obj/item/circuitboard/rdconsole/robotics - name = "Circuit Board (RD Console - Robotics)" + board_name = "RD Console - Robotics" build_path = /obj/machinery/computer/rdconsole/robotics - id = 2 + /obj/item/circuitboard/rdconsole/experiment - name = "Circuit Board (RD Console - E.X.P.E.R.I-MENTOR)" + board_name = "RD Console - E.X.P.E.R.I-MENTOR" build_path = /obj/machinery/computer/rdconsole/experiment - id = 3 + /obj/item/circuitboard/rdconsole/mechanics - name = "Circuit Board (RD Console - Mechanics)" + board_name = "RD Console - Mechanics" build_path = /obj/machinery/computer/rdconsole/mechanics - id = 4 + /obj/item/circuitboard/rdconsole/public - name = "Circuit Board (RD Console - Public)" + board_name = "RD Console - Public" build_path = /obj/machinery/computer/rdconsole/public - id = 5 /obj/item/circuitboard/mecha_control - name = "Circuit Board (Exosuit Control Console)" + board_name = "Exosuit Control Console" build_path = /obj/machinery/computer/mecha + /obj/item/circuitboard/pod_locater - name = "Circuit Board (Pod Location Console)" + board_name = "Pod Location Console" build_path = /obj/machinery/computer/podtracker + /obj/item/circuitboard/rdservercontrol - name = "Circuit Board (RD Server Control)" + board_name = "RD Server Control" build_path = /obj/machinery/computer/rdservercontrol + /obj/item/circuitboard/crew - name = "Circuit board (Crew Monitoring Computer)" + board_name = "Crew Monitoring Computer" build_path = /obj/machinery/computer/crew origin_tech = "programming=2;biotech=2" + /obj/item/circuitboard/mech_bay_power_console - name = "Circuit board (Mech Bay Power Control Console)" + board_name = "Mech Bay Power Control Console" build_path = /obj/machinery/computer/mech_bay_power_console origin_tech = "programming=3;powerstorage=3" + /obj/item/circuitboard/ordercomp - name = "Circuit board (Supply Ordering Console)" + board_name = "Supply Ordering Console" build_path = /obj/machinery/computer/supplycomp/public origin_tech = "programming=3" + /obj/item/circuitboard/supplycomp - name = "Circuit board (Supply Shuttle Console)" + board_name = "Supply Shuttle Console" build_path = /obj/machinery/computer/supplycomp origin_tech = "programming=3" var/contraband_enabled = 0 /obj/item/circuitboard/operating - name = "Circuit board (Operating Computer)" + board_name = "Operating Computer" build_path = /obj/machinery/computer/operating origin_tech = "programming=2;biotech=3" /obj/item/circuitboard/shuttle - name = "circuit board (Shuttle)" + board_name = "Shuttle" build_path = /obj/machinery/computer/shuttle var/shuttleId var/possible_destinations = "" /obj/item/circuitboard/labor_shuttle - name = "circuit Board (Labor Shuttle)" + board_name = "Labor Shuttle" build_path = /obj/machinery/computer/shuttle/labor + /obj/item/circuitboard/labor_shuttle/one_way - name = "circuit Board (Prisoner Shuttle Console)" + board_name = "Prisoner Shuttle Console" build_path = /obj/machinery/computer/shuttle/labor/one_way + /obj/item/circuitboard/ferry - name = "circuit Board (Transport Ferry)" + board_name = "Transport Ferry" build_path = /obj/machinery/computer/shuttle/ferry + /obj/item/circuitboard/ferry/request - name = "circuit Board (Transport Ferry Console)" + board_name = "Transport Ferry Console" build_path = /obj/machinery/computer/shuttle/ferry/request + /obj/item/circuitboard/mining_shuttle - name = "circuit Board (Mining Shuttle)" + board_name = "Mining Shuttle" build_path = /obj/machinery/computer/shuttle/mining + /obj/item/circuitboard/white_ship - name = "circuit Board (White Ship)" + board_name = "White Ship" build_path = /obj/machinery/computer/shuttle/white_ship + /obj/item/circuitboard/shuttle/syndicate - name = "circuit board (Syndicate Shuttle)" + board_name = "Syndicate Shuttle" build_path = /obj/machinery/computer/shuttle/syndicate + /obj/item/circuitboard/shuttle/syndicate/recall - name = "circuit board (Syndicate Shuttle Recall Terminal)" + board_name = "Syndicate Shuttle Recall Terminal" build_path = /obj/machinery/computer/shuttle/syndicate/recall + /obj/item/circuitboard/shuttle/syndicate/drop_pod - name = "circuit board (Syndicate Drop Pod)" + board_name = "Syndicate Drop Pod" build_path = /obj/machinery/computer/shuttle/syndicate/drop_pod + /obj/item/circuitboard/shuttle/golem_ship - name = "circuit Board (Golem Ship)" + board_name = "Golem Ship" build_path = /obj/machinery/computer/shuttle/golem_ship /obj/item/circuitboard/HolodeckControl - name = "Circuit board (Holodeck Control)" + board_name = "Holodeck Control" build_path = /obj/machinery/computer/HolodeckControl origin_tech = "programming=4" + /obj/item/circuitboard/aifixer - name = "Circuit board (AI Integrity Restorer)" + board_name = "AI Integrity Restorer" build_path = /obj/machinery/computer/aifixer origin_tech = "programming=2;biotech=2" + /obj/item/circuitboard/area_atmos - name = "Circuit board (Area Air Control)" + board_name = "Area Air Control" build_path = /obj/machinery/computer/area_atmos origin_tech = "programming=2" + /obj/item/circuitboard/telesci_console - name = "Circuit board (Telepad Control Console)" + board_name = "Telepad Control Console" build_path = /obj/machinery/computer/telescience origin_tech = "programming=3;bluespace=3;plasmatech=4" /obj/item/circuitboard/large_tank_control - name = "Circuit board (Atmospheric Tank Control)" + board_name = "Atmospheric Tank Control" build_path = /obj/machinery/computer/general_air_control/large_tank_control origin_tech = "programming=2;engineering=3;materials=2" /obj/item/circuitboard/turbine_computer - name = "circuit board (Turbine Computer)" + board_name = "Turbine Computer" build_path = /obj/machinery/computer/turbine_computer origin_tech = "programming=4;engineering=4;powerstorage=4" -/obj/item/circuitboard/HONKputer - name = "Circuit board (HONKputer)" - build_path = /obj/machinery/computer/HONKputer - origin_tech = "programming=2" - icon = 'icons/obj/machines/HONKputer.dmi' - icon_state = "bananium_board" - board_type = "honkcomputer" +/obj/item/circuitboard/supplycomp/multitool_act(mob/living/user, obj/item/I) + . = TRUE + var/catastasis // Why is it called this + var/opposite_catastasis + if(contraband_enabled) + catastasis = "BROAD" + opposite_catastasis = "STANDARD" + else + catastasis = "STANDARD" + opposite_catastasis = "BROAD" - -/obj/item/circuitboard/supplycomp/attackby(obj/item/I as obj, mob/user as mob, params) - if(istype(I,/obj/item/multitool)) - var/catastasis = contraband_enabled - var/opposite_catastasis - if(catastasis) - opposite_catastasis = "STANDARD" - catastasis = "BROAD" - else - opposite_catastasis = "BROAD" - catastasis = "STANDARD" - - switch( alert("Current receiver spectrum is set to: [catastasis]","Multitool-Circuitboard interface","Switch to [opposite_catastasis]","Cancel") ) - //switch( alert("Current receiver spectrum is set to: " {(contraband_enabled) ? ("BROAD") : ("STANDARD")} , "Multitool-Circuitboard interface" , "Switch to " {(contraband_enabled) ? ("STANDARD") : ("BROAD")}, "Cancel") ) - if("Switch to STANDARD","Switch to BROAD") - contraband_enabled = !contraband_enabled - - if("Cancel") - return - else - to_chat(user, "DERP! BUG! Report this (And what you were doing to cause it) to Agouri") + var/choice = alert("Current receiver spectrum is set to: [catastasis]", "Multitool-Circuitboard interface", "Switch to [opposite_catastasis]", "Cancel") + if(choice == "Cancel") return - return ..() -/obj/item/circuitboard/rdconsole/attackby(obj/item/I as obj, mob/user as mob, params) - if(istype(I,/obj/item/card/id)||istype(I, /obj/item/pda)) + contraband_enabled = !contraband_enabled + playsound(src, 'sound/effects/pop.ogg', 50) + +/obj/item/circuitboard/rdconsole/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/card/id) || istype(I, /obj/item/pda)) if(allowed(user)) user.visible_message("[user] waves [user.p_their()] ID past [src]'s access protocol scanner.", "You swipe your ID past [src]'s access protocol scanner.") var/console_choice = input(user, "What do you want to configure the access to?", "Access Modification", "R&D Core") as null|anything in access_types - if(console_choice == null) + if(!console_choice) return switch(console_choice) if("R&D Core") - name = "Circuit Board (RD Console)" + board_name = "RD Console" build_path = /obj/machinery/computer/rdconsole/core - id = 1 if("Robotics") - name = "Circuit Board (RD Console - Robotics)" + board_name = "RD Console - Robotics" build_path = /obj/machinery/computer/rdconsole/robotics - id = 2 if("E.X.P.E.R.I-MENTOR") - name = "Circuit Board (RD Console - E.X.P.E.R.I-MENTOR)" + board_name = "RD Console - E.X.P.E.R.I-MENTOR" build_path = /obj/machinery/computer/rdconsole/experiment - id = 3 if("Mechanics") - name = "Circuit Board (RD Console - Mechanics)" + board_name = "RD Console - Mechanics" build_path = /obj/machinery/computer/rdconsole/mechanics - id = 4 if("Public") - name = "Circuit Board (RD Console - Public)" + board_name = "RD Console - Public" build_path = /obj/machinery/computer/rdconsole/public - id = 5 + format_board_name() to_chat(user, "Access protocols set to [console_choice].") else to_chat(user, "Access Denied") return return ..() -/obj/structure/computerframe/attackby(obj/item/P as obj, mob/user as mob, params) - switch(state) - if(0) - if(istype(P, /obj/item/wrench)) - playsound(loc, P.usesound, 50, 1) - if(do_after(user, 20 * P.toolspeed, target = src)) - to_chat(user, "You wrench the frame into place.") - anchored = 1 - state = 1 - return - if(1) - if(istype(P, /obj/item/wrench)) - playsound(loc, P.usesound, 50, 1) - if(do_after(user, 20 * P.toolspeed, target = src)) - to_chat(user, "You unfasten the frame.") - anchored = 0 - state = 0 - return - if(istype(P, /obj/item/circuitboard) && !circuit) - var/obj/item/circuitboard/B = P - if(B.board_type == "computer") - playsound(loc, B.usesound, 50, 1) - to_chat(user, "You place the circuit board inside the frame.") - icon_state = "1" - circuit = P - user.drop_item() - P.loc = src - else - to_chat(user, "This frame does not accept circuit boards of this type!") - return - if(istype(P, /obj/item/screwdriver) && circuit) - playsound(loc, P.usesound, 50, 1) - to_chat(user, "You screw the circuit board into place.") - state = 2 - icon_state = "2" - return - if(istype(P, /obj/item/crowbar) && circuit) - playsound(loc, P.usesound, 50, 1) - to_chat(user, "You remove the circuit board.") - state = 1 - icon_state = "0" - circuit.loc = loc - circuit = null - return - if(2) - if(istype(P, /obj/item/screwdriver) && circuit) - playsound(loc, P.usesound, 50, 1) - to_chat(user, "You unfasten the circuit board.") - state = 1 - icon_state = "1" - return - if(istype(P, /obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/C = P - if(C.get_amount() >= 5) - playsound(loc, C.usesound, 50, 1) - to_chat(user, "You start to add cables to the frame.") - if(do_after(user, 20 * C.toolspeed, target = src)) - if(state == 2 && C.get_amount() >= 5 && C.use(5)) - to_chat(user, "You add cables to the frame.") - state = 3 - icon_state = "3" - else - to_chat(user, "At some point during construction you lost some cable. Make sure you have five lengths before trying again.") - return - else - to_chat(user, "You need five lengths of cable to wire the frame.") - return - if(3) - if(istype(P, /obj/item/wirecutters)) - playsound(loc, P.usesound, 50, 1) - to_chat(user, "You remove the cables.") - state = 2 - icon_state = "2" - var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( loc ) - A.amount = 5 - return - if(istype(P, /obj/item/stack/sheet/glass)) - var/obj/item/stack/sheet/glass/G = P - if(G.get_amount() >= 2) - playsound(loc, G.usesound, 50, 1) - to_chat(user, "You start to add the glass panel to the frame.") - if(do_after(user, 20 * G.toolspeed, target = src)) - if(state == 3 && G.get_amount() >= 2 && G.use(2)) - to_chat(user, "You put in the glass panel.") - state = 4 - icon_state = "4" - else - to_chat(user, "At some point during construction you lost some glass. Make sure you have two sheets before trying again.") - return - else - to_chat(user, "You need two sheets of glass for this.") - return - if(4) - if(istype(P, /obj/item/crowbar)) - playsound(loc, P.usesound, 50, 1) - to_chat(user, "You remove the glass panel.") - state = 3 - icon_state = "3" - new /obj/item/stack/sheet/glass(loc, 2) - return - if(istype(P, /obj/item/screwdriver)) - playsound(loc, P.usesound, 50, 1) - to_chat(user, "You connect the monitor.") - var/B = new circuit.build_path (loc) - if(circuit.powernet) B:powernet = circuit.powernet - if(circuit.id) B:id = circuit.id - if(circuit.records) B:records = circuit.records - if(circuit.frequency) B:frequency = circuit.frequency - if(istype(circuit,/obj/item/circuitboard/supplycomp)) - var/obj/machinery/computer/supplycomp/SC = B - var/obj/item/circuitboard/supplycomp/C = circuit - SC.can_order_contraband = C.contraband_enabled - qdel(src) - return - if(user.a_intent == INTENT_HARM) - return ..() +// Construction | Deconstruction +#define STATE_EMPTY 1 // Add a circuitboard | Weld to destroy +#define STATE_CIRCUIT 2 // Screwdriver the cover closed | Crowbar the circuit +#define STATE_NOWIRES 3 // Add wires | Screwdriver the cover open +#define STATE_WIRES 4 // Add glass | Remove wires +#define STATE_GLASS 5 // Screwdriver to complete | Crowbar glass out +/obj/structure/computerframe + name = "computer frame" + icon = 'icons/obj/stock_parts.dmi' + icon_state = "comp_frame_1" + density = TRUE + anchored = TRUE + max_integrity = 100 + var/state = STATE_EMPTY + var/obj/item/circuitboard/circuit = null + +/obj/structure/computerframe/deconstruct(disassembled = TRUE) + if(!(flags & NODECONSTRUCT)) + drop_computer_parts() + return ..() // will qdel the frame + +/obj/structure/computerframe/obj_break(damage_flag) + deconstruct() + +/obj/structure/computerframe/proc/drop_computer_parts() + var/location = drop_location() + new /obj/item/stack/sheet/metal(location, 5) + if(circuit) + circuit.forceMove(location) + circuit = null + if(state >= STATE_WIRES) + var/obj/item/stack/cable_coil/C = new(location) + C.amount = 5 + if(state == STATE_GLASS) + new /obj/item/stack/sheet/glass(location, 2) + +/obj/structure/computerframe/update_icon() + . = ..() + icon_state = "comp_frame_[state]" /obj/structure/computerframe/welder_act(mob/user, obj/item/I) - if(state) + if(state != STATE_EMPTY) return . = TRUE if(!I.tool_use_check(user, 0)) return WELDER_ATTEMPT_SLICING_MESSAGE - if(I.use_tool(src, user, 50, volume = I.tool_volume) && !state) - to_chat(user, "You deconstruct [src].") + if(I.use_tool(src, user, 50, volume = I.tool_volume)) + WELDER_SLICING_SUCCESS_MESSAGE deconstruct(TRUE) +/obj/structure/computerframe/wrench_act(mob/living/user, obj/item/I) + . = TRUE + if(!I.use_tool(src, user, 2 SECONDS, volume = I.tool_volume)) + return + if(anchored) + to_chat(user, "You unfasten the frame.") + anchored = FALSE + else + to_chat(user, "You wrench the frame into place.") + anchored = TRUE -/obj/structure/computerframe/HONKputer - name = "Bananium Computer-frame" - icon = 'icons/obj/machines/HONKputer.dmi' - base_mineral = /obj/item/stack/sheet/mineral/bananium +/obj/structure/computerframe/crowbar_act(mob/living/user, obj/item/I) + . = TRUE + if(!I.use_tool(src, user)) + return + + if(state == STATE_CIRCUIT) + to_chat(user, "You remove the circuit board.") + state = STATE_EMPTY + name = initial(name) + circuit.forceMove(drop_location()) + circuit = null + else if(state == STATE_GLASS) + to_chat(user, "You remove the glass panel.") + state = STATE_WIRES + new /obj/item/stack/sheet/glass(drop_location(), 2) + else + return + + I.play_tool_sound(src) + update_icon() + +/obj/structure/computerframe/screwdriver_act(mob/living/user, obj/item/I) + . = TRUE + if(!I.use_tool(src, user)) + return -/obj/structure/computerframe/HONKputer/attackby(obj/item/P as obj, mob/user as mob, params) switch(state) - if(0) - if(istype(P, /obj/item/wrench)) - playsound(loc, P.usesound, 50, 1) - if(do_after(user, 20, target = src)) - to_chat(user, "You wrench the frame into place.") - anchored = 1 - state = 1 - if(1) - if(istype(P, /obj/item/wrench)) - playsound(loc, P.usesound, 50, 1) - if(do_after(user, 20 * P.toolspeed, target = src)) - to_chat(user, "You unfasten the frame.") - anchored = 0 - state = 0 - if(istype(P, /obj/item/circuitboard) && !circuit) - var/obj/item/circuitboard/B = P - if(B.board_type == "honkcomputer") - playsound(loc, P.usesound, 50, 1) - to_chat(user, "You place the circuit board inside the frame.") - icon_state = "1" - circuit = P - user.drop_item() - P.loc = src - else - to_chat(user, "This frame does not accept circuit boards of this type!") - if(istype(P, /obj/item/screwdriver) && circuit) - playsound(loc, P.usesound, 50, 1) - to_chat(user, "You screw the circuit board into place.") - state = 2 - icon_state = "2" - if(istype(P, /obj/item/crowbar) && circuit) - playsound(loc, P.usesound, 50, 1) - to_chat(user, "You remove the circuit board.") - state = 1 - icon_state = "0" - circuit.loc = loc - circuit = null - return - if(2) - if(istype(P, /obj/item/screwdriver) && circuit) - playsound(loc, P.usesound, 50, 1) - to_chat(user, "You unfasten the circuit board.") - state = 1 - icon_state = "1" - if(istype(P, /obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/C = P - if(C.get_amount() >= 5) - playsound(loc, C.usesound, 50, 1) - to_chat(user, "You start to add cables to the frame.") - if(do_after(user, 20 * C.toolspeed, target = src)) - if(state == 2 && C.get_amount() >= 5 && C.use(5)) - to_chat(user, "You add cables to the frame.") - state = 3 - icon_state = "3" - else - to_chat(user, "At some point during construction you lost some cable. Make sure you have five lengths before trying again.") - return - else - to_chat(user, "You need five lengths of cable to wire the frame.") - return - if(3) - if(istype(P, /obj/item/wirecutters)) - playsound(loc, P.usesound, 50, 1) - to_chat(user, "You remove the cables.") - state = 2 - icon_state = "2" - var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( loc ) - A.amount = 5 + if(STATE_CIRCUIT) + to_chat(user, "You screw the circuit board into place.") + state = STATE_NOWIRES + I.play_tool_sound(src) + update_icon() + if(STATE_NOWIRES) + to_chat(user, "You unfasten the circuit board.") + state = STATE_CIRCUIT + I.play_tool_sound(src) + update_icon() + if(STATE_GLASS) + to_chat(user, "You connect the monitor.") + I.play_tool_sound(src) + var/B = new circuit.build_path(loc) + if(istype(circuit, /obj/item/circuitboard/supplycomp)) + var/obj/machinery/computer/supplycomp/SC = B + var/obj/item/circuitboard/supplycomp/C = circuit + SC.can_order_contraband = C.contraband_enabled + qdel(src) - if(istype(P, /obj/item/stack/sheet/glass)) - var/obj/item/stack/sheet/glass/G = P - if(G.get_amount() >= 2) - playsound(loc, G.usesound, 50, 1) - to_chat(user, "You start to add the glass panel to the frame.") - if(do_after(user, 20 * G.toolspeed, target = src)) - if(state == 3 && G.get_amount() >= 2 && G.use(2)) - to_chat(user, "You put in the glass panel.") - state = 4 - icon_state = "4" - else - to_chat(user, "At some point during construction you lost some glass. Make sure you have two sheets before trying again.") - return - else - to_chat(user, "You need two sheets of glass for this.") +/obj/structure/computerframe/wirecutter_act(mob/living/user, obj/item/I) + . = TRUE + if(!I.use_tool(src, user)) + return + + if(state == STATE_WIRES) + to_chat(user, "You remove the cables.") + var/obj/item/stack/cable_coil/C = new(drop_location()) + C.amount = 5 + state = STATE_NOWIRES + I.play_tool_sound(src) + update_icon() + +/obj/structure/computerframe/attackby(obj/item/I, mob/user, params) + switch(state) + if(STATE_EMPTY) + if(!istype(I, /obj/item/circuitboard)) + return ..() + + var/obj/item/circuitboard/B = I + if(B.board_type != "computer") + to_chat(user, "[src] does not accept circuit boards of this type!") + return + + B.play_tool_sound(src) + to_chat(user, "You place [B] inside [src].") + name += " ([B.board_name])" + state = STATE_CIRCUIT + user.drop_item() + B.forceMove(src) + circuit = B + update_icon() return - if(4) - if(istype(P, /obj/item/crowbar)) - playsound(loc, P.usesound, 50, 1) - to_chat(user, "You remove the glass panel.") - state = 3 - icon_state = "3" - new /obj/item/stack/sheet/glass(loc, 2) - if(istype(P, /obj/item/screwdriver)) - playsound(loc, P.usesound, 50, 1) - to_chat(user, "You connect the monitor.") - var/B = new circuit.build_path (loc) - if(circuit.powernet) B:powernet = circuit.powernet - if(circuit.id) B:id = circuit.id - if(circuit.records) B:records = circuit.records - if(circuit.frequency) B:frequency = circuit.frequency - qdel(src) + + if(STATE_NOWIRES) + if(!istype(I, /obj/item/stack/cable_coil)) + return ..() + + var/obj/item/stack/cable_coil/C = I + if(C.get_amount() < 5) + to_chat(user, "You need five lengths of cable to wire the frame.") + return + + C.play_tool_sound(src) + to_chat(user, "You start to add cables to the frame.") + if(!do_after(user, 2 SECONDS * C.toolspeed, target = src)) + return + if(C.get_amount() < 5 || !C.use(5)) + to_chat(user, "At some point during construction you lost some cable. Make sure you have five lengths before trying again.") + return + + to_chat(user, "You add cables to the frame.") + state = STATE_WIRES + update_icon() return + + if(STATE_WIRES) + if(!istype(I, /obj/item/stack/sheet/glass)) + return ..() + + var/obj/item/stack/sheet/glass/G = I + if(G.get_amount() < 2) + to_chat(user, "You need two sheets of glass for this.") + return + + G.play_tool_sound(src) + to_chat(user, "You start to add the glass panel to the frame.") + if(!do_after(user, 2 SECONDS * G.toolspeed, target = src)) + return + if(G.get_amount() < 2 || !G.use(2)) + to_chat(user, "At some point during construction you lost some glass. Make sure you have two sheets before trying again.") + return + + to_chat(user, "You put in the glass panel.") + state = STATE_GLASS + update_icon() + return + return ..() + +#undef STATE_EMPTY +#undef STATE_CIRCUIT +#undef STATE_NOWIRES +#undef STATE_WIRES +#undef STATE_GLASS diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm index bc1bfe6135b..55be5527a0d 100644 --- a/code/game/machinery/computer/camera_advanced.dm +++ b/code/game/machinery/computer/camera_advanced.dm @@ -75,7 +75,7 @@ for(var/obj/machinery/camera/C in GLOB.cameranet.cameras) if(!C.can_use()) continue - if(C.network&networks) + if(length(C.network & networks)) camera_location = get_turf(C) break if(camera_location) @@ -101,6 +101,8 @@ /mob/camera/aiEye/remote name = "Inactive Camera Eye" + // Abductors dont trigger the Ai Detector + ai_detector_visible = FALSE var/sprint = 10 var/cooldown = 0 var/acceleration = 1 diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm index f18d378fff4..1c394d261f6 100644 --- a/code/game/machinery/computer/computer.dm +++ b/code/game/machinery/computer/computer.dm @@ -130,6 +130,7 @@ if(circuit) //no circuit, no computer frame var/obj/structure/computerframe/A = new /obj/structure/computerframe(loc) var/obj/item/circuitboard/M = new circuit(A) + A.name += " ([M.board_name])" A.setDir(dir) A.circuit = M A.anchored = TRUE @@ -140,13 +141,12 @@ playsound(src, 'sound/effects/hit_on_shattered_glass.ogg', 70, TRUE) new /obj/item/shard(drop_location()) new /obj/item/shard(drop_location()) - A.state = 3 - A.icon_state = "3" + A.state = 4 else if(user) to_chat(user, "You disconnect the monitor.") - A.state = 4 - A.icon_state = "4" + A.state = 5 + A.update_icon() for(var/obj/C in src) C.forceMove(loc) qdel(src) diff --git a/code/game/machinery/computer/honkputer.dm b/code/game/machinery/computer/honkputer.dm deleted file mode 100644 index 6990e1c3dc8..00000000000 --- a/code/game/machinery/computer/honkputer.dm +++ /dev/null @@ -1,118 +0,0 @@ -/obj/machinery/computer/HONKputer - name = "\improper HONKputer Mark I" - desc = "A yellow computer used in case of critically low levels of HONK." - icon = 'icons/obj/machines/HONKputer.dmi' - icon_state = "honkputer" - icon_keyboard = "key_honk" - icon_screen = "honkcomms" - light_color = LIGHT_COLOR_PINK - req_access = list(ACCESS_CLOWN) - circuit = /obj/item/circuitboard/HONKputer - var/authenticated = 0 - var/message_cooldown = 0 - var/state = STATE_DEFAULT - var/const/STATE_DEFAULT = 1 - -/obj/machinery/computer/HONKputer/process() - if(..()) - src.updateDialog() - -/obj/machinery/computer/HONKputer/Topic(href, href_list) - if(..()) - return 1 - if(is_away_level(src.z)) - to_chat(usr, "Unable to establish a connection: You're too far away from the station!") - return - usr.set_machine(src) - - if(!href_list["operation"]) - return - switch(href_list["operation"]) - // main interface - if("main") - src.state = STATE_DEFAULT - if("login") - var/mob/M = usr - var/obj/item/card/id/I = M.get_active_hand() - if(istype(I, /obj/item/pda)) - var/obj/item/pda/pda = I - I = pda.id - if(I && istype(I)) - if(src.check_access(I) || src.emagged==1) - authenticated = 1 - if("logout") - authenticated = 0 - - if("MessageHonkplanet") - if(src.authenticated==1) - if(message_cooldown) - to_chat(usr, "Arrays recycling. Please stand by.") - return - var/input = stripped_input(usr, "Please choose a message to transmit to your HONKbrothers on the homeworld. Transmission does not guarantee a response.", "To abort, send an empty message.", "") - if(!input || !(usr in view(1,src))) - return - HONK_announce(input, usr) - to_chat(usr, "Message transmitted.") - log_game("[key_name(usr)] has made a HONKplanet announcement: [input]") - message_cooldown = 1 - spawn(6000)//10 minute cooldown - message_cooldown = 0 - - src.updateUsrDialog() - -/obj/machinery/computer/HONKputer/emag_act(user as mob) - if(!emagged) - src.emagged = 1 - to_chat(user, "You scramble the login circuits, allowing anyone to use the console!") - -/obj/machinery/computer/HONKputer/attack_hand(mob/user as mob) - if(..()) - return - if(is_away_level(src.z)) - to_chat(user, "Unable to establish a connection: You're too far away from the station!") - return - - user.set_machine(src) - var/dat = "HONKputer Interface" - - if(istype(user, /mob/living/silicon)) - to_chat(user, "This console is not networked to the rest of the grid.") - return - - switch(src.state) - if(STATE_DEFAULT) - if(src.authenticated) - dat += "
\[ Log Out \]" - dat += "
\[ Send an emergency message to Honkplanet \]" - else - dat += "
\[ Log In \]" - - - dat += "
\[ [(src.state != STATE_DEFAULT) ? "Main Menu | " : ""]Close \]" - user << browse(dat, "window=honkputer;size=400x500") - onclose(user, "honkputer") - - -/obj/machinery/computer/HONKputer/attackby(obj/I, mob/user, params) - if(istype(I, /obj/item/screwdriver) && circuit) - var/obj/item/screwdriver/S = I - playsound(src.loc, S.usesound, 50, 1) - if(do_after(user, 20 * S.toolspeed, target = src)) - var/obj/structure/computerframe/HONKputer/A = new /obj/structure/computerframe/HONKputer( src.loc ) - var/obj/item/circuitboard/M = new circuit( A ) - A.circuit = M - A.anchored = 1 - for(var/obj/C in src) - C.loc = src.loc - if(src.stat & BROKEN) - to_chat(user, "The broken glass falls out.") - new /obj/item/shard( src.loc ) - A.state = 3 - A.icon_state = "3" - else - to_chat(user, "You disconnect the monitor.") - A.state = 4 - A.icon_state = "4" - qdel(src) - else - return ..() diff --git a/code/game/machinery/computer/salvage_ship.dm b/code/game/machinery/computer/salvage_ship.dm deleted file mode 100644 index 917849101a5..00000000000 --- a/code/game/machinery/computer/salvage_ship.dm +++ /dev/null @@ -1,110 +0,0 @@ -#define SALVAGE_SHIP_MOVE_TIME 300 -#define SALVAGE_SHIP_COOLDOWN 800 - -/obj/machinery/computer/salvage_ship - name = "salvage ship terminal" - icon = 'icons/obj/computer.dmi' - icon_keyboard = "syndie_key" - icon_screen = "syndishuttle" - req_access = list(ACCESS_SALVAGE_CAPTAIN) - var/area/curr_location - var/moving = 0 - var/lastMove = 0 - - -/obj/machinery/computer/salvage_ship/New() - . = ..() - curr_location = locate(/area/shuttle/salvage/start) - - -/obj/machinery/computer/salvage_ship/proc/salvage_move_to(area/destination as area) - if(moving) return - if(lastMove + SALVAGE_SHIP_COOLDOWN > world.time) return - var/area/dest_location = locate(destination) - if(curr_location == dest_location) return - - moving = 1 - lastMove = world.time - - if(curr_location.z != dest_location.z) - var/area/transit_location = locate(/area/shuttle/salvage/transit) - curr_location.move_contents_to(transit_location) - curr_location = transit_location - sleep(SALVAGE_SHIP_MOVE_TIME) - - curr_location.move_contents_to(dest_location) - curr_location = dest_location - moving = 0 - return 1 - -/obj/machinery/computer/salvage_ship/attack_ai(mob/user as mob) - src.add_hiddenprint(user) - return attack_hand(user) - -/obj/machinery/computer/salvage_ship/attack_hand(mob/user as mob) - if(!allowed(user)) - to_chat(user, "Access Denied") - return - - user.set_machine(src) - - var/dat = {"Location: [curr_location]
- Ready to move[max(lastMove + SALVAGE_SHIP_COOLDOWN - world.time, 0) ? " in [max(round((lastMove + SALVAGE_SHIP_COOLDOWN - world.time) * 0.1), 0)] seconds" : ": now"]
- Middle of Nowhere
- Station Auxiliary Docking | - North of the Station | - East of the Station | - South of the Station
- Trading Post
- Clown Asteroid | - Derelict Station | - Ruskie DJ Station
- Communications Satellite | - Abandoned Ship
- Close"} - - user << browse(dat, "window=computer;size=575x450") - onclose(user, "computer") - return - - -/obj/machinery/computer/salvage_ship/Topic(href, href_list) - if(..()) - return 1 - if(!isliving(usr)) return - var/mob/living/user = usr - - if(in_range(src, user) || istype(user, /mob/living/silicon)) - user.set_machine(src) - - if(href_list["salvage"]) - salvage_move_to(/area/shuttle/salvage/start) - else if(href_list["start"]) - salvage_move_to(/area/shuttle/salvage/start) - else if(href_list["arrivals"]) - salvage_move_to(/area/shuttle/salvage/arrivals) - else if(href_list["derelict"]) - salvage_move_to(/area/shuttle/salvage/derelict) - else if(href_list["djstation"]) - salvage_move_to(/area/shuttle/salvage/djstation) - else if(href_list["north"]) - salvage_move_to(/area/shuttle/salvage/north) - else if(href_list["east"]) - salvage_move_to(/area/shuttle/salvage/east) - else if(href_list["south"]) - salvage_move_to(/area/shuttle/salvage/south) - else if(href_list["commssat"]) - salvage_move_to(/area/shuttle/salvage/commssat) - else if(href_list["abandoned_ship"]) - salvage_move_to(/area/shuttle/salvage/abandoned_ship) - else if(href_list["clown_asteroid"]) - salvage_move_to(/area/shuttle/salvage/clown_asteroid) - else if(href_list["trading_post"]) - salvage_move_to(/area/shuttle/salvage/trading_post) - - add_fingerprint(usr) - updateUsrDialog() - return - -/obj/machinery/computer/salvage_ship/bullet_act(obj/item/projectile/Proj) - visible_message("[Proj] ricochets off [src]!") diff --git a/code/game/machinery/computer/specops_shuttle.dm b/code/game/machinery/computer/specops_shuttle.dm deleted file mode 100644 index 216c4fd8b67..00000000000 --- a/code/game/machinery/computer/specops_shuttle.dm +++ /dev/null @@ -1,338 +0,0 @@ -//Config stuff -#define SPECOPS_MOVETIME 600 //Time to station is milliseconds. 60 seconds, enough time for everyone to be on the shuttle before it leaves. -#define SPECOPS_STATION_AREATYPE "/area/shuttle/specops/station" //Type of the spec ops shuttle area for station -#define SPECOPS_DOCK_AREATYPE "/area/shuttle/specops/centcom" //Type of the spec ops shuttle area for dock -#define SPECOPS_RETURN_DELAY 6000 //Time between the shuttle is capable of moving. - -GLOBAL_VAR_INIT(specops_shuttle_moving_to_station, 0) -GLOBAL_VAR_INIT(specops_shuttle_moving_to_centcom, 0) -GLOBAL_VAR_INIT(specops_shuttle_at_station, 0) -GLOBAL_VAR_INIT(specops_shuttle_can_send, 1) -GLOBAL_VAR_INIT(specops_shuttle_time, 0) -GLOBAL_VAR_INIT(specops_shuttle_timeleft, 0) - -/obj/machinery/computer/specops_shuttle - name = "\improper Spec. Ops. shuttle console" - icon = 'icons/obj/computer.dmi' - icon_keyboard = "security_key" - icon_screen = "syndishuttle" - light_color = LIGHT_COLOR_PURE_CYAN - req_access = list(ACCESS_CENT_SPECOPS) -// req_access = list(ACCESS_CENT_SPECOPS) - var/temp = null - var/hacked = 0 - var/allowedtocall = 0 - var/specops_shuttle_timereset = 0 - -/proc/specops_return() - var/obj/item/radio/intercom/announcer = new /obj/item/radio/intercom(null)//We need a fake AI to announce some stuff below. Otherwise it will be wonky. - announcer.config(list("Response Team" = 0)) - - var/message_tracker[] = list(0,1,2,3,5,10,30,45)//Create a a list with potential time values. - var/message = "\"THE SPECIAL OPERATIONS SHUTTLE IS PREPARING TO RETURN\""//Initial message shown. - if(announcer) - announcer.autosay(message, "A.L.I.C.E.", "Response Team", list(1,2)) - - while(GLOB.specops_shuttle_time - world.timeofday > 0) - var/ticksleft = GLOB.specops_shuttle_time - world.timeofday - - if(ticksleft > 1e5) - GLOB.specops_shuttle_time = world.timeofday + 10 // midnight rollover - GLOB.specops_shuttle_timeleft = (ticksleft / 10) - - //All this does is announce the time before launch. - if(announcer) - var/rounded_time_left = round(GLOB.specops_shuttle_timeleft)//Round time so that it will report only once, not in fractions. - if(rounded_time_left in message_tracker)//If that time is in the list for message announce. - message = "\"ALERT: [rounded_time_left] SECOND[(rounded_time_left!=1)?"S":""] REMAIN\"" - if(rounded_time_left==0) - message = "\"ALERT: TAKEOFF\"" - announcer.autosay(message, "A.L.I.C.E.", "Response Team") - message_tracker -= rounded_time_left//Remove the number from the list so it won't be called again next cycle. - //Should call all the numbers but lag could mean some issues. Oh well. Not much I can do about that. - - sleep(5) - - GLOB.specops_shuttle_moving_to_station = 0 - GLOB.specops_shuttle_moving_to_centcom = 0 - - GLOB.specops_shuttle_at_station = 1 - - var/area/start_location = locate(/area/shuttle/specops/station) - var/area/end_location = locate(/area/shuttle/specops/centcom) - - var/list/dstturfs = list() - var/throwy = world.maxy - - for(var/turf/T in end_location) - dstturfs += T - if(T.y < throwy) - throwy = T.y - - // hey you, get out of the way! - for(var/turf/T in dstturfs) - // find the turf to move things to - var/turf/D = locate(T.x, throwy - 1, 1) - //var/turf/E = get_step(D, SOUTH) - for(var/atom/movable/AM as mob|obj in T) - AM.Move(D) - if(istype(T, /turf/simulated)) - qdel(T) - - for(var/mob/living/carbon/bug in end_location) // If someone somehow is still in the shuttle's docking area... - bug.gib() - - for(var/mob/living/simple_animal/pest in end_location) // And for the other kind of bug... - pest.gib() - - start_location.move_contents_to(end_location) - - for(var/turf/T in get_area_turfs(end_location) ) - var/mob/M = locate(/mob) in T - to_chat(M, "You have arrived at Central Command. Operation has ended!") - - GLOB.specops_shuttle_at_station = 0 - - for(var/obj/machinery/computer/specops_shuttle/S in GLOB.machines) - S.specops_shuttle_timereset = world.time + SPECOPS_RETURN_DELAY - - qdel(announcer) - -/proc/specops_process() - var/area/centcom/specops/special_ops = locate()//Where is the specops area located? - var/obj/item/radio/intercom/announcer = new /obj/item/radio/intercom(null)//We need a fake AI to announce some stuff below. Otherwise it will be wonky. - announcer.config(list("Response Team" = 0)) - - var/message_tracker[] = list(0,1,2,3,5,10,30,45)//Create a a list with potential time values. - var/message = "\"THE SPECIAL OPERATIONS SHUTTLE IS PREPARING FOR LAUNCH\""//Initial message shown. - if(announcer) - announcer.autosay(message, "A.L.I.C.E.", "Response Team") - //message = "ARMORED SQUAD TAKE YOUR POSITION ON GRAVITY LAUNCH PAD" - //announcer.autosay(message, "A.L.I.C.E.", "Response Team") - - while(GLOB.specops_shuttle_time - world.timeofday > 0) - var/ticksleft = GLOB.specops_shuttle_time - world.timeofday - - if(ticksleft > 1e5) - GLOB.specops_shuttle_time = world.timeofday + 10 // midnight rollover - GLOB.specops_shuttle_timeleft = (ticksleft / 10) - - //All this does is announce the time before launch. - if(announcer) - var/rounded_time_left = round(GLOB.specops_shuttle_timeleft)//Round time so that it will report only once, not in fractions. - if(rounded_time_left in message_tracker)//If that time is in the list for message announce. - message = "\"ALERT: [rounded_time_left] SECOND[(rounded_time_left!=1)?"S":""] REMAIN\"" - if(rounded_time_left==0) - message = "\"ALERT: TAKEOFF\"" - announcer.autosay(message, "A.L.I.C.E.", "Response Team") - message_tracker -= rounded_time_left//Remove the number from the list so it won't be called again next cycle. - //Should call all the numbers but lag could mean some issues. Oh well. Not much I can do about that. - - sleep(5) - - GLOB.specops_shuttle_moving_to_station = 0 - GLOB.specops_shuttle_moving_to_centcom = 0 - - GLOB.specops_shuttle_at_station = 1 - if(GLOB.specops_shuttle_moving_to_station || GLOB.specops_shuttle_moving_to_centcom) return - - if(!specops_can_move()) - to_chat(usr, "The Special Operations shuttle is unable to leave.") - return - - //Begin Marauder launchpad. - spawn(0)//So it parallel processes it. - for(var/obj/machinery/door/poddoor/M in special_ops) - switch(M.id_tag) - if("ASSAULT0") - spawn(10)//1 second delay between each. - M.open() - if("ASSAULT1") - spawn(20) - M.open() - if("ASSAULT2") - spawn(30) - M.open() - if("ASSAULT3") - spawn(40) - M.open() - - sleep(10) - - var/spawn_marauder[] = new() - for(var/thing in GLOB.landmarks_list) - var/obj/effect/landmark/L = thing - if(L.name == "Marauder Entry") - spawn_marauder.Add(L.loc) - for(var/thing in GLOB.landmarks_list) - var/obj/effect/landmark/L = thing - if(L.name == "Marauder Exit") - var/obj/effect/portal/P = new(L.loc, pick(spawn_marauder)) - //P.invisibility = 101//So it is not seen by anyone. - P.failchance = 0//So it has no fail chance when teleporting. - spawn_marauder.Remove(P.target) - - sleep(10) - - for(var/obj/machinery/mass_driver/M in special_ops) - switch(M.id_tag) - if("ASSAULT0") - spawn(10) - M.drive() - if("ASSAULT1") - spawn(20) - M.drive() - if("ASSAULT2") - spawn(30) - M.drive() - if("ASSAULT3") - spawn(40) - M.drive() - - sleep(50)//Doors remain open for 5 seconds. - - for(var/obj/machinery/door/poddoor/M in special_ops) - switch(M.id_tag)//Doors close at the same time. - if("ASSAULT0") - spawn(0) - M.close() - if("ASSAULT1") - spawn(0) - M.close() - if("ASSAULT2") - spawn(0) - M.close() - if("ASSAULT3") - spawn(0) - M.close() - //End Marauder launchpad. - - var/area/start_location = locate(/area/shuttle/specops/centcom) - var/area/end_location = locate(/area/shuttle/specops/station) - - var/list/dstturfs = list() - var/throwy = world.maxy - - for(var/turf/T in end_location) - dstturfs += T - if(T.y < throwy) - throwy = T.y - - // hey you, get out of the way! - for(var/turf/T in dstturfs) - // find the turf to move things to - var/turf/D = locate(T.x, throwy - 1, 1) - //var/turf/E = get_step(D, SOUTH) - for(var/atom/movable/AM as mob|obj in T) - AM.Move(D) - if(istype(T, /turf/simulated)) - qdel(T) - - start_location.move_contents_to(end_location) - - for(var/turf/T in get_area_turfs(end_location) ) - var/mob/M = locate(/mob) in T - to_chat(M, "You have arrived to [station_name()]. Commence operation!") - - for(var/obj/machinery/computer/specops_shuttle/S in GLOB.machines) - S.specops_shuttle_timereset = world.time + SPECOPS_RETURN_DELAY - - qdel(announcer) - -/proc/specops_can_move() - if(GLOB.specops_shuttle_moving_to_station || GLOB.specops_shuttle_moving_to_centcom) - return 0 - for(var/obj/machinery/computer/specops_shuttle/S in GLOB.machines) - if(world.timeofday <= S.specops_shuttle_timereset) - return 0 - return 1 - -/obj/machinery/computer/specops_shuttle/attack_ai(mob/user as mob) - to_chat(user, "Access Denied.") - return 1 - -/obj/machinery/computer/specops_shuttle/attackby(I as obj, user as mob, params) - if(istype(I,/obj/item/card/emag)) - to_chat(user, "The electronic systems in this console are far too advanced for your primitive hacking peripherals.") - else - return ..() - -/obj/machinery/computer/specops_shuttle/attack_hand(mob/user as mob) - if(!allowed(user)) - to_chat(user, "Access Denied.") - return - -//Commented out so admins can do shenanigans at their leisure. Also makes the force-spawned admin ERTs able to use the shuttle. -// if(sent_strike_team == 0 && send_emergency_team == 0) -// to_chat(usr, "The strike team has not yet deployed.") -// return - - if(..()) - return - - user.machine = src - var/dat - if(temp) - dat = temp - else - dat += {"
Special Operations Shuttle
- \nLocation: [GLOB.specops_shuttle_moving_to_station || GLOB.specops_shuttle_moving_to_centcom ? "Departing for [station_name()] in ([GLOB.specops_shuttle_timeleft] seconds.)":GLOB.specops_shuttle_at_station ? "Station":"Dock"]
- [GLOB.specops_shuttle_moving_to_station || GLOB.specops_shuttle_moving_to_centcom ? "\n*The Special Ops. shuttle is already leaving.*
\n
":GLOB.specops_shuttle_at_station ? "\nShuttle standing by...
\n
":"\nDepart to [station_name()]
\n
"] - \nClose"} - - user << browse(dat, "window=computer;size=575x450") - onclose(user, "computer") - return - -/obj/machinery/computer/specops_shuttle/Topic(href, href_list) - if(..()) - return 1 - - if((usr.contents.Find(src) || (in_range(src, usr) && istype(loc, /turf))) || (istype(usr, /mob/living/silicon))) - usr.machine = src - - if(href_list["sendtodock"]) - if(!GLOB.specops_shuttle_at_station|| GLOB.specops_shuttle_moving_to_station || GLOB.specops_shuttle_moving_to_centcom) return - - if(!specops_can_move()) - to_chat(usr, "Central Command will not allow the Special Operations shuttle to return yet.") - if(world.timeofday <= specops_shuttle_timereset) - if(((world.timeofday - specops_shuttle_timereset)/10) > 60) - to_chat(usr, "[-((world.timeofday - specops_shuttle_timereset)/10)/60] minutes remain!") - to_chat(usr, "[-(world.timeofday - specops_shuttle_timereset)/10] seconds remain!") - return - - to_chat(usr, "The Special Operations shuttle will arrive at Central Command in [(SPECOPS_MOVETIME/10)] seconds.") - - temp += "Shuttle departing.

OK" - updateUsrDialog() - - GLOB.specops_shuttle_moving_to_centcom = 1 - GLOB.specops_shuttle_time = world.timeofday + SPECOPS_MOVETIME - spawn(0) - specops_return() - - else if(href_list["sendtostation"]) - if(GLOB.specops_shuttle_at_station || GLOB.specops_shuttle_moving_to_station || GLOB.specops_shuttle_moving_to_centcom) return - - if(!specops_can_move()) - to_chat(usr, "The Special Operations shuttle is unable to leave.") - return - - to_chat(usr, "The Special Operations shuttle will arrive on [station_name()] in [(SPECOPS_MOVETIME/10)] seconds.") - - temp += "Shuttle departing.

OK" - updateUsrDialog() - - GLOB.specops_shuttle_moving_to_station = 1 - - GLOB.specops_shuttle_time = world.timeofday + SPECOPS_MOVETIME - spawn(0) - specops_process() - - else if(href_list["mainmenu"]) - temp = null - - add_fingerprint(usr) - updateUsrDialog() - return diff --git a/code/game/machinery/computer/syndicate_specops_shuttle.dm b/code/game/machinery/computer/syndicate_specops_shuttle.dm deleted file mode 100644 index 6b72e5bbf5b..00000000000 --- a/code/game/machinery/computer/syndicate_specops_shuttle.dm +++ /dev/null @@ -1,254 +0,0 @@ -//Config stuff -#define SYNDICATE_ELITE_MOVETIME 600 //Time to station is milliseconds. 60 seconds, enough time for everyone to be on the shuttle before it leaves. -#define SYNDICATE_ELITE_STATION_AREATYPE "/area/shuttle/syndicate_elite/station" //Type of the spec ops shuttle area for station -#define SYNDICATE_ELITE_DOCK_AREATYPE "/area/shuttle/syndicate_elite/mothership" //Type of the spec ops shuttle area for dock - -GLOBAL_VAR_INIT(syndicate_elite_shuttle_moving_to_station, 0) -GLOBAL_VAR_INIT(syndicate_elite_shuttle_moving_to_mothership, 0) -GLOBAL_VAR_INIT(syndicate_elite_shuttle_at_station, 0) -GLOBAL_VAR_INIT(syndicate_elite_shuttle_can_send, 1) -GLOBAL_VAR_INIT(syndicate_elite_shuttle_time, 0) -GLOBAL_VAR_INIT(syndicate_elite_shuttle_timeleft, 0) - -/obj/machinery/computer/syndicate_elite_shuttle - name = "\improper Elite Syndicate Squad shuttle console" - icon = 'icons/obj/computer.dmi' - icon_keyboard = "syndie_key" - icon_screen = "syndishuttle" - light_color = LIGHT_COLOR_PURE_CYAN - req_access = list(ACCESS_SYNDICATE) - bubble_icon = "syndibot" - var/temp = null - var/hacked = 0 - var/allowedtocall = 0 - -/proc/syndicate_elite_process() - var/area/syndicate_mothership/control/syndicate_ship = locate()//To find announcer. This area should exist for this proc to work. - //var/area/syndicate_mothership/elite_squad/elite_squad = locate()//Where is the specops area located? - var/mob/living/silicon/decoy/announcer = locate() in syndicate_ship//We need a fake AI to announce some stuff below. Otherwise it will be wonky. - - var/message_tracker[] = list(0,1,2,3,5,10,30,45)//Create a a list with potential time values. - var/message = "THE SYNDICATE ELITE SHUTTLE IS PREPARING FOR LAUNCH"//Initial message shown. - if(announcer) - announcer.say(message) - // message = "ARMORED SQUAD TAKE YOUR POSITION ON GRAVITY LAUNCH PAD" - // announcer.say(message) - - while(GLOB.syndicate_elite_shuttle_time - world.timeofday > 0) - var/ticksleft = GLOB.syndicate_elite_shuttle_time - world.timeofday - - if(ticksleft > 1e5) - GLOB.syndicate_elite_shuttle_time = world.timeofday // midnight rollover - GLOB.syndicate_elite_shuttle_timeleft = (ticksleft / 10) - - //All this does is announce the time before launch. - if(announcer) - var/rounded_time_left = round(GLOB.syndicate_elite_shuttle_timeleft)//Round time so that it will report only once, not in fractions. - if(rounded_time_left in message_tracker)//If that time is in the list for message announce. - message = "ALERT: [rounded_time_left] SECOND[(rounded_time_left!=1)?"S":""] REMAIN" - if(rounded_time_left==0) - message = "ALERT: TAKEOFF" - announcer.say(message) - message_tracker -= rounded_time_left//Remove the number from the list so it won't be called again next cycle. - //Should call all the numbers but lag could mean some issues. Oh well. Not much I can do about that. - - sleep(5) - - GLOB.syndicate_elite_shuttle_moving_to_station = 0 - GLOB.syndicate_elite_shuttle_moving_to_mothership = 0 - - GLOB.syndicate_elite_shuttle_at_station = 1 - if(GLOB.syndicate_elite_shuttle_moving_to_station || GLOB.syndicate_elite_shuttle_moving_to_mothership) return - - if(!syndicate_elite_can_move()) - to_chat(usr, "The Syndicate Elite shuttle is unable to leave.") - return - -/* - //Begin Marauder launchpad. - spawn(0)//So it parallel processes it. - for(var/obj/machinery/door/poddoor/M in elite_squad) - switch(M.id) - if("ASSAULT0") - spawn(10)//1 second delay between each. - M.open() - if("ASSAULT1") - spawn(20) - M.open() - if("ASSAULT2") - spawn(30) - M.open() - if("ASSAULT3") - spawn(40) - M.open() - - sleep(10) - - var/spawn_marauder[] = new() - for(var/obj/effect/landmark/L in GLOB.landmarks_list) - if(L.name == "Marauder Entry") - spawn_marauder.Add(L) - for(var/obj/effect/landmark/L in GLOB.landmarks_list) - if(L.name == "Marauder Exit") - var/obj/effect/portal/P = new(L.loc) - P.invisibility = 101//So it is not seen by anyone. - P.failchance = 0//So it has no fail chance when teleporting. - P.target = pick(spawn_marauder)//Where the marauder will arrive. - spawn_marauder.Remove(P.target) - - sleep(10) - - for(var/obj/machinery/mass_driver/M in elite_squad) - switch(M.id) - if("ASSAULT0") - spawn(10) - M.drive() - if("ASSAULT1") - spawn(20) - M.drive() - if("ASSAULT2") - spawn(30) - M.drive() - if("ASSAULT3") - spawn(40) - M.drive() - - sleep(50)//Doors remain open for 5 seconds. - - for(var/obj/machinery/door/poddoor/M in elite_squad) - switch(M.id)//Doors close at the same time. - if("ASSAULT0") - spawn(0) - M.close() - if("ASSAULT1") - spawn(0) - M.close() - if("ASSAULT2") - spawn(0) - M.close() - if("ASSAULT3") - spawn(0) - M.close() - elite_squad.readyreset()//Reset firealarm after the team launched. - */ - //End Marauder launchpad. - - for(var/thing in GLOB.landmarks_list) - var/obj/effect/landmark/L = thing - if(L.name == "Syndicate Breach Area") - explosion(L.loc,4,6,8,10,0) - - sleep(40) - - - var/area/start_location = locate(/area/shuttle/syndicate_elite/mothership) - var/area/end_location = locate(/area/shuttle/syndicate_elite/station) - - var/list/dstturfs = list() - var/throwy = world.maxy - - for(var/turf/T in end_location) - dstturfs = T - if(T.y < throwy) - throwy = T.y - - // hey you, get out of the way! - for(var/turf/T in dstturfs) - // find the turf to move things to - var/turf/D = locate(T.x, throwy - 1, 1) - //var/turf/E = get_step(D, SOUTH) - for(var/atom/movable/AM as mob|obj in T) - AM.Move(D) - if(istype(T, /turf/simulated)) - qdel(T) - - for(var/mob/living/carbon/bug in end_location) // If someone somehow is still in the shuttle's docking area... - bug.gib() - - for(var/mob/living/simple_animal/pest in end_location) // And for the other kind of bug... - pest.gib() - - start_location.move_contents_to(end_location) - - for(var/turf/T in get_area_turfs(end_location) ) - var/mob/M = locate(/mob) in T - to_chat(M, "You have arrived to [station_name()]. Commence operation!") - -/proc/syndicate_elite_can_move() - if(GLOB.syndicate_elite_shuttle_moving_to_station || GLOB.syndicate_elite_shuttle_moving_to_mothership) return 0 - else return 1 - -/obj/machinery/computer/syndicate_elite_shuttle/attack_ai(mob/user as mob) - to_chat(user, "Access Denied.") - return 1 - -/obj/machinery/computer/syndicate_elite_shuttle/attackby(I as obj, user as mob, params) - if(istype(I,/obj/item/card/emag)) - to_chat(user, "The electronic systems in this console are far too advanced for your primitive hacking peripherals.") - else - return ..() - -/obj/machinery/computer/syndicate_elite_shuttle/attack_hand(mob/user as mob) - if(!allowed(user)) - to_chat(user, "Access Denied.") - return - -// if(sent_syndicate_strike_team == 0) -// to_chat(usr, "The strike team has not yet deployed.") -// return - - if(..()) - return - - user.set_machine(src) - var/dat - if(temp) - dat = temp - else - dat = {"
Special Operations Shuttle
- \nLocation: [GLOB.syndicate_elite_shuttle_moving_to_station || GLOB.syndicate_elite_shuttle_moving_to_mothership ? "Departing for [station_name()] in ([GLOB.syndicate_elite_shuttle_timeleft] seconds.)":GLOB.syndicate_elite_shuttle_at_station ? "Station":"Dock"]
- [GLOB.syndicate_elite_shuttle_moving_to_station || GLOB.syndicate_elite_shuttle_moving_to_mothership ? "\n*The Syndicate Elite shuttle is already leaving.*
\n
":GLOB.syndicate_elite_shuttle_at_station ? "\nShuttle Offline
\n
":"\nDepart to [station_name()]
\n
"] - \nClose"} - - user << browse(dat, "window=computer;size=575x450") - onclose(user, "computer") - return - -/obj/machinery/computer/syndicate_elite_shuttle/Topic(href, href_list) - if(..()) - return 1 - - if((usr.contents.Find(src) || (in_range(src, usr) && istype(loc, /turf))) || (istype(usr, /mob/living/silicon))) - usr.set_machine(src) - - if(href_list["sendtodock"]) - if(!GLOB.syndicate_elite_shuttle_at_station|| GLOB.syndicate_elite_shuttle_moving_to_station || GLOB.syndicate_elite_shuttle_moving_to_mothership) return - - to_chat(usr, "The Syndicate will not allow the Elite Squad shuttle to return.") - return - - else if(href_list["sendtostation"]) - if(GLOB.syndicate_elite_shuttle_at_station || GLOB.syndicate_elite_shuttle_moving_to_station || GLOB.syndicate_elite_shuttle_moving_to_mothership) return - - if(!specops_can_move()) - to_chat(usr, "The Syndicate Elite shuttle is unable to leave.") - return - - to_chat(usr, "The Syndicate Elite shuttle will arrive on [station_name()] in [(SYNDICATE_ELITE_MOVETIME/10)] seconds.") - - temp = "Shuttle departing.

OK" - updateUsrDialog() - - GLOB.syndicate_elite_shuttle_moving_to_station = 1 - - GLOB.syndicate_elite_shuttle_time = world.timeofday + SYNDICATE_ELITE_MOVETIME - spawn(0) - syndicate_elite_process() - - - else if(href_list["mainmenu"]) - temp = null - - add_fingerprint(usr) - updateUsrDialog() - return diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index a4879448aa0..0705ccd150d 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -104,6 +104,7 @@ circuit = P user.drop_item() P.loc = src + name += " ([B.board_name])" icon_state = "box_2" state = 3 components = list() @@ -133,6 +134,7 @@ to_chat(user, "You remove the circuit board and other components.") for(var/obj/item/I in components) I.loc = src.loc + name = initial(name) desc = initial(desc) req_components = null components = null @@ -223,61 +225,58 @@ Note: Once everything is added to the public areas, will add MAT_METAL and MAT_G to destroy them and players will be able to make replacements. */ /obj/item/circuitboard/vendor - name = "circuit board (Booze-O-Mat Vendor)" + board_name = "Booze-O-Mat Vendor" board_type = "machine" origin_tech = "programming=1" build_path = /obj/machinery/vending/boozeomat req_components = list(/obj/item/vending_refill/boozeomat = 1) var/static/list/vending_names_paths = list( - /obj/machinery/vending/boozeomat = "Booze-O-Mat", - /obj/machinery/vending/coffee = "Solar's Best Hot Drinks", - /obj/machinery/vending/snack = "Getmore Chocolate Corp", - /obj/machinery/vending/chinese = "Mr. Chang", - /obj/machinery/vending/cola = "Robust Softdrinks", - /obj/machinery/vending/cigarette = "ShadyCigs Deluxe", - /obj/machinery/vending/hatdispenser = "Hatlord 9000", - /obj/machinery/vending/suitdispenser = "Suitlord 9000", - /obj/machinery/vending/shoedispenser = "Shoelord 9000", - /obj/machinery/vending/autodrobe = "AutoDrobe", - /obj/machinery/vending/clothing = "ClothesMate", - /obj/machinery/vending/medical = "NanoMed Plus", - /obj/machinery/vending/wallmed = "NanoMed", - /obj/machinery/vending/assist = "Vendomat", - /obj/machinery/vending/engivend = "Engi-Vend", - /obj/machinery/vending/hydronutrients = "NutriMax", - /obj/machinery/vending/hydroseeds = "MegaSeed Servitor", - /obj/machinery/vending/sustenance = "Sustenance Vendor", - /obj/machinery/vending/dinnerware = "Plasteel Chef's Dinnerware Vendor", - /obj/machinery/vending/cart = "PTech", - /obj/machinery/vending/robotics = "Robotech Deluxe", - /obj/machinery/vending/engineering = "Robco Tool Maker", - /obj/machinery/vending/sovietsoda = "BODA", - /obj/machinery/vending/security = "SecTech", - /obj/machinery/vending/crittercare = "CritterCare") + "Booze-O-Mat" = /obj/machinery/vending/boozeomat, + "Solar's Best Hot Drinks" = /obj/machinery/vending/coffee, + "Getmore Chocolate Corp" = /obj/machinery/vending/snack, + "Mr. Chang" = /obj/machinery/vending/chinese, + "Robust Softdrinks" = /obj/machinery/vending/cola, + "ShadyCigs Deluxe" = /obj/machinery/vending/cigarette, + "Hatlord 9000" = /obj/machinery/vending/hatdispenser, + "Suitlord 9000" = /obj/machinery/vending/suitdispenser, + "Shoelord 9000" = /obj/machinery/vending/shoedispenser, + "AutoDrobe" = /obj/machinery/vending/autodrobe, + "ClothesMate" = /obj/machinery/vending/clothing, + "NanoMed Plus" = /obj/machinery/vending/medical, + "NanoMed" = /obj/machinery/vending/wallmed, + "Vendomat" = /obj/machinery/vending/assist, + "YouTool" = /obj/machinery/vending/tool, + "Engi-Vend" = /obj/machinery/vending/engivend, + "NutriMax" = /obj/machinery/vending/hydronutrients, + "MegaSeed Servitor" = /obj/machinery/vending/hydroseeds, + "Sustenance Vendor" = /obj/machinery/vending/sustenance, + "Plasteel Chef's Dinnerware Vendor" = /obj/machinery/vending/dinnerware, + "PTech" = /obj/machinery/vending/cart, + "Robotech Deluxe" = /obj/machinery/vending/robotics, + "Robco Tool Maker" = /obj/machinery/vending/engineering, + "BODA" = /obj/machinery/vending/sovietsoda, + "SecTech" = /obj/machinery/vending/security, + "CritterCare" = /obj/machinery/vending/crittercare) /obj/item/circuitboard/vendor/screwdriver_act(mob/user, obj/item/I) . = TRUE if(!I.use_tool(src, user, 0, volume = I.tool_volume)) return - var/static/list/display_vending_names_paths - if(!display_vending_names_paths) - display_vending_names_paths = list() - for(var/path in vending_names_paths) - display_vending_names_paths[vending_names_paths[path]] = path - var/choice = input(user, "Choose a new brand","Select an Item") as null|anything in display_vending_names_paths - if(loc != user) - to_chat(user, "You need to keep [src] in your hands while doing that!") + var/choice = input(user, "Choose a new brand", "Select an Item") as null|anything in vending_names_paths + if(!choice) return - set_type(display_vending_names_paths[choice]) + set_type(choice) -/obj/item/circuitboard/vendor/proc/set_type(obj/machinery/vending/typepath) +/obj/item/circuitboard/vendor/proc/set_type(type) + var/obj/machinery/vending/typepath = vending_names_paths[type] build_path = typepath - name = "circuit board ([vending_names_paths[build_path]] Vendor)" + board_name = "[type] Vendor" + format_board_name() req_components = list(initial(typepath.refill_canister) = 1) /obj/item/circuitboard/smes - name = "circuit board (SMES)" + board_name = "SMES" build_path = /obj/machinery/power/smes board_type = "machine" origin_tech = "programming=3;powerstorage=3;engineering=3" @@ -287,7 +286,7 @@ to destroy them and players will be able to make replacements. /obj/item/stock_parts/capacitor = 1) /obj/item/circuitboard/emitter - name = "circuit board (Emitter)" + board_name = "Emitter" build_path = /obj/machinery/power/emitter board_type = "machine" origin_tech = "programming=3;powerstorage=4;engineering=4" @@ -296,7 +295,7 @@ to destroy them and players will be able to make replacements. /obj/item/stock_parts/manipulator = 1) /obj/item/circuitboard/power_compressor - name = "circuit board (Power Compressor)" + board_name = "Power Compressor" build_path = /obj/machinery/power/compressor board_type = "machine" origin_tech = "programming=4;powerstorage=4;engineering=4" @@ -305,7 +304,7 @@ to destroy them and players will be able to make replacements. /obj/item/stock_parts/manipulator = 6) /obj/item/circuitboard/power_turbine - name = "circuit board (Power Turbine)" + board_name = "Power Turbine" build_path = /obj/machinery/power/turbine board_type = "machine" origin_tech = "programming=4;powerstorage=4;engineering=4" @@ -314,7 +313,7 @@ to destroy them and players will be able to make replacements. /obj/item/stock_parts/capacitor = 6) /obj/item/circuitboard/thermomachine - name = "Thermomachine (Machine Board)" + board_name = "Thermomachine" build_path = /obj/machinery/atmospherics/unary/thermomachine board_type = "machine" origin_tech = "programming=3;plasmatech=3" @@ -325,14 +324,14 @@ to destroy them and players will be able to make replacements. /obj/item/stack/sheet/glass = 1) /obj/item/circuitboard/recharger - name = "circuit board (Recharger)" + board_name = "Recharger" build_path = /obj/machinery/recharger board_type = "machine" origin_tech = "powerstorage=3;materials=2" req_components = list(/obj/item/stock_parts/capacitor = 1) /obj/item/circuitboard/snow_machine - name = "circuit board (snow machine)" + board_name = "Snow Machine" build_path = /obj/machinery/snow_machine board_type = "machine" origin_tech = "programming=2;materials=2" @@ -341,7 +340,7 @@ to destroy them and players will be able to make replacements. /obj/item/stock_parts/micro_laser = 1) /obj/item/circuitboard/biogenerator - name = "circuit board (Biogenerator)" + board_name = "Biogenerator" build_path = /obj/machinery/biogenerator board_type = "machine" origin_tech = "programming=2;biotech=3;materials=3" @@ -352,7 +351,7 @@ to destroy them and players will be able to make replacements. /obj/item/stack/sheet/glass = 1) /obj/item/circuitboard/plantgenes - name = "Plant DNA Manipulator (Machine Board)" + board_name = "Plant DNA Manipulator" build_path = /obj/machinery/plantgenes board_type = "machine" origin_tech = "programming=3;biotech=3" @@ -365,7 +364,7 @@ to destroy them and players will be able to make replacements. /obj/item/circuitboard/plantgenes/vault /obj/item/circuitboard/seed_extractor - name = "circuit board (Seed Extractor)" + board_name = "Seed Extractor" build_path = /obj/machinery/seed_extractor board_type = "machine" origin_tech = "programming=1" @@ -374,7 +373,7 @@ to destroy them and players will be able to make replacements. /obj/item/stock_parts/manipulator = 1) /obj/item/circuitboard/hydroponics - name = "circuit board (Hydroponics Tray)" + board_name = "Hydroponics Tray" build_path = /obj/machinery/hydroponics/constructable board_type = "machine" origin_tech = "programming=1;biotech=2" @@ -384,7 +383,7 @@ to destroy them and players will be able to make replacements. /obj/item/stack/sheet/glass = 1) /obj/item/circuitboard/microwave - name = "circuit board (Microwave)" + board_name = "Microwave" build_path = /obj/machinery/kitchen_machine/microwave board_type = "machine" origin_tech = "programming=2;magnets=2" @@ -394,7 +393,7 @@ to destroy them and players will be able to make replacements. /obj/item/stack/sheet/glass = 1) /obj/item/circuitboard/oven - name = "circuit board (Oven)" + board_name = "Oven" build_path = /obj/machinery/kitchen_machine/oven board_type = "machine" origin_tech = "programming=2;magnets=2" @@ -404,7 +403,7 @@ to destroy them and players will be able to make replacements. /obj/item/stack/sheet/glass = 1) /obj/item/circuitboard/grill - name = "circuit board (Grill)" + board_name = "Grill" build_path = /obj/machinery/kitchen_machine/grill board_type = "machine" origin_tech = "programming=2;magnets=2" @@ -414,7 +413,7 @@ to destroy them and players will be able to make replacements. /obj/item/stack/sheet/glass = 1) /obj/item/circuitboard/candy_maker - name = "circuit board (Candy Maker)" + board_name = "Candy Maker" build_path = /obj/machinery/kitchen_machine/candy_maker board_type = "machine" origin_tech = "programming=2;magnets=2" @@ -424,7 +423,7 @@ to destroy them and players will be able to make replacements. /obj/item/stack/sheet/glass = 1) /obj/item/circuitboard/deepfryer - name = "circuit board (Deep Fryer)" + board_name = "Deep Fryer" build_path = /obj/machinery/cooker/deepfryer board_type = "machine" origin_tech = "programming=1" @@ -433,7 +432,7 @@ to destroy them and players will be able to make replacements. /obj/item/stack/cable_coil = 5) /obj/item/circuitboard/gibber - name = "circuit board (Gibber)" + board_name = "Gibber" build_path = /obj/machinery/gibber board_type = "machine" origin_tech = "programming=2;engineering=2" @@ -442,7 +441,7 @@ to destroy them and players will be able to make replacements. /obj/item/stock_parts/manipulator = 1) /obj/item/circuitboard/tesla_coil - name = "circuit board (Tesla Coil)" + board_name = "Tesla Coil" build_path = /obj/machinery/power/tesla_coil board_type = "machine" origin_tech = "programming=3;magnets=3;powerstorage=3" @@ -450,7 +449,7 @@ to destroy them and players will be able to make replacements. /obj/item/stock_parts/capacitor = 1) /obj/item/circuitboard/grounding_rod - name = "circuit board (Grounding Rod)" + board_name = "Grounding Rod" build_path = /obj/machinery/power/grounding_rod board_type = "machine" origin_tech = "programming=3;powerstorage=3;magnets=3;plasmatech=2" @@ -458,7 +457,7 @@ to destroy them and players will be able to make replacements. /obj/item/stock_parts/capacitor = 1) /obj/item/circuitboard/processor - name = "circuit board (Food processor)" + board_name = "Food Processor" build_path = /obj/machinery/processor board_type = "machine" origin_tech = "programming=1" @@ -467,7 +466,7 @@ to destroy them and players will be able to make replacements. /obj/item/stock_parts/manipulator = 1) /obj/item/circuitboard/recycler - name = "circuit board (Recycler)" + board_name = "Recycler" build_path = /obj/machinery/recycler board_type = "machine" origin_tech = "programming=2;engineering=2" @@ -476,51 +475,49 @@ to destroy them and players will be able to make replacements. /obj/item/stock_parts/manipulator = 1) /obj/item/circuitboard/smartfridge - name = "circuit board (Smartfridge)" + board_name = "Smartfridge" build_path = /obj/machinery/smartfridge board_type = "machine" origin_tech = "programming=1" req_components = list( /obj/item/stock_parts/matter_bin = 1) - var/list/fridge_names_paths = list( - "\improper SmartFridge" = /obj/machinery/smartfridge, - "\improper MegaSeed Servitor" = /obj/machinery/smartfridge/seeds, - "\improper Refrigerated Medicine Storage" = /obj/machinery/smartfridge/medbay, - "\improper Slime Extract Storage" = /obj/machinery/smartfridge/secure/extract, - "\improper Secure Refrigerated Medicine Storage" = /obj/machinery/smartfridge/secure/medbay, - "\improper Smart Chemical Storage" = /obj/machinery/smartfridge/secure/chemistry, - "smart virus storage" = /obj/machinery/smartfridge/secure/chemistry/virology, - "\improper Drink Showcase" = /obj/machinery/smartfridge/drinks, - "disk compartmentalizer" = /obj/machinery/smartfridge/disks - ) + var/static/list/fridge_names_paths = list( + "SmartFridge" = /obj/machinery/smartfridge, + "MegaSeed Servitor" = /obj/machinery/smartfridge/seeds, + "Refrigerated Medicine Storage" = /obj/machinery/smartfridge/medbay, + "Slime Extract Storage" = /obj/machinery/smartfridge/secure/extract, + "Secure Refrigerated Medicine Storage" = /obj/machinery/smartfridge/secure/medbay, + "Smart Chemical Storage" = /obj/machinery/smartfridge/secure/chemistry, + "Smart Virus Storage" = /obj/machinery/smartfridge/secure/chemistry/virology, + "Drink Showcase" = /obj/machinery/smartfridge/drinks, + "Disk Compartmentalizer" = /obj/machinery/smartfridge/disks) - -/obj/item/circuitboard/smartfridge/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/screwdriver)) - set_type(null, user) +/obj/item/circuitboard/smartfridge/screwdriver_act(mob/living/user, obj/item/I) + . = TRUE + if(!I.use_tool(src, user, 0, volume = I.tool_volume)) return - return ..() + var/choice = input(user, "Circuit Setting", "What would you change the board setting to?") as null|anything in fridge_names_paths + if(!choice) + return + set_type(user, choice) -/obj/item/circuitboard/smartfridge/proc/set_type(typepath, mob/user) - var/new_name = "" - if(!typepath) - new_name = input("Circuit Setting", "What would you change the board setting to?") in fridge_names_paths - typepath = fridge_names_paths[new_name] +/obj/item/circuitboard/smartfridge/proc/set_type(mob/user, type) + if(!ispath(type)) + board_name = type + type = fridge_names_paths[type] else for(var/name in fridge_names_paths) - if(fridge_names_paths[name] == typepath) - new_name = name + if(fridge_names_paths[name] == type) + board_name = name break - build_path = typepath - name = new_name - if(findtextEx(new_name, "\improper")) - new_name = replacetext(new_name, "\improper", "") + build_path = type + format_board_name() if(user) - to_chat(user, "You set the board to [new_name].") + to_chat(user, "You set the board to [board_name].") /obj/item/circuitboard/monkey_recycler - name = "circuit board (Monkey Recycler)" + board_name = "Monkey Recycler" build_path = /obj/machinery/monkey_recycler board_type = "machine" origin_tech = "programming=1;biotech=2" @@ -529,7 +526,7 @@ to destroy them and players will be able to make replacements. /obj/item/stock_parts/manipulator = 1) /obj/item/circuitboard/holopad - name = "circuit board (AI Holopad)" + board_name = "AI Holopad" build_path = /obj/machinery/hologram/holopad board_type = "machine" origin_tech = "programming=1" @@ -537,7 +534,7 @@ to destroy them and players will be able to make replacements. /obj/item/stock_parts/capacitor = 1) /obj/item/circuitboard/chem_dispenser - name = "circuit board (Chem Dispenser)" + board_name = "Chem Dispenser" build_path = /obj/machinery/chem_dispenser board_type = "machine" origin_tech = "materials=4;programming=4;plasmatech=4;biotech=3" @@ -548,7 +545,7 @@ to destroy them and players will be able to make replacements. /obj/item/stock_parts/cell = 1) /obj/item/circuitboard/chem_master - name = "circuit board (ChemMaster 3000)" + board_name = "ChemMaster 3000" build_path = /obj/machinery/chem_master board_type = "machine" origin_tech = "materials=3;programming=2;biotech=3" @@ -573,11 +570,11 @@ to destroy them and players will be able to make replacements. to_chat(user, "You change the circuit board setting to \"[new_name]\".") /obj/item/circuitboard/chem_master/condi_master - name = "circuit board (CondiMaster 3000)" + board_name = "CondiMaster 3000" build_path = /obj/machinery/chem_master/condimaster /obj/item/circuitboard/chem_heater - name = "circuit board (Chemical Heater)" + board_name = "Chemical Heater" build_path = /obj/machinery/chem_heater board_type = "machine" origin_tech = "programming=2;engineering=2;biotech=2" @@ -586,7 +583,7 @@ to destroy them and players will be able to make replacements. /obj/item/stack/sheet/glass = 1) /obj/item/circuitboard/reagentgrinder - name = "circuit board (All-In-One Grinder)" + board_name = "All-In-One Grinder" build_path = /obj/machinery/reagentgrinder/empty board_type = "machine" origin_tech = "materials=2;engineering=2;biotech=2" @@ -596,7 +593,7 @@ to destroy them and players will be able to make replacements. //Almost the same recipe as destructive analyzer to give people choices. /obj/item/circuitboard/experimentor - name = "circuit board (E.X.P.E.R.I-MENTOR)" + board_name = "E.X.P.E.R.I-MENTOR" build_path = /obj/machinery/r_n_d/experimentor board_type = "machine" origin_tech = "magnets=1;engineering=1;programming=1;biotech=1;bluespace=2" @@ -606,7 +603,7 @@ to destroy them and players will be able to make replacements. /obj/item/stock_parts/micro_laser = 2) /obj/item/circuitboard/destructive_analyzer - name = "Circuit board (Destructive Analyzer)" + board_name = "Destructive Analyzer" build_path = /obj/machinery/r_n_d/destructive_analyzer board_type = "machine" origin_tech = "magnets=2;engineering=2;programming=2" @@ -616,7 +613,7 @@ to destroy them and players will be able to make replacements. /obj/item/stock_parts/micro_laser = 1) /obj/item/circuitboard/autolathe - name = "Circuit board (Autolathe)" + board_name = "Autolathe" build_path = /obj/machinery/autolathe board_type = "machine" origin_tech = "engineering=2;programming=2" @@ -630,7 +627,7 @@ to destroy them and players will be able to make replacements. build_path = /obj/machinery/autolathe/syndicate /obj/item/circuitboard/protolathe - name = "Circuit board (Protolathe)" + board_name = "Protolathe" build_path = /obj/machinery/r_n_d/protolathe board_type = "machine" origin_tech = "engineering=2;programming=2" @@ -640,15 +637,15 @@ to destroy them and players will be able to make replacements. /obj/item/reagent_containers/glass/beaker = 2) /obj/item/circuitboard/chem_dispenser/soda - name = "Circuit board (Soda Machine)" + board_name = "Soda Machine" build_path = /obj/machinery/chem_dispenser/soda /obj/item/circuitboard/chem_dispenser/beer - name = "Circuit board (Beer Machine)" + board_name = "Beer Machine" build_path = /obj/machinery/chem_dispenser/beer /obj/item/circuitboard/circuit_imprinter - name = "Circuit board (Circuit Imprinter)" + board_name = "Circuit Imprinter" build_path = /obj/machinery/r_n_d/circuit_imprinter board_type = "machine" origin_tech = "engineering=2;programming=2" @@ -658,7 +655,7 @@ to destroy them and players will be able to make replacements. /obj/item/reagent_containers/glass/beaker = 2) /obj/item/circuitboard/pacman - name = "Circuit Board (PACMAN-type Generator)" + board_name = "PACMAN-type Generator" build_path = /obj/machinery/power/port_gen/pacman board_type = "machine" origin_tech = "programming=2;powerstorage=3;plasmatech=3;engineering=3" @@ -669,17 +666,17 @@ to destroy them and players will be able to make replacements. /obj/item/stock_parts/capacitor = 1) /obj/item/circuitboard/pacman/super - name = "Circuit Board (SUPERPACMAN-type Generator)" + board_name = "SUPERPACMAN-type Generator" build_path = /obj/machinery/power/port_gen/pacman/super origin_tech = "programming=3;powerstorage=4;engineering=4" /obj/item/circuitboard/pacman/mrs - name = "Circuit Board (MRSPACMAN-type Generator)" + board_name = "MRSPACMAN-type Generator" build_path = /obj/machinery/power/port_gen/pacman/mrs origin_tech = "programming=3;powerstorage=4;engineering=4;plasmatech=4" /obj/item/circuitboard/rdserver - name = "Circuit Board (R&D Server)" + board_name = "R&D Server" build_path = /obj/machinery/r_n_d/server board_type = "machine" origin_tech = "programming=3" @@ -688,7 +685,7 @@ to destroy them and players will be able to make replacements. /obj/item/stock_parts/scanning_module = 1) /obj/item/circuitboard/mechfab - name = "Circuit board (Exosuit Fabricator)" + board_name = "Exosuit Fabricator" build_path = /obj/machinery/mecha_part_fabricator board_type = "machine" origin_tech = "programming=2;engineering=2" @@ -699,7 +696,7 @@ to destroy them and players will be able to make replacements. /obj/item/stack/sheet/glass = 1) /obj/item/circuitboard/podfab - name = "Circuit board (Spacepod Fabricator)" + board_name = "Spacepod Fabricator" build_path = /obj/machinery/mecha_part_fabricator/spacepod board_type = "machine" origin_tech = "programming=2;engineering=2" @@ -711,7 +708,7 @@ to destroy them and players will be able to make replacements. /obj/item/circuitboard/clonepod - name = "Circuit board (Clone Pod)" + board_name = "Clone Pod" build_path = /obj/machinery/clonepod board_type = "machine" origin_tech = "programming=2;biotech=2" @@ -722,7 +719,7 @@ to destroy them and players will be able to make replacements. /obj/item/stack/sheet/glass = 1) /obj/item/circuitboard/clonescanner - name = "Circuit board (Cloning Scanner)" + board_name = "Cloning Scanner" build_path = /obj/machinery/dna_scannernew board_type = "machine" origin_tech = "programming=2;biotech=2" @@ -734,7 +731,7 @@ to destroy them and players will be able to make replacements. /obj/item/stack/cable_coil = 2,) /obj/item/circuitboard/mech_recharger - name = "circuit board (Mech Bay Recharger)" + board_name = "Mech Bay Recharger" build_path = /obj/machinery/mech_bay_recharge_port board_type = "machine" origin_tech = "programming=3;powerstorage=3;engineering=3" @@ -743,7 +740,7 @@ to destroy them and players will be able to make replacements. /obj/item/stock_parts/capacitor = 5) /obj/item/circuitboard/teleporter_hub - name = "circuit board (Teleporter Hub)" + board_name = "Teleporter Hub" build_path = /obj/machinery/teleport/hub board_type = "machine" origin_tech = "programming=3;engineering=4;bluespace=4;materials=4" @@ -752,7 +749,7 @@ to destroy them and players will be able to make replacements. /obj/item/stock_parts/matter_bin = 1) /obj/item/circuitboard/teleporter_station - name = "circuit board (Teleporter Station)" + board_name = "Teleporter Station" build_path = /obj/machinery/teleport/station board_type = "machine" origin_tech = "programming=4;engineering=4;bluespace=4;plasmatech=3" @@ -762,7 +759,7 @@ to destroy them and players will be able to make replacements. /obj/item/stack/sheet/glass = 1) /obj/item/circuitboard/teleporter_perma - name = "circuit board (Permanent Teleporter)" + board_name = "Permanent Teleporter" build_path = /obj/machinery/teleport/perma board_type = "machine" origin_tech = "programming=3;engineering=4;bluespace=4;materials=4" @@ -781,7 +778,7 @@ to destroy them and players will be able to make replacements. return ..() /obj/item/circuitboard/telesci_pad - name = "Circuit board (Telepad)" + board_name = "Telepad" build_path = /obj/machinery/telepad board_type = "machine" origin_tech = "programming=4;engineering=3;plasmatech=4;bluespace=4" @@ -792,7 +789,7 @@ to destroy them and players will be able to make replacements. /obj/item/stack/sheet/glass = 1) /obj/item/circuitboard/quantumpad - name = "circuit board (Quantum Pad)" + board_name = "Quantum Pad" build_path = /obj/machinery/quantumpad board_type = "machine" origin_tech = "programming=3;engineering=3;plasmatech=3;bluespace=4" @@ -803,7 +800,7 @@ to destroy them and players will be able to make replacements. /obj/item/stack/cable_coil = 1) /obj/item/circuitboard/sleeper - name = "circuit board (Sleeper)" + board_name = "Sleeper" build_path = /obj/machinery/sleeper board_type = "machine" origin_tech = "programming=3;biotech=2;engineering=3" @@ -814,16 +811,16 @@ to destroy them and players will be able to make replacements. /obj/item/stack/sheet/glass = 2) /obj/item/circuitboard/sleeper/syndicate - name = "circuit board (Sleeper Syndicate)" + board_name = "Sleeper - Syndicate" build_path = /obj/machinery/sleeper/syndie /obj/item/circuitboard/sleeper/survival - name = "circuit board (Sleeper Survival Pod)" + board_name = "Sleeper - Survival Pod" build_path = /obj/machinery/sleeper/survival_pod /obj/item/circuitboard/bodyscanner - name = "circuit board (Body Scanner)" + board_name = "Body Scanner" build_path = /obj/machinery/bodyscanner board_type = "machine" origin_tech = "programming=3;biotech=2;engineering=3" @@ -833,7 +830,7 @@ to destroy them and players will be able to make replacements. /obj/item/stack/sheet/glass = 2) /obj/item/circuitboard/cryo_tube - name = "circuit board (Cryotube)" + board_name = "Cryotube" build_path = /obj/machinery/atmospherics/unary/cryo_cell board_type = "machine" origin_tech = "programming=4;biotech=3;engineering=4;plasmatech=3" @@ -843,7 +840,7 @@ to destroy them and players will be able to make replacements. /obj/item/stack/sheet/glass = 4) /obj/item/circuitboard/cyborgrecharger - name = "circuit board (Cyborg Recharger)" + board_name = "Cyborg Recharger" build_path = /obj/machinery/recharge_station board_type = "machine" origin_tech = "powerstorage=3;engineering=3" @@ -854,21 +851,22 @@ to destroy them and players will be able to make replacements. // Telecomms circuit boards: /obj/item/circuitboard/tcomms/relay - name = "Circuit Board (Telecommunications Relay)" + board_name = "Telecommunications Relay" build_path = /obj/machinery/tcomms/relay board_type = "machine" origin_tech = "programming=2;engineering=2;bluespace=2" req_components = list(/obj/item/stock_parts/manipulator = 2, /obj/item/stack/cable_coil = 2) /obj/item/circuitboard/tcomms/core - name = "Circuit Board (Telecommunications Core)" + board_name = "Telecommunications Core" build_path = /obj/machinery/tcomms/core board_type = "machine" origin_tech = "programming=2;engineering=2" req_components = list(/obj/item/stock_parts/manipulator = 2, /obj/item/stack/cable_coil = 2) // End telecomms circuit boards + /obj/item/circuitboard/ore_redemption - name = "circuit board (Ore Redemption)" + board_name = "Ore Redemption" build_path = /obj/machinery/mineral/ore_redemption board_type = "machine" origin_tech = "programming=1;engineering=2" @@ -880,15 +878,15 @@ to destroy them and players will be able to make replacements. /obj/item/assembly/igniter = 1) /obj/item/circuitboard/ore_redemption/golem - name = "circuit board (Golem Ore Redemption)" + board_name = "Ore Redemption - Golem" build_path = /obj/machinery/mineral/ore_redemption/golem /obj/item/circuitboard/ore_redemption/labor - name = "circuit board (Labor Ore Redemption)" + board_name = "Ore Redemption - Labour" build_path = /obj/machinery/mineral/ore_redemption/labor /obj/item/circuitboard/mining_equipment_vendor - name = "circuit board (Mining Equipment Vendor)" + board_name = "Mining Equipment Vendor" build_path = /obj/machinery/mineral/equipment_vendor board_type = "machine" origin_tech = "programming=1;engineering=3" @@ -897,15 +895,15 @@ to destroy them and players will be able to make replacements. /obj/item/stock_parts/matter_bin = 3) /obj/item/circuitboard/mining_equipment_vendor/golem - name = "circuit board (Mining Equipment Vendor)" + board_name = "Golem Equipment Vendor" build_path = /obj/machinery/mineral/equipment_vendor/golem /obj/item/circuitboard/mining_equipment_vendor/labor - name = "circuit board (Labor Equipment Vendor)" + board_name = "Labour Equipment Vendor" build_path = /obj/machinery/mineral/equipment_vendor/labor /obj/item/circuitboard/clawgame - name = "circuit board (Claw Game)" + board_name = "Claw Game" build_path = /obj/machinery/arcade/claw board_type = "machine" origin_tech = "programming=1" @@ -916,7 +914,7 @@ to destroy them and players will be able to make replacements. /obj/item/stack/sheet/glass = 1) /obj/item/circuitboard/prize_counter - name = "circuit board (Prize Counter)" + board_name = "Prize Counter" build_path = /obj/machinery/prize_counter board_type = "machine" origin_tech = "programming=1" @@ -927,7 +925,7 @@ to destroy them and players will be able to make replacements. /obj/item/stack/cable_coil = 1) /obj/item/circuitboard/gameboard - name = "circuit board (Virtual Gameboard)" + board_name = "Virtual Gameboard" build_path = /obj/machinery/gameboard board_type = "machine" origin_tech = "programming=1" diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 23f217bf32b..a67f068912f 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -170,12 +170,12 @@ dispense_item(I) /obj/item/circuitboard/cryopodcontrol - name = "Circuit board (Cryogenic Oversight Console)" + board_name = "Cryogenic Oversight Console" build_path = "/obj/machinery/computer/cryopod" origin_tech = "programming=1" /obj/item/circuitboard/robotstoragecontrol - name = "Circuit board (Robotic Storage Console)" + board_name = "Robotic Storage Console" build_path = "/obj/machinery/computer/cryopod/robot" origin_tech = "programming=1" @@ -720,6 +720,10 @@ // Won't announce when used for cryoing. silent = TRUE +/obj/machinery/cryopod/offstation/right + orient_right = TRUE + icon_state = "body_scanner_0-r" + /obj/machinery/computer/cryopod/robot name = "robotic storage console" desc = "An interface between crew and the robotic storage systems" diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 8c5ed4ddb6e..42404a2296f 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -1188,6 +1188,7 @@ About the new airlock wires panel: if(!density) return TRUE + SEND_SIGNAL(src, COMSIG_AIRLOCK_OPEN) operating = TRUE update_icon(AIRLOCK_OPENING, 1) sleep(1) @@ -1228,6 +1229,7 @@ About the new airlock wires panel: if(killthis) killthis.ex_act(EXPLODE_HEAVY)//Smashin windows + SEND_SIGNAL(src, COMSIG_AIRLOCK_CLOSE) operating = TRUE update_icon(AIRLOCK_CLOSING, 1) layer = CLOSED_DOOR_LAYER diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index c1f4fd22044..a2479c149a1 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -266,6 +266,7 @@ return TRUE if(operating) return + SEND_SIGNAL(src, COMSIG_DOOR_OPEN) operating = TRUE do_animate("opening") set_opacity(0) @@ -295,6 +296,7 @@ autoclose_in(60) return + SEND_SIGNAL(src, COMSIG_DOOR_CLOSE) operating = TRUE do_animate("closing") diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 3c28c68a5e0..fffdea3be1f 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -145,6 +145,8 @@ else if(our_rpd.mode == RPD_FLIP_MODE) flip() else if(our_rpd.mode == RPD_DELETE_MODE) + if(pipe_type == PIPE_CIRCULATOR) //Skip TEG heat circulators, they aren't really pipes + return ..() our_rpd.delete_single_pipe(user, src) else return ..() diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index 4f22d1c2bb2..1ca2c21fd90 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -657,6 +657,7 @@ GLOBAL_LIST_EMPTY(turret_icons) qdel(flick_holder) set_raised_raising(FALSE, FALSE) + set_angle(0) update_icon() /obj/machinery/porta_turret/on_assess_perp(mob/living/carbon/human/perp) @@ -678,7 +679,8 @@ GLOBAL_LIST_EMPTY(turret_icons) last_target = target if(has_cover) popUp() //pop the turret up if it's not already up. - setDir(get_dir(src, target)) //even if you can't shoot, follow the target + // Set angle + set_angle(get_angle(src, target)) shootAt(target) return TRUE @@ -842,6 +844,9 @@ GLOBAL_LIST_EMPTY(turret_icons) if(!user.unEquip(I)) to_chat(user, "\the [I] is stuck to your hand, you cannot put it in \the [src]") return + if(!E.can_fit_in_turrets) + to_chat(user, "[I] will not operate correctly in [src].") + return installation = I.type //installation becomes I.type gun_charge = E.cell.charge //the gun's charge is stored in gun_charge to_chat(user, "You add [I] to the turret.") diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index e3d58ed6aa5..dbce1932045 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -161,7 +161,7 @@ name = "syndicate suit storage unit" suit_type = /obj/item/clothing/suit/space/hardsuit/syndi mask_type = /obj/item/clothing/mask/gas/syndicate - storage_type = /obj/item/tank/jetpack/oxygen/harness + storage_type = /obj/item/tank/internals/oxygen/red req_access = list(ACCESS_SYNDICATE) safeties = FALSE //in a syndicate base, everything can be used as a murder weapon at a moment's notice. @@ -331,26 +331,42 @@ if(default_deconstruction_screwdriver(user, "panel", "close", I)) I.play_tool_sound(user, I.tool_volume) +/** + * Tries to store the item into whatever slot it can go, returns true if the item is stored successfully. + * +**/ /obj/machinery/suit_storage_unit/proc/store_item(obj/item/I, mob/user) - . = FALSE if(istype(I, /obj/item/clothing/suit) && !suit) - suit = I - . = TRUE + if(try_store_item(I, user)) + suit = I + return TRUE if(istype(I, /obj/item/clothing/head) && !helmet) - helmet = I - . = TRUE + if(try_store_item(I, user)) + helmet = I + return TRUE if(istype(I, /obj/item/clothing/mask) && !mask) - mask = I - . = TRUE + if(try_store_item(I, user)) + mask = I + return TRUE if(istype(I, /obj/item/clothing/shoes) && !boots) - boots = I - . = TRUE - if((istype(I, /obj/item/tank) || I.w_class <= WEIGHT_CLASS_SMALL) && !storage && !.) - storage = I - . = TRUE - if(.) - user.drop_item() + if(try_store_item(I, user)) + boots = I + return TRUE + if((istype(I, /obj/item/tank) || I.w_class <= WEIGHT_CLASS_SMALL) && !storage) + if(try_store_item(I, user)) + storage = I + return TRUE + return FALSE + +/** + * Tries to store the item, returns true if it's moved successfully, false otherwise (because of nodrop etc) + * +**/ +/obj/machinery/suit_storage_unit/proc/try_store_item(obj/item/I, mob/user) + if(user.drop_item()) I.forceMove(src) + return TRUE + return FALSE /obj/machinery/suit_storage_unit/power_change() diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index 3665934aced..9ae9abe6249 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -313,7 +313,7 @@ name = "teleporter hub" desc = "It's the hub of a teleporting machine." icon_state = "tele0" - var/accurate = FALSE + var/accurate = 0 use_power = IDLE_POWER_USE idle_power_usage = 10 active_power_usage = 2000 @@ -353,6 +353,8 @@ for(var/obj/item/stock_parts/matter_bin/M in component_parts) A += M.rating accurate = A + if(accurate >= 3) + calibrated = TRUE /obj/machinery/teleport/hub/proc/link_power_station() if(power_station) @@ -401,12 +403,13 @@ if(!calibrated && com.cc_beacon) visible_message("Cannot lock on target. Please calibrate the teleporter before attempting long range teleportation.") else if(!calibrated && prob(25 - ((accurate) * 10)) && !com.cc_beacon) //oh dear a problem - var/list/target_z = levels_by_trait(REACHABLE) + var/list/target_z = levels_by_trait(SPAWN_RUINS) target_z -= M.z //Where to sir? Anywhere but here. . = do_teleport(M, locate(rand((2*TRANSITIONEDGE), world.maxx - (2*TRANSITIONEDGE)), rand((2*TRANSITIONEDGE), world.maxy - (2*TRANSITIONEDGE)), pick(target_z)), 2, bypass_area_flag = com.area_bypass) else . = do_teleport(M, com.target, bypass_area_flag = com.area_bypass) - calibrated = FALSE + if(accurate < 3) + calibrated = FALSE /obj/machinery/teleport/hub/update_icon() if(panel_open) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 15a69318610..88deaf8647b 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -101,16 +101,24 @@ var/force_no_power_icon_state = FALSE /obj/machinery/vending/Initialize(mapload) + . = ..() var/build_inv = FALSE if(!refill_canister) build_inv = TRUE - . = ..() + else + component_parts = list() + var/obj/item/circuitboard/vendor/V = new + V.set_type(replacetext(name, "\improper", "")) + component_parts += V + component_parts += new refill_canister + RefreshParts() + wires = new(src) if(build_inv) //non-constructable vending machine build_inventory(products, product_records) build_inventory(contraband, hidden_records) build_inventory(premium, coin_records) - for (var/datum/data/vending_product/R in (product_records + coin_records + hidden_records)) + for(var/datum/data/vending_product/R in (product_records + coin_records + hidden_records)) var/obj/item/I = R.product_path var/pp = replacetext(replacetext("[R.product_path]", "/obj/item/", ""), "/", "-") imagelist[pp] = "[icon2base64(icon(initial(I.icon), initial(I.icon_state)))]" @@ -887,14 +895,6 @@ ads_list = list("Only the finest!","Have some tools.","The most robust equipment.","The finest gear in space!") refill_canister = /obj/item/vending_refill/assist -/obj/machinery/vending/assist/Initialize(mapload) - component_parts = list() - var/obj/item/circuitboard/vendor/V = new(null) - V.set_type(type) - component_parts += V - component_parts += new /obj/item/vending_refill/assist(null) - RefreshParts() - return ..() /obj/machinery/vending/boozeomat name = "\improper Booze-O-Mat" @@ -934,15 +934,6 @@ /obj/machinery/vending/boozeomat/syndicate_access req_access = list(ACCESS_SYNDICATE) -/obj/machinery/vending/boozeomat/Initialize(mapload) - component_parts = list() - var/obj/item/circuitboard/vendor/V = new(null) - V.set_type(type) - component_parts += V - component_parts += new /obj/item/vending_refill/boozeomat(null) - RefreshParts() - return ..() - /obj/machinery/vending/coffee name = "\improper Hot Drinks machine" @@ -964,15 +955,6 @@ /obj/machinery/vending/coffee/free prices = list() -/obj/machinery/vending/coffee/Initialize(mapload) - component_parts = list() - var/obj/item/circuitboard/vendor/V = new(null) - V.set_type(type) - component_parts += V - component_parts += new /obj/item/vending_refill/coffee(null) - RefreshParts() - return ..() - /obj/machinery/vending/coffee/item_slot_check(mob/user, obj/item/I) if(!(istype(I, /obj/item/reagent_containers/glass) || istype(I, /obj/item/reagent_containers/food/drinks))) return FALSE @@ -1029,14 +1011,6 @@ /obj/machinery/vending/snack/free prices = list() -/obj/machinery/vending/snack/Initialize(mapload) - component_parts = list() - var/obj/item/circuitboard/vendor/V = new(null) - V.set_type(type) - component_parts += V - component_parts += new /obj/item/vending_refill/snack(null) - RefreshParts() - return ..() /obj/machinery/vending/chinese name = "\improper Mr. Chang" @@ -1052,14 +1026,6 @@ /obj/machinery/vending/chinese/free prices = list() -/obj/machinery/vending/chinese/Initialize(mapload) - component_parts = list() - var/obj/item/circuitboard/vendor/V = new(null) - V.set_type(type) - component_parts += V - component_parts += new /obj/item/vending_refill/chinese(null) - RefreshParts() - return ..() /obj/machinery/vending/cola name = "\improper Robust Softdrinks" @@ -1079,15 +1045,6 @@ /obj/machinery/vending/cola/free prices = list() -/obj/machinery/vending/cola/Initialize(mapload) - component_parts = list() - var/obj/item/circuitboard/vendor/V = new(null) - V.set_type(type) - component_parts += V - component_parts += new /obj/item/vending_refill/cola(null) - RefreshParts() - return ..() - /obj/machinery/vending/cart name = "\improper PTech" @@ -1107,14 +1064,6 @@ /obj/machinery/vending/cart/free prices = list() -/obj/machinery/vending/cart/Initialize(mapload) - component_parts = list() - var/obj/item/circuitboard/vendor/V = new(null) - V.set_type(type) - component_parts += V - component_parts += new /obj/item/vending_refill/cart(null) - RefreshParts() - return ..() /obj/machinery/vending/liberationstation name = "\improper Liberation Station" @@ -1161,6 +1110,7 @@ armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50) resistance_flags = FIRE_PROOF + /obj/machinery/vending/cigarette name = "cigarette machine" desc = "If you want to get cancer, might as well do it in style." @@ -1190,6 +1140,7 @@ /obj/machinery/vending/cigarette/syndicate/free prices = list() + /obj/machinery/vending/cigarette/beach //Used in the lavaland_biodome_beach.dmm ruin name = "\improper ShadyCigs Ultra" desc = "Now with extra premium products!" @@ -1208,14 +1159,6 @@ /obj/item/lighter/zippo = 3) prices = list() -/obj/machinery/vending/cigarette/Initialize(mapload) - component_parts = list() - var/obj/item/circuitboard/vendor/V = new(null) - V.set_type(type) - component_parts += V - component_parts += new /obj/item/vending_refill/cigarette(null) - RefreshParts() - return ..() /obj/machinery/vending/medical name = "\improper NanoMed Plus" @@ -1242,14 +1185,6 @@ name = "\improper SyndiMed Plus" req_access = list(ACCESS_SYNDICATE) -/obj/machinery/vending/medical/Initialize(mapload) - component_parts = list() - var/obj/item/circuitboard/vendor/V = new(null) - V.set_type(type) - component_parts += V - component_parts += new /obj/item/vending_refill/medical(null) - RefreshParts() - return ..() /obj/machinery/vending/plasmaresearch name = "\improper Toximate 3000" @@ -1258,6 +1193,7 @@ /obj/item/wirecutters = 1, /obj/item/assembly/timer = 8) contraband = list(/obj/item/flashlight = 5, /obj/item/assembly/voice = 3, /obj/item/assembly/health = 3, /obj/item/assembly/infra = 3) + /obj/machinery/vending/wallmed name = "\improper NanoMed" desc = "Wall-mounted Medical Equipment dispenser." @@ -1271,14 +1207,6 @@ resistance_flags = FIRE_PROOF refill_canister = /obj/item/vending_refill/wallmed -/obj/machinery/vending/wallmed/Initialize(mapload) - component_parts = list() - var/obj/item/circuitboard/vendor/V = new(null) - V.set_type(type) - component_parts += V - component_parts += new /obj/item/vending_refill/wallmed(null) - RefreshParts() - return ..() /obj/machinery/vending/wallmed/syndicate name = "\improper SyndiMed Plus" @@ -1290,6 +1218,7 @@ products = list(/obj/item/stack/medical/bruise_pack = 2,/obj/item/stack/medical/ointment = 2,/obj/item/reagent_containers/hypospray/autoinjector = 4,/obj/item/healthanalyzer = 1) contraband = list(/obj/item/reagent_containers/syringe/charcoal = 4,/obj/item/reagent_containers/syringe/antiviral = 4,/obj/item/reagent_containers/food/pill/tox = 1) + /obj/machinery/vending/security name = "\improper SecTech" desc = "A security equipment vendor." @@ -1303,14 +1232,6 @@ contraband = list(/obj/item/clothing/glasses/sunglasses = 2,/obj/item/storage/fancy/donut_box = 2,/obj/item/hailer = 5) refill_canister = /obj/item/vending_refill/security -/obj/machinery/vending/security/Initialize(mapload) - component_parts = list() - var/obj/item/circuitboard/vendor/V = new(null) - V.set_type(type) - component_parts += V - component_parts += new /obj/item/vending_refill/security(null) - RefreshParts() - return ..() /obj/machinery/vending/hydronutrients name = "\improper NutriMax" @@ -1324,14 +1245,6 @@ contraband = list(/obj/item/reagent_containers/glass/bottle/ammonia = 10,/obj/item/reagent_containers/glass/bottle/diethylamine = 5) refill_canister = /obj/item/vending_refill/hydronutrients -/obj/machinery/vending/hydronutrients/Initialize(mapload) - component_parts = list() - var/obj/item/circuitboard/vendor/V = new(null) - V.set_type(type) - component_parts += V - component_parts += new /obj/item/vending_refill/hydronutrients(null) - RefreshParts() - return ..() /obj/machinery/vending/hydroseeds name = "\improper MegaSeed Servitor" @@ -1394,14 +1307,6 @@ premium = list(/obj/item/reagent_containers/spray/waterflower = 1) refill_canister = /obj/item/vending_refill/hydroseeds -/obj/machinery/vending/hydroseeds/Initialize(mapload) - component_parts = list() - var/obj/item/circuitboard/vendor/V = new(null) - V.set_type(type) - component_parts += V - component_parts += new /obj/item/vending_refill/hydroseeds(null) - RefreshParts() - return ..() /obj/machinery/vending/magivend name = "\improper MagiVend" @@ -1429,6 +1334,7 @@ armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50) resistance_flags = FIRE_PROOF + /obj/machinery/vending/autodrobe name = "\improper AutoDrobe" desc = "A vending machine for costumes." @@ -1564,14 +1470,6 @@ /obj/item/clothing/head/cuban_hat = 1) refill_canister = /obj/item/vending_refill/autodrobe -/obj/machinery/vending/autodrobe/Initialize(mapload) - component_parts = list() - var/obj/item/circuitboard/vendor/V = new(null) - V.set_type(type) - component_parts += V - component_parts += new /obj/item/vending_refill/autodrobe(null) - RefreshParts() - return ..() /obj/machinery/vending/dinnerware name = "\improper Plasteel Chef's Dinnerware Vendor" @@ -1602,14 +1500,6 @@ contraband = list(/obj/item/kitchen/rollingpin = 2, /obj/item/kitchen/knife/butcher = 2) refill_canister = /obj/item/vending_refill/dinnerware -/obj/machinery/vending/dinnerware/Initialize(mapload) - component_parts = list() - var/obj/item/circuitboard/vendor/V = new(null) - V.set_type(type) - component_parts += V - component_parts += new /obj/item/vending_refill/dinnerware(null) - RefreshParts() - return ..() /obj/machinery/vending/sovietsoda name = "\improper BODA" @@ -1621,14 +1511,6 @@ resistance_flags = FIRE_PROOF refill_canister = /obj/item/vending_refill/sovietsoda -/obj/machinery/vending/sovietsoda/Initialize(mapload) - component_parts = list() - var/obj/item/circuitboard/vendor/V = new(null) - V.set_type(type) - component_parts += V - component_parts += new /obj/item/vending_refill/sovietsoda(null) - RefreshParts() - return ..() /obj/machinery/vending/tool name = "\improper YouTool" @@ -1639,9 +1521,11 @@ /obj/item/wrench = 5,/obj/item/analyzer = 5,/obj/item/t_scanner = 5,/obj/item/screwdriver = 5) contraband = list(/obj/item/weldingtool/hugetank = 2,/obj/item/clothing/gloves/color/fyellow = 2) premium = list(/obj/item/clothing/gloves/color/yellow = 1) + refill_canister = /obj/item/vending_refill/youtool armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 70) resistance_flags = FIRE_PROOF + /obj/machinery/vending/engivend name = "\improper Engi-Vend" desc = "Spare tool vending. What? Did you expect some witty description?" @@ -1653,14 +1537,6 @@ premium = list(/obj/item/storage/belt/utility = 3) refill_canister = /obj/item/vending_refill/engivend -/obj/machinery/vending/engivend/Initialize(mapload) - component_parts = list() - var/obj/item/circuitboard/vendor/V = new(null) - V.set_type(type) - component_parts += V - component_parts += new /obj/item/vending_refill/engivend(null) - RefreshParts() - return ..() /obj/machinery/vending/engineering name = "\improper Robco Tool Maker" @@ -1676,14 +1552,6 @@ /obj/item/stock_parts/matter_bin = 5,/obj/item/stock_parts/manipulator = 5) refill_canister = /obj/item/vending_refill/engineering -/obj/machinery/vending/engineering/Initialize(mapload) - component_parts = list() - var/obj/item/circuitboard/vendor/V = new(null) - V.set_type(type) - component_parts += V - component_parts += new /obj/item/vending_refill/engineering(null) - RefreshParts() - return ..() /obj/machinery/vending/robotics name = "\improper Robotech Deluxe" @@ -1697,14 +1565,6 @@ /obj/item/screwdriver = 5,/obj/item/crowbar = 5) refill_canister = /obj/item/vending_refill/robotics -/obj/machinery/vending/robotics/Initialize(mapload) - component_parts = list() - var/obj/item/circuitboard/vendor/V = new(null) - V.set_type(type) - component_parts += V - component_parts += new /obj/item/vending_refill/robotics(null) - RefreshParts() - return ..() /obj/machinery/vending/sustenance name = "\improper Sustenance Vendor" @@ -1721,14 +1581,6 @@ /obj/item/clothing/mask/breath = 6) refill_canister = /obj/item/vending_refill/sustenance -/obj/machinery/vending/sustenance/Initialize(mapload) - component_parts = list() - var/obj/item/circuitboard/vendor/V = new(null) - V.set_type(type) - component_parts += V - component_parts += new /obj/item/vending_refill/sustenance(null) - RefreshParts() - return ..() /obj/machinery/vending/hatdispenser name = "\improper Hatlord 9000" @@ -1745,14 +1597,6 @@ premium = list(/obj/item/clothing/head/soft/rainbow = 1) refill_canister = /obj/item/vending_refill/hatdispenser -/obj/machinery/vending/hatdispenser/Initialize(mapload) - component_parts = list() - var/obj/item/circuitboard/vendor/V = new(null) - V.set_type(type) - component_parts += V - component_parts += new /obj/item/vending_refill/hatdispenser(null) - RefreshParts() - return ..() /obj/machinery/vending/suitdispenser name = "\improper Suitlord 9000" @@ -1766,14 +1610,6 @@ premium = list(/obj/item/clothing/under/rainbow = 1) refill_canister = /obj/item/vending_refill/suitdispenser -/obj/machinery/vending/suitdispenser/Initialize(mapload) - component_parts = list() - var/obj/item/circuitboard/vendor/V = new(null) - V.set_type(type) - component_parts += V - component_parts += new /obj/item/vending_refill/suitdispenser(null) - RefreshParts() - return ..() /obj/machinery/vending/shoedispenser name = "\improper Shoelord 9000" @@ -1785,14 +1621,6 @@ premium = list(/obj/item/clothing/shoes/rainbow = 1) refill_canister = /obj/item/vending_refill/shoedispenser -/obj/machinery/vending/shoedispenser/Initialize(mapload) - component_parts = list() - var/obj/item/circuitboard/vendor/V = new(null) - V.set_type(type) - component_parts += V - component_parts += new /obj/item/vending_refill/shoedispenser(null) - RefreshParts() - return ..() /obj/machinery/vending/syndicigs name = "\improper Suspicious Cigarette Machine" @@ -1803,6 +1631,7 @@ icon_state = "cigs" products = list(/obj/item/storage/fancy/cigarettes/syndicate = 10,/obj/item/lighter/random = 5) + /obj/machinery/vending/syndisnack name = "\improper Getmore Chocolate Corp" desc = "A modified snack machine courtesy of the Getmore Chocolate Corporation, based out of Mars" @@ -1812,6 +1641,7 @@ products = list(/obj/item/reagent_containers/food/snacks/chips =6,/obj/item/reagent_containers/food/snacks/sosjerky = 6, /obj/item/reagent_containers/food/snacks/syndicake = 6, /obj/item/reagent_containers/food/snacks/cheesiehonkers = 6) + //don't forget to change the refill size if you change the machine's contents! /obj/machinery/vending/clothing name = "\improper ClothesMate" //renamed to make the slogan rhyme @@ -1907,14 +1737,6 @@ refill_canister = /obj/item/vending_refill/clothing -/obj/machinery/vending/clothing/Initialize(mapload) - component_parts = list() - var/obj/item/circuitboard/vendor/V = new(null) - V.set_type(type) - component_parts += V - component_parts += new /obj/item/vending_refill/clothing(null) - RefreshParts() - return ..() /obj/machinery/vending/artvend name = "\improper ArtVend" @@ -1931,6 +1753,7 @@ contraband = list(/obj/item/toy/crayon/mime = 1,/obj/item/toy/crayon/rainbow = 1) premium = list(/obj/item/poster/random_contraband = 5) + /obj/machinery/vending/crittercare name = "\improper CritterCare" desc = "A vending machine for pet supplies." @@ -1955,11 +1778,3 @@ /obj/machinery/vending/crittercare/free prices = list() -/obj/machinery/vending/crittercare/Initialize(mapload) - component_parts = list() - var/obj/item/circuitboard/vendor/V = new(null) - V.set_type(type) - component_parts += V - component_parts += new /obj/item/vending_refill/crittercare(null) - RefreshParts() - return ..() diff --git a/code/game/machinery/wishgranter.dm b/code/game/machinery/wishgranter.dm index c4c4c674294..d762543f807 100644 --- a/code/game/machinery/wishgranter.dm +++ b/code/game/machinery/wishgranter.dm @@ -57,7 +57,7 @@ to_chat(user, "You feel a dark stirring inside of the Wish Granter, something you want nothing of. Your instincts are better than any man's.") return TRUE - if(is_special_character(user) || jobban_isbanned(user, ROLE_TRAITOR) || jobban_isbanned(user, "Syndicate")) + if(is_special_character(user) || jobban_isbanned(user, ROLE_TRAITOR) || jobban_isbanned(user, ROLE_SYNDICATE)) to_chat(user, "Something instinctual makes you pull away.") return TRUE diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm index be1f5783552..98d3a2a2f13 100644 --- a/code/game/mecha/equipment/tools/medical_tools.dm +++ b/code/game/mecha/equipment/tools/medical_tools.dm @@ -483,7 +483,7 @@ if(R.can_synth && add_known_reagent(R.id, R.name)) occupant_message("Reagent analyzed, identified as [R.name] and added to database.") send_byjax(chassis.occupant,"msyringegun.browser","reagents_form",get_reagents_form()) - occupant_message("Analyzis complete.") + occupant_message("Analysis complete.") return 1 /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/proc/add_known_reagent(r_id,r_name) diff --git a/code/game/mecha/equipment/tools/work_tools.dm b/code/game/mecha/equipment/tools/work_tools.dm index f78b34078eb..96ee16ac81e 100644 --- a/code/game/mecha/equipment/tools/work_tools.dm +++ b/code/game/mecha/equipment/tools/work_tools.dm @@ -30,28 +30,38 @@ return if(!cargo_holder) return - if(istype(target,/obj)) + if(isobj(target)) var/obj/O = target - if(!O.anchored) - if(cargo_holder.cargo.len < cargo_holder.cargo_capacity) - chassis.visible_message("[chassis] lifts [target] and starts to load it into cargo compartment.") - O.anchored = 1 - if(do_after_cooldown(target)) - cargo_holder.cargo += O - O.loc = chassis - O.anchored = 0 - occupant_message("[target] successfully loaded.") - log_message("Loaded [O]. Cargo compartment capacity: [cargo_holder.cargo_capacity - cargo_holder.cargo.len]") - else - O.anchored = initial(O.anchored) - else - occupant_message("Not enough room in cargo compartment!") - else + if(istype(target, /obj/machinery/power/supermatter_crystal)) //No, you can't pick up the SM with this you moron, did you think you were clever? + var/obj/mecha/working/ripley/R = chassis + QDEL_LIST(R.cargo) //We don't want to drop cargo that just spam hits the SM, let's delete it + occupant_message("You realise in horror what you have done as [chassis] starts warping around you!") + chassis.occupant.dust() + target.Bumped(chassis) + return + if(O.anchored) occupant_message("[target] is firmly secured!") + return + if(length(cargo_holder.cargo) >= cargo_holder.cargo_capacity) + occupant_message("Not enough room in cargo compartment!") + return + chassis.visible_message("[chassis] lifts [target] and starts to load it into cargo compartment.") + var/anchor_state_before_load = O.anchored + O.anchored = TRUE + if(!do_after_cooldown(target)) + O.anchored = anchor_state_before_load + return + cargo_holder.cargo += O + O.forceMove(chassis) + O.anchored = FALSE + occupant_message("[target] was successfully loaded.") + log_message("Loaded [O]. Cargo compartment capacity: [cargo_holder.cargo_capacity - length(cargo_holder.cargo)]") + return - else if(istype(target,/mob/living)) + if(isliving(target)) var/mob/living/M = target - if(M.stat == DEAD) return + if(M.stat == DEAD) + return if(chassis.occupant.a_intent == INTENT_HARM) M.take_overall_damage(dam_force) if(!M) @@ -62,12 +72,10 @@ "You hear something crack.") add_attack_logs(chassis.occupant, M, "Squeezed with [src] ([uppertext(chassis.occupant.a_intent)]) ([uppertext(damtype)])") start_cooldown() - else - step_away(M,chassis) - occupant_message("You push [target] out of the way.") - chassis.visible_message("[chassis] pushes [target] out of the way.") - return 1 - + return + step_away(M, chassis) + occupant_message("You push [target] out of the way.") + chassis.visible_message("[chassis] pushes [target] out of the way.") //This is pretty much just for the death-ripley @@ -220,7 +228,7 @@ switch(mode) if(0) if(istype(target, /turf/simulated/wall)) - if(istype(target, /turf/simulated/wall/r_wall) && !canRwall) + if((istype(target, /turf/simulated/wall/r_wall) && !canRwall) || istype(target, /turf/simulated/wall/indestructible)) return 0 var/turf/simulated/wall/W = target occupant_message("Deconstructing [target]...") diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 2c9682702f6..00ddb73f497 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -1200,7 +1200,8 @@ /obj/mecha/Exited(atom/movable/M, atom/newloc) if(occupant && occupant == M) // The occupant exited the mech without calling go_out() - go_out(1, newloc) + if(!isAI(occupant)) //This causes carded AIS to gib, so we do not want this to be called during carding. + go_out(1, newloc) /obj/mecha/proc/go_out(forced, atom/newloc = loc) if(!occupant) @@ -1507,7 +1508,7 @@ if(internal_tank) WR.crowbar_salvage += internal_tank internal_tank.forceMove(WR) - cell = null + internal_tank = null . = ..() /obj/mecha/CtrlClick(mob/living/L) diff --git a/code/game/mecha/mecha_parts.dm b/code/game/mecha/mecha_parts.dm index 4bb7f96e66f..52b3a2263fa 100644 --- a/code/game/mecha/mecha_parts.dm +++ b/code/game/mecha/mecha_parts.dm @@ -347,117 +347,121 @@ ///////// Circuitboards /obj/item/circuitboard/mecha - name = "Exosuit Circuit board" - icon = 'icons/obj/module.dmi' icon_state = "std_mod" - item_state = "electronic" board_type = "other" flags = CONDUCT - force = 5.0 - w_class = WEIGHT_CLASS_SMALL - throwforce = 5.0 + force = 5 + throwforce = 5 throw_speed = 3 throw_range = 15 + /obj/item/circuitboard/mecha/ripley origin_tech = "programming=2" +/obj/item/circuitboard/mecha/ripley/main + board_name = "Ripley Central Control Module" + icon_state = "mainboard" + /obj/item/circuitboard/mecha/ripley/peripherals - name = "Circuit board (Ripley Peripherals Control module)" + board_name = "Ripley Peripherals Control Module" icon_state = "mcontroller" -/obj/item/circuitboard/mecha/ripley/main - name = "Circuit board (Ripley Central Control module)" - icon_state = "mainboard" /obj/item/circuitboard/mecha/gygax origin_tech = "programming=4;combat=3;engineering=3" +/obj/item/circuitboard/mecha/gygax/main + board_name = "Gygax Central Control Module" + icon_state = "mainboard" + /obj/item/circuitboard/mecha/gygax/peripherals - name = "Circuit board (Gygax Peripherals Control module)" + board_name = "Gygax Peripherals Control Module" icon_state = "mcontroller" /obj/item/circuitboard/mecha/gygax/targeting - name = "Circuit board (Gygax Weapon Control and Targeting module)" + board_name = "Gygax Weapon Control and Targeting Module" icon_state = "mcontroller" origin_tech = "programming=4;combat=4" -/obj/item/circuitboard/mecha/gygax/main - name = "Circuit board (Gygax Central Control module)" - icon_state = "mainboard" /obj/item/circuitboard/mecha/durand origin_tech = "programming=4;combat=3;engineering=3" +/obj/item/circuitboard/mecha/durand/main + board_name = "Durand Central Control Module" + icon_state = "mainboard" + /obj/item/circuitboard/mecha/durand/peripherals - name = "Circuit board (Durand Peripherals Control module)" + board_name = "Durand Peripherals Control Module" icon_state = "mcontroller" /obj/item/circuitboard/mecha/durand/targeting - name = "Circuit board (Durand Weapon Control and Targeting module)" + board_name = "Durand Weapon Control and Targeting Module" icon_state = "mcontroller" origin_tech = "programming=4;combat=4;engineering=3" -/obj/item/circuitboard/mecha/durand/main - name = "Circuit board (Durand Central Control module)" - icon_state = "mainboard" /obj/item/circuitboard/mecha/phazon origin_tech = "programming=5;plasmatech=4" +/obj/item/circuitboard/mecha/phazon/main + board_name = "Phazon Central Control Module" + icon_state = "mainboard" + /obj/item/circuitboard/mecha/phazon/peripherals - name = "Circuit board (Phazon Peripherals Control module)" + board_name = "Phazon Peripherals Control Module" icon_state = "mcontroller" /obj/item/circuitboard/mecha/phazon/targeting - name = "Circuit board (Phazon Weapon Control and Targeting module)" + board_name = "Phazon Weapon Control and Targeting Module" icon_state = "mcontroller" -/obj/item/circuitboard/mecha/phazon/main - name = "Circuit board (Phazon Central Control module)" - icon_state = "mainboard" /obj/item/circuitboard/mecha/honker origin_tech = "programming=3;engineering=3" +/obj/item/circuitboard/mecha/honker/main + board_name = "H.O.N.K Central Control Module" + icon_state = "mainboard" + /obj/item/circuitboard/mecha/honker/peripherals - name = "Circuit board (H.O.N.K Peripherals Control module)" + board_name = "H.O.N.K Peripherals Control Module" icon_state = "mcontroller" /obj/item/circuitboard/mecha/honker/targeting - name = "Circuit board (H.O.N.K Weapon Control and Targeting module)" + board_name = "H.O.N.K Weapon Control and Targeting Module" icon_state = "mcontroller" -/obj/item/circuitboard/mecha/honker/main - name = "Circuit board (H.O.N.K Central Control module)" - icon_state = "mainboard" /obj/item/circuitboard/mecha/reticence origin_tech = "programming=3;engineering=3" +/obj/item/circuitboard/mecha/reticence/main + board_name = "Reticence Central Control Module" + icon_state = "mainboard" + /obj/item/circuitboard/mecha/reticence/peripherals - name = "circuit board (Reticence Peripherals Control module)" + board_name = "Reticence Peripherals Control Module" icon_state = "mcontroller" /obj/item/circuitboard/mecha/reticence/targeting - name = "circuit board (Reticence Weapon Control and Targeting module)" + board_name = "Reticence Weapon Control and Targeting Module" icon_state = "mcontroller" -/obj/item/circuitboard/mecha/reticence/main - name = "circuit board (Reticence Central Control module)" - icon_state = "mainboard" /obj/item/circuitboard/mecha/odysseus origin_tech = "programming=3;biotech=3" +/obj/item/circuitboard/mecha/odysseus/main + board_name = "Odysseus Central Control Module" + icon_state = "mainboard" + /obj/item/circuitboard/mecha/odysseus/peripherals - name = "Circuit board (Odysseus Peripherals Control module)" + board_name = "Odysseus Peripherals Control Module" icon_state = "mcontroller" -/obj/item/circuitboard/mecha/odysseus/main - name = "Circuit board (Odysseus Central Control module)" - icon_state = "mainboard" /obj/item/circuitboard/mecha/pod - name = "Circuit board (Space Pod Mainboard)" + board_name = "Space Pod Mainboard" icon_state = "mainboard" diff --git a/code/game/mecha/mecha_wreckage.dm b/code/game/mecha/mecha_wreckage.dm index d061d2e2005..130b3689644 100644 --- a/code/game/mecha/mecha_wreckage.dm +++ b/code/game/mecha/mecha_wreckage.dm @@ -59,7 +59,7 @@ user.visible_message("[user] pries [S] from [src].", "You pry [S] from [src].") crowbar_salvage -= S return - to_chat(user, "You don't see anything that can be cut with [I]!") + to_chat(user, "You don't see anything that can be pried with [I]!") /obj/structure/mecha_wreckage/welder_act(mob/user, obj/item/I) . = TRUE diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index e3c14ff459c..6ef46e63d85 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -122,6 +122,10 @@ if(!in_range(user, src) || !isturf(user.loc) || user.incapacitated() || M.anchored) return FALSE + if (isguardian(user)) + if (M.loc == user.loc || user.alpha == 60) //Alpha is for detecting ranged guardians in scout mode + return //unmanifested guardians shouldn't be able to buckle mobs + add_fingerprint(user) . = buckle_mob(M, check_loc = check_loc) if(.) diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm index ca92d2da319..6f18d7a9588 100644 --- a/code/game/objects/effects/decals/cleanable.dm +++ b/code/game/objects/effects/decals/cleanable.dm @@ -53,6 +53,9 @@ /obj/effect/decal/cleanable/proc/can_bloodcrawl_in() return FALSE +/obj/effect/decal/cleanable/is_cleanable() + return TRUE + /obj/effect/decal/cleanable/Initialize(mapload) . = ..() if(loc && isturf(loc)) diff --git a/code/game/objects/effects/effects.dm b/code/game/objects/effects/effects.dm index 9053786e554..247a29fa13f 100644 --- a/code/game/objects/effects/effects.dm +++ b/code/game/objects/effects/effects.dm @@ -25,6 +25,9 @@ /obj/effect/acid_act() return +/obj/effect/proc/is_cleanable() //Called when you want to clean something, and usualy delete it after + return FALSE + /obj/effect/mech_melee_attack(obj/mecha/M) return 0 diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index 6e57fab9bb6..dd0a513de88 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -135,8 +135,7 @@ var/red_splash = list(1,0,0,0.8,0.2,0, 0.8,0,0.2,0.1,0,0) var/pure_red = list(0,0,0,0,0,0,0,0,0,1,0,0) - spawn(0) - new /obj/effect/hallucination/delusion(victim.loc, victim, force_kind = "demon", duration = duration, skip_nearby = 0) + new /obj/effect/hallucination/delusion(get_turf(victim), victim, 'icons/mob/mob.dmi', "daemon") var/obj/item/twohanded/required/chainsaw/doomslayer/chainsaw = new(victim.loc) chainsaw.flags |= NODROP | DROPDEL diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm index a2b084463a4..5bf804105a0 100644 --- a/code/game/objects/effects/portals.dm +++ b/code/game/objects/effects/portals.dm @@ -14,6 +14,7 @@ var/precision = TRUE // how close to the portal you will teleport. FALSE = on the portal, TRUE = adjacent var/can_multitool_to_remove = FALSE var/ignore_tele_proof_area_setting = FALSE + var/one_use = FALSE // Does this portal go away after one teleport? /obj/effect/portal/New(loc, turf/target, creator = null, lifespan = 300) ..() @@ -101,14 +102,17 @@ if(prob(failchance)) icon_state = fail_icon - if(!do_teleport(M, locate(rand(5, world.maxx - 5), rand(5, world.maxy -5), 3), 0, bypass_area_flag = ignore_tele_proof_area_setting)) // Try to send them to deep space. + var/list/target_z = levels_by_trait(SPAWN_RUINS) + target_z -= M.z + if(!do_teleport(M, locate(rand(5, world.maxx - 5), rand(5, world.maxy -5), pick(target_z)), 0, bypass_area_flag = ignore_tele_proof_area_setting)) // Try to send them to deep space. invalid_teleport() return FALSE else if(!do_teleport(M, target, precision, bypass_area_flag = ignore_tele_proof_area_setting)) // Try to send them to a turf adjacent to target. invalid_teleport() return FALSE - + if(one_use) + qdel(src) return TRUE /obj/effect/portal/proc/invalid_teleport() diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm index 298c6686df2..c6de27524c2 100644 --- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm +++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm @@ -354,3 +354,12 @@ /obj/effect/temp_visual/impact_effect/ion icon_state = "shieldsparkles" duration = 6 + +/obj/effect/temp_visual/bsg_kaboom + name = "bluespace explosion" + icon = 'icons/effects/96x96.dmi' + icon_state = "explosionfast" + color = "blue" + pixel_x = -32 + pixel_y = -32 + duration = 42 diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 138708f4f81..2d014e9e6c2 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -424,6 +424,17 @@ GLOBAL_DATUM_INIT(fire_overlay, /image, image("icon" = 'icons/goonstation/effect /obj/item/proc/on_enter_storage(obj/item/storage/S as obj) return +/** + * Called to check if this item can be put into a storage item. + * + * Return `FALSE` if `src` can't be inserted, and `TRUE` if it can. + * Arguments: + * * S - The [/obj/item/storage] that `src` is being inserted into. + * * user - The mob trying to insert the item. + */ +/obj/item/proc/can_enter_storage(obj/item/storage/S, mob/user) + return TRUE + // called when "found" in pockets and storage items. Returns 1 if the search should end. /obj/item/proc/on_found(mob/finder as mob) return diff --git a/code/game/objects/items/candle.dm b/code/game/objects/items/candle.dm index 5bab3d47fde..9e912478713 100644 --- a/code/game/objects/items/candle.dm +++ b/code/game/objects/items/candle.dm @@ -30,6 +30,12 @@ else i = 3 icon_state = "candle[i][lit ? "_lit" : ""]" +/obj/item/candle/can_enter_storage(obj/item/storage/S, mob/user) + if(lit) + to_chat(user, "[S] can't hold [src] while it's lit!") + return FALSE + else + return TRUE /obj/item/candle/attackby(obj/item/W, mob/user, params) if(is_hot(W)) diff --git a/code/game/objects/items/changestone.dm b/code/game/objects/items/changestone.dm deleted file mode 100644 index 0f3851e1777..00000000000 --- a/code/game/objects/items/changestone.dm +++ /dev/null @@ -1,23 +0,0 @@ -/obj/item/changestone - name = "An uncut ruby" - desc = "The ruby shines and catches the light, despite being uncut" - icon = 'icons/obj/artifacts.dmi' - icon_state = "changerock" - -/obj/item/changestone/attack_hand(mob/user as mob) - if(istype(user,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = user - if(!H.gloves) - if(H.gender == FEMALE) - H.change_gender(MALE) - else - H.change_gender(FEMALE) - H.dna.ready_dna(H) - H.update_body() - ..() - - - - - - diff --git a/code/game/objects/items/devices/radio/beacon.dm b/code/game/objects/items/devices/radio/beacon.dm index 5027676e1d3..87f402939dc 100644 --- a/code/game/objects/items/devices/radio/beacon.dm +++ b/code/game/objects/items/devices/radio/beacon.dm @@ -50,6 +50,10 @@ /obj/item/radio/beacon/bacon/proc/digest_delay() QDEL_IN(src, 600) +/obj/item/radio/beacon/emagged + syndicate = TRUE + emagged = TRUE + // SINGULO BEACON SPAWNER /obj/item/radio/beacon/syndicate name = "suspicious beacon" @@ -71,6 +75,18 @@ user.drop_item() qdel(src) +/obj/item/radio/beacon/syndicate/power_sink + name = "suspicious beacon" + desc = "A label on it reads: Warning: Activating this device will send a power sink to your location." + +/obj/item/radio/beacon/syndicate/power_sink/attack_self(mob/user) + if(user) + to_chat(user, "Locked In") + new /obj/item/powersink(user.loc) + playsound(src, 'sound/effects/pop.ogg', 100, TRUE, 1) + user.drop_item() + qdel(src) + /obj/item/radio/beacon/syndicate/bomb name = "suspicious beacon" desc = "A label on it reads: Warning: Activating this device will send a high-ordinance explosive to your location." diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index 820f95ee092..ca9de14fe7c 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -273,20 +273,20 @@ effective or pretty fucking useless. /obj/item/teleporter/proc/dir_correction(mob/user) //Direction movement, screws with teleport distance and saving throw, and thus must be removed first var/temp_direction = user.dir switch(temp_direction) - if(NORTHEAST || SOUTHEAST) + if(NORTHEAST, SOUTHEAST) user.dir = EAST - if(NORTHWEST || SOUTHWEST) + if(NORTHWEST, SOUTHWEST) user.dir = WEST /obj/item/teleporter/proc/panic_teleport(mob/user, turf/destination, direction = NORTH) var/saving_throw switch(direction) - if(NORTH || SOUTH) + if(NORTH, SOUTH) if(prob(50)) saving_throw = EAST else saving_throw = WEST - if(EAST || WEST) + if(EAST, WEST) if(prob(50)) saving_throw = NORTH else diff --git a/code/game/objects/items/mountable_frames/apc_frame.dm b/code/game/objects/items/mountable_frames/apc_frame.dm index 548b77b85fe..8cabb9c6921 100644 --- a/code/game/objects/items/mountable_frames/apc_frame.dm +++ b/code/game/objects/items/mountable_frames/apc_frame.dm @@ -28,5 +28,5 @@ return TRUE /obj/item/mounted/frame/apc_frame/do_build(turf/on_wall, mob/user) - new /obj/machinery/power/apc(get_turf(src), get_dir(user, on_wall), 1) + new /obj/machinery/power/apc(get_turf(src), get_dir(user, on_wall), TRUE) qdel(src) diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index c758e109e81..e3049e47634 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -226,7 +226,7 @@ to_chat(user, "Sticking an empty [M] into the frame would sort of defeat the purpose.") return - if(jobban_isbanned(M.brainmob, "Cyborg") || jobban_isbanned(M.brainmob,"nonhumandept")) + if(jobban_isbanned(M.brainmob, "Cyborg") || jobban_isbanned(M.brainmob, "nonhumandept")) to_chat(user, "This [W] is not fit to serve as a cyborg!") return diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 9ed97abb045..26af8fd9ac2 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -19,7 +19,7 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \ new/datum/stack_recipe/window("fulltile window", /obj/structure/window/full/basic, 2, time = 0, on_floor = TRUE, window_checks = TRUE), \ new/datum/stack_recipe("fishbowl", /obj/machinery/fishtank/bowl, 1, time = 10), \ new/datum/stack_recipe("fish tank", /obj/machinery/fishtank/tank, 3, time = 20, on_floor = TRUE), \ - new/datum/stack_recipe("wall aquariam", /obj/machinery/fishtank/wall, 4, time = 40, on_floor = TRUE) \ + new/datum/stack_recipe("wall aquarium", /obj/machinery/fishtank/wall, 4, time = 40, on_floor = TRUE) \ )) /obj/item/stack/sheet/glass diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index d7567ce575c..14250f49674 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -83,7 +83,6 @@ GLOBAL_LIST_INIT(bananium_recipes, list ( \ null, \ new/datum/stack_recipe("Clown Statue", /obj/structure/statue/bananium/clown, 5, one_per_turf = 1, on_floor = 1), \ null, \ - new/datum/stack_recipe("bananium computer frame", /obj/structure/computerframe/HONKputer, 50, time = 25, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("bananium grenade casing", /obj/item/grenade/bananade/casing, 4, on_floor = 1), \ )) diff --git a/code/game/objects/items/tools/crowbar.dm b/code/game/objects/items/tools/crowbar.dm index c90315ffbeb..9374c68fdd5 100644 --- a/code/game/objects/items/tools/crowbar.dm +++ b/code/game/objects/items/tools/crowbar.dm @@ -9,7 +9,6 @@ slot_flags = SLOT_BELT force = 5 throwforce = 7 - item_state = "crowbar" w_class = WEIGHT_CLASS_SMALL materials = list(MAT_METAL=50) drop_sound = 'sound/items/handling/crowbar_drop.ogg' diff --git a/code/game/objects/items/tools/multitool.dm b/code/game/objects/items/tools/multitool.dm index 61f512eff2e..a488216955c 100644 --- a/code/game/objects/items/tools/multitool.dm +++ b/code/game/objects/items/tools/multitool.dm @@ -83,6 +83,9 @@ if(chunk) if(chunk.seenby.len) for(var/mob/camera/aiEye/A in chunk.seenby) + //Checks if the A is to be detected or not + if(!A.ai_detector_visible) + continue var/turf/detect_turf = get_turf(A) if(get_dist(our_turf, detect_turf) < rangealert) detect_state = PROXIMITY_ON_SCREEN diff --git a/code/game/objects/items/tools/tool_behaviour.dm b/code/game/objects/items/tools/tool_behaviour.dm index 136bea77e6a..8770c1d6383 100644 --- a/code/game/objects/items/tools/tool_behaviour.dm +++ b/code/game/objects/items/tools/tool_behaviour.dm @@ -57,4 +57,8 @@ // Used in a callback that is passed by use_tool into do_after call. Do not override, do not call manually. /obj/item/proc/tool_check_callback(mob/living/user, atom/target, amount, datum/callback/extra_checks) - return tool_use_check(user, amount) && (extra_checks && !extra_checks.Invoke()) + if(!tool_use_check(user, amount)) + return TRUE + if(extra_checks && !extra_checks.Invoke()) + return TRUE + return FALSE diff --git a/code/game/objects/items/tools/welder.dm b/code/game/objects/items/tools/welder.dm index 8ab4c12cf0f..6519703713a 100644 --- a/code/game/objects/items/tools/welder.dm +++ b/code/game/objects/items/tools/welder.dm @@ -16,7 +16,7 @@ w_class = WEIGHT_CLASS_SMALL armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 30) resistance_flags = FIRE_PROOF - materials = list(MAT_METAL=70, MAT_GLASS=30) + materials = list(MAT_METAL = 70, MAT_GLASS = 20) origin_tech = "engineering=1;plasmatech=1" tool_behaviour = TOOL_WELDER toolspeed = 1 @@ -52,6 +52,13 @@ user.visible_message("[user] welds [user.p_their()] every orifice closed! It looks like [user.p_theyre()] trying to commit suicide!") return FIRELOSS +/obj/item/weldingtool/can_enter_storage(obj/item/storage/S, mob/user) + if(tool_enabled) + to_chat(user, "[S] can't hold [src] while it's lit!") + return FALSE + else + return TRUE + /obj/item/weldingtool/process() if(tool_enabled) var/turf/T = get_turf(src) @@ -131,7 +138,7 @@ /obj/item/weldingtool/tool_check_callback(mob/living/user, amount, datum/callback/extra_checks) . = ..() - if(. && user) + if(!. && user) if(progress_flash_divisor == 0) user.flash_eyes(min(light_intensity, 1)) progress_flash_divisor = initial(progress_flash_divisor) diff --git a/code/game/objects/items/weapons/cigs.dm b/code/game/objects/items/weapons/cigs.dm index 42b2f957987..5d3ca5fc919 100644 --- a/code/game/objects/items/weapons/cigs.dm +++ b/code/game/objects/items/weapons/cigs.dm @@ -61,6 +61,12 @@ LIGHTERS ARE IN LIGHTERS.DM else return ..() +/obj/item/clothing/mask/cigarette/can_enter_storage(obj/item/storage/S, mob/user) + if(lit) + to_chat(user, "[S] can't hold [initial(name)] while it's lit!") // initial(name) so it doesn't say "lit" twice in a row + return FALSE + else + return TRUE /obj/item/clothing/mask/cigarette/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE) ..() diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm index 60239b0e6fd..b28988adc8d 100644 --- a/code/game/objects/items/weapons/flamethrower.dm +++ b/code/game/objects/items/weapons/flamethrower.dm @@ -64,11 +64,26 @@ M.update_inv_l_hand() M.update_inv_r_hand() +/obj/item/flamethrower/can_enter_storage(obj/item/storage/S, mob/user) + if(lit) + to_chat(user, "[S] can't hold [src] while it's lit!") + return FALSE + else + return TRUE + /obj/item/flamethrower/afterattack(atom/target, mob/user, flag) . = ..() if(flag) return // too close - if(user && user.get_active_hand() == src) // Make sure our user is still holding us + if(!user) + return + if(user.mind?.martial_art?.no_guns) + to_chat(user, "[user.mind.martial_art.no_guns_message]") + return + if(HAS_TRAIT(user, TRAIT_CHUNKYFINGERS)) + to_chat(user, "Your meaty finger is far too large for the trigger guard!") + return + if(user.get_active_hand() == src) // Make sure our user is still holding us var/turf/target_turf = get_turf(target) if(target_turf) var/turflist = getline(user, target_turf) diff --git a/code/game/objects/items/weapons/grenades/atmosgrenade.dm b/code/game/objects/items/weapons/grenades/atmosgrenade.dm index 536e1ddd1b0..9160cdab10d 100644 --- a/code/game/objects/items/weapons/grenades/atmosgrenade.dm +++ b/code/game/objects/items/weapons/grenades/atmosgrenade.dm @@ -44,11 +44,9 @@ update_mob() playsound(loc, 'sound/effects/empulse.ogg', 50, 1) radiation_pulse(src, rad_damage) - for(var/turf/T in view(freeze_range, loc)) - if(isfloorturf(T)) - var/turf/simulated/F = T - F.MakeSlippery(TURF_WET_PERMAFROST) - for(var/mob/living/carbon/L in T) - L.adjustStaminaLoss(stamina_damage) - L.adjust_bodytemperature(-230) + for(var/turf/simulated/floor/T in view(freeze_range, loc)) + T.MakeSlippery(TURF_WET_ICE) + for(var/mob/living/carbon/L in T) + L.adjustStaminaLoss(stamina_damage) + L.adjust_bodytemperature(-230) qdel(src) diff --git a/code/game/objects/items/weapons/lighters.dm b/code/game/objects/items/weapons/lighters.dm index 713988c0a01..7d7a929fa4a 100644 --- a/code/game/objects/items/weapons/lighters.dm +++ b/code/game/objects/items/weapons/lighters.dm @@ -29,6 +29,13 @@ else turn_off_lighter(user) +/obj/item/lighter/can_enter_storage(obj/item/storage/S, mob/user) + if(lit) + to_chat(user, "[S] can't hold [src] while it's lit!") + return FALSE + else + return TRUE + /obj/item/lighter/proc/turn_on_lighter(mob/living/user) lit = TRUE w_class = WEIGHT_CLASS_BULKY @@ -227,6 +234,13 @@ matchburnout() . = ..() +/obj/item/match/can_enter_storage(obj/item/storage/S, mob/user) + if(lit) + to_chat(user, "[S] can't hold [initial(name)] while it's lit!") // initial(name) so it doesn't say "lit" twice in a row + return FALSE + else + return TRUE + /obj/item/match/attack(mob/living/carbon/M, mob/living/carbon/user) if(!isliving(M)) return ..() diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm index 419df51bbd4..3221f0f637c 100644 --- a/code/game/objects/items/weapons/mop.dm +++ b/code/game/objects/items/weapons/mop.dm @@ -28,7 +28,7 @@ if(reagents.has_reagent("water", 1) || reagents.has_reagent("cleaner", 1) || reagents.has_reagent("holywater", 1)) A.clean_blood() for(var/obj/effect/O in A) - if(is_cleanable(O)) + if(O.is_cleanable()) qdel(O) reagents.reaction(A, REAGENT_TOUCH, 10) //10 is the multiplier for the reaction effect. probably needed to wet the floor properly. reagents.remove_any(1) //reaction() doesn't use up the reagents diff --git a/code/game/objects/items/weapons/rpd.dm b/code/game/objects/items/weapons/rpd.dm index a39d1a2d987..258caf8b424 100644 --- a/code/game/objects/items/weapons/rpd.dm +++ b/code/game/objects/items/weapons/rpd.dm @@ -142,6 +142,8 @@ /obj/item/rpd/proc/delete_all_pipes(mob/user, turf/T) //Delete all pipes on a turf var/eaten for(var/obj/item/pipe/P in T) + if(P.pipe_type == PIPE_CIRCULATOR) //Skip TEG heat circulators, they aren't really pipes + continue QDEL_NULL(P) eaten = TRUE for(var/obj/item/pipe_gsensor/G in T) diff --git a/code/game/objects/items/weapons/soap.dm b/code/game/objects/items/weapons/soap.dm index 567f67b4106..8f199f6f398 100644 --- a/code/game/objects/items/weapons/soap.dm +++ b/code/game/objects/items/weapons/soap.dm @@ -52,7 +52,7 @@ /obj/item/soap/proc/clean_turf(turf/simulated/T) T.clean_blood() for(var/obj/effect/O in T) - if(is_cleanable(O)) + if(O.is_cleanable()) qdel(O) /obj/item/soap/attack(mob/target as mob, mob/user as mob) diff --git a/code/game/objects/items/weapons/stock_parts.dm b/code/game/objects/items/weapons/stock_parts.dm index ea01683133a..cc063f84fc7 100644 --- a/code/game/objects/items/weapons/stock_parts.dm +++ b/code/game/objects/items/weapons/stock_parts.dm @@ -104,7 +104,7 @@ /obj/item/stock_parts/matter_bin name = "matter bin" - desc = "A container for hold compressed matter awaiting re-construction." + desc = "A container used to hold compressed matter awaiting re-construction." icon_state = "matter_bin" origin_tech = "materials=1" materials = list(MAT_METAL=80) @@ -145,7 +145,7 @@ /obj/item/stock_parts/matter_bin/adv name = "advanced matter bin" - desc = "A container for hold compressed matter awaiting re-construction." + desc = "A container used to hold compressed matter awaiting re-construction." icon_state = "advanced_matter_bin" origin_tech = "materials=3" rating = 2 @@ -187,7 +187,7 @@ /obj/item/stock_parts/matter_bin/super name = "super matter bin" - desc = "A container for hold compressed matter awaiting re-construction." + desc = "A container used to hold compressed matter awaiting re-construction." icon_state = "super_matter_bin" origin_tech = "materials=4;engineering=4" rating = 3 @@ -229,7 +229,7 @@ /obj/item/stock_parts/matter_bin/bluespace name = "bluespace matter bin" - desc = "A container for hold compressed matter awaiting re-construction." + desc = "A container used to hold compressed matter awaiting re-construction." icon_state = "bluespace_matter_bin" origin_tech = "materials=6;programming=4;engineering=4" rating = 4 diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index eb700165441..870ebe470cd 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -230,7 +230,9 @@ /obj/item/flashlight/seclite, /obj/item/holosign_creator/security, /obj/item/melee/classic_baton/telescopic, - /obj/item/restraints/legcuffs/bola) + /obj/item/restraints/legcuffs/bola, + /obj/item/clothing/mask/gas/sechailer, + /obj/item/spacepod_key) /obj/item/storage/belt/security/sec/populate_contents() new /obj/item/flashlight/seclite(src) @@ -447,6 +449,7 @@ item_state = "bandolier" storage_slots = 8 can_hold = list(/obj/item/ammo_casing/shotgun) + display_contents_with_number = TRUE /obj/item/storage/belt/bandolier/Initialize(mapload) . = ..() diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index d1548eb2305..9f145c5bbdb 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -163,7 +163,7 @@ /obj/item/storage/proc/show_to(mob/user) if(!user.client) return - if(user.s_active != src) // Switching from another container + if(user.s_active != src && !isobserver(user)) for(var/obj/item/I in src) if(I.on_found(user)) // For mouse traps and such return // If something triggered, don't open the UI @@ -310,6 +310,9 @@ if(loc == I) return FALSE //Means the item is already in the storage item + if(!I.can_enter_storage(src, usr)) + return FALSE + if(length(contents) >= storage_slots) if(!stop_messages) to_chat(usr, "[I] won't fit in [src], make some space!") diff --git a/code/game/objects/items/weapons/vending_items.dm b/code/game/objects/items/weapons/vending_items.dm index e7743f961f1..c4d4d5090e5 100644 --- a/code/game/objects/items/weapons/vending_items.dm +++ b/code/game/objects/items/weapons/vending_items.dm @@ -114,6 +114,10 @@ machine_name = "Robco Tool Maker" icon_state = "refill_engi" +/obj/item/vending_refill/youtool + machine_name = "YouTool" + icon_state = "refill_engi" + /obj/item/vending_refill/engivend machine_name = "Engi-Vend" icon_state = "refill_engi" diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 16c5f626b84..1ca64c8de37 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -363,6 +363,7 @@ a { /obj/proc/cult_reveal() //Called by cult reveal spell and chaplain's bible return + /obj/proc/force_eject_occupant(mob/target) // This proc handles safely removing occupant mobs from the object if they must be teleported out (due to being SSD/AFK, by admin teleport, etc) or transformed. // In the event that the object doesn't have an overriden version of this proc to do it, log a runtime so one can be added. diff --git a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm index 8bf44346e72..2bf2b03b4a2 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm @@ -69,6 +69,8 @@ togglelock(user) /obj/structure/closet/secure_closet/AltClick(mob/user) + if(opened) + return ..() if(Adjacent(user)) togglelock(user) @@ -78,7 +80,7 @@ locked = FALSE icon_state = icon_off flick(icon_broken, src) - to_chat(user, "You break the lock on \the [src].") + to_chat(user, "You break the lock on [src].") /obj/structure/closet/secure_closet/attack_hand(mob/user) add_fingerprint(user) diff --git a/code/game/objects/structures/crates_lockers/closets/syndicate.dm b/code/game/objects/structures/crates_lockers/closets/syndicate.dm index ccc27c18589..b33b9fa24e4 100644 --- a/code/game/objects/structures/crates_lockers/closets/syndicate.dm +++ b/code/game/objects/structures/crates_lockers/closets/syndicate.dm @@ -23,7 +23,7 @@ /obj/structure/closet/syndicate/suits/populate_contents() new /obj/item/clothing/mask/gas/syndicate(src) new /obj/item/clothing/suit/space/hardsuit/syndi(src) - new /obj/item/tank/jetpack/oxygen/harness(src) + new /obj/item/tank/internals/oxygen/red(src) /obj/structure/closet/syndicate/nuclear desc = "It's a storage unit for a Syndicate boarding party." @@ -37,6 +37,7 @@ new /obj/item/storage/box/teargas(src) new /obj/item/storage/box/flashbangs(src) new /obj/item/storage/backpack/duffel/syndie/med(src) + new /obj/item/tank/jetpack/oxygen/harness(src) new /obj/item/gun/projectile/automatic/shotgun/bulldog(src) new /obj/item/gun/projectile/automatic/shotgun/bulldog(src) new /obj/item/gun/projectile/automatic/shotgun/bulldog(src) @@ -50,7 +51,7 @@ /obj/structure/closet/syndicate/sst/populate_contents() new /obj/item/ammo_box/magazine/mm556x45(src) new /obj/item/gun/projectile/automatic/l6_saw(src) - new /obj/item/tank/jetpack/oxygen/harness(src) + new /obj/item/tank/internals/oxygen/red(src) new /obj/item/storage/belt/military/sst(src) new /obj/item/clothing/glasses/thermal(src) new /obj/item/clothing/shoes/magboots/syndie/advance(src) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index c9d21d5a033..7a235c4001a 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -404,7 +404,7 @@ tile.water_act(100, convertHeat(), src) tile.clean_blood(radiation_clean = TRUE) for(var/obj/effect/E in tile) - if(is_cleanable(E)) + if(E.is_cleanable()) qdel(E) for(var/A in loc) wash(A) diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm index d2109bee2f0..2cbce40cde2 100644 --- a/code/game/turfs/simulated/minerals.dm +++ b/code/game/turfs/simulated/minerals.dm @@ -82,6 +82,7 @@ /turf/simulated/mineral/proc/gets_drilled() if(mineralType && (mineralAmt > 0)) new mineralType(src, mineralAmt) + SSticker.score?.score_ore_mined++ SSblackbox.record_feedback("tally", "ore_mined", mineralAmt, mineralType) for(var/obj/effect/temp_visual/mining_overlay/M in src) qdel(M) diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm index f4f37f313a1..d6698fecc25 100644 --- a/code/game/verbs/ooc.dm +++ b/code/game/verbs/ooc.dm @@ -247,6 +247,70 @@ GLOBAL_VAR_INIT(admin_ooc_colour, "#b82e00") if(send) to_chat(target, "LOOC[prefix]: [display_name][admin_stuff]: [msg]") + +// Ported from /tg/, full credit to SpaceManiac and Timberpoes. +/client/verb/fit_viewport() + set name = "Fit Viewport" + set desc = "Fit the size of the map window to match the viewport." + set category = "OOC" + + // Fetch aspect ratio + var/list/view_size = getviewsize(view) + var/aspect_ratio = view_size[1] / view_size[2] + + // Calculate desired pixel width using window size and aspect ratio + var/list/sizes = params2list(winget(src, "mainwindow.mainvsplit;mapwindow", "size")) + + // Client closed the window? Some other error? This is unexpected behaviour, let's CRASH with some info. + if(!sizes["mapwindow.size"]) + CRASH("sizes does not contain mapwindow.size key. This means a winget() failed to return what we wanted. --- sizes var: [sizes] --- sizes length: [length(sizes)]") + + var/list/map_size = splittext(sizes["mapwindow.size"], "x") + + // Looks like we didn't expect mapwindow.size to be "ixj" where i and j are numbers. + // If we don't get our expected 2 outputs, let's give some useful error info. + if(length(map_size) != 2) + CRASH("map_size of incorrect length --- map_size var: [map_size] --- map_size length: [length(map_size)]") + + + var/height = text2num(map_size[2]) + var/desired_width = round(height * aspect_ratio) + if(text2num(map_size[1]) == desired_width) + // Nothing to do. + return + + var/list/split_size = splittext(sizes["mainwindow.mainvsplit.size"], "x") + var/split_width = text2num(split_size[1]) + + // Avoid auto-resizing the statpanel and chat into nothing. + desired_width = min(desired_width, split_width - 300) + + // Calculate and apply a best estimate + // +4 pixels are for the width of the splitter's handle + var/pct = 100 * (desired_width + 4) / split_width + winset(src, "mainwindow.mainvsplit", "splitter=[pct]") + + // Apply an ever-lowering offset until we finish or fail + var/delta + for(var/safety in 1 to 10) + var/after_size = winget(src, "mapwindow", "size") + map_size = splittext(after_size, "x") + var/produced_width = text2num(map_size[1]) + + if(produced_width == desired_width) + // Success! + return + else if(isnull(delta)) + // Calculate a probably delta based on the difference + delta = 100 * (desired_width - produced_width) / split_width + else if((delta > 0 && produced_width > desired_width) || (delta < 0 && produced_width < desired_width)) + // If we overshot, halve the delta and reverse direction + delta = -delta / 2 + + pct += delta + winset(src, "mainwindow.mainvsplit", "splitter=[pct]") + + /mob/proc/get_looc_source() return src diff --git a/code/game/world.dm b/code/game/world.dm index 0e654fb6e01..b87e195f28c 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -261,6 +261,11 @@ GLOBAL_LIST_EMPTY(world_topic_handlers) start_log(GLOB.sql_log) start_log(GLOB.chat_debug_log) + #ifdef REFERENCE_TRACKING + GLOB.gc_log = "[GLOB.log_directory]/gc_debug.log" + start_log(GLOB.gc_log) + #endif + // This log follows a special format and this path should NOT be used for anything else GLOB.runtime_summary_log = "data/logs/runtime_summary.log" if(fexists(GLOB.runtime_summary_log)) diff --git a/code/modules/admin/NewBan.dm b/code/modules/admin/NewBan.dm index 4169ca380ab..c0233a4c544 100644 --- a/code/modules/admin/NewBan.dm +++ b/code/modules/admin/NewBan.dm @@ -138,7 +138,6 @@ GLOBAL_PROTECT(banlist_savefile) // Obvious reasons log_admin("Ban Expired: [key]") message_admins("Ban Expired: [key]") else - ban_unban_log_save("[key_name_admin(usr)] unbanned [key]") log_admin("[key_name_admin(usr)] unbanned [key]") message_admins("[key_name_admin(usr)] unbanned: [key]") usr.client.holder.DB_ban_unban( ckey(key), BANTYPE_ANY_FULLBAN) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 63591062382..d9146f385e7 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -167,7 +167,12 @@ GLOBAL_LIST_INIT(admin_verbs_debug, list( /client/proc/toggle_medal_disable, /client/proc/uid_log, /client/proc/visualise_active_turfs, - /client/proc/reestablish_db_connection + /client/proc/reestablish_db_connection, + #ifdef REFERENCE_TRACKING + /datum/proc/find_refs, + /datum/proc/qdel_then_find_references, + /datum/proc/qdel_then_if_fail_find_references, + #endif )) GLOBAL_LIST_INIT(admin_verbs_possess, list( /proc/possess, @@ -508,7 +513,6 @@ GLOBAL_LIST_INIT(admin_verbs_ticket, list( return if(++D.warns >= MAX_WARNS) //uh ohhhh...you'reee iiiiin trouuuubble O:) - ban_unban_log_save("[ckey] warned [warned_ckey], resulting in a [AUTOBANTIME] minute autoban.") if(C) message_admins("[key_name_admin(src)] has warned [key_name_admin(C)] resulting in a [AUTOBANTIME] minute ban") log_admin("[key_name(src)] has warned [key_name(C)] resulting in a [AUTOBANTIME] minute ban") diff --git a/code/modules/admin/banjob.dm b/code/modules/admin/banjob.dm index 51b1299079b..fe7c4196488 100644 --- a/code/modules/admin/banjob.dm +++ b/code/modules/admin/banjob.dm @@ -118,10 +118,6 @@ GLOBAL_DATUM_INIT(jobban_regex, /regex, regex("(\[\\S]+) - (\[^#]+\[^# ])(?: ## /proc/jobban_unban_client(ckey, rank) jobban_remove("[ckey] - [rank]") -/proc/ban_unban_log_save(formatted_log) - text2file(formatted_log,"data/ban_unban_log.txt") - - /proc/jobban_remove(X) for(var/i = 1; i <= length(GLOB.jobban_keylist); i++) if( findtext(GLOB.jobban_keylist[i], "[X]") ) diff --git a/code/modules/admin/db_ban/functions.dm b/code/modules/admin/db_ban/functions.dm index 24c2c558e2e..9d0be1f83b5 100644 --- a/code/modules/admin/db_ban/functions.dm +++ b/code/modules/admin/db_ban/functions.dm @@ -414,6 +414,7 @@ qdel(query_update) message_admins("[key_name_admin(usr)] has lifted [pckey]'s ban.") + log_admin("[key_name(usr)] has lifted [pckey]'s ban.") flag_account_for_forum_sync(pckey) diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm index 2aacdb50b54..5d8196a8d88 100644 --- a/code/modules/admin/holder2.dm +++ b/code/modules/admin/holder2.dm @@ -78,7 +78,7 @@ proc/admin_proc() NOTE: it checks usr! not src! So if you're checking somebody's rank in a proc which they did not call you will have to do something like if(client.holder.rights & R_ADMIN) yourself. */ -/proc/check_rights(rights_required, show_msg=1, mob/user = usr) +/proc/check_rights(rights_required, show_msg = TRUE, mob/user = usr) if(user && user.client) if(rights_required) if(user.client.holder) diff --git a/code/modules/admin/secrets.dm b/code/modules/admin/secrets.dm index 5cfd50a5ce9..16cd1084805 100644 --- a/code/modules/admin/secrets.dm +++ b/code/modules/admin/secrets.dm @@ -70,7 +70,6 @@ Send SIT - Syndicate Infiltration Team   Send in a Syndie Strike Team  
Send in the Deathsquad   - Send in a HONKsquad
Send in a Gimmick Team
Change Security Level
Security Level - Green   diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 437721f383a..492d4b7831d 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -487,7 +487,6 @@ if(!reason) return log_admin("[key_name(usr)] edited [banned_key]'s ban. Reason: [reason] Duration: [duration]") - ban_unban_log_save("[key_name(usr)] edited [banned_key]'s ban. Reason: [reason] Duration: [duration]") message_admins("[key_name_admin(usr)] edited [banned_key]'s ban. Reason: [reason] Duration: [duration]", 1) GLOB.banlist_savefile.cd = "/base/[banfolder]" to_chat(GLOB.banlist_savefile["reason"], reason) @@ -519,7 +518,6 @@ return */ switch(alert("Reason: '[banreason]' Remove appearance ban?","Please Confirm","Yes","No")) if("Yes") - ban_unban_log_save("[key_name(usr)] removed [key_name(M)]'s appearance ban") log_admin("[key_name(usr)] removed [key_name(M)]'s appearance ban") DB_ban_unban(M.ckey, BANTYPE_APPEARANCE) appearance_unban(M) @@ -532,7 +530,6 @@ if(!reason) return M = admin_ban_mobsearch(M, ban_ckey_param, usr) - ban_unban_log_save("[key_name(usr)] appearance banned [key_name(M)]. reason: [reason]") log_admin("[key_name(usr)] appearance banned [key_name(M)]. \nReason: [reason]") DB_ban_record(BANTYPE_APPEARANCE, M, -1, reason) appearance_fullban(M, "[reason]; By [usr.ckey] on [time2text(world.realtime)]") @@ -893,7 +890,6 @@ var/msg M = admin_ban_mobsearch(M, ban_ckey_param, usr) for(var/job in notbannedlist) - ban_unban_log_save("[key_name(usr)] temp-jobbanned [key_name(M)] from [job] for [mins] minutes. reason: [reason]") log_admin("[key_name(usr)] temp-jobbanned [key_name(M)] from [job] for [mins] minutes") DB_ban_record(BANTYPE_JOB_TEMP, M, mins, reason, job) jobban_fullban(M, job, "[reason]; By [usr.ckey] on [time2text(world.realtime)]") //Legacy banning does not support temporary jobbans. @@ -914,7 +910,6 @@ var/msg M = admin_ban_mobsearch(M, ban_ckey_param, usr) for(var/job in notbannedlist) - ban_unban_log_save("[key_name(usr)] perma-jobbanned [key_name(M)] from [job]. reason: [reason]") log_admin("[key_name(usr)] perma-banned [key_name(M)] from [job]") DB_ban_record(BANTYPE_JOB_PERMA, M, -1, reason, job) jobban_fullban(M, job, "[reason]; By [usr.ckey] on [time2text(world.realtime)]") @@ -943,7 +938,6 @@ if(!reason) continue //skip if it isn't jobbanned anyway switch(alert("Job: '[job]' Reason: '[reason]' Un-jobban?","Please Confirm","Yes","No")) if("Yes") - ban_unban_log_save("[key_name(usr)] unjobbanned [key_name(M)] from [job]") log_admin("[key_name(usr)] unbanned [key_name(M)] from [job]") DB_ban_unban(M.ckey, BANTYPE_JOB_PERMA, job) jobban_unban(M, job) @@ -1068,7 +1062,6 @@ return M = admin_ban_mobsearch(M, ban_ckey_param, usr) AddBan(M.ckey, M.computer_id, reason, usr.ckey, 1, mins) - ban_unban_log_save("[usr.client.ckey] has banned [M.ckey]. - Reason: [reason] - This will be removed in [mins] minutes.") to_chat(M, "You have been banned by [usr.client.ckey].\nReason: [reason].") to_chat(M, "This is a temporary ban, it will be removed in [mins] minutes.") DB_ban_record(BANTYPE_TEMP, M, mins, reason) @@ -1095,7 +1088,6 @@ to_chat(M, "To try to resolve this matter head to [config.banappeals]") else to_chat(M, "No ban appeals URL has been set.") - ban_unban_log_save("[usr.client.ckey] has permabanned [M.ckey]. - Reason: [reason] - This ban does not expire automatically and must be appealed.") log_admin("[key_name(usr)] has banned [M.ckey].\nReason: [reason]\nThis ban does not expire automatically and must be appealed.") message_admins("[key_name_admin(usr)] has banned [M.ckey].\nReason: [reason]\nThis ban does not expire automatically and must be appealed.") DB_ban_record(BANTYPE_PERMA, M, -1, reason) @@ -2894,9 +2886,6 @@ spawn(0) H.corgize() ok = 1 - if("honksquad") - if(usr.client.honksquad()) - SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Send Team - HONKsquad") if("striketeam") if(usr.client.strike_team()) SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Send Team - Deathsquad") diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index c24eaddf19e..c013197837b 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -666,17 +666,19 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention) message_admins("[key_name_admin(usr)] changed the equipment of [key_name_admin(M)] to [dresscode].", 1) /client/proc/robust_dress_shop() - var/list/outfits = list( + var/list/special_outfits = list( "Naked", "As Job...", "Custom..." ) + var/list/outfits = list() var/list/paths = subtypesof(/datum/outfit) - typesof(/datum/outfit/job) for(var/path in paths) var/datum/outfit/O = path //not much to initalize here but whatever if(initial(O.can_be_admin_equipped)) outfits[initial(O.name)] = path + outfits = special_outfits + sortTim(outfits, /proc/cmp_text_asc) var/dresscode = input("Select outfit", "Robust quick dress shop") as null|anything in outfits if(isnull(dresscode)) @@ -692,6 +694,7 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention) var/datum/outfit/O = path if(initial(O.can_be_admin_equipped)) job_outfits[initial(O.name)] = path + job_outfits = sortTim(job_outfits, /proc/cmp_text_asc) dresscode = input("Select job equipment", "Robust quick dress shop") as null|anything in job_outfits dresscode = job_outfits[dresscode] diff --git a/code/modules/admin/verbs/honksquad.dm b/code/modules/admin/verbs/honksquad.dm deleted file mode 100644 index 485f25ab757..00000000000 --- a/code/modules/admin/verbs/honksquad.dm +++ /dev/null @@ -1,142 +0,0 @@ -//HONKsquad - -#define HONKSQUAD_POSSIBLE 6 //if more Commandos are needed in the future -GLOBAL_VAR_INIT(sent_honksquad, 0) - -/client/proc/honksquad() - if(!SSticker) - to_chat(usr, "The game hasn't started yet!") - return - if(world.time < 6000) - to_chat(usr, "There are [(6000-world.time)/10] seconds remaining before it may be called.") - return - if(GLOB.sent_honksquad == 1) - to_chat(usr, "Clown Planet has already dispatched a HONKsquad.") - return - if(alert("Do you want to send in the HONKsquad? Once enabled, this is irreversible.",,"Yes","No")!="Yes") - return - alert("This 'mode' will go on until proper levels of HONK have been restored. You may also admin-call the evac shuttle when appropriate. Assigning the team's detailed task is recommended from there. While you will be able to manually pick the candidates from active ghosts, their assignment in the squad will be random.") - - var/input = null - while(!input) - input = sanitize(copytext(input(src, "Please specify which mission the HONKsquad shall undertake.", "Specify Mission", ""),1,MAX_MESSAGE_LEN)) - if(!input) - if(alert("Error, no mission set. Do you want to exit the setup process?",,"Yes","No")=="Yes") - return - - if(GLOB.sent_honksquad) - to_chat(usr, "Looks like someone beat you to it. HONK.") - return - - GLOB.sent_honksquad = 1 - - - var/honksquad_number = HONKSQUAD_POSSIBLE //for selecting a leader - var/honk_leader_selected = 0 //when the leader is chosen. The last person spawned. - - -//Generates a list of HONKsquad from active ghosts. Then the user picks which characters to respawn as the commandos. - var/list/candidates = list() //candidates for being a commando out of all the active ghosts in world. - var/list/commandos = list() //actual commando ghosts as picked by the user. - for(var/mob/dead/observer/G in GLOB.player_list) - if(!G.client.holder && !G.client.is_afk()) //Whoever called/has the proc won't be added to the list. - if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD)) - candidates += G.key - for(var/i=HONKSQUAD_POSSIBLE,(i>0&&candidates.len),i--)//Decrease with every commando selected. - var/candidate = input("Pick characters to spawn as the HONKsquad. This will go on until there either no more ghosts to pick from or the slots are full.", "Active Players") as null|anything in candidates //It will auto-pick a person when there is only one candidate. - candidates -= candidate //Subtract from candidates. - commandos += candidate//Add their ghost to commandos. - -//Spawns HONKsquad and equips them. - for(var/thing in GLOB.landmarks_list) - var/obj/effect/landmark/L = thing - if(honksquad_number<=0) break - if(L.name == "HONKsquad") - honk_leader_selected = honksquad_number == 1?1:0 - - var/mob/living/carbon/human/new_honksquad = create_honksquad(L, honk_leader_selected) - - if(commandos.len) - new_honksquad.key = pick(commandos) - commandos -= new_honksquad.key - new_honksquad.internal = new_honksquad.s_store - new_honksquad.update_action_buttons_icon() - - //So they don't forget their code or mission. - new_honksquad.mind.store_memory("Mission: [input].") - - to_chat(new_honksquad, "You are a HONKsquad. [!honk_leader_selected ? "commando" : "LEADER"] in the service of Clown Planet. You are called in cases of exteme low levels of HONK. You are NOT authorized to kill.\nYour current mission is: [input]") - - honksquad_number-- - - - message_admins("[key_name_admin(usr)] has spawned a HONKsquad.", 1) - log_admin("[key_name(usr)] used Spawn HONKsquad.") - return 1 - -/client/proc/create_honksquad(obj/spawn_location, honk_leader_selected = 0) - var/mob/living/carbon/human/new_honksquad = new(spawn_location.loc) - var/honksquad_leader_rank = pick("Lieutenant", "Captain", "Major") - var/honksquad_rank = pick("Corporal", "Sergeant", "Staff Sergeant", "Sergeant 1st Class", "Master Sergeant", "Sergeant Major") - var/honksquad_name = pick(GLOB.clown_names) - - var/datum/preferences/A = new()//Randomize appearance for the commando. - if(honk_leader_selected) - A.age = rand(35,45) - A.real_name = "[honksquad_leader_rank] [honksquad_name]" - else - A.real_name = "[honksquad_rank] [honksquad_name]" - A.copy_to(new_honksquad) - - new_honksquad.dna.ready_dna(new_honksquad)//Creates DNA. - - //Creates mind stuff. - new_honksquad.mind_initialize() - new_honksquad.mind.assigned_role = SPECIAL_ROLE_HONKSQUAD - new_honksquad.mind.special_role = SPECIAL_ROLE_HONKSQUAD - new_honksquad.mind.offstation_role = TRUE - new_honksquad.add_language("Clownish") - SSticker.mode.traitors |= new_honksquad.mind//Adds them to current traitor list. Which is really the extra antagonist list. - new_honksquad.equip_honksquad(honk_leader_selected) - return new_honksquad - -/mob/living/carbon/human/proc/equip_honksquad(honk_leader_selected = 0) - - var/obj/item/radio/R = new /obj/item/radio/headset(src) - R.set_frequency(1442) - equip_to_slot_or_del(R, slot_l_ear) - equip_to_slot_or_del(new /obj/item/storage/backpack/clown(src), slot_back) - equip_to_slot_or_del(new /obj/item/storage/box/survival(src), slot_in_backpack) - if(src.gender == FEMALE) - equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat/sexy(src), slot_wear_mask) - equip_to_slot_or_del(new /obj/item/clothing/under/rank/clown/sexy(src), slot_w_uniform) - else - equip_to_slot_or_del(new /obj/item/clothing/under/rank/clown(src), slot_w_uniform) - equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(src), slot_wear_mask) - equip_to_slot_or_del(new /obj/item/clothing/shoes/clown_shoes(src), slot_shoes) - equip_to_slot_or_del(new /obj/item/pda/clown(src), slot_wear_pda) - equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(src), slot_wear_mask) - equip_to_slot_or_del(new /obj/item/reagent_containers/food/snacks/grown/banana(src), slot_in_backpack) - equip_to_slot_or_del(new /obj/item/bikehorn(src), slot_in_backpack) - equip_to_slot_or_del(new /obj/item/stamp/clown(src), slot_in_backpack) - equip_to_slot_or_del(new /obj/item/toy/crayon/rainbow(src), slot_in_backpack) - equip_to_slot_or_del(new /obj/item/reagent_containers/spray/waterflower(src), slot_in_backpack) - equip_to_slot_or_del(new /obj/item/reagent_containers/food/pill/patch/jestosterone(src), slot_r_store) - if(prob(50)) - equip_to_slot_or_del(new /obj/item/gun/energy/clown(src), slot_in_backpack) - else - equip_to_slot_or_del(new /obj/item/gun/throw/piecannon(src), slot_in_backpack) - dna.SetSEState(GLOB.clumsyblock, TRUE) - singlemutcheck(src, GLOB.clumsyblock, MUTCHK_FORCED) - - - - var/obj/item/card/id/W = new(src) - W.name = "[real_name]'s ID Card" - W.icon_state = "centcom_old" - W.access = list(ACCESS_CLOWN)//They get full station access. - W.assignment = "HONKsquad" - W.registered_name = real_name - equip_to_slot_or_del(W, slot_wear_id) - - return 1 diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index 66bc9aae6cc..06f4086fe81 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -27,7 +27,7 @@ /datum/admins/proc/CandCheck(role = null, mob/living/carbon/human/M, datum/game_mode/temp = null) // You pass in ROLE define (optional), the applicant, and the gamemode, and it will return true / false depending on whether the applicant qualify for the candidacy in question - if(jobban_isbanned(M, "Syndicate")) + if(jobban_isbanned(M, ROLE_SYNDICATE)) return FALSE if(M.stat || !M.mind || M.mind.special_role || M.mind.offstation_role) return FALSE @@ -199,7 +199,7 @@ for(var/mob/G in GLOB.respawnable_list) if(istype(G) && G.client && (ROLE_OPERATIVE in G.client.prefs.be_special)) - if(!jobban_isbanned(G, "operative") && !jobban_isbanned(G, "Syndicate")) + if(!jobban_isbanned(G, ROLE_OPERATIVE) && !jobban_isbanned(G, ROLE_SYNDICATE)) if(player_old_enough_antag(G.client,ROLE_OPERATIVE)) spawn(0) switch(alert(G,"Do you wish to be considered for a nuke team being sent in?","Please answer in 30 seconds!","Yes","No")) @@ -316,7 +316,7 @@ //Generates a list of commandos from active ghosts. Then the user picks which characters to respawn as the commandos. for(var/mob/G in GLOB.respawnable_list) - if(!jobban_isbanned(G, "Syndicate")) + if(!jobban_isbanned(G, ROLE_SYNDICATE)) spawn(0) switch(alert(G,"Do you wish to be considered for an elite syndicate strike team being sent in?","Please answer in 30 seconds!","Yes","No")) if("Yes") @@ -427,7 +427,7 @@ for(var/mob/G in GLOB.respawnable_list) if(istype(G) && G.client && (ROLE_RAIDER in G.client.prefs.be_special)) if(player_old_enough_antag(G.client,ROLE_RAIDER)) - if(!jobban_isbanned(G, "raider") && !jobban_isbanned(G, "Syndicate")) + if(!jobban_isbanned(G, ROLE_RAIDER) && !jobban_isbanned(G, ROLE_SYNDICATE)) spawn(0) switch(alert(G,"Do you wish to be considered for a vox raiding party arriving on the station?","Please answer in 30 seconds!","Yes","No")) if("Yes") diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index 5bb640ed8ea..8055c5e7a03 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -59,15 +59,6 @@ if(X.prefs.sound & SOUND_ADMINHELP) SEND_SOUND(X, sound('sound/effects/adminhelp.ogg')) -/proc/HONK_announce(text, mob/Sender) - var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN)) - msg = "HONK: [key_name(Sender, 1)] ([ADMIN_PP(Sender,"PP")]) ([ADMIN_VV(Sender,"VV")]) ([ADMIN_TP(Sender,"TP")]) ([ADMIN_SM(Sender,"SM")]) ([admin_jump_link(Sender)]) ([ADMIN_BSA(Sender,"BSA")]) (RPLY): [msg]" - for(var/client/X in GLOB.admins) - if(R_EVENT & X.holder.rights) - to_chat(X, msg) - if(X.prefs.sound & SOUND_ADMINHELP) - SEND_SOUND(X, sound('sound/effects/adminhelp.ogg')) - /proc/ERT_Announce(text, mob/Sender, repeat_warning) var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN)) msg = "ERT REQUEST: [key_name(Sender, 1)] ([ADMIN_PP(Sender,"PP")]) ([ADMIN_VV(Sender,"VV")]) ([ADMIN_TP(Sender,"TP")]) ([ADMIN_SM(Sender,"SM")]) ([admin_jump_link(Sender)]) ([ADMIN_BSA(Sender,"BSA")]) (RESPOND): [msg]" diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 484bd321bf1..85b9fa20941 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -278,11 +278,9 @@ var/action="" if(config.antag_hud_allowed) for(var/mob/dead/observer/g in get_ghosts()) - if(!g.client.holder) //Remove the verb from non-admin ghosts - g.verbs -= /mob/dead/observer/verb/toggle_antagHUD if(g.antagHUD) g.antagHUD = FALSE // Disable it on those that have it enabled - g.has_enabled_antagHUD = 2 // We'll allow them to respawn + g.has_enabled_antagHUD = FALSE // We'll allow them to respawn to_chat(g, "The Administrator has disabled AntagHUD ") config.antag_hud_allowed = 0 to_chat(src, "AntagHUD usage has been disabled") @@ -290,7 +288,6 @@ else for(var/mob/dead/observer/g in get_ghosts()) if(!g.client.holder) // Add the verb back for all non-admin ghosts - g.verbs += /mob/dead/observer/verb/toggle_antagHUD to_chat(g, "The Administrator has enabled AntagHUD ")// Notify all observers they can now use AntagHUD config.antag_hud_allowed = 1 @@ -321,7 +318,7 @@ to_chat(g, "The administrator has placed restrictions on joining the round if you use AntagHUD") to_chat(g, "Your AntagHUD has been disabled, you may choose to re-enabled it but will be under restrictions ") g.antagHUD = FALSE - g.has_enabled_antagHUD = 0 + g.has_enabled_antagHUD = FALSE action = "placed restrictions" config.antag_hud_restricted = 1 to_chat(src, "AntagHUD restrictions have been enabled") @@ -498,11 +495,16 @@ Traitors and the like can also be revived with the previous role mostly intact. if(!ckey) var/list/candidates = list() for(var/mob/M in GLOB.player_list) - if(M.stat != DEAD) continue //we are not dead! - if(!(ROLE_ALIEN in M.client.prefs.be_special)) continue //we don't want to be an alium - if(jobban_isbanned(M, "alien") || jobban_isbanned(M, "Syndicate")) continue //we are jobbanned - if(M.client.is_afk()) continue //we are afk - if(M.mind && M.mind.current && M.mind.current.stat != DEAD) continue //we have a live body we are tied to + if(M.stat != DEAD) + continue //we are not dead! + if(!(ROLE_ALIEN in M.client.prefs.be_special)) + continue //we don't want to be an alium + if(jobban_isbanned(M, ROLE_ALIEN) || jobban_isbanned(M, ROLE_SYNDICATE)) + continue //we are jobbanned + if(M.client.is_afk()) + continue //we are afk + if(M.mind && M.mind.current && M.mind.current.stat != DEAD) + continue //we have a live body we are tied to candidates += M.ckey if(candidates.len) ckey = input("Pick the player you want to respawn as a xeno.", "Suitable Candidates") as null|anything in candidates diff --git a/code/modules/admin/verbs/striketeam_syndicate.dm b/code/modules/admin/verbs/striketeam_syndicate.dm index 3910a6e0b28..0c359e532b6 100644 --- a/code/modules/admin/verbs/striketeam_syndicate.dm +++ b/code/modules/admin/verbs/striketeam_syndicate.dm @@ -153,7 +153,7 @@ GLOBAL_VAR_INIT(sent_syndicate_strike_team, 0) equip_to_slot_or_del(new /obj/item/clothing/suit/space/hardsuit/syndi/elite/sst(src), slot_wear_suit) equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal(src), slot_glasses) equip_to_slot_or_del(new /obj/item/storage/belt/military/sst(src), slot_belt) - equip_to_slot_or_del(new /obj/item/tank/jetpack/oxygen/harness(src), slot_s_store) + equip_to_slot_or_del(new /obj/item/tank/internals/oxygen/red(src), slot_s_store) equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots/syndie/advance(src), slot_shoes) equip_to_slot_or_del(new /obj/item/gun/projectile/automatic/l6_saw(src), slot_r_hand) equip_to_slot_or_del(new /obj/item/ammo_box/magazine/mm556x45(src), slot_in_backpack) diff --git a/code/modules/antagonists/traitor/contractor/datums/contractor_hub.dm b/code/modules/antagonists/traitor/contractor/datums/contractor_hub.dm index aefe73f6258..913225a6f1e 100644 --- a/code/modules/antagonists/traitor/contractor/datums/contractor_hub.dm +++ b/code/modules/antagonists/traitor/contractor/datums/contractor_hub.dm @@ -28,6 +28,7 @@ /datum/rep_purchase/item/pinpointer, /datum/rep_purchase/item/baton, /datum/rep_purchase/item/fulton, + /datum/rep_purchase/item/flare, /datum/rep_purchase/blackout, /datum/rep_purchase/item/zippo, /datum/rep_purchase/item/balloon, diff --git a/code/modules/antagonists/traitor/contractor/datums/rep_purchases/flare.dm b/code/modules/antagonists/traitor/contractor/datums/rep_purchases/flare.dm new file mode 100644 index 00000000000..005a6f60c34 --- /dev/null +++ b/code/modules/antagonists/traitor/contractor/datums/rep_purchases/flare.dm @@ -0,0 +1,9 @@ +/** + * # Rep Purchase - Emergency escape flare + */ +/datum/rep_purchase/item/flare + name = "Emergency extraction kit" + description = "A kit that comes with an emergency escape flare, which will allow you to teleport to any beacon after a short activation delay. Also comes with a Syndicate teleporter beacon that only these flares and emagged teleporters can target." + cost = 2 + stock = 3 + item_type = /obj/item/storage/box/syndie_kit/escape_flare diff --git a/code/modules/antagonists/traitor/contractor/datums/syndicate_contract.dm b/code/modules/antagonists/traitor/contractor/datums/syndicate_contract.dm index fe18df41628..d3847a6629b 100644 --- a/code/modules/antagonists/traitor/contractor/datums/syndicate_contract.dm +++ b/code/modules/antagonists/traitor/contractor/datums/syndicate_contract.dm @@ -363,6 +363,9 @@ // Greys get to keep their implant if(isgrey(H) && istype(I, /obj/item/organ/internal/cyberimp/brain/speech_translator)) continue + // IPCs keep this implant, free of charge! + if(ismachineperson(H) && istype(I, /obj/item/organ/internal/cyberimp/arm/power_cord)) + continue // Try removing it I = I.remove(H) if(I) diff --git a/code/modules/assembly/igniter.dm b/code/modules/assembly/igniter.dm index b81acbbe2b0..7d88bbafd4a 100644 --- a/code/modules/assembly/igniter.dm +++ b/code/modules/assembly/igniter.dm @@ -1,6 +1,6 @@ /obj/item/assembly/igniter name = "igniter" - desc = "A small electronic device able to ignite combustable substances." + desc = "A small electronic device able to ignite combustible substances." icon_state = "igniter" materials = list(MAT_METAL=500, MAT_GLASS=50) origin_tech = "magnets=1" diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 455d7a38aff..801bc69f383 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -421,6 +421,7 @@ GLOB.admins -= src GLOB.directory -= ckey GLOB.clients -= src + QDEL_NULL(chatOutput) if(movingmob) movingmob.client_mobs_in_contents -= mob UNSETEMPTY(movingmob.client_mobs_in_contents) diff --git a/code/modules/client/preference/loadout/loadout_donor.dm b/code/modules/client/preference/loadout/loadout_donor.dm index 7d43bd6b86a..cc84053806b 100644 --- a/code/modules/client/preference/loadout/loadout_donor.dm +++ b/code/modules/client/preference/loadout/loadout_donor.dm @@ -63,10 +63,6 @@ display_name = "Fur Cap" path = /obj/item/clothing/head/furcap -/datum/gear/donor/mouse - display_name = "Mouse Headband" - path = /obj/item/clothing/head/kitty/mouse - /datum/gear/donor/fawkes display_name = "Guy Fawkes mask" path = /obj/item/clothing/mask/fawkes diff --git a/code/modules/client/preference/loadout/loadout_general.dm b/code/modules/client/preference/loadout/loadout_general.dm index e402712aa66..7278ef38cc7 100644 --- a/code/modules/client/preference/loadout/loadout_general.dm +++ b/code/modules/client/preference/loadout/loadout_general.dm @@ -138,10 +138,6 @@ path = /obj/item/cartridge/mob_hunt_game cost = 2 -/datum/gear/piano_synth - display_name ="synthesizer" - path = /obj/item/instrument/piano_synth - cost = 2 ////////////////////// // Mugs // ////////////////////// @@ -197,3 +193,62 @@ display_name = "crewmember coffee mug" description = "A crewmember's coffee mug, emblazoned in the colors of the Service department." path = /obj/item/reagent_containers/food/drinks/mug/serv + + +////////////////////// +// Instruments // +////////////////////// + +/datum/gear/instrument + display_name = "Synthesizer" + path = /obj/item/instrument/piano_synth + sort_category = "Instruments" + cost = 2 + +/datum/gear/instrument/accordion + display_name = "Accordion" + path = /obj/item/instrument/accordion + +/datum/gear/instrument/banjo + display_name = "Banjo" + path = /obj/item/instrument/banjo + +/datum/gear/instrument/eguitar + display_name = "Electric guitar" + path = /obj/item/instrument/eguitar + +/datum/gear/instrument/glock + display_name = "Glockenspiel" + path = /obj/item/instrument/glockenspiel + +/datum/gear/instrument/guitar + display_name = "Guitar" + path = /obj/item/instrument/guitar + +/datum/gear/instrument/harmonica + display_name = "Harmonica" + path = /obj/item/instrument/harmonica + +/datum/gear/instrument/recorder + display_name = "Recorder" + path = /obj/item/instrument/recorder + +/datum/gear/instrument/sax + display_name = "Saxophone" + path = /obj/item/instrument/saxophone + +/datum/gear/instrument/trumpet + display_name = "Trumpet" + path = /obj/item/instrument/trumpet + +/datum/gear/instrument/trombone + display_name = "Trombone" + path = /obj/item/instrument/trombone + +/datum/gear/instrument/violin + display_name = "Violin" + path = /obj/item/instrument/violin + +/datum/gear/instrument/xylo + display_name = "Xylophone" + path = /obj/item/instrument/xylophone diff --git a/code/modules/client/preference/preferences.dm b/code/modules/client/preference/preferences.dm index 12d7bc62237..60e973b8770 100644 --- a/code/modules/client/preference/preferences.dm +++ b/code/modules/client/preference/preferences.dm @@ -362,7 +362,7 @@ GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts dat += "" dat += "

Occupation Choices

" dat += "Set Occupation Preferences
" - if(jobban_isbanned(user, "Records")) + if(jobban_isbanned(user, ROLEBAN_RECORDS)) dat += "You are banned from using character records.
" else dat += "Character Records
" @@ -495,7 +495,7 @@ GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts // RIGHT SIDE OF THE PAGE dat += "" dat += "

Special Role Settings

" - if(jobban_isbanned(user, "Syndicate")) + if(jobban_isbanned(user, ROLE_SYNDICATE)) dat += "You are banned from special roles." be_special = list() else diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm index c34e17943cb..5e872075da7 100644 --- a/code/modules/clothing/chameleon.dm +++ b/code/modules/clothing/chameleon.dm @@ -509,8 +509,8 @@ chameleon_action.emp_randomise(INFINITY) /obj/item/storage/belt/chameleon - name = "toolbelt" - desc = "Holds tools." + name = "tool-belt" + desc = "Can hold various tools." var/datum/action/item_action/chameleon/change/chameleon_action /obj/item/storage/belt/chameleon/Initialize(mapload) diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm index 5e286ccb7e5..ea0a76b4427 100644 --- a/code/modules/clothing/suits/labcoat.dm +++ b/code/modules/clothing/suits/labcoat.dm @@ -7,7 +7,7 @@ suit_adjusted = 1 blood_overlay_type = "coat" body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS - allowed = list(/obj/item/analyzer,/obj/item/stack/medical,/obj/item/dnainjector,/obj/item/reagent_containers/dropper,/obj/item/reagent_containers/syringe,/obj/item/reagent_containers/hypospray,/obj/item/reagent_containers/applicator,/obj/item/healthanalyzer,/obj/item/flashlight/pen,/obj/item/reagent_containers/glass/bottle,/obj/item/reagent_containers/glass/beaker,/obj/item/reagent_containers/food/pill,/obj/item/storage/pill_bottle,/obj/item/paper,/obj/item/rad_laser) + allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/applicator, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/food/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/rad_laser, /obj/item/robotanalyzer) armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 50, "acid" = 50) species_exception = list(/datum/species/golem) sprite_sheets = list( diff --git a/code/modules/clothing/under/jobs/civilian.dm b/code/modules/clothing/under/jobs/civilian.dm index 8f3c2976fb1..4b12b652755 100644 --- a/code/modules/clothing/under/jobs/civilian.dm +++ b/code/modules/clothing/under/jobs/civilian.dm @@ -73,7 +73,7 @@ if(ishuman(loc)) var/mob/living/carbon/human/H = loc if(H.mind && H.mind.assigned_role == "Clown") - GLOB.score_clownabuse++ + SSticker.score.score_clown_abuse++ return ..() /obj/item/clothing/under/rank/clown/sexy diff --git a/code/modules/economy/EFTPOS.dm b/code/modules/economy/EFTPOS.dm index dc9f7236fab..a5b76b3ebfe 100644 --- a/code/modules/economy/EFTPOS.dm +++ b/code/modules/economy/EFTPOS.dm @@ -38,7 +38,11 @@ R.stamped += /obj/item/stamp R.overlays += stampoverlay R.stamps += "
This paper has been stamped by the EFTPOS device." - var/obj/item/smallDelivery/D = new(R.loc) + var/obj/item/smallDelivery/D = new(get_turf(loc)) + if(istype(loc, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = loc + if(H.back) + D.forceMove(H.back) R.forceMove(D) D.wrapped = R D.name = "small parcel - 'EFTPOS access code'" diff --git a/code/modules/events/wallrot.dm b/code/modules/events/wallrot.dm index 33134001a1f..0181b74e482 100644 --- a/code/modules/events/wallrot.dm +++ b/code/modules/events/wallrot.dm @@ -1,10 +1,3 @@ -/datum/event/wallrot/setup() - announceWhen = rand(0, 300) - endWhen = announceWhen + 1 - -/datum/event/wallrot/announce() - GLOB.event_announcement.Announce("Harmful fungi detected on station. Station structures may be contaminated.", "Biohazard Alert") - /datum/event/wallrot/start() INVOKE_ASYNC(src, .proc/spawn_wallrot) diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm deleted file mode 100644 index bd57e680e99..00000000000 --- a/code/modules/flufftext/Hallucination.dm +++ /dev/null @@ -1,1071 +0,0 @@ -/* -Ideas for the subtle effects of hallucination: - -Light up oxygen/plasma indicators (done) -Cause health to look critical/dead, even when standing (done) -Characters silently watching you -Brief flashes of fire/space/bombs/c4/dangerous shit (done) -Items that are rare/traitorous/don't exist appearing in your inventory slots (done) -Strange audio (should be rare) (done) -Gunshots/explosions/opening doors/less rare audio (done) - -*/ - -#define SCREWYHUD_NONE 0 -#define SCREWYHUD_CRIT 1 -#define SCREWYHUD_DEAD 2 -#define SCREWYHUD_HEALTHY 3 - -/mob/living/carbon - var/image/halimage - var/image/halbody - var/obj/halitem - var/hal_screwyhud = SCREWYHUD_NONE - var/handling_hal = FALSE - -/mob/living/carbon/proc/handle_hallucinations() - if(handling_hal) - return - - //Least obvious - var/list/minor = list("sounds"=25,"bolts_minor"=5,"whispers"=15,"message"=10,"hudscrew"=15) - //Something's wrong here - var/list/medium = list("fake_alert"=15,"items"=10,"items_other"=10,"dangerflash"=10,"bolts"=5,"flood"=5,"husks"=10,"battle"=15,"self_delusion"=10) - //AAAAHg - var/list/major = list("fake"=20,"death"=10,"xeno"=10,"singulo"=10,"borer"=10,"delusion"=20,"koolaid"=10) - - handling_hal = TRUE - while(hallucination > 20) - sleep(rand(200, 500) / (hallucination * 0.04)) - if(prob(20)) - continue - var/list/current = list() - switch(rand(100)) - if(1 to 50) - current = minor - if(51 to 85) - current = medium - if(86 to 100) - current = major - - hallucinate(pickweight(current)) - handling_hal = FALSE - - -/obj/effect/hallucination - invisibility = INVISIBILITY_OBSERVER - var/mob/living/carbon/target = null - -/obj/effect/hallucination/singularity_pull() - return - -/obj/effect/hallucination/singularity_act() - return - -/obj/effect/hallucination/proc/wake_and_restore() - target.hal_screwyhud = SCREWYHUD_NONE - target.SetSleeping(0) - -/obj/effect/hallucination/simple - var/image_icon = 'icons/mob/alien.dmi' - var/image_state = "alienh_pounce" - var/px = 0 - var/py = 0 - var/col_mod = null - var/image/current_image = null - var/image_layer = MOB_LAYER - var/active = TRUE //qdelery - -/obj/effect/hallucination/simple/New(loc, mob/living/carbon/T) - ..() - target = T - current_image = GetImage() - if(target.client) - target.client.images |= current_image - -/obj/effect/hallucination/simple/proc/GetImage() - var/image/I = image(image_icon, src, image_state, image_layer, dir = dir) - I.pixel_x = px - I.pixel_y = py - if(col_mod) - I.color = col_mod - return I - -/obj/effect/hallucination/simple/proc/Show(update = 1) - if(active) - if(target.client) - target.client.images.Remove(current_image) - if(update) - current_image = GetImage() - if(target.client) - target.client.images |= current_image - -/obj/effect/hallucination/simple/update_icon(new_state, new_icon, new_px = 0, new_py = 0) - image_state = new_state - if(new_icon) - image_icon = new_icon - else - image_icon = initial(image_icon) - px = new_px - py = new_py - Show() - -/obj/effect/hallucination/simple/Move() - ..() - Show() - -/obj/effect/hallucination/simple/Destroy() - if(target.client) - target.client.images.Remove(current_image) - active = FALSE - return ..() - -#define FAKE_FLOOD_EXPAND_TIME 20 -#define FAKE_FLOOD_MAX_RADIUS 10 - -/obj/effect/hallucination/fake_flood - //Plasma starts flooding from the nearby vent - var/list/flood_images = list() - var/list/turf/flood_turfs = list() - var/image_icon = 'icons/effects/tile_effects.dmi' - var/image_state = "plasma" - var/radius = 0 - var/next_expand = 0 - -/obj/effect/hallucination/fake_flood/New(loc, mob/living/carbon/T) - ..() - target = T - for(var/obj/machinery/atmospherics/unary/vent_pump/U in orange(7,target)) - if(!U.welded) - src.loc = U.loc - break - flood_images += image(image_icon,src,image_state,MOB_LAYER) - flood_turfs += get_turf(src.loc) - if(target.client) - target.client.images |= flood_images - next_expand = world.time + FAKE_FLOOD_EXPAND_TIME - START_PROCESSING(SSobj, src) - -/obj/effect/hallucination/fake_flood/process() - if(!target) - qdel(src) - return - if(next_expand <= world.time) - radius++ - if(radius > FAKE_FLOOD_MAX_RADIUS) - qdel(src) - return - Expand() - if((get_turf(target) in flood_turfs) && !target.internal) - target.hallucinate("fake_alert", "too_much_tox") - next_expand = world.time + FAKE_FLOOD_EXPAND_TIME - -/obj/effect/hallucination/fake_flood/proc/Expand() - for(var/turf/FT in flood_turfs) - for(var/dir in GLOB.cardinal) - var/turf/T = get_step(FT, dir) - if((T in flood_turfs) || !FT.CanAtmosPass(T)) - continue - flood_images += image(image_icon,T,image_state,MOB_LAYER) - flood_turfs += T - if(target.client) - target.client.images |= flood_images - -/obj/effect/hallucination/fake_flood/Destroy() - STOP_PROCESSING(SSobj, src) - flood_turfs.Cut() - if(target.client) - target.client.images.Remove(flood_images) - target = null - QDEL_LIST(flood_images) - return ..() - -/obj/effect/hallucination/simple/xeno - image_icon = 'icons/mob/alien.dmi' - image_state = "alienh_pounce" - -/obj/effect/hallucination/simple/xeno/New(loc, mob/living/carbon/T) - ..() - name = "alien hunter ([rand(1, 1000)])" - -/obj/effect/hallucination/simple/xeno/throw_impact(A) - update_icon("alienh_pounce") - if(A == target) - target.Weaken(5) - target.visible_message("[target] flails around wildly.","[name] pounces on you!") - -/obj/effect/hallucination/xeno_attack - //Xeno crawls from nearby vent,jumps at you, and goes back in - var/obj/machinery/atmospherics/unary/vent_pump/pump = null - var/obj/effect/hallucination/simple/xeno/xeno = null - -/obj/effect/hallucination/xeno_attack/New(loc, mob/living/carbon/T) - . = ..() - target = T - for(var/obj/machinery/atmospherics/unary/vent_pump/U in orange(7,target)) - if(!U.welded) - pump = U - break - if(!pump) - return - xeno = new(pump.loc,target) - sleep(10) - if(!xeno) - return - for(var/i in 0 to 2) - xeno.update_icon("alienh_leap",'icons/mob/alienleap.dmi',-32,-32) - xeno.throw_at(target,7,1, spin = 0, diagonals_first = 1) - sleep(10) - if(!xeno) - return - var/xeno_name = xeno.name - to_chat(target, "[xeno_name] begins climbing into the ventilation system...") - sleep(10) - if(!xeno) - return - qdel(xeno) - to_chat(target, "[xeno_name] scrambles into the ventilation ducts!") - qdel(src) - -/obj/effect/hallucination/simple/clown - image_icon = 'icons/mob/simple_human.dmi' - image_state = "clown" - -/obj/effect/hallucination/simple/clown/New(loc, mob/living/carbon/T, duration) - ..(loc, T) - name = pick(GLOB.clown_names) - sleep(duration) - qdel(src) - -/obj/effect/hallucination/simple/clown/scary - image_state = "scary_clown" - -/obj/effect/hallucination/simple/borer - image_icon = 'icons/mob/animal.dmi' - image_state = "brainslug" - -/obj/effect/hallucination/borer - //A borer paralyzes you and crawls in your ear - var/obj/machinery/atmospherics/unary/vent_pump/pump = null - var/obj/effect/hallucination/simple/borer/borer = null - -/obj/effect/hallucination/borer/New(loc, mob/living/carbon/T) - ..() - target = T - for(var/obj/machinery/atmospherics/unary/vent_pump/U in orange(7, target)) - if(!U.welded) - pump = U - break - if(pump) - borer = new(pump.loc,target) - for(var/i in 0 to 10) - walk_to(borer, get_step(borer, get_cardinal_dir(borer, T))) - if(borer.Adjacent(T)) - to_chat(T, "You feel a creeping, horrible sense of dread come over you, freezing your limbs and setting your heart racing.") - T.Stun(4) - sleep(50) - qdel(borer) - sleep(rand(60, 90)) - to_chat(T, "Primary [rand(1000,9999)] states: [pick("Hello","Hi","You're my slave now!","Don't try to get rid of me...")]") - break - sleep(4) - if(!QDELETED(borer)) - qdel(borer) - qdel(src) - -/obj/effect/hallucination/simple/bubblegum - name = "Bubblegum" - image_icon = 'icons/mob/lavaland/96x96megafauna.dmi' - image_state = "bubblegum" - px = -32 - -/obj/effect/hallucination/oh_yeah - var/obj/effect/hallucination/simple/bubblegum/bubblegum - var/image/fakebroken - var/image/fakerune - -/obj/effect/hallucination/oh_yeah/New(loc, mob/living/carbon/C) - set waitfor = FALSE - ..() - target = C - var/turf/simulated/wall/wall - for(var/turf/simulated/wall/W in range(7, target)) - wall = W - break - if(!wall) - qdel(src) - return - - fakebroken = image('icons/turf/floors.dmi', wall, "plating", layer = TURF_LAYER) - var/turf/landing = get_turf(target) - var/turf/landing_image_turf = get_step(landing, SOUTHWEST) //the icon is 3x3 - fakerune = image('icons/effects/96x96.dmi', landing_image_turf, "landing", layer = ABOVE_OPEN_TURF_LAYER) - fakebroken.override = TRUE - if(target.client) - target.client.images |= fakebroken - target.client.images |= fakerune - target.playsound_local(wall,'sound/effects/meteorimpact.ogg', 150, 1) - bubblegum = new(wall, target) - addtimer(CALLBACK(src, .proc/bubble_attack, landing), 10) - -/obj/effect/hallucination/oh_yeah/proc/bubble_attack(turf/landing) - var/charged = FALSE //only get hit once - while(get_turf(bubblegum) != landing && target && target.stat != DEAD) - bubblegum.forceMove(get_step_towards(bubblegum, landing)) - bubblegum.setDir(get_dir(bubblegum, landing)) - target.playsound_local(get_turf(bubblegum), 'sound/effects/meteorimpact.ogg', 150, 1) - shake_camera(target, 2, 1) - if(bubblegum.Adjacent(target) && !charged) - charged = TRUE - target.Weaken(4) - target.adjustStaminaLoss(40) - step_away(target, bubblegum) - shake_camera(target, 4, 3) - target.visible_message("[target] jumps backwards, falling on the ground!", "[bubblegum] slams into you!") - sleep(2) - sleep(30) - qdel(src) - -/obj/effect/hallucination/oh_yeah/Destroy() - if(target.client) - target.client.images.Remove(fakebroken) - target.client.images.Remove(fakerune) - QDEL_NULL(fakebroken) - QDEL_NULL(fakerune) - QDEL_NULL(bubblegum) - return ..() - -/obj/effect/hallucination/singularity_scare - //Singularity moving towards you. - //todo Hide where it moved with fake space images - var/obj/effect/hallucination/simple/singularity/s = null - -/obj/effect/hallucination/singularity_scare/New(loc, mob/living/carbon/T) - . = ..() - target = T - var/turf/start = get_turf(T) - var/screen_border = pick(GLOB.cardinal) - for(var/i in 0 to 10) - start = get_step(start, screen_border) - s = new(start,target) - for(var/i in 0 to 10) - sleep(5) - s.loc = get_step(get_turf(s), get_dir(s, target)) - s.Show() - s.Eat() - addtimer(CALLBACK(src, .proc/wake_and_restore), rand(50, 100)) - qdel(s) - -/obj/effect/hallucination/simple/singularity - image_icon = 'icons/effects/224x224.dmi' - image_state = "singularity_s7" - image_layer = 6 - px = -96 - py = -96 - -/obj/effect/hallucination/simple/singularity/proc/Eat(atom/OldLoc, Dir) - var/target_dist = get_dist(src, target) - if(target_dist <= 3) //"Eaten" - target.hal_screwyhud = SCREWYHUD_CRIT - target.SetSleeping(8, no_alert = TRUE) - -/obj/effect/hallucination/battle - -/obj/effect/hallucination/battle/New(loc, mob/living/carbon/T) - . = ..() - target = T - var/hits = rand(2,5) - switch(rand(1,5)) - if(1) //Laser fight - for(var/i in 0 to hits) - target.playsound_local(null, 'sound/weapons/laser.ogg', 25, 1) - if(prob(75)) - addtimer(CALLBACK(target, /mob/.proc/playsound_local, null, 'sound/weapons/sear.ogg', 25, 1), rand(10,20)) - else - addtimer(CALLBACK(target, /mob/.proc/playsound_local, null, 'sound/weapons/effects/searwall.ogg', 25, 1), rand(10,20)) - sleep(rand(CLICK_CD_RANGE, CLICK_CD_RANGE + 8)) - target.playsound_local(null, get_sfx("bodyfall"), 25) - if(2) //Esword fight - target.playsound_local(null, 'sound/weapons/saberon.ogg', 15, 1) - for(var/i in 0 to hits) - target.playsound_local(null, 'sound/weapons/blade1.ogg', 25, 1) - sleep(rand(CLICK_CD_MELEE, CLICK_CD_MELEE + 8)) - target.playsound_local(null, get_sfx("bodyfall"), 25, 1) - target.playsound_local(null, 'sound/weapons/saberoff.ogg', 15, 1) - if(3) //Gun fight - for(var/i in 0 to hits) - target.playsound_local(null, get_sfx("gunshot"), 25) - if(prob(75)) - addtimer(CALLBACK(target, /mob/.proc/playsound_local, null, 'sound/weapons/pierce.ogg', 25, 1), rand(10,20)) - else - addtimer(CALLBACK(target, /mob/.proc/playsound_local, null, "ricochet", 25, 1), rand(10,20)) - sleep(rand(CLICK_CD_RANGE, CLICK_CD_RANGE + 8)) - target.playsound_local(null, get_sfx("bodyfall"), 25, 1) - if(4) //Stunprod + cablecuff - target.playsound_local(null, 'sound/weapons/Egloves.ogg', 40, 1) - target.playsound_local(null, get_sfx("bodyfall"), 25, 1) - sleep(20) - target.playsound_local(null, 'sound/weapons/cablecuff.ogg', 15, 1) - if(5) // Tick Tock - for(var/i in 0 to hits) - target.playsound_local(null, 'sound/items/timer.ogg', 25, 1) - sleep(15) - qdel(src) - -/obj/effect/hallucination/items_other - -/obj/effect/hallucination/items_other/New(loc, mob/living/carbon/T) - ..() - target = T - var/item = pick(list("esword","dual_esword","stunpaper","chainsaw","ttv","flash","armblade")) - var/image_file - var/image/A = null - for(var/mob/living/carbon/human/H in view(7,target)) - if(H != target) - var/hand = H.l_hand - if(!hand) - image_file = 'icons/mob/inhands/items_lefthand.dmi' - else - hand = H.r_hand - if(!hand) - image_file = 'icons/mob/inhands/items_righthand.dmi' - if(image_file) - switch(item) - if("esword") - target.playsound_local(H, 'sound/weapons/saberon.ogg',35,1) - A = image(image_file,H,"swordred", layer=ABOVE_MOB_LAYER) - if("dual_esword") - target.playsound_local(H, 'sound/weapons/saberon.ogg',35,1) - A = image(image_file,H,"dualsaberred1", layer=ABOVE_MOB_LAYER) - if("stunpaper") - A = image(image_file,H,"paper", layer=ABOVE_MOB_LAYER) - A.color = rgb(255,0,0) - if("chainsaw") - A = image(image_file,H,"chainsaw1", layer=ABOVE_MOB_LAYER) - if("ttv") - A = image(image_file,H,"ttv", layer=ABOVE_MOB_LAYER) - if("flash") - A = image(image_file,H,"flashtool", layer=ABOVE_MOB_LAYER) - if("armblade") - A = image(image_file,H,"arm_blade", layer=ABOVE_MOB_LAYER) - if(target.client) - target.client.images |= A - sleep(rand(150,250)) - if(item == "esword" || item == "dual_esword") - target.playsound_local(H, 'sound/weapons/saberoff.ogg',35,1) - target.client.images.Remove(A) - break - qdel(src) - - -/obj/effect/hallucination/delusion - var/list/image/delusions = list() - -/obj/effect/hallucination/delusion/New(loc, mob/living/carbon/T, force_kind = null, duration = 300,skip_nearby = 1, custom_icon = null, custom_icon_file = null) - . = ..() - target = T - var/image/A = null - var/kind = force_kind ? force_kind : pick("clown", "corgi", "carp", "skeleton", "demon","zombie") - for(var/thing in GLOB.human_list) - var/mob/living/carbon/human/H = thing - if(H.stat == DEAD || H == target) - continue - if(skip_nearby && (H in view(target))) - continue - switch(kind) - if("clown")//Clown - A = image('icons/mob/animal.dmi',H,"clown") - if("carp")//Carp - A = image('icons/mob/animal.dmi',H,"carp") - if("corgi")//Corgi - A = image('icons/mob/pets.dmi',H,"corgi") - if("skeleton")//Skeletons - A = image('icons/mob/human.dmi',H,"skeleton_s") - if("zombie")//Zombies - A = image('icons/mob/human.dmi',H,"zombie2_s") - if("demon")//Demon - A = image('icons/mob/mob.dmi',H,"daemon") - if("custom") - A = image(custom_icon_file, H, custom_icon) - A.override = 1 - if(target.client) - delusions |= A - target.client.images |= A - sleep(duration) - qdel(src) - -/obj/effect/hallucination/delusion/Destroy() - for(var/image/I in delusions) - if(target.client) - target.client.images.Remove(I) - return ..() - -/obj/effect/hallucination/self_delusion - var/image/delusion - -/obj/effect/hallucination/self_delusion/New(loc, mob/living/carbon/T, force_kind = null , duration = 300, custom_icon = null, custom_icon_file = null) - ..() - target = T - var/image/A = null - var/kind = force_kind ? force_kind : pick("clown","corgi","carp","skeleton","demon","zombie","robot") - switch(kind) - if("clown")//Clown - A = image('icons/mob/animal.dmi',target,"clown") - if("carp")//Carp - A = image('icons/mob/animal.dmi',target,"carp") - if("corgi")//Corgi - A = image('icons/mob/pets.dmi',target,"corgi") - if("skeleton")//Skeletons - A = image('icons/mob/human.dmi',target,"skeleton_s") - if("zombie")//Zombies - A = image('icons/mob/human.dmi',target,"zombie2_s") - if("demon")//Demon - A = image('icons/mob/mob.dmi',target,"daemon") - if("robot")//Cyborg - A = image('icons/mob/robots.dmi',target,"robot") - target.playsound_local(target,'sound/voice/liveagain.ogg', 75, 1) - if("custom") - A = image(custom_icon_file, target, custom_icon) - A.override = 1 - if(target.client) - to_chat(target, "...wabbajack...wabbajack...") - target.playsound_local(target,'sound/magic/staff_change.ogg', 50, 1, -1) - delusion = A - target.client.images |= A - sleep(duration) - qdel(src) - -/obj/effect/hallucination/self_delusion/Destroy() - if(target.client) - target.client.images.Remove(delusion) - return ..() - -/obj/effect/hallucination/fakeattacker/New(loc, mob/living/carbon/T) - ..() - target = T - var/mob/living/carbon/human/clone = null - var/clone_weapon = null - - for(var/thing in GLOB.human_list) - var/mob/living/carbon/human/H = thing - if(H.stat || H.lying) - continue - clone = H - break - - if(!clone) - return - - var/obj/effect/fake_attacker/F = new/obj/effect/fake_attacker(get_turf(target),target) - if(clone.l_hand) - if(!(locate(clone.l_hand) in GLOB.non_fakeattack_weapons)) - clone_weapon = clone.l_hand.name - F.weap = clone.l_hand - else if(clone.r_hand) - if(!(locate(clone.r_hand) in GLOB.non_fakeattack_weapons)) - clone_weapon = clone.r_hand.name - F.weap = clone.r_hand - - F.name = clone.name - F.my_target = target - F.weapon_name = clone_weapon - - F.left = image(clone,dir = WEST) - F.right = image(clone,dir = EAST) - F.up = image(clone,dir = NORTH) - F.down = image(clone,dir = SOUTH) - - F.updateimage() - qdel(src) - -/obj/effect/fake_attacker - icon = null - icon_state = null - name = "" - desc = "" - density = 0 - anchored = 1 - opacity = 0 - var/mob/living/carbon/human/my_target = null - var/weapon_name = null - var/obj/item/weap = null - var/image/stand_icon = null - var/image/currentimage = null - var/icon/base = null - var/skin_tone - var/mob/living/clone = null - var/image/left - var/image/right - var/image/up - var/collapse - var/image/down - - var/health = 100 - -/obj/effect/fake_attacker/attackby(obj/item/P, mob/living/user, params) - step_away(src,my_target,2) - user.changeNext_move(CLICK_CD_MELEE) - user.do_attack_animation(src) - my_target.playsound_local(src, P.hitsound, 1) - my_target.visible_message("[my_target] flails around wildly.", \ - "[my_target] has attacked [src]!") - - health -= P.force - return - -/obj/effect/fake_attacker/Crossed(mob/M, oldloc) - if(M == my_target) - step_away(src,my_target,2) - if(prob(30)) - for(var/mob/O in oviewers(world.view , my_target)) - to_chat(O, "[my_target] stumbles around.") - -/obj/effect/fake_attacker/New(loc, mob/living/carbon/T) - ..() - my_target = T - addtimer(CALLBACK(GLOBAL_PROC, .proc/qdel, src), 300) - step_away(src,my_target,2) - INVOKE_ASYNC(src, .proc/attack_loop) - -/obj/effect/fake_attacker/proc/updateimage() -// qdel(src.currentimage) - switch(dir) - if(NORTH) - qdel(src.currentimage) - currentimage = new /image(up, src) - if(SOUTH) - qdel(src.currentimage) - currentimage = new /image(down, src) - if(EAST) - qdel(src.currentimage) - currentimage = new /image(right, src) - if(WEST) - qdel(src.currentimage) - currentimage = new /image(left, src) - my_target << currentimage - - -/obj/effect/fake_attacker/proc/attack_loop() - while(1) - sleep(rand(5,10)) - if(src.health < 0 || my_target.stat) - collapse() - continue - if(get_dist(src,my_target) > 1) - src.dir = get_dir(src,my_target) - step_towards(src,my_target) - updateimage() - else - if(prob(15)) - do_attack_animation(my_target, ATTACK_EFFECT_PUNCH) - if(weapon_name) - my_target.playsound_local(my_target, weap.hitsound, 1) - my_target.show_message("[src.name] has attacked [my_target] with [weapon_name]!", 1) - my_target.adjustStaminaLoss(30) - if(prob(20)) - my_target.AdjustEyeBlurry(3) - if(prob(33)) - if(!locate(/obj/effect/overlay) in my_target.loc) - fake_blood(my_target) - else - my_target.playsound_local(my_target, pick('sound/weapons/punch1.ogg','sound/weapons/punch2.ogg','sound/weapons/punch3.ogg','sound/weapons/punch4.ogg'), 25, 1, -1) - my_target.show_message("[src.name] has punched [my_target]!", 1) - my_target.adjustStaminaLoss(30) - if(prob(33)) - if(!locate(/obj/effect/overlay) in my_target.loc) - fake_blood(my_target) - - if(prob(15)) - step_away(src,my_target,2) - -/obj/effect/fake_attacker/proc/collapse() - collapse = 1 - updateimage() - qdel(src) - -/obj/effect/fake_attacker/proc/fake_blood(mob/target) - var/obj/effect/overlay/O = new/obj/effect/overlay(target.loc) - O.name = "blood" - var/image/I = image('icons/effects/blood.dmi',O,"floor[rand(1,7)]",O.dir,1) - target << I - addtimer(CALLBACK(GLOBAL_PROC, .proc/qdel, O), 300) - return - -GLOBAL_LIST_INIT(non_fakeattack_weapons, list(/obj/item/gun/projectile, /obj/item/ammo_box/a357,\ - /obj/item/gun/energy/kinetic_accelerator/crossbow,\ - /obj/item/storage/box/syndicate, /obj/item/storage/box/emps,\ - /obj/item/cartridge/syndicate, /obj/item/clothing/under/chameleon,\ - /obj/item/clothing/shoes/chameleon/noslip, /obj/item/card/id/syndicate,\ - /obj/item/clothing/mask/chameleon, /obj/item/clothing/glasses/thermal,\ - /obj/item/chameleon, /obj/item/card/emag,\ - /obj/item/storage/toolbox/syndicate, /obj/item/aiModule,\ - /obj/item/radio/headset/syndicate, /obj/item/grenade/plastic/c4,\ - /obj/item/powersink, /obj/item/storage/box/syndie_kit,\ - /obj/item/toy/syndicateballoon, /obj/item/gun/energy/laser/captain,\ - /obj/item/hand_tele, /obj/item/rcd, /obj/item/tank/jetpack,\ - /obj/item/clothing/under/rank/captain, /obj/item/aicard,\ - /obj/item/clothing/shoes/magboots, /obj/item/areaeditor/blueprints, /obj/item/disk/nuclear,\ - /obj/item/clothing/suit/space/nasavoid, /obj/item/tank/internals)) - -/obj/effect/hallucination/bolts - var/list/doors = list() - -/obj/effect/hallucination/bolts/New(loc, mob/living/carbon/T, door_number = -1) //-1 for sever 1-2 for subtle - . = ..() - target = T - var/image/I = null - var/count = 0 - for(var/obj/machinery/door/airlock/A in range(target,7)) - if(count>door_number && door_number>0) - break - count++ - I = image(A.icon, get_turf(A), "door_locked", layer=A.layer+0.1) - doors += I - if(target.client) - target.client.images |= I - target.playsound_local(get_turf(A), 'sound/machines/boltsdown.ogg',30,0,3) - sleep(rand(6,12)) - sleep(100) - for(var/image/B in doors) - if(target.client) - target.client.images.Remove(B) - target.playsound_local(get_turf(B), 'sound/machines/boltsup.ogg',30,0,3) - sleep(rand(6,12)) - qdel(src) - -/obj/effect/hallucination/whispers - -/obj/effect/hallucination/whispers/New(loc, mob/living/carbon/T) - . = ..() - target = T - var/speak_messages = list("I'm watching you...","[target.name]!","Get out!","Kchck-Chkck? Kchchck!","Did you hear that?","What did you do ?","Why?","Give me that!","Honk!","HELP!!", "EI NATH!!", "RUN!!", "Kill me!","O bidai nabora se'sma!") - var/radio_messages = list("Xenos!","Singularity loose!","Comms down!","They are arming the nuke!","They butchered Ian!","H-help!","[pick("Cult", "Wizard", "Ling", "Ops", "Revenant", "Murderer", "Harm", "I hear flashing", "Help")] in [pick(GLOB.teleportlocs)][prob(50)?"!":"!!"]","Where's [target.name]?","Call the shuttle!","AI rogue!!") - - var/list/mob/living/carbon/people = list() - var/mob/living/carbon/person = null - for(var/mob/living/carbon/H in view(target)) - if(H == target) - continue - if(!person) - person = H - else - if(get_dist(target,H)The light burns you!
", - "You don't feel like yourself.", - "Unknown has punched [target]!", - "You hear something squeezing through the ducts...", - "You hear a distant scream.", - "You feel invincible, nothing can hurt you!", - "You feel a tiny prick!", - "[target] sneezes.", - "You feel faint.", - "You hear a strange, alien voice in your head... [pick("Hiss","Ssss")]", - "You can see...everything!") - to_chat(target, chosen) - qdel(src) - -/mob/living/carbon/proc/hallucinate(hal_type, specific) // specific is used to specify a particular hallucination - switch(hal_type) - if("xeno") - new /obj/effect/hallucination/xeno_attack(loc, src) - if("borer") - new /obj/effect/hallucination/borer(loc, src) - if("singulo") - new /obj/effect/hallucination/singularity_scare(loc, src) - if("koolaid") - new /obj/effect/hallucination/oh_yeah(loc, src) - if("battle") - new /obj/effect/hallucination/battle(loc, src) - if("flood") - new /obj/effect/hallucination/fake_flood(loc, src) - if("delusion") - new /obj/effect/hallucination/delusion(loc, src) - if("self_delusion") - new /obj/effect/hallucination/self_delusion(loc, src) - if("fake") - new /obj/effect/hallucination/fakeattacker(loc, src) - if("bolts") - new /obj/effect/hallucination/bolts(loc, src) - if("bolts_minor") - new /obj/effect/hallucination/bolts(loc,src, rand(1,2)) - if("whispers") - new /obj/effect/hallucination/whispers(loc, src) - if("message") - new /obj/effect/hallucination/message(loc, src) - if("items_other") - new /obj/effect/hallucination/items_other(src.loc,src) - if("sounds") - //Strange audio -// to_chat(src, "Strange Audio") - switch(rand(1,18)) - if(1) - playsound_local(null,'sound/machines/airlock_open.ogg', 15, 1) - if(2) - if(prob(50)) - playsound_local(null,'sound/effects/explosion1.ogg', 50, 1) - else - playsound_local(null, 'sound/effects/explosion2.ogg', 50, 1) - if(3) - playsound_local(null, 'sound/effects/explosionfar.ogg', 50, 1) - if(4) - playsound_local(null, pick('sound/effects/glassbr1.ogg','sound/effects/glassbr2.ogg','sound/effects/glassbr3.ogg'), 50, 1) - if(5) - playsound_local(null, 'sound/weapons/ring.ogg', 35) - for(var/i in 0 to 2) - sleep(15) - playsound_local(null, 'sound/weapons/ring.ogg', 35) - if(6) - playsound_local(null, 'sound/magic/summon_guns.ogg', 50, 1) - if(7) - playsound_local(null, 'sound/machines/alarm.ogg', 100, 0) - if(8) - playsound_local(null, 'sound/voice/bfreeze.ogg', 35, 0) - if(9) - //To make it more realistic, I added two gunshots (enough to kill) - playsound_local(null, 'sound/weapons/gunshots/gunshot.ogg', 25, 1) - var/timer_pause = rand(10,30) - addtimer(CALLBACK(src, /mob/.proc/playsound_local, null, 'sound/weapons/gunshots/gunshot.ogg', 25, 1), timer_pause) - addtimer(CALLBACK(src, /mob/.proc/playsound_local, null, sound(get_sfx("bodyfall"), 25), 25, 1), timer_pause+rand(5,10)) - if(10) - playsound_local(null, 'sound/effects/pray_chaplain.ogg', 50) - if(11) - //Same as above, but with tasers. - playsound_local(null, 'sound/weapons/taser.ogg', 25, 1) - var/timer_pause = rand(10,30) - addtimer(CALLBACK(src, /mob/.proc/playsound_local, null, 'sound/weapons/taser.ogg', 25, 1), timer_pause) - addtimer(CALLBACK(src, /mob/.proc/playsound_local, null, sound(get_sfx("bodyfall"), 25), 25, 1), timer_pause+rand(5,10)) - //Rare audio - if(12) - //These sounds are (mostly) taken from Hidden: Source - var/list/creepyasssounds = list('sound/effects/ghost.ogg', 'sound/effects/ghost2.ogg', 'sound/effects/heartbeat.ogg', 'sound/effects/screech.ogg',\ - 'sound/hallucinations/behind_you1.ogg', 'sound/hallucinations/behind_you2.ogg', 'sound/hallucinations/far_noise.ogg', 'sound/hallucinations/growl1.ogg', 'sound/hallucinations/growl2.ogg',\ - 'sound/hallucinations/growl3.ogg', 'sound/hallucinations/im_here1.ogg', 'sound/hallucinations/im_here2.ogg', 'sound/hallucinations/i_see_you1.ogg', 'sound/hallucinations/i_see_you2.ogg',\ - 'sound/hallucinations/look_up1.ogg', 'sound/hallucinations/look_up2.ogg', 'sound/hallucinations/over_here1.ogg', 'sound/hallucinations/over_here2.ogg', 'sound/hallucinations/over_here3.ogg',\ - 'sound/hallucinations/turn_around1.ogg', 'sound/hallucinations/turn_around2.ogg', 'sound/hallucinations/veryfar_noise.ogg', 'sound/hallucinations/wail.ogg') - playsound_local(null, pick(creepyasssounds), 50, 1) - if(13) - to_chat(src, "You feel a tiny prick!") - if(14) - to_chat(src, "

Priority Announcement

") - to_chat(src, "

The Emergency Shuttle has docked with the station. You have 3 minutes to board the Emergency Shuttle.

") - playsound_local(null, 'sound/AI/shuttledock.ogg', 100) - if(15) - playsound_local(null, 'sound/items/welder.ogg', 15, 1) - sleep(105) - playsound_local(null, 'sound/items/welder2.ogg', 15, 1) - sleep(15) - playsound_local(null, 'sound/items/ratchet.ogg', 15, 1) - if(16) - playsound_local(null, 'sound/items/screwdriver.ogg', 15, 1) - sleep(rand(10,30)) - for(var/i in 0 to rand(1,3)) - playsound_local(null, 'sound/weapons/empty.ogg', 15, 1) - sleep(rand(10,30)) - playsound_local(null, 'sound/machines/airlockforced.ogg', 15, 1) - if(17) - playsound_local(null, 'sound/weapons/saberon.ogg', 35, 1) - if(18) - to_chat(src, "

Biohazard Alert

") - to_chat(src, "

Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.

") - playsound_local(null, 'sound/AI/outbreak5.ogg') - if(19) //Tesla loose! - playsound_local(null, 'sound/magic/lightningbolt.ogg', 35, 1) - for(var/i in 0 to 2) - sleep(20) - playsound_local(null, 'sound/magic/lightningbolt.ogg', 65+(35*(i-1)), 1) //65%, then 100% volume. - if(20) //AI is doomsdaying! - to_chat(src, "

Anomaly Alert

") - to_chat(src, "

Hostile runtimes detected in all station systems, please deactivate your AI to prevent possible damage to its morality core.

") - playsound_local(null, 'sound/AI/aimalf.ogg') - if("hudscrew") - //Screwy HUD - hal_screwyhud = pick(SCREWYHUD_NONE, SCREWYHUD_CRIT, SCREWYHUD_DEAD, SCREWYHUD_HEALTHY) - sleep(rand(100,250)) - hal_screwyhud = SCREWYHUD_NONE - if("fake_alert") - var/alert_type = pick("not_enough_oxy","not_enough_tox","not_enough_co2","too_much_oxy","too_much_co2","too_much_tox","newlaw","nutrition","charge","weightless","fire","locked","hacked","temp","pressure") - if(specific) - alert_type = specific - switch(alert_type) - if("not_enough_oxy") - throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy, override = TRUE) - if("not_enough_tox") - throw_alert("not_enough_tox", /obj/screen/alert/not_enough_tox, override = TRUE) - if("not_enough_co2") - throw_alert("not_enough_co2", /obj/screen/alert/not_enough_co2, override = TRUE) - if("too_much_oxy") - throw_alert("too_much_oxy", /obj/screen/alert/too_much_oxy, override = TRUE) - if("too_much_co2") - throw_alert("too_much_co2", /obj/screen/alert/too_much_co2, override = TRUE) - if("too_much_tox") - throw_alert("too_much_tox", /obj/screen/alert/too_much_tox, override = TRUE) - if("nutrition") - if(prob(50)) - throw_alert("nutrition", /obj/screen/alert/fat, override = TRUE) - else - throw_alert("nutrition", /obj/screen/alert/starving, override = TRUE) - if("weightless") - throw_alert("weightless", /obj/screen/alert/weightless, override = TRUE) - if("fire") - throw_alert("fire", /obj/screen/alert/fire, override = TRUE) - if("temp") - if(prob(50)) - throw_alert("temp", /obj/screen/alert/hot, 3, override = TRUE) - else - throw_alert("temp", /obj/screen/alert/cold, 3, override = TRUE) - if("pressure") - if(prob(50)) - throw_alert("pressure", /obj/screen/alert/highpressure, 2, override = TRUE) - else - throw_alert("pressure", /obj/screen/alert/lowpressure, 2, override = TRUE) - //BEEP BOOP I AM A ROBOT - if("newlaw") - throw_alert("newlaw", /obj/screen/alert/newlaw, override = TRUE) - if("locked") - throw_alert("locked", /obj/screen/alert/locked, override = TRUE) - if("hacked") - throw_alert("hacked", /obj/screen/alert/hacked, override = TRUE) - if("charge") - throw_alert("charge",/obj/screen/alert/emptycell, override = TRUE) - sleep(rand(100,200)) - clear_alert(alert_type, clear_override = TRUE) - if("items") - //Strange items -// to_chat(src, "Traitor Items") - if(!halitem) - halitem = new - var/list/slots_free = list(ui_lhand,ui_rhand) - if(l_hand) - slots_free -= ui_lhand - if(r_hand) - slots_free -= ui_rhand - if(istype(src,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = src - if(!H.belt) - slots_free += ui_belt - if(!H.l_store) - slots_free += ui_storage1 - if(!H.r_store) - slots_free += ui_storage2 - if(slots_free.len) - halitem.screen_loc = pick(slots_free) - halitem.layer = 50 - halitem.plane = HUD_PLANE - switch(rand(1,6)) - if(1) //revolver - halitem.icon = 'icons/obj/guns/projectile.dmi' - halitem.icon_state = "revolver" - halitem.name = "Revolver" - if(2) //c4 - halitem.icon = 'icons/obj/assemblies.dmi' - halitem.icon_state = "plastic-explosive0" - halitem.name = "Mysterious Package" - if(prob(25)) - halitem.icon_state = "c4small_1" - if(3) //sword - halitem.icon = 'icons/obj/items.dmi' - halitem.icon_state = "sword1" - halitem.name = "Sword" - if(4) //stun baton - halitem.icon = 'icons/obj/items.dmi' - halitem.icon_state = "stunbaton" - halitem.name = "Stun Baton" - if(5) //emag - halitem.icon = 'icons/obj/card.dmi' - halitem.icon_state = "emag" - halitem.name = "Cryptographic Sequencer" - if(6) //flashbang - halitem.icon = 'icons/obj/grenade.dmi' - halitem.icon_state = "flashbang1" - halitem.name = "Flashbang" - if(client) client.screen += halitem - addtimer(CALLBACK(GLOBAL_PROC, .proc/qdel, halitem), rand(100,250)) - if("dangerflash") - //Flashes of danger - if(!halimage) - var/list/possible_points = list() - for(var/turf/simulated/floor/F in view(src,world.view)) - possible_points += F - if(possible_points.len) - var/turf/simulated/floor/target = pick(possible_points) - - switch(rand(1,4)) - if(1) - halimage = image('icons/turf/space.dmi',target,"[rand(1,25)]",TURF_LAYER) - if(2) - halimage = image('icons/turf/floors/lava.dmi',target,"smooth",TURF_LAYER) - if(3) - halimage = image('icons/turf/floors/Chasms.dmi',target,"smooth",TURF_LAYER) - if(4) - halimage = image('icons/obj/assemblies.dmi',target,"plastic-explosive2",OBJ_LAYER+0.01) - - if(client) - client.images += halimage - sleep(rand(40,60)) //Only seen for a brief moment. - if(client) - client.images -= halimage - halimage = null - if("death") - hal_screwyhud = SCREWYHUD_DEAD - SetSleeping(20, no_alert = TRUE) - if(prob(50)) - var/list/dead_people = list() - for(var/mob/dead/observer/G in GLOB.player_list) - dead_people += G - var/mob/dead/observer/fakemob = pick(dead_people) - if(fakemob) - sleep(rand(30, 60)) - to_chat(src, "[fakemob.name](FOLLOW) [pick("complains", "moans", "whines", "laments", "blubbers", "salts")], \"[pick("rip","welcome [name]","you too?","is the AI malf?",\ - "i[prob(50)?" fucking":""] hate [pick("blood cult", "clock cult", "revenants", "abductors","double agents","viruses","badmins","you")]")]\"") - sleep(rand(50,70)) - hal_screwyhud = SCREWYHUD_NONE - SetSleeping(0) - if("husks") - if(!halbody) - var/list/possible_points = list() - for(var/turf/simulated/floor/F in view(src,world.view)) - possible_points += F - if(possible_points.len) - var/turf/simulated/floor/target = pick(possible_points) - switch(rand(1,4)) - if(1) - var/image/body = image('icons/mob/human.dmi', target, "husk_s", TURF_LAYER) - var/matrix/M = matrix() - M.Turn(90) - body.transform = M - halbody = body - if(2,3) - halbody = image('icons/mob/human.dmi', target, "husk_s", TURF_LAYER) - if(4) - halbody = image('icons/mob/alien.dmi', target, "alienother", TURF_LAYER) - - if(client) - client.images += halbody - spawn(rand(30,50)) //Only seen for a brief moment. - if(client) - client.images -= halbody - halbody = null diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm index 532e5572894..d01e314c593 100644 --- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm +++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm @@ -12,7 +12,7 @@ var/const/duration = 13 //Directly relates to the 'weaken' duration. Lowered by armor (i.e. helmets) var/isGlass = 1 //Whether the 'bottle' is made of glass or not so that milk cartons dont shatter when someone gets hit by it -/obj/item/reagent_containers/food/drinks/bottle/proc/smash(mob/living/target, mob/living/user, ranged = 0) +/obj/item/reagent_containers/food/drinks/bottle/proc/smash(mob/living/target, mob/living/user, ranged = FALSE) //Creates a shattering noise and replaces the bottle with a broken_bottle var/new_location = get_turf(loc) @@ -124,6 +124,11 @@ reagents.reaction(M, REAGENT_TOUCH) reagents.clear_reagents() +/obj/item/reagent_containers/food/drinks/bottle/throw_impact(atom/target,mob/thrower) + ..() + SplashReagents(target) + smash(target, thrower, ranged = TRUE) + /obj/item/reagent_containers/food/drinks/bottle/decompile_act(obj/item/matter_decompiler/C, mob/user) if(!reagents.total_volume) C.stored_comms["glass"] += 3 @@ -345,11 +350,10 @@ if(istype(R, A)) firestarter = 1 break - SplashReagents(target) + ..() if(firestarter && active) target.fire_act() new /obj/effect/hotspot(get_turf(target)) - ..() /obj/item/reagent_containers/food/drinks/bottle/molotov/attackby(obj/item/I, mob/user, params) if(is_hot(I) && !active) diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm index 8b2bfdbd786..4dfecc88b82 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm @@ -45,7 +45,7 @@ // Components component_parts = list() var/obj/item/circuitboard/smartfridge/board = new(null) - board.set_type(type) + board.set_type(null, type) component_parts += board component_parts += new /obj/item/stock_parts/matter_bin(null) RefreshParts() diff --git a/code/modules/hallucinations/effects/common.dm b/code/modules/hallucinations/effects/common.dm new file mode 100644 index 00000000000..5a0524f00c0 --- /dev/null +++ b/code/modules/hallucinations/effects/common.dm @@ -0,0 +1,133 @@ +/** + * # Hallucination - Tripper + * + * A generic hallucination that causes the target to trip if they cross it. + */ +/obj/effect/hallucination/tripper + anchored = TRUE + /// Chance to trip when crossing. + var/trip_chance = 100 + /// Stun to add when crossed. + var/stun = 4 SECONDS_TO_LIFE_CYCLES + /// Weaken to add when crossed. + var/weaken = 4 SECONDS_TO_LIFE_CYCLES + +/obj/effect/hallucination/tripper/CanPass(atom/movable/mover, turf/T) + . = TRUE + if(isliving(mover) && mover == target) + var/mob/living/M = mover + if(M.lying || !prob(trip_chance)) + return + M.Stun(stun) + M.Weaken(weaken) + on_crossed() + +/** + * Called when the target crosses this hallucination. + */ +/obj/effect/hallucination/tripper/proc/on_crossed() + return + +/** + * # Hallucination - Chaser + * + * A generic hallucination that chases the target. + */ +/obj/effect/hallucination/chaser + hallucination_icon = 'icons/mob/monkey.dmi' + hallucination_icon_state = "monkey1" + hallucination_override = TRUE + // Settings + // Minimum distance required between the target and us to keep chasing them. + var/min_distance = 1 + /// Interval between two thinks in deciseconds. Shouldn't be too low to prevent lag. + var/think_interval = 1 SECONDS + // Variables + /// Think timer handle. + var/think_timer = null + +/obj/effect/hallucination/chaser/Initialize(mapload, mob/living/carbon/target) + . = ..() + name = "\proper monkey ([rand(100, 999)])" + think_timer = addtimer(CALLBACK(src, .proc/think), think_interval, TIMER_LOOP | TIMER_STOPPABLE) + +/obj/effect/hallucination/chaser/Destroy() + deltimer(think_timer) + return ..() + +/** + * Called at regular intervals to determine what to do. + */ +/obj/effect/hallucination/chaser/proc/think() + if(QDELETED(src)) + return + else if(QDELETED(target)) + qdel(src) + return + + if(get_dist(src, target) > min_distance) + chase() + else + within_range() + +/** + * Called every Think when we are not close enough to the target. + */ +/obj/effect/hallucination/chaser/proc/chase() + step_towards(src, target) + +/** + * Called every Think when we are close enough to the target. + */ +/obj/effect/hallucination/chaser/proc/within_range() + return + +/** + * # Hallucination - Attacker + * + * A generic hallucination based on the Chaser that attacks if close enough. + */ +/obj/effect/hallucination/chaser/attacker + /// Chance to attack per Think spent in range. + var/attack_chance = 100 + /// Stamina damage to heal on hit. + var/damage = 25 + /// Whether to attack if the target is knocked down. + var/should_attack_weakened = FALSE + +/obj/effect/hallucination/chaser/attacker/within_range() + if(!prob(attack_chance)) + return + var/was_weakened = target.IsWeakened() + if(was_weakened && !should_attack_weakened) + return + + attack(was_weakened) + +/** + * Called every Think when we are attacking the target. + * + * Arguments: + * * was_weakened - Whether the target was already knocked down prior to this attack. + */ +/obj/effect/hallucination/chaser/attacker/proc/attack(was_weakened) + dir = get_dir(src, target) + attack_effects() + target.adjustStaminaLoss(damage) + if(!was_weakened && target.IsWeakened()) + on_knockdown() + +/** + * Called to handle the visual and audio effects of an attack. + */ +/obj/effect/hallucination/chaser/attacker/proc/attack_effects() + do_attack_animation(target, ATTACK_EFFECT_PUNCH) + target.playsound_local(get_turf(src), get_sfx("punch"), 25, TRUE) + to_chat(target, "[name] has punched [target]!") + +/** + * Called when one of our attacks put the target in stamina crit. + */ +/obj/effect/hallucination/chaser/attacker/proc/on_knockdown() + target.visible_message("[target] recoils as if hit by something, before suddenly collapsing!", + "[src]'s blow was too much for you, causing you to collapse!") diff --git a/code/modules/hallucinations/effects/major.dm b/code/modules/hallucinations/effects/major.dm new file mode 100644 index 00000000000..40092e42902 --- /dev/null +++ b/code/modules/hallucinations/effects/major.dm @@ -0,0 +1,410 @@ +/** + * # Hallucination - Terror Infestation + * + * Creates spider webs and a terror spider near a random vent around the target. + */ +/obj/effect/hallucination/terror_infestation + duration = 30 SECONDS + +/obj/effect/hallucination/terror_infestation/Initialize(mapload, mob/living/carbon/target) + . = ..() + + // Find a vent around us + var/list/vents = list() + for(var/obj/machinery/atmospherics/unary/vent_pump/vent in range(world.view, target)) + vents += vent + if(!length(vents)) + return + + // Spawn webs around a random vent + var/obj/vent = pick(vents) + for(var/t in RANGE_TURFS(1, vent)) + var/turf/T = t + if(!isfloorturf(T)) + continue + new /obj/effect/hallucination/tripper/spider_web(T, target) + + new /obj/effect/hallucination/chaser/attacker/terror_spider(get_turf(vent), target) + +/obj/effect/hallucination/chaser/attacker/terror_spider + hallucination_icon = 'icons/mob/terrorspider.dmi' + hallucination_icon_state = "terror_green" + duration = 30 SECONDS + damage = 25 + +/obj/effect/hallucination/chaser/attacker/terror_spider/Initialize(mapload, mob/living/carbon/target) + . = ..() + name = "Green Terror spider ([rand(100, 999)])" + +/obj/effect/hallucination/chaser/attacker/terror_spider/attack_effects() + do_attack_animation(target, ATTACK_EFFECT_BITE) + target.playsound_local(get_turf(src), 'sound/weapons/bite.ogg', 50, TRUE) + to_chat(target, "[name] bites you!") + +/obj/effect/hallucination/chaser/attacker/terror_spider/on_knockdown() + target.visible_message("[target] recoils as if hit by something, before suddenly collapsing!", + "[name] bites you!") + +/** + * # Hallucination - Spider Web + * + * A fake spider web that trips the target if crossed. + */ +/obj/effect/hallucination/tripper/spider_web + name = "spider web" + desc = "It's stringy and sticky." + hallucination_icon = 'icons/effects/effects.dmi' + hallucination_icon_state = "stickyweb1" + hallucination_override = TRUE + hallucination_layer = OBJ_LAYER + trip_chance = 80 + +/obj/effect/hallucination/tripper/spider_web/Initialize(mapload, mob/living/carbon/target) + if(prob(50)) + hallucination_icon_state = "stickyweb2" + . = ..() + +/obj/effect/hallucination/tripper/spider_web/on_crossed() + target.visible_message("[target] trips over nothing.", + "You get stuck in [src]!") + +/obj/effect/hallucination/tripper/spider_web/attackby(obj/item/I, mob/user, params) + if(user != target) + return + + step_towards(target, get_turf(src)) + target.Weaken(4 SECONDS_TO_LIFE_CYCLES) + target.visible_message("[target] flails [target.p_their()] [I.name] as if striking something, only to trip!", + "[src] vanishes as you strike it with [I], causing you to stumble forward!") + qdel(src) + +/** + * # Hallucination - Abduction + * + * Sends an abductor agent after the target. On knockdown, spawns an abductor scientist next to the target. Nothing else happens. + */ +/obj/effect/hallucination/abduction + duration = 45 SECONDS + /// The abductor agent hallucination. + var/obj/effect/hallucination/chaser/attacker/abductor/agent = null + /// The abductor scientist image handle. + var/image/scientist = null + +/obj/effect/hallucination/abduction/Initialize(mapload, mob/living/carbon/target) + . = ..() + + var/list/locs = list() + for(var/turf/T in oview(world.view, target)) + if(!is_blocked_turf(T)) + locs += T + if(!length(locs)) + qdel(src) + return + + // Spawn agent + var/turf/T = pick(locs) + agent = new(T, target) + agent.owning_hallucination = src + + // Teleport effect + var/image/teleport_end = image('icons/mob/mob.dmi', T, "uncloak", layer = ABOVE_MOB_LAYER) + teleport_end.plane = GAME_PLANE + add_icon(teleport_end) + clear_icon_in(teleport_end, 0.9 SECONDS) + +/obj/effect/hallucination/abduction/Destroy() + QDEL_NULL(agent) + QDEL_NULL(scientist) + return ..() + +/** + * Called when the fake abductor scientist should spawn. + */ +/obj/effect/hallucination/abduction/proc/spawn_scientist() + // Find a spot for the scientist to spawn + var/list/locs = list() + for(var/turf/T in orange(1, target)) + if(!is_blocked_turf(T)) + locs += T + locs -= get_turf(agent) + if(!length(locs)) + qdel(src) + return + + QDEL_IN(src, 10 SECONDS) + + var/turf/T = pick(locs) + // Spawn the scientist in + var/image/teleport = image('icons/obj/abductor.dmi', T, "teleport", layer = ABOVE_MOB_LAYER) + teleport.plane = GAME_PLANE + add_icon(teleport) + clear_icon_in(teleport, 4 SECONDS) + addtimer(CALLBACK(src, .proc/do_spawn_scientist, T), 4 SECONDS) + playsound(T, "sparks", 100, TRUE) + +/** + * Timer called to actually spawn the scientist. + * + * Arguments: + * * T - Where to spawn the scientist. + */ +/obj/effect/hallucination/abduction/proc/do_spawn_scientist(turf/T) + if(QDELETED(target)) + qdel(src) + return + else if(scientist) + return + + var/image/teleport_end = image('icons/mob/mob.dmi', T, "uncloak", layer = ABOVE_MOB_LAYER) + teleport_end.plane = GAME_PLANE + add_icon(teleport_end) + clear_icon_in(teleport_end, 0.9 SECONDS) + + scientist = image('icons/mob/simple_human.dmi', T, "abductor_scientist", layer = MOB_LAYER) + scientist.plane = GAME_PLANE + scientist.dir = get_dir(T, target) + add_icon(scientist) + +/obj/effect/hallucination/chaser/attacker/abductor + hallucination_icon = 'icons/mob/simple_human.dmi' + hallucination_icon_state = "abductor_agent" + duration = 45 SECONDS + damage = 100 + /// The hallucination that spawned us. + var/obj/effect/hallucination/abduction/owning_hallucination = null + +/obj/effect/hallucination/chaser/attacker/abductor/Initialize(mapload, mob/living/carbon/target) + . = ..() + name = "Unknown" + +/obj/effect/hallucination/chaser/attacker/abductor/attack_effects() + do_attack_animation(target) + target.playsound_local(get_turf(src), 'sound/weapons/egloves.ogg', 50, TRUE) + +/obj/effect/hallucination/chaser/attacker/abductor/on_knockdown() + target.visible_message("[target] recoils as if hit by something, before suddenly collapsing!", + "[name] has stunned you with the advanced baton!") + if(!QDELETED(owning_hallucination)) + owning_hallucination.spawn_scientist() + else + qdel(src) + +/** + * # Hallucination - Loose Energy Ball + * + * A progressive hallucination that begins with intermittent explosions, before displaying an energy ball that shocks the target. + */ +/obj/effect/hallucination/loose_energy_ball + duration = 30 SECONDS + /// Length of phase 1 in deciseconds. + var/length_phase_1 = 10 SECONDS + /// Length of phase 2 in deciseconds. + var/length_phase_2 = 10 SECONDS + /// Length of phase 3 in deciseconds. + var/length_phase_3 = 6 SECONDS + +/obj/effect/hallucination/loose_energy_ball/Initialize(mapload) + . = ..() + phase_1() + addtimer(CALLBACK(src, .proc/phase_2), length_phase_1) + addtimer(CALLBACK(src, .proc/phase_3), length_phase_1 + length_phase_2) + +/** + * First phase of the hallucination: intermittent, far-away explosion sounds. + */ +/obj/effect/hallucination/loose_energy_ball/proc/phase_1() + for(var/i in 0 to (length_phase_1 / 20) - 1) + play_sound_in(i * 2 SECONDS, null, 'sound/effects/explosionfar.ogg', min(50 + i * 5, 100)) + +/** + * Second phase of the hallucination: closer explosions and zap sounds from a random direction. + */ +/obj/effect/hallucination/loose_energy_ball/proc/phase_2() + var/turf/source = get_step_rand(get_turf(target)) + for(var/i in 0 to (length_phase_2 / 20) - 1) + if(prob(33)) + play_sound_in(i * 2 SECONDS, source, pick('sound/effects/explosion1.ogg', 'sound/effects/explosion2.ogg'), min(5 + i * 3, 100)) + play_sound_in(i * 2 SECONDS, source, 'sound/magic/lightningbolt.ogg', min(5 + i * 3, 100)) + +/** + * Third and final phase of the hallucination: an energy ball that approaches the target before shocking it. + */ +/obj/effect/hallucination/loose_energy_ball/proc/phase_3() + // Create the image + var/image/ball = image('icons/obj/tesla_engine/energy_ball.dmi', src, "energy_ball") + ball.layer = MASSIVE_OBJ_LAYER + ball.plane = GAME_PLANE + add_icon(ball) + + var/steps = (length_phase_3 / 20) - 1 + for(var/i in 0 to steps) + addtimer(CALLBACK(src, .proc/phase_3_inner, ball, steps - i, i), i * 2 SECONDS) + +/** + * Called during phase 3 to approach the energy ball towards the target. + * + * Arguments: + * * ball - The energy ball image. + * * distance - The remaining distance. + * * step - The current step. + */ +/obj/effect/hallucination/loose_energy_ball/proc/phase_3_inner(image/ball, distance, step) + if(QDELETED(ball) || QDELETED(target)) + return + + var/turf/T = get_turf(target) + var/list/turfs = RANGE_TURFS(distance + 1, T) // expensive? + var/turf/dest = pick(turfs) || T // uh oh + + ball.loc = dest + target.playsound_local(dest, 'sound/magic/lightningbolt.ogg', 15 + step * 10) + target.playsound_local(dest, 'sound/magic/lightningshock.ogg', 15 + step * 10) + + if(distance == 0) + target.electrocute_act(100, src, flags = SHOCK_ILLUSION) + +/** + * # Hallucination - Assault + * + * An imaginary attacker spawns close to the target and attacks them to stamcrit. + */ +/obj/effect/hallucination/assault + duration = 30 SECONDS + /// The attacker hallucination. + var/obj/effect/hallucination/chaser/attacker/assaulter/fake_attacker = null + +/obj/effect/hallucination/assault/Initialize(mapload, mob/living/carbon/target) + . = ..() + + var/list/locs = list() + for(var/turf/T in oview(world.view / 2, target)) + if(!is_blocked_turf(T)) + locs += T + if(!length(locs)) + qdel(src) + return + + // Spawn attacker + var/turf/T = pick(locs) + fake_attacker = new(T, target) + +/obj/effect/hallucination/chaser/attacker/assaulter + duration = 30 SECONDS + damage = 40 + /// The attack verb to display. + var/attack_verb = "punches" + /// The attack sound to play. Can be a file or text (passed to [/proc/get_sfx]). + var/attack_sound = "punch" + +/obj/effect/hallucination/chaser/attacker/assaulter/Initialize(mapload, mob/living/carbon/target) + var/new_name + // 80% chance to use a simple human sprite + if(prob(80)) + new_name = "Unknown" + hallucination_icon = 'icons/mob/simple_human.dmi' + hallucination_icon_state = pick("eskimo", "templar", "skeleton", "russianmelee", "piratemelee", "plasma_miner_tool", "cat_butcher", "syndicate_space_sword", "syndicate_stormtrooper_sword", "zombie", "scary_clown") + + // Adjust the attack verb and sound depending on the "mob" + switch(hallucination_icon_state) + if("eskimo", "templar", "russianmelee", "plasma_miner_tool") + attack_verb = "slashed" + attack_sound = 'sound/weapons/bladeslice.ogg' + if("cat_butcher") + attack_verb = "sawed" + attack_sound = 'sound/weapons/circsawhit.ogg' + if("piratemelee", "syndicate_space_sword", "syndicate_stormtrooper_sword") + attack_verb = "slashed" + attack_sound = 'sound/weapons/blade1.ogg' + + // If nothing else we'll stay a monke + . = ..() + name = new_name || name + +/obj/effect/hallucination/chaser/attacker/assaulter/attack_effects() + do_attack_animation(target) + target.playsound_local(get_turf(src), istext(attack_sound) ? get_sfx(attack_sound) : attack_sound, 25, TRUE) + to_chat(target, "[name] has [attack_verb] [target]!") + +/obj/effect/hallucination/chaser/attacker/assaulter/on_knockdown() + target.visible_message("[target] recoils as if hit by something, before suddenly collapsing!", + "[name] has [attack_verb] [target]!") + QDEL_IN(src, 3 SECONDS) + +/** + * # Hallucination - Xeno Pounce + * + * An imaginary alien hunter pounces towards the target. + */ +/obj/effect/hallucination/xeno_pounce + duration = 15 SECONDS + // Settings + /// Maximum number of times the alien will pounce. + var/num_pounces = 3 + /// How often to pounce in deciseconds. + var/pounce_interval = 5 SECONDS + // Variables + /// The xeno hallucination reference. + var/obj/effect/hallucination/xeno_pouncer/xeno = null + +/obj/effect/hallucination/xeno_pounce/Initialize(mapload, mob/living/carbon/target) + . = ..() + + // Find a vent around us + var/list/vents = list() + for(var/obj/machinery/atmospherics/unary/vent_pump/vent in range(world.view / 2, target)) + vents += vent + if(!length(vents)) + return + + var/turf/T = get_turf(pick(vents)) + xeno = new(T, target) + xeno.dir = get_dir(T, target) + addtimer(CALLBACK(src, .proc/do_pounce), pounce_interval) + +/obj/effect/hallucination/xeno_pounce/proc/do_pounce() + if(QDELETED(xeno) || QDELETED(target)) + return + + xeno.leap_to(target) + if(--num_pounces > 0) + addtimer(CALLBACK(src, .proc/do_pounce), pounce_interval) + +/obj/effect/hallucination/xeno_pouncer + hallucination_icon = 'icons/mob/alien.dmi' + hallucination_icon_state = "alienh_pounce" + hallucination_override = TRUE + +/obj/effect/hallucination/xeno_pouncer/Initialize(mapload, mob/living/carbon/target) + . = ..() + name = "\proper alien hunter ([rand(100, 999)])" + +/obj/effect/hallucination/xeno_pouncer/throw_impact(A) + if(A == target) + forceMove(get_turf(target)) + target.Weaken(5) + target.visible_message("[target] recoils backwards and falls flat!", + "[name] pounces on you!") + + to_chat(target, "[name] begins climbing into the ventilation system...") + QDEL_IN(src, 2 SECONDS) + +/** + * Throws the xeno towards the given loc. + * + * Arguments: + * * dest - The loc to leap to. + */ +/obj/effect/hallucination/xeno_pouncer/proc/leap_to(dest) + if(images && images[1]) + images[1].icon = 'icons/mob/alienleap.dmi' + images[1].icon_state = "alienh_leap" + dir = get_dir(get_turf(src), dest) + throw_at(dest, 7, 1, spin = FALSE, diagonals_first = TRUE, callback = CALLBACK(src, .proc/reset_icon)) + +/** + * Resets the xeno's icon to a resting state. + */ +/obj/effect/hallucination/xeno_pouncer/proc/reset_icon() + if(images && images[1]) + images[1].icon = 'icons/mob/alien.dmi' + images[1].icon_state = "alienh_pounce" diff --git a/code/modules/hallucinations/effects/minor.dm b/code/modules/hallucinations/effects/minor.dm new file mode 100644 index 00000000000..4c866e06c5e --- /dev/null +++ b/code/modules/hallucinations/effects/minor.dm @@ -0,0 +1,198 @@ +/** + * # Hallucination - Audio + * + * Plays a random sound. + */ +/obj/effect/hallucination/audio + duration = 0 + /// Associative list of sounds that may be played. Value corresponds to the volume. + var/list/sounds = list( + 'sound/effects/explosionfar.ogg' = 50, + 'sound/effects/pray_chaplain.ogg' = 50, + 'sound/machines/alarm.ogg' = 100, + 'sound/magic/summon_guns.ogg' = 50, + ) + +/obj/effect/hallucination/audio/Initialize(mapload, mob/living/carbon/target, atom/source = null) + . = ..() + var/snd = pick(sounds) + target.playsound_local(source, snd, sounds[snd]) + +/** + * # Hallucination - Audio (Localized) + * + * Plays a random sound at a random location around the target. + */ +/obj/effect/hallucination/audio/localized + sounds = list( + 'sound/effects/explosion1.ogg' = 50, + 'sound/effects/explosion2.ogg' = 50, + 'sound/effects/glassbr1.ogg' = 50, + 'sound/effects/glassbr2.ogg' = 50, + 'sound/effects/glassbr3.ogg' = 50, + 'sound/machines/airlock_open.ogg' = 50, + ) + +/obj/effect/hallucination/audio/localized/Initialize(mapload, mob/living/carbon/target) + var/list/turfs = list() + for(var/turf/T in range(world.view, target)) + turfs += T + if(length(turfs)) + . = ..(mapload, target, pick(turfs)) + else + . = ..(mapload, target) + +/** + * # Hallucination - Bolts + * + * Visually bolts a random number of airlocks around the target. + */ +/obj/effect/hallucination/bolts + duration = 15 SECONDS + /// The maximum amount of airlocks to fake bolt. + var/bolt_amount = 2 + /// The duration of fake bolt in deciseconds. + var/bolt_duration = 10 SECONDS + /// Lazy list of fake bolted airlocks. Key is airlock, value is bolt overlay. + var/list/bolted + +/obj/effect/hallucination/bolts/Initialize(mapload, mob/living/carbon/target) + . = ..() + + var/list/airlocks = list() + for(var/obj/machinery/door/airlock/A in oview(world.view, target)) + airlocks += A + + var/num_bolted = 0 + while(bolt_amount && length(airlocks)) + var/obj/machinery/door/airlock/A = pick_n_take(airlocks) + if(A.locked) + continue + addtimer(CALLBACK(src, .proc/do_bolt, A), num_bolted++ * rand(5, 7)) + bolt_amount-- + +/** + * Called in a timer to fake bolt the given airlock. + * + * Arguments: + * * A - The airlock to fake bolt. + */ +/obj/effect/hallucination/bolts/proc/do_bolt(obj/machinery/door/airlock/A) + if(QDELETED(A) || (A.locked && A.arePowerSystemsOn()) || A.operating || !A.density) + return + + var/bolt_overlay = image(get_airlock_overlay("lights_bolts", A.overlays_file), A) + add_icon(bolt_overlay) + target?.playsound_local(get_turf(A), A.boltDown, 30, FALSE, 3) + LAZYSET(bolted, A, bolt_overlay) + // Timer and signal to turn it off (only one can happen) + RegisterSignal(A, COMSIG_AIRLOCK_OPEN, .proc/do_unbolt) + addtimer(CALLBACK(src, .proc/do_unbolt, A, bolt_overlay), bolt_duration) + +/** + * Called in a timer to fake unbolt the given airlock. + * + * Arguments: + * * A - The airlock to fake unbolt. + * * bolt_overlay - The bolt overlay image currently displayed on A. + */ +/obj/effect/hallucination/bolts/proc/do_unbolt(obj/machinery/door/airlock/A, image/bolt_overlay) + if(QDELETED(A)) + return + // bolt_overlay is null if this proc is called from the signal, so use the lookup table to retrieve it + bolt_overlay = bolt_overlay || bolted[A] + if(QDELETED(bolt_overlay)) + return + UnregisterSignal(A, COMSIG_AIRLOCK_CLOSE) + clear_icon(bolt_overlay) + target?.playsound_local(get_turf(A), A.boltUp, 30, FALSE, 3) + bolted[A] = null + +/** + * # Hallucination - Speech + * + * Causes the target to hear a fake message from a random mob around them. + */ +/obj/effect/hallucination/speech + duration = 3 SECONDS + /// List of messages that may be heard. + var/list/messages = list( + "I'm watching you...", + "I'm going to kill you!", + "Get out!", + "Kchck-Chkck? Kchchck!", + "Did you hear that?", + "What did you do?", + "Why?", + "Give me that!", + "Honk!", + "Kill me!", + "HELP!!", + "RUN!!", + "EI NATH!!", + "O bidai nabora se'sma!", + "I have the disk!", + ) + +/obj/effect/hallucination/speech/Initialize(mapload, mob/living/carbon/target) + . = ..() + + var/list/mobs = list() + for(var/mob/living/M in oview(world.view, target)) + mobs += M + if(!length(mobs)) + return + + var/mob/living/M = pick(mobs) + var/message = pick(messages + "[target]!") + target.hear_say(message_to_multilingual(message, pick(target.languages)), speaker = M) + // Speech bubble + var/image/speech_bubble = image('icons/mob/talk.dmi', M, "[target.bubble_icon][say_test(message)]", layer = FLY_LAYER) + speech_bubble.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA + add_icon(speech_bubble) + +/** + * # Hallucination - Fake Danger + * + * Sends a random danger message to the target's chat. + */ +/obj/effect/hallucination/fake_danger + duration = 0 + /// List of messages that may be displayed. + var/list/messages = list( + "The light burns you!", + "You experience a stabbing sensation and your ears begin to ring...", + "You get the feeling this is a bad idea.", + "Your blood boils in your veins!", + "You hear a loud buzz in your head, silencing your thoughts!", + "You feel an awful sense of being watched...", + "You suddenly feel very hot.", + "You feel like you could blow up at any moment!", + "You feel hotter than usual. Maybe you should lowe-wait, is that your hand melting?", + "You hear battle shouts. The tramping of boots on cold metal. Screams of agony. The rush of venting air. Are you going insane?", + ) + +/obj/effect/hallucination/fake_danger/Initialize(mapload, mob/living/carbon/target) + . = ..() + to_chat(target, "[pick(messages)]") + +/** + * # Hallucination - Fake Health + * + * Visually changes the target's health status to something it shouldn't be. + */ +/obj/effect/hallucination/fake_health + duration = list(10 SECONDS, 25 SECONDS) + +/obj/effect/hallucination/fake_health/Initialize(mapload, mob/living/carbon/target) + . = ..() + if(target.health > HEALTH_THRESHOLD_CRIT) + target.health_hud_override = pick(HEALTH_HUD_OVERRIDE_CRIT, HEALTH_HUD_OVERRIDE_DEAD) + else + target.health_hud_override = HEALTH_HUD_OVERRIDE_HEALTHY // You think you're fine, but you're not + target.update_health_hud() + +/obj/effect/hallucination/fake_health/Destroy() + target?.health_hud_override = HEALTH_HUD_OVERRIDE_NONE + target?.update_health_hud() + return ..() diff --git a/code/modules/hallucinations/effects/moderate.dm b/code/modules/hallucinations/effects/moderate.dm new file mode 100644 index 00000000000..876417b9e77 --- /dev/null +++ b/code/modules/hallucinations/effects/moderate.dm @@ -0,0 +1,478 @@ +/** + * # Hallucination - Bolts (Moderate) + * + * A variation that affects more airlocks. + */ +/obj/effect/hallucination/bolts/moderate + bolt_amount = 7 + +/** + * # Hallucination - Fake Alert + * + * Displays a random alert on the target's HUD. + */ +/obj/effect/hallucination/fake_alert + duration = list(10 SECONDS, 25 SECONDS) + /// The possible alerts to be displayed. Key is alert type, value is alert category. + var/list/alerts = list( + /obj/screen/alert/not_enough_oxy = "not_enough_oxy", + /obj/screen/alert/not_enough_tox = "not_enough_tox", + /obj/screen/alert/not_enough_co2 = "not_enough_co2", + /obj/screen/alert/not_enough_nitro = "not_enough_nitro", + /obj/screen/alert/too_much_oxy = "too_much_oxy", + /obj/screen/alert/too_much_co2 = "too_much_co2", + /obj/screen/alert/too_much_tox = "too_much_tox", + /obj/screen/alert/fat = "nutrition", + /obj/screen/alert/starving = "nutrition", + /obj/screen/alert/hot = "temp", + /obj/screen/alert/cold = "temp", + /obj/screen/alert/highpressure = "pressure", + /obj/screen/alert/lowpressure = "pressure", + ) + /// Alert severities. Only needed for some alerts such as temperature or pressure. Key is alert category, value is severity. + var/list/severities = list( + "temp" = 3, + "pressure" = 2, + ) + /// The alert category that was affected(arc) as part of this hallucination. + var/alert_category + +/obj/effect/hallucination/fake_alert/Initialize(mapload, mob/living/carbon/target) + . = ..() + var/alert_type = pick(alerts) + alert_category = alerts[alert_type] + target.throw_alert(alert_category, alert_type, override = TRUE, severity = severities[alert_category]) + +/obj/effect/hallucination/fake_alert/Destroy() + target?.clear_alert(alert_category, clear_override = TRUE) + return ..() + +/** + * # Hallucination - Fake Item + * + * Displays a random fake item around the target. If it's on the floor and they try to pick it up, they will trip and fall. + */ +/obj/effect/hallucination/fake_item + hallucination_override = TRUE + hallucination_layer = OBJ_LAYER + /// Static list of items this hallucination can be. + var/static/list/items = list( + "\improper .357 revolver" = list('icons/obj/guns/projectile.dmi', "revolver"), + "\improper ARG" = list('icons/obj/guns/projectile.dmi', "arg-30"), + "\improper C4" = list('icons/obj/grenade.dmi', "plastic-explosive0"), + "\improper L6 SAW" = list('icons/obj/guns/projectile.dmi', "l6closed100"), + "chainsaw" = list('icons/obj/items.dmi', "chainsaw0"), + "combat shotgun" = list('icons/obj/guns/projectile.dmi', "cshotgun"), + "double-bladed energy sword" = list('icons/obj/items.dmi', "dualsaberred1"), + "energy sword" = list('icons/obj/items.dmi', "swordred"), + "fireaxe" = list('icons/obj/items.dmi', "fireaxe1"), + "ritual dagger" = list('icons/obj/cult.dmi', "blood_dagger"), + "ritual dagger" = list('icons/obj/cult.dmi', "death_dagger"), + "ritual dagger" = list('icons/obj/cult.dmi', "hell_dagger"), + "sniper rifle" = list('icons/obj/guns/projectile.dmi', "sniper"), + ) + +/obj/effect/hallucination/fake_item/Initialize(mapload, mob/living/carbon/target) + name = pick(items) + var/list/icon_data = items[name] + hallucination_icon = icon_data[1] + hallucination_icon_state = icon_data[2] + . = ..() + + var/list/locs = list() + for(var/turf/T in oview(world.view, target)) + if(!is_blocked_turf(T)) + locs += T + if(!length(locs)) + qdel(src) + return + loc = pick(locs) + +/obj/effect/hallucination/fake_item/attack_hand(mob/living/user) + if(user != target) + return + if(hasorgans(user)) + var/mob/living/carbon/human/H = user + var/obj/item/organ/external/temp = H.bodyparts_by_name["r_hand"] + if(user.hand) + temp = H.bodyparts_by_name["l_hand"] + if(!temp) + to_chat(user, "You try to use your hand, but it's missing!") + return + if(!temp.is_usable()) + to_chat(user, "You try to move your [temp.name], but cannot!") + return + + user.Weaken(4 SECONDS_TO_LIFE_CYCLES) + user.visible_message("[user] does a grabbing motion towards [get_turf(src)] but [user.p_they()] stumble[user.p_s()] - nothing is there!", + "[src] vanishes as you try grabbing it, causing you to stumble!") + qdel(src) + +/** + * # Hallucination - Fake Weapon + * + * Displays a random fake weapon wielded by a human around the target. + */ +/obj/effect/hallucination/fake_weapon + /// Static list of weapons this hallucination can be. Key is icon state, value is LEFT-HAND icon file. + var/static/list/weapons = list( + "advtaserstun4" = 'icons/mob/inhands/guns_lefthand.dmi', + "arm_blade" = null, + "blood_blade" = null, + "crossbow" = 'icons/mob/inhands/guns_lefthand.dmi', + "death_blade" = null, + "disintegrate" = null, + "fireaxe0" = null, + "hell_blade" = null, + "ling_shield" = null, + "nucgun" = 'icons/mob/inhands/guns_lefthand.dmi', + "prod" = null, + "staffofslipping" = null, + "staffofstorms" = null, + "swordred" = null, + "ttv" = null, + ) + /// The default LEFT-HAND icon file for weapons. Static. + var/static/default_icon = 'icons/mob/inhands/items_lefthand.dmi' + /// Static list of RIGHT-HAND counterpart for any LEFT-HAND icon files used above. + var/static/right_hand_icons = list( + 'icons/mob/inhands/items_lefthand.dmi' = 'icons/mob/inhands/items_righthand.dmi', + 'icons/mob/inhands/guns_lefthand.dmi' = 'icons/mob/inhands/guns_righthand.dmi', + ) + /// The mob wielding the fake weapon. + var/mob/living/carbon/human/wielder = null + +/obj/effect/hallucination/fake_weapon/Initialize(mapload, mob/living/carbon/target) + . = ..() + + // Find able-bodied mobs first + var/list/mobs = list() + for(var/mob/living/carbon/human/H in oview(world.view, target)) + if(H.stat || !((H.has_left_hand() && !H.l_hand) || (H.has_right_hand() && !H.r_hand))) + continue + mobs += H + if(!length(mobs)) + qdel(src) + return + + // Pick a hand if it exists of course + wielder = pick(mobs) + var/right = FALSE + if(!(wielder.bodyparts_by_name["l_hand"] && !wielder.l_hand) || ((wielder.bodyparts_by_name["r_hand"] && !wielder.r_hand) && prob(50))) + right = TRUE + + // Create the icon + hallucination_icon_state = pick(weapons) + var/icon = weapons[hallucination_icon_state] || default_icon + if(right) + icon = right_hand_icons[icon] + var/image/I = image(icon, wielder, hallucination_icon_state) + I = center_image(I, 32, 32) + add_icon(I) + + if(hallucination_icon_state == "swordred") + target.playsound_local(get_turf(wielder), 'sound/weapons/saberon.ogg', 35, TRUE) + +/obj/effect/hallucination/fake_weapon/Destroy() + if(!QDELETED(wielder) && hallucination_icon_state == "swordred") + target.playsound_local(get_turf(wielder), 'sound/weapons/saberoff.ogg', 35, TRUE) + return ..() + +/** + * # Hallucination - Chasms + * + * Displays fake chasms around the target that if crossed, cause them to trip. + */ +/obj/effect/hallucination/chasms + /// Minimum number of chasms to create. + var/min_amount = 3 + /// Maximum number of chasms to create. + var/max_amount = 7 + +/obj/effect/hallucination/chasms/Initialize(mapload, mob/living/carbon/target) + . = ..() + + // Let's check if we can spawn somewhere first + var/list/locs = list() + for(var/turf/T in oview(world.view, target)) + if(isfloorturf(T) && !is_blocked_turf(T)) + locs += T + if(!length(locs)) + qdel(src) + return + + var/amount = rand(min_amount, max_amount) + while(amount-- && length(locs)) + new /obj/effect/hallucination/tripper/chasm(pick_n_take(locs), target) + +/** + * # Hallucination - Chasm + * + * A fake chasm that if crossed by the target, causes them to trip. + */ +/obj/effect/hallucination/tripper/chasm + name = "chasm" + hallucination_icon = 'icons/turf/floors/Chasms.dmi' + hallucination_icon_state = "smooth" + hallucination_override = TRUE + hallucination_layer = HIGH_TURF_LAYER + stun = 8 SECONDS_TO_LIFE_CYCLES + weaken = 8 SECONDS_TO_LIFE_CYCLES + +/obj/effect/hallucination/tripper/chasm/on_crossed() + target.visible_message("[target] trips over nothing and flails on [get_turf(target)] as if they were falling!", + "You stumble and stare into an abyss before you. It stares back, and you fall into the enveloping dark!") + +/** + * # Hallucination - Delamination Alarm + * + * A fake radio message and audio that alerts of an increasing SM unstability. + */ +/obj/effect/hallucination/delamination_alarm + duration = 0 + +/obj/effect/hallucination/delamination_alarm/Initialize(mapload, mob/living/carbon/target) + . = ..() + target.playsound_local(target, 'sound/machines/engine_alert2.ogg', 25, FALSE, 30, 30) + target.hear_radio(message_to_multilingual("Danger! Crystal hyperstructure integrity faltering! Integrity: [rand(30, 50)]%"), vname = "supermatter crystal", part_a = "\[[get_frequency_name(PUB_FREQ)]\] ", part_b = " ") + +/** + * # Hallucination - Plasma Flood + * + * A fake plasma flood emanating from a nearby vent. + */ +/obj/effect/hallucination/plasma_flood + duration = 25 SECONDS + /// List of turfs that need expanding from. + var/list/turf/expand_queue = list() + /// Associative list of turfs that have already been processed. + var/list/turf/processed = list() + /// The delay at which the plasma flood expands in deciseconds. Shouldn't be too low to prevent lag. + var/expand_delay = 2.5 SECONDS // Expand 10 times + /// Expand timer handle. + var/expand_timer = null + +/obj/effect/hallucination/plasma_flood/Initialize(mapload, mob/living/carbon/target) + . = ..() + + var/list/vents = list() + for(var/obj/machinery/atmospherics/unary/vent_pump/vent in oview(world.view, target)) + if(!is_blocked_turf(vent) && !vent.welded) + vents += vent + if(!length(vents)) + qdel(src) + return + + var/turf/T = get_turf(pick(vents)) + create_plasma(T) + expand_queue += T + processed[T] = TRUE + expand_timer = addtimer(CALLBACK(src, .proc/expand), expand_delay, TIMER_LOOP | TIMER_STOPPABLE) + +/obj/effect/hallucination/plasma_flood/Destroy() + deltimer(expand_timer) + QDEL_NULL(expand_queue) + QDEL_NULL(processed) + return ..() + +/** + * Called regularly in a timer to process the plasma flooding. + */ +/obj/effect/hallucination/plasma_flood/proc/expand() + // Brace for potentially expensive proc + for(var/t in expand_queue) + var/turf/source_turf = t + expand_queue -= source_turf + // Expand to each dir + for(var/dir in GLOB.cardinal) + var/turf/target_turf = get_step(source_turf, dir) + if(processed[target_turf] || !source_turf.CanAtmosPass(target_turf)) + continue + create_plasma(target_turf) + expand_queue += target_turf + processed[target_turf] = TRUE + +/** + * Creates a fake plasma overlay on the given turf. + * + * Arguments: + * * T - The turf to create a fake plasma overlay on. + */ +/obj/effect/hallucination/plasma_flood/proc/create_plasma(turf/T) + var/image/I = image('icons/effects/tile_effects.dmi', T, "plasma", layer = FLY_LAYER) + I.plane = GAME_PLANE + add_icon(I) + +/** + * # Hallucination - Husks + * + * A random number of fake husks around the target. + */ +/obj/effect/hallucination/husks + duration = 25 SECONDS + /// The base number of husks to create. + var/num_base = 3 + /// The husk number variation, both negative and positive. + var/variation = 1 + +/obj/effect/hallucination/husks/Initialize(mapload, mob/living/carbon/target) + . = ..() + + var/list/locs = list() + for(var/turf/T in oview(world.view, target)) + if(isfloorturf(T) && !is_blocked_turf(T)) + locs += T + if(!length(locs)) + qdel(src) + return + + var/to_spawn = num_base + rand(-variation, variation) + while(to_spawn-- && length(locs)) + var/image/I = image('icons/mob/human.dmi', pick_n_take(locs), "husk_s", layer = MOB_LAYER, dir = pick(GLOB.cardinal)) + I.plane = GAME_PLANE + I.transform = turn(I.transform, pick(-90, 90)) + add_icon(I) + +/** + * # Hallucination - Stunprodding + * + * A series of localized audio playback simulating a kidnapping with a stunprod. + */ +/obj/effect/hallucination/stunprodding + duration = 3 SECONDS + +/obj/effect/hallucination/stunprodding/Initialize(mapload, mob/living/carbon/target) + . = ..() + + var/list/turfs = list() + for(var/turf/T in range(world.view, target)) + turfs += T + + var/turf/T = pick(turfs) + target.playsound_local(T, 'sound/weapons/Egloves.ogg', 25, TRUE) + target.playsound_local(T, get_sfx("bodyfall"), 25, TRUE) + target.playsound_local(T, "sparks", 50, TRUE) + + if(prob(50)) + var/snd = pick('sound/goonstation/voice/female_scream.ogg', 'sound/goonstation/voice/male_scream.ogg') + play_sound_in(rand(13, 20), T, snd, 50, TRUE, rand(9, 11) / 10) + + play_sound_in(rand(17, 20), T, 'sound/weapons/cablecuff.ogg', 15, TRUE) + +/** + * # Hallucination - Energy Sword + * + * A series of localized audio playback simulating an energy sword murder. + */ +/obj/effect/hallucination/energy_sword + duration = 10 SECONDS + +/obj/effect/hallucination/energy_sword/Initialize(mapload, mob/living/carbon/target) + . = ..() + + var/list/turfs = list() + for(var/turf/T in range(world.view, target)) + turfs += T + + var/turf/T = pick(turfs) + loc = T + target.playsound_local(T, 'sound/weapons/saberon.ogg', 20, TRUE) + + var/scream_sound = pick('sound/goonstation/voice/female_scream.ogg', 'sound/goonstation/voice/male_scream.ogg') + var/scream_pitch = rand(9, 11) / 10 + var/num_hits = rand(5, 6) + var/scream_cd = 0 + for(var/i in 1 to num_hits) + var/time = i * CLICK_CD_MELEE + rand(3, 7) + play_sound_in(time, T, 'sound/weapons/blade1.ogg', 15, TRUE) + if(i == num_hits) + play_sound_in(time, T, pick('sound/goonstation/voice/deathgasp_1.ogg', 'sound/goonstation/voice/deathgasp_2.ogg'), 50, TRUE, scream_pitch) + else if(scream_sound && scream_cd-- <= 0 && prob(20)) + scream_cd = 2 + play_sound_in(time, T, scream_sound, 50, TRUE, scream_pitch) + +/obj/effect/hallucination/energy_sword/Destroy() + target.playsound_local(loc, 'sound/weapons/saberoff.ogg', 20, TRUE) + return ..() + +/** + * # Hallucination - Gunfire + * + * A series of localized audio playback simulating a gunshot murder. + */ +/obj/effect/hallucination/gunfire + duration = 10 SECONDS + +/obj/effect/hallucination/gunfire/Initialize(mapload, mob/living/carbon/target) + . = ..() + + var/list/turfs = list() + for(var/turf/T in range(world.view, target)) + turfs += T + + var/turf/T = pick(turfs) + loc = T + + var/gun_sound = pick('sound/weapons/gunshots/gunshot_pistol.ogg', 'sound/weapons/gunshots/gunshot_strong.ogg') + var/scream_sound = pick('sound/goonstation/voice/female_scream.ogg', 'sound/goonstation/voice/male_scream.ogg') + var/scream_pitch = rand(9, 11) / 10 + var/num_hits = rand(7, 8) + var/scream_cd = 0 + for(var/i in 1 to num_hits) + var/time = i * CLICK_CD_RANGE + rand(2, 4) + play_sound_in(time, T, gun_sound, 25, TRUE) + if(i == num_hits) + play_sound_in(time, T, pick('sound/goonstation/voice/deathgasp_1.ogg', 'sound/goonstation/voice/deathgasp_2.ogg'), 50, TRUE, scream_pitch) + else if(scream_sound && scream_cd-- <= 0 && prob(20)) + scream_cd = 2 + play_sound_in(time, T, scream_sound, 50, TRUE, scream_pitch) + +/** + * # Hallucination - Self Delusion + * + * Changes the target's appearance to something else temporarily. + */ +/obj/effect/hallucination/self_delusion + duration = 15 SECONDS + +/obj/effect/hallucination/self_delusion/Initialize(mapload, mob/living/carbon/target) + . = ..() + + var/image/I = get_image() + I.override = TRUE + add_icon(I) + + to_chat(target, "...wabbajack...wabbajack...") + target.playsound_local(get_turf(target), 'sound/magic/staff_change.ogg', 50, TRUE, -1) + +/** + * Returns the image to use as override to the target's appearance. + */ +/obj/effect/hallucination/self_delusion/proc/get_image() + return image('icons/mob/animal.dmi', target, pick("bear", "brownbear", "corgi", "cow", "deer", "goat", "goose", "pig", "blank-body")) + +/** + * # Hallucination - Delusion + * + * Changes the appearance of all humans around the target. + */ +/obj/effect/hallucination/delusion + duration = 15 SECONDS + +/obj/effect/hallucination/delusion/Initialize(mapload, mob/living/carbon/target, override_icon, override_icon_state) + . = ..() + + for(var/mob/living/carbon/human/H in orange(world.view, target)) + var/image/I + if(override_icon && override_icon_state) + I = image(override_icon, H, override_icon_state) + else + I = get_image(H) + I.override = TRUE + add_icon(I) + +/** + * Returns the image to use as override to the target's appearance. + */ +/obj/effect/hallucination/delusion/proc/get_image(mob/living/carbon/human/H) + return image('icons/mob/animal.dmi', H, pick("bear", "brownbear", "corgi", "cow", "deer", "goat", "goose", "pig", "blank-body")) diff --git a/code/modules/hallucinations/hallucinations.dm b/code/modules/hallucinations/hallucinations.dm new file mode 100644 index 00000000000..6545d8bdc1f --- /dev/null +++ b/code/modules/hallucinations/hallucinations.dm @@ -0,0 +1,198 @@ +#define HALLUCINATE_COOLDOWN_MIN 20 SECONDS +#define HALLUCINATE_COOLDOWN_MAX 50 SECONDS +/// This is multiplied with [/mob/var/hallucination] to determine the final cooldown. A higher hallucination value means shorter cooldown. +#define HALLUCINATE_COOLDOWN_FACTOR 0.03 +/// Percentage defining the chance at which an hallucination may spawn past the cooldown. +#define HALLUCINATE_CHANCE 80 +// Severity weights, should sum up to 100! +#define HALLUCINATE_MINOR_WEIGHT 60 +#define HALLUCINATE_MODERATE_WEIGHT 30 +#define HALLUCINATE_MAJOR_WEIGHT 10 + +GLOBAL_LIST_INIT(hallucinations, list( + HALLUCINATE_MINOR = list( + /obj/effect/hallucination/bolts = 10, + /obj/effect/hallucination/fake_danger = 10, + /obj/effect/hallucination/fake_health = 15, + /obj/effect/hallucination/speech = 15, + /obj/effect/hallucination/audio = 25, + /obj/effect/hallucination/audio/localized = 25, + ), + HALLUCINATE_MODERATE = list( + /obj/effect/hallucination/delusion = 5, + /obj/effect/hallucination/self_delusion = 5, + /obj/effect/hallucination/bolts/moderate = 10, + /obj/effect/hallucination/chasms = 10, + /obj/effect/hallucination/fake_alert = 10, + /obj/effect/hallucination/gunfire = 10, + /obj/effect/hallucination/plasma_flood = 10, + /obj/effect/hallucination/stunprodding = 10, + /obj/effect/hallucination/delamination_alarm = 15, + /obj/effect/hallucination/fake_item = 15, + /obj/effect/hallucination/fake_weapon = 15, + /obj/effect/hallucination/husks = 15, + ), + HALLUCINATE_MAJOR = list( + /obj/effect/hallucination/abduction = 10, + /obj/effect/hallucination/assault = 10, + /obj/effect/hallucination/terror_infestation = 10, + /obj/effect/hallucination/loose_energy_ball = 10, + ) +)) + +/** + * Called as part of [/mob/living/proc/handle_status_effects] to handle hallucinations. + */ +/mob/living/carbon/proc/handle_hallucinations() + if(!hallucination || next_hallucination > world.time) + return + + next_hallucination = world.time + rand(HALLUCINATE_COOLDOWN_MIN, HALLUCINATE_COOLDOWN_MAX) / (hallucination * HALLUCINATE_COOLDOWN_FACTOR) + if(!prob(HALLUCINATE_CHANCE)) + return + + // Pick a severity + var/severity = HALLUCINATE_MINOR + switch(rand(100)) + if(0 to HALLUCINATE_MINOR_WEIGHT) + severity = HALLUCINATE_MINOR + if((HALLUCINATE_MINOR_WEIGHT + 1) to HALLUCINATE_MODERATE_WEIGHT) + severity = HALLUCINATE_MODERATE + if((HALLUCINATE_MINOR_WEIGHT + HALLUCINATE_MODERATE_WEIGHT + 1) to 100) + severity = HALLUCINATE_MAJOR + + hallucinate(pickweight(GLOB.hallucinations[severity])) + +/** + * Spawns an hallucination for the mob. + * + * Arguments: + * * H - The type path of the hallucination to spawn. + */ +/mob/living/carbon/proc/hallucinate(obj/effect/hallucination/H) + ASSERT(ispath(H)) + if(ckey) + add_attack_logs(null, src, "Received hallucination [H]", ATKLOG_ALL) + return new H(get_turf(src), src) + +/** + * # Hallucination + * + * Base object for hallucinations. Contains basic behaviour to display an icon only to the target. + */ +/obj/effect/hallucination + density = FALSE + invisibility = INVISIBILITY_OBSERVER + /// Duration in deciseconds. Can also be a list with the form [lower bound, upper bound] for a random duration. + var/duration = 15 SECONDS + /// Hallucination icon. + var/hallucination_icon + /// Hallucination icon state. + var/hallucination_icon_state + /// Hallucination override. + var/hallucination_override = FALSE + /// Hallucination layer. + var/hallucination_layer = MOB_LAYER + /// The mob that sees this hallucination. + var/mob/living/carbon/target = null + /// Lazy list of images created as part of the hallucination. Cleared on destruction. + var/list/image/images = null + +/obj/effect/hallucination/Initialize(mapload, mob/living/carbon/target) + . = ..() + src.target = target + if(hallucination_icon && hallucination_icon_state) + var/image/I = image(hallucination_icon, hallucination_override ? src : get_turf(src), hallucination_icon_state) + I.override = hallucination_override + I.layer = hallucination_layer + add_icon(I) + // Lifetime + if(islist(duration)) + duration = rand(duration[1], duration[2]) + QDEL_IN(src, duration) + +/obj/effect/hallucination/Destroy() + clear_icons() + return ..() + +/obj/effect/hallucination/examine(mob/user, infix, suffix) + if(user != target) + return list() + + // Overriding to not include call to [/proc/bicon] as it lags the client due to invalid image. + . = list( + "That's \a [name].", + "Something seems odd about this..." + ) + +/obj/effect/hallucination/singularity_pull() + return + +/obj/effect/hallucination/singularity_act() + return + +/** + * Adds an image to the hallucination. Cleared on destruction. + * + * Arguments: + * * I - The image to add. + */ +/obj/effect/hallucination/proc/add_icon(image/I) + LAZYADD(images, I) + target?.client?.images |= I + +/** + * Clears an image from the hallucination. + * + * Arguments: + * * I - The image to clear. + */ +/obj/effect/hallucination/proc/clear_icon(image/I) + LAZYREMOVE(images, I) + target?.client?.images -= I + qdel(I) + +/** + * Clears an image from the hallucination after a delay. + * + * Arguments: + * * I - The image to clear. + * * delay - Delay in deciseconds. + */ +/obj/effect/hallucination/proc/clear_icon_in(image/I, delay) + addtimer(CALLBACK(src, .proc/clear_icon, I), delay) + +/** + * Clears all images from the hallucination. + */ +/obj/effect/hallucination/proc/clear_icons() + if(!images) + return + target?.client?.images -= images + QDEL_LIST(images) + +/** + * Plays a sound to the target only. + * + * Arguments: + * * time - Deciseconds before the sound plays. + * * source - The turf to play the sound from. Optional. + * * snd - The sound file to play. + * * volume - The sound volume. + * * vary - Whether to randomize the sound's pitch. + * * frequency - The sound's pitch. + */ +/obj/effect/hallucination/proc/play_sound_in(time, turf/source = null, snd, volume, vary, frequency) + ASSERT(time >= 0) + if(time == 0) // whatever + target?.playsound_local(source, snd, volume, vary, frequency) + return + addtimer(CALLBACK(target, /mob/.proc/playsound_local, source, snd, volume, vary, frequency), time) + +#undef HALLUCINATE_COOLDOWN_MIN +#undef HALLUCINATE_COOLDOWN_MAX +#undef HALLUCINATE_COOLDOWN_FACTOR +#undef HALLUCINATE_CHANCE +#undef HALLUCINATE_MINOR_WEIGHT +#undef HALLUCINATE_MODERATE_WEIGHT +#undef HALLUCINATE_MAJOR_WEIGHT diff --git a/code/modules/mining/equipment/explorer_gear.dm b/code/modules/mining/equipment/explorer_gear.dm index 84bf8f1fc0d..8315d0ef781 100644 --- a/code/modules/mining/equipment/explorer_gear.dm +++ b/code/modules/mining/equipment/explorer_gear.dm @@ -68,7 +68,6 @@ var/mob/living/carbon/C = loc if(istype(C) && prob(2)) //cursed by bubblegum if(prob(15)) - new /obj/effect/hallucination/oh_yeah(get_turf(C), C) to_chat(C, "[pick("I AM IMMORTAL.","I SHALL TAKE BACK WHAT'S MINE.","I SEE YOU.","YOU CANNOT ESCAPE ME FOREVER.","DEATH CANNOT HOLD ME.")]") else to_chat(C, "[pick("You hear faint whispers.","You smell ash.","You feel hot.","You hear a roar in the distance.")]") diff --git a/code/modules/mining/equipment/wormhole_jaunter.dm b/code/modules/mining/equipment/wormhole_jaunter.dm index 98c5669fd72..dc2d9273a95 100644 --- a/code/modules/mining/equipment/wormhole_jaunter.dm +++ b/code/modules/mining/equipment/wormhole_jaunter.dm @@ -89,3 +89,87 @@ if(ishuman(L)) shake_camera(L, 20, 1) addtimer(CALLBACK(L, /mob/living/carbon.proc/vomit), 20) + +/obj/item/wormhole_jaunter/contractor + name = "emergency extraction flare" + icon = 'icons/obj/lighting.dmi' + desc = "A single-use extraction flare that will let you create a portal to any beacon on the station. You must choose the destination beforehand, else it will target a random beacon. The portal is generated 5 seconds after activation, and has 1 use." + icon_state = "flare-contractor" + item_state = "flare" + var/destination + +/obj/item/wormhole_jaunter/contractor/verb/set_destination() + set category = "Object" + set name = "Change Portal Destination" + set src in usr + + var/list/L = list() + var/list/areaindex = list() + + for(var/obj/item/radio/beacon/R in GLOB.beacons) + var/turf/T = get_turf(R) + if(!T) + continue + if(!is_teleport_allowed(T.z)) + continue + var/tmpname = T.loc.name + if(areaindex[tmpname]) + tmpname = "[tmpname] ([++areaindex[tmpname]])" + else + areaindex[tmpname] = 1 + L[tmpname] = R + + var/desc = input("Please select a location to target.", "Flare Target Interface") in L + destination = L[desc] + return + +/obj/item/wormhole_jaunter/contractor/attack_self(mob/user) // message is later down + activate(user, TRUE) + +/obj/item/wormhole_jaunter/contractor/activate(mob/user) + if(!turf_check(user)) + return + if(!destination) + var/list/L = get_destinations(user) + if(!length(L)) + to_chat(user, "[src] found no beacons in the sector to target.") + return + destination = pick(L) + var/obj/effect/temp_visual/getaway_flare/F = new(get_turf(src)) + user.visible_message("[user] pulls out a black and gold flare and lights it.",\ + "You light an emergency extraction flare, initiating the extraction process.") + user.drop_item() + forceMove(F) + addtimer(CALLBACK(src, .proc/create_portal, destination), 5 SECONDS) + +/obj/item/wormhole_jaunter/contractor/proc/create_portal(turf/destination) + new /obj/effect/decal/cleanable/ash(get_turf(src)) + new /obj/effect/portal/redspace/getaway(get_turf(src), get_turf(destination), src, 100) + qdel(src) + +/obj/item/wormhole_jaunter/contractor/emag_act(mob/user) + to_chat(user, "Emagging [src] has no effect.") + +/obj/item/wormhole_jaunter/contractor/chasm_react(mob/user) + return //This is not an instant getaway portal like the jaunter + +/obj/item/storage/box/syndie_kit/escape_flare + name = "emergency extraction kit" + +/obj/item/storage/box/syndie_kit/escape_flare/populate_contents() + new /obj/item/wormhole_jaunter/contractor(src) + new /obj/item/radio/beacon/emagged(src) + +/obj/effect/portal/redspace/getaway + one_use = TRUE + +/obj/effect/temp_visual/getaway_flare // Because the original contractor flare is not a temp visual, for some reason. + name = "contractor extraction flare" + icon = 'icons/obj/lighting.dmi' + icon_state = "flare-contractor-on" + duration = 5.1 SECONDS // Needs to be slightly longer then the callback to make the portal + +/obj/effect/temp_visual/getaway_flare/Initialize() + . = ..() + playsound(loc, 'sound/goonstation/misc/matchstick_light.ogg', 50, TRUE) + set_light(8, l_color = "#FFD165") diff --git a/code/modules/mining/lavaland/loot/tendril_loot.dm b/code/modules/mining/lavaland/loot/tendril_loot.dm index 2c05393b5a8..642745d78c2 100644 --- a/code/modules/mining/lavaland/loot/tendril_loot.dm +++ b/code/modules/mining/lavaland/loot/tendril_loot.dm @@ -381,7 +381,6 @@ damage_type = BRUTE hitsound = 'sound/effects/splat.ogg' weaken = 3 - var/chain /obj/item/projectile/hook/fire(setAngle) if(firer) diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index ec7da3c75bc..f8ac106a9e8 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -12,7 +12,7 @@ desc = "It's watching you suspiciously." /obj/structure/closet/crate/necropolis/tendril/populate_contents() - var/loot = rand(1, 27) + var/loot = rand(1, 26) switch(loot) if(1) new /obj/item/shared_storage/red(src) @@ -44,38 +44,36 @@ if(12) new /obj/item/clothing/suit/space/hardsuit/ert/paranormal/berserker(src) if(13) - new /obj/item/jacobs_ladder(src) - if(14) new /obj/item/nullrod/scythe/talking(src) - if(15) + if(14) new /obj/item/nullrod/armblade/mining(src) - if(16) + if(15) new /obj/item/guardiancreator(src) - if(17) + if(16) if(prob(50)) new /obj/item/disk/design_disk/modkit_disc/mob_and_turf_aoe(src) else new /obj/item/disk/design_disk/modkit_disc/bounty(src) - if(18) + if(17) new /obj/item/warp_cube/red(src) - if(19) + if(18) new /obj/item/wisp_lantern(src) - if(20) + if(19) new /obj/item/immortality_talisman(src) - if(21) + if(20) new /obj/item/gun/magic/hook(src) - if(22) + if(21) new /obj/item/voodoo(src) - if(23) + if(22) new /obj/item/grenade/clusterbuster/inferno(src) - if(24) + if(23) new /obj/item/reagent_containers/food/drinks/bottle/holywater/hell(src) new /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor(src) - if(25) + if(24) new /obj/item/spellbook/oneuse/summonitem(src) - if(26) + if(25) new /obj/item/book_of_babel(src) - if(27) + if(26) new /obj/item/borg/upgrade/modkit/lifesteal(src) new /obj/item/bedsheet/cult(src) diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index 56a8b0764ee..d415bdcb5a5 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -18,8 +18,6 @@ ..() pixel_x = rand(0, 16) - 8 pixel_y = rand(0, 8) - 8 - if(is_mining_level(z)) - GLOB.score_oremined++ //When ore spawns, increment score. Only include ore spawned on mining level (No Clown Planet) /obj/item/stack/ore/welder_act(mob/user, obj/item/I) . = TRUE diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index e6dcc9ec68a..18b5c89b639 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -27,7 +27,8 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) var/ghostvision = TRUE //is the ghost able to see things humans can't? var/seedarkness = TRUE var/seerads = FALSE // can the ghost see radiation? - var/data_hud_seen = FALSE //this should one of the defines in __DEFINES/hud.dm + /// Defines from __DEFINES/hud.dm go here based on which huds the ghost has activated. + var/list/data_hud_seen = list() var/ghost_orbit = GHOST_ORBIT_CIRCLE var/health_scan = FALSE //does the ghost have health scanner mode on? by default it should be off var/datum/orbit_menu/orbit_menu @@ -87,7 +88,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) real_name = name //starts ghosts off with all HUDs. - toggle_medHUD() + toggle_all_huds_on() ..() /mob/dead/observer/Destroy() @@ -169,8 +170,6 @@ Works together with spawning an observer, noted above. else GLOB.non_respawnable_keys[ckey] = 1 ghost.key = key - if(!(ghost.client && ghost.client.holder) && !config.antag_hud_allowed) // For new ghosts we remove the verb from even showing up if it's not allowed. - ghost.verbs -= /mob/dead/observer/verb/toggle_antagHUD // Poor guys, don't know what they are missing! return ghost /* @@ -317,82 +316,24 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp /mob/dead/observer/proc/show_me_the_hud(hud_index) var/datum/atom_hud/H = GLOB.huds[hud_index] H.add_hud_to(src) + data_hud_seen |= hud_index /mob/dead/observer/proc/remove_the_hud(hud_index) //remove old huds var/datum/atom_hud/H = GLOB.huds[hud_index] H.remove_hud_from(src) + data_hud_seen -= hud_index -/mob/dead/observer/verb/toggle_medHUD() +/mob/dead/observer/verb/open_hud_panel() set category = "Ghost" - set name = "Toggle All/Sec/Med/Diag HUDs" - set desc = "Toggles the HUDs." + set name = "Ghost HUD Panel" if(!client) return + GLOB.ghost_hud_panel.ui_interact(src) - switch(data_hud_seen) //give new huds - if(FALSE) - data_hud_seen = DATA_HUD_DIAGNOSTIC + DATA_HUD_SECURITY_ADVANCED + DATA_HUD_MEDICAL_ADVANCED - show_me_the_hud(DATA_HUD_DIAGNOSTIC) - show_me_the_hud(DATA_HUD_SECURITY_ADVANCED) - show_me_the_hud(DATA_HUD_MEDICAL_ADVANCED) - to_chat(src, "All HUDs enabled.") - if(DATA_HUD_DIAGNOSTIC + DATA_HUD_SECURITY_ADVANCED + DATA_HUD_MEDICAL_ADVANCED) - data_hud_seen = DATA_HUD_SECURITY_ADVANCED - remove_the_hud(DATA_HUD_DIAGNOSTIC) - remove_the_hud(DATA_HUD_MEDICAL_ADVANCED) - to_chat(src, "Security HUD set.") - if(DATA_HUD_SECURITY_ADVANCED) - data_hud_seen = DATA_HUD_MEDICAL_ADVANCED - remove_the_hud(DATA_HUD_SECURITY_ADVANCED) - show_me_the_hud(DATA_HUD_MEDICAL_ADVANCED) - to_chat(src, "Medical HUD set.") - if(DATA_HUD_MEDICAL_ADVANCED) - data_hud_seen = DATA_HUD_DIAGNOSTIC - remove_the_hud(DATA_HUD_MEDICAL_ADVANCED) - show_me_the_hud(DATA_HUD_DIAGNOSTIC) - to_chat(src, "Diagnostic HUD set.") - else - data_hud_seen = FALSE - remove_the_hud(DATA_HUD_MEDICAL_ADVANCED) - to_chat(src, "HUDs disabled.") - - -/mob/dead/observer/verb/toggle_antagHUD() - set category = "Ghost" - set name = "Toggle AntagHUD" - set desc = "Toggles AntagHUD allowing you to see who is the antagonist" - if(!config.antag_hud_allowed && !client.holder) - to_chat(src, "Admins have disabled this for this round.") - return - if(!client) - return - var/mob/dead/observer/M = src - if(jobban_isbanned(M, "AntagHUD")) - to_chat(src, "You have been banned from using this feature") - return - if(config.antag_hud_restricted && !M.has_enabled_antagHUD && !check_rights(R_ADMIN|R_MOD,0)) - var/response = alert(src, "If you turn this on, you will not be able to take any part in the round.","Are you sure you want to turn this feature on?","Yes","No") - if(response == "No") return - M.can_reenter_corpse = 0 - if(M in GLOB.respawnable_list) - GLOB.respawnable_list -= M - if(!M.has_enabled_antagHUD && !check_rights(R_ADMIN|R_MOD,0)) - M.has_enabled_antagHUD = 1 - - //var/datum/atom_hud/A = huds[DATA_HUD_SECURITY_ADVANCED] - //var/adding_hud = (usr in A.hudusers) ? 0 : 1 - - for(var/datum/atom_hud/antag/H in (GLOB.huds)) - if(!M.antagHUD) - H.add_hud_to(usr) - else - H.remove_hud_from(usr) - if(!M.antagHUD) - to_chat(usr, "AntagHud Toggled ON") - M.antagHUD = TRUE - else - to_chat(usr, "AntagHud Toggled OFF") - M.antagHUD = FALSE +/mob/dead/observer/proc/toggle_all_huds_on() + show_me_the_hud(DATA_HUD_DIAGNOSTIC) + show_me_the_hud(DATA_HUD_SECURITY_ADVANCED) + show_me_the_hud(DATA_HUD_MEDICAL_ADVANCED) /mob/dead/observer/verb/toggle_rad_view() set category = "Ghost" @@ -431,6 +372,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp var/choice = alert(src, "If you enable this, your body will be unrevivable for the remainder of the round.", "Are you sure?", "Yes", "No") if(choice == "Yes") to_chat(src, "Do Not Revive state enabled.") + create_log(MISC_LOG, "DNR Enabled") can_reenter_corpse = FALSE if(!QDELETED(mind.current)) // Could change while they're choosing mind.current.med_hud_set_status() diff --git a/code/modules/mob/living/carbon/brain/robotic_brain.dm b/code/modules/mob/living/carbon/brain/robotic_brain.dm index e7c3528ae27..9fdaa57ec23 100644 --- a/code/modules/mob/living/carbon/brain/robotic_brain.dm +++ b/code/modules/mob/living/carbon/brain/robotic_brain.dm @@ -64,7 +64,7 @@ /obj/item/mmi/robotic_brain/proc/check_observer(mob/dead/observer/O) if(cannotPossess(O)) return FALSE - if(jobban_isbanned(O, "Cyborg") || jobban_isbanned(O,"nonhumandept")) + if(jobban_isbanned(O, "Cyborg") || jobban_isbanned(O, "nonhumandept")) return FALSE if(!O.can_reenter_corpse) return FALSE @@ -160,7 +160,7 @@ if(cannotPossess(O)) to_chat(O, "Upon using the antagHUD you forfeited the ability to join the round.") return - if(jobban_isbanned(O, "Cyborg") || jobban_isbanned(O,"nonhumandept")) + if(jobban_isbanned(O, "Cyborg") || jobban_isbanned(O, "nonhumandept")) to_chat(O, "You are job banned from this role.") return to_chat(O, "You've been added to the list of ghosts that may become this [src]. Click again to unvolunteer.") diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index b0b2769032e..9815d9573f9 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -1042,7 +1042,7 @@ GLOBAL_LIST_INIT(ventcrawl_machinery, list(/obj/machinery/atmospherics/unary/ven if(!forceFed(toEat, user, fullness)) return 0 consume(toEat, bitesize_override, can_taste_container = toEat.can_taste) - GLOB.score_foodeaten++ + SSticker.score.score_food_eaten++ return 1 /mob/living/carbon/proc/selfFeed(obj/item/reagent_containers/food/toEat, fullness) diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 667fd86204e..39f00c076b4 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -27,4 +27,7 @@ var/dreaming = 0 //How many dream images we have left to send var/nightmare = 0 + /// The world.time after which the mob can hallucinate again. + var/next_hallucination = 0 + blood_volume = BLOOD_VOLUME_NORMAL diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 059fd4a4c2a..cc85d785a86 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -332,9 +332,6 @@ else if(!client) msg += "[p_they(TRUE)] [p_have()] suddenly fallen asleep, suffering from Space Sleep Disorder. [p_they(TRUE)] may wake up soon.\n" - if(digitalcamo) - msg += "[p_they(TRUE)] [p_are()] moving [p_their()] body in an unnatural and blatantly inhuman manner.\n" - if(!(skipface || ( wear_mask && ( wear_mask.flags_inv & HIDEFACE || wear_mask.flags_cover & MASKCOVERSMOUTH) ) ) && is_thrall(src) && in_range(user,src)) msg += "Their features seem unnaturally tight and drawn.\n" @@ -436,7 +433,7 @@ else if(isobserver(M)) var/mob/dead/observer/O = M - if(O.data_hud_seen == DATA_HUD_SECURITY_ADVANCED || O.data_hud_seen == DATA_HUD_DIAGNOSTIC + DATA_HUD_SECURITY_ADVANCED + DATA_HUD_MEDICAL_ADVANCED) + if(DATA_HUD_SECURITY_ADVANCED in O.data_hud_seen) return (hudtype in list(EXAMINE_HUD_SECURITY_READ, EXAMINE_HUD_SKILLS)) return FALSE diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index dd1f1cab01f..ee5b3b561fd 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1163,6 +1163,10 @@ set src in view(1) var/self = 0 + if (!ishuman(src)) + to_chat(usr, "You do not know how to check someone's pulse!") + return + if(usr.stat == 1 || usr.restrained() || !isliving(usr) || usr.is_dead()) return if(usr == src) @@ -1192,8 +1196,10 @@ /mob/living/carbon/human/proc/change_dna(datum/dna/new_dna, include_species_change = FALSE, keep_flavor_text = FALSE) if(include_species_change) - set_species(new_dna.species.type, retain_damage = TRUE) + set_species(new_dna.species.type, retain_damage = TRUE, transformation = TRUE) dna = new_dna.Clone() + if (include_species_change) //We have to call this after new_dna.Clone() so that species actions don't get overwritten + dna.species.on_species_gain(src) real_name = new_dna.real_name domutcheck(src, MUTCHK_FORCED) //Ensures species that get powers by the species proc handle_dna keep them if(!keep_flavor_text) @@ -1205,7 +1211,7 @@ sec_hud_set_ID() -/mob/living/carbon/human/proc/set_species(datum/species/new_species, default_colour, delay_icon_update = FALSE, skip_same_check = FALSE, retain_damage = FALSE) +/mob/living/carbon/human/proc/set_species(datum/species/new_species, default_colour, delay_icon_update = FALSE, skip_same_check = FALSE, retain_damage = FALSE, transformation = FALSE) if(!skip_same_check) if(dna.species.name == initial(new_species.name)) return @@ -1362,7 +1368,8 @@ dna.real_name = real_name - dna.species.on_species_gain(src) + if (!transformation) //Distinguish between creating a mob and switching species + dna.species.on_species_gain(src) update_sight() @@ -1737,7 +1744,7 @@ Eyes need to have significantly high darksight to shine unless the mob has the X if(G.trigger_guard == TRIGGER_GUARD_NORMAL) if(HAS_TRAIT(src, TRAIT_CHUNKYFINGERS)) - to_chat(src, "Your meaty finger is much too large for the trigger guard!") + to_chat(src, "Your meaty finger is far too large for the trigger guard!") return FALSE if(mind && mind.martial_art && mind.martial_art.no_guns) //great dishonor to famiry diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 05fc209739e..6b1659c2b6f 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -746,12 +746,12 @@ if(healths) var/health_amount = get_perceived_trauma() if(..(health_amount)) //not dead - switch(hal_screwyhud) - if(SCREWYHUD_CRIT) + switch(health_hud_override) + if(HEALTH_HUD_OVERRIDE_CRIT) healths.icon_state = "health6" - if(SCREWYHUD_DEAD) + if(HEALTH_HUD_OVERRIDE_DEAD) healths.icon_state = "health7" - if(SCREWYHUD_HEALTHY) + if(HEALTH_HUD_OVERRIDE_HEALTHY) healths.icon_state = "health0" if(healthdoll) diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 45f75bf9f07..794d9aa881b 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -315,8 +315,7 @@ AdjustJitter(-restingpwr) if(hallucination) - spawn handle_hallucinations() - + handle_hallucinations() AdjustHallucinate(-2) // Keep SSD people asleep @@ -347,7 +346,7 @@ if(comfort > 1 && prob(3))//You don't heal if you're just sleeping on the floor without a blanket. adjustBruteLoss(-1 * comfort, FALSE) adjustFireLoss(-1 * comfort) - if(prob(10) && health && hal_screwyhud != SCREWYHUD_CRIT) + if(prob(10) && health && health_hud_override != HEALTH_HUD_OVERRIDE_CRIT) emote("snore") return sleeping diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm index 16f17e90432..2a233bd96d6 100644 --- a/code/modules/mob/living/silicon/ai/freelook/eye.dm +++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm @@ -16,6 +16,8 @@ var/relay_speech = FALSE var/use_static = TRUE var/static_visibility_range = 16 + // Decides if it is shown by AI Detector or not + var/ai_detector_visible = TRUE // Use this when setting the aiEye's location. diff --git a/code/modules/mob/living/silicon/pai/recruit.dm b/code/modules/mob/living/silicon/pai/recruit.dm index 1966c535022..02de57df689 100644 --- a/code/modules/mob/living/silicon/pai/recruit.dm +++ b/code/modules/mob/living/silicon/pai/recruit.dm @@ -368,7 +368,7 @@ GLOBAL_DATUM_INIT(paiController, /datum/paiController, new) // Global handler fo //question(O.client) /datum/paiController/proc/check_recruit(mob/dead/observer/O) - if(jobban_isbanned(O, ROLE_PAI) || jobban_isbanned(O,"nonhumandept")) + if(jobban_isbanned(O, ROLE_PAI) || jobban_isbanned(O, "nonhumandept")) return 0 if(!player_old_enough_antag(O.client,ROLE_PAI)) return 0 diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 2f35fb7cf9c..8bcd14a8d9e 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -1201,12 +1201,13 @@ GLOBAL_LIST_INIT(robot_verbs_default, list( var/floor_only = TRUE for(var/A in tile) if(istype(A, /obj/effect)) - if(is_cleanable(A)) - var/obj/effect/decal/cleanable/blood/B = A + var/obj/effect/E = A + if(E.is_cleanable()) + var/obj/effect/decal/cleanable/blood/B = E if(istype(B) && B.off_floor) floor_only = FALSE else - qdel(A) + qdel(E) else if(istype(A, /obj/item)) var/obj/item/cleaned_item = A cleaned_item.clean_blood() diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 9e944853a0f..4cda181ee4f 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -551,7 +551,7 @@ /obj/item/robot_module/miner/handle_custom_removal(component_id, mob/living/user, obj/item/W) if(component_id == "KA modkits") for(var/obj/item/gun/energy/kinetic_accelerator/cyborg/D in src) - D.attackby(W, user) + D.crowbar_act(user, W) return TRUE return ..() diff --git a/code/modules/mob/living/simple_animal/corpse.dm b/code/modules/mob/living/simple_animal/corpse.dm index 83d3e9da513..02397215e9a 100644 --- a/code/modules/mob/living/simple_animal/corpse.dm +++ b/code/modules/mob/living/simple_animal/corpse.dm @@ -9,7 +9,7 @@ outfit = /datum/outfit/syndicatesoldiercorpse /datum/outfit/syndicatesoldiercorpse - name = "Syndicate Operative Corpse" + name = "Corpse of a Syndicate Operative" uniform = /obj/item/clothing/under/syndicate suit = /obj/item/clothing/suit/armor/vest shoes = /obj/item/clothing/shoes/combat @@ -31,7 +31,7 @@ outfit = /datum/outfit/syndicatecommandocorpse /datum/outfit/syndicatecommandocorpse - name = "Syndicate Commando Corpse" + name = "Corpse of a Syndicate Commando" uniform = /obj/item/clothing/under/syndicate suit = /obj/item/clothing/suit/space/hardsuit/syndi shoes = /obj/item/clothing/shoes/combat @@ -59,7 +59,7 @@ outfit = /datum/outfit/piratecorpse /datum/outfit/piratecorpse - name = "Pirate Corpse" + name = "Corpse of a Pirate" uniform = /obj/item/clothing/under/pirate shoes = /obj/item/clothing/shoes/jackboots glasses = /obj/item/clothing/glasses/eyepatch @@ -72,7 +72,7 @@ outfit = /datum/outfit/piratecorpse/ranged /datum/outfit/piratecorpse/ranged - name = "Pirate Gunner Corpse" + name = "Corpse of a Pirate Gunner" suit = /obj/item/clothing/suit/pirate_black head = /obj/item/clothing/head/pirate @@ -85,7 +85,7 @@ outfit = /datum/outfit/russiancorpse /datum/outfit/russiancorpse - name = "Russian Corpse" + name = "Corpse of a Russian" uniform = /obj/item/clothing/under/soviet shoes = /obj/item/clothing/shoes/jackboots head = /obj/item/clothing/head/bearpelt @@ -95,12 +95,12 @@ outfit = /datum/outfit/russiancorpse/ranged /datum/outfit/russiancorpse/ranged - name = "Ranged Russian Corpse" + name = "Corpse of a Ranged Russian" head = /obj/item/clothing/head/ushanka /obj/effect/mob_spawn/human/corpse/wizard - name = "Space Wizard Corpse" + name = "Corpse of a Space Wizard" outfit = /datum/outfit/wizardcorpse /obj/effect/mob_spawn/human/corpse/clownoff/Initialize(mapload) @@ -108,7 +108,7 @@ . = ..() /datum/outfit/wizardcorpse - name = "Space Wizard Corpse" + name = "Corpse of a Space Wizard" uniform = /obj/item/clothing/under/color/lightpurple suit = /obj/item/clothing/suit/wizrobe shoes = /obj/item/clothing/shoes/sandal diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index dd0316f4177..6324e8bb7a6 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -189,7 +189,7 @@ Difficulty: Very Hard var/turf/target_turf = get_turf(target) playsound(src, 'sound/magic/clockwork/invoke_general.ogg', 200, TRUE, 2) newtonian_move(get_dir(target_turf, src)) - var/angle_to_target = Get_Angle(src, target_turf) + var/angle_to_target = get_angle(src, target_turf) if(isnum(set_angle)) angle_to_target = set_angle var/static/list/colossus_shotgun_shot_angles = list(12.5, 7.5, 2.5, -2.5, -7.5, -12.5) diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/empress.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/empress.dm index eb449c44417..ecfa1332630 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/empress.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/empress.dm @@ -24,7 +24,6 @@ projectiletype = /obj/item/projectile/terrorqueenspit/empress icon = 'icons/mob/terrorspider64.dmi' pixel_x = -16 - move_resist = MOVE_FORCE_STRONG // no more pushing a several hundred if not thousand pound spider mob_size = MOB_SIZE_LARGE icon_state = "terror_empress" icon_living = "terror_empress" diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm index 685b508c291..74c829200f8 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm @@ -28,8 +28,8 @@ error_on_humanize = "Dead spiders are not player-controllable." else if(!(user in GLOB.respawnable_list)) error_on_humanize = "You are not able to rejoin the round." - if(jobban_isbanned(user, "Syndicate") || jobban_isbanned(user, "alien")) - to_chat(user,"You are jobbanned from role of syndicate and/or alien lifeform.") + if(jobban_isbanned(user, ROLE_SYNDICATE) || jobban_isbanned(user, ROLE_TSPIDER)) + to_chat(user, "You are jobbanned from role of syndicate and/or terror spider.") return if(error_on_humanize == "") var/spider_ask = alert(humanize_prompt, "Join as Terror Spider?", "Yes", "No") diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm index a7b99aafc67..7b900d8a881 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm @@ -30,7 +30,6 @@ web_type = /obj/structure/spider/terrorweb/purple ai_spins_webs = FALSE gender = MALE - move_resist = MOVE_FORCE_STRONG // no more pushing a several hundred if not thousand pound spider /mob/living/simple_animal/hostile/poison/terror_spider/prince/death(gibbed) if(can_die() && !hasdied && spider_uo71) diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/princess.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/princess.dm index 3e7e5c5194e..787d89b722f 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/princess.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/princess.dm @@ -19,7 +19,6 @@ maxHealth = 150 health = 150 spider_tier = TS_TIER_3 - move_resist = MOVE_FORCE_STRONG // no more pushing a several hundred if not thousand pound spider // Unlike queens, no ranged attack. ranged = 0 diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/purple.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/purple.dm index 63541db1e9b..eb55ff2a9b3 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/purple.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/purple.dm @@ -25,7 +25,6 @@ speed = 0 // '0' (also the default for human mobs) converts to 2.5 total delay, or 4 tiles/sec. spider_opens_doors = 2 ventcrawler = 0 - move_resist = MOVE_FORCE_STRONG // no more pushing a several hundred if not thousand pound spider ai_ventcrawls = FALSE environment_smash = ENVIRONMENT_SMASH_RWALLS idle_ventcrawl_chance = 0 // stick to the queen! diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/queen.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/queen.dm index 06db565cad4..cd87f2dd577 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/queen.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/queen.dm @@ -26,7 +26,6 @@ ai_spins_webs = FALSE ai_ventcrawls = FALSE idle_ventcrawl_chance = 0 - move_resist = MOVE_FORCE_STRONG // no more pushing a several hundred if not thousand pound spider force_threshold = 18 // outright immune to anything of force under 18, this means welders can't hurt it, only guns can ranged = 1 retreat_distance = 5 diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/red.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/red.dm index 1e92b5d65e5..a96486e473e 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/red.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/red.dm @@ -24,7 +24,6 @@ move_to_delay = 10 // at 20ticks/sec, this is 2 tile/sec movespeed speed = 2 // movement_delay() gives 4.5, or 0.45s between steps, which = about 2.2 tiles/second. Player is slightly faster than AI, but cannot move on diagonals. spider_opens_doors = 2 - move_resist = MOVE_FORCE_STRONG // no more pushing a several hundred if not thousand pound spider web_type = /obj/structure/spider/terrorweb/red var/enrage = 0 var/melee_damage_lower_rage0 = 15 diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm index 9f93bcab1ef..eed323d9ebe 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm @@ -40,6 +40,7 @@ GLOBAL_LIST_EMPTY(ts_spiderling_list) // Movement pass_flags = PASSTABLE + move_resist = MOVE_FORCE_STRONG // no more pushing a several hundred if not thousand pound spider turns_per_move = 3 // number of turns before AI-controlled spiders wander around. No effect on actual player or AI movement speed! move_to_delay = 6 // AI spider speed at chasing down targets. Higher numbers mean slower speed. Divide 20 (server tick rate / second) by this to get tiles/sec. diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index 4a649dfe7e0..002d3b9f41a 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -689,18 +689,25 @@ clean_speak = list( "Poly wanna cracker!", "Check the crystal, you chucklefucks!", - "Check the tesla, you shits!", "STOP HOT-WIRING THE ENGINE, FUCKING CHRIST!", "Wire the solars, you lazy bums!", "WHO TOOK THE DAMN HARDSUITS?", "OH GOD ITS ABOUT TO DELAMINATE CALL THE SHUTTLE", "Why are there so many atmos alerts?", - "OH GOD WHY WOULD YOU PUT CARBON-DIOXIDE IN THE SM?", + "OH GOD WHY WOULD YOU PUT PLASMA IN THE SM?", "Remember to lock the emitters!", "Stop goofing off and repair the goddam station!", "The supermatter is not your friend!", "What were the wires again?", - "Goddam emaggers!" + "Goddam emaggers!", + "Why is nobody watching the engine?", + "Maybe the SM would produce more power if we fed it some clowns.", + "Everyone else dusted when they touched the SM, but I am sure you will be different.", + "I asked the mime if they turned off the scrubbers, but they didn't say a word.", + "This engine setup meets all safety requirements.", + "Chief Engineers are the SM's natural diet.", + "Don't eat the forbidden nacho!", + "Is the engine meant to be making that noise?", ) unique_pet = TRUE gold_core_spawnable = NO_SPAWN @@ -708,6 +715,7 @@ /mob/living/simple_animal/parrot/Poly/New() ears = new /obj/item/radio/headset/headset_eng(src) available_channels = list(":e") + clean_speak += "Danger! Crystal hyperstructure integrity faltering! Integrity: [rand(75, 99)]%" // Has to be here cause of the `rand()`. ..() /mob/living/simple_animal/parrot/handle_message_mode(message_mode, list/message_pieces, verb, used_radios) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 547684c9c74..8b29f8df8f3 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -598,7 +598,7 @@ GLOBAL_LIST_INIT(slot_equipment_priority, list( \ if(next_move >= world.time) return - if(!isturf(loc) || istype(A, /obj/effect/temp_visual/point)) + if(!isturf(loc) || istype(A, /obj/effect/temp_visual/point) || istype(A, /obj/effect/hallucination)) return FALSE var/tile = get_turf(A) @@ -890,7 +890,8 @@ GLOBAL_LIST_INIT(slot_equipment_priority, list( \ if(href_list["flavor_change"]) update_flavor_text() - return + if(href_list["scoreboard"]) + usr << browse(GLOB.scoreboard, "window=roundstats;size=500x600") // The src mob is trying to strip an item from someone // Defined in living.dm @@ -1326,6 +1327,7 @@ GLOBAL_LIST_INIT(slot_equipment_priority, list( \ .["Toggle Build Mode"] = "?_src_=vars;build_mode=[UID()]" .["Make 2spooky"] = "?_src_=vars;make_skeleton=[UID()]" + .["Hallucinate"] = "?_src_=vars;hallucinate=[UID()]" .["Assume Direct Control"] = "?_src_=vars;direct_control=[UID()]" .["Offer Control to Ghosts"] = "?_src_=vars;offer_control=[UID()]" diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index cb39d6cc9c0..423908e689d 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -111,8 +111,8 @@ var/move_on_shuttle = 1 // Can move on the shuttle. - - var/has_enabled_antagHUD = 0 // Whether antagHUD was ever enabled. Not a true boolean - sometimes it is set to 2, because reasons. + /// Whether antagHUD has been enabled previously. + var/has_enabled_antagHUD = FALSE var/antagHUD = FALSE // Whether AntagHUD is active right now var/can_change_intents = 1 //all mobs can change intents by default. ///Override for sound_environments. If this is set the user will always hear a specific type of reverb (Instead of the area defined reverb) @@ -199,5 +199,7 @@ var/obj/effect/proc_holder/ranged_ability //Any ranged ability the mob has, as a click override + /// Overrides the health HUD element state if set. + var/health_hud_override = HEALTH_HUD_OVERRIDE_NONE /// The location our runechat message should appear. Should be src by default. var/atom/runechat_msg_location diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index e10a405a749..00d7336e380 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -79,7 +79,7 @@ /proc/cannotPossess(A) var/mob/dead/observer/G = A - if(G.has_enabled_antagHUD == 1 && config.antag_hud_restricted) + if(G.has_enabled_antagHUD && config.antag_hud_restricted) return 1 return 0 diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 003a3b819ca..27226bff98f 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -192,8 +192,6 @@ client.prefs.real_name = random_name(client.prefs.gender,client.prefs.species) observer.real_name = client.prefs.real_name observer.name = observer.real_name - if(!client.holder && !config.antag_hud_allowed) // For new ghosts we remove the verb from even showing up if it's not allowed. - observer.verbs -= /mob/dead/observer/verb/toggle_antagHUD // Poor guys, don't know what they are missing! observer.key = key QDEL_NULL(mind) GLOB.respawnable_list += observer diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index feb60d9ba67..fb08abb0977 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -299,7 +299,7 @@ if(ispath(MP, /mob/living/simple_animal/butterfly)) return 1 - if(ispath(MP, /mob/living/simple_animal/borer) && !jobban_isbanned(src, ROLE_BORER) && !jobban_isbanned(src, "Syndicate")) + if(ispath(MP, /mob/living/simple_animal/borer) && !jobban_isbanned(src, ROLE_BORER) && !jobban_isbanned(src, ROLE_SYNDICATE)) return 1 if(ispath(MP, /mob/living/simple_animal/diona) && !jobban_isbanned(src, ROLE_NYMPH)) diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index a0e7b47da13..25c83556882 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -137,7 +137,6 @@ */ /obj/item/pen/edagger origin_tech = "combat=3;syndicate=1" - attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") //these wont show up if the pen is off var/on = 0 var/brightness_on = 2 light_color = LIGHT_COLOR_RED @@ -149,6 +148,7 @@ sharp = 0 w_class = initial(w_class) name = initial(name) + attack_verb = list() hitsound = initial(hitsound) embed_chance = initial(embed_chance) throwforce = initial(throwforce) @@ -161,6 +161,7 @@ sharp = 1 w_class = WEIGHT_CLASS_NORMAL name = "energy dagger" + attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") hitsound = 'sound/weapons/blade1.ogg' embed_chance = 100 //rule of cool throwforce = 35 diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index ecca752ec9b..e3355adfe76 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -113,6 +113,7 @@ updateUsrDialog() else if(check_ass()) to_chat(ass, "You feel a slight pressure on your ass.") + atom_say("Attention: Unable to remove large object!") updateUsrDialog() else if(href_list["min"]) if(copies > 1) @@ -240,6 +241,7 @@ var/icon/temp_img if(!check_ass()) //You have to be sitting on the copier and either be a xeno or a human without clothes on. return + atom_say("Attention: Posterior Placed on Printing Plaque!") if(emagged) if(ishuman(ass)) var/mob/living/carbon/human/H = ass @@ -314,7 +316,6 @@ toner = 0 /obj/machinery/photocopier/MouseDrop_T(mob/target, mob/user) - check_ass() //Just to make sure that you can re-drag somebody onto it after they moved off. if(!istype(target) || target.buckled || get_dist(user, src) > 1 || get_dist(user, target) > 1 || user.stat || istype(user, /mob/living/silicon/ai) || target == ass) return src.add_fingerprint(user) @@ -332,7 +333,7 @@ copyitem = null updateUsrDialog() -/obj/machinery/photocopier/proc/check_ass() //I'm not sure wether I made this proc because it's good form or because of the name. +/obj/machinery/photocopier/proc/check_ass() //I'm not sure whether I made this proc because it's good form or because of the name. if(!ass) return 0 if(ass.loc != src.loc) @@ -341,7 +342,6 @@ return 0 else playsound(loc, 'sound/machines/ping.ogg', 50, 0) - atom_say("Attention: Posterior Placed on Printing Plaque!") return 1 /obj/machinery/photocopier/emag_act(user as mob) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index d192cb037eb..09d49a3330a 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -105,6 +105,8 @@ var/global/list/status_overlays_environ var/indestructible = 0 // If set, prevents aliens from destroying it var/keep_preset_name = 0 + /// Was this APC built instead of already existing? Used for malfhack to keep borgs from building apcs in space + var/constructed = FALSE var/report_power_alarm = TRUE @@ -171,14 +173,13 @@ operating = 0 name = "[area.name] APC" stat |= MAINT + constructed = TRUE update_icon() addtimer(CALLBACK(src, .proc/update), 5) /obj/machinery/power/apc/Destroy() SStgui.close_uis(wires) GLOB.apcs -= src - if(malfai && operating) - malfai.malf_picker.processing_time = clamp(malfai.malf_picker.processing_time - 10,0,1000) area.power_light = 0 area.power_equip = 0 area.power_environ = 0 @@ -973,6 +974,9 @@ if(malf.malfhacking) to_chat(malf, "You are already hacking an APC.") return + if(constructed) + to_chat(malf, "This APC was only recently constructed, and is not fully linked to station systems. Hacking it would be pointless.") + return to_chat(malf, "Beginning override of APC systems. This takes some time, and you cannot perform other actions during the process.") malf.malfhack = src malf.malfhacking = addtimer(CALLBACK(malf, /mob/living/silicon/ai/.proc/malfhacked, src), 600, TIMER_STOPPABLE) diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index ec1184d7837..38575891d07 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -354,3 +354,9 @@ desc = "A standard ninja-suit power cell." maxcharge = 10000 materials = list(MAT_GLASS = 60) + +/obj/item/stock_parts/cell/bsg + name = "\improper B.S.G power cell" + desc = "A high capacity, slow charging cell for the B.S.G." + maxcharge = 40000 + chargerate = 2600 // about 30 seconds to charge with a default recharger diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index e7aafa88fac..e275b747814 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -578,7 +578,7 @@ if(prot > 0 || HAS_TRAIT(user, TRAIT_RESISTHEAT) || HAS_TRAIT(user, TRAIT_RESISTHEATHANDS)) to_chat(user, "You remove the light [fitting]") - else if(user.dna?.GetSEState(GLOB.teleblock)) + else if(HAS_TRAIT(user, TRAIT_TELEKINESIS)) to_chat(user, "You telekinetically remove the light [fitting].") else if(user.a_intent == INTENT_DISARM || user.a_intent == INTENT_GRAB) diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index 8f707cc1e14..2a2e833fd8e 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -116,7 +116,7 @@ // it might mean we are stuck in a corner somewere. So move around to try to expand. move() if(current_size >= STAGE_TWO) - radiation_pulse(src, min(5000, (energy * 4.5) + 1000), RAD_DISTANCE_COEFFICIENT * 0.5) + radiation_pulse(src, min(5000, (energy * 4.5) + 1000), RAD_DISTANCE_COEFFICIENT * 0.1) if(prob(event_chance))//Chance for it to run a special event TODO:Come up with one or two more that fit event() eat() diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index 9dcd6eaf6dc..6c3ac951b12 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -101,7 +101,7 @@ overlays += image('icons/obj/power.dmi', icon_state = "solar_panel-b", layer = FLY_LAYER) else overlays += image('icons/obj/power.dmi', icon_state = "solar_panel", layer = FLY_LAYER) - src.dir = angle2dir(adir) + set_angle(adir) return //calculates the fraction of the sunlight that the panel recieves @@ -298,7 +298,7 @@ if(autostart) search_for_connected() if(connected_tracker && track == TRACKER_AUTO) - connected_tracker.set_angle(SSsun.angle) + connected_tracker.modify_angle(SSsun.angle) set_panels(cdir) /obj/machinery/power/solar_control/Destroy() @@ -338,7 +338,7 @@ return if(track == TRACKER_AUTO && connected_tracker) // auto-tracking - connected_tracker.set_angle(SSsun.angle) + connected_tracker.modify_angle(SSsun.angle) set_panels(cdir) updateDialog() @@ -410,7 +410,7 @@ track = text2num(params["track"]) if(track == TRACKER_AUTO) if(connected_tracker) - connected_tracker.set_angle(SSsun.angle) + connected_tracker.modify_angle(SSsun.angle) set_panels(cdir) else if(track == TRACKER_TIMED) targetdir = cdir @@ -420,7 +420,7 @@ if("refresh") search_for_connected() if(connected_tracker && track == TRACKER_AUTO) - connected_tracker.set_angle(SSsun.angle) + connected_tracker.modify_angle(SSsun.angle) set_panels(cdir) /obj/machinery/power/solar_control/attackby(obj/item/I, mob/user, params) diff --git a/code/modules/power/tracker.dm b/code/modules/power/tracker.dm index 621c5f02747..b85659112d9 100644 --- a/code/modules/power/tracker.dm +++ b/code/modules/power/tracker.dm @@ -50,7 +50,7 @@ update_icon() //updates the tracker icon and the facing angle for the control computer -/obj/machinery/power/tracker/proc/set_angle(angle) +/obj/machinery/power/tracker/proc/modify_angle(angle) sun_angle = angle //set icon dir to show sun illumination diff --git a/code/modules/projectiles/ammunition/energy.dm b/code/modules/projectiles/ammunition/energy.dm index 41e2aa0ed2d..18ed273ff23 100644 --- a/code/modules/projectiles/ammunition/energy.dm +++ b/code/modules/projectiles/ammunition/energy.dm @@ -271,6 +271,16 @@ delay = 50 select_name = "snipe" +/obj/item/ammo_casing/energy/bsg + projectile_type = /obj/item/projectile/energy/bsg + muzzle_flash_color = LIGHT_COLOR_DARKBLUE + muzzle_flash_range = MUZZLE_FLASH_RANGE_STRONG + muzzle_flash_strength = MUZZLE_FLASH_STRENGTH_STRONG + fire_sound = 'sound/weapons/wave.ogg' + e_cost = 10000 + select_name = "the experimental setting" + delay = 10 SECONDS //Looooooong cooldown + /obj/item/ammo_casing/energy/teleport projectile_type = /obj/item/projectile/energy/teleport muzzle_flash_color = LIGHT_COLOR_LIGHTBLUE diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 69eccb2d7a5..6f38c7e2f01 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -17,6 +17,8 @@ var/selfcharge = 0 var/charge_tick = 0 var/charge_delay = 4 + /// Do you want the gun to fit into a turret, defaults to true, used for if a energy gun is too strong to be in a turret, or does not make sense to be in one. + var/can_fit_in_turrets = TRUE /obj/item/gun/energy/emp_act(severity) cell.use(round(cell.charge / severity)) diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index c5bf8a131bb..8a30d27517a 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -275,7 +275,7 @@ return ..() /obj/item/borg/upgrade/modkit/action(mob/living/silicon/robot/R) - if(..()) + if(!..()) return for(var/obj/item/gun/energy/kinetic_accelerator/cyborg/H in R.module.modules) diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 8d9f50cedd7..09458fd8ba7 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -317,6 +317,121 @@ zoom_amt = 7 //Long range, enough to see in front of you, but no tiles behind you. shaded_charge = 1 +/obj/item/gun/energy/bsg + name = "\improper B.S.G" + desc = "The Blue Space Gun. Uses a flux anomaly core and a bluespace crystal to produce destructive bluespace energy blasts, inspired by Nanotrasen's BSA division." + icon_state = "bsg" + item_state = "bsg" + origin_tech = "combat=6;materials=6;powerstorage=6;bluespace=6;magnets=6" //cutting edge technology, be my guest if you want to deconstruct one instead of use it. + ammo_type = list(/obj/item/ammo_casing/energy/bsg) + weapon_weight = WEAPON_HEAVY + w_class = WEIGHT_CLASS_HUGE + can_holster = FALSE + slot_flags = SLOT_BACK + cell_type = /obj/item/stock_parts/cell/bsg + shaded_charge = TRUE + can_fit_in_turrets = FALSE //Crystal would shatter, or someone would try to put an empty gun in the frame. + var/obj/item/assembly/signaler/anomaly/flux/core = null + var/has_bluespace_crystal = FALSE + var/admin_model = FALSE //For the admin gun, prevents crystal shattering, so anyone can use it, and you dont need to carry backup crystals. + +/obj/item/gun/energy/bsg/Destroy() + QDEL_NULL(core) + return ..() + +/obj/item/gun/energy/bsg/examine(mob/user) + . = ..() + if(core && has_bluespace_crystal) + . += "[src] is fully operational!" + else if(core) + . += "It has a flux anomaly core installed, but no bluespace crystal installed." + else if(has_bluespace_crystal) + . += "It has a bluespace crystal installed, but no flux anomaly core installed." + else + . += "It is missing a flux anomaly core and bluespace crystal to be operational." + +/obj/item/gun/energy/bsg/attackby(obj/item/O, mob/user, params) + if(istype(O, /obj/item/stack/ore/bluespace_crystal)) + if(has_bluespace_crystal) + to_chat(user, "[src] already has a bluespace crystal installed.") + return + var/obj/item/stack/S = O + if(!loc || !S || S.get_amount() < 1) + return + to_chat(user, "You load [O] into [src].") + S.use(1) + has_bluespace_crystal = TRUE + update_icon() + return + + if(istype(O, /obj/item/assembly/signaler/anomaly/flux)) + if(core) + to_chat(user, "[src] already has a [O]!") + return + if(!user.drop_item()) + to_chat(user, "[O] is stuck to your hand!") + return + to_chat(user, "You insert [O] into [src], and [src] starts to warm up.") + O.forceMove(src) + core = O + update_icon() + else + return ..() + +/obj/item/gun/energy/bsg/process_fire(atom/target, mob/living/user, message = TRUE, params, zone_override, bonus_spread = 0) + if(!has_bluespace_crystal) + to_chat(user, "[src] has no bluespace crystal to power it!") + return + if(!core) + to_chat(user, "[src] has no flux anomaly core to power it!") + return + return ..() + +/obj/item/gun/energy/bsg/process_chamber() + if(prob(25)) + shatter() + ..() + update_icon() + +/obj/item/gun/energy/bsg/update_icon() + . = ..() + if(core) + if(has_bluespace_crystal) + icon_state = "bsg_finished" + else + icon_state = "bsg_core" + else if(has_bluespace_crystal) + icon_state = "bsg_crystal" + else + icon_state = "bsg" + +/obj/item/gun/energy/bsg/emp_act(severity) + ..() + if(prob(75 / severity)) + if(has_bluespace_crystal) + shatter() + +/obj/item/gun/energy/bsg/proc/shatter() + if(admin_model) + return + visible_message("[src]'s bluespace crystal shatters!") + playsound(src, 'sound/effects/pylon_shatter.ogg', 50, TRUE) + has_bluespace_crystal = FALSE + update_icon() + +/obj/item/gun/energy/bsg/prebuilt + icon_state = "bsg_finished" + has_bluespace_crystal = TRUE + +/obj/item/gun/energy/bsg/prebuilt/Initialize(mapload) + . = ..() + core = new /obj/item/assembly/signaler/anomaly/flux + update_icon() + +/obj/item/gun/energy/bsg/prebuilt/admin + desc = "The Blue Space Gun. Uses a flux anomaly core and a bluespace crystal to produce destructive bluespace energy blasts, inspired by Nanotrasen's BSA division. This is an executive model, and its bluespace crystal will not shatter." + admin_model = TRUE + // Temperature Gun // /obj/item/gun/energy/temperature name = "temperature gun" diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index f727638b475..d341330fb16 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -60,6 +60,9 @@ var/log_override = FALSE //whether print to admin attack logs or just keep it in the diary + /// For when you want your projectile to have a chain coming out of the gun + var/chain = null + /obj/item/projectile/New() permutated = list() return ..() @@ -239,7 +242,7 @@ if((!current || loc == current)) current = locate(clamp(x + xo, 1, world.maxx), clamp(y + yo, 1, world.maxy), z) if(isnull(Angle)) - Angle = round(Get_Angle(src, current)) + Angle = round(get_angle(src, current)) if(spread) Angle += (rand() - 0.5) * spread var/matrix/M = new diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm index 35e3d325c4e..dc6f3fdf2da 100644 --- a/code/modules/projectiles/projectile/energy.dm +++ b/code/modules/projectiles/projectile/energy.dm @@ -80,7 +80,6 @@ var/zap_flags = ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE var/zap_range = 3 var/power = 10000 - var/chain /obj/item/ammo_casing/energy/shock_revolver/ready_proj(atom/target, mob/living/user, quiet, zone_override = "") ..() @@ -93,6 +92,62 @@ tesla_zap(src, zap_range, power, zap_flags) qdel(src) +/obj/item/projectile/energy/bsg + name = "orb of pure bluespace energy" + icon_state = "bluespace" + impact_effect_type = /obj/effect/temp_visual/bsg_kaboom + damage = 60 + damage_type = BURN + range = 9 + weaken = 1 //This is going to knock you off your feet + eyeblur = 5 + speed = 2 + alwayslog = TRUE + +/obj/item/ammo_casing/energy/bsg/ready_proj(atom/target, mob/living/user, quiet, zone_override = "") + ..() + var/obj/item/projectile/energy/bsg/P = BB + addtimer(CALLBACK(P, /obj/item/projectile/energy/bsg/.proc/make_chain, P, user), 1) + +/obj/item/projectile/energy/bsg/proc/make_chain(obj/item/projectile/P, mob/user) + P.chain = P.Beam(user, icon_state = "sm_arc_supercharged", icon = 'icons/effects/beam.dmi', time = 10 SECONDS, maxdistance = 30) + +/obj/item/projectile/energy/bsg/on_hit(atom/target) + . = ..() + kaboom() + qdel(src) + +/obj/item/projectile/energy/bsg/on_range() + kaboom() + new /obj/effect/temp_visual/bsg_kaboom(loc) + ..() + +/obj/item/projectile/energy/bsg/proc/kaboom() + playsound(src, 'sound/weapons/bsg_explode.ogg', 75, TRUE) + for(var/mob/living/M in hearers(7, src)) //No stuning people with thermals through a wall. + var/floored = FALSE + if(ishuman(M)) + var/mob/living/carbon/human/H = M + var/obj/item/gun/energy/bsg/N = locate() in H + if(N) + to_chat(H, "[N] deploys an energy shield to project you from [src]'s explosion.") + continue + var/distance = (1 + get_dist(M, src)) + if(prob(min(400 / distance, 100))) //100% chance to hit with the blast up to 3 tiles, after that chance to hit is 80% at 4 tiles, 66.6% at 5, 57% at 6, and 50% at 7 + if(prob(min(150 / distance, 100)))//100% chance to upgraded to a stun as well at a direct hit, 75% at 1 tile, 50% at 2, 37.5% at 3, 30% at 4, 25% at 5, 21% at 6, and finaly 19% at 7. This is calculated after the first hit however. + floored = TRUE + M.apply_damage((rand(15, 30) * (1.1 - distance / 10)), BURN) //reduced by 10% per tile + add_attack_logs(src, M, "Hit heavily by [src]") + if(floored) + to_chat(M, "You see a flash of briliant blue light as [src] explodes, knocking you to the ground and burning you!") + M.Weaken(1) + else + to_chat(M, "You see a flash of briliant blue light as [src] explodes, burning you!") + else + to_chat(M, "You feel the heat of the explosion of [src], but the blast mostly misses you.") + add_attack_logs(src, M, "Hit lightly by [src]") + M.apply_damage(rand(1, 5), BURN) + /obj/item/projectile/energy/toxplasma name = "plasma bolt" icon_state = "energy" diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm index 1c6981ff0b5..52a54e47a3b 100644 --- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm +++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm @@ -246,7 +246,7 @@ if(!operating) for (var/obj/item/O in holdingitems) - processing_chamber += "\A [O.name]
" + processing_chamber += "\A [html_encode(O.name)]
" if (!processing_chamber) is_chamber_empty = 1 diff --git a/code/modules/reagents/chemistry/reagents/alcohol.dm b/code/modules/reagents/chemistry/reagents/alcohol.dm index ad15e19856b..94172e14f0e 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol.dm @@ -688,6 +688,25 @@ M.bodytemperature = min(330, M.bodytemperature + (20 * TEMPERATURE_DAMAGE_COEFFICIENT)) //310 is the normal bodytemp. 310.055 return ..() +/datum/reagent/consumable/ethanol/adminfreeze + name = "Admin Freeze" + id = "adminfreeze" + description = "Ultimate Punishment." + reagent_state = LIQUID + color = "#30F0FF" // rgb: 048, 240, 255 + dizzy_adj = 4 + alcohol_perc = 1.5 // oof + drink_icon = "adminfreeze" + drink_name = "Admin Freeze" + drink_desc = "The ultimate punishment." + taste_description = "a series of bad decisions" + +/datum/reagent/consumable/ethanol/adminfreeze/reaction_mob(mob/living/M, method = REAGENT_INGEST, volume) + ..() + if(method == REAGENT_INGEST) + M.apply_status_effect(/datum/status_effect/freon/watcher) + M.adjust_bodytemperature(-110) + /datum/reagent/consumable/ethanol/barefoot name = "Barefoot" id = "barefoot" diff --git a/code/modules/reagents/chemistry/reagents/misc.dm b/code/modules/reagents/chemistry/reagents/misc.dm index a0122dccd78..a489685a340 100644 --- a/code/modules/reagents/chemistry/reagents/misc.dm +++ b/code/modules/reagents/chemistry/reagents/misc.dm @@ -442,7 +442,7 @@ if(!istype(C)) return if(C.mind) - if(C.mind.assigned_role == "Clown" || C.mind.assigned_role == SPECIAL_ROLE_HONKSQUAD) + if(C.mind.assigned_role == "Clown") to_chat(C, "Whatever that was, it feels great!") else if(C.mind.assigned_role == "Mime") to_chat(C, "You feel nauseous.") @@ -460,7 +460,7 @@ var/update_flags = STATUS_UPDATE_NONE if(prob(10)) M.emote("giggle") - if(M?.mind.assigned_role == "Clown" || M?.mind.assigned_role == SPECIAL_ROLE_HONKSQUAD) + if(M?.mind.assigned_role == "Clown") update_flags |= M.adjustBruteLoss(-1.5 * REAGENTS_EFFECT_MULTIPLIER) //Screw those pesky clown beatings! else M.AdjustDizzy(10, 0, 500) diff --git a/code/modules/reagents/chemistry/reagents/paradise_pop.dm b/code/modules/reagents/chemistry/reagents/paradise_pop.dm index c7c9fa46c75..c7b8dd6f5c5 100644 --- a/code/modules/reagents/chemistry/reagents/paradise_pop.dm +++ b/code/modules/reagents/chemistry/reagents/paradise_pop.dm @@ -29,7 +29,7 @@ /datum/reagent/consumable/drink/apple_pocalypse/on_mob_life(mob/living/M) if(prob(1)) var/turf/simulated/T = get_turf(M) - goonchem_vortex(T, 1, 0) + goonchem_vortex(T, TRUE, 0, TRUE) // Ignore the 0 volume to_chat(M, "You briefly feel super-massive, like a black hole. Probably just your imagination...") return ..() @@ -119,7 +119,7 @@ /datum/reagent/consumable/drink/grape_granade/on_mob_life(mob/living/M) if(prob(1)) var/turf/simulated/T = get_turf(M) - goonchem_vortex(T, 0, 0) + goonchem_vortex(T, FALSE, 0, TRUE) // Ignore the 0 volume M.emote("burp") to_chat(M, "You feel ready to burst! Oh wait, just a burp...") else if(prob(25)) diff --git a/code/modules/reagents/chemistry/reagents/water.dm b/code/modules/reagents/chemistry/reagents/water.dm index 8084a990e3c..0fbde39df4f 100644 --- a/code/modules/reagents/chemistry/reagents/water.dm +++ b/code/modules/reagents/chemistry/reagents/water.dm @@ -57,10 +57,12 @@ taste_description = "floor cleaner" /datum/reagent/space_cleaner/reaction_obj(obj/O, volume) - if(is_cleanable(O)) - var/obj/effect/decal/cleanable/blood/B = O - if(!(istype(B) && B.off_floor)) - qdel(O) + if(istype(O, /obj/effect)) + var/obj/effect/E = O + if(E.is_cleanable()) + var/obj/effect/decal/cleanable/blood/B = E + if(!(istype(B) && B.off_floor)) + qdel(E) else if(O.simulated) O.color = initial(O.color) diff --git a/code/modules/reagents/chemistry/recipes.dm b/code/modules/reagents/chemistry/recipes.dm index b743da3cecf..cb739a65a7b 100644 --- a/code/modules/reagents/chemistry/recipes.dm +++ b/code/modules/reagents/chemistry/recipes.dm @@ -53,18 +53,37 @@ for(var/j = 1, j <= rand(1, 3), j++) step(S, pick(NORTH,SOUTH,EAST,WEST)) -/proc/goonchem_vortex(turf/T, setting_type, volume) - if(setting_type) +/** + * Throws or pulls objects to/from a chem reaction + * + * Scales the amount of objects thrown with the volume, unless ignore_volume is TRUE + * + * Arguments: + * * T - The turf to use as the throw from/to point + * * pull - Do we want to pull objects towards T (TRUE) or push them away from it (FALSE) + * * volume - The volume of reagents. Used to scale the effect is ignore_volume = FALSE + * * ignore_volume - Do we want to ignore the volume of reagents and just throw regardless + */ +/proc/goonchem_vortex(turf/T, pull, volume, ignore_volume = FALSE) + if(pull) new /obj/effect/temp_visual/implosion(T) playsound(T, 'sound/effects/whoosh.ogg', 25, 1) //credit to Robinhood76 of Freesound.org for this. else new /obj/effect/temp_visual/shockwave(T) playsound(T, 'sound/effects/bang.ogg', 25, 1) - for(var/atom/movable/X in view(2 + setting_type + (volume > 30 ? 1 : 0), T)) + // PARADISE EDIT: Allow only a certain amount of atoms to be pulled per unit + var/units_per_atom = 5 + var/atoms_to_move = round(volume / units_per_atom) + var/moved_count = 0 + // The ternary below isnt exactly needed, but it makes code more readable because `pull` is a bool + for(var/atom/movable/X in view(2 + (pull ? 1 : 0) + (volume > 30 ? 1 : 0), T)) if(istype(X, /obj/effect)) continue //stop pulling smoke and hotspots please if(X && !X.anchored && X.move_resist <= MOVE_FORCE_DEFAULT) - if(setting_type) + if(pull) X.throw_at(T, 20 + round(volume * 2), 1 + round(volume / 10)) else X.throw_at(get_edge_target_turf(T, get_dir(T, X)), 20 + round(volume * 2), 1 + round(volume / 10)) + moved_count++ + if((moved_count >= atoms_to_move) && !ignore_volume) + break diff --git a/code/modules/reagents/chemistry/recipes/drinks.dm b/code/modules/reagents/chemistry/recipes/drinks.dm index 34ea484d712..1bdb91f1ab6 100644 --- a/code/modules/reagents/chemistry/recipes/drinks.dm +++ b/code/modules/reagents/chemistry/recipes/drinks.dm @@ -443,6 +443,15 @@ result_amount = 4 mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' +/datum/chemical_reaction/adminfreeze + name = "Admin Freeze" + id = "adminfreeze" + result = "adminfreeze" + required_reagents = list("neurotoxin" = 1, "toxinsspecial" = 1, "fernet" = 1, "moonshine" = 1, "morphine" = 1) + min_temp = T0C + 100 + result_amount = 5 + mix_sound = 'sound/effects/adminhelp.ogg' + /datum/chemical_reaction/barefoot name = "Barefoot" id = "barefoot" diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index 850cd0b922b..b2b6ac3ef21 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -104,7 +104,7 @@ var/turf/T = get_turf(holder.my_atom) if(!T) return - goonchem_vortex(T, 0, created_volume) + goonchem_vortex(T, FALSE, created_volume) /datum/chemical_reaction/sorium_explosion/sorium name = "sorium_vortex" @@ -133,7 +133,7 @@ var/turf/simulated/T = get_turf(holder.my_atom) if(!T) return - goonchem_vortex(T, 1, created_volume) + goonchem_vortex(T, TRUE, created_volume) /datum/chemical_reaction/ldm_implosion/liquid_dark_matter name = "LDM Vortex" diff --git a/code/modules/reagents/reagent_containers/patch.dm b/code/modules/reagents/reagent_containers/patch.dm index 17112901b29..5a5a7c4696f 100644 --- a/code/modules/reagents/reagent_containers/patch.dm +++ b/code/modules/reagents/reagent_containers/patch.dm @@ -18,7 +18,8 @@ return FALSE bitesize = 0 if(M.eat(src, user)) - user.drop_item() + if(user.get_active_hand() == src) + user.drop_item() // Only drop if they're holding the patch directly forceMove(M) LAZYADD(M.processing_patches, src) return TRUE diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm index 0c2079ef160..8ed36875c63 100644 --- a/code/modules/research/xenobiology/xenobio_camera.dm +++ b/code/modules/research/xenobiology/xenobio_camera.dm @@ -4,6 +4,8 @@ icon = 'icons/obj/abductor.dmi' icon_state = "camera_target" var/allowed_area = null + // The Xenobio Console does not trigger the AI Detector + ai_detector_visible = FALSE /mob/camera/aiEye/remote/xenobio/New(loc) var/area/A = get_area(loc) diff --git a/code/modules/ruins/lavalandruin_code/puzzle.dm b/code/modules/ruins/lavalandruin_code/puzzle.dm index 0220498df5e..2a3ae55bd4b 100644 --- a/code/modules/ruins/lavalandruin_code/puzzle.dm +++ b/code/modules/ruins/lavalandruin_code/puzzle.dm @@ -194,7 +194,7 @@ /obj/structure/puzzle_element name = "mysterious pillar" - desc = "puzzling..." + desc = "Puzzling..." icon = 'icons/obj/lavaland/artefacts.dmi' icon_state = "puzzle_pillar" anchored = FALSE diff --git a/code/modules/shuttle/navigation_computer.dm b/code/modules/shuttle/navigation_computer.dm index 4fabc5f48cf..968d9f6a89d 100644 --- a/code/modules/shuttle/navigation_computer.dm +++ b/code/modules/shuttle/navigation_computer.dm @@ -264,6 +264,8 @@ visible_icon = FALSE use_static = FALSE simulated = FALSE + // The Shuttle Docker does not trigger the AI Detector + ai_detector_visible = FALSE var/list/placement_images = list() var/list/placed_images = list() diff --git a/code/modules/station_goals/bluespace_tap.dm b/code/modules/station_goals/bluespace_tap.dm index 6eb4cb9572e..6e6898bde1f 100644 --- a/code/modules/station_goals/bluespace_tap.dm +++ b/code/modules/station_goals/bluespace_tap.dm @@ -42,7 +42,7 @@ product_cost = cost /obj/item/circuitboard/machine/bluespace_tap - name = "Bluespace Harvester (Machine Board)" + board_name = "Bluespace Harvester" build_path = /obj/machinery/power/bluespace_tap origin_tech = "engineering=2;combat=2;bluespace=3" req_components = list( diff --git a/code/modules/station_goals/bsa.dm b/code/modules/station_goals/bsa.dm index f97638cbd28..96cd520921e 100644 --- a/code/modules/station_goals/bsa.dm +++ b/code/modules/station_goals/bsa.dm @@ -225,7 +225,7 @@ last_fire_time = world.time / 10 /obj/item/circuitboard/machine/bsa/back - name = "Bluespace Artillery Generator (Machine Board)" + board_name = "Bluespace Artillery Generator" build_path = /obj/machinery/bsa/back origin_tech = "engineering=2;combat=2;bluespace=2" //No freebies! req_components = list( @@ -233,7 +233,7 @@ /obj/item/stack/cable_coil = 2) /obj/item/circuitboard/machine/bsa/middle - name = "Bluespace Artillery Fusor (Machine Board)" + board_name = "Bluespace Artillery Fusor" build_path = /obj/machinery/bsa/middle origin_tech = "engineering=2;combat=2;bluespace=2" req_components = list( @@ -241,7 +241,7 @@ /obj/item/stack/cable_coil = 2) /obj/item/circuitboard/machine/bsa/front - name = "Bluespace Artillery Bore (Machine Board)" + board_name = "Bluespace Artillery Bore" build_path = /obj/machinery/bsa/front origin_tech = "engineering=2;combat=2;bluespace=2" req_components = list( @@ -249,7 +249,7 @@ /obj/item/stack/cable_coil = 2) /obj/item/circuitboard/computer/bsa_control - name = "Bluespace Artillery Controls (Computer Board)" + board_name = "Bluespace Artillery Controls" build_path = /obj/machinery/computer/bsa_control origin_tech = "engineering=2;combat=2;bluespace=2" diff --git a/code/modules/station_goals/dna_vault.dm b/code/modules/station_goals/dna_vault.dm index 031471e968c..c9096042e85 100644 --- a/code/modules/station_goals/dna_vault.dm +++ b/code/modules/station_goals/dna_vault.dm @@ -121,7 +121,7 @@ GLOBAL_LIST_INIT(non_simple_animals, typecacheof(list(/mob/living/carbon/human/m /obj/item/circuitboard/machine/dna_vault - name = "DNA Vault (Machine Board)" + board_name = "DNA Vault" build_path = /obj/machinery/dna_vault origin_tech = "engineering=2;combat=2;bluespace=2" //No freebies! req_components = list( diff --git a/code/modules/station_goals/shield.dm b/code/modules/station_goals/shield.dm index 3defa561f4f..46dc31c78a4 100644 --- a/code/modules/station_goals/shield.dm +++ b/code/modules/station_goals/shield.dm @@ -35,7 +35,7 @@ return coverage.len /obj/item/circuitboard/computer/sat_control - name = "Satellite Network Control (Computer Board)" + board_name = "Satellite Network Control" build_path = /obj/machinery/computer/sat_control origin_tech = "engineering=3" diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm index ee017cfa4e5..a0c2c10308e 100644 --- a/code/modules/surgery/organs/heart.dm +++ b/code/modules/surgery/organs/heart.dm @@ -64,8 +64,9 @@ /obj/item/organ/internal/heart/prepare_eat() var/obj/S = ..() - S.icon_state = dead_icon - return S + if(S) + S.icon_state = dead_icon + return S /obj/item/organ/internal/heart/cursed name = "cursed heart" diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index 12cc87aeb3f..8250665d587 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -304,8 +304,9 @@ /obj/item/organ/internal/lungs/prepare_eat() var/obj/S = ..() - S.reagents.add_reagent("salbutamol", 5) - return S + if(S) + S.reagents.add_reagent("salbutamol", 5) + return S /obj/item/organ/internal/lungs/plasmaman name = "plasma filter" diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 51267c859b9..297cb4a6225 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -252,7 +252,7 @@ GLOBAL_DATUM_INIT(multispin_words, /regex, regex("like a record baby")) else if((findtext(message, GLOB.hallucinate_words))) for(var/V in listeners) var/mob/living/L = V - new /obj/effect/hallucination/delusion(get_turf(L),L,duration=150 * power_multiplier,skip_nearby=0) + new /obj/effect/hallucination/delusion(get_turf(L), L) next_command = world.time + cooldown_meme //WAKE UP diff --git a/code/modules/tgui/modules/crew_monitor.dm b/code/modules/tgui/modules/crew_monitor.dm index a500fc6aad1..d559251ec77 100644 --- a/code/modules/tgui/modules/crew_monitor.dm +++ b/code/modules/tgui/modules/crew_monitor.dm @@ -38,5 +38,6 @@ data["isAI"] = isAI(user) data["crewmembers"] = GLOB.crew_repository.health_data(T) + data["critThreshold"] = HEALTH_THRESHOLD_CRIT return data diff --git a/code/modules/tgui/modules/ghost_hud_panel.dm b/code/modules/tgui/modules/ghost_hud_panel.dm new file mode 100644 index 00000000000..fe35872bc04 --- /dev/null +++ b/code/modules/tgui/modules/ghost_hud_panel.dm @@ -0,0 +1,73 @@ + +/// Stores an instance of [/datum/ui_module/ghost_hud_panel] so that ghosts can use this to open their HUD panel. +GLOBAL_DATUM_INIT(ghost_hud_panel, /datum/ui_module/ghost_hud_panel, new) + +/** + * # Ghost HUD panel + * + * Allows ghosts to view a TGUI window which contains toggles for all HUD types available to them. + */ +/datum/ui_module/ghost_hud_panel + name = "Ghost HUD Panel" + /// Associative list to get the appropriate hud type based on the string passed from TGUI. + var/list/hud_type_lookup = list( + "medical" = DATA_HUD_MEDICAL_ADVANCED, + "security" = DATA_HUD_SECURITY_ADVANCED, + "diagnostic" = DATA_HUD_DIAGNOSTIC + ) + +/datum/ui_module/ghost_hud_panel/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.observer_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui) + if(!ui) + ui = new(user, src, ui_key, "GhostHudPanel", name, 250, 171, master_ui, state) + ui.set_autoupdate(FALSE) + ui.open() + +/datum/ui_module/ghost_hud_panel/ui_data(mob/dead/observer/ghost) + var/list/data = list() + for(var/hud in hud_type_lookup) + data[hud] = (hud_type_lookup[hud] in ghost.data_hud_seen) + data["ahud"] = ghost.antagHUD + return data + +/datum/ui_module/ghost_hud_panel/ui_act(action, list/params) + if(..()) + return + + var/mob/dead/observer/ghost = usr + . = TRUE + + switch(action) + if("hud_on") + var/hud_type = hud_type_lookup[params["hud_type"]] + ghost.show_me_the_hud(hud_type) + + if("hud_off") + var/hud_type = hud_type_lookup[params["hud_type"]] + ghost.remove_the_hud(hud_type) + + if("ahud_on") + if(!config.antag_hud_allowed && !ghost.client.holder) + to_chat(ghost, "Admins have disabled this for this round.") + return FALSE + if(jobban_isbanned(ghost, "AntagHUD")) + to_chat(ghost, "You have been banned from using this feature.") + return FALSE + // Check if this is the first time they're turning on Antag HUD. + if(!check_rights(R_ADMIN | R_MOD, FALSE) && !ghost.has_enabled_antagHUD && config.antag_hud_restricted) + var/response = alert(ghost, "If you turn this on, you will not be able to take any part in the round.", "Are you sure you want to enable antag HUD?", "Yes", "No") + if(response == "No") + return FALSE + + ghost.has_enabled_antagHUD = TRUE + ghost.can_reenter_corpse = FALSE + GLOB.respawnable_list -= ghost + + ghost.antagHUD = TRUE + for(var/datum/atom_hud/antag/H in GLOB.huds) + H.add_hud_to(ghost) + + if("ahud_off") + ghost.antagHUD = FALSE + for(var/datum/atom_hud/antag/H in GLOB.huds) + H.add_hud_to(ghost) diff --git a/code/modules/tgui/states.dm b/code/modules/tgui/states.dm index 383344317c1..07a74544181 100644 --- a/code/modules/tgui/states.dm +++ b/code/modules/tgui/states.dm @@ -113,6 +113,6 @@ return STATUS_CLOSE // Otherwise, we got nothing. /mob/living/carbon/human/shared_living_ui_distance(atom/movable/src_object) - if(dna.GetSEState(GLOB.teleblock) && (get_dist(src, src_object) <= 2)) + if(HAS_TRAIT(src, TRAIT_TELEKINESIS) && (get_dist(src, src_object) <= 2)) return STATUS_INTERACTIVE return ..() diff --git a/code/modules/vehicle/janicart.dm b/code/modules/vehicle/janicart.dm index d7ba87b818c..07187e523ec 100644 --- a/code/modules/vehicle/janicart.dm +++ b/code/modules/vehicle/janicart.dm @@ -49,9 +49,9 @@ var/turf/tile = loc if(isturf(tile)) tile.clean_blood() - for(var/A in tile) - if(is_cleanable(A)) - qdel(A) + for(var/obj/effect/E in tile) + if(E.is_cleanable()) + qdel(E) diff --git a/code/modules/world_topic/adminmsg.dm b/code/modules/world_topic/adminmsg.dm index e3582b0ae46..5ad8f535e47 100644 --- a/code/modules/world_topic/adminmsg.dm +++ b/code/modules/world_topic/adminmsg.dm @@ -19,8 +19,9 @@ if(!C) return json_encode(list("error" = "No client with that name on server")) - var/message = "Discord PM from [input["sender"]]: [input["msg"]]" - var/amessage = "Discord PM from [input["sender"]] to [key_name_admin(C)]: [input["msg"]]" + var/sanitized = sanitize(input["msg"]) + var/message = "Discord PM from [input["sender"]]: [sanitized]" + var/amessage = "Discord PM from [input["sender"]] to [key_name_admin(C)]: [sanitized]" // THESE TWO VARS DO VERY DIFFERENT THINGS. DO NOT ATTEMPT TO COMBINE THEM C.received_discord_pm = world.time diff --git a/goon/code/datums/browserOutput.dm b/goon/code/datums/browserOutput.dm index 786b09e2da2..4b4a0d054c2 100644 --- a/goon/code/datums/browserOutput.dm +++ b/goon/code/datums/browserOutput.dm @@ -37,6 +37,7 @@ var/list/chatResources = list( . = ..() owner = C + SSchat_pings.chat_datums += src /datum/chatOutput/proc/start() if(!owner) @@ -126,14 +127,14 @@ var/list/chatResources = list( if(owner.tos_consent) sendClientData() - pingLoop() + updatePing() -/datum/chatOutput/proc/pingLoop() - set waitfor = FALSE - - while (owner) - ehjax_send(data = owner.is_afk(29 SECONDS) ? "softPang" : "pang") // SoftPang isn't handled anywhere but it'll always reset the opts.lastPang. - sleep(30 SECONDS) +// PARADISE EDIT: This just updates the ping and is called from SSchat_pings +/datum/chatOutput/proc/updatePing() + if(!owner) + qdel(src) + return + ehjax_send(data = owner.is_afk(29 SECONDS) ? "softPang" : "pang") // SoftPang isn't handled anywhere but it'll always reset the opts.lastPang. /datum/chatOutput/proc/ehjax_send(client/C = owner, window = "browseroutput", data) if(islist(data)) @@ -221,6 +222,11 @@ var/list/chatResources = list( /datum/chatOutput/proc/clear_syndicate_codes() owner << output(null, "browseroutput:codewordsClear") +/datum/chatOutput/Destroy(force) + SSchat_pings.chat_datums -= src + return ..() + + /client/verb/debug_chat() set hidden = 1 chatOutput.ehjax_send(data = list("firebug" = 1)) diff --git a/icons/mecha/mecha.dmi b/icons/mecha/mecha.dmi index af6edf692a3..d5b4ecb0e66 100644 Binary files a/icons/mecha/mecha.dmi and b/icons/mecha/mecha.dmi differ diff --git a/icons/mob/actions/actions.dmi b/icons/mob/actions/actions.dmi index 6b509da187b..8fdb36290f6 100644 Binary files a/icons/mob/actions/actions.dmi and b/icons/mob/actions/actions.dmi differ diff --git a/icons/mob/actions/actions_cult.dmi b/icons/mob/actions/actions_cult.dmi index 0e5320a54ed..2ccef9755b1 100644 Binary files a/icons/mob/actions/actions_cult.dmi and b/icons/mob/actions/actions_cult.dmi differ diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi index ec7e6827b19..6fffc9e1f57 100644 Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ diff --git a/icons/mob/inhands/guns_lefthand.dmi b/icons/mob/inhands/guns_lefthand.dmi index d69dd8a988b..f05497b5643 100644 Binary files a/icons/mob/inhands/guns_lefthand.dmi and b/icons/mob/inhands/guns_lefthand.dmi differ diff --git a/icons/mob/inhands/guns_righthand.dmi b/icons/mob/inhands/guns_righthand.dmi index 44968461e65..2c541898b08 100644 Binary files a/icons/mob/inhands/guns_righthand.dmi and b/icons/mob/inhands/guns_righthand.dmi differ diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi index 0564a4b7c7b..9b9702e53c3 100644 Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ diff --git a/icons/mob/mob.dmi b/icons/mob/mob.dmi index 86151e74123..6e0e68794f9 100644 Binary files a/icons/mob/mob.dmi and b/icons/mob/mob.dmi differ diff --git a/icons/mob/simple_human.dmi b/icons/mob/simple_human.dmi index 9ab1c9a1796..d78da5f3bf1 100644 Binary files a/icons/mob/simple_human.dmi and b/icons/mob/simple_human.dmi differ diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi index 6d30e966c31..fb7c28c3f6d 100644 Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ diff --git a/icons/obj/guns/energy.dmi b/icons/obj/guns/energy.dmi index 812b0bfba23..b4f2c2204ab 100644 Binary files a/icons/obj/guns/energy.dmi and b/icons/obj/guns/energy.dmi differ diff --git a/icons/obj/lighting.dmi b/icons/obj/lighting.dmi index 60ffb6462f9..4886978ff48 100644 Binary files a/icons/obj/lighting.dmi and b/icons/obj/lighting.dmi differ diff --git a/icons/obj/power.dmi b/icons/obj/power.dmi index 7eb6484038c..d4e21d7e6c8 100644 Binary files a/icons/obj/power.dmi and b/icons/obj/power.dmi differ diff --git a/icons/obj/stock_parts.dmi b/icons/obj/stock_parts.dmi index f2bdd494f50..38ddb183e97 100644 Binary files a/icons/obj/stock_parts.dmi and b/icons/obj/stock_parts.dmi differ diff --git a/icons/obj/turrets.dmi b/icons/obj/turrets.dmi index 237133e1bc2..3612cccd515 100644 Binary files a/icons/obj/turrets.dmi and b/icons/obj/turrets.dmi differ diff --git a/paradise.dme b/paradise.dme index 70dbf764e66..c189cbabbbb 100644 --- a/paradise.dme +++ b/paradise.dme @@ -194,6 +194,7 @@ #include "code\controllers\subsystem\atoms.dm" #include "code\controllers\subsystem\blackbox.dm" #include "code\controllers\subsystem\changelog.dm" +#include "code\controllers\subsystem\chat_pings.dm" #include "code\controllers\subsystem\cleanup.dm" #include "code\controllers\subsystem\dbcore.dm" #include "code\controllers\subsystem\discord.dm" @@ -684,7 +685,6 @@ #include "code\game\machinery\computer\crew.dm" #include "code\game\machinery\computer\depot.dm" #include "code\game\machinery\computer\HolodeckControl.dm" -#include "code\game\machinery\computer\honkputer.dm" #include "code\game\machinery\computer\law.dm" #include "code\game\machinery\computer\medical.dm" #include "code\game\machinery\computer\message.dm" @@ -694,13 +694,10 @@ #include "code\game\machinery\computer\power.dm" #include "code\game\machinery\computer\prisoner.dm" #include "code\game\machinery\computer\robot.dm" -#include "code\game\machinery\computer\salvage_ship.dm" #include "code\game\machinery\computer\security.dm" #include "code\game\machinery\computer\sm_monitor.dm" -#include "code\game\machinery\computer\specops_shuttle.dm" #include "code\game\machinery\computer\station_alert.dm" #include "code\game\machinery\computer\store.dm" -#include "code\game\machinery\computer\syndicate_specops_shuttle.dm" #include "code\game\machinery\doors\airlock.dm" #include "code\game\machinery\doors\airlock_control.dm" #include "code\game\machinery\doors\airlock_electronics.dm" @@ -822,7 +819,6 @@ #include "code\game\objects\items\bodybag.dm" #include "code\game\objects\items\candle.dm" #include "code\game\objects\items\cardboard_cutouts.dm" -#include "code\game\objects\items\changestone.dm" #include "code\game\objects\items\contraband.dm" #include "code\game\objects\items\control_wand.dm" #include "code\game\objects\items\crayons.dm" @@ -1183,7 +1179,6 @@ #include "code\modules\admin\verbs\freeze.dm" #include "code\modules\admin\verbs\getlogs.dm" #include "code\modules\admin\verbs\gimmick_team.dm" -#include "code\modules\admin\verbs\honksquad.dm" #include "code\modules\admin\verbs\infiltratorteam_syndicate.dm" #include "code\modules\admin\verbs\logging_view.dm" #include "code\modules\admin\verbs\map_template_loadverb.dm" @@ -1224,6 +1219,7 @@ #include "code\modules\antagonists\traitor\contractor\datums\rep_purchases\balloon.dm" #include "code\modules\antagonists\traitor\contractor\datums\rep_purchases\baton.dm" #include "code\modules\antagonists\traitor\contractor\datums\rep_purchases\blackout.dm" +#include "code\modules\antagonists\traitor\contractor\datums\rep_purchases\flare.dm" #include "code\modules\antagonists\traitor\contractor\datums\rep_purchases\fulton.dm" #include "code\modules\antagonists\traitor\contractor\datums\rep_purchases\pinpointer.dm" #include "code\modules\antagonists\traitor\contractor\datums\rep_purchases\reroll.dm" @@ -1525,7 +1521,6 @@ #include "code\modules\fish\fish_types.dm" #include "code\modules\fish\fishtank.dm" #include "code\modules\flufftext\Dreaming.dm" -#include "code\modules\flufftext\Hallucination.dm" #include "code\modules\flufftext\TextFilters.dm" #include "code\modules\food_and_drinks\food.dm" #include "code\modules\food_and_drinks\drinks\drinks.dm" @@ -1578,6 +1573,11 @@ #include "code\modules\games\52card.dm" #include "code\modules\games\cards.dm" #include "code\modules\games\tarot.dm" +#include "code\modules\hallucinations\hallucinations.dm" +#include "code\modules\hallucinations\effects\common.dm" +#include "code\modules\hallucinations\effects\major.dm" +#include "code\modules\hallucinations\effects\minor.dm" +#include "code\modules\hallucinations\effects\moderate.dm" #include "code\modules\holiday\christmas.dm" #include "code\modules\holiday\holiday.dm" #include "code\modules\hydroponics\biogenerator.dm" @@ -2458,6 +2458,7 @@ #include "code\modules\tgui\modules\crew_monitor.dm" #include "code\modules\tgui\modules\ert_manager.dm" #include "code\modules\tgui\modules\generic_crew_manifest.dm" +#include "code\modules\tgui\modules\ghost_hud_panel.dm" #include "code\modules\tgui\modules\law_manager.dm" #include "code\modules\tgui\modules\power_monitor.dm" #include "code\modules\tgui\modules\volume_mixer.dm" diff --git a/sound/weapons/bsg_explode.ogg b/sound/weapons/bsg_explode.ogg new file mode 100644 index 00000000000..ac3ff327727 Binary files /dev/null and b/sound/weapons/bsg_explode.ogg differ diff --git a/tgui/packages/tgui/interfaces/CrewMonitor.js b/tgui/packages/tgui/interfaces/CrewMonitor.js index b82590493e8..72aa6036216 100644 --- a/tgui/packages/tgui/interfaces/CrewMonitor.js +++ b/tgui/packages/tgui/interfaces/CrewMonitor.js @@ -6,23 +6,29 @@ import { TableCell } from '../components/Table'; import { COLORS } from '../constants.js'; import { Window } from "../layouts"; -const getStatText = cm => { +const getStatText = (cm, critThreshold) => { if (cm.dead) { return "Deceased"; } + if (parseInt(cm.health, 10) <= critThreshold) { // Critical + return "Critical"; + } if (parseInt(cm.stat, 10) === 1) { // Unconscious return "Unconscious"; } return "Living"; }; -const getStatColor = cm => { +const getStatColor = (cm, critThreshold) => { if (cm.dead) { return "red"; } - if (parseInt(cm.stat, 10) === 1) { // Unconscious + if (parseInt(cm.health, 10) <= critThreshold) { // Critical return "orange"; } + if (parseInt(cm.stat, 10) === 1) { // Unconscious + return "blue"; + } return "green"; }; @@ -103,8 +109,8 @@ const CrewMonitorDataView = (_properties, context) => { - {getStatText(cm)} + color={getStatColor(cm, data.critThreshold)}> + {getStatText(cm, data.critThreshold)} {cm.sensor_type >= 2 ? ( @@ -169,7 +175,7 @@ const CrewMonitorMapView = (_properties, context) => { zoom={zoom} icon="circle" tooltip={cm.name + " (" + cm.assignment + ")"} - color={getStatColor(cm)} + color={getStatColor(cm, data.critThreshold)} /> ))} diff --git a/tgui/packages/tgui/interfaces/GhostHudPanel.js b/tgui/packages/tgui/interfaces/GhostHudPanel.js new file mode 100644 index 00000000000..766786067ef --- /dev/null +++ b/tgui/packages/tgui/interfaces/GhostHudPanel.js @@ -0,0 +1,53 @@ +import { useBackend } from "../backend"; +import { Button, Section, Flex, Divider } from "../components"; +import { Window } from "../layouts"; + +export const GhostHudPanel = (props, context) => { + const { data } = useBackend(context); + const { + security, + medical, + diagnostic, + ahud, + } = data; + return ( + + +
+ + + + + +
+
+
+ ); +}; + +const HudEntry = (props, context) => { + const { act } = useBackend(context); + const { + label, + type = null, + is_active, + act_on = 'hud_on', + act_off = 'hud_off', + } = props; + return ( + + + {label} + + +