diff --git a/.gitignore b/.gitignore index 97393735c82..8cf535152ac 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ #Ignore everything in datafolder and subdirectories /data/**/* /tmp/**/* +/cache/**/* #Ignore byond config folder. /cfg/**/* diff --git a/_maps/RandomRuins/IceRuins/fluffy/icemoon_interdyne_base_ff.dmm b/_maps/RandomRuins/IceRuins/fluffy/icemoon_interdyne_base_ff.dmm index 20c1c46c3f1..e02640fa5d4 100644 --- a/_maps/RandomRuins/IceRuins/fluffy/icemoon_interdyne_base_ff.dmm +++ b/_maps/RandomRuins/IceRuins/fluffy/icemoon_interdyne_base_ff.dmm @@ -80,6 +80,9 @@ /obj/effect/turf_decal/trimline/dark/filled/corner{ dir = 1 }, +/obj/effect/turf_decal/stripes/red/corner{ + dir = 1 + }, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/cargo) "as" = ( @@ -521,6 +524,7 @@ /obj/structure/sign/poster/contraband/communist_state/directional/west, /obj/item/gun/ballistic/rifle/sniper_rifle, /obj/effect/turf_decal/tile/dark/full, +/obj/item/gun/ballistic/rifle/sniper_rifle, /obj/item/modular_computer/laptop/preset/syndicate, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/main) @@ -948,13 +952,19 @@ /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/bar) "eZ" = ( -/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, -/turf/open/floor/iron/dark/textured_large, -/area/ruin/syndicate_lava_base/main) +/obj/structure/marker_beacon/burgundy, +/obj/structure/chair{ + dir = 8 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored) "fd" = ( /obj/effect/turf_decal/stripes/red/line, /obj/effect/turf_decal/tile/dark/full, /obj/structure/rack/shelf, +/obj/structure/window/reinforced/survival_pod/spawner/directional/south{ + pixel_y = -4 + }, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/arrivals) "fe" = ( @@ -1226,6 +1236,7 @@ /area/ruin/syndicate_lava_base/main) "gY" = ( /obj/effect/turf_decal/stripes/red/line, +/obj/structure/cable, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/cargo) "gZ" = ( @@ -1648,6 +1659,7 @@ pixel_y = -4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/structure/reagent_dispensers/watertank/high, /turf/open/floor/catwalk_floor/iron_dark, /area/ruin/syndicate_lava_base/main) "kf" = ( @@ -1795,10 +1807,6 @@ /obj/machinery/chem_dispenser/drinks/fullupgrade, /turf/open/floor/iron/dark/textured, /area/ruin/syndicate_lava_base/bar) -"lb" = ( -/obj/item/binoculars, -/turf/closed/mineral/random/snow/underground, -/area/icemoon/underground/explored) "lc" = ( /obj/structure/marker_beacon/burgundy, /obj/effect/mapping_helpers/airlock/access/all/syndicate/general, @@ -1917,6 +1925,7 @@ map_pad_link_id = "ds2"; name = "quantum pad to DS-2" }, +/obj/structure/cable, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/cargo) "mp" = ( @@ -1947,9 +1956,9 @@ dir = 5 }, /obj/structure/marker_beacon/violet, -/obj/structure/curtain/bounty/start_closed{ - alpha = 180; - color = "#7d7d7d" +/obj/structure/curtain/bounty{ + color = "#7d7d7d"; + alpha = 180 }, /turf/open/floor/iron/dark/small, /area/ruin/syndicate_lava_base/dormitories) @@ -2257,6 +2266,10 @@ /obj/structure/marker_beacon/burgundy, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/testlab) +"on" = ( +/obj/item/binoculars, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored) "op" = ( /obj/effect/turf_decal/trimline/dark/filled/line, /obj/effect/turf_decal/trimline/dark/filled/line{ @@ -2264,7 +2277,8 @@ }, /obj/effect/mapping_helpers/airlock/access/all/syndicate/general, /obj/machinery/door/airlock{ - name = "Unisex Showers" + name = "Unisex Showers"; + id_tag = "IDyneWC" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -2336,7 +2350,7 @@ /obj/structure/window/reinforced/survival_pod/spawner/directional/west{ pixel_x = -4 }, -/obj/machinery/portable_atmospherics/canister/air, +/obj/machinery/portable_atmospherics/canister/plasma, /turf/open/floor/catwalk_floor/iron_dark, /area/ruin/syndicate_lava_base/main) "oG" = ( @@ -2374,10 +2388,9 @@ /area/ruin/syndicate_lava_base/medbay) "oP" = ( /obj/effect/turf_decal/tile/dark/full, -/obj/machinery/module_duplicator{ - name = "Interdyne module duplicator"; - color = "#adadcd"; - light_color = "#adadcd" +/obj/machinery/ammo_workbench{ + name = "Interdyne ammunitions workbench"; + color = "#adadcd" }, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/testlab) @@ -2880,8 +2893,6 @@ "so" = ( /obj/structure/rack/shelf, /obj/effect/turf_decal/tile/dark/full, -/obj/item/gun/syringe/rapidsyringe, -/obj/item/gun/syringe/rapidsyringe, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/testlab) "sr" = ( @@ -2939,7 +2950,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 }, -/obj/structure/cable, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/main) "sF" = ( @@ -3121,9 +3131,9 @@ /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/main) "tv" = ( -/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, -/turf/open/floor/plating/reinforced, -/area/ruin/syndicate_lava_base/main) +/obj/item/serviette_pack, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored) "tw" = ( /obj/structure/table/reinforced/plastitaniumglass, /obj/item/storage/box/monkeycubes{ @@ -3412,13 +3422,14 @@ /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/bar) "vH" = ( -/obj/machinery/computer/crew/syndie{ - dir = 4; - pixel_x = -4; - name = "Interdyne crew monitoring console" - }, /obj/effect/turf_decal/tile/dark/full, -/obj/structure/marker_beacon/olive, +/obj/machinery/vending/drugs{ + name = "\improper SyndiDrug Plus"; + onstation = 0; + extended_inventory = 1; + color = "#adadcd"; + light_color = "#adadcd" + }, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/medbay) "vL" = ( @@ -3600,7 +3611,7 @@ }, /obj/item/paper/fluff/ruins/interdyne/note_1{ name = "Forcefield Generator Maintenance"; - default_raw_text = "To activate a deployable laboratory forcefield, open maintenance hatches of Generator itself, Relay, Well and Charger nodes with a screwdriver and upgrade them with provided parts by using rapid parts exchange device. Then close all hatches and activate every module of generator, by starting with closer to generator nodes in chain-like way. When preparations are done, set generator radius at maximum and press power button. If shield will recieve overwhelm damage, it requires some time to recharge and have to be turned back on manually." + default_raw_text = "To activate Frozen Moonlight's forcefield, open maintenance hatches of the generator itself, Relay, Well and Charger nodes with a screwdriver and upgrade them with provided parts by using a rapid parts exchange device. Then, close all hatches and, by using a multitool, activate every module of the generator in a chain-like way. When preparations are done, set the generator's radius at maximum and press the power button. If the forcefield sustains overwhelming damage, it will require some time to recharge and has to be turned back on manually. Wavefield Science wishes you a safe and productive day." }, /obj/effect/turf_decal/trimline/dark/filled/corner{ dir = 8 @@ -3612,8 +3623,12 @@ /obj/structure/marker_beacon/burgundy, /obj/structure/sign/flag/syndicate/directional/north, /obj/effect/turf_decal/tile/dark/full, -/obj/machinery/ammo_workbench, -/obj/item/disk/ammo_workbench/advanced, +/obj/machinery/blackbox_recorder{ + name = "Interdyne Blackbox Recorder"; + desc = "Machine that contains lots of confidential Syndicate and Wavefield Science data."; + color = "#adadcd"; + light_color = "#adadcd" + }, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/main) "wG" = ( @@ -3991,14 +4006,8 @@ /obj/machinery/light/directional/south{ light_color = "#5148A6" }, -/obj/item/storage/box/nif_ghost_box/ghost_role, -/obj/item/storage/box/nif_ghost_box/ghost_role, -/obj/item/storage/box/nif_ghost_box/ghost_role, -/obj/item/storage/box/nif_ghost_box/ghost_role, -/obj/item/storage/box/nif_ghost_box/ghost_role, -/obj/item/storage/box/nif_ghost_box/ghost_role, -/obj/item/storage/box/nif_ghost_box/ghost_role, -/obj/item/storage/box/nif_ghost_box/ghost_role, +/obj/item/gun/syringe/rapidsyringe, +/obj/item/gun/syringe/rapidsyringe, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/testlab) "yY" = ( @@ -4173,13 +4182,14 @@ /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/medbay) "Bp" = ( -/obj/structure/table/reinforced/plastitaniumglass, -/obj/item/storage/backpack/duffelbag/synth_treatment_kit/trauma/advanced/unzipped, -/obj/item/healthanalyzer/advanced, /obj/effect/turf_decal/tile/dark/full, /obj/structure/window/reinforced/survival_pod/spawner/directional/east{ pixel_x = 4 }, +/obj/structure/marker_beacon/olive, +/obj/machinery/computer/crew/syndie{ + dir = 8 + }, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/medbay) "Bt" = ( @@ -4391,7 +4401,10 @@ /obj/structure/marker_beacon/burgundy, /obj/structure/sign/poster/contraband/soviet_propaganda/directional/east, /obj/effect/turf_decal/tile/dark/full, -/obj/machinery/suit_storage_unit/syndicate/chameleon, +/obj/machinery/suit_storage_unit/syndicate/chameleon{ + color = "#adadcd"; + light_color = "#adadcd" + }, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/main) "CA" = ( @@ -4411,7 +4424,8 @@ /area/ruin/syndicate_lava_base/medbay) "CC" = ( /obj/machinery/vending/dorms{ - onstation = 0 + onstation = 0; + extended_inventory = 1 }, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/main) @@ -4648,6 +4662,7 @@ pixel_y = 42 }, /obj/structure/cable, +/obj/effect/mapping_helpers/apc/syndicate_access, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/cargo) "DT" = ( @@ -4667,14 +4682,12 @@ /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/testlab) "DZ" = ( -/obj/structure/table/reinforced/plastitaniumglass, /obj/effect/turf_decal/tile/dark/full, -/obj/item/paper/fluff/ruins/interdyne/note_1{ - default_raw_text = "Welcome to Interdyne laboratory Developed by Wavefield Science and designed by Astra Farera E'luna Awiarera. This base was dropped like a meteorite from space and deployed at crater created by landing impact. An advanced laboratory has deployed departments, defence perimeter turrets and even external bridge. Complex also fitted with a forcefield generator, which with a tiny bit of care allows to sustain harsh environmental conditions and most of invasions. Have a nice day full of new discoveries."; - name = "Frozen Moonlight Interdyne"; - color = "#7D7D7D"; - pixel_x = 5; - pixel_y = 5 +/obj/item/disk/ammo_workbench/advanced, +/obj/machinery/module_duplicator{ + name = "Interdyne module duplicator"; + color = "#adadcd"; + light_color = "#adadcd" }, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/testlab) @@ -5275,7 +5288,9 @@ }, /obj/structure/closet/secure_closet/cytology{ anchored = 1; - pixel_x = 9 + pixel_x = 9; + locked = 0; + req_access = list("syndicate") }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -5491,11 +5506,12 @@ "IM" = ( /obj/structure/table/reinforced/plastitaniumglass, /obj/item/storage/backpack/duffelbag/syndie/surgery, -/obj/item/healthanalyzer/advanced, /obj/machinery/defibrillator_mount/loaded{ pixel_x = 28 }, /obj/effect/turf_decal/tile/dark/full, +/obj/item/autopsy_scanner, +/obj/item/healthanalyzer/advanced, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/medbay) "IP" = ( @@ -5545,6 +5561,7 @@ dir = 1 }, /obj/effect/turf_decal/caution/stand_clear/red, +/obj/structure/cable, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/cargo) "JP" = ( @@ -5576,16 +5593,17 @@ /obj/effect/turf_decal/box/red/corners{ dir = 8 }, +/obj/structure/cable, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/cargo) "Kg" = ( -/obj/machinery/stasis{ - dir = 8 - }, /obj/effect/turf_decal/tile/dark/full, /obj/effect/turf_decal/stripes/blue{ dir = 1 }, +/obj/machinery/stasis{ + dir = 8 + }, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/medbay) "Kl" = ( @@ -5682,14 +5700,14 @@ /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/main) "KP" = ( -/obj/structure/table/reinforced/plastitaniumglass, -/obj/item/paper_bin{ - pixel_y = 4 - }, -/obj/item/pen{ - pixel_y = 4 - }, /obj/effect/turf_decal/tile/dark/full, +/obj/machinery/vending/medical/syndicate_access{ + onstation = 0; + contraband = list(/obj/item/storage/box/gum/happiness=3, /obj/item/storage/box/hug/medical=3, /obj/item/mmi/syndie/interdyne=3); + extended_inventory = 1; + color = "#adadcd"; + light_color = "#adadcd" + }, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/medbay) "KS" = ( @@ -5914,9 +5932,9 @@ /area/ruin/syndicate_lava_base/medbay) "LP" = ( /obj/effect/turf_decal/tile/dark/full, -/obj/machinery/processor{ +/obj/machinery/processor/slime{ + name = "Interdyne slime processor"; color = "#adadcd"; - name = "Interdyne food processor"; light_color = "#adadcd" }, /turf/open/floor/iron/dark/textured_large, @@ -5942,12 +5960,6 @@ name = "Inderdyne security camera"; network = list("Interdyne") }, -/obj/vehicle/ridden/atv/snowmobile/syndicate{ - dir = 8; - name = "Interdyne Crawler"; - color = "#adadcd"; - light_color = "#adadcd" - }, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/cargo) "Mc" = ( @@ -5984,15 +5996,15 @@ /turf/open/floor/engine, /area/ruin/syndicate_lava_base/testlab) "Mt" = ( -/obj/machinery/stasis{ - dir = 8 - }, /obj/effect/turf_decal/tile/dark/full, /obj/structure/marker_beacon/teal, /obj/structure/curtain/bounty{ color = "#7d7d7d"; alpha = 180 }, +/obj/machinery/stasis{ + dir = 8 + }, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/medbay) "Mu" = ( @@ -6092,6 +6104,8 @@ pixel_y = 8 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/item/storage/backpack/duffelbag/synth_treatment_kit/trauma/advanced/unzipped, +/obj/item/healthanalyzer/advanced, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/medbay) "Nv" = ( @@ -6148,6 +6162,13 @@ /obj/structure/ore_box, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/cargo) +"NM" = ( +/obj/effect/turf_decal/siding/wood/corner, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/wood/large, +/area/ruin/syndicate_lava_base/main) "NS" = ( /obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, /obj/machinery/door/poddoor{ @@ -6304,6 +6325,7 @@ /area/ruin/syndicate_lava_base/medbay) "OV" = ( /obj/structure/table/wood/fancy/black, +/obj/item/food/chips/shrimp, /turf/open/floor/wood/large, /area/ruin/syndicate_lava_base/bar) "Pc" = ( @@ -6463,6 +6485,7 @@ /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/main) "PO" = ( +/obj/structure/cable, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/cargo) "PQ" = ( @@ -6590,15 +6613,15 @@ /obj/effect/turf_decal/stripes/red/corner{ dir = 1 }, -/obj/machinery/stasis{ - dir = 8 - }, /obj/effect/turf_decal/tile/dark/full, /obj/structure/marker_beacon/teal, /obj/structure/curtain/bounty{ color = "#7d7d7d"; alpha = 180 }, +/obj/machinery/stasis{ + dir = 8 + }, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/medbay) "RQ" = ( @@ -6639,6 +6662,7 @@ /obj/effect/turf_decal/tile/dark/full, /obj/item/gun/energy/plasmacutter, /obj/item/gun/energy/plasmacutter, +/obj/item/binoculars, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/cargo) "Sd" = ( @@ -7109,7 +7133,8 @@ /area/ruin/syndicate_lava_base/main) "Vr" = ( /obj/machinery/vending/wardrobe/syndie_wardrobe{ - onstation = 0 + onstation = 0; + extended_inventory = 1 }, /obj/structure/marker_beacon/burgundy, /obj/effect/turf_decal/tile/dark/full, @@ -7251,11 +7276,11 @@ name = "Interdyne Storm Shutters RnD" }, /obj/machinery/fax{ - fax_name = "Interdyne Pharmaceuticals"; - pixel_y = 7; + fax_name = "Interdyne Fax"; name = "Interdyne Fax Machine"; - color = "#adadcd"; - light_color = "#adadcd" + pixel_y = 7; + syndicate_network = 1; + color = "#adadcd" }, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/testlab) @@ -7490,7 +7515,8 @@ }, /obj/structure/marker_beacon/olive, /obj/machinery/computer/cryopod/interdyne/directional/west{ - pixel_x = -18 + pixel_x = -18; + req_one_access = list("syndicate") }, /obj/effect/turf_decal/trimline/dark/filled/end{ dir = 8 @@ -7913,7 +7939,7 @@ /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/main) "ZL" = ( -/obj/machinery/portable_atmospherics/canister/plasma, +/obj/machinery/portable_atmospherics/canister/oxygen, /turf/open/floor/catwalk_floor/iron_dark, /area/ruin/syndicate_lava_base/main) "ZN" = ( @@ -8037,7 +8063,7 @@ ac ac SH Iy -Iy +eE Im ac ac @@ -8171,7 +8197,7 @@ uQ Iy Iy Se -Iy +eE Im Iy ac @@ -8280,7 +8306,7 @@ ab ab Iy Se -Iy +ab ab ab ab @@ -9111,7 +9137,7 @@ pI xc Uo Tm -cu +NM Yf rv us @@ -9229,7 +9255,7 @@ Pr Pr VP lc -eZ +VP ZU ZU ZU @@ -9305,7 +9331,7 @@ td ab ab Iy -Iy +eE ac ac "} @@ -9753,7 +9779,7 @@ qe aA JA Oz -tv +Pr yy dm rg @@ -9819,7 +9845,7 @@ Pr Pr VP lc -eZ +VP ZU ZU ZU @@ -9849,7 +9875,7 @@ eE Iy eE Iy -Iy +ab ab ab ab @@ -9857,7 +9883,7 @@ SH cS wr BE -yQ +BE um yQ yQ @@ -10200,7 +10226,7 @@ aa ac ac Iy -Iy +eE Se Iy SH @@ -10424,7 +10450,7 @@ ab Iy Se Se -Iy +eE ac ac ac @@ -10537,7 +10563,7 @@ ab ab ab ab -ab +Iy Iy SH Iy @@ -10592,9 +10618,9 @@ SM ab ab ab +ab Iy Iy -ab Iy Iy Iy @@ -10642,8 +10668,8 @@ Iy ab ab ab -ab -ab +Iy +SH ab ab ab @@ -10870,8 +10896,8 @@ Se Se Iy Iy -ab -ab +Iy +Iy ab ab ab @@ -10879,7 +10905,7 @@ dM Iy Iy SH -Iy +on Se Iy dM @@ -10937,13 +10963,13 @@ ac ac SH Jx -Iy -Im -lb +eE +eZ +tv ac Se Se -Iy +eE ac ac ac diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_plasma_facility.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_plasma_facility.dmm index 865695e5b33..356bed29f9f 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_plasma_facility.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_plasma_facility.dmm @@ -1016,7 +1016,7 @@ /area/ruin/plasma_facility/commons) "pE" = ( /obj/structure/bed/maint, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/item/flashlight/flare/candle{ pixel_x = 12; pixel_y = 9 diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm index c2b11194dfb..97b4e3d53c9 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm @@ -40,7 +40,7 @@ "fD" = ( /obj/structure/bed, /obj/effect/decal/cleanable/blood/bubblegum, -/obj/item/bedsheet/random, +/obj/effect/spawner/random/bedsheet/any, /turf/open/floor/wood, /area/ruin/powered) "gG" = ( @@ -416,7 +416,7 @@ /obj/structure/bed{ dir = 4 }, -/obj/item/bedsheet/random{ +/obj/effect/spawner/random/bedsheet/any{ dir = 4 }, /turf/open/floor/wood, diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_frozen_comms.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_frozen_comms.dmm index 25f29890f45..eb537cd26f6 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_frozen_comms.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_frozen_comms.dmm @@ -63,7 +63,7 @@ "oj" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/bed, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /turf/open/floor/iron/grimy{ initial_gas_mix = "ICEMOON_ATMOS" }, diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_mailroom.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_mailroom.dmm index 91ab82e4be2..05d5324cac0 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_mailroom.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_mailroom.dmm @@ -113,7 +113,7 @@ /area/ruin/powered/mailroom) "kZ" = ( /obj/structure/filingcabinet/chestdrawer/wheeled, -/obj/item/valentine, +/obj/item/paper/valentine, /obj/item/grenade/c4, /obj/item/clothing/accessory/medal/conduct, /obj/item/paper/crumpled/muddy/fluff/instructions, diff --git a/_maps/RandomRuins/IceRuins/nova/icemoon_underground_interdyne_base1.dmm b/_maps/RandomRuins/IceRuins/nova/icemoon_underground_interdyne_base1.dmm index acc7e1dc990..b4c408c4c0c 100644 --- a/_maps/RandomRuins/IceRuins/nova/icemoon_underground_interdyne_base1.dmm +++ b/_maps/RandomRuins/IceRuins/nova/icemoon_underground_interdyne_base1.dmm @@ -320,7 +320,7 @@ /area/ruin/interdyne_planetary_base/cargo) "ba" = ( /obj/structure/bed, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /turf/open/floor/iron/smooth_large, /area/ruin/interdyne_planetary_base/cargo) "bb" = ( @@ -1587,7 +1587,7 @@ }, /obj/item/serviette_used, /obj/item/shard/plastitanium, -/obj/item/valentine, +/obj/item/paper/valentine, /obj/machinery/light/small/directional/west, /obj/item/trash/ready_donk, /turf/open/floor/plating/reinforced, @@ -4564,13 +4564,13 @@ /turf/closed/wall/r_wall/syndicate/nodiagonal, /area/ruin/interdyne_planetary_base/main/dorms) "lw" = ( -/obj/item/bedsheet/dorms{ - dir = 4 - }, /obj/structure/bed{ dir = 4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/spawner/random/bedsheet{ + dir = 4 + }, /turf/open/floor/iron/smooth_large, /area/ruin/interdyne_planetary_base/main/dorms) "lx" = ( diff --git a/_maps/RandomRuins/LavaRuins/fluffy/lavaland_interdyne_base_ff.dmm b/_maps/RandomRuins/LavaRuins/fluffy/lavaland_interdyne_base_ff.dmm index 599db87e83a..acf85539c72 100644 --- a/_maps/RandomRuins/LavaRuins/fluffy/lavaland_interdyne_base_ff.dmm +++ b/_maps/RandomRuins/LavaRuins/fluffy/lavaland_interdyne_base_ff.dmm @@ -60,6 +60,8 @@ pixel_y = 8 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/item/storage/backpack/duffelbag/synth_treatment_kit/trauma/advanced/unzipped, +/obj/item/healthanalyzer/advanced, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/medbay) "az" = ( @@ -90,7 +92,9 @@ }, /obj/structure/closet/secure_closet/cytology{ anchored = 1; - pixel_x = 9 + pixel_x = 9; + locked = 0; + req_access = list("syndicate") }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -222,7 +226,10 @@ /obj/structure/marker_beacon/burgundy, /obj/structure/sign/poster/contraband/soviet_propaganda/directional/east, /obj/effect/turf_decal/tile/dark/full, -/obj/machinery/suit_storage_unit/syndicate/chameleon, +/obj/machinery/suit_storage_unit/syndicate/chameleon{ + color = "#adadcd"; + light_color = "#adadcd" + }, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/main) "bx" = ( @@ -330,7 +337,7 @@ }, /obj/item/paper/fluff/ruins/interdyne/note_1{ name = "Forcefield Generator Maintenance"; - default_raw_text = "To activate a deployable laboratory forcefield, open maintenance hatches of Generator itself, Relay, Well and Charger nodes with a screwdriver and upgrade them with provided parts by using rapid parts exchange device. Then close all hatches and activate every module of generator, by starting with closer to generator nodes in chain-like way. When preparations are done, set generator radius at maximum and press power button. If shield will recieve overwhelm damage, it requires some time to recharge and have to be turned back on manually." + default_raw_text = "To activate Frozen Moonlight's forcefield, open maintenance hatches of the generator itself, Relay, Well and Charger nodes with a screwdriver and upgrade them with provided parts by using a rapid parts exchange device. Then, close all hatches and, by using a multitool, activate every module of the generator in a chain-like way. When preparations are done, set the generator's radius at maximum and press the power button. If the forcefield sustains overwhelming damage, it will require some time to recharge and has to be turned back on manually. Wavefield Science wishes you a safe and productive day." }, /obj/effect/turf_decal/trimline/dark/filled/corner{ dir = 8 @@ -841,7 +848,8 @@ /area/ruin/syndicate_lava_base/cargo) "fn" = ( /obj/machinery/vending/dorms{ - onstation = 0 + onstation = 0; + extended_inventory = 1 }, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/main) @@ -1064,6 +1072,9 @@ /obj/effect/turf_decal/stripes/red/line, /obj/effect/turf_decal/tile/dark/full, /obj/structure/rack/shelf, +/obj/structure/window/reinforced/survival_pod/spawner/directional/south{ + pixel_y = -4 + }, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/arrivals) "hf" = ( @@ -1318,9 +1329,9 @@ dir = 5 }, /obj/structure/marker_beacon/violet, -/obj/structure/curtain/bounty/start_closed{ - alpha = 180; - color = "#7d7d7d" +/obj/structure/curtain/bounty{ + color = "#7d7d7d"; + alpha = 180 }, /turf/open/floor/iron/dark/small, /area/ruin/syndicate_lava_base/dormitories) @@ -1523,8 +1534,9 @@ /obj/item/clothing/mask/gas/syndicate, /obj/structure/marker_beacon/burgundy, /obj/structure/sign/poster/contraband/communist_state/directional/west, -/obj/item/gun/ballistic/rifle/sniper_rifle, /obj/effect/turf_decal/tile/dark/full, +/obj/item/gun/ballistic/rifle/sniper_rifle, +/obj/item/gun/ballistic/rifle/sniper_rifle, /obj/item/modular_computer/laptop/preset/syndicate, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/main) @@ -1792,9 +1804,9 @@ /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/medbay) "lh" = ( -/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, -/turf/open/floor/iron/dark/textured_large, -/area/ruin/syndicate_lava_base/main) +/obj/item/chair, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) "lq" = ( /obj/machinery/atmospherics/components/unary/passive_vent{ dir = 4 @@ -1854,6 +1866,7 @@ pixel_y = 42 }, /obj/structure/cable, +/obj/effect/mapping_helpers/apc/syndicate_access, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/cargo) "lH" = ( @@ -1951,6 +1964,7 @@ /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/testlab) "mj" = ( +/obj/structure/cable, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/cargo) "mo" = ( @@ -1964,14 +1978,8 @@ /obj/machinery/light/directional/south{ light_color = "#5148A6" }, -/obj/item/storage/box/nif_ghost_box/ghost_role, -/obj/item/storage/box/nif_ghost_box/ghost_role, -/obj/item/storage/box/nif_ghost_box/ghost_role, -/obj/item/storage/box/nif_ghost_box/ghost_role, -/obj/item/storage/box/nif_ghost_box/ghost_role, -/obj/item/storage/box/nif_ghost_box/ghost_role, -/obj/item/storage/box/nif_ghost_box/ghost_role, -/obj/item/storage/box/nif_ghost_box/ghost_role, +/obj/item/gun/syringe/rapidsyringe, +/obj/item/gun/syringe/rapidsyringe, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/testlab) "mE" = ( @@ -2063,13 +2071,13 @@ /turf/open/floor/iron/dark/textured, /area/ruin/syndicate_lava_base/bar) "nm" = ( -/obj/machinery/stasis{ - dir = 8 - }, /obj/effect/turf_decal/tile/dark/full, /obj/effect/turf_decal/stripes/blue{ dir = 1 }, +/obj/machinery/stasis{ + dir = 8 + }, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/medbay) "no" = ( @@ -2141,11 +2149,12 @@ "nC" = ( /obj/structure/table/reinforced/plastitaniumglass, /obj/item/storage/backpack/duffelbag/syndie/surgery, -/obj/item/healthanalyzer/advanced, /obj/machinery/defibrillator_mount/loaded{ pixel_x = 28 }, /obj/effect/turf_decal/tile/dark/full, +/obj/item/autopsy_scanner, +/obj/item/healthanalyzer/advanced, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/medbay) "nE" = ( @@ -2221,10 +2230,6 @@ /obj/structure/lattice/catwalk/mining, /turf/open/lava/smooth/lava_land_surface, /area/lavaland/surface/outdoors) -"om" = ( -/obj/item/binoculars, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) "on" = ( /obj/effect/turf_decal/stripes/red/line{ dir = 5 @@ -2354,7 +2359,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 }, -/obj/structure/cable, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/main) "oT" = ( @@ -2680,12 +2684,6 @@ name = "Inderdyne security camera"; network = list("Interdyne") }, -/obj/vehicle/ridden/atv/snowmobile/syndicate{ - dir = 8; - name = "Interdyne Crawler"; - color = "#adadcd"; - light_color = "#adadcd" - }, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/cargo) "qR" = ( @@ -2713,7 +2711,8 @@ }, /obj/effect/mapping_helpers/airlock/access/all/syndicate/general, /obj/machinery/door/airlock{ - name = "Unisex Showers" + name = "Unisex Showers"; + id_tag = "IDyneWC" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -3068,11 +3067,11 @@ name = "Interdyne Storm Shutters RnD" }, /obj/machinery/fax{ - fax_name = "Interdyne Pharmaceuticals"; - pixel_y = 7; + fax_name = "Interdyne Fax"; name = "Interdyne Fax Machine"; - color = "#adadcd"; - light_color = "#adadcd" + pixel_y = 7; + syndicate_network = 1; + color = "#adadcd" }, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/testlab) @@ -3090,13 +3089,14 @@ /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/testlab) "ul" = ( -/obj/machinery/computer/crew/syndie{ - dir = 4; - pixel_x = -4; - name = "Interdyne crew monitoring console" - }, /obj/effect/turf_decal/tile/dark/full, -/obj/structure/marker_beacon/olive, +/obj/machinery/vending/drugs{ + name = "\improper SyndiDrug Plus"; + onstation = 0; + extended_inventory = 1; + color = "#adadcd"; + light_color = "#adadcd" + }, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/medbay) "ur" = ( @@ -3690,6 +3690,7 @@ map_pad_link_id = "ds2"; name = "quantum pad to DS-2" }, +/obj/structure/cable, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/cargo) "yc" = ( @@ -4094,7 +4095,8 @@ }, /obj/structure/marker_beacon/olive, /obj/machinery/computer/cryopod/interdyne/directional/west{ - pixel_x = -18 + pixel_x = -18; + req_one_access = list("syndicate") }, /obj/effect/turf_decal/trimline/dark/filled/end{ dir = 8 @@ -4447,8 +4449,6 @@ "DK" = ( /obj/structure/rack/shelf, /obj/effect/turf_decal/tile/dark/full, -/obj/item/gun/syringe/rapidsyringe, -/obj/item/gun/syringe/rapidsyringe, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/testlab) "DM" = ( @@ -4589,6 +4589,7 @@ dir = 1 }, /obj/effect/turf_decal/caution/stand_clear/red, +/obj/structure/cable, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/cargo) "El" = ( @@ -5333,9 +5334,9 @@ /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/cargo) "Jh" = ( -/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, -/turf/open/floor/plating/reinforced, -/area/ruin/syndicate_lava_base/main) +/obj/item/serviette_pack, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) "Jm" = ( /obj/effect/turf_decal/trimline/dark/filled/line{ dir = 1 @@ -5440,14 +5441,12 @@ /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/testlab) "JM" = ( -/obj/structure/table/reinforced/plastitaniumglass, /obj/effect/turf_decal/tile/dark/full, -/obj/item/paper/fluff/ruins/interdyne/note_1{ - default_raw_text = "Welcome to Interdyne laboratory Developed by Wavefield Science and designed by Astra Farera E'luna Awiarera. This base was dropped like a meteorite from space and deployed at crater created by landing impact. An advanced laboratory has deployed departments, defence perimeter turrets and even external bridge. Complex also fitted with a forcefield generator, which with a tiny bit of care allows to sustain harsh environmental conditions and most of invasions. Have a nice day full of new discoveries."; - name = "Frozen Moonlight Interdyne"; - color = "#7D7D7D"; - pixel_x = 5; - pixel_y = 5 +/obj/item/disk/ammo_workbench/advanced, +/obj/machinery/module_duplicator{ + name = "Interdyne module duplicator"; + color = "#adadcd"; + light_color = "#adadcd" }, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/testlab) @@ -5875,7 +5874,7 @@ /obj/structure/window/reinforced/survival_pod/spawner/directional/west{ pixel_x = -4 }, -/obj/machinery/portable_atmospherics/canister/air, +/obj/machinery/portable_atmospherics/canister/plasma, /turf/open/floor/catwalk_floor/iron_dark, /area/ruin/syndicate_lava_base/main) "Mo" = ( @@ -5896,9 +5895,9 @@ /area/ruin/syndicate_lava_base/bar) "Mp" = ( /obj/effect/turf_decal/tile/dark/full, -/obj/machinery/processor{ +/obj/machinery/processor/slime{ + name = "Interdyne slime processor"; color = "#adadcd"; - name = "Interdyne food processor"; light_color = "#adadcd" }, /turf/open/floor/iron/dark/textured_large, @@ -6082,6 +6081,9 @@ /obj/effect/turf_decal/trimline/dark/filled/corner{ dir = 1 }, +/obj/effect/turf_decal/stripes/red/corner{ + dir = 1 + }, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/cargo) "ND" = ( @@ -6103,6 +6105,7 @@ pixel_y = -4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/structure/reagent_dispensers/watertank/high, /turf/open/floor/catwalk_floor/iron_dark, /area/ruin/syndicate_lava_base/main) "NR" = ( @@ -6111,7 +6114,8 @@ /area/ruin/syndicate_lava_base/main) "NU" = ( /obj/machinery/vending/wardrobe/syndie_wardrobe{ - onstation = 0 + onstation = 0; + extended_inventory = 1 }, /obj/structure/marker_beacon/burgundy, /obj/effect/turf_decal/tile/dark/full, @@ -6279,18 +6283,19 @@ /obj/effect/turf_decal/tile/dark/full, /obj/item/gun/energy/plasmacutter, /obj/item/gun/energy/plasmacutter, +/obj/item/binoculars, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/cargo) "OX" = ( -/obj/machinery/stasis{ - dir = 8 - }, /obj/effect/turf_decal/tile/dark/full, /obj/structure/marker_beacon/teal, /obj/structure/curtain/bounty{ color = "#7d7d7d"; alpha = 180 }, +/obj/machinery/stasis{ + dir = 8 + }, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/medbay) "Pb" = ( @@ -6302,6 +6307,7 @@ /area/ruin/syndicate_lava_base/main) "Pd" = ( /obj/effect/turf_decal/stripes/red/line, +/obj/structure/cable, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/cargo) "Pe" = ( @@ -6414,6 +6420,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/grass, /area/ruin/syndicate_lava_base/main) +"PC" = ( +/obj/item/binoculars, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) "PD" = ( /obj/structure/marker_beacon/teal, /obj/structure/fans/tiny/forcefield, @@ -6831,13 +6841,14 @@ /turf/open/floor/plating/reinforced, /area/ruin/syndicate_lava_base/medbay) "So" = ( -/obj/structure/table/reinforced/plastitaniumglass, -/obj/item/storage/backpack/duffelbag/synth_treatment_kit/trauma/advanced/unzipped, -/obj/item/healthanalyzer/advanced, /obj/effect/turf_decal/tile/dark/full, /obj/structure/window/reinforced/survival_pod/spawner/directional/east{ pixel_x = 4 }, +/obj/structure/marker_beacon/olive, +/obj/machinery/computer/crew/syndie{ + dir = 8 + }, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/medbay) "Sq" = ( @@ -6866,6 +6877,7 @@ /area/ruin/syndicate_lava_base/arrivals) "Sw" = ( /obj/structure/table/wood/fancy/black, +/obj/item/food/chips/shrimp, /turf/open/floor/wood/large, /area/ruin/syndicate_lava_base/bar) "Sz" = ( @@ -6945,6 +6957,7 @@ /obj/effect/turf_decal/box/red/corners{ dir = 8 }, +/obj/structure/cable, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/cargo) "SZ" = ( @@ -6968,8 +6981,12 @@ /obj/structure/marker_beacon/burgundy, /obj/structure/sign/flag/syndicate/directional/north, /obj/effect/turf_decal/tile/dark/full, -/obj/machinery/ammo_workbench, -/obj/item/disk/ammo_workbench/advanced, +/obj/machinery/blackbox_recorder{ + name = "Interdyne Blackbox Recorder"; + desc = "Machine that contains lots of confidential Syndicate and Wavefield Science data."; + color = "#adadcd"; + light_color = "#adadcd" + }, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/main) "Tl" = ( @@ -7138,10 +7155,9 @@ /area/ruin/syndicate_lava_base/dormitories) "UB" = ( /obj/effect/turf_decal/tile/dark/full, -/obj/machinery/module_duplicator{ - name = "Interdyne module duplicator"; - color = "#adadcd"; - light_color = "#adadcd" +/obj/machinery/ammo_workbench{ + name = "Interdyne ammunitions workbench"; + color = "#adadcd" }, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/testlab) @@ -7358,14 +7374,14 @@ /turf/open/floor/engine, /area/ruin/syndicate_lava_base/testlab) "VY" = ( -/obj/structure/table/reinforced/plastitaniumglass, -/obj/item/paper_bin{ - pixel_y = 4 - }, -/obj/item/pen{ - pixel_y = 4 - }, /obj/effect/turf_decal/tile/dark/full, +/obj/machinery/vending/medical/syndicate_access{ + onstation = 0; + contraband = list(/obj/item/storage/box/gum/happiness=3, /obj/item/storage/box/hug/medical=3, /obj/item/mmi/syndie/interdyne=3); + extended_inventory = 1; + color = "#adadcd"; + light_color = "#adadcd" + }, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/medbay) "VZ" = ( @@ -7422,15 +7438,15 @@ /obj/effect/turf_decal/stripes/red/corner{ dir = 1 }, -/obj/machinery/stasis{ - dir = 8 - }, /obj/effect/turf_decal/tile/dark/full, /obj/structure/marker_beacon/teal, /obj/structure/curtain/bounty{ color = "#7d7d7d"; alpha = 180 }, +/obj/machinery/stasis{ + dir = 8 + }, /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/medbay) "WC" = ( @@ -7675,7 +7691,7 @@ /turf/open/floor/iron/dark/textured_large, /area/ruin/syndicate_lava_base/testlab) "Xw" = ( -/obj/machinery/portable_atmospherics/canister/plasma, +/obj/machinery/portable_atmospherics/canister/oxygen, /turf/open/floor/catwalk_floor/iron_dark, /area/ruin/syndicate_lava_base/main) "Xx" = ( @@ -8180,7 +8196,7 @@ Nv Co Co fU -eO +BO eO eO eO @@ -8444,7 +8460,7 @@ eO eO eO eO -eO +BO Co Co Co @@ -8458,11 +8474,11 @@ CH Co Co ZT -BO +Jt eO eO eO -BO +Nv BO BO ZT @@ -8695,7 +8711,7 @@ eO zn uH sf -pu +BZ sf uH mo @@ -8754,8 +8770,8 @@ eO zn BZ BZ -pu -pu +BZ +BZ pu mo eO @@ -8813,7 +8829,7 @@ eO yt sf nr -pu +BZ nr sf te @@ -8871,9 +8887,9 @@ Co eO yt pu -pu -pu -pu +BZ +BZ +BZ BZ te hY @@ -8931,7 +8947,7 @@ eO oh sf nr -pu +BZ nr sf te @@ -8990,7 +9006,7 @@ eO oh pu BZ -pu +BZ BZ BZ te @@ -9049,7 +9065,7 @@ eO oh sf nr -pu +BZ nr sf Lr @@ -9109,7 +9125,7 @@ oh BZ BZ BZ -pu +BZ pu Lr eO @@ -9167,7 +9183,7 @@ eO oh uH sf -pu +BZ sf uH Lr @@ -9316,7 +9332,7 @@ Ii Ii Wf df -lh +Wf pq pq pq @@ -9684,7 +9700,7 @@ wS vS Lf kY -BO +Nv eO eO BO @@ -9840,7 +9856,7 @@ bz Xg ZB BX -Jh +Ii WG TT wa @@ -9906,7 +9922,7 @@ Ii Ii Wf df -lh +Wf pq pq pq @@ -9944,7 +9960,7 @@ ZT IN HP XU -VP +XU Ia VP VP @@ -10052,7 +10068,7 @@ BO BO BO BO -eO +BO eO eO eO @@ -10111,7 +10127,7 @@ Co BO BO ZT -eO +BO BO eO eO @@ -10350,7 +10366,7 @@ Co Co BO BO -eO +BO eO eO eO @@ -10410,8 +10426,8 @@ Co BO BO BO -eO -eO +BO +ZT eO eO eO @@ -10469,9 +10485,9 @@ Co fU BO BO -eO -eO -eO +BO +Jt +BO eO eO eO @@ -10528,9 +10544,9 @@ Co Co Nv BO -eO -eO -eO +BO +BO +ZT eO eO eO @@ -10588,8 +10604,8 @@ Co Co BO BO -eO -eO +BO +BO eO eO eO @@ -10647,9 +10663,9 @@ CH Co Co BO -eO -eO -eO +BO +BO +BO eO eO eO @@ -10708,8 +10724,8 @@ Co Co fU BO -eO -eO +BO +BO eO eO eO @@ -10729,8 +10745,8 @@ eO eO eO eO -eO -eO +BO +ZT eO eO eO @@ -10768,8 +10784,8 @@ Co Co Co BO -eO -eO +BO +BO eO eO eO @@ -10828,9 +10844,9 @@ Co Co Jt BO -eO -eO -eO +BO +BO +BO eO eO eO @@ -10889,6 +10905,9 @@ ZT Co BO BO +BO +BO +BO eO eO eO @@ -10902,11 +10921,8 @@ eO eO eO eO -eO -eO -eO -eO -eO +BO +BO eO eO eO @@ -10952,23 +10968,23 @@ fU cL ZT BO +BO +ZT eO eO +BO +ZT eO eO eO eO eO -eO -eO -eO -eO -eO -eO +BO +Jt ZT -eO -eO -eO +BO +BO +BO eO ZT BO @@ -11022,11 +11038,11 @@ BO fU Nv ZT -BO -BO -BO +PC +lh +Jh fU -om +Co BO Jt BO diff --git a/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm b/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm index 127267c24eb..42f5441e35a 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm @@ -286,7 +286,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ dir = 4 }, -/obj/item/bedsheet/dorms{ +/obj/effect/spawner/random/bedsheet{ dir = 4 }, /obj/structure/bed{ @@ -524,8 +524,8 @@ /turf/closed/wall/mineral/sandstone, /area/ruin/powered/beach) "qK" = ( -/obj/structure/closet/secure_closet/bar/lavaland_bartender_clothes, /obj/machinery/light/small/directional/east, +/obj/structure/closet/secure_closet/bar/lavaland_bartender_clothes, /turf/open/floor/wood, /area/ruin/powered/beach) "qT" = ( diff --git a/_maps/RandomRuins/LavaRuins/nova/lavaland_surface_interdyne_base1.dmm b/_maps/RandomRuins/LavaRuins/nova/lavaland_surface_interdyne_base1.dmm index 0e9b18105b1..0e4e788b379 100644 --- a/_maps/RandomRuins/LavaRuins/nova/lavaland_surface_interdyne_base1.dmm +++ b/_maps/RandomRuins/LavaRuins/nova/lavaland_surface_interdyne_base1.dmm @@ -288,7 +288,7 @@ /area/ruin/interdyne_planetary_base/cargo) "aW" = ( /obj/structure/bed, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /turf/open/floor/iron/smooth_large, /area/ruin/interdyne_planetary_base/cargo) "aX" = ( @@ -4346,12 +4346,12 @@ /area/ruin/interdyne_planetary_base/main/dorms) "kV" = ( /obj/structure/bed, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/smooth_large, /area/ruin/interdyne_planetary_base/main/dorms) "kW" = ( -/obj/item/bedsheet/dorms{ +/obj/effect/spawner/random/bedsheet{ dir = 4 }, /obj/structure/bed{ @@ -4694,7 +4694,7 @@ }, /obj/item/serviette_used, /obj/item/shard/plastitanium, -/obj/item/valentine, +/obj/item/paper/valentine, /obj/machinery/light/small/directional/west, /turf/open/floor/plating/reinforced, /area/ruin/interdyne_planetary_base/eng/disp) diff --git a/_maps/RandomRuins/SpaceRuins/DJstation/quarters_1.dmm b/_maps/RandomRuins/SpaceRuins/DJstation/quarters_1.dmm index c389af77150..dc6cea464f7 100644 --- a/_maps/RandomRuins/SpaceRuins/DJstation/quarters_1.dmm +++ b/_maps/RandomRuins/SpaceRuins/DJstation/quarters_1.dmm @@ -16,7 +16,7 @@ /area/ruin/space/djstation) "k" = ( /obj/structure/bed, -/obj/item/bedsheet/random, +/obj/effect/spawner/random/bedsheet/any, /turf/open/floor/iron/grimy, /area/ruin/space/djstation) "p" = ( @@ -41,7 +41,7 @@ /obj/structure/bed{ dir = 4 }, -/obj/item/bedsheet/random{ +/obj/effect/spawner/random/bedsheet/any{ dir = 4 }, /turf/open/floor/iron/grimy, diff --git a/_maps/RandomRuins/SpaceRuins/DJstation/quarters_4.dmm b/_maps/RandomRuins/SpaceRuins/DJstation/quarters_4.dmm index 8e632403b36..52ec466ae86 100644 --- a/_maps/RandomRuins/SpaceRuins/DJstation/quarters_4.dmm +++ b/_maps/RandomRuins/SpaceRuins/DJstation/quarters_4.dmm @@ -39,7 +39,7 @@ /turf/open/floor/iron/freezer/airless, /area/ruin/space/djstation) "x" = ( -/obj/item/bedsheet/random, +/obj/effect/spawner/random/bedsheet/any, /turf/open/floor/plating/airless, /area/ruin/space/djstation) "A" = ( diff --git a/_maps/RandomRuins/SpaceRuins/deepstorage.dmm b/_maps/RandomRuins/SpaceRuins/deepstorage.dmm index 5645ac3ef15..2c23219b7d3 100644 --- a/_maps/RandomRuins/SpaceRuins/deepstorage.dmm +++ b/_maps/RandomRuins/SpaceRuins/deepstorage.dmm @@ -1958,7 +1958,7 @@ /area/ruin/space/has_grav/deepstorage/hydroponics) "zl" = ( /obj/structure/bed/double, -/obj/item/bedsheet/dorms_double, +/obj/effect/spawner/random/bedsheet/double, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/wood, /area/ruin/space/has_grav/deepstorage/dorm) @@ -2128,7 +2128,7 @@ "Ev" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/structure/bed/double, -/obj/item/bedsheet/dorms_double, +/obj/effect/spawner/random/bedsheet/double, /turf/open/floor/wood, /area/ruin/space/has_grav/deepstorage/dorm) "EA" = ( diff --git a/_maps/RandomRuins/SpaceRuins/hellfactory.dmm b/_maps/RandomRuins/SpaceRuins/hellfactory.dmm index 9660b317c66..524e81ebb69 100644 --- a/_maps/RandomRuins/SpaceRuins/hellfactory.dmm +++ b/_maps/RandomRuins/SpaceRuins/hellfactory.dmm @@ -570,7 +570,7 @@ /area/ruin/space/has_grav/hellfactory) "cc" = ( /obj/structure/bed, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /turf/open/floor/holofloor/wood, /area/ruin/space/has_grav/hellfactory) "cd" = ( @@ -899,7 +899,7 @@ /area/ruin/space/has_grav/hellfactoryoffice) "xK" = ( /obj/structure/bed, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/effect/decal/cleanable/cobweb/cobweb2, /turf/open/floor/holofloor/wood, /area/ruin/space/has_grav/hellfactory) diff --git a/_maps/RandomRuins/SpaceRuins/hilbertresearchfacility.dmm b/_maps/RandomRuins/SpaceRuins/hilbertresearchfacility.dmm index f0e59ce224b..f9d42f8c332 100644 --- a/_maps/RandomRuins/SpaceRuins/hilbertresearchfacility.dmm +++ b/_maps/RandomRuins/SpaceRuins/hilbertresearchfacility.dmm @@ -349,7 +349,7 @@ /area/ruin/space/has_grav/powered/hilbertresearchfacility) "jt" = ( /obj/structure/bed, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /turf/open/floor/carpet/black, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "jC" = ( diff --git a/_maps/RandomRuins/SpaceRuins/nova/cargodiselost.dmm b/_maps/RandomRuins/SpaceRuins/nova/cargodiselost.dmm index 3592016d918..a4043f3f450 100644 --- a/_maps/RandomRuins/SpaceRuins/nova/cargodiselost.dmm +++ b/_maps/RandomRuins/SpaceRuins/nova/cargodiselost.dmm @@ -104,6 +104,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/smooth_half, /area/ruin/space/has_grav/cargodise_freighter/kitchen) "bM" = ( @@ -119,6 +120,10 @@ }, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/cargodise_freighter/mining) +"ca" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/cargodise_freighter/primaryhall) "cd" = ( /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 8 @@ -294,6 +299,7 @@ /obj/effect/turf_decal/tile/green/anticorner/contrasted{ dir = 1 }, +/obj/machinery/light/directional/west, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/cargodise_freighter/kitchen) "eo" = ( @@ -310,6 +316,11 @@ }, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/cargodise_freighter/quarters) +"ev" = ( +/obj/structure/lattice, +/mob, +/turf/template_noop, +/area/template_noop) "ex" = ( /obj/machinery/door/airlock/survival_pod/glass, /obj/structure/fans/tiny, @@ -384,6 +395,7 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/smooth_half{ dir = 1 }, @@ -404,6 +416,7 @@ "fS" = ( /obj/item/disk/ammo_workbench, /obj/structure/table/reinforced, +/obj/machinery/recharger, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/cargodise_freighter/vault) "fV" = ( @@ -577,6 +590,9 @@ "iT" = ( /obj/machinery/computer/cryopod/directional/south, /obj/effect/turf_decal/tile/green/half/contrasted, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/cargodise_freighter/kitchen) "iU" = ( @@ -973,6 +989,12 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/cargodise_freighter/mining) +"pu" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/cargodise_freighter/kitchen) "pv" = ( /obj/effect/turf_decal/tile/yellow/half{ dir = 1 @@ -1085,6 +1107,15 @@ /obj/item/kirbyplants/random, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/cargodise_freighter/bridge) +"rI" = ( +/obj/effect/turf_decal/tile/yellow/half{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark/smooth_half{ + dir = 1 + }, +/area/ruin/space/has_grav/cargodise_freighter/primaryhall) "rR" = ( /obj/structure/chair/comfy/shuttle{ dir = 1 @@ -1138,7 +1169,7 @@ /area/ruin/space/has_grav/cargodise_freighter/cargo) "sW" = ( /obj/structure/table/reinforced, -/obj/item/storage/medkit, +/obj/item/storage/medkit/regular, /obj/item/storage/medkit/surgery{ pixel_x = 6; pixel_y = 8 @@ -1169,6 +1200,8 @@ /obj/item/folded_navigation_gigabeacon, /obj/structure/cable, /obj/item/circuitboard/computer/powermonitor, +/obj/item/circuitboard/machine/biogenerator/food_replicator, +/obj/item/flatpacked_machine, /turf/open/floor/plating, /area/ruin/space/has_grav/cargodise_freighter/utility) "ty" = ( @@ -1198,6 +1231,11 @@ "tL" = ( /obj/effect/turf_decal/siding/wood/corner, /obj/structure/extinguisher_cabinet/directional/north, +/obj/structure/table/reinforced, +/obj/item/gun/ballistic/automatic/pistol/sol, +/obj/item/gun/energy/e_gun/mini{ + pixel_y = 5 + }, /turf/open/floor/wood/parquet, /area/ruin/space/has_grav/cargodise_freighter/quarters) "tN" = ( @@ -1219,7 +1257,7 @@ /area/ruin/space/has_grav/cargodise_freighter/primaryhall) "tW" = ( /obj/structure/bed/double, -/obj/item/bedsheet/dorms_double, +/obj/effect/spawner/random/bedsheet/double, /turf/open/floor/wood/parquet, /area/ruin/space/has_grav/cargodise_freighter/kitchen) "tY" = ( @@ -1399,9 +1437,9 @@ /turf/open/floor/iron/kitchen, /area/ruin/space/has_grav/cargodise_freighter/kitchen) "xw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/light/cold/directional/west, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/wood/parquet, /area/ruin/space/has_grav/cargodise_freighter/kitchen) "xy" = ( @@ -1562,7 +1600,7 @@ /obj/structure/bed/double{ dir = 1 }, -/obj/item/bedsheet/dorms_double{ +/obj/effect/spawner/random/bedsheet/double{ dir = 4 }, /turf/open/floor/wood/parquet, @@ -1803,6 +1841,14 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/cargodise_freighter/kitchen) +"Du" = ( +/obj/effect/turf_decal/tile/yellow/half, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark/smooth_half, +/area/ruin/space/has_grav/cargodise_freighter/primaryhall) "DE" = ( /obj/effect/turf_decal/tile/yellow/half{ dir = 4 @@ -1904,9 +1950,6 @@ "ES" = ( /obj/structure/rack/gunrack, /obj/item/gun/ballistic/automatic/lanca, -/obj/item/gun/ballistic/automatic/lanca{ - pixel_x = 3 - }, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/cargodise_freighter/vault) "Fb" = ( @@ -2011,6 +2054,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /turf/open/floor/iron/smooth, /area/ruin/space/has_grav/cargodise_freighter/utility) +"Ha" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/cargodise_freighter/kitchen) "Hi" = ( /obj/effect/turf_decal/trimline/blue/corner{ dir = 4 @@ -2276,6 +2323,7 @@ }, /area/ruin/space/has_grav/cargodise_freighter/primaryhall) "Kr" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/wood/parquet, /area/ruin/space/has_grav/cargodise_freighter/kitchen) "Kt" = ( @@ -2479,6 +2527,7 @@ "Ny" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/machinery/light/cold/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood/parquet, /area/ruin/space/has_grav/cargodise_freighter/kitchen) "NC" = ( @@ -2504,7 +2553,7 @@ /area/ruin/space/has_grav/cargodise_freighter/kitchen) "NQ" = ( /obj/structure/safe, -/obj/item/mod/module/jetpack/advanced, +/obj/item/mod/module/jetpack, /obj/item/mod/control/pre_equipped/standard, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/cargodise_freighter/vault) @@ -2594,14 +2643,12 @@ "OY" = ( /obj/structure/rack/gunrack, /obj/item/gun/ballistic/rifle/boltaction, -/obj/item/gun/ballistic/rifle/boltaction{ - pixel_x = 3 - }, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/cargodise_freighter/vault) "Pa" = ( /obj/machinery/shower/directional/south, /obj/item/soap, +/obj/machinery/light/directional/east, /turf/open/floor/iron/white, /area/ruin/space/has_grav/cargodise_freighter/kitchen) "Pe" = ( @@ -3800,7 +3847,7 @@ Gh Gh Gh JQ -Ef +ev Ef Ef Yr @@ -4543,7 +4590,7 @@ vH Gg By ty -Da +pu Da Df Da @@ -4552,7 +4599,7 @@ iX Gg EC tV -qS +Du Hv ci TC @@ -4628,8 +4675,8 @@ FT FT FT JC -Da -Da +pu +Ha IP Gg UL @@ -4681,7 +4728,7 @@ Hv eC HJ Hv -Wk +ca Wk ex Gh @@ -4845,7 +4892,7 @@ DE gY BF WY -Lp +rI Lp YT kF diff --git a/_maps/RandomRuins/SpaceRuins/nova/piratefort.dmm b/_maps/RandomRuins/SpaceRuins/nova/piratefort.dmm index e79f5902d5d..b0770c8277a 100644 --- a/_maps/RandomRuins/SpaceRuins/nova/piratefort.dmm +++ b/_maps/RandomRuins/SpaceRuins/nova/piratefort.dmm @@ -688,7 +688,7 @@ /area/ruin/space/has_grav/powered) "wR" = ( /obj/structure/bed, -/obj/item/bedsheet/random, +/obj/effect/spawner/random/bedsheet/any, /turf/open/floor/wood, /area/ruin/space/has_grav/powered) "wT" = ( diff --git a/_maps/RandomRuins/SpaceRuins/nova/port_tarkon.dmm b/_maps/RandomRuins/SpaceRuins/nova/port_tarkon.dmm index 5752de76860..be2c41b1eb8 100644 --- a/_maps/RandomRuins/SpaceRuins/nova/port_tarkon.dmm +++ b/_maps/RandomRuins/SpaceRuins/nova/port_tarkon.dmm @@ -32,9 +32,6 @@ "al" = ( /obj/structure/table/reinforced, /obj/item/clothing/gloves/color/yellow, -/obj/item/paper/fluff/ruins/oldstation/generator_manual, -/obj/item/wirecutters, -/obj/item/wrench, /obj/structure/cable, /turf/open/floor/plating, /area/ruin/space/has_grav/port_tarkon/power1) @@ -111,12 +108,11 @@ /obj/effect/mapping_helpers/apc/unlocked, /obj/structure/cable, /obj/structure/closet/crate/radiation, -/obj/item/stack/sheet/mineral/uranium/five, -/obj/item/stack/sheet/mineral/uranium/five, /obj/effect/mapping_helpers/apc/cell_10k, /obj/effect/turf_decal/tile/yellow/half{ dir = 1 }, +/obj/item/stack/sheet/mineral/uranium/half, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/atmos) "aR" = ( @@ -132,6 +128,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/ruin/space/has_grav/port_tarkon/centerhall) +"aW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/alien/resin/wall, +/obj/structure/disposalpipe/segment, +/obj/machinery/camera/tarkon/directional/west, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/porthall) "aY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/yellow/half{ @@ -162,7 +167,7 @@ dir = 4 }, /obj/machinery/button/polarizer{ - id = "tarkondisects"; + id = "tarkondisect"; pixel_x = 31 }, /turf/open/floor/iron/dark, @@ -189,9 +194,7 @@ /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/forehall) "bl" = ( -/obj/machinery/door/window/brigdoor/security/cell/left/directional/south{ - req_access = list("tarkon") - }, +/obj/machinery/door/window/brigdoor/tarkon/left/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/poddoor/shutters{ @@ -328,8 +331,14 @@ /obj/item/storage/backpack/security/redsec, /obj/item/clothing/head/utility/welding/hat, /obj/item/clothing/head/utility/welding/hat, +/obj/machinery/camera/tarkon/directional/east, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon) +"cq" = ( +/obj/machinery/recharge_station, +/obj/machinery/camera/tarkon/directional/south, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/centerhall) "ct" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -436,6 +445,13 @@ /obj/machinery/atmospherics/miner/plasma, /turf/open/floor/engine/plasma, /area/ruin/space/has_grav/port_tarkon/atmos) +"dc" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/camera/tarkon/directional/south, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/forehall) "dd" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, @@ -487,6 +503,7 @@ /obj/effect/turf_decal/tile/brown/anticorner{ dir = 4 }, +/obj/machinery/camera/tarkon/directional/east, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/storage) "dv" = ( @@ -574,6 +591,7 @@ /obj/effect/turf_decal/tile/yellow/half{ dir = 8 }, +/obj/machinery/camera/tarkon/directional/west, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/toolstorage) "dV" = ( @@ -601,6 +619,7 @@ /area/ruin/space/has_grav/port_tarkon/centerhall) "ex" = ( /obj/effect/turf_decal/tile/brown/anticorner, +/obj/machinery/camera/tarkon/directional/east, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/storage) "ey" = ( @@ -700,6 +719,10 @@ /obj/structure/trash_pile, /turf/open/floor/plating, /area/ruin/space/has_grav/port_tarkon/centerhall) +"fd" = ( +/obj/machinery/camera/tarkon/directional/east, +/turf/open/floor/wood/large, +/area/ruin/space/has_grav/port_tarkon/dorms) "fe" = ( /obj/machinery/computer/atmos_control/tarkon/incinerator{ dir = 1 @@ -824,6 +847,7 @@ /obj/effect/turf_decal/tile/red/real_red/half{ dir = 1 }, +/obj/machinery/camera/tarkon/directional/north, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/starboardhall) "gb" = ( @@ -843,7 +867,7 @@ /area/ruin/space/has_grav/port_tarkon/kitchen) "gm" = ( /obj/machinery/door/airlock/engineering{ - name = "Backup Generator Room" + name = "Backup Power Storage" }, /obj/structure/cable, /turf/open/floor/iron, @@ -884,6 +908,7 @@ /obj/effect/turf_decal/tile/yellow/anticorner{ dir = 4 }, +/obj/machinery/camera/tarkon/directional/north, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/toolstorage) "gE" = ( @@ -913,6 +938,17 @@ }, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/cargo) +"gN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/effect/turf_decal/tile/blue/half{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/camera/tarkon/directional/east, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/afthall) "gR" = ( /obj/machinery/power/smes/engineering{ charge = 0 @@ -961,6 +997,7 @@ /obj/structure/rack, /obj/item/stock_parts/cell/high, /obj/item/stock_parts/cell/high, +/obj/machinery/camera/tarkon/directional/north, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/power1) "hc" = ( @@ -975,6 +1012,7 @@ /obj/effect/turf_decal/tile/blue/anticorner{ dir = 1 }, +/obj/machinery/camera/tarkon/directional/west, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/trauma) "hh" = ( @@ -1027,9 +1065,7 @@ /obj/effect/turf_decal/tile/purple/half{ dir = 1 }, -/obj/machinery/computer/camera_advanced/xenobio{ - networks = list("tarkon") - }, +/obj/machinery/computer/camera_advanced/xenobio/tarkon, /obj/machinery/button/door{ id = "ptxeno"; name = "shutter controls"; @@ -1124,10 +1160,8 @@ /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/centerhall) "ig" = ( -/obj/machinery/computer{ - desc = "A computer long since rendered non-functional due to lack of maintenance. Spitting out error messages."; - dir = 8; - name = "Financing Console" +/obj/machinery/modular_computer/console{ + dir = 8 }, /obj/effect/turf_decal/tile/brown/anticorner{ dir = 4 @@ -1311,6 +1345,7 @@ /obj/effect/turf_decal/tile/brown/half{ dir = 1 }, +/obj/machinery/camera/tarkon/directional/north, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/mining) "jL" = ( @@ -1333,6 +1368,10 @@ /obj/machinery/biogenerator, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/garden) +"jT" = ( +/obj/machinery/camera/tarkon/directional/north, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/forehall) "jV" = ( /obj/effect/turf_decal/sand/plating, /obj/structure/cable, @@ -1355,6 +1394,7 @@ "jZ" = ( /obj/effect/turf_decal/sand, /obj/machinery/light/small/directional/east, +/obj/machinery/camera/tarkon/directional/north, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/mining) "kc" = ( @@ -1450,10 +1490,13 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/forehall) +"kJ" = ( +/turf/template_noop, +/area/ruin/space/has_grav/outdoors) "kN" = ( /obj/structure/table/reinforced, -/obj/machinery/door/window/brigdoor/left/directional/south, -/obj/machinery/door/window/brigdoor/left/directional/north, +/obj/machinery/door/window/brigdoor/tarkon/right/directional/south, +/obj/machinery/door/window/brigdoor/tarkon/left/directional/north, /obj/item/paper_bin{ pixel_x = 7 }, @@ -1620,6 +1663,7 @@ /obj/effect/turf_decal/tile/neutral/half{ dir = 1 }, +/obj/machinery/camera/tarkon/directional/north, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/centerhall) "lM" = ( @@ -1673,6 +1717,10 @@ }, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/mining) +"mb" = ( +/obj/machinery/camera/tarkon/directional/west, +/turf/closed/wall, +/area/ruin/space/has_grav/port_tarkon/power1) "mc" = ( /obj/effect/turf_decal/sand/plating, /obj/effect/turf_decal/tile/brown, @@ -1708,9 +1756,7 @@ /area/ruin/space/has_grav/port_tarkon/developement) "mh" = ( /obj/structure/cable, -/obj/machinery/door/window/brigdoor/right/directional/south{ - req_access = list("tarkon") - }, +/obj/machinery/door/window/brigdoor/tarkon/left/directional/south, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/power1) "mi" = ( @@ -1883,6 +1929,8 @@ /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/storage) "ne" = ( +/obj/machinery/power/terminal, +/obj/structure/cable, /turf/open/floor/plating, /area/ruin/space/has_grav/port_tarkon/power1) "nh" = ( @@ -1911,6 +1959,7 @@ /obj/structure/closet/radiation, /obj/item/clothing/head/utility/radiation, /obj/item/clothing/suit/utility/radiation, +/obj/machinery/camera/tarkon/directional/south, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/port_tarkon/atmos) "nr" = ( @@ -1921,6 +1970,7 @@ /obj/item/storage/part_replacer/cargo, /obj/structure/noticeboard/directional/east, /obj/item/paper/fluff/ruins/tarkon/scisafe, +/obj/machinery/camera/tarkon/directional/east, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/port_tarkon/developement) "ns" = ( @@ -2070,6 +2120,11 @@ }, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/starboardhall) +"oA" = ( +/obj/effect/turf_decal/tile/neutral/half, +/obj/machinery/camera/tarkon/directional/south, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) "oE" = ( /obj/effect/turf_decal/tile/brown/half{ dir = 4 @@ -2127,6 +2182,7 @@ /obj/structure/disposalpipe/segment{ dir = 5 }, +/obj/machinery/camera/tarkon/directional/west, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/porthall) "oQ" = ( @@ -2136,6 +2192,11 @@ /obj/machinery/door/firedoor/solid, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/garden) +"oU" = ( +/obj/effect/turf_decal/tile/purple/half, +/obj/machinery/camera/tarkon/directional/south, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/port_tarkon/developement) "oV" = ( /obj/effect/turf_decal/tile/neutral/anticorner{ dir = 8 @@ -2177,6 +2238,7 @@ /obj/machinery/computer/rdconsole{ dir = 4 }, +/obj/machinery/camera/tarkon/directional/west, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/port_tarkon/developement) "pf" = ( @@ -2259,6 +2321,11 @@ /obj/effect/turf_decal/tile/red/real_red/half, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/secoff) +"pt" = ( +/obj/structure/cable, +/obj/machinery/camera/tarkon/directional/south, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/observ) "py" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/brown/half{ @@ -2334,6 +2401,7 @@ /obj/item/storage/backpack/satchel/explorer, /obj/item/clothing/head/utility/welding/hat, /obj/item/clothing/head/utility/welding/hat, +/obj/machinery/camera/tarkon/directional/west, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon) "pP" = ( @@ -2417,6 +2485,13 @@ /obj/machinery/light/warm/directional/south, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon) +"qq" = ( +/obj/machinery/cryopod{ + dir = 8 + }, +/obj/machinery/camera/tarkon/directional/east, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon) "qr" = ( /obj/machinery/portable_atmospherics/scrubber, /turf/open/floor/plating, @@ -2471,6 +2546,7 @@ /obj/item/reagent_containers/condiment/flour, /obj/item/reagent_containers/condiment/sugar, /obj/item/reagent_containers/condiment/sugar, +/obj/machinery/camera/tarkon/directional/east, /turf/open/floor/iron/cafeteria, /area/ruin/space/has_grav/port_tarkon/kitchen) "qG" = ( @@ -2497,11 +2573,16 @@ /obj/item/stock_parts/cell/super, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/trauma) +"qO" = ( +/obj/machinery/cryopod{ + dir = 4 + }, +/obj/machinery/camera/tarkon/directional/west, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon) "qP" = ( /obj/structure/table/reinforced, -/obj/machinery/door/window/right/directional/west{ - req_access = list("tarkon") - }, +/obj/machinery/door/window/brigdoor/tarkon/right/directional/west, /obj/item/mod/module/springlock, /obj/structure/window/reinforced/spawner/directional/south, /obj/effect/turf_decal/tile/red/real_red/half{ @@ -2588,6 +2669,7 @@ /obj/structure/disposalpipe/segment{ dir = 10 }, +/obj/machinery/camera/tarkon/directional/east, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/centerhall) "rp" = ( @@ -2751,11 +2833,10 @@ /turf/open/floor/plating, /area/ruin/space/has_grav/port_tarkon/forehall) "sq" = ( -/obj/machinery/power/smes/engineering{ - charge = 0; - name = "backup power storage unit" - }, /obj/structure/cable, +/obj/machinery/power/terminal{ + dir = 1 + }, /turf/open/floor/plating, /area/ruin/space/has_grav/port_tarkon/power1) "su" = ( @@ -2841,6 +2922,13 @@ /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating/airless, /area/solars/tarkon) +"tf" = ( +/obj/effect/turf_decal/tile/yellow/half{ + dir = 8 + }, +/obj/machinery/camera/tarkon/directional/west, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/afthall) "tg" = ( /obj/effect/turf_decal/tile/yellow/anticorner{ dir = 8 @@ -2949,12 +3037,13 @@ /area/ruin/space/has_grav/port_tarkon/forehall) "ud" = ( /obj/effect/turf_decal/tile/brown/anticorner, +/obj/machinery/camera/tarkon/directional/east, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/starboardhall) "ug" = ( /obj/effect/turf_decal/sand/plating, /obj/structure/alien/resin/membrane, -/turf/open/floor/plating/airless, +/turf/open/misc/asteroid/airless, /area/ruin/space/has_grav/outdoors) "uh" = ( /obj/structure/cable, @@ -2977,6 +3066,7 @@ /obj/item/storage/medkit/regular, /obj/item/storage/medkit/regular, /obj/machinery/firealarm/directional/south, +/obj/machinery/camera/tarkon/directional/south, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/trauma) "uu" = ( @@ -3058,6 +3148,7 @@ /obj/effect/turf_decal/tile/red/real_red/anticorner{ dir = 1 }, +/obj/machinery/camera/tarkon/directional/north, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/secoff) "vb" = ( @@ -3075,6 +3166,13 @@ }, /turf/open/floor/engine/n2o, /area/ruin/space/has_grav/port_tarkon/atmos) +"vj" = ( +/obj/effect/turf_decal/tile/neutral/half{ + dir = 8 + }, +/obj/machinery/camera/tarkon/directional/west, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) "vl" = ( /obj/machinery/door/airlock/public/glass/incinerator/tarkon_interior, /obj/machinery/airlock_controller/incinerator_tarkon{ @@ -3251,6 +3349,7 @@ /area/ruin/space/has_grav/port_tarkon/storage) "wq" = ( /obj/machinery/processor, +/obj/machinery/camera/tarkon/directional/west, /turf/open/floor/iron/cafeteria, /area/ruin/space/has_grav/port_tarkon/kitchen) "wr" = ( @@ -3348,6 +3447,7 @@ /obj/machinery/computer/atmos_control/tarkon/carbon_tank{ dir = 8 }, +/obj/machinery/camera/tarkon/directional/east, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/atmos) "xc" = ( @@ -3402,7 +3502,7 @@ dir = 4 }, /obj/effect/spawner/structure/window{ - polarizer_id = "tarkondisect" + polarizer_id = "tarkon_med1" }, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/trauma) @@ -3482,6 +3582,7 @@ /obj/machinery/atmospherics/components/unary/portables_connector{ dir = 1 }, +/obj/machinery/camera/tarkon/directional/east, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/port_tarkon/atmos) "xT" = ( @@ -3660,6 +3761,10 @@ "zg" = ( /turf/closed/wall/r_wall, /area/ruin/space/has_grav/port_tarkon/comms) +"zh" = ( +/obj/machinery/camera/tarkon/directional/north, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/afthall) "zk" = ( /obj/effect/turf_decal/tile/brown/half{ dir = 8 @@ -3795,6 +3900,10 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/starboardhall) +"Aa" = ( +/obj/machinery/camera/tarkon/directional/west, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/forehall) "Ab" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/north, @@ -3831,6 +3940,9 @@ /obj/item/circuitboard/machine/protolathe/tarkon, /obj/item/circuitboard/computer/tarkon_driver, /obj/item/circuitboard/machine/rdserver/tarkon, +/obj/machinery/camera/tarkon/directional/east, +/obj/item/circuitboard/computer/tarkon_cam, +/obj/item/circuitboard/computer/xenobiology/tarkon, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/port_tarkon/comms) "Ao" = ( @@ -3991,9 +4103,7 @@ /obj/machinery/airalarm/directional/east, /obj/effect/mapping_helpers/airalarm/all_access, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/camera/directional/east{ - network = list("tarkon") - }, +/obj/machinery/camera/tarkon_xenob, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/port_tarkon/developement) "BI" = ( @@ -4066,6 +4176,7 @@ /obj/machinery/cryo_cell{ dir = 8 }, +/obj/machinery/camera/tarkon/directional/east, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/trauma) "Ch" = ( @@ -4090,12 +4201,12 @@ "Cn" = ( /obj/effect/turf_decal/tile/blue/half, /obj/effect/spawner/structure/window{ - polarizer_id = "tarkondisect" + polarizer_id = "tarkon_med1" }, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/trauma) "Cp" = ( -/obj/machinery/computer/records{ +/obj/machinery/computer/camera_advanced/tarkon_cam{ dir = 8 }, /obj/effect/turf_decal/tile/red/real_red/half, @@ -4136,7 +4247,7 @@ /area/ruin/space/has_grav/port_tarkon/developement) "CF" = ( /obj/effect/spawner/structure/window{ - polarizer_id = "tarkondisect" + polarizer_id = "tarkon_med1" }, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/trauma) @@ -4304,6 +4415,7 @@ dir = 8 }, /obj/machinery/atmospherics/components/binary/tank_compressor, +/obj/machinery/camera/tarkon/directional/west, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/port_tarkon/developement) "DL" = ( @@ -4326,6 +4438,7 @@ }, /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk, +/obj/machinery/camera/tarkon/directional/north, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/power1) "DN" = ( @@ -4373,6 +4486,7 @@ /obj/effect/turf_decal/tile/brown/anticorner{ dir = 1 }, +/obj/machinery/camera/tarkon/directional/west, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/storage) "Eb" = ( @@ -4414,9 +4528,9 @@ /turf/open/floor/engine/n2, /area/ruin/space/has_grav/port_tarkon/atmos) "Eo" = ( -/obj/structure/sign/warning/radiation, -/turf/closed/wall, -/area/ruin/space/has_grav/port_tarkon/power1) +/obj/effect/turf_decal/tile/neutral/full, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/centerhall) "Eq" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -4511,11 +4625,7 @@ /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/forehall) "Fc" = ( -/obj/machinery/power/port_gen/pacman/super{ - name = "\improper emergency power generator"; - time_per_sheet = 40 - }, -/obj/effect/decal/cleanable/greenglow, +/obj/structure/closet/emcloset, /turf/open/floor/plating, /area/ruin/space/has_grav/port_tarkon/power1) "Fd" = ( @@ -4679,6 +4789,7 @@ dir = 8 }, /obj/item/construction/rcd/tarkon, +/obj/machinery/camera/tarkon/directional/south, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/atmos) "GN" = ( @@ -4891,7 +5002,7 @@ /turf/open/floor/wood/large, /area/ruin/space/has_grav/port_tarkon/dorms) "Id" = ( -/obj/machinery/door/window/left/directional/west, +/obj/machinery/door/window/brigdoor/tarkon/left/directional/west, /turf/open/floor/plating, /area/ruin/space/has_grav/port_tarkon/atmos) "Ie" = ( @@ -4979,6 +5090,11 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/forehall) +"IF" = ( +/obj/structure/bed/maint, +/obj/machinery/camera/tarkon/directional/west, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/secoff) "IJ" = ( /obj/structure/table/reinforced, /obj/item/paper_bin/construction, @@ -5028,9 +5144,7 @@ /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/centerhall) "IV" = ( -/obj/machinery/power/terminal{ - dir = 8 - }, +/obj/machinery/power/smes/tarkon_backup, /obj/structure/cable, /turf/open/floor/plating, /area/ruin/space/has_grav/port_tarkon/power1) @@ -5134,9 +5248,7 @@ /turf/open/floor/iron/dark, /area/ruin/space/has_grav/port_tarkon/developement) "JL" = ( -/obj/machinery/door/window/brigdoor/security/cell/right/directional/south{ - req_access = list("tarkon") - }, +/obj/machinery/door/window/brigdoor/tarkon/right/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/poddoor/shutters{ @@ -5150,6 +5262,7 @@ dir = 1 }, /obj/machinery/recharger, +/obj/machinery/camera/tarkon/directional/west, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/port_tarkon/comms) "JP" = ( @@ -5417,6 +5530,10 @@ /obj/structure/sink/directional/north, /turf/open/floor/grass, /area/ruin/space/has_grav/port_tarkon/garden) +"Ln" = ( +/obj/machinery/camera/tarkon/directional/east, +/turf/open/floor/plating, +/area/ruin/space/has_grav/port_tarkon/observ) "Lt" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/yellow/half, @@ -5778,21 +5895,20 @@ "NI" = ( /obj/machinery/light/directional/south, /obj/effect/turf_decal/tile/brown/anticorner, +/obj/machinery/camera/tarkon/directional/east, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/storage) "NO" = ( /obj/effect/turf_decal/tile/purple/half{ dir = 1 }, -/obj/machinery/computer, +/obj/machinery/modular_computer/console, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/port_tarkon/developement) "NS" = ( -/obj/structure/closet/crate/radiation, /obj/structure/cable, -/obj/item/stack/sheet/mineral/uranium/five, -/obj/item/stack/sheet/mineral/uranium/five, -/obj/item/stack/sheet/mineral/uranium/five, +/obj/machinery/power/smes/tarkon_backup, +/obj/machinery/camera/tarkon/directional/west, /turf/open/floor/plating, /area/ruin/space/has_grav/port_tarkon/power1) "NT" = ( @@ -5879,6 +5995,7 @@ start_showpiece_type = /obj/item/gun/energy/recharge/resonant_system; req_access = list("tarkon") }, +/obj/machinery/camera/tarkon/directional/north, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/mining) "Om" = ( @@ -6049,6 +6166,7 @@ /obj/structure/disposalpipe/broken{ dir = 8 }, +/obj/machinery/camera/tarkon/directional/south, /turf/open/floor/plating, /area/ruin/space/has_grav/port_tarkon/observ) "Po" = ( @@ -6141,6 +6259,7 @@ /obj/effect/turf_decal/tile/yellow/anticorner{ dir = 4 }, +/obj/machinery/camera/tarkon/directional/north, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/atmos) "PW" = ( @@ -6189,6 +6308,7 @@ /obj/effect/turf_decal/trimline/yellow/filled/warning{ dir = 8 }, +/obj/machinery/camera/tarkon/directional/west, /turf/open/floor/iron/airless, /area/ruin/space/has_grav/port_tarkon/storage) "Qq" = ( @@ -6416,6 +6536,7 @@ /area/ruin/space/has_grav/port_tarkon/forehall) "Se" = ( /obj/structure/bed/maint, +/obj/machinery/camera/tarkon/directional/east, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/secoff) "Sg" = ( @@ -6776,10 +6897,11 @@ /obj/structure/table/reinforced, /obj/structure/window/reinforced/spawner/directional/west, /obj/item/knife/combat/survival, -/obj/item/tape/ruins/tarkon/safe, +/obj/item/tape/ruins/tarkon, /obj/effect/turf_decal/tile/red/real_red/anticorner{ dir = 4 }, +/obj/machinery/camera/tarkon/directional/north, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/secoff) "Uo" = ( @@ -6989,6 +7111,7 @@ dir = 1 }, /obj/structure/closet/firecloset, +/obj/effect/mapping_helpers/airalarm/all_access, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/toolstorage) "VU" = ( @@ -7018,6 +7141,13 @@ "VZ" = ( /turf/open/floor/iron/freezer, /area/ruin/space/has_grav/port_tarkon/kitchen) +"Wa" = ( +/obj/effect/turf_decal/tile/brown/half{ + dir = 4 + }, +/obj/machinery/camera/tarkon/directional/east, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/mining) "Wd" = ( /obj/effect/turf_decal/tile/blue/half, /obj/machinery/light/directional/south, @@ -7146,6 +7276,7 @@ /obj/machinery/firealarm/directional/south{ pixel_y = -31 }, +/obj/machinery/camera/tarkon/directional/south, /turf/open/floor/grass, /area/ruin/space/has_grav/port_tarkon/garden) "Xf" = ( @@ -7233,6 +7364,13 @@ }, /turf/open/floor/plating, /area/ruin/space/has_grav/port_tarkon/atmos) +"XN" = ( +/obj/effect/turf_decal/tile/purple/half{ + dir = 4 + }, +/obj/machinery/camera/tarkon/directional/east, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/porthall) "XO" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/blue/half{ @@ -7360,6 +7498,7 @@ /obj/item/raw_anomaly_core/random, /obj/item/raw_anomaly_core/random, /obj/item/raw_anomaly_core/random, +/obj/machinery/camera/tarkon/directional/north, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/port_tarkon/developement) "YT" = ( @@ -7391,6 +7530,7 @@ /obj/machinery/computer/atmos_control/tarkon/nitrogen_tank{ dir = 4 }, +/obj/machinery/camera/tarkon/directional/west, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/atmos) "YZ" = ( @@ -7411,8 +7551,20 @@ }, /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk, +/obj/machinery/camera/tarkon/directional/east, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/port_tarkon/comms) +"Zh" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/yellow/half, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/camera/tarkon/directional/south, +/turf/open/floor/iron, +/area/ruin/space/has_grav/port_tarkon/porthall) "Zs" = ( /obj/effect/turf_decal/tile/blue/half, /obj/structure/table/optable, @@ -8188,7 +8340,7 @@ nj nj nj nj -Dz +aW Dz ax Hi @@ -8340,7 +8492,7 @@ Dt Dt bb Dt -Dt +XN Dt qz Pc @@ -8692,7 +8844,7 @@ Io QS QS eH -Om +pt Yr NO hp @@ -8758,7 +8910,7 @@ kV kV cU Yn -QS +Ln QS Pa dV @@ -8780,7 +8932,7 @@ yP jX jX Qa -yG +oU Yr AG FS @@ -8857,7 +9009,7 @@ fD Yr Ad FS -TD +Zh Sn mm nW @@ -9422,7 +9574,7 @@ zY eT xr xr -Sq +dc aI uj jX @@ -9705,7 +9857,7 @@ ZY zY bt xC -kV +kJ EN kV EN @@ -9739,7 +9891,7 @@ zE oh kC FW -Of +Eo ya al NS @@ -9806,7 +9958,7 @@ xx pN Tm xx -Vb +qO Vb zE zE @@ -9886,7 +10038,7 @@ zE Ej Yk xT -Eo +ya ms AW Fc @@ -9962,7 +10114,7 @@ if oV ms ms -ms +mb ms ms bO @@ -10011,7 +10163,7 @@ Ys xr xr iU -xr +Aa HP EX xr @@ -10035,7 +10187,7 @@ Px RJ Np wr -wr +tf OP aR Kh @@ -10091,7 +10243,7 @@ xr BL wV pK -RJ +oA xx ph Up @@ -10187,7 +10339,7 @@ bH pi JZ JZ -JZ +gN dz qx tx @@ -10390,7 +10542,7 @@ xx cn Ur xx -ha +qq ha zE zE @@ -10403,7 +10555,7 @@ DA DA Ye hG -WX +zh WX zg wv @@ -10444,7 +10596,7 @@ zY eT xr xr -Sq +dc EH af YO @@ -10536,7 +10688,7 @@ rN rN mS IU -rN +vj IM rN Dv @@ -10801,7 +10953,7 @@ zY bt bt xC -kV +kJ kV EN xC @@ -10824,7 +10976,7 @@ at KR rA ZR -OA +cq rh PG fP @@ -11026,7 +11178,7 @@ kV xC zY eT -xr +jT OI Sq eT @@ -11255,7 +11407,7 @@ xC kV kV kV -kV +kJ xC zY OV @@ -11776,7 +11928,7 @@ rj qc Di gy -Se +IF OV Xs Xs @@ -11794,7 +11946,7 @@ qR eS cu dm -eS +Wa Gk AR AR @@ -11838,7 +11990,7 @@ kV kV kV EN -kV +kJ xC bt bt @@ -11854,7 +12006,7 @@ OV Xs Xs Xs -Xs +fd Xs Xs Xs @@ -11900,7 +12052,7 @@ zY zY bt xC -kV +kJ EN kV kV diff --git a/_maps/RandomRuins/SpaceRuins/nova/port_tarkon/cargo_secure.dmm b/_maps/RandomRuins/SpaceRuins/nova/port_tarkon/cargo_secure.dmm index 95aab56ab1c..bfcd8c05c93 100644 --- a/_maps/RandomRuins/SpaceRuins/nova/port_tarkon/cargo_secure.dmm +++ b/_maps/RandomRuins/SpaceRuins/nova/port_tarkon/cargo_secure.dmm @@ -91,17 +91,17 @@ "C" = ( /obj/modular_map_connector, /obj/structure/rack/shelf, -/obj/item/bedsheet/dorms_double, -/obj/item/bedsheet/dorms_double, -/obj/item/bedsheet/dorms_double, -/obj/item/bedsheet/dorms_double, -/obj/item/bedsheet/dorms_double, -/obj/item/bedsheet/dorms_double, -/obj/item/bedsheet/dorms_double, -/obj/item/bedsheet/dorms_double, -/obj/item/bedsheet/dorms_double, -/obj/item/bedsheet/dorms_double, -/obj/item/bedsheet/dorms_double, +/obj/effect/spawner/random/bedsheet/double, +/obj/effect/spawner/random/bedsheet/double, +/obj/effect/spawner/random/bedsheet/double, +/obj/effect/spawner/random/bedsheet/double, +/obj/effect/spawner/random/bedsheet/double, +/obj/effect/spawner/random/bedsheet/double, +/obj/effect/spawner/random/bedsheet/double, +/obj/effect/spawner/random/bedsheet/double, +/obj/effect/spawner/random/bedsheet/double, +/obj/effect/spawner/random/bedsheet/double, +/obj/effect/spawner/random/bedsheet/double, /turf/template_noop, /area/template_noop) "D" = ( diff --git a/_maps/RandomRuins/SpaceRuins/nova/port_tarkon/cargo_stock.dmm b/_maps/RandomRuins/SpaceRuins/nova/port_tarkon/cargo_stock.dmm index a1e289ac154..e24f7119c3d 100644 --- a/_maps/RandomRuins/SpaceRuins/nova/port_tarkon/cargo_stock.dmm +++ b/_maps/RandomRuins/SpaceRuins/nova/port_tarkon/cargo_stock.dmm @@ -45,17 +45,17 @@ /area/template_noop) "B" = ( /obj/structure/closet/crate, -/obj/item/bedsheet/dorms, -/obj/item/bedsheet/dorms, -/obj/item/bedsheet/dorms, -/obj/item/bedsheet/dorms, -/obj/item/bedsheet/dorms, -/obj/item/bedsheet/dorms, -/obj/item/bedsheet/dorms, -/obj/item/bedsheet/dorms_double, -/obj/item/bedsheet/dorms_double, -/obj/item/bedsheet/dorms_double, -/obj/item/bedsheet/dorms_double, +/obj/effect/spawner/random/bedsheet, +/obj/effect/spawner/random/bedsheet, +/obj/effect/spawner/random/bedsheet, +/obj/effect/spawner/random/bedsheet, +/obj/effect/spawner/random/bedsheet, +/obj/effect/spawner/random/bedsheet, +/obj/effect/spawner/random/bedsheet, +/obj/effect/spawner/random/bedsheet/double, +/obj/effect/spawner/random/bedsheet/double, +/obj/effect/spawner/random/bedsheet/double, +/obj/effect/spawner/random/bedsheet/double, /turf/template_noop, /area/template_noop) "D" = ( diff --git a/_maps/RandomRuins/SpaceRuins/nova/port_tarkon/cargo_warehouse.dmm b/_maps/RandomRuins/SpaceRuins/nova/port_tarkon/cargo_warehouse.dmm index d9b150817b3..a7298e65f5e 100644 --- a/_maps/RandomRuins/SpaceRuins/nova/port_tarkon/cargo_warehouse.dmm +++ b/_maps/RandomRuins/SpaceRuins/nova/port_tarkon/cargo_warehouse.dmm @@ -150,17 +150,17 @@ /turf/template_noop, /area/template_noop) "T" = ( -/obj/item/bedsheet/dorms, -/obj/item/bedsheet/dorms, -/obj/item/bedsheet/dorms, -/obj/item/bedsheet/dorms, -/obj/item/bedsheet/dorms, -/obj/item/bedsheet/dorms, -/obj/item/bedsheet/dorms, -/obj/item/bedsheet/dorms_double, -/obj/item/bedsheet/dorms_double, -/obj/item/bedsheet/dorms_double, -/obj/item/bedsheet/dorms_double, +/obj/effect/spawner/random/bedsheet, +/obj/effect/spawner/random/bedsheet, +/obj/effect/spawner/random/bedsheet, +/obj/effect/spawner/random/bedsheet, +/obj/effect/spawner/random/bedsheet, +/obj/effect/spawner/random/bedsheet, +/obj/effect/spawner/random/bedsheet, +/obj/effect/spawner/random/bedsheet/double, +/obj/effect/spawner/random/bedsheet/double, +/obj/effect/spawner/random/bedsheet/double, +/obj/effect/spawner/random/bedsheet/double, /obj/structure/rack/shelf, /turf/template_noop, /area/template_noop) @@ -255,7 +255,7 @@ S E N E -E +w E "} (9,1,1) = {" @@ -273,7 +273,7 @@ B E R E -w +E E "} (11,1,1) = {" @@ -283,7 +283,7 @@ E E w i -E +w "} (12,1,1) = {" T diff --git a/_maps/RandomRuins/SpaceRuins/nova/port_tarkon/dorm_cabin.dmm b/_maps/RandomRuins/SpaceRuins/nova/port_tarkon/dorm_cabin.dmm index 46efa9cd6ae..67f62f0d301 100644 --- a/_maps/RandomRuins/SpaceRuins/nova/port_tarkon/dorm_cabin.dmm +++ b/_maps/RandomRuins/SpaceRuins/nova/port_tarkon/dorm_cabin.dmm @@ -1,7 +1,7 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( /obj/structure/bed/double, -/obj/item/bedsheet/dorms_double, +/obj/effect/spawner/random/bedsheet/double, /turf/open/floor/carpet/royalblack, /area/template_noop) "b" = ( diff --git a/_maps/RandomRuins/SpaceRuins/nova/port_tarkon/dorm_classic.dmm b/_maps/RandomRuins/SpaceRuins/nova/port_tarkon/dorm_classic.dmm index b0ac0cbd685..4912f4c058f 100644 --- a/_maps/RandomRuins/SpaceRuins/nova/port_tarkon/dorm_classic.dmm +++ b/_maps/RandomRuins/SpaceRuins/nova/port_tarkon/dorm_classic.dmm @@ -7,7 +7,7 @@ /area/template_noop) "c" = ( /obj/structure/bed/double/pod, -/obj/item/bedsheet/random/double, +/obj/effect/spawner/random/bedsheet/any/double, /obj/machinery/button/door/directional/north{ id = "ptdorm4"; name = "Door Lock Control"; @@ -46,7 +46,7 @@ /obj/structure/bed/pod{ dir = 1 }, -/obj/item/bedsheet/random{ +/obj/effect/spawner/random/bedsheet/any{ dir = 1 }, /obj/machinery/button/door/directional/south{ @@ -114,7 +114,7 @@ /obj/structure/bed/pod{ dir = 1 }, -/obj/item/bedsheet/random{ +/obj/effect/spawner/random/bedsheet/any{ dir = 1 }, /obj/machinery/button/door/directional/north{ @@ -180,7 +180,7 @@ /area/template_noop) "W" = ( /obj/structure/bed/pod, -/obj/item/bedsheet/random, +/obj/effect/spawner/random/bedsheet/any, /obj/machinery/button/door/directional/south{ id = "ptdorm3"; name = "Door Lock Control"; diff --git a/_maps/RandomRuins/SpaceRuins/nova/port_tarkon/dorm_party.dmm b/_maps/RandomRuins/SpaceRuins/nova/port_tarkon/dorm_party.dmm index aad927151d4..dda3746a749 100644 --- a/_maps/RandomRuins/SpaceRuins/nova/port_tarkon/dorm_party.dmm +++ b/_maps/RandomRuins/SpaceRuins/nova/port_tarkon/dorm_party.dmm @@ -105,7 +105,7 @@ /area/template_noop) "B" = ( /obj/structure/bed/double, -/obj/item/bedsheet/dorms_double, +/obj/effect/spawner/random/bedsheet/double, /turf/open/floor/carpet/royalblue, /area/template_noop) "D" = ( @@ -209,7 +209,7 @@ /obj/structure/bed/double{ dir = 1 }, -/obj/item/bedsheet/dorms_double{ +/obj/effect/spawner/random/bedsheet/double{ dir = 1 }, /turf/open/floor/carpet/royalblack, diff --git a/_maps/RandomRuins/SpaceRuins/nova/salvagepost.dmm b/_maps/RandomRuins/SpaceRuins/nova/salvagepost.dmm index 0ddbffca61e..b1a875ecf83 100644 --- a/_maps/RandomRuins/SpaceRuins/nova/salvagepost.dmm +++ b/_maps/RandomRuins/SpaceRuins/nova/salvagepost.dmm @@ -502,7 +502,7 @@ "zf" = ( /obj/structure/bed/pod, /obj/effect/decal/cleanable/dirt, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /turf/open/floor/carpet/red, /area/ruin/powered) "Ae" = ( @@ -657,7 +657,7 @@ /area/template_noop) "Gf" = ( /obj/structure/bed/pod, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/effect/decal/cleanable/dirt, /turf/open/floor/carpet/red, /area/ruin/powered) diff --git a/_maps/RandomRuins/SpaceRuins/nova/scrapheap.dmm b/_maps/RandomRuins/SpaceRuins/nova/scrapheap.dmm index ebc733dd751..c0c37d9f659 100644 --- a/_maps/RandomRuins/SpaceRuins/nova/scrapheap.dmm +++ b/_maps/RandomRuins/SpaceRuins/nova/scrapheap.dmm @@ -562,7 +562,7 @@ /obj/structure/bed/medical{ dir = 4 }, -/obj/item/bedsheet/random, +/obj/effect/spawner/random/bedsheet/any, /obj/machinery/door/window/left/directional/west, /turf/open/floor/iron, /area/ruin/space/has_grav/powered/nova/scrapheap) @@ -785,7 +785,7 @@ /obj/structure/bed/medical{ dir = 4 }, -/obj/item/bedsheet/random, +/obj/effect/spawner/random/bedsheet/any, /obj/machinery/door/window/left/directional/west, /obj/structure/window/reinforced/tinted/spawner/directional/south, /obj/structure/window/reinforced/tinted/spawner/directional/east, @@ -870,7 +870,7 @@ /obj/structure/bed/medical{ dir = 4 }, -/obj/item/bedsheet/random, +/obj/effect/spawner/random/bedsheet/any, /obj/machinery/door/window/left/directional/west, /obj/structure/window/reinforced/tinted/spawner/directional/south, /turf/open/floor/iron, @@ -1626,7 +1626,7 @@ /obj/structure/bed/medical{ dir = 4 }, -/obj/item/bedsheet/random, +/obj/effect/spawner/random/bedsheet/any, /obj/machinery/door/window/left/directional/west, /obj/structure/window/reinforced/tinted/spawner/directional/south, /turf/open/floor/iron, @@ -1829,7 +1829,7 @@ /obj/structure/bed/medical{ dir = 4 }, -/obj/item/bedsheet/random, +/obj/effect/spawner/random/bedsheet/any, /obj/machinery/door/window/left/directional/west, /obj/structure/window/reinforced/tinted/spawner/directional/east, /obj/structure/window/reinforced/tinted/spawner/directional/north, diff --git a/_maps/RandomRuins/SpaceRuins/nova/spacehotel.dmm b/_maps/RandomRuins/SpaceRuins/nova/spacehotel.dmm index 6bcfc6da935..c055ff2272c 100644 --- a/_maps/RandomRuins/SpaceRuins/nova/spacehotel.dmm +++ b/_maps/RandomRuins/SpaceRuins/nova/spacehotel.dmm @@ -363,7 +363,7 @@ /area/ruin/space/has_grav/hotel) "cp" = ( /obj/structure/bed/double, -/obj/item/bedsheet/random/double, +/obj/effect/spawner/random/bedsheet/any/double, /obj/machinery/button/curtain{ id = "HotelRoom6Curtains"; pixel_x = 24 @@ -2351,7 +2351,7 @@ /obj/structure/bed/double{ dir = 4 }, -/obj/item/bedsheet/random/double{ +/obj/effect/spawner/random/bedsheet/any/double{ dir = 1 }, /turf/open/floor/carpet/neon/simple/teal/nodots, @@ -2920,7 +2920,7 @@ /area/ruin/space/has_grav/hotel/workroom/quarters) "nC" = ( /obj/structure/bed/double, -/obj/item/bedsheet/random/double, +/obj/effect/spawner/random/bedsheet/any/double, /obj/machinery/button/curtain{ id = "HotelRoom2Curtains"; pixel_x = 22; @@ -4256,7 +4256,7 @@ /obj/structure/bed/double{ dir = 4 }, -/obj/item/bedsheet/random/double{ +/obj/effect/spawner/random/bedsheet/any/double{ dir = 1 }, /turf/open/floor/carpet/neon/simple/black/nodots, @@ -4341,7 +4341,7 @@ /area/ruin/space/has_grav/hotel/guestroom/room_5) "wG" = ( /obj/structure/bed/double, -/obj/item/bedsheet/random/double, +/obj/effect/spawner/random/bedsheet/any/double, /obj/machinery/button/curtain{ id = "HotelRoom7Curtains1"; pixel_x = 24 @@ -6257,7 +6257,7 @@ /obj/structure/bed/double{ dir = 4 }, -/obj/item/bedsheet/random/double{ +/obj/effect/spawner/random/bedsheet/any/double{ dir = 1 }, /turf/open/floor/wood, diff --git a/_maps/RandomRuins/SpaceRuins/waystation.dmm b/_maps/RandomRuins/SpaceRuins/waystation.dmm index 9399ee02947..def97102238 100644 --- a/_maps/RandomRuins/SpaceRuins/waystation.dmm +++ b/_maps/RandomRuins/SpaceRuins/waystation.dmm @@ -1143,7 +1143,7 @@ /area/ruin/space/has_grav/waystation/dorms) "rQ" = ( /obj/structure/bed, -/obj/item/bedsheet/random, +/obj/effect/spawner/random/bedsheet/any, /turf/open/floor/wood, /area/ruin/space/has_grav/waystation/dorms) "rV" = ( @@ -1889,7 +1889,7 @@ /area/ruin/space/has_grav/waystation/cargobay) "IS" = ( /obj/structure/bed, -/obj/item/bedsheet/random, +/obj/effect/spawner/random/bedsheet/any, /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood, /area/ruin/space/has_grav/waystation/dorms) diff --git a/_maps/RandomZLevels/SnowCabin.dmm b/_maps/RandomZLevels/SnowCabin.dmm index c6366d62e54..7ad0b42218f 100644 --- a/_maps/RandomZLevels/SnowCabin.dmm +++ b/_maps/RandomZLevels/SnowCabin.dmm @@ -2142,7 +2142,7 @@ /area/awaymission/cabin/caves) "km" = ( /obj/structure/bed, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /turf/open/floor/wood, /area/awaymission/cabin/caves) "ko" = ( diff --git a/_maps/RandomZLevels/mothership_astrum.dmm b/_maps/RandomZLevels/mothership_astrum.dmm index cd780a02fb0..b734d2885eb 100644 --- a/_maps/RandomZLevels/mothership_astrum.dmm +++ b/_maps/RandomZLevels/mothership_astrum.dmm @@ -851,7 +851,7 @@ /obj/structure/bed{ name = "Reproduction Bench" }, -/obj/item/bedsheet/random, +/obj/effect/spawner/random/bedsheet/any, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/awaymission/mothership_astrum/deck3) @@ -859,7 +859,7 @@ /obj/structure/bed{ name = "Reproduction Bench" }, -/obj/item/bedsheet/random, +/obj/effect/spawner/random/bedsheet/any, /turf/open/floor/wood, /area/awaymission/mothership_astrum/deck3) "oA" = ( diff --git a/_maps/RandomZLevels/museum.dmm b/_maps/RandomZLevels/museum.dmm new file mode 100644 index 00000000000..7429c0b4538 --- /dev/null +++ b/_maps/RandomZLevels/museum.dmm @@ -0,0 +1,71209 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"ab" = ( +/obj/machinery/computer/old{ + name = "replica computer"; + dir = 8; + icon_keyboard = "rd_key"; + icon_screen = "rdcomp" + }, +/turf/open/floor/iron/smooth_large, +/area/awaymission/museum) +"ai" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/engine, +/area/awaymission/museum) +"am" = ( +/obj/structure/table/reinforced, +/obj/structure/railing{ + dir = 9 + }, +/obj/item/storage/toolbox/mechanical/old, +/turf/open/floor/iron/smooth_corner, +/area/awaymission/museum) +"ap" = ( +/turf/cordon, +/area/awaymission/museum) +"as" = ( +/obj/machinery/conveyor{ + dir = 1 + }, +/obj/item/stack/rods, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"at" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/item/stack/rods, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"av" = ( +/obj/structure/chair/stool/directional/south, +/turf/open/floor/iron, +/area/awaymission/museum) +"aw" = ( +/obj/structure/shipping_container/nanotrasen{ + opacity = 1 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"az" = ( +/obj/structure/table/reinforced, +/obj/effect/spawner/random/entertainment/musical_instrument, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"aG" = ( +/obj/machinery/conveyor{ + dir = 4 + }, +/obj/machinery/light/small/dim/directional/south, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"aK" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/closet/crate/preopen, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"aR" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 1 + }, +/obj/structure/chair/sofa/bench{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"aW" = ( +/obj/structure/closet/crate/bin, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"bg" = ( +/obj/structure/no_effect_signpost{ + name = "if youre reading this you stink and also made by jimmyl" + }, +/turf/open/floor/bluespace, +/area/awaymission/museum) +"bi" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 4 + }, +/obj/machinery/computer/terminal/museum{ + dir = 4; + content = list("Sometime long ago, someone accidentally slipped in the design for gloves that work like batons into the basic employee craftsmanship teaching program. Naturally, this was not a good thing and all the ruffians onstation would usually have one of these. As Nanotrasen found out and removed the design, these are no longer ever seen, for nobody knows how to make them.") + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"bj" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/door/airlock/wood{ + name = "Bathroom" + }, +/turf/open/floor/iron/showroomfloor, +/area/awaymission/museum) +"bk" = ( +/obj/structure/transport/linear/tram/slow, +/obj/structure/thermoplastic, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"bn" = ( +/obj/structure/hedge/opaque, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/structure/fluff/fake_camera{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"br" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/tile, +/area/awaymission/museum) +"bs" = ( +/turf/open/misc/dirt/station, +/area/awaymission/museum/mothroachvoid) +"bt" = ( +/obj/effect/step_trigger/teleporter/offset{ + teleport_y_offset = 12 + }, +/obj/effect/oneway{ + dir = 4 + }, +/turf/open/mirage{ + dir = 8; + target_turf_x = 11; + range = 1 + }, +/area/awaymission/museum) +"bC" = ( +/obj/structure/closet/secure_closet/freezer/kitchen/all_access, +/turf/open/floor/iron/freezer, +/area/awaymission/museum) +"bE" = ( +/obj/machinery/door/airlock/grunge, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"bF" = ( +/obj/effect/mapping_helpers/bombable_wall, +/turf/closed/indestructible/reinforced, +/area/awaymission/museum) +"bG" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/grille/broken, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"bI" = ( +/obj/machinery/door/poddoor/shutters/indestructible{ + id = "nothing" + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"bJ" = ( +/mob/living/basic/statue/mannequin{ + dir = 8; + name = "Dale Knox" + }, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/turf/open/floor/holofloor/white, +/area/awaymission/museum) +"bK" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue/corner{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"bM" = ( +/obj/item/kirbyplants/random/dead, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"bQ" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/holofloor/white, +/area/awaymission/museum) +"bV" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"bW" = ( +/obj/structure/transport/linear/tram/slow, +/obj/structure/thermoplastic/light, +/obj/effect/landmark/transport/transport_id{ + specific_transport_id = "museum_cargo" + }, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"ce" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/railing{ + dir = 6 + }, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"cf" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/item/storage/box/stickers/googly, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"cm" = ( +/obj/machinery/door/airlock/grunge, +/obj/structure/barricade/wooden/crude, +/obj/effect/turf_decal/stripes/end{ + dir = 1 + }, +/turf/open/floor/engine, +/area/awaymission/museum) +"cn" = ( +/obj/effect/turf_decal/stripes{ + dir = 4 + }, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/iron/smooth_half, +/area/awaymission/museum) +"cs" = ( +/obj/effect/spawner/random/food_or_drink/snack, +/obj/effect/spawner/random/food_or_drink/snack, +/obj/effect/spawner/random/food_or_drink/snack, +/obj/structure/table/reinforced, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/smooth_half, +/area/awaymission/museum) +"ct" = ( +/obj/structure/chair/comfy, +/mob/living/basic/mothroach, +/obj/effect/mapping_helpers/mob_buckler, +/obj/machinery/light/dim/directional/north, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"cv" = ( +/obj/effect/turf_decal/bot/left, +/turf/open/floor/iron/dark/diagonal, +/area/awaymission/museum) +"cy" = ( +/obj/effect/decal/cleanable/fuel_pool/hivis, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood/old, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"cA" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/green/opposingcorners, +/obj/effect/spawner/random/entertainment/toy, +/obj/effect/spawner/random/entertainment/toy, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/green{ + dir = 10 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"cB" = ( +/obj/effect/turf_decal/tile/green/opposingcorners, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 8 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"cC" = ( +/turf/open/floor/mineral/silver, +/area/awaymission/museum/mothroachvoid) +"cF" = ( +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/awaymission/museum) +"cH" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/showroomfloor, +/area/awaymission/museum) +"cM" = ( +/obj/structure/table/reinforced, +/obj/effect/spawner/random/bureaucracy/pen, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/white, +/area/awaymission/museum) +"cN" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/item/toy/balloon/corgi, +/obj/machinery/status_display/random_message{ + firstline_to_secondline = list("NO" = "LITTERING","YOU ARE" = "BEING WATCHED", "DO NOT TOUCH" = "THE EXHIBITS"); + pixel_x = 32 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"cR" = ( +/obj/structure/broken_flooring/side/always_floorplane{ + dir = 8 + }, +/obj/structure/lattice, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"cS" = ( +/obj/effect/step_trigger/thrower{ + direction = 1; + facedir = 1; + tiles = 10; + mobs_only = 1 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/awaymission/museum) +"cW" = ( +/obj/machinery/computer/old, +/turf/open/floor/circuit/green, +/area/awaymission/museum) +"cX" = ( +/obj/structure/plaque/static_plaque/golden/commission/dream, +/turf/closed/indestructible/reinforced, +/area/awaymission/museum) +"cZ" = ( +/obj/structure/fluff/divine/nexus, +/turf/open/floor/cult, +/area/awaymission/museum) +"da" = ( +/obj/effect/turf_decal/siding/dark_blue/corner, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/museum) +"de" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/caution/stand_clear, +/turf/open/floor/engine, +/area/awaymission/museum) +"dl" = ( +/obj/structure/sign/warning/fire/directional/west, +/obj/machinery/portable_atmospherics/pump, +/obj/effect/turf_decal/delivery/red, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"dn" = ( +/turf/open/floor/carpet, +/area/awaymission/museum) +"do" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/railing, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"dx" = ( +/obj/structure/fluff/beach_umbrella, +/turf/open/misc/beach/sand, +/area/awaymission/museum/mothroachvoid) +"dF" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 1 + }, +/obj/structure/table, +/obj/effect/spawner/random/bureaucracy/paper{ + spawn_loot_count = 7; + spawn_random_offset = 6 + }, +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"dH" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/glass/shaker, +/turf/open/floor/wood/tile, +/area/awaymission/museum) +"dK" = ( +/turf/open/mirage{ + range = 2; + target_turf_y = -4; + dir = 1 + }, +/area/awaymission/museum) +"dL" = ( +/obj/structure/sink/directional/west, +/turf/open/floor/wood/tile, +/area/awaymission/museum) +"dN" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/random/structure/closet_empty/crate/with_loot, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"dR" = ( +/obj/effect/turf_decal/siding/wideplating/corner{ + dir = 8 + }, +/turf/open/misc/beach/sand, +/area/awaymission/museum/mothroachvoid) +"dS" = ( +/mob/living/basic/statue/mannequin{ + dir = 4; + held_item = /obj/item/weldingtool; + hat = /obj/item/clothing/head/utility/welding + }, +/turf/open/floor/engine, +/area/awaymission/museum) +"dV" = ( +/obj/machinery/door/window/brigdoor/left/directional/south{ + req_access = list("bartender") + }, +/turf/open/floor/wood/tile, +/area/awaymission/museum) +"dY" = ( +/mob/living/basic/statue/mannequin{ + hat = /obj/item/clothing/head/helmet/space; + dir = 1 + }, +/turf/open/floor/holofloor/hyperspace/ns, +/area/awaymission/museum) +"dZ" = ( +/obj/structure/lattice/catwalk/mining, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"ea" = ( +/obj/structure/flora/rock/icy/style_random, +/obj/effect/turf_decal/siding{ + dir = 10 + }, +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/railing/corner, +/turf/open/floor/holofloor/asteroid, +/area/awaymission/museum) +"ec" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 8 + }, +/obj/machinery/door/poddoor/shutters/indestructible{ + id = "museum_secret" + }, +/obj/machinery/puzzle_keycardpad/directional/east{ + id = "museum_secret" + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"eg" = ( +/obj/effect/spawner/structure/window/hollow/directional{ + dir = 4 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"ek" = ( +/obj/effect/decal/cleanable/crayon{ + icon_state = "l"; + pixel_x = -10 + }, +/obj/effect/decal/cleanable/crayon{ + icon_state = "i" + }, +/obj/effect/decal/cleanable/crayon{ + icon_state = "e"; + pixel_x = 12 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/small/dim/directional/west, +/turf/open/floor/engine, +/area/awaymission/museum) +"el" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"em" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/turf/open/floor/iron, +/area/awaymission/museum) +"en" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/turf_decal/stripes/red/line{ + dir = 6 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"es" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"ev" = ( +/obj/structure/hedge, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/grass, +/area/awaymission/museum) +"ex" = ( +/obj/structure/chair/stool/bar/directional/west{ + can_buckle = 1 + }, +/mob/living/basic/mothroach, +/obj/effect/mapping_helpers/mob_buckler, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"eA" = ( +/obj/machinery/door/airlock/wood{ + name = "Dance Room" + }, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"eD" = ( +/obj/effect/turf_decal/siding/dark_blue{ + dir = 1 + }, +/obj/structure/showcase/machinery/implanter, +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/museum) +"eF" = ( +/obj/structure/showcase/machinery/cloning_pod, +/obj/machinery/conveyor{ + dir = 1 + }, +/obj/machinery/light/floor, +/turf/open/floor/engine, +/area/awaymission/museum) +"eH" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/holofloor/white, +/area/awaymission/museum) +"eM" = ( +/obj/structure/statue/gold/qm{ + anchored = 1 + }, +/turf/open/misc/dirt/station, +/area/awaymission/museum/mothroachvoid) +"eN" = ( +/obj/machinery/door/poddoor/shutters/window/indestructible{ + dir = 4; + id = "nothing" + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"eO" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/spawner/random/entertainment/dice, +/obj/structure/fluff/fake_camera{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"eP" = ( +/turf/open/misc/beach/sand, +/area/awaymission/museum/mothroachvoid) +"eQ" = ( +/obj/effect/turf_decal/tile/green/opposingcorners, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/green, +/obj/structure/fluff/fake_camera{ + dir = 5 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"eR" = ( +/obj/structure/plaque/static_plaque/golden/commission/omega, +/turf/closed/indestructible/reinforced, +/area/awaymission/museum) +"eX" = ( +/obj/effect/turf_decal/siding/wideplating{ + dir = 4 + }, +/turf/open/floor/holofloor/beach/coast{ + dir = 1 + }, +/area/awaymission/museum) +"fa" = ( +/obj/effect/turf_decal/sand/plating, +/mob/living/basic/statue/mannequin{ + held_item = /obj/item/pickaxe; + hat = /obj/item/clothing/suit/hooded/explorer + }, +/obj/effect/turf_decal/mining, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"fe" = ( +/turf/closed/indestructible/reinforced/titanium/nodiagonal, +/area/awaymission/museum) +"ff" = ( +/turf/open/floor/holofloor/beach/coast{ + dir = 6 + }, +/area/awaymission/museum/mothroachvoid) +"fi" = ( +/obj/structure/table/wood, +/obj/item/plate, +/obj/item/kitchen/fork, +/turf/open/floor/wood/tile, +/area/awaymission/museum) +"fn" = ( +/turf/open/floor/holofloor/hyperspace/ns, +/area/awaymission/museum) +"fo" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/engine, +/area/awaymission/museum) +"fu" = ( +/obj/item/banhammer{ + force = -200 + }, +/turf/open/floor/bluespace, +/area/awaymission/museum) +"fy" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"fz" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/item/plate/large, +/obj/item/food/little_hawaii_hotdog, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"fC" = ( +/obj/machinery/light/small/directional/west, +/obj/structure/table/wood, +/obj/item/language_manual/roundstart_species, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"fJ" = ( +/obj/structure/fluff/fake_camera{ + dir = 10 + }, +/turf/open/misc/beach/coast{ + dir = 1 + }, +/area/awaymission/museum) +"fK" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/painting{ + pixel_y = 32; + persistence_id = "museumgate" + }, +/obj/machinery/light/floor, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"fT" = ( +/obj/structure/broken_flooring/corner/always_floorplane{ + dir = 1 + }, +/obj/structure/lattice, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"fW" = ( +/obj/machinery/light/warm/directional/north, +/turf/open/floor/wood/tile, +/area/awaymission/museum) +"gf" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"gj" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 8 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"gm" = ( +/obj/structure/statue/gold/cmo{ + anchored = 1 + }, +/turf/open/floor/mineral/diamond, +/area/awaymission/museum/mothroachvoid) +"go" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/awaymission/museum) +"gu" = ( +/obj/structure/flora/tree/palm/style_random, +/turf/open/misc/beach/sand, +/area/awaymission/museum/mothroachvoid) +"gA" = ( +/obj/structure/toilet{ + dir = 1 + }, +/turf/open/floor/iron/showroomfloor, +/area/awaymission/museum) +"gB" = ( +/obj/structure/table/wood, +/obj/item/knife, +/obj/item/kitchen/rollingpin, +/obj/machinery/light/warm/directional/north, +/turf/open/floor/iron/freezer, +/area/awaymission/museum) +"gC" = ( +/obj/machinery/conveyor{ + dir = 8 + }, +/obj/machinery/light/small/dim/directional/south, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"gG" = ( +/obj/effect/turf_decal/siding/dark_blue/corner{ + dir = 4 + }, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/museum) +"gJ" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue/corner{ + dir = 8 + }, +/obj/effect/spawner/random/vending/snackvend, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"gM" = ( +/turf/open/floor/wood/large, +/area/awaymission/museum) +"gN" = ( +/obj/structure/lattice/catwalk/mining, +/obj/item/stack/rods/ten, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"gQ" = ( +/turf/open/mirage{ + target_turf_y = 14 + }, +/area/awaymission/museum) +"gR" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/rack, +/obj/effect/spawner/random/maintenance/eight, +/obj/effect/spawner/random/maintenance/eight, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"gT" = ( +/obj/machinery/door/window/left/directional/north, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/white, +/area/awaymission/museum) +"gW" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"hb" = ( +/turf/open/misc/beach/coast{ + dir = 9 + }, +/area/awaymission/museum/mothroachvoid) +"hi" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"hj" = ( +/obj/structure/lattice/catwalk/mining, +/turf/open/misc/grass, +/area/awaymission/museum/mothroachvoid) +"hk" = ( +/obj/effect/smooths_with_walls, +/turf/open/mirage{ + target_turf_y = -29; + dir = 1 + }, +/area/awaymission/museum) +"hl" = ( +/obj/machinery/door/poddoor/shutters/indestructible{ + id = "gateway_waste" + }, +/obj/machinery/conveyor{ + dir = 1 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"hp" = ( +/mob/living/basic/mothroach/bar, +/turf/open/floor/wood/tile, +/area/awaymission/museum) +"ht" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/spawner/random/vending/colavend, +/obj/machinery/light/small/directional/west, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"hw" = ( +/obj/effect/turf_decal/stripes/red/line{ + dir = 10 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"hA" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/chair/sofa/bench{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"hC" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/machinery/computer/terminal/museum{ + dir = 4; + content = list("2005 - By the early 2000s, Nanotrasen had long observed the computer gaming industry since its inception during the 1980s, and in 2005 would finally make their own entry into the market via the Nanoplay: the world’s first game console with built-in internet connectivity capabilities, bringing the gamers of the world together.") + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"hE" = ( +/obj/machinery/light/floor, +/turf/open/floor/holofloor/hyperspace/ns, +/area/awaymission/museum) +"hM" = ( +/turf/closed/wall/rock/porous, +/area/awaymission/museum) +"hT" = ( +/mob/living/basic/statue/mannequin{ + dir = 8; + name = "Dale Knox"; + held_item = /obj/item/circuitboard + }, +/obj/structure/sign/flag/nanotrasen/directional/south, +/turf/open/floor/holofloor/white, +/area/awaymission/museum) +"hV" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"hX" = ( +/obj/item/circuitboard{ + icon_state = "flopdrive"; + name = "microprocessor" + }, +/obj/structure/table/reinforced, +/turf/open/floor/circuit/green, +/area/awaymission/museum) +"hY" = ( +/obj/effect/turf_decal/trimline/yellow/arrow_ccw{ + dir = 6 + }, +/turf/open/floor/engine, +/area/awaymission/museum) +"il" = ( +/obj/structure/table/wood, +/obj/item/clothing/suit/costume/judgerobe, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"im" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 4 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"ix" = ( +/obj/effect/decal/cleanable/crayon{ + icon_state = "l"; + pixel_x = -10 + }, +/obj/effect/decal/cleanable/crayon{ + icon_state = "i" + }, +/obj/effect/decal/cleanable/crayon{ + icon_state = "e"; + pixel_x = 12 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/engine, +/area/awaymission/museum) +"iz" = ( +/obj/machinery/door/airlock/shuttle/glass, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 5 + }, +/turf/open/floor/mineral/plastitanium, +/area/awaymission/museum) +"iB" = ( +/obj/effect/spawner/random/engineering/canister, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/broken_flooring/singular/always_floorplane, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"iD" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/effect/decal/cleanable/blood/gibs, +/turf/open/floor/iron, +/area/awaymission/museum) +"iE" = ( +/obj/structure/fluff/wallsign/directional/west{ + name = "History of Nanotrasen" + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 4 + }, +/obj/machinery/light/warm/directional/west, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"iF" = ( +/obj/effect/turf_decal/sand/plating, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 1 + }, +/obj/machinery/button{ + pixel_y = 32 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"iI" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/painting{ + pixel_y = 32; + persistence_id = "museumgate" + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"iK" = ( +/obj/effect/turf_decal/sand/plating, +/obj/effect/turf_decal/siding{ + dir = 8 + }, +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/tram/plate, +/area/awaymission/museum) +"iN" = ( +/mob/living/basic/mothroach, +/obj/structure/window/spawner/directional/west, +/turf/open/floor/light/colour_cycle/dancefloor_b, +/area/awaymission/museum) +"iT" = ( +/obj/machinery/door/airlock/engineering, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/mapping_helpers/airlock/access/all/away/generic3, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"iU" = ( +/obj/machinery/telecomms/relay/preset/auto, +/turf/open/floor/bluespace, +/area/awaymission/museum) +"iV" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/railing{ + dir = 10 + }, +/obj/structure/table, +/obj/item/binoculars, +/obj/item/clothing/mask/whistle, +/turf/open/misc/grass, +/area/awaymission/museum/mothroachvoid) +"iW" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/awaymission/museum) +"iZ" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 4 + }, +/obj/effect/step_trigger/thrower{ + direction = 1; + facedir = 1; + tiles = 10; + mobs_only = 1 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"jf" = ( +/mob/living/basic/mothroach, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"jm" = ( +/mob/living/basic/mothroach, +/turf/open/misc/dirt/station, +/area/awaymission/museum/mothroachvoid) +"jn" = ( +/obj/effect/turf_decal/siding/dark_blue{ + dir = 4 + }, +/turf/open/floor/mineral/titanium/white, +/area/awaymission/museum) +"jo" = ( +/obj/effect/spawner/structure/window/hollow/directional{ + dir = 8 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"jt" = ( +/obj/structure/fluff/divine/conduit, +/obj/structure/railing{ + dir = 9 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/turf/open/floor/cult, +/area/awaymission/museum) +"jy" = ( +/mob/living/basic/statue/mannequin{ + dir = 8; + name = "Dale Knox"; + held_item = /obj/item/circuitboard + }, +/obj/effect/turf_decal/stripes{ + dir = 8 + }, +/turf/open/floor/circuit/green, +/area/awaymission/museum) +"jB" = ( +/obj/effect/spawner/structure/window, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"jF" = ( +/obj/machinery/suit_storage_unit/open, +/obj/effect/turf_decal/box, +/obj/structure/fluff/fake_camera{ + dir = 4 + }, +/turf/open/floor/iron/white/textured_large, +/area/awaymission/museum) +"jG" = ( +/turf/open/floor/carpet/cyan, +/area/awaymission/museum/mothroachvoid) +"jH" = ( +/obj/structure/fake_stairs/directional/west, +/turf/open/floor/iron/smooth_half, +/area/awaymission/museum) +"jI" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/engine, +/area/awaymission/museum) +"jL" = ( +/obj/structure/sink/kitchen/directional/west, +/turf/open/floor/iron/freezer, +/area/awaymission/museum) +"jN" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"jP" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue/corner{ + dir = 8 + }, +/obj/structure/table, +/obj/structure/fluff/fake_camera{ + dir = 9 + }, +/obj/item/reagent_containers/cup/glass/coffee, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"jU" = ( +/obj/effect/landmark/transport/nav_beacon/tram/platform{ + specific_transport_id = "museum_cargo"; + platform_code = 2; + name = "Exhibit Loading Bay" + }, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"jV" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/engine, +/area/awaymission/museum) +"jW" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/table, +/obj/item/integrated_circuit/loaded/hello_world, +/turf/open/floor/iron, +/area/awaymission/museum) +"kd" = ( +/mob/living/basic/mothroach, +/obj/structure/chair/comfy{ + dir = 1 + }, +/obj/effect/mapping_helpers/mob_buckler, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"ke" = ( +/obj/structure/statue/gold/hos{ + anchored = 1 + }, +/turf/open/floor/mineral/diamond, +/area/awaymission/museum/mothroachvoid) +"kg" = ( +/obj/machinery/conveyor{ + dir = 1 + }, +/obj/effect/spawner/random/structure/crate, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"kh" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/machinery/light/small/directional/west, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"kq" = ( +/obj/machinery/door/airlock/grunge, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"kr" = ( +/obj/structure/table/wood, +/obj/structure/window/spawner/directional/west, +/obj/item/storage/box/fireworks, +/turf/open/floor/wood/tile, +/area/awaymission/museum) +"kw" = ( +/obj/effect/turf_decal/tile/green/opposingcorners, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/green{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"kA" = ( +/obj/machinery/conveyor{ + dir = 1 + }, +/obj/item/vending_refill/wardrobe/coroner_wardrobe, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"kO" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/turf/open/floor/holofloor/white, +/area/awaymission/museum) +"kQ" = ( +/obj/structure/fluff/meteor, +/turf/open/floor/holofloor/hyperspace/ns, +/area/awaymission/museum) +"kX" = ( +/obj/structure/girder/displaced, +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/iron/smooth_half{ + dir = 1 + }, +/area/awaymission/museum) +"kY" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/random/entertainment/money_medium, +/obj/effect/spawner/random/entertainment/money_medium, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"la" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"lb" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"lf" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 9 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"lg" = ( +/mob/living/basic/mothroach, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/carpet/executive, +/area/awaymission/museum) +"lh" = ( +/obj/effect/turf_decal/stripes{ + dir = 8 + }, +/obj/structure/railing, +/turf/open/floor/catwalk_floor, +/area/awaymission/museum) +"lk" = ( +/obj/effect/turf_decal/siding/wideplating{ + dir = 4 + }, +/turf/open/floor/holofloor/beach/coast, +/area/awaymission/museum) +"ll" = ( +/obj/structure/plasticflaps/opaque, +/obj/machinery/conveyor{ + dir = 1 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"ls" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/computer/arcade/amputation{ + dir = 8 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"lz" = ( +/obj/effect/landmark/awaystart, +/obj/structure/flora/bush/sparsegrass/style_random, +/turf/open/floor/grass, +/area/awaymission/museum) +"lB" = ( +/obj/effect/turf_decal/sand/plating, +/obj/effect/turf_decal/siding{ + dir = 4 + }, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/tram/plate, +/area/awaymission/museum) +"lC" = ( +/obj/structure/table, +/obj/item/cigbutt/cigarbutt, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/museum) +"lG" = ( +/mob/living/basic/mothroach, +/obj/item/clothing/shoes/sandal/beach, +/turf/open/misc/beach/sand, +/area/awaymission/museum/mothroachvoid) +"lH" = ( +/obj/structure/plaque/static_plaque/golden/commission/uterus, +/turf/closed/indestructible/reinforced, +/area/awaymission/museum) +"lI" = ( +/obj/effect/smooths_with_walls, +/turf/open/mirage{ + target_turf_y = 29 + }, +/area/awaymission/museum) +"lM" = ( +/turf/open/floor/iron/smooth_large, +/area/awaymission/museum) +"lS" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/random/clothing/beret_or_rabbitears, +/turf/open/floor/iron, +/area/awaymission/museum) +"lT" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/mob/living/basic/statue/mannequin{ + hat = /obj/item/clothing/suit/toggle/labcoat/science; + dir = 1 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/smooth_large, +/area/awaymission/museum) +"lU" = ( +/obj/structure/plasticflaps, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"lV" = ( +/obj/structure/transport/linear/tram/slow, +/obj/structure/thermoplastic/light, +/obj/effect/landmark/transport/nav_beacon/tram/nav{ + specific_transport_id = "museum_cargo" + }, +/obj/effect/landmark/transport/nav_beacon/tram/platform{ + specific_transport_id = "museum_cargo"; + platform_code = 1; + name = "Internal Loading Bay" + }, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"lZ" = ( +/obj/structure/plaque/static_plaque/golden/commission/cere, +/turf/closed/indestructible/reinforced, +/area/awaymission/museum) +"mg" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/item/reagent_containers/cup/soda_cans/air, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"mj" = ( +/turf/open/mirage{ + range = 2; + target_turf_y = 4 + }, +/area/awaymission/museum) +"ml" = ( +/obj/structure/table/wood, +/obj/item/food/hotcrossbun, +/turf/open/floor/iron/freezer, +/area/awaymission/museum) +"mn" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/railing/corner{ + dir = 8 + }, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"mA" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/turf/open/floor/holofloor/beach/water, +/area/awaymission/museum) +"mC" = ( +/obj/structure/fluff/beach_umbrella, +/turf/open/floor/carpet/cyan, +/area/awaymission/museum/mothroachvoid) +"mK" = ( +/obj/structure/window/spawner/directional/south, +/turf/open/floor/light/colour_cycle/dancefloor_a, +/area/awaymission/museum) +"mN" = ( +/obj/structure/statue/sandstone/assistant, +/obj/effect/turf_decal/tile/green/opposingcorners, +/turf/open/floor/iron, +/area/awaymission/museum) +"mQ" = ( +/obj/structure/hedge, +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/grass, +/area/awaymission/museum) +"mS" = ( +/mob/living/basic/statue/mannequin{ + held_item = /obj/item/wrench; + hat = /obj/item/clothing/head/utility/hardhat; + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood/gibs, +/turf/open/floor/iron, +/area/awaymission/museum) +"mV" = ( +/turf/open/misc/grass, +/area/awaymission/museum/mothroachvoid) +"mX" = ( +/obj/machinery/computer/arcade/battle{ + dir = 4 + }, +/obj/effect/turf_decal/siding/red, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/smooth_half, +/area/awaymission/museum) +"mZ" = ( +/obj/effect/turf_decal/siding/wood, +/obj/machinery/door/airlock/freezer{ + req_access = list("bartender") + }, +/turf/open/floor/iron/freezer, +/area/awaymission/museum) +"nb" = ( +/turf/open/misc/beach/coast/corner, +/area/awaymission/museum/mothroachvoid) +"nc" = ( +/obj/structure/transport/linear/tram/slow, +/obj/structure/tram, +/obj/machinery/transport/tram_controller{ + configured_transport_id = "museum_cargo"; + cover_locked = 0 + }, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"ne" = ( +/obj/structure/fluff/preserved_borer, +/turf/open/floor/carpet, +/area/awaymission/museum) +"nh" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 5 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"nl" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/fluff/fake_camera{ + dir = 4 + }, +/turf/open/floor/engine, +/area/awaymission/museum) +"nq" = ( +/obj/structure/table/wood, +/obj/item/paper/fluff/jobs/security/court_judgement, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"nr" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/showroomfloor, +/area/awaymission/museum) +"ns" = ( +/obj/machinery/light/small/directional/south, +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/white, +/area/awaymission/museum) +"nu" = ( +/obj/effect/decal/cleanable/glass/titanium, +/mob/living/basic/mouse/rat, +/turf/open/floor/iron/white, +/area/awaymission/museum) +"nv" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 5 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"nw" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 8 + }, +/obj/machinery/computer/terminal/museum{ + dir = 8; + content = list("The so-called Hands Of God, loyal devotees of some illegal eldritch force. Their effect on the world weakened and crumbled as Nanotrasen loyal employees destroyed these so called Gods. Remember, only follow the faith of the chaplain and his regulated religions!") + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"nx" = ( +/obj/structure/chair/plastic{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"nz" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/fluff{ + icon = 'icons/mob/simple/hivebot.dmi'; + icon_state = "fab_robot"; + name = "old plasma extractor" + }, +/turf/open/lava/plasma/mafia, +/area/awaymission/museum) +"nC" = ( +/obj/structure/railing, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/carpet, +/area/awaymission/museum) +"nD" = ( +/obj/structure/plaque/static_plaque/golden/commission/efficiency, +/turf/closed/indestructible/reinforced, +/area/awaymission/museum) +"nE" = ( +/obj/machinery/light/warm/dim/directional/north, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/dark/diagonal, +/area/awaymission/museum) +"nF" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 8 + }, +/obj/effect/step_trigger/thrower{ + direction = 1; + facedir = 1; + tiles = 10; + mobs_only = 1 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"nH" = ( +/obj/structure/fluff/minepost, +/obj/effect/turf_decal/siding{ + dir = 5 + }, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/holofloor/asteroid, +/area/awaymission/museum) +"nJ" = ( +/obj/structure/fluff/divine/convertaltar, +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/cult, +/area/awaymission/museum) +"nQ" = ( +/obj/effect/spawner/random/vending/colavend, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/awaymission/museum) +"nS" = ( +/obj/effect/turf_decal/tile/dark_blue{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/awaymission/museum) +"nT" = ( +/obj/effect/mapping_helpers/bombable_wall, +/turf/closed/indestructible/fakedoor/maintenance, +/area/awaymission/museum) +"nW" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 1 + }, +/obj/structure/chair/sofa/bench/right{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"od" = ( +/obj/structure/fluff/fake_vent, +/turf/open/floor/iron, +/area/awaymission/museum) +"oe" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue/corner{ + dir = 1 + }, +/obj/structure/table, +/obj/item/food/sandwich/cheese/grilled, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"of" = ( +/obj/effect/puzzle_poddoor_open{ + icon = 'icons/effects/mapping_helpers.dmi'; + id = "museum_secret"; + queue_id = "museum_secret" + }, +/turf/closed/indestructible/reinforced, +/area/awaymission/museum) +"oo" = ( +/obj/machinery/iv_drip, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/turf/open/floor/holofloor/white, +/area/awaymission/museum) +"os" = ( +/obj/item/toy/beach_ball/branded, +/turf/open/misc/beach/sand, +/area/awaymission/museum/mothroachvoid) +"ot" = ( +/obj/structure/grille, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"ow" = ( +/obj/structure/girder/displaced, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"ox" = ( +/obj/machinery/computer/terminal/museum{ + dir = 8; + content = list("1998 - Dale Knox, the cofounder of Nanotrasen, would leave for health reasons.") + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"oA" = ( +/obj/effect/turf_decal/siding/wideplating{ + dir = 4 + }, +/turf/open/floor/holofloor/beach/water, +/area/awaymission/museum) +"oC" = ( +/obj/structure/flora/coconuts, +/turf/open/misc/beach/sand, +/area/awaymission/museum/mothroachvoid) +"oI" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/awaymission/museum) +"oQ" = ( +/turf/open/floor/holofloor/beach/coast{ + dir = 1 + }, +/area/awaymission/museum) +"oZ" = ( +/obj/effect/turf_decal/trimline/yellow/arrow_ccw{ + dir = 4 + }, +/turf/open/floor/engine, +/area/awaymission/museum) +"pb" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/sign/poster/official/pda_ad/directional/south, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"pc" = ( +/turf/open/floor/iron/dark/side{ + dir = 6 + }, +/area/awaymission/museum) +"pf" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood/gibs/body, +/turf/open/floor/iron, +/area/awaymission/museum) +"pg" = ( +/obj/effect/turf_decal/tile/green/opposingcorners, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/green{ + dir = 6 + }, +/obj/structure/hedge/opaque, +/turf/open/floor/iron, +/area/awaymission/museum) +"pi" = ( +/mob/living/basic/statue/mannequin{ + hat = /obj/item/clothing/head/costume/nursehat; + held_item = /obj/item/clothing/neck/stethoscope + }, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/turf/open/floor/holofloor/white, +/area/awaymission/museum) +"pp" = ( +/obj/structure/chair/stool/bar/directional/north, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"pt" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/carpet, +/area/awaymission/museum) +"pv" = ( +/obj/machinery/computer/terminal/museum{ + dir = 4; + content = list("Nanotrasen used to have much more volatile welding fuel mixtures because it was cheap. This backfired when a review revealed that infiltrators would use the fuel tanks to destroy bodies of their victims, leading to Nanotrasen developing a less unstable mixture months later.") + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"pw" = ( +/obj/effect/spawner/random/vending/snackvend, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/white, +/area/awaymission/museum) +"pD" = ( +/obj/structure/broken_flooring/corner/always_floorplane/directional/west, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/random/structure/crate_loot, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"pF" = ( +/obj/structure/hedge/opaque, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"pI" = ( +/obj/machinery/suit_storage_unit/open, +/obj/machinery/light/small/dim/directional/east, +/obj/effect/turf_decal/box, +/turf/open/floor/iron/white/textured_large, +/area/awaymission/museum) +"pL" = ( +/obj/item/clothing/suit/costume/bronze, +/turf/open/floor/bronze, +/area/awaymission/museum) +"pM" = ( +/obj/effect/spawner/random/engineering/canister, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/broken_flooring/singular/always_floorplane{ + dir = 8 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"pX" = ( +/obj/structure/rack, +/obj/effect/spawner/random/maintenance/two, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/grenade/iedcasing/spawned, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"pY" = ( +/obj/item/pickaxe/drill/diamonddrill, +/turf/open/misc/grass, +/area/awaymission/museum/mothroachvoid) +"qj" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron, +/area/awaymission/museum) +"qo" = ( +/obj/effect/oneway{ + dir = 8 + }, +/turf/open/water/beach, +/area/awaymission/museum/mothroachvoid) +"qp" = ( +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"qt" = ( +/obj/effect/spawner/random/food_or_drink/booze{ + loot = list(/obj/item/reagent_containers/cup/glass/bottle/beer = 10, /obj/item/reagent_containers/cup/glass/bottle/ale = 10, /obj/item/reagent_containers/cup/glass/bottle/beer/light = 5, /obj/item/reagent_containers/cup/glass/bottle/maltliquor = 5, /obj/item/reagent_containers/cup/glass/bottle/whiskey = 5, /obj/item/reagent_containers/cup/glass/bottle/gin = 5, /obj/item/reagent_containers/cup/glass/bottle/vodka = 5, /obj/item/reagent_containers/cup/glass/bottle/tequila = 5, /obj/item/reagent_containers/cup/glass/bottle/rum = 5, /obj/item/reagent_containers/cup/glass/bottle/vermouth = 5, /obj/item/reagent_containers/cup/glass/bottle/cognac = 5, /obj/item/reagent_containers/cup/glass/bottle/wine = 5, /obj/item/reagent_containers/cup/glass/bottle/kahlua = 5, /obj/item/reagent_containers/cup/glass/bottle/amaretto = 5, /obj/item/reagent_containers/cup/glass/bottle/hcider = 5, /obj/item/reagent_containers/cup/glass/bottle/absinthe = 5, /obj/item/reagent_containers/cup/glass/bottle/sake = 5, /obj/item/reagent_containers/cup/glass/bottle/grappa = 5, /obj/item/reagent_containers/cup/glass/bottle/applejack = 5, /obj/item/reagent_containers/cup/glass/bottle/wine_voltaic = 5, /obj/item/reagent_containers/cup/bottle/ethanol = 2, /obj/item/reagent_containers/cup/glass/bottle/fernet = 2, /obj/item/reagent_containers/cup/glass/bottle/champagne = 2, /obj/item/reagent_containers/cup/glass/bottle/absinthe/premium = 2, /obj/item/reagent_containers/cup/glass/bottle/goldschlager = 2, /obj/item/reagent_containers/cup/glass/bottle/patron = 1, /obj/item/reagent_containers/cup/glass/bottle/kong = 1, /obj/item/reagent_containers/cup/glass/bottle/lizardwine = 1, /obj/item/reagent_containers/cup/glass/bottle/vodka/badminka = 1, /obj/item/reagent_containers/cup/glass/bottle/trappist = 1); + spawn_random_offset = 2 + }, +/turf/open/floor/carpet/cyan, +/area/awaymission/museum/mothroachvoid) +"qw" = ( +/obj/item/flashlight/flare{ + start_on = 1; + icon_state = "flare-on" + }, +/obj/structure/table, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"qx" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/decal/cleanable/fuel_pool/hivis, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"qA" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"qJ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/engine, +/area/awaymission/museum) +"qL" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 1 + }, +/obj/structure/fluff/fake_camera{ + dir = 5 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"qM" = ( +/obj/machinery/conveyor{ + dir = 1 + }, +/obj/effect/spawner/random/structure/closet_empty/crate/with_loot, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"qP" = ( +/obj/structure/plaque/static_plaque/golden/commission/pubby, +/turf/closed/indestructible/reinforced, +/area/awaymission/museum) +"qQ" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"qR" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue/corner{ + dir = 4 + }, +/obj/structure/chair/sofa/bench/right{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"qS" = ( +/obj/structure/lattice, +/obj/structure/grille, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"qU" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/decal/cleanable/fuel_pool/hivis, +/obj/effect/turf_decal/delivery/red, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"qX" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 1 + }, +/obj/structure/fluff/fake_camera, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"qY" = ( +/obj/machinery/power/shuttle_engine/heater{ + dir = 4; + opacity = 1 + }, +/obj/structure/window/reinforced/spawner/directional/west, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"rc" = ( +/obj/machinery/light/small/directional/east, +/obj/structure/girder/displaced, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"re" = ( +/turf/cordon/secret, +/area/awaymission/museum) +"rm" = ( +/turf/open/indestructible/plating, +/area/awaymission/museum) +"ro" = ( +/obj/structure/railing, +/turf/open/floor/holofloor/asteroid{ + icon_state = "asteroid3" + }, +/area/awaymission/museum) +"rp" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/floor/carpet/executive, +/area/awaymission/museum) +"rq" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/gibspawner/human, +/obj/effect/gibspawner/human, +/obj/effect/gibspawner/human, +/obj/effect/gibspawner/human, +/mob/living/basic/statue/mannequin/suspicious, +/turf/open/floor/iron, +/area/awaymission/museum) +"rr" = ( +/turf/open/floor/wood/tile, +/area/awaymission/museum) +"rA" = ( +/obj/structure/chair/comfy/beige{ + dir = 8 + }, +/mob/living/basic/mothroach, +/obj/effect/mapping_helpers/mob_buckler, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"rB" = ( +/obj/structure/lattice/catwalk/mining, +/obj/machinery/light/floor, +/turf/open/chasm, +/area/awaymission/museum) +"rJ" = ( +/obj/structure/broken_flooring/side/always_floorplane{ + dir = 2 + }, +/obj/structure/lattice, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"rL" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/holosign/barrier/engineering, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"rO" = ( +/obj/effect/spawner/random/trash/mess, +/obj/effect/turf_decal/siding/red, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/smooth_half, +/area/awaymission/museum) +"rP" = ( +/obj/item/clothing/mask/gas/clown_hat, +/turf/open/floor/iron, +/area/awaymission/museum) +"rQ" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 1 + }, +/obj/structure/railing/corner/end, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"rU" = ( +/mob/living/basic/statue/mannequin{ + dir = 4; + held_item = /obj/item/wrench; + name = "Michael Trasen" + }, +/obj/structure/sign/flag/nanotrasen/directional/south, +/obj/machinery/light/small/dim/directional/west, +/turf/open/floor/holofloor/white, +/area/awaymission/museum) +"rW" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/structure/table/reinforced, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/effect/turf_decal/siding/dark_blue, +/obj/effect/spawner/random/entertainment/toy_figure, +/obj/effect/spawner/random/entertainment/toy_figure, +/obj/structure/desk_bell, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"rX" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/engine, +/area/awaymission/museum) +"rY" = ( +/obj/machinery/light/small/broken/directional/north, +/obj/effect/decal/cleanable/dirt/dust, +/mob/living/basic/mouse/rat, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"sd" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/chair/office, +/turf/open/floor/iron, +/area/awaymission/museum) +"sh" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/filingcabinet/chestdrawer, +/turf/open/floor/iron, +/area/awaymission/museum) +"sj" = ( +/mob/living/basic/statue{ + sentience_type = 2 + }, +/turf/open/floor/black, +/area/awaymission/museum) +"sm" = ( +/obj/effect/turf_decal/siding/dark_blue{ + dir = 8 + }, +/turf/open/floor/mineral/titanium/white, +/area/awaymission/museum) +"sp" = ( +/obj/machinery/door/window/left/directional/west, +/obj/machinery/light/warm/directional/south, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"sq" = ( +/obj/structure/plaque/static_plaque/golden/commission/delta, +/turf/closed/indestructible/reinforced, +/area/awaymission/museum) +"st" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 4 + }, +/obj/machinery/door/poddoor/shutters/preopen, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"sy" = ( +/obj/structure/railing/corner, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/fluff/fake_camera, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"sz" = ( +/obj/effect/decal/cleanable/glass/titanium, +/turf/open/floor/iron/white, +/area/awaymission/museum) +"sA" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/gift{ + contains_type = /mob/living/basic/pet/cat/feral + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"sC" = ( +/obj/item/toy/figure/dsquad, +/obj/item/toy/figure/dsquad{ + pixel_x = -9 + }, +/obj/item/toy/figure/dsquad{ + pixel_x = 9 + }, +/obj/structure/window/reinforced/spawner/directional/west, +/turf/open/floor/holofloor/beach/coast, +/area/awaymission/museum) +"sD" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/railing{ + dir = 8 + }, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"sE" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 4 + }, +/obj/machinery/door/poddoor/shutters/indestructible{ + id = "museum_secret" + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"sG" = ( +/obj/effect/turf_decal/tile/green, +/turf/open/floor/iron, +/area/awaymission/museum) +"sN" = ( +/obj/effect/mine/explosive, +/obj/item/food/cake/berry_chocolate_cake, +/obj/structure/table, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/engine, +/area/awaymission/museum) +"sX" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 1 + }, +/obj/machinery/light/warm/directional/south, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"tc" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/railing{ + dir = 6 + }, +/obj/structure/chair, +/mob/living/basic/mothroach, +/obj/effect/mapping_helpers/mob_buckler, +/turf/open/misc/grass, +/area/awaymission/museum/mothroachvoid) +"tf" = ( +/obj/item/instrument/musicalmoth, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"th" = ( +/obj/structure/flora/rock/icy/style_random, +/obj/effect/turf_decal/siding{ + dir = 4 + }, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/holofloor/asteroid, +/area/awaymission/museum) +"tj" = ( +/obj/effect/turf_decal/sand/plating, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 1 + }, +/mob/living/basic/statue/mannequin{ + dir = 1; + hat = /obj/item/clothing/head/utility/hardhat; + held_item = /obj/item/wrench + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"tk" = ( +/obj/structure/plaque/static_plaque/golden/commission/northstar, +/turf/open/floor/mineral/gold, +/area/awaymission/museum) +"tl" = ( +/obj/item/food/cake/mothmallow, +/obj/structure/table, +/turf/open/floor/carpet/executive, +/area/awaymission/museum) +"tq" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/awaymission/museum) +"ts" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"tt" = ( +/obj/effect/turf_decal/siding/dark_blue/corner{ + dir = 8 + }, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/museum) +"tv" = ( +/obj/effect/turf_decal/stripes{ + dir = 4 + }, +/obj/structure/railing, +/turf/open/floor/iron/smooth_half, +/area/awaymission/museum) +"tx" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/food_or_drink/booze{ + loot = list(/obj/item/reagent_containers/cup/glass/bottle/beer = 10, /obj/item/reagent_containers/cup/glass/bottle/ale = 10, /obj/item/reagent_containers/cup/glass/bottle/beer/light = 5, /obj/item/reagent_containers/cup/glass/bottle/maltliquor = 5, /obj/item/reagent_containers/cup/glass/bottle/whiskey = 5, /obj/item/reagent_containers/cup/glass/bottle/gin = 5, /obj/item/reagent_containers/cup/glass/bottle/vodka = 5, /obj/item/reagent_containers/cup/glass/bottle/tequila = 5, /obj/item/reagent_containers/cup/glass/bottle/rum = 5, /obj/item/reagent_containers/cup/glass/bottle/vermouth = 5, /obj/item/reagent_containers/cup/glass/bottle/cognac = 5, /obj/item/reagent_containers/cup/glass/bottle/wine = 5, /obj/item/reagent_containers/cup/glass/bottle/kahlua = 5, /obj/item/reagent_containers/cup/glass/bottle/amaretto = 5, /obj/item/reagent_containers/cup/glass/bottle/hcider = 5, /obj/item/reagent_containers/cup/glass/bottle/absinthe = 5, /obj/item/reagent_containers/cup/glass/bottle/sake = 5, /obj/item/reagent_containers/cup/glass/bottle/grappa = 5, /obj/item/reagent_containers/cup/glass/bottle/applejack = 5, /obj/item/reagent_containers/cup/glass/bottle/wine_voltaic = 5, /obj/item/reagent_containers/cup/bottle/ethanol = 2, /obj/item/reagent_containers/cup/glass/bottle/fernet = 2, /obj/item/reagent_containers/cup/glass/bottle/champagne = 2, /obj/item/reagent_containers/cup/glass/bottle/absinthe/premium = 2, /obj/item/reagent_containers/cup/glass/bottle/goldschlager = 2, /obj/item/reagent_containers/cup/glass/bottle/patron = 1, /obj/item/reagent_containers/cup/glass/bottle/kong = 1, /obj/item/reagent_containers/cup/glass/bottle/lizardwine = 1, /obj/item/reagent_containers/cup/glass/bottle/vodka/badminka = 1, /obj/item/reagent_containers/cup/glass/bottle/trappist = 1); + spawn_random_offset = 2 + }, +/turf/open/floor/wood/tile, +/area/awaymission/museum) +"ty" = ( +/obj/structure/table, +/obj/item/clothing/gloves/color/yellow{ + siemens_coefficient = 10; + name = "fake stungloves"; + desc = "A crude replica of stungloves. Essentially gloves wrapped with wire. Extremely unsafe." + }, +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/awaymission/museum) +"tB" = ( +/obj/effect/turf_decal/siding/thinplating_new, +/turf/open/chasm, +/area/awaymission/museum) +"tC" = ( +/obj/structure/sign/departments/lawyer/directional/south, +/turf/open/misc/grass, +/area/awaymission/museum/mothroachvoid) +"tD" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"tG" = ( +/obj/structure/barricade/wooden/crude, +/turf/closed/indestructible/fakedoor, +/area/awaymission/museum) +"tI" = ( +/obj/effect/turf_decal/siding{ + dir = 8 + }, +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/holofloor/asteroid{ + icon_state = "asteroid5" + }, +/area/awaymission/museum) +"tK" = ( +/obj/structure/sign/warning, +/turf/closed/indestructible/reinforced, +/area/awaymission/museum) +"tM" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/contraband/cannabis, +/obj/effect/spawner/random/contraband/cannabis, +/obj/effect/spawner/random/contraband/cannabis, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"tN" = ( +/obj/effect/turf_decal/sand/plating, +/turf/open/floor/tram/plate, +/area/awaymission/museum) +"tS" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/closet/crate/bin, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"tU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood/old, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"uc" = ( +/turf/open/floor/light/colour_cycle/dancefloor_a, +/area/awaymission/museum) +"ud" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"ue" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/light/small/dim/directional/north, +/obj/effect/turf_decal/stripes/red/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"uf" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 1 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"ul" = ( +/obj/effect/oneway{ + dir = 8 + }, +/turf/open/floor/holofloor/beach/coast{ + dir = 2 + }, +/area/awaymission/museum/mothroachvoid) +"up" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/machinery/door/airlock/wood{ + name = "Bathroom" + }, +/turf/open/floor/iron/showroomfloor, +/area/awaymission/museum) +"uu" = ( +/obj/structure/rack, +/obj/effect/spawner/random/engineering/material, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"uE" = ( +/obj/structure/hedge, +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/turf/open/floor/grass, +/area/awaymission/museum) +"uM" = ( +/obj/structure/fluff/fake_camera{ + dir = 10 + }, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/museum) +"uN" = ( +/turf/open/floor/grass, +/area/awaymission/museum) +"uR" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/small/dim/directional/east, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"uT" = ( +/obj/effect/spawner/structure/window/reinforced/shuttle/indestructible, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"uY" = ( +/turf/open/floor/iron, +/area/awaymission/museum) +"vb" = ( +/obj/structure/grille/indestructible, +/obj/effect/decal/cleanable/fuel_pool/hivis, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"vc" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/painting/large{ + persistence_id = "museumgate_big"; + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"ve" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/holosign/barrier/engineering, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"vg" = ( +/obj/structure/puzzle_blockade/oneway{ + dir = 8 + }, +/obj/structure/broken_flooring/side/always_floorplane/directional/south, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"vh" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/item/reagent_containers/cup/soda_cans/sol_dry, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"vj" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/table, +/obj/item/phone, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"vp" = ( +/obj/structure/girder/displaced, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"vs" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/holosign/barrier/engineering, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"vw" = ( +/obj/structure/window/bronze/spawner/directional/south, +/obj/structure/window/bronze/spawner/directional/west, +/obj/structure/window/bronze/spawner/directional/north, +/obj/structure/grille, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"vx" = ( +/obj/structure/sign/poster/random/directional/north, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"vy" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"vC" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/chair/plastic, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"vE" = ( +/obj/effect/turf_decal/tile/green/opposingcorners, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/green{ + dir = 5 + }, +/obj/structure/filingcabinet, +/turf/open/floor/iron, +/area/awaymission/museum) +"vM" = ( +/mob/living/basic/statue/mannequin{ + dir = 1; + hat = /obj/item/clothing/suit/costume/bronze + }, +/obj/structure/fluff/fake_camera{ + dir = 4 + }, +/turf/open/floor/bronze, +/area/awaymission/museum) +"vO" = ( +/turf/open/floor/iron/stairs/left{ + dir = 4 + }, +/area/awaymission/museum) +"vU" = ( +/obj/machinery/door/airlock/wood{ + name = "Dance Room" + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"vZ" = ( +/obj/structure/table/reinforced, +/obj/effect/spawner/random/entertainment/toy, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/effect/turf_decal/siding/dark_blue, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/museum) +"wh" = ( +/obj/structure/broken_flooring/corner/always_floorplane/directional/west, +/obj/structure/lattice, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"wi" = ( +/obj/machinery/door/poddoor/shutters/indestructible{ + dir = 8; + id = "nothing" + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"wk" = ( +/obj/machinery/vending/dinnerware, +/turf/open/floor/iron/freezer, +/area/awaymission/museum) +"wy" = ( +/obj/effect/turf_decal/loading_area{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"wA" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"wC" = ( +/obj/structure/hedge, +/obj/effect/turf_decal/siding/wideplating{ + dir = 1 + }, +/turf/open/floor/iron/dark/diagonal, +/area/awaymission/museum) +"wE" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 6 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"wG" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 4 + }, +/obj/structure/broken_flooring/corner/always_floorplane{ + dir = 8 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"wH" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood/footprints, +/turf/open/floor/iron, +/area/awaymission/museum) +"wI" = ( +/obj/structure/window/spawner/directional/north, +/turf/open/floor/light/colour_cycle/dancefloor_a, +/area/awaymission/museum) +"wJ" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/structure/fluff/dnamod, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"wL" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/flora/bush/sparsegrass/style_random, +/turf/open/floor/grass, +/area/awaymission/museum) +"wN" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/painting/large{ + persistence_id = "museumgate_big"; + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"wO" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"wZ" = ( +/turf/open/misc/beach/coast{ + dir = 1 + }, +/area/awaymission/museum/mothroachvoid) +"xb" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 4 + }, +/obj/structure/chair/sofa/bench/left{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"xc" = ( +/obj/structure/falsewall/reinforced, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"xd" = ( +/obj/structure/table/reinforced, +/obj/structure/window/spawner/directional/west, +/obj/effect/spawner/random/bureaucracy/paper{ + spawn_random_offset = 7; + spawn_loot_count = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/white, +/area/awaymission/museum) +"xf" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 1 + }, +/obj/structure/sign/poster/official/random/directional/south, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"xg" = ( +/obj/structure/table/reinforced, +/obj/item/circuitboard{ + icon_state = "bluespacearray"; + name = "fancy replica tech" + }, +/turf/open/floor/iron/smooth_large, +/area/awaymission/museum) +"xj" = ( +/obj/effect/turf_decal/siding{ + dir = 1 + }, +/turf/open/floor/holofloor/asteroid{ + icon_state = "asteroid3" + }, +/area/awaymission/museum) +"xm" = ( +/turf/open/floor/holofloor/beach/coast{ + dir = 2 + }, +/area/awaymission/museum/mothroachvoid) +"xn" = ( +/obj/effect/oneway{ + dir = 8 + }, +/turf/open/misc/beach/sand, +/area/awaymission/museum/mothroachvoid) +"xr" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/closet/crate/freezer/food, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"xt" = ( +/obj/item/kirbyplants/random, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"xu" = ( +/turf/closed/indestructible/rock, +/area/awaymission/museum/mothroachvoid) +"xv" = ( +/obj/structure/hedge, +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/floor/grass, +/area/awaymission/museum) +"xx" = ( +/obj/effect/turf_decal/siding/dark_blue{ + dir = 10 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"xB" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/flashlight/lamp{ + start_on = 0 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"xD" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/fluff/balloon_nuke, +/turf/open/floor/holofloor/beach, +/area/awaymission/museum) +"xE" = ( +/turf/open/floor/mineral/gold, +/area/awaymission/museum/mothroachvoid) +"xF" = ( +/mob/living/basic/statue/mannequin{ + dir = 1; + held_item = /obj/item/weldingtool + }, +/obj/effect/mapping_helpers/burnt_floor, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron, +/area/awaymission/museum) +"xI" = ( +/turf/open/floor/iron/white, +/area/awaymission/museum) +"xJ" = ( +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/machinery/computer/terminal/museum{ + dir = 1; + content = list("1995 - By the early 90s, as computers became smaller and technology more compact, Trasen-Knox saw the need to create more of a recognisable brand. They would officially change their name to Nanotrasen in 1995, and the name would stick for the company.") + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"xP" = ( +/obj/structure/closet/crate/cardboard, +/obj/item/storage/toolbox/artistic, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"xR" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"xT" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/item/storage/box/party_poppers, +/obj/structure/table/wood, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"ya" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/item/plate, +/obj/item/food/kebab/fiesta, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"yf" = ( +/obj/structure/lattice/catwalk/mining, +/obj/machinery/light/small/directional/north, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"yi" = ( +/obj/structure/chair/comfy/beige{ + dir = 1 + }, +/mob/living/basic/mothroach, +/obj/effect/mapping_helpers/mob_buckler, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"yl" = ( +/turf/open/lava/plasma/mafia, +/area/awaymission/museum) +"yn" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 8 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"yo" = ( +/obj/machinery/conveyor/inverted{ + dir = 10 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"yq" = ( +/obj/structure/fluff/meteor/large, +/turf/open/floor/holofloor/hyperspace/ns, +/area/awaymission/museum) +"yr" = ( +/obj/structure/chair/comfy, +/obj/effect/mapping_helpers/mob_buckler, +/mob/living/basic/mothroach, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"yu" = ( +/turf/open/floor/catwalk_floor/iron_dark, +/area/awaymission/museum) +"yw" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/railing{ + dir = 10 + }, +/obj/structure/table, +/obj/item/flashlight/lamp, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"yx" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/end, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"yA" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"yE" = ( +/obj/item/pickaxe/diamond, +/turf/open/misc/grass, +/area/awaymission/museum/mothroachvoid) +"yF" = ( +/obj/machinery/light/small/broken/directional/south, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"yG" = ( +/obj/structure/lattice/catwalk/mining, +/obj/machinery/button/door/directional/east{ + id = "gateway_waste" + }, +/obj/structure/railing, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"yK" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 8 + }, +/obj/structure/fluff/fokoff_sign, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"yM" = ( +/obj/machinery/door/poddoor{ + id = "gatewayfake" + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"yN" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/computer/terminal/museum{ + dir = 8; + content = list("Galaxywise Shipyards (Field: General Aerospace) - Much of Nanotrasen's strength as a megacorporation comes from their ability to practice what is essentially autarky- the production of all required goods from raw material to finalised item, with little to no reliance on external companies or factors. To this end, Galaxywise is critical to Nanotrasen's practice of autarky- from their orbital shipyards above Adasta, Nanotrasen is able to produce a wide range of important vessels, from small single-man scouting vessels to large-scale freighters and everything inbetween. Unfortunately for Nanotrasen, however, their autarky chain is broken by limitations imposed by TerraGov stating that only licensed corporations are capable of producing heavily armed vessels (the Merchant Marine Act states that any vessel capable of bearing armaments in excess of Class 2, the highest legal civilian grade, may be produced by licensed companies only)- a license Galaxywise has been unable to secure due to politicking by corporate rivals at the senate. ") + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"yS" = ( +/turf/closed/wall/space, +/area/awaymission/museum) +"zc" = ( +/obj/structure/railing, +/obj/effect/turf_decal/stripes, +/obj/structure/fluff/fake_camera{ + dir = 8 + }, +/turf/open/floor/iron/smooth_large, +/area/awaymission/museum) +"zd" = ( +/obj/effect/landmark/awaystart, +/turf/open/floor/grass, +/area/awaymission/museum) +"zg" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 6 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"zh" = ( +/obj/machinery/conveyor{ + dir = 9 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"zr" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"zz" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/girder/bronze, +/turf/open/floor/bronze/flat, +/area/awaymission/museum) +"zA" = ( +/obj/effect/mapping_helpers/ztrait_injector/museum, +/turf/open/floor/bluespace, +/area/awaymission/museum) +"zC" = ( +/obj/machinery/vending/boozeomat/all_access, +/turf/open/floor/wood/tile, +/area/awaymission/museum) +"zE" = ( +/turf/closed/indestructible/rock, +/area/awaymission/museum) +"zG" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/effect/turf_decal/siding/red, +/mob/living/basic/statue/mannequin{ + dir = 8; + hat = /obj/item/clothing/head/fedora + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/smooth_half, +/area/awaymission/museum) +"zI" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/structure/window/bronze/spawner/directional/north, +/obj/machinery/computer/terminal/museum{ + pixel_y = -6; + content = list("Ratvar was once a powerful entity competing with the likes of Nar-Sie. It resided on a plane known as “Reebee” or the “City of cogs.” Supposedly, it was a clockwork city made of brass in which its cultists could enter once they had realized its power. However, this plane was also Ratvar’s prison from which it yearned to escape. While Reebee is gone, it is assumed that other structures such as temples or engines of the cult's creation still exist although it is unknown if they still have the power once bestowed to them by Ratvar. The fall of Reebe was an event in which Reebe, Ratvar, and all of its cultists were struck down by Nanotrasen. The cult was preparing Reebe for the freeing of Ratvar where the Veil was weak. Outpost 17, a small nanotrasen asteroid mining station was the target. Brave crewmembers managed to slip through the cracks in the veil and into the heart of Reebe with a bluespace artillery beacon in tow. With a desperate plea being sent out to a nearby security outpost, Reebe was obliterated along with the crewmembers of Outpost 17.") + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"zK" = ( +/obj/machinery/computer/arcade/battle{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/tile, +/area/awaymission/museum) +"zL" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/table, +/obj/item/stamp/denied{ + pixel_y = 12 + }, +/obj/item/stamp/granted{ + pixel_y = 12; + pixel_x = 8 + }, +/obj/effect/spawner/random/bureaucracy/paper{ + spawn_random_offset = 12; + spawn_scatter_radius = 1; + spawn_loot_count = 8 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"zM" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood/tracks, +/obj/structure/broken_flooring/side/always_floorplane{ + dir = 8 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"zR" = ( +/obj/structure/statue/gold/hop{ + anchored = 1 + }, +/turf/open/floor/mineral/diamond, +/area/awaymission/museum/mothroachvoid) +"zU" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/generic, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"zX" = ( +/obj/machinery/door/poddoor/shutters/preopen, +/turf/open/floor/iron, +/area/awaymission/museum) +"zY" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue, +/obj/machinery/light/warm/directional/north, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Ab" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/glass/titanium, +/obj/structure/chair{ + dir = 1 + }, +/obj/structure/fluff/fake_vent, +/turf/open/floor/iron/white, +/area/awaymission/museum) +"Ag" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/awaymission/museum) +"Ah" = ( +/obj/structure/transport/linear/tram/slow, +/obj/structure/tram/alt/titanium, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"Ai" = ( +/obj/structure/transport/linear/tram/slow, +/obj/structure/thermoplastic, +/obj/effect/spawner/random/structure/closet_empty/crate/with_loot, +/obj/machinery/door/window/elevator/left/directional/south{ + transport_linked_id = "museum_cargo" + }, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"Ak" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/chair/sofa/bench/right{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Am" = ( +/obj/structure/window/spawner/directional/west, +/obj/structure/window/spawner/directional/north, +/turf/open/floor/light/colour_cycle/dancefloor_a, +/area/awaymission/museum) +"Aq" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/sign/poster/random/directional/east, +/turf/open/floor/engine, +/area/awaymission/museum) +"Ar" = ( +/turf/open/water/beach, +/area/awaymission/museum/mothroachvoid) +"As" = ( +/mob/living/basic/statue/mannequin{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow, +/obj/effect/turf_decal/trimline/yellow/corner, +/obj/machinery/conveyor{ + dir = 1 + }, +/turf/open/floor/engine, +/area/awaymission/museum) +"At" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/grass, +/area/awaymission/museum) +"Ay" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue/corner{ + dir = 1 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"AC" = ( +/obj/machinery/door/airlock/shuttle/glass, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 9 + }, +/turf/open/floor/mineral/plastitanium, +/area/awaymission/museum) +"AE" = ( +/obj/structure/fluff/divine/powerpylon, +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/cult, +/area/awaymission/museum) +"AG" = ( +/obj/machinery/oven, +/turf/open/floor/iron/freezer, +/area/awaymission/museum) +"AI" = ( +/obj/machinery/conveyor{ + dir = 1 + }, +/obj/machinery/light/small/dim/directional/east, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"AM" = ( +/obj/effect/step_trigger/teleporter/offset{ + teleport_y_offset = -30 + }, +/turf/open/mirage{ + target_turf_y = -29; + dir = 1 + }, +/area/awaymission/museum) +"AP" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"AR" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/grille/broken, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"AS" = ( +/obj/effect/smooths_with_walls, +/turf/open/mirage{ + dir = 1; + target_turf_x = -9 + }, +/area/awaymission/museum) +"AY" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/machinery/door/airlock/grunge{ + name = "Souvenir Shop" + }, +/obj/effect/turf_decal/siding/green, +/obj/effect/mapping_helpers/airlock/access/all/away/generic3, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"AZ" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 1 + }, +/obj/machinery/light/warm/directional/south, +/obj/structure/closet/crate/bin, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Be" = ( +/obj/effect/turf_decal/stripes/red/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"Bj" = ( +/obj/structure/closet/lawcloset, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"Bo" = ( +/obj/machinery/jukebox, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"Bq" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 8 + }, +/obj/machinery/light/warm/directional/east, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Bu" = ( +/obj/effect/turf_decal/siding/dark_blue/corner{ + dir = 1 + }, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/museum) +"BF" = ( +/turf/open/misc/beach/coast{ + dir = 6 + }, +/area/awaymission/museum/mothroachvoid) +"BK" = ( +/obj/structure/railing{ + dir = 8 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"BO" = ( +/obj/structure/sign/poster/random/directional/south, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/white, +/area/awaymission/museum) +"BQ" = ( +/obj/machinery/conveyor{ + dir = 1 + }, +/turf/open/floor/engine, +/area/awaymission/museum) +"BX" = ( +/obj/machinery/conveyor{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"Cb" = ( +/obj/structure/transport/linear/tram/slow, +/obj/structure/thermoplastic, +/obj/effect/spawner/random/structure/closet_empty/crate/with_loot, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"Cc" = ( +/obj/structure/hedge/opaque, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Cd" = ( +/obj/effect/step_trigger/teleporter/offset{ + teleport_y_offset = 14 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"Cf" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue/corner{ + dir = 4 + }, +/obj/structure/table, +/obj/effect/spawner/random/bureaucracy/crayon{ + spawn_loot_count = 5; + spawn_random_offset = 4 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Ci" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/item/clothing/mask/party_horn, +/obj/item/clothing/mask/party_horn, +/obj/structure/table/wood, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"Cj" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/green/opposingcorners, +/obj/effect/spawner/random/entertainment/toy, +/obj/effect/spawner/random/entertainment/toy, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/green{ + dir = 8 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"Co" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 4 + }, +/obj/structure/chair/sofa/bench{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Cq" = ( +/obj/structure/statue/gold/rd{ + anchored = 1 + }, +/turf/open/floor/mineral/diamond, +/area/awaymission/museum/mothroachvoid) +"Cu" = ( +/turf/open/misc/beach/coast{ + dir = 10 + }, +/area/awaymission/museum/mothroachvoid) +"Cy" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/food_or_drink/booze{ + loot = list(/obj/item/reagent_containers/cup/glass/bottle/beer = 10, /obj/item/reagent_containers/cup/glass/bottle/ale = 10, /obj/item/reagent_containers/cup/glass/bottle/beer/light = 5, /obj/item/reagent_containers/cup/glass/bottle/maltliquor = 5, /obj/item/reagent_containers/cup/glass/bottle/whiskey = 5, /obj/item/reagent_containers/cup/glass/bottle/gin = 5, /obj/item/reagent_containers/cup/glass/bottle/vodka = 5, /obj/item/reagent_containers/cup/glass/bottle/tequila = 5, /obj/item/reagent_containers/cup/glass/bottle/rum = 5, /obj/item/reagent_containers/cup/glass/bottle/vermouth = 5, /obj/item/reagent_containers/cup/glass/bottle/cognac = 5, /obj/item/reagent_containers/cup/glass/bottle/wine = 5, /obj/item/reagent_containers/cup/glass/bottle/kahlua = 5, /obj/item/reagent_containers/cup/glass/bottle/amaretto = 5, /obj/item/reagent_containers/cup/glass/bottle/hcider = 5, /obj/item/reagent_containers/cup/glass/bottle/absinthe = 5, /obj/item/reagent_containers/cup/glass/bottle/sake = 5, /obj/item/reagent_containers/cup/glass/bottle/grappa = 5, /obj/item/reagent_containers/cup/glass/bottle/applejack = 5, /obj/item/reagent_containers/cup/glass/bottle/wine_voltaic = 5, /obj/item/reagent_containers/cup/bottle/ethanol = 2, /obj/item/reagent_containers/cup/glass/bottle/fernet = 2, /obj/item/reagent_containers/cup/glass/bottle/champagne = 2, /obj/item/reagent_containers/cup/glass/bottle/absinthe/premium = 2, /obj/item/reagent_containers/cup/glass/bottle/goldschlager = 2, /obj/item/reagent_containers/cup/glass/bottle/patron = 1, /obj/item/reagent_containers/cup/glass/bottle/kong = 1, /obj/item/reagent_containers/cup/glass/bottle/lizardwine = 1, /obj/item/reagent_containers/cup/glass/bottle/vodka/badminka = 1, /obj/item/reagent_containers/cup/glass/bottle/trappist = 1); + spawn_random_offset = 2; + spawn_loot_count = 2 + }, +/obj/machinery/light/warm/directional/west, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"CB" = ( +/obj/effect/turf_decal/stripes/red/line{ + dir = 5 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"CC" = ( +/obj/effect/turf_decal/siding/wideplating, +/turf/open/misc/beach/sand, +/area/awaymission/museum/mothroachvoid) +"CD" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 4 + }, +/obj/structure/fluff/wallsign/directional/west{ + name = "Exit"; + dir = 2 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"CF" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 4 + }, +/obj/machinery/door/poddoor/shutters/indestructible{ + id = "nothing" + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"CI" = ( +/obj/effect/turf_decal/caution, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"CK" = ( +/obj/item/bedsheet/medical, +/obj/structure/bed, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/turf/open/floor/holofloor/white, +/area/awaymission/museum) +"CL" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/carpet/executive, +/area/awaymission/museum) +"CT" = ( +/mob/living/basic/mothroach, +/mob/living/basic/mothroach, +/obj/structure/window/spawner/directional/south, +/turf/open/floor/light/colour_cycle/dancefloor_b, +/area/awaymission/museum) +"CV" = ( +/obj/structure/sink/directional/south, +/obj/structure/mirror/directional/north{ + pixel_y = 32 + }, +/turf/open/floor/iron/showroomfloor, +/area/awaymission/museum) +"CW" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 4 + }, +/obj/structure/fluff/fake_camera{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"De" = ( +/obj/effect/oneway{ + dir = 8 + }, +/turf/open/misc/beach/coast{ + dir = 1 + }, +/area/awaymission/museum/mothroachvoid) +"Dk" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/engine, +/area/awaymission/museum) +"Dl" = ( +/turf/open/misc/beach/coast/corner{ + dir = 4 + }, +/area/awaymission/museum/mothroachvoid) +"Dr" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/fluff/fake_scrubber, +/turf/open/floor/iron/white, +/area/awaymission/museum) +"Du" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/insectguts, +/obj/structure/closet/crate/preopen, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"Dx" = ( +/obj/effect/mine/sound, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"DA" = ( +/obj/machinery/light/small/directional/west, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"DD" = ( +/turf/open/floor/bluespace, +/area/awaymission/museum) +"DE" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 4 + }, +/obj/structure/fluff/fake_camera{ + dir = 10 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"DI" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue/corner, +/obj/structure/chair/sofa/bench/right{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"DL" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/engine, +/area/awaymission/museum) +"DS" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/spawner/random/structure/girder, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"DT" = ( +/obj/structure/broken_flooring/side/always_floorplane/directional/south, +/turf/open/floor/black, +/area/awaymission/museum) +"DU" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/awaymission/museum) +"DV" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 9 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"DY" = ( +/turf/closed/indestructible/reinforced/titanium, +/area/awaymission/museum) +"Ea" = ( +/obj/machinery/light/small/broken/directional/north, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"Ec" = ( +/mob/living/basic/mothroach, +/obj/structure/window/spawner/directional/north, +/turf/open/floor/light/colour_cycle/dancefloor_b, +/area/awaymission/museum) +"Ef" = ( +/obj/machinery/computer/old{ + name = "replica computer"; + dir = 4; + icon_keyboard = "rd_key"; + icon_screen = "rdcomp" + }, +/turf/open/floor/iron/smooth_large, +/area/awaymission/museum) +"Ek" = ( +/obj/structure/table/wood, +/obj/structure/window/spawner/directional/east, +/obj/item/plate, +/obj/item/kitchen/fork, +/turf/open/floor/wood/tile, +/area/awaymission/museum) +"El" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 1 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 4 + }, +/obj/structure/fluff/wallsign/directional/south{ + dir = 4; + name = "Oddities" + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Eo" = ( +/mob/living/basic/statue/mannequin{ + held_item = /obj/item/wrench; + hat = /obj/item/clothing/head/utility/hardhat + }, +/obj/machinery/light/directional/north, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"Er" = ( +/obj/structure/chair/comfy/beige, +/mob/living/basic/mothroach, +/obj/effect/mapping_helpers/mob_buckler, +/obj/machinery/light/warm/directional/west, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"EA" = ( +/obj/machinery/door/airlock/shuttle/glass, +/obj/effect/turf_decal/siding/dark_blue, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/museum) +"ED" = ( +/obj/structure/transport/linear/tram/slow, +/obj/structure/thermoplastic, +/obj/machinery/light/floor, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"EE" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/closet/crate/secure/freezer, +/obj/item/food/pizza/flatbread/fish, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"EG" = ( +/obj/item/flashlight/flare{ + start_on = 1; + icon_state = "flare-on"; + light_range = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"EK" = ( +/obj/machinery/conveyor{ + dir = 1 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"EM" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/food_or_drink/booze{ + loot = list(/obj/item/reagent_containers/cup/glass/bottle/beer = 10, /obj/item/reagent_containers/cup/glass/bottle/ale = 10, /obj/item/reagent_containers/cup/glass/bottle/beer/light = 5, /obj/item/reagent_containers/cup/glass/bottle/maltliquor = 5, /obj/item/reagent_containers/cup/glass/bottle/whiskey = 5, /obj/item/reagent_containers/cup/glass/bottle/gin = 5, /obj/item/reagent_containers/cup/glass/bottle/vodka = 5, /obj/item/reagent_containers/cup/glass/bottle/tequila = 5, /obj/item/reagent_containers/cup/glass/bottle/rum = 5, /obj/item/reagent_containers/cup/glass/bottle/vermouth = 5, /obj/item/reagent_containers/cup/glass/bottle/cognac = 5, /obj/item/reagent_containers/cup/glass/bottle/wine = 5, /obj/item/reagent_containers/cup/glass/bottle/kahlua = 5, /obj/item/reagent_containers/cup/glass/bottle/amaretto = 5, /obj/item/reagent_containers/cup/glass/bottle/hcider = 5, /obj/item/reagent_containers/cup/glass/bottle/absinthe = 5, /obj/item/reagent_containers/cup/glass/bottle/sake = 5, /obj/item/reagent_containers/cup/glass/bottle/grappa = 5, /obj/item/reagent_containers/cup/glass/bottle/applejack = 5, /obj/item/reagent_containers/cup/glass/bottle/wine_voltaic = 5, /obj/item/reagent_containers/cup/bottle/ethanol = 2, /obj/item/reagent_containers/cup/glass/bottle/fernet = 2, /obj/item/reagent_containers/cup/glass/bottle/champagne = 2, /obj/item/reagent_containers/cup/glass/bottle/absinthe/premium = 2, /obj/item/reagent_containers/cup/glass/bottle/goldschlager = 2, /obj/item/reagent_containers/cup/glass/bottle/patron = 1, /obj/item/reagent_containers/cup/glass/bottle/kong = 1, /obj/item/reagent_containers/cup/glass/bottle/lizardwine = 1, /obj/item/reagent_containers/cup/glass/bottle/vodka/badminka = 1, /obj/item/reagent_containers/cup/glass/bottle/trappist = 1); + spawn_random_offset = 2; + spawn_loot_count = 2 + }, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"EO" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood/old, +/obj/structure/chair{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"EQ" = ( +/obj/item/circuitboard{ + icon_state = "secmodschematic" + }, +/obj/item/screwdriver, +/obj/structure/table/reinforced, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/circuit/green, +/area/awaymission/museum) +"ET" = ( +/obj/structure/chair/stool/directional/north, +/obj/effect/turf_decal/tile/green/opposingcorners, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/green{ + dir = 1 + }, +/mob/living/basic/statue/mannequin{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"EU" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 4 + }, +/obj/structure/fluff/wallsign/directional/north{ + dir = 4; + name = "Oddities" + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"EX" = ( +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/engine, +/area/awaymission/museum) +"EY" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue/corner, +/obj/item/kirbyplants/random, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Fa" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood/gibs/core, +/turf/open/floor/iron, +/area/awaymission/museum) +"Fc" = ( +/obj/item/food/sandwich/cheese, +/turf/open/floor/carpet/cyan, +/area/awaymission/museum/mothroachvoid) +"Fg" = ( +/obj/structure/hedge, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/floor/grass, +/area/awaymission/museum) +"Fh" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/closet/crate/bin, +/obj/structure/sign/departments/restroom/directional/west, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"Fi" = ( +/obj/effect/turf_decal/siding/dark_blue, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/museum) +"Fj" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 2 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"Fq" = ( +/obj/machinery/light/warm/directional/north, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Fr" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/railing/corner/end{ + dir = 4 + }, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"Fv" = ( +/obj/effect/smooths_with_walls, +/turf/open/mirage{ + target_turf_y = -19 + }, +/area/awaymission/museum) +"Fw" = ( +/obj/effect/decal/cleanable/blood/tracks{ + should_dry = 0; + name = "replica blood" + }, +/obj/effect/mapping_helpers/burnt_floor, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron, +/area/awaymission/museum) +"FA" = ( +/obj/structure/table/reinforced, +/obj/item/circuitboard{ + icon_state = "printer"; + name = "fancy replica tech" + }, +/turf/open/floor/iron/smooth_large, +/area/awaymission/museum) +"FD" = ( +/obj/structure/girder, +/obj/structure/grille, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/stripes/line, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"FE" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/carpet/executive, +/area/awaymission/museum) +"FG" = ( +/obj/structure/window/spawner/directional/south, +/turf/open/floor/light/colour_cycle/dancefloor_b, +/area/awaymission/museum) +"FH" = ( +/obj/structure/plaque/static_plaque/golden/commission/box, +/turf/closed/indestructible/reinforced, +/area/awaymission/museum) +"FJ" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/turf_decal/stripes/red/line, +/turf/open/floor/iron, +/area/awaymission/museum) +"FK" = ( +/turf/closed/indestructible/reinforced, +/area/awaymission/museum) +"FM" = ( +/obj/structure/sign/departments/restroom/directional/south, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"Gh" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 10 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Gi" = ( +/obj/effect/turf_decal/sand/plating, +/obj/structure/closet/crate/miningcar, +/turf/open/floor/tram/plate, +/area/awaymission/museum) +"Gv" = ( +/obj/effect/decal/cleanable/crayon{ + icon_state = "l"; + pixel_x = -10 + }, +/obj/effect/decal/cleanable/crayon{ + icon_state = "i" + }, +/obj/effect/decal/cleanable/crayon{ + icon_state = "e"; + pixel_x = 12 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/engine, +/area/awaymission/museum) +"Gx" = ( +/obj/machinery/vending/coffee, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/awaymission/museum) +"GE" = ( +/obj/structure/plaque/static_plaque/golden/commission/meta, +/turf/open/floor/mineral/gold, +/area/awaymission/museum) +"GG" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/mob/living/basic/statue/mannequin{ + dir = 4 + }, +/turf/open/floor/wood/tile, +/area/awaymission/museum) +"GO" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/item/plate/large, +/obj/item/food/kurry_ok_subsando, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"GQ" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"GS" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 1 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"GT" = ( +/obj/structure/table/wood, +/obj/structure/window/spawner/directional/north, +/obj/structure/window/spawner/directional/west, +/obj/item/book/manual/wiki/security_space_law, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"GU" = ( +/mob/living/basic/mothroach, +/turf/open/water/beach, +/area/awaymission/museum/mothroachvoid) +"GV" = ( +/obj/structure/plaque/static_plaque/golden/commission/disc, +/turf/closed/indestructible/reinforced, +/area/awaymission/museum) +"GY" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue, +/obj/structure/fluff/fake_camera{ + dir = 9 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Hf" = ( +/obj/structure/table/wood, +/obj/item/language_manual/roundstart_species, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"Hi" = ( +/obj/structure/fluff/fake_scrubber, +/turf/open/floor/mineral/titanium/white, +/area/awaymission/museum) +"Hj" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 4 + }, +/obj/structure/chair/sofa/bench/left{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Hk" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/broken_flooring/corner/always_floorplane, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"Hn" = ( +/mob/living/basic/statue/mannequin{ + hat = /obj/item/clothing/head/costume/kitty; + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow, +/obj/effect/turf_decal/trimline/yellow/corner{ + dir = 4 + }, +/obj/machinery/conveyor{ + dir = 1 + }, +/turf/open/floor/engine, +/area/awaymission/museum) +"Ho" = ( +/obj/structure/fluff/divine/powerpylon, +/turf/open/floor/cult, +/area/awaymission/museum) +"Hs" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue, +/obj/machinery/door/poddoor/shutters/indestructible{ + dir = 4; + id = "nothing" + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Hw" = ( +/obj/machinery/computer/terminal/museum{ + content = list("Early 1970s, 1978 - With the introduction of the microprocessor in the early 1970s, the world of computers became accessible to the masses via the introduction of the personal computer. Seizing on the opportunity to expand their horizons, Trasen-Knox would introduce their first personal computer, the TKC Personal Computer, in 1978, becoming a household name as well as the favourite computer producer of scientific groups in North America.") + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"HA" = ( +/obj/machinery/status_display/random_message{ + firstline_to_secondline = list("NO" = "LITTERING","YOU ARE" = "BEING WATCHED", "DO NOT TOUCH" = "THE EXHIBITS") + }, +/turf/closed/indestructible/reinforced, +/area/awaymission/museum) +"HD" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue, +/obj/machinery/door/poddoor/shutters/indestructible{ + dir = 8; + id = "nothing" + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"HE" = ( +/obj/effect/turf_decal/siding/dark_blue{ + dir = 1 + }, +/obj/structure/showcase/perfect_employee, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/museum) +"HJ" = ( +/obj/structure/hedge/opaque, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/structure/fluff/fake_camera{ + dir = 5 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"HL" = ( +/obj/structure/table/reinforced, +/obj/item/toy/beach_ball/branded{ + pixel_y = 10 + }, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/machinery/light/directional/north, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/museum) +"HP" = ( +/turf/open/floor/iron/freezer, +/area/awaymission/museum) +"HU" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/machinery/computer/old{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"HY" = ( +/obj/machinery/light/floor, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron, +/area/awaymission/museum) +"Ic" = ( +/obj/machinery/light/warm/dim/directional/north, +/turf/open/floor/carpet, +/area/awaymission/museum) +"Ij" = ( +/obj/machinery/door/airlock/external, +/obj/effect/mapping_helpers/airlock/locked, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"Im" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/holosign/barrier/engineering, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"Iu" = ( +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/museum) +"Iz" = ( +/obj/structure/disposalpipe/broken, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"IB" = ( +/obj/structure/transport/linear/tram/slow, +/obj/structure/thermoplastic/light, +/obj/effect/spawner/random/structure/closet_empty/crate/with_loot, +/obj/item/clothing/gloves/color/yellow, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"IC" = ( +/obj/structure/hedge, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/turf/open/floor/grass, +/area/awaymission/museum) +"IF" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/food_or_drink/refreshing_beverage, +/obj/item/food/grilled_beef_gyro, +/turf/open/floor/wood/tile, +/area/awaymission/museum) +"IH" = ( +/obj/machinery/portable_atmospherics/canister/water_vapor, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/broken_flooring/singular/always_floorplane{ + dir = 4 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"IP" = ( +/turf/open/floor/holofloor/beach/coast, +/area/awaymission/museum) +"IV" = ( +/obj/structure/railing, +/obj/effect/turf_decal/stripes, +/turf/open/floor/iron/smooth_large, +/area/awaymission/museum) +"IZ" = ( +/obj/structure/chair/comfy/beige{ + dir = 4 + }, +/mob/living/basic/mothroach, +/obj/effect/mapping_helpers/mob_buckler, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"Jb" = ( +/turf/open/floor/iron/dark/side, +/area/awaymission/museum) +"Jc" = ( +/obj/structure/window/spawner/directional/north, +/turf/open/floor/light/colour_cycle/dancefloor_b, +/area/awaymission/museum) +"Jd" = ( +/obj/machinery/vending/cigarette/beach, +/obj/machinery/light/warm/directional/north, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"Je" = ( +/obj/structure/railing{ + dir = 10 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/floor/carpet, +/area/awaymission/museum) +"Jg" = ( +/obj/structure/statue/sandstone/assistant, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"Jj" = ( +/mob/living/basic/mothroach, +/turf/open/floor/mineral/gold, +/area/awaymission/museum/mothroachvoid) +"Jk" = ( +/obj/item/toy/plush/moth, +/obj/machinery/light/small/dim/directional/west, +/turf/open/floor/carpet/executive, +/area/awaymission/museum) +"Jn" = ( +/obj/structure/table/reinforced, +/obj/effect/spawner/random/entertainment/toy, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/effect/turf_decal/siding/dark_blue, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/museum) +"Js" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 8 + }, +/obj/machinery/computer/terminal/museum{ + dir = 8; + content = list("This exhibit is of a preserved cortical borer. Cortical borers went extinct in the Spinward sector due to almost every of them starving as they could not find enough food in the brains of the crewmembers, as they are usually pretty small or damaged by plasma exposure.") + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Jv" = ( +/obj/machinery/light/warm/dim/directional/south, +/obj/structure/fluff/divine/shrine, +/turf/open/floor/cult, +/area/awaymission/museum) +"Jx" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Jz" = ( +/obj/machinery/light/floor, +/turf/open/floor/mineral/silver, +/area/awaymission/museum) +"JF" = ( +/obj/machinery/gateway/away, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/dark/diagonal, +/area/awaymission/museum) +"JK" = ( +/obj/effect/step_trigger/teleporter/offset{ + teleport_y_offset = 18 + }, +/turf/open/mirage{ + dir = 1; + target_turf_x = -9 + }, +/area/awaymission/museum) +"JU" = ( +/obj/machinery/computer/terminal/museum{ + dir = 4; + content = list("1963 - Founded in the city of Fresno by Michael Trasen and Dale Knox, Trasen-Knox Computing (as it was known at the time) would get its start producing scientific computers for academia. Trasen-Knox computers quickly gained a reputation for quality and reliability, and the company would gain a decent market share with American and Canadian universities over the coming decade. Trasen-Knox would also work closely with NASA in producing equipment for the space race- giving them an early start in Humanity’s push to the stars. ") + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"JV" = ( +/turf/open/floor/bronze, +/area/awaymission/museum) +"JW" = ( +/obj/structure/broken_flooring/singular/always_floorplane{ + dir = 8 + }, +/turf/open/floor/black, +/area/awaymission/museum) +"JY" = ( +/turf/open/floor/iron/stairs{ + dir = 8 + }, +/area/awaymission/museum/mothroachvoid) +"Kb" = ( +/obj/effect/turf_decal/loading_area{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"Kd" = ( +/obj/structure/chair/stool/bar/directional/east{ + can_buckle = 1 + }, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"Kh" = ( +/turf/closed/indestructible/fakeglass, +/area/awaymission/museum) +"Ko" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/marker_beacon/burgundy, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"Ks" = ( +/obj/effect/turf_decal/siding/wood, +/obj/item/keycard/blue{ + puzzle_id = "museum_secret" + }, +/turf/open/floor/carpet/executive, +/area/awaymission/museum) +"Kt" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/random/structure/closet_empty/crate/with_loot, +/turf/open/floor/iron, +/area/awaymission/museum) +"Kv" = ( +/obj/effect/turf_decal/stripes{ + dir = 8 + }, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/catwalk_floor, +/area/awaymission/museum) +"Kx" = ( +/obj/effect/decal/cleanable/dirt/dust, +/mob/living/basic/skeleton, +/obj/effect/spawner/random/maintenance/three, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"KI" = ( +/turf/open/floor/iron/dark/side{ + dir = 10 + }, +/area/awaymission/museum) +"KN" = ( +/obj/effect/landmark/awaystart, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/grass, +/area/awaymission/museum) +"Le" = ( +/obj/structure/fluff/fake_vent, +/turf/open/floor/mineral/titanium/white, +/area/awaymission/museum) +"Lg" = ( +/obj/machinery/griddle, +/turf/open/floor/iron/freezer, +/area/awaymission/museum) +"Lk" = ( +/obj/machinery/light/directional/north, +/obj/structure/showcase/mecha/marauder, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/museum) +"Lm" = ( +/turf/open/floor/black, +/area/awaymission/museum) +"Lp" = ( +/obj/machinery/status_display/random_message{ + firstline_to_secondline = list("NO" = "LITTERING","YOU ARE" = "BEING WATCHED", "DO NOT TOUCH" = "THE EXHIBITS") + }, +/turf/closed/indestructible/reinforced/titanium/nodiagonal, +/area/awaymission/museum) +"Lq" = ( +/obj/structure/hedge, +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/floor/grass, +/area/awaymission/museum) +"Ls" = ( +/obj/structure/table/reinforced, +/obj/item/instrument/piano_synth/headphones, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"Lt" = ( +/obj/structure/plaque/static_plaque/golden/commission/asteroid, +/turf/closed/indestructible/reinforced, +/area/awaymission/museum) +"Lv" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/circuit/green, +/area/awaymission/museum) +"Lw" = ( +/turf/open/floor/mineral/silver, +/area/awaymission/museum) +"Ly" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/iron, +/area/awaymission/museum) +"LB" = ( +/turf/open/floor/iron/stairs/right{ + dir = 8 + }, +/area/awaymission/museum) +"LC" = ( +/obj/machinery/computer/terminal/museum{ + dir = 4; + content = list("Mothroach") + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue/corner{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"LN" = ( +/obj/effect/decal/cleanable/glass/titanium, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"LQ" = ( +/obj/effect/step_trigger/teleporter/offset{ + teleport_y_offset = -12 + }, +/obj/effect/oneway{ + dir = 8 + }, +/turf/open/mirage{ + dir = 4; + range = 1; + target_turf_x = -11 + }, +/area/awaymission/museum) +"LS" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"LY" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/flora/bush/sparsegrass/style_random, +/turf/open/floor/grass, +/area/awaymission/museum) +"Ma" = ( +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"Mg" = ( +/obj/structure/plaque/static_plaque/golden/commission/tram, +/turf/closed/indestructible/reinforced, +/area/awaymission/museum) +"Mn" = ( +/obj/machinery/light/warm/directional/south, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"Ms" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/broken_flooring/side/always_floorplane{ + dir = 8 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"Mv" = ( +/mob/living/basic/statue/mannequin{ + dir = 4; + held_item = /obj/item/wrench; + name = "Michael Trasen" + }, +/obj/effect/turf_decal/stripes{ + dir = 4 + }, +/turf/open/floor/iron/smooth_large, +/area/awaymission/museum) +"Mx" = ( +/obj/structure/table, +/obj/item/phone, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/museum) +"MB" = ( +/obj/structure/railing, +/turf/open/floor/holofloor/asteroid{ + icon_state = "asteroid5" + }, +/area/awaymission/museum) +"MC" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/machinery/light/floor, +/turf/open/floor/holofloor/white, +/area/awaymission/museum) +"ME" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/floor/iron, +/area/awaymission/museum) +"MF" = ( +/turf/closed/indestructible/wood, +/area/awaymission/museum) +"MI" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/mecha_parts/mecha_equipment/generator, +/turf/open/floor/iron, +/area/awaymission/museum) +"MV" = ( +/turf/open/floor/engine, +/area/awaymission/museum) +"MZ" = ( +/obj/structure/fluff/divine/defensepylon, +/turf/open/floor/cult, +/area/awaymission/museum) +"Na" = ( +/obj/structure/girder, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"Nc" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/fluff/fake_camera{ + dir = 5 + }, +/turf/open/floor/iron/white, +/area/awaymission/museum) +"Nd" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/green/opposingcorners, +/obj/effect/spawner/random/entertainment/toy, +/obj/effect/spawner/random/entertainment/toy, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/green{ + dir = 9 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"Ng" = ( +/obj/item/stack/sheet/bronze/thirty, +/obj/structure/table/bronze, +/turf/open/floor/bronze, +/area/awaymission/museum) +"Ni" = ( +/obj/machinery/computer/terminal/museum{ + dir = 4; + content = list("Primarily an advanced research and development conglomerate, but also has skin in many other fields. While a great deal of their income still comes from producing public research funded by government research grants, their operations also include directly producing and selling their most profitable designs, leasing their asset protection forces to governments and private organizations (both space fleets and ground troops), logistics management with a specialization in remote settlement self-sufficiency, and maintaining interstellar communication infrastructures to name a few. The common theme that runs through most of their business ventures is taking the lessons they've learned from operating on such a massive scale and helping smaller organizations stretch themselves.") + }, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/museum) +"Nm" = ( +/obj/structure/plaque/static_plaque/golden/commission/birdboat, +/turf/closed/indestructible/reinforced, +/area/awaymission/museum) +"Ns" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/food_or_drink/booze{ + loot = list(/obj/item/reagent_containers/cup/glass/bottle/beer = 10, /obj/item/reagent_containers/cup/glass/bottle/ale = 10, /obj/item/reagent_containers/cup/glass/bottle/beer/light = 5, /obj/item/reagent_containers/cup/glass/bottle/maltliquor = 5, /obj/item/reagent_containers/cup/glass/bottle/whiskey = 5, /obj/item/reagent_containers/cup/glass/bottle/gin = 5, /obj/item/reagent_containers/cup/glass/bottle/vodka = 5, /obj/item/reagent_containers/cup/glass/bottle/tequila = 5, /obj/item/reagent_containers/cup/glass/bottle/rum = 5, /obj/item/reagent_containers/cup/glass/bottle/vermouth = 5, /obj/item/reagent_containers/cup/glass/bottle/cognac = 5, /obj/item/reagent_containers/cup/glass/bottle/wine = 5, /obj/item/reagent_containers/cup/glass/bottle/kahlua = 5, /obj/item/reagent_containers/cup/glass/bottle/amaretto = 5, /obj/item/reagent_containers/cup/glass/bottle/hcider = 5, /obj/item/reagent_containers/cup/glass/bottle/absinthe = 5, /obj/item/reagent_containers/cup/glass/bottle/sake = 5, /obj/item/reagent_containers/cup/glass/bottle/grappa = 5, /obj/item/reagent_containers/cup/glass/bottle/applejack = 5, /obj/item/reagent_containers/cup/glass/bottle/wine_voltaic = 5, /obj/item/reagent_containers/cup/bottle/ethanol = 2, /obj/item/reagent_containers/cup/glass/bottle/fernet = 2, /obj/item/reagent_containers/cup/glass/bottle/champagne = 2, /obj/item/reagent_containers/cup/glass/bottle/absinthe/premium = 2, /obj/item/reagent_containers/cup/glass/bottle/goldschlager = 2, /obj/item/reagent_containers/cup/glass/bottle/patron = 1, /obj/item/reagent_containers/cup/glass/bottle/kong = 1, /obj/item/reagent_containers/cup/glass/bottle/lizardwine = 1, /obj/item/reagent_containers/cup/glass/bottle/vodka/badminka = 1, /obj/item/reagent_containers/cup/glass/bottle/trappist = 1); + spawn_random_offset = 2 + }, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"Ny" = ( +/obj/effect/turf_decal/siding/dark_blue{ + dir = 1 + }, +/obj/structure/closet/crate/bin, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/museum) +"NB" = ( +/obj/effect/turf_decal/siding/wideplating/corner, +/turf/open/misc/beach/sand, +/area/awaymission/museum/mothroachvoid) +"ND" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/railing, +/obj/structure/table, +/obj/item/clothing/mask/cigarette/cigar{ + lit = 1; + icon_state = "cigaron" + }, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"NK" = ( +/obj/machinery/door/airlock/maintenance_hatch, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/all/away/generic3, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"NO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/engine, +/area/awaymission/museum) +"NT" = ( +/obj/machinery/light/floor, +/obj/effect/turf_decal/sand/plating, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 1 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"NV" = ( +/obj/structure/bed/pod{ + dir = 1 + }, +/turf/open/floor/wood/tile, +/area/awaymission/museum) +"NY" = ( +/obj/effect/turf_decal/tile/green/opposingcorners, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/green{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 8 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"Oi" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/spawner/random/trash/cigbutt, +/obj/structure/fluff/fake_camera{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Ok" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Ol" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/broken_flooring/singular/always_floorplane{ + dir = 4 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"Oo" = ( +/obj/structure/closet/secure_closet/bar/lavaland_bartender_booze{ + anchored = 1 + }, +/turf/open/floor/wood/tile, +/area/awaymission/museum) +"Op" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/machinery/computer/terminal/museum{ + dir = 4; + content = list("The DNA Manipulator, oh how great you were. Phased out several years ago because a study discovered that plants modified by the DNA Manipulator usually gave you cancer. Naturally, this was the botanists fault.") + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Ov" = ( +/turf/open/chasm, +/area/awaymission/museum) +"OD" = ( +/obj/machinery/computer/terminal/museum{ + dir = 8; + content = list("2560 - The Nanotrasen Cloning Incident; Did you know that Nanotrasen used to provide cloning for profitable employees? No? Good! Because in 2560, there was a terrorist backed sabotage on one of our cloning material supply facilities, resulting in a Feline serum being dumped into the carefully curated output. This resulted in horrible cat mutations for anyone who got cloned, weeks later. Facing outlash, Nanotrasen had to shut down all cloning clinics.") + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"OI" = ( +/obj/machinery/light/floor, +/turf/open/floor/bronze/filled, +/area/awaymission/museum) +"OP" = ( +/obj/effect/mapping_helpers/burnt_floor, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron, +/area/awaymission/museum) +"OS" = ( +/obj/structure/chair/stool/bar/directional/east{ + can_buckle = 1 + }, +/obj/effect/mapping_helpers/mob_buckler, +/mob/living/basic/mothroach, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"OT" = ( +/obj/structure/marker_beacon/burgundy, +/obj/structure/lattice/catwalk/mining, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"OZ" = ( +/obj/item/toy/figure/syndie, +/obj/item/toy/figure/syndie{ + pixel_x = -9 + }, +/obj/item/toy/figure/syndie{ + pixel_x = 9 + }, +/obj/structure/window/reinforced/spawner/directional/west, +/turf/open/floor/holofloor/beach/coast{ + dir = 1 + }, +/area/awaymission/museum) +"Pb" = ( +/mob/living/basic/mothroach, +/turf/open/floor/light/colour_cycle/dancefloor_a, +/area/awaymission/museum) +"Pc" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/floor/grass, +/area/awaymission/museum) +"Pd" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 2 + }, +/obj/structure/broken_flooring/corner/always_floorplane{ + dir = 8 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"Pf" = ( +/obj/structure/table/wood, +/obj/item/food/kebab/pineapple_skewer, +/turf/open/floor/iron/freezer, +/area/awaymission/museum) +"Pi" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue/corner{ + dir = 4 + }, +/obj/structure/chair/sofa/bench/left{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Pl" = ( +/obj/structure/filingcabinet/chestdrawer, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"Pp" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue, +/obj/machinery/light/small/dim/directional/north, +/obj/structure/chair/stool/directional/east, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Pq" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/item/plate, +/obj/item/food/kebab/pineapple_skewer, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"Ps" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"PB" = ( +/turf/closed/indestructible/fakedoor/engineering, +/area/awaymission/museum) +"PC" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/railing, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"PF" = ( +/obj/effect/turf_decal/sand/plating, +/obj/effect/turf_decal/mining, +/obj/item/flashlight/lantern{ + icon_state = "lantern-on"; + start_on = 1 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"PK" = ( +/obj/machinery/door/poddoor{ + id = "gatewayfake" + }, +/obj/machinery/conveyor{ + dir = 1 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"PN" = ( +/obj/structure/girder/bronze, +/turf/open/floor/bronze/flat, +/area/awaymission/museum) +"PP" = ( +/obj/effect/decal/cleanable/fuel_pool/hivis, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"PR" = ( +/obj/structure/fluff/minepost, +/obj/effect/turf_decal/siding{ + dir = 9 + }, +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/holofloor/asteroid, +/area/awaymission/museum) +"PU" = ( +/obj/machinery/shower/directional/east, +/obj/effect/decal/cleanable/plastic, +/turf/open/floor/iron/white/textured_large, +/area/awaymission/museum) +"PW" = ( +/obj/effect/step_trigger/teleporter/offset{ + teleport_y_offset = -18 + }, +/turf/open/mirage{ + target_turf_y = -19 + }, +/area/awaymission/museum) +"PX" = ( +/obj/structure/transport/linear/tram/slow, +/obj/structure/thermoplastic/light, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"PZ" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/item/flashlight/flare{ + start_on = 1; + icon_state = "flare-on" + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"Qa" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue/corner{ + dir = 1 + }, +/obj/item/kirbyplants/random, +/obj/structure/fluff/fake_camera{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Qb" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/white, +/area/awaymission/museum) +"Qc" = ( +/obj/item/kirbyplants/random/dead, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"Qe" = ( +/obj/structure/broken_flooring/singular/always_floorplane{ + dir = 4 + }, +/turf/open/floor/black, +/area/awaymission/museum) +"Qf" = ( +/obj/effect/turf_decal/tile/green/opposingcorners, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/green, +/obj/structure/table, +/obj/machinery/coffeemaker, +/turf/open/floor/iron, +/area/awaymission/museum) +"Qi" = ( +/obj/effect/spawner/structure/window/reinforced/indestructible, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"Qj" = ( +/obj/structure/hedge, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/grass, +/area/awaymission/museum) +"Qk" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/railing/corner{ + dir = 4 + }, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"Qo" = ( +/obj/structure/closet/crate/cardboard/mothic, +/obj/item/food/pizza/mothic_white_pie, +/obj/item/toy/plush/moth, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"Qs" = ( +/obj/effect/mapping_helpers/burnt_floor, +/obj/machinery/light/floor, +/obj/effect/replica_spawner{ + target_path = /obj/structure/reagent_dispensers/fueltank + }, +/obj/effect/decal/cleanable/blood/gibs, +/turf/open/floor/iron, +/area/awaymission/museum) +"Qt" = ( +/obj/effect/mapping_helpers/burnt_floor, +/obj/structure/window/reinforced/spawner/directional/east, +/turf/open/floor/iron, +/area/awaymission/museum) +"Qv" = ( +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/awaymission/museum) +"Qw" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/grass, +/area/awaymission/museum) +"QB" = ( +/obj/structure/plaque/static_plaque/golden/commission/birdshot, +/turf/closed/indestructible/reinforced, +/area/awaymission/museum) +"QD" = ( +/obj/structure/fluff/broken_canister_frame, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"QF" = ( +/obj/structure/hedge, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/grass, +/area/awaymission/museum) +"QG" = ( +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/dark/diagonal, +/area/awaymission/museum) +"QI" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/small/dim/directional/north, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"QK" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/flora/bush/sparsegrass/style_random, +/obj/structure/closet/crate/bin, +/turf/open/floor/grass, +/area/awaymission/museum) +"QN" = ( +/obj/structure/table/wood, +/obj/item/food/grilled_beef_gyro, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"QP" = ( +/obj/effect/playeronly_barrier, +/obj/machinery/door/airlock/public/glass, +/turf/open/floor/iron, +/area/awaymission/museum) +"QU" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/broken_flooring/side/always_floorplane{ + dir = 1 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"QX" = ( +/obj/structure/sign/poster/party_game/directional/south, +/turf/open/floor/iron/dark/side, +/area/awaymission/museum) +"Re" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"Ri" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/remains/human, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"Rl" = ( +/obj/structure/railing{ + dir = 10 + }, +/obj/structure/fluff{ + name = "replica prototype autolathe"; + icon = 'icons/obj/machines/lathes.dmi'; + icon_state = "autolathe"; + desc = "A non-functional replica of a prototype Autolathe." + }, +/turf/open/floor/iron/smooth_corner{ + dir = 4 + }, +/area/awaymission/museum) +"Rq" = ( +/obj/structure/fluff/fake_camera{ + dir = 5 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"Rs" = ( +/mob/living/basic/mothroach, +/turf/open/floor/light/colour_cycle/dancefloor_b, +/area/awaymission/museum) +"Rz" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 4 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"RC" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 10 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"RD" = ( +/obj/effect/turf_decal/trimline/yellow/arrow_ccw{ + dir = 5 + }, +/turf/open/floor/engine, +/area/awaymission/museum) +"RJ" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/random/maintenance/three, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"RL" = ( +/obj/effect/spawner/random/vending/colavend, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/white, +/area/awaymission/museum) +"RR" = ( +/obj/machinery/suit_storage_unit/open, +/obj/effect/turf_decal/box, +/turf/open/floor/iron/white/textured_large, +/area/awaymission/museum) +"RU" = ( +/obj/structure/transport/linear/tram/slow, +/obj/structure/thermoplastic, +/obj/structure/closet/crate/engineering, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"Sa" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/machinery/door/airlock/freezer, +/turf/open/floor/iron/freezer, +/area/awaymission/museum) +"Sc" = ( +/obj/effect/baseturf_helper{ + baseturf_to_replace = list(/turf/open/space/basic); + baseturf = /turf/open/indestructible/plating + }, +/turf/open/floor/bluespace, +/area/awaymission/museum) +"Se" = ( +/obj/structure/chair/comfy/beige, +/mob/living/basic/mothroach, +/obj/effect/mapping_helpers/mob_buckler, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"Sh" = ( +/obj/effect/turf_decal/siding, +/obj/structure/railing, +/turf/open/floor/holofloor/asteroid, +/area/awaymission/museum) +"So" = ( +/obj/machinery/shower/directional/east, +/turf/open/floor/iron/white/textured_large, +/area/awaymission/museum) +"Sr" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Sv" = ( +/obj/machinery/status_display/random_message{ + firstline_to_secondline = list("SOUVENIR" = "SHOP") + }, +/turf/closed/indestructible/reinforced, +/area/awaymission/museum) +"SA" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/table, +/obj/item/wirecutters, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"SN" = ( +/obj/structure/fluff/divine/conduit, +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/cult, +/area/awaymission/museum) +"SQ" = ( +/mob/living/basic/mothroach, +/turf/open/misc/grass, +/area/awaymission/museum/mothroachvoid) +"ST" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 1 + }, +/obj/machinery/door/poddoor/shutters/indestructible{ + dir = 8; + id = "nothing" + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"SU" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/stack/spacecash/c1000, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"Tr" = ( +/obj/structure/plaque/static_plaque/golden/commission/kilo, +/obj/machinery/light/floor, +/turf/open/floor/mineral/gold, +/area/awaymission/museum) +"Tt" = ( +/obj/structure/holosign/barrier/engineering, +/turf/open/misc/grass, +/area/awaymission/museum/mothroachvoid) +"Tu" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue/corner{ + dir = 8 + }, +/obj/structure/chair/sofa/bench/left{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Tz" = ( +/obj/structure/hedge, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/grass, +/area/awaymission/museum) +"TB" = ( +/obj/item/stack/rods, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/broken_flooring/corner/always_floorplane{ + dir = 8 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"TF" = ( +/turf/open/floor/iron/stairs/right{ + dir = 4 + }, +/area/awaymission/museum) +"TI" = ( +/obj/structure/chair/bronze{ + dir = 8 + }, +/turf/open/floor/bronze/flat, +/area/awaymission/museum) +"TJ" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/replica_spawner{ + target_path = /obj/machinery/autolathe + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/engine, +/area/awaymission/museum) +"TM" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/awaymission/museum) +"TN" = ( +/obj/effect/turf_decal/siding/dark_blue{ + dir = 1 + }, +/obj/item/kirbyplants/random/fullysynthetic, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/museum) +"TO" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/random/structure/crate_abandoned, +/turf/open/floor/iron, +/area/awaymission/museum) +"TQ" = ( +/obj/machinery/portable_atmospherics/scrubber, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/broken_flooring/singular/always_floorplane{ + dir = 8 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"TR" = ( +/obj/structure/window/spawner/directional/east, +/turf/open/floor/light/colour_cycle/dancefloor_b, +/area/awaymission/museum) +"TV" = ( +/obj/structure/sign/poster/random/directional/east, +/obj/structure/grille, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"TY" = ( +/turf/open/floor/iron/showroomfloor, +/area/awaymission/museum) +"Ue" = ( +/obj/structure/transport/linear/tram/slow, +/obj/structure/thermoplastic, +/obj/effect/spawner/random/structure/closet_empty/crate/with_loot, +/obj/machinery/door/window/elevator/right/directional/south{ + transport_linked_id = "museum_cargo" + }, +/obj/effect/spawner/random/maintenance/seven, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"Um" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 8 + }, +/obj/structure/fluff/wallsign/directional/east{ + dir = 2; + name = "Exit" + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Un" = ( +/obj/structure/fluff/wallsign/directional/west{ + name = "History of Nanotrasen" + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 4 + }, +/obj/machinery/light/warm/directional/west, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Uo" = ( +/obj/structure/fluff/fake_scrubber, +/turf/open/floor/iron, +/area/awaymission/museum) +"Uq" = ( +/obj/effect/smooths_with_walls, +/turf/cordon/secret, +/area/awaymission/museum) +"Ut" = ( +/mob/living/basic/statue/mannequin{ + held_item = /obj/item/banner/command; + hat = /obj/item/clothing/head/helmet/space + }, +/turf/open/floor/holofloor/hyperspace/ns, +/area/awaymission/museum) +"Uu" = ( +/turf/open/floor/mineral/titanium/white, +/area/awaymission/museum) +"Ux" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/structure/table, +/obj/item/computer_disk{ + icon_state = "datadisk_hydro"; + name = "plant data disk" + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"UB" = ( +/obj/structure/fluff/minepost, +/obj/effect/turf_decal/siding{ + dir = 6 + }, +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/railing/corner{ + dir = 8 + }, +/turf/open/floor/holofloor/asteroid, +/area/awaymission/museum) +"UD" = ( +/obj/item/reagent_containers/pill/patch/ondansetron, +/obj/structure/rack, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/reagent_containers/pill/patch/libital, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"UG" = ( +/mob/living/basic/mothroach, +/turf/open/misc/beach/sand, +/area/awaymission/museum/mothroachvoid) +"UI" = ( +/obj/effect/turf_decal/tile/green/opposingcorners, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron, +/area/awaymission/museum) +"UK" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 8 + }, +/obj/machinery/door/poddoor/shutters/preopen, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"UP" = ( +/obj/structure/table/bronze, +/obj/item/clothing/suit/costume/bronze, +/obj/item/clothing/suit/costume/bronze, +/obj/item/clothing/shoes/bronze, +/obj/item/clothing/head/costume/bronze, +/turf/open/floor/bronze/flat, +/area/awaymission/museum) +"UR" = ( +/obj/structure/railing, +/obj/structure/fluff/fake_camera{ + dir = 4 + }, +/turf/open/floor/holofloor/asteroid, +/area/awaymission/museum) +"US" = ( +/obj/machinery/computer/old{ + name = "replica computer"; + dir = 8 + }, +/obj/structure/railing{ + dir = 6 + }, +/turf/open/floor/circuit/green, +/area/awaymission/museum) +"UT" = ( +/obj/machinery/status_display/random_message{ + firstline_to_secondline = list("NO" = "LITTERING","YOU ARE" = "BEING WATCHED", "DO NOT TOUCH" = "THE EXHIBITS"); + pixel_x = 32 + }, +/turf/open/floor/carpet, +/area/awaymission/museum) +"UU" = ( +/obj/effect/turf_decal/siding{ + dir = 1 + }, +/turf/open/floor/holofloor/asteroid, +/area/awaymission/museum) +"UV" = ( +/obj/machinery/conveyor{ + dir = 1 + }, +/obj/item/storage/toolbox/emergency/old, +/turf/open/floor/engine, +/area/awaymission/museum) +"UY" = ( +/obj/effect/spawner/random/trash/mess, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/smooth_half, +/area/awaymission/museum) +"Vc" = ( +/obj/machinery/light/warm/directional/east, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Vh" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/railing/corner, +/obj/machinery/light/small/directional/east, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"Vk" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/turf_decal/stripes/red/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"Vq" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 4 + }, +/obj/structure/fluff/fokoff_sign, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Vz" = ( +/obj/structure/grille/broken, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"VA" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"VD" = ( +/obj/effect/step_trigger/teleporter/offset{ + teleport_y_offset = 30 + }, +/turf/open/mirage{ + target_turf_y = 29 + }, +/area/awaymission/museum) +"VE" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/railing/corner, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"VH" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/server, +/turf/open/floor/holofloor/beach, +/area/awaymission/museum) +"VK" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/fluff/fake_camera{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"VL" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"VM" = ( +/obj/machinery/conveyor{ + dir = 1 + }, +/obj/item/clothing/under/rank/medical/scrubs/coroner, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"VS" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue/corner, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"VT" = ( +/obj/effect/turf_decal/tile/dark_blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/awaymission/museum) +"VW" = ( +/turf/open/floor/holofloor/beach/water, +/area/awaymission/museum) +"VZ" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/grass, +/area/awaymission/museum) +"Wc" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 1 + }, +/obj/machinery/door/poddoor/shutters/indestructible{ + dir = 4; + id = "nothing" + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"We" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"Wf" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/flora/bush/sparsegrass/style_random, +/turf/open/floor/grass, +/area/awaymission/museum) +"Wg" = ( +/mob/living/basic/mothroach, +/obj/structure/window/spawner/directional/north, +/obj/structure/window/spawner/directional/east, +/turf/open/floor/light/colour_cycle/dancefloor_a, +/area/awaymission/museum) +"Wj" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/grass, +/area/awaymission/museum) +"Wo" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue/corner{ + dir = 1 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Wr" = ( +/obj/effect/light_emitter{ + light_color = "#FFF4AA"; + set_cap = 1 + }, +/turf/closed/indestructible/rock, +/area/awaymission/museum) +"Wt" = ( +/obj/machinery/computer/old{ + name = "replica computer"; + dir = 8 + }, +/obj/structure/railing{ + dir = 5 + }, +/turf/open/floor/circuit/green, +/area/awaymission/museum) +"Wu" = ( +/obj/machinery/door/airlock/grunge, +/obj/effect/turf_decal/stripes/end, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/engine, +/area/awaymission/museum) +"Wy" = ( +/obj/effect/turf_decal/siding/dark_blue{ + dir = 9 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/structure/fluff/fake_camera{ + dir = 5 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"WB" = ( +/obj/structure/chair/stool/bar/directional/east, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"WD" = ( +/obj/effect/mob_spawn/corpse/human/assistant, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/white, +/area/awaymission/museum) +"WE" = ( +/obj/effect/turf_decal/tile/green/opposingcorners, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 1 + }, +/obj/structure/fluff/fake_scrubber, +/turf/open/floor/iron, +/area/awaymission/museum) +"WH" = ( +/obj/structure/fluff/divine/defensepylon, +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/cult, +/area/awaymission/museum) +"WJ" = ( +/obj/structure/transport/linear/tram/slow, +/obj/structure/thermoplastic, +/obj/effect/spawner/random/maintenance/seven, +/obj/item/storage/pill_bottle/maintenance_pill/full, +/obj/effect/spawner/random/structure/closet_empty/crate/with_loot, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"WM" = ( +/obj/structure/flora/bush/sparsegrass/style_random, +/turf/open/floor/grass, +/area/awaymission/museum) +"WQ" = ( +/obj/effect/spawner/random/vending/snackvend, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/awaymission/museum) +"WT" = ( +/obj/machinery/computer/terminal/museum{ + content = list("2008 - Nanotrasen would buy out and merge with the Wulfe Group, a German company known for their manufacture of industrial equipment. Rebranding the company as Nanotrasen Heavy Industry (or NTHI), this would be Nanotrasen’s first step towards new horizons beyond computing. In a series of purchases, Nanotrasen would expand its range of products considerably, acquiring a chemical and oil subsidiary in Texas Chemical (now Nanotrasen Chemical Supply), a consumer goods subsidiary in Seowon Appliances (now Nanotrasen Consumer Goods)") + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"WU" = ( +/obj/machinery/light/warm/directional/south, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"WX" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue/corner{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Xa" = ( +/obj/structure/broken_flooring/corner/always_floorplane{ + dir = 2 + }, +/obj/structure/lattice, +/obj/structure/fluff/fake_camera{ + dir = 5 + }, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"Xc" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/item/plate, +/obj/item/food/kitzushi, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"Xh" = ( +/turf/closed/indestructible/fakedoor/maintenance, +/area/awaymission/museum) +"Xo" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/railing, +/obj/structure/table, +/obj/item/pen/red, +/obj/item/paper/fluff/museum/noend, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"Xs" = ( +/obj/structure/fluff/broken_canister_frame, +/obj/structure/fluff/fake_camera{ + dir = 4 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"Xt" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/random/contraband/cannabis, +/turf/open/floor/iron, +/area/awaymission/museum) +"XB" = ( +/obj/effect/turf_decal/bot/right, +/turf/open/floor/iron/dark/diagonal, +/area/awaymission/museum) +"XC" = ( +/obj/structure/plaque/static_plaque/golden/commission/mini, +/turf/closed/indestructible/reinforced, +/area/awaymission/museum) +"XD" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 4 + }, +/obj/effect/step_trigger/teleporter/offset{ + teleport_y_offset = 14 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"XF" = ( +/obj/structure/fluff/fake_vent, +/turf/open/floor/iron/white, +/area/awaymission/museum) +"XK" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"XM" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/turf_decal/stripes/red/line{ + dir = 9 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"XP" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 8 + }, +/obj/machinery/door/poddoor/shutters/indestructible{ + id = "nothing" + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"XR" = ( +/obj/structure/filingcabinet/chestdrawer, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/broken_flooring/corner/always_floorplane, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"XW" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/fluff/fake_camera{ + dir = 5 + }, +/turf/open/floor/iron/dark/textured_large, +/area/awaymission/museum) +"Yb" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/item/plate/large, +/obj/item/food/khachapuri, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"Yd" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/broken_flooring/side/directional/east, +/obj/machinery/door/airlock/atmos/glass, +/obj/structure/barricade/wooden, +/obj/effect/mapping_helpers/airlock/locked, +/obj/effect/mapping_helpers/airlock/access/all/away/generic3, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"Ye" = ( +/obj/structure/sign/nanotrasen, +/turf/closed/indestructible/reinforced/titanium/nodiagonal, +/area/awaymission/museum) +"Yg" = ( +/obj/effect/decal/cleanable/dirt/dust, +/mob/living/basic/cockroach, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"Yk" = ( +/obj/machinery/door/poddoor/shutters/indestructible{ + id = "museum_secret" + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"Yr" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/structure/table/reinforced, +/obj/effect/turf_decal/siding/dark_blue, +/obj/effect/spawner/random/entertainment/toy, +/obj/effect/spawner/random/entertainment/toy, +/obj/item/reagent_containers/cup/glass/mug/nanotrasen, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Yz" = ( +/obj/effect/turf_decal/siding, +/mob/living/basic/statue/mannequin{ + dir = 8; + held_item = /obj/item/pickaxe; + hat = /obj/item/clothing/suit/hooded/explorer + }, +/obj/structure/railing, +/turf/open/floor/holofloor/asteroid, +/area/awaymission/museum) +"YC" = ( +/obj/item/storage/box/mothic_cans_sauces, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"YD" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"YF" = ( +/obj/structure/hedge, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/floor/grass, +/area/awaymission/museum) +"YP" = ( +/obj/structure/broken_flooring/singular/always_floorplane{ + dir = 1 + }, +/turf/open/floor/black, +/area/awaymission/museum) +"YY" = ( +/turf/open/floor/iron/stairs/left{ + dir = 8 + }, +/area/awaymission/museum) +"YZ" = ( +/obj/machinery/light/warm/dim/directional/south, +/obj/effect/turf_decal/tile/green/opposingcorners, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/green, +/obj/structure/table, +/obj/item/coffee_cartridge/bootleg, +/obj/item/reagent_containers/cup/glass/coffee/no_lid{ + pixel_x = 12 + }, +/turf/open/floor/iron, +/area/awaymission/museum) +"Zf" = ( +/obj/structure/plaque/static_plaque/golden/commission/donut, +/turf/closed/indestructible/reinforced, +/area/awaymission/museum) +"Zg" = ( +/obj/machinery/light/warm/directional/west, +/turf/open/floor/holofloor/beach/water, +/area/awaymission/museum) +"Zk" = ( +/obj/effect/decal/cleanable/fuel_pool/hivis, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"Zn" = ( +/obj/structure/lattice, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"Zp" = ( +/obj/structure/plaque/static_plaque/golden/commission/icebox, +/turf/closed/indestructible/reinforced, +/area/awaymission/museum) +"Zr" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 8 + }, +/obj/effect/step_trigger/teleporter/offset{ + teleport_y_offset = 14 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"Zw" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 4 + }, +/obj/structure/chair/sofa/bench{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"ZB" = ( +/obj/machinery/door/airlock/maintenance_hatch, +/obj/structure/broken_flooring/side/always_floorplane/directional/east, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/mapping_helpers/airlock/access/all/away/generic3, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"ZF" = ( +/mob/living/basic/mothroach, +/turf/open/misc/beach/coast/corner{ + dir = 1 + }, +/area/awaymission/museum/mothroachvoid) +"ZH" = ( +/obj/structure/lattice/catwalk/mining, +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/chasm/true/no_smooth, +/area/awaymission/museum) +"ZI" = ( +/obj/structure/railing, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/siding/dark_blue{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/awaymission/museum) +"ZP" = ( +/obj/structure/statue/gold/ce{ + anchored = 1 + }, +/turf/open/floor/mineral/diamond, +/area/awaymission/museum/mothroachvoid) +"ZW" = ( +/obj/machinery/door/airlock/wood/glass, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/awaymission/museum) +"ZY" = ( +/obj/structure/window/bronze/spawner/directional/south, +/obj/structure/window/bronze/spawner/directional/east, +/obj/structure/window/bronze/spawner/directional/north, +/obj/structure/grille, +/turf/open/indestructible/plating, +/area/awaymission/museum) +"ZZ" = ( +/obj/item/stack/rods, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 4 + }, +/turf/open/indestructible/plating, +/area/awaymission/museum) + +(1,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(2,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(3,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(4,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(5,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(6,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(7,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(8,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(9,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(10,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(11,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(12,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(13,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(14,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(15,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(16,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(17,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(18,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(19,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(20,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(21,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(22,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(23,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(24,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(25,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(26,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(27,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(28,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(29,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(30,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(31,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(32,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(33,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(34,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(35,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(36,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(37,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(38,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(39,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(40,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(41,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(42,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(43,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(44,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(45,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(46,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(47,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(48,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(49,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(50,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(51,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(52,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(53,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(54,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(55,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(56,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(57,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(58,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(59,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(60,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(61,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(62,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(63,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(64,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(65,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(66,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(67,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(68,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(69,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(70,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(71,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(72,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(73,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(74,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(75,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +Lm +Lm +Lm +Lm +Lm +Lm +Lm +Lm +Lm +Lm +Lm +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(76,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +Lm +Lm +Lm +Lm +Lm +Lm +Lm +Lm +Lm +Lm +Lm +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(77,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +Lm +Lm +Lm +Lm +Lm +Lm +Lm +Lm +Lm +Lm +Lm +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(78,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +Lm +Lm +Lm +Lm +Qe +Lm +Qe +Lm +Lm +Lm +Lm +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(79,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +Lm +Lm +Lm +Qe +Lm +Qe +Lm +YP +Lm +Lm +Lm +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(80,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +Lm +Lm +Lm +Lm +Qe +Lm +JW +Lm +Lm +Lm +sj +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(81,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +yS +yS +yS +yS +yS +re +re +re +re +re +re +re +re +re +re +re +re +FK +DT +DT +DT +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(82,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +yS +yS +fn +kQ +fn +yS +yS +re +re +re +re +re +FK +FK +FK +FK +FK +re +FK +xx +TM +Wy +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(83,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +yS +fn +fn +fn +fn +kQ +yS +re +re +re +FK +FK +FK +IP +Zg +fJ +FK +FK +FK +Hs +eN +Wc +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(84,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +yS +fn +Ut +hE +dY +fn +yS +re +re +re +FK +jH +mX +IP +VW +oQ +br +NV +FK +aa +qj +fy +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(85,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +yS +yq +fn +fn +fn +fn +yS +re +re +re +FK +UY +zG +IP +VW +oQ +GG +rr +FK +lb +TM +tD +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(86,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +yS +fe +uT +uT +uT +fe +yS +re +re +re +FK +cs +rO +lk +oA +eX +zK +IF +FK +lb +uY +tD +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(87,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +MF +MF +MF +MF +MF +MF +MF +MF +MF +MF +MF +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +fe +fe +Mx +Ni +lC +fe +fe +FK +FK +FK +FK +GQ +yx +xR +hC +xR +GS +GQ +FK +lb +uY +tD +FK +HA +FK +FK +FK +FK +FK +FK +FK +FK +Uq +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(88,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +MF +Ns +yi +Er +EM +yi +Se +Cy +yi +Ns +MF +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +fe +fe +fe +fe +HL +Iu +Uu +Iu +uM +iz +VL +hV +LS +hV +hV +hV +VL +hV +hV +hV +hV +hV +zg +uY +nh +hV +hV +hV +hV +VK +im +hV +hV +VL +CF +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(89,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +MF +rA +gM +gM +gM +gM +gM +gM +gM +rA +MF +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +fe +FA +Ef +zc +Iu +Uu +Hi +Uu +Iu +EA +uY +TM +uY +uY +uY +uY +uY +uY +uY +qj +od +qj +uY +HY +qj +qj +qj +uY +uY +uY +uY +uY +TM +qj +bI +re +re +re +re +re +re +re +re +re +re +Uq +re +Uq +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(90,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +MF +MF +MF +MF +MF +MF +WB +WB +WB +WB +WB +WB +gM +gM +wO +MF +re +re +re +re +Ma +Ma +re +re +re +re +re +re +re +re +re +re +re +re +fe +xg +lT +IV +da +jn +jn +jn +gG +AC +bV +gW +bV +RC +uY +DV +bV +bV +bV +Gh +uY +lf +bV +bV +bV +bV +bV +bV +bV +RC +qj +Ok +bV +es +XP +re +re +re +re +re +re +re +re +re +re +FK +yM +FK +FK +FK +FK +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(91,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +MF +ml +Pf +Lg +Lg +MF +fi +fi +fi +fi +fi +fi +pp +gM +IZ +MF +re +re +re +re +Zn +Ma +Ma +re +re +re +re +re +re +re +re +re +re +re +fe +ab +lM +IV +Fi +iW +go +iW +TN +Ye +FK +FK +FK +GY +uY +tD +am +kX +Rl +lb +uY +sy +FK +FK +PR +tI +iK +ea +FK +lb +uY +tD +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +aG +FK +Gv +ek +Gv +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(92,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +MF +gB +HP +HP +HP +MF +fW +rr +rr +rr +rr +Ek +pp +gM +EM +MF +re +re +re +DS +wh +Ma +Ma +Ma +re +re +re +re +re +re +re +re +re +re +fe +jo +jo +Lp +vZ +Ag +VT +Ag +HE +fe +FK +cW +Lv +lb +qj +tD +cn +Mv +tv +lb +uY +ZI +rU +FK +UU +fa +Gi +Yz +Sr +lb +uY +pb +FK +EE +Yg +vj +SA +FK +Ma +Ma +DA +Ma +Ma +as +PK +EK +yo +Kh +Gv +sN +Gv +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(93,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +MF +AG +HP +HP +HP +mZ +rr +Oo +zC +dH +rr +dV +gM +gM +rA +MF +MF +re +re +DS +Re +wh +Ma +Ma +Zn +re +re +re +re +re +re +re +re +re +fe +eg +eg +fe +Jn +nS +xI +xI +eD +fe +FK +hX +Lv +lb +uY +tD +Kv +jy +lh +lb +uY +ZI +hT +FK +xj +PF +tN +Sh +WT +lb +uY +xf +FK +xr +XK +Yg +XK +FD +ZH +Qk +Ma +Ma +Ma +tK +FK +FK +Kh +Kh +ix +ix +ix +FK +Uq +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(94,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +MF +wk +jL +HP +bC +MF +dL +rr +rr +hp +rr +kr +pp +gM +gM +aW +MF +MF +MF +MF +Re +PZ +Ma +Ma +dZ +re +re +re +re +re +re +re +re +re +fe +hM +iF +ro +Fi +DU +iW +iW +Ny +Ye +FK +FK +FK +Hw +uY +tD +Wt +EQ +US +lb +uY +xJ +FK +FK +nH +th +lB +UB +FK +lb +qj +xf +FK +FK +bF +FK +We +tK +Ma +VE +zr +Ma +Ma +Ri +nT +Dx +XK +XK +XK +uR +SU +Xh +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(95,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +MF +MF +MF +MF +MF +Sa +MF +MF +MF +tx +tx +tx +tx +tx +pp +gM +jf +gM +bj +TY +cH +cH +vs +cR +Ma +Ma +Zn +re +re +re +re +re +re +re +re +re +fe +yl +NT +MB +tt +sm +sm +sm +Bu +iz +hV +hV +hV +zg +uY +nv +hV +JU +hV +wE +uY +nh +hV +hV +hV +hV +hV +hV +hV +zg +uY +xf +FK +Na +ow +FK +FK +FK +Ma +do +Ma +Ma +Ma +tK +FK +FK +Kh +Kh +FK +FK +FK +FK +Uq +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(96,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +MF +cF +cF +cF +cF +cF +KI +Ci +MF +ex +ex +ex +ex +ex +gM +gM +gM +FM +MF +nr +TY +cH +vs +cR +Ma +Ma +re +re +re +re +re +re +re +re +re +re +fe +nz +tj +UR +Iu +Uu +Le +Uu +Iu +EA +uY +TM +uY +qj +Uo +uY +uY +uY +uY +uY +uY +uY +uY +oI +uY +uY +uY +qj +qj +qj +Uo +xf +FK +XK +XK +pX +bF +kh +sD +at +Ma +Ma +Ma +kA +PK +EK +EK +zh +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(97,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +MF +YY +LB +Am +iN +uc +Jb +Ps +eA +gM +gM +gM +gM +gM +gM +gM +gM +Mn +MF +CV +TY +gA +MF +Zn +Ma +Ma +re +re +re +re +re +re +re +re +re +re +fe +fe +fe +fe +Lk +Uu +Uu +Uu +Iu +AC +bV +es +bV +OD +bV +bV +RC +qj +lf +bV +bV +ox +bV +es +es +bV +bV +yN +bV +bV +bV +Wo +FK +QI +XK +XK +Xh +dZ +dZ +yG +Ma +Ma +Ma +VM +PK +EK +zh +gC +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(98,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +MF +qp +Ls +Ec +uc +CT +Jb +xT +MF +Jd +Kd +OS +Kd +OS +OS +Kd +gM +gM +MF +MF +up +MF +MF +Zn +Ma +Ma +re +re +re +re +re +re +re +re +re +re +re +re +re +fe +VH +sC +mA +OZ +xD +fe +FK +FK +EX +EX +EX +yn +lb +uY +tD +yn +eH +kO +kO +FK +AR +BK +DL +ai +rX +ai +ai +TJ +FK +HU +AP +HU +FK +Kh +Kh +FK +Kh +Kh +FK +FK +FK +FK +yM +yM +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(99,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +MF +ct +Bo +wI +Rs +mK +QX +MF +MF +MF +Pq +ya +Yb +Xc +GO +fz +la +la +MF +Fh +la +ht +MF +qS +Ma +Ma +re +re +re +re +re +re +FK +FK +FK +FK +FK +FK +re +fe +qY +qY +qY +qY +qY +fe +ap +FK +Hn +eF +As +ud +lb +uY +fy +ud +pi +MC +bQ +FK +Eo +Iz +fo +yu +yu +yu +Dk +BQ +ll +BX +BX +BX +hl +EK +EK +EK +qM +EK +hl +EK +kg +EK +EK +EK +yM +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(100,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +MF +qp +az +Jc +Pb +FG +Jb +MF +eP +eP +eP +nb +Ar +Ar +Ar +wZ +eP +eP +mV +mV +mV +mV +mV +qS +qS +Ko +re +re +re +re +re +re +FK +Ov +Ov +Ov +tB +FK +re +FK +sA +XK +bG +XK +XK +FK +ap +FK +RD +oZ +hY +FK +lb +TM +qL +FK +oo +bJ +CK +FK +QD +Xs +fo +MV +dS +MV +MV +UV +ll +BX +BX +BX +hl +EK +qM +AI +EK +EK +hl +EK +EK +EK +EK +EK +yM +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(101,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +MF +TF +vO +Wg +TR +Pb +Jb +vU +eP +gu +nb +ff +Ar +Ar +hb +Dl +eP +SQ +mV +mV +mV +mV +SQ +MF +MF +MF +MF +MF +re +re +re +re +FK +Ov +rB +Ov +tB +FK +re +FK +FK +iT +FK +UD +uu +FK +FK +FK +FK +FK +FK +FK +Jx +gj +uf +FK +FK +FK +FK +FK +FK +FK +DY +Ij +DY +Ij +DY +DY +FK +TB +ZZ +XK +tK +Kh +Kh +FK +Kh +Kh +FK +FK +lU +lU +lU +tK +FK +FK +Uq +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(102,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +MF +Qv +Qv +Qv +Qv +Qv +pc +MF +oC +nb +BF +Ar +GU +Ar +wZ +gu +eP +mV +mV +mC +jG +mV +mV +ZW +gM +wO +Bj +MF +re +re +re +re +FK +Ov +Ov +Ov +tB +FK +re +FK +iB +Ol +FK +FK +FK +FK +Cc +eO +cf +mg +Cc +FK +lb +uY +tD +FK +Cc +Cc +Cc +Cc +Cc +FK +FK +XK +XK +XK +FK +re +FK +TO +wG +XK +VA +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Cb +ED +bk +Ue +tU +PB +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(103,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +MF +MF +MF +MF +MF +MF +MF +MF +eP +xm +Ar +Ar +Ar +hb +Dl +eP +oC +mV +mV +Fc +jG +mV +tC +MF +gM +gM +gM +MF +re +re +re +re +FK +FK +FK +FK +FK +FK +re +FK +IH +XK +Hk +MI +FK +pF +Cc +DI +Zw +Hj +VL +Un +qA +uY +nh +iE +xb +Co +Co +qR +Cc +Cc +FK +YC +dN +tf +FK +re +FK +sh +ts +Pd +Fj +Ma +Ma +Ma +Ma +Ma +Ma +Ma +bk +bW +IB +Ah +tU +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(104,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +eP +xm +Ar +Ar +Ar +wZ +os +eP +eP +mV +mV +jG +qt +mV +mV +jB +gM +GT +sp +MF +re +re +re +re +re +re +re +re +re +re +re +FK +TQ +QU +sd +Xt +FK +fK +VS +zg +qj +uY +qj +qj +uY +uY +uY +uY +uY +uY +qj +nh +Pi +Cc +FK +FK +FK +FK +FK +re +FK +jW +EO +ME +zM +Ma +jU +Ma +Ma +Ma +Ma +Ma +bk +lV +PX +nc +tU +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(105,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +xu +xu +xu +dx +xm +Ar +Ar +Ar +wZ +eP +eP +eP +mV +mV +SQ +mV +mV +mV +jB +yr +nq +kd +MF +re +re +re +re +re +re +re +re +re +re +re +FK +pM +XR +xB +lS +FK +vc +lb +uY +od +qj +uY +uY +uY +uY +uY +uY +uY +uY +Uo +uY +aR +HJ +FK +re +re +re +re +re +FK +zL +qj +qj +Ms +Ma +Ma +Ma +Ma +Ma +Ma +Ma +RU +ED +WJ +Ai +tU +PB +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(106,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +xu +xu +mV +eP +xm +GU +Ar +Ar +wZ +eP +eP +mV +mV +mV +mV +mV +mV +mV +jB +gM +il +gM +MF +re +re +re +re +re +re +re +re +re +re +re +FK +FK +FK +FK +FK +FK +jN +lb +uY +uY +Gx +uE +ev +VZ +VZ +LY +ev +Lq +WQ +uY +uY +aR +Cc +FK +re +re +re +re +re +FK +FK +FK +FK +tK +FK +FK +FK +FK +FK +FK +FK +FK +PB +PB +tK +FK +FK +Uq +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(107,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +xu +xu +mV +eP +xm +Ar +Ar +Ar +wZ +gu +eP +zE +Wr +zE +zE +zE +zE +zE +MF +MF +MF +MF +MF +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +FK +fK +lb +uY +uY +uE +QF +uN +WM +uN +uN +uN +Fg +Lq +uY +uY +nW +Cc +FK +re +re +re +Uq +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(108,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +xu +mV +eP +xm +Ar +Ar +Ar +wZ +eP +NB +zE +FK +Fv +re +re +re +re +zE +re +re +re +re +re +re +re +re +re +re +re +re +AS +FK +FK +FK +FK +FK +FK +FK +FK +FK +zY +uY +uY +IC +Qw +wL +Qw +Pc +WM +uN +uN +Qj +qj +uY +AZ +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(109,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +mV +mV +eP +xm +Ar +Ar +Ar +wZ +eP +CC +QP +nh +PW +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +JK +hV +hV +hV +hV +hV +hV +hV +sE +VK +zg +uY +uY +wC +XB +QG +cv +KN +zd +zd +WM +At +qj +uY +nh +CD +st +hV +hV +hV +hV +hV +hV +hV +hV +hV +hV +hV +hV +hV +hV +hV +hV +hV +hV +hV +hV +hV +hV +hV +hV +gQ +XD +hV +hV +hV +hV +hV +hV +hV +hV +hV +hV +hV +iZ +Vq +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(110,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +mV +mV +eP +ZF +Cu +Ar +Ar +wZ +lG +CC +QP +TM +PW +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +JK +uY +TM +uY +uY +uY +TM +uY +Yk +qj +uY +uY +Rq +FK +nE +JF +QG +KN +lz +zd +uN +Wf +qj +qj +uY +uY +zX +uY +uY +uY +uY +uY +uY +uY +uY +uY +uY +uY +uY +uY +uY +uY +uY +uY +uY +uY +uY +uY +uY +uY +uY +gQ +Cd +uY +uY +uY +uY +uY +uY +uY +uY +uY +uY +uY +cS +rP +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(111,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +xu +mV +dx +eP +xm +Ar +Ar +wZ +eP +CC +QP +lf +PW +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +JK +bV +bV +bV +bV +bV +bV +bV +ec +es +yA +uY +uY +wC +cv +QG +XB +KN +zd +lz +WM +At +qj +uY +lf +Um +UK +bV +bV +bV +bV +bV +bV +bV +bV +bV +bV +bV +bV +bV +bV +bV +bV +bV +bV +bV +bV +bV +bV +bV +bV +gQ +Zr +bV +bV +bV +bV +bV +bV +bV +bV +bV +bV +bV +nF +yK +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(112,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +mV +mV +eP +gu +xm +Ar +Ar +wZ +dx +dR +zE +FK +Fv +re +re +re +re +zE +zE +re +re +re +re +re +re +re +re +re +re +re +AS +FK +FK +FK +FK +FK +FK +of +FK +FK +zY +qj +uY +uE +QK +VZ +VZ +Wj +uN +uN +uN +Qj +qj +uY +sX +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +FK +re +re +re +Uq +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(113,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +JY +iV +eP +oC +xm +Ar +Ar +wZ +eP +eP +zE +Wr +zE +zE +zE +zE +zE +zE +zE +zE +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +FK +iI +aa +qj +uY +IC +YF +WM +uN +WM +WM +uN +mQ +xv +qj +uY +fy +Cc +Sv +Nd +Cj +cA +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +FK +FK +FK +FK +FK +re +re +re +re +Uq +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(114,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +hj +tc +eP +eP +xm +Ar +Ar +wZ +eP +oC +SQ +mV +SQ +mV +SQ +mV +mV +mV +xu +zE +re +re +re +re +re +re +re +re +re +re +re +re +FK +FK +FK +Xh +FK +FK +FK +wN +lb +uY +uY +nQ +IC +Tz +Qw +Qw +Qw +Tz +xv +Gx +uY +uY +fy +el +Yr +kw +UI +eQ +FK +FK +FK +FK +FK +FK +FK +FK +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +bt +FK +QN +fC +tM +FK +FK +tG +tG +FK +FK +Uq +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(115,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +xu +mV +eP +nb +BF +Ar +Ar +wZ +eP +eP +mV +SQ +mV +SQ +mV +jm +bs +bs +xu +zE +zE +re +re +re +re +re +re +re +re +re +re +re +FK +qw +XK +PP +PP +xP +FK +hi +lb +uY +Uo +uY +uY +uY +uY +uY +uY +uY +uY +uY +od +uY +fy +el +rW +ET +WE +YZ +FK +en +Vk +CB +FK +tS +dZ +Xo +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +FK +Hf +Ab +XW +FK +xt +wy +wy +yF +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(116,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +zE +xu +mV +eP +xm +Ar +Ar +Ar +wZ +eP +gu +mV +SQ +ZP +Jj +zR +xE +eM +bs +xu +xu +zE +re +re +re +re +re +re +re +re +re +re +re +FK +FK +YD +Vz +PP +Qo +FK +iI +WX +RC +uY +qj +qj +uY +uY +uY +uY +uY +uY +uY +uY +Ok +bK +el +AY +kw +cB +Qf +FK +ue +rq +FJ +FK +yf +vC +ND +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +ud +qQ +Dr +qQ +kq +qQ +Dr +sz +Qb +tG +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(117,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +mV +eP +xm +Ar +GU +Ar +wZ +oC +eP +mV +mV +xE +cC +cC +cC +xE +bs +mV +xu +zE +re +re +re +re +re +re +re +re +re +re +re +re +FK +XK +XK +PP +kY +FK +pF +Cc +Tu +hA +Ak +es +Bq +RC +uY +lf +Bq +bV +bV +bV +bK +Cc +Cc +FK +vE +NY +pg +FK +hw +Be +XM +FK +dZ +dZ +PC +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +ud +nx +qQ +Pl +FK +Ea +xI +xI +RL +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(118,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +mV +oC +xm +Ar +Ar +Ar +wZ +eP +eP +mV +mV +xE +cC +cC +cC +xE +mV +mV +xu +zE +re +re +re +re +re +re +re +re +re +re +re +re +FK +ls +XK +qx +FK +FK +FK +Cc +Oi +cN +vh +Cc +FK +lb +uY +qX +FK +Cc +Cc +bn +Cc +Cc +FK +FK +FK +NK +FK +FK +FK +FK +Yd +FK +NO +dZ +mn +yw +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +FK +FK +FK +FK +FK +vx +nu +FK +FK +FK +Uq +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(119,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +mV +eP +xm +Ar +Ar +Ar +wZ +eP +UG +mV +mV +gm +xE +ke +xE +Cq +mV +xu +xu +zE +re +re +re +re +re +re +re +re +re +re +re +re +FK +FK +vg +bF +FK +gR +FK +FK +FK +FK +FK +FK +FK +EU +vy +El +FK +FK +FK +FK +FK +FK +FK +Ks +aw +XK +aK +Du +bF +dl +CI +tq +jI +dZ +dZ +mn +rL +sD +sD +sD +gN +gN +gN +sD +Ma +Ma +dZ +Ma +sD +Ma +dZ +Ma +Ma +Ma +Ma +Ma +sD +sD +Ma +sD +Ma +sD +dZ +FK +So +PU +So +FK +qQ +xI +gT +Qb +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(120,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +mV +gu +xm +Ar +Ar +Ar +wZ +gu +oC +mV +mV +mV +mV +mV +mV +mV +mV +xu +zE +zE +re +re +re +re +re +re +re +re +re +re +re +re +FK +Kt +qj +pD +FK +XK +RJ +Kx +FK +Fa +OP +pf +ud +lb +uY +tD +ud +Jg +Jg +mN +FK +tl +Jk +CL +rm +Zk +EG +XK +bF +qU +CI +tq +jI +dZ +dZ +dZ +ve +dZ +Ko +dZ +dZ +dZ +dZ +Ko +dZ +Ma +dZ +OT +dZ +Ma +dZ +Ko +dZ +dZ +dZ +Ko +dZ +dZ +dZ +Ko +Ma +Ma +dZ +cm +jV +jV +qJ +Wu +qQ +xI +xd +ns +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(121,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +mV +eP +xm +Ar +Ar +Ar +wZ +eP +eP +mV +mV +mV +mV +Tt +Tt +Tt +Tt +xu +zE +re +re +re +re +re +re +re +re +re +re +re +re +re +FK +qj +wH +mS +FK +xc +FK +FK +FK +Fw +Qs +xF +ud +lb +TM +tD +ud +wA +ty +sG +FK +lg +FE +rp +rm +PP +zU +XK +bF +PP +CI +tq +de +dZ +dZ +Fr +Im +zr +zr +zr +zr +zr +zr +zr +zr +zr +dZ +zr +zr +zr +dZ +zr +zr +Ma +Ma +Ma +Ma +zr +Ma +zr +zr +zr +dZ +FK +RR +pI +jF +FK +qp +xI +cM +BO +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(122,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +xu +eP +xm +Ar +Ar +Ar +wZ +eP +eP +xu +xu +xu +xu +xu +yE +mV +pY +xu +zE +re +re +re +re +re +re +re +re +re +re +re +re +re +FK +ZB +FK +FK +FK +Ux +Op +wJ +FK +em +Qt +iD +Rz +lb +uY +tD +Rz +gf +Ly +Ly +FK +GQ +GQ +FK +FK +vb +FK +FK +FK +PP +CI +tq +jI +dZ +dZ +PC +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +FK +FK +FK +FK +FK +LN +Nc +FK +FK +FK +Uq +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(123,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +xu +xn +ul +qo +qo +qo +De +xn +xn +xu +zE +zE +zE +xu +xu +xu +xu +xu +zE +re +re +re +re +re +re +re +re +re +re +re +re +re +FK +zz +pL +PN +ZY +VS +hV +hV +DE +hV +pv +hV +hV +zg +uY +nh +hV +hV +bi +hV +CW +hV +hV +LC +FK +cy +PP +PP +vb +PP +CI +Aq +nl +dZ +Vh +ce +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Zn +Zn +fT +Qc +FK +rY +xI +xI +pw +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(124,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +gu +xm +Ar +Ar +Ar +wZ +gu +oC +xu +zE +re +zE +zE +zE +zE +zE +zE +zE +re +re +re +re +re +re +re +re +re +re +re +re +re +FK +Ng +OI +JV +zI +lb +uY +uY +uY +uY +uY +uY +uY +uY +od +uY +uY +uY +uY +uY +uY +uY +uY +tD +FK +FK +FK +FK +FK +FK +FK +FK +FK +PB +FK +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Zn +Ma +Ma +fT +bE +qQ +XF +xI +Qb +tG +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(125,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +eP +xm +Ar +Ar +Ar +wZ +eP +eP +xu +zE +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +FK +UP +vM +TI +vw +lb +uY +lf +Vc +bV +bV +bV +bV +RC +uY +lf +bV +bV +bV +bV +Vc +RC +uY +tD +HA +re +re +re +FK +re +re +re +re +re +FK +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Ma +Zn +rJ +rJ +Xa +FK +bM +Kb +Kb +yF +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(126,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +eP +xm +Ar +Ar +Ar +wZ +eP +eP +xu +zE +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +hk +FK +FK +FK +FK +FK +lb +uY +tD +FK +GQ +GQ +GQ +FK +Fq +uY +WU +FK +GQ +GQ +GQ +FK +lb +uY +tD +FK +FK +FK +FK +FK +lI +re +re +re +re +FK +LQ +LQ +LQ +LQ +LQ +LQ +LQ +LQ +LQ +LQ +LQ +LQ +LQ +LQ +LQ +LQ +LQ +LQ +LQ +LQ +LQ +LQ +LQ +LQ +LQ +LQ +LQ +LQ +FK +vp +WD +vp +FK +FK +tG +tG +FK +FK +Uq +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(127,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +eP +xm +Ar +Ar +Ar +wZ +eP +eP +xu +zE +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +AM +Sr +Sr +Sr +Sr +Sr +lb +Uo +tD +sq +Lw +Lw +Lw +qP +lb +uY +tD +XC +Lw +tk +Lw +FH +lb +Uo +tD +Sr +Sr +Sr +Sr +Sr +VD +re +re +re +re +Uq +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +FK +ot +rc +TV +FK +re +re +re +re +Uq +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(128,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +gu +xm +Ar +Ar +Ar +wZ +gu +oC +xu +zE +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +hk +FK +FK +FK +FK +FK +lb +uY +tD +GV +Lw +Tr +Lw +ud +lb +uY +tD +ud +Lw +Jz +Lw +QB +lb +uY +tD +FK +FK +FK +FK +FK +lI +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +FK +FK +FK +FK +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(129,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +eP +xm +Ar +Ar +Ar +wZ +eP +eP +xu +zE +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +HA +lb +uY +tD +Zf +Lw +Lw +Lw +Mg +lb +uY +tD +eR +Lw +GE +Lw +Nm +lb +uY +tD +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +Uq +re +re +re +Uq +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(130,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +eP +xm +Ar +Ar +Ar +wZ +eP +eP +xu +zE +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +FK +gJ +Vc +Qa +FK +Zp +nD +lH +FK +lb +uY +qL +FK +Lt +lZ +cX +FK +gJ +Vc +Ay +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(131,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +eP +xm +Ar +Ar +Ar +wZ +eP +eP +xu +zE +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +FK +FK +FK +FK +FK +EY +hV +hV +hV +zg +uY +nh +hV +hV +hV +Cf +FK +FK +FK +FK +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(132,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +gu +xm +Ar +Ar +Ar +wZ +gu +oC +xu +zE +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +FK +Pp +uY +uY +uY +uY +Uo +uY +uY +uY +av +dF +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(133,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +eP +xm +Ar +Ar +Ar +wZ +eP +eP +xu +zE +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +FK +jP +bV +Js +bV +RC +uY +lf +bV +nw +bV +oe +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(134,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +xu +xu +xu +xu +xu +xu +xu +xu +xu +xu +zE +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +FK +FK +pt +pt +Je +lb +uY +tD +jt +WH +AE +FK +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(135,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +zE +zE +zE +zE +zE +zE +zE +zE +zE +zE +zE +zE +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +FK +Ic +ne +nC +lb +uY +tD +nJ +cZ +Jv +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(136,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +FK +dn +UT +nC +lb +uY +tD +SN +MZ +Ho +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(137,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +FK +FK +FK +FK +FK +lb +uY +rQ +FK +FK +FK +FK +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(138,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +FK +re +re +dK +Qi +lb +uY +tD +Qi +mj +re +re +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(139,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +FK +re +re +dK +Qi +lb +TM +tD +Qi +mj +re +re +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(140,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +FK +re +re +dK +Qi +lb +uY +tD +Qi +mj +re +re +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(141,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +FK +re +re +dK +Qi +lb +uY +tD +Qi +mj +re +re +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(142,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +FK +re +re +dK +Qi +lb +TM +tD +Qi +mj +re +re +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(143,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +FK +re +re +dK +Qi +lb +uY +tD +Qi +mj +re +re +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(144,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +FK +FK +FK +FK +FK +lb +uY +qX +FK +FK +FK +FK +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(145,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +FK +HD +wi +ST +FK +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(146,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +Uq +re +re +re +Uq +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(147,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(148,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(149,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(150,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(151,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(152,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(153,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(154,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(155,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(156,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(157,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(158,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(159,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(160,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(161,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(162,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(163,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(164,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(165,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(166,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(167,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(168,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(169,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(170,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(171,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(172,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(173,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(174,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(175,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(176,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(177,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(178,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(179,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(180,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(181,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(182,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(183,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(184,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(185,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(186,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(187,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(188,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(189,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(190,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(191,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(192,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(193,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(194,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(195,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(196,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(197,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(198,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(199,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(200,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(201,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(202,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(203,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(204,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(205,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(206,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(207,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(208,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(209,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(210,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(211,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(212,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(213,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(214,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(215,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(216,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(217,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(218,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(219,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(220,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(221,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(222,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(223,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(224,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(225,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(226,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(227,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(228,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(229,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(230,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(231,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(232,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(233,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(234,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(235,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(236,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(237,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(238,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(239,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(240,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(241,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(242,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(243,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(244,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(245,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(246,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(247,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(248,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(249,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(250,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(251,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} +(252,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +bg +DD +fu +re +"} +(253,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +DD +Ov +zA +re +"} +(254,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +iU +DD +Sc +re +"} +(255,1,1) = {" +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +re +"} diff --git a/_maps/map_files/Basketball/beach_bums.dmm b/_maps/map_files/Basketball/beach_bums.dmm index 768a436e094..f5d5ecca73e 100644 --- a/_maps/map_files/Basketball/beach_bums.dmm +++ b/_maps/map_files/Basketball/beach_bums.dmm @@ -1,6 +1,6 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "af" = ( -/obj/item/bedsheet/dorms{ +/obj/effect/spawner/random/bedsheet{ pixel_x = 6; pixel_y = 11 }, @@ -340,7 +340,7 @@ /turf/open/misc/beach/sand, /area/centcom/basketball) "Jb" = ( -/obj/item/bedsheet/dorms{ +/obj/effect/spawner/random/bedsheet{ pixel_x = 6; pixel_y = 11 }, @@ -356,7 +356,7 @@ /turf/open/misc/beach/sand, /area/centcom/basketball) "Lu" = ( -/obj/item/bedsheet/dorms{ +/obj/effect/spawner/random/bedsheet{ pixel_x = 6; pixel_y = 11 }, diff --git a/_maps/map_files/Birdshot/birdshot.dmm b/_maps/map_files/Birdshot/birdshot.dmm index 09563ab1868..b2fad9e88d2 100644 --- a/_maps/map_files/Birdshot/birdshot.dmm +++ b/_maps/map_files/Birdshot/birdshot.dmm @@ -9299,7 +9299,7 @@ /area/station/maintenance/department/medical/central) "dBA" = ( /obj/structure/bed, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/machinery/light/small/directional/east, /turf/open/floor/carpet/royalblack, /area/station/commons/dorms) @@ -11067,7 +11067,7 @@ /obj/structure/bed{ dir = 4 }, -/obj/item/bedsheet/dorms{ +/obj/effect/spawner/random/bedsheet{ dir = 4 }, /obj/machinery/light/small/directional/west, @@ -18462,10 +18462,10 @@ /obj/machinery/door/airlock/maintenance{ name = "Maintenance" }, -/obj/effect/mapping_helpers/airlock/access/all/supply/general, /obj/effect/mapping_helpers/airlock/unres{ dir = 1 }, +/obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/fore) "gKL" = ( @@ -19620,13 +19620,9 @@ /obj/effect/turf_decal/siding/wood{ dir = 9 }, -/obj/structure/rack{ - icon = 'icons/obj/fluff/general.dmi'; - icon_state = "minibar"; - name = "skeletal minibar" - }, /obj/item/storage/fancy/candle_box, /obj/machinery/light_switch/directional/west, +/obj/structure/rack/skeletal, /turf/open/floor/iron/grimy, /area/station/service/library) "hei" = ( @@ -22243,7 +22239,7 @@ /obj/machinery/conveyor{ id = "mining" }, -/obj/machinery/bouldertech/brm, +/obj/machinery/brm, /turf/open/floor/iron, /area/station/cargo/miningfoundry) "hZP" = ( @@ -35810,10 +35806,7 @@ location = "QM #1" }, /obj/effect/turf_decal/delivery, -/mob/living/simple_animal/bot/mulebot{ - home_destination = "QM #1"; - suffix = "#1" - }, +/mob/living/simple_animal/bot/mulebot, /turf/open/floor/iron, /area/station/cargo/storage) "mKD" = ( @@ -39810,7 +39803,7 @@ /area/station/security/checkpoint/customs) "ohO" = ( /obj/structure/bed, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/machinery/light/small/directional/east, /turf/open/floor/carpet/red, /area/station/commons/dorms) @@ -61170,6 +61163,21 @@ dir = 1 }, /area/station/command/heads_quarters/hop) +"vdl" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/button/door/directional/east{ + id = "qm_warehouse_aft"; + name = "Warehouse Door Control"; + pixel_x = -24; + pixel_y = -23; + req_access = list("cargo") + }, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "vdm" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/broken_flooring/pile/directional/east, @@ -62674,7 +62682,8 @@ /obj/machinery/door/airlock/command{ name = "Centcom Dock" }, -/obj/effect/mapping_helpers/airlock/access/all/command/general, +/obj/effect/mapping_helpers/airlock/access/any/command/general, +/obj/effect/mapping_helpers/airlock/access/any/admin/general, /turf/open/floor/iron/textured_half, /area/station/command/corporate_dock) "vzY" = ( @@ -66400,10 +66409,11 @@ }, /area/station/science/xenobiology) "wIm" = ( -/obj/effect/mapping_helpers/airlock/access/all/command/general, /obj/machinery/door/airlock/hatch{ name = "Centcom Dock" }, +/obj/effect/mapping_helpers/airlock/access/any/command/general, +/obj/effect/mapping_helpers/airlock/access/any/admin/general, /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) "wIp" = ( @@ -70066,7 +70076,7 @@ /obj/structure/bed{ dir = 4 }, -/obj/item/bedsheet/dorms{ +/obj/effect/spawner/random/bedsheet{ dir = 4 }, /obj/machinery/light/small/directional/west, @@ -88522,7 +88532,7 @@ pJQ wZF pqv wZF -sxA +vdl slY ueX rVQ diff --git a/_maps/map_files/Deathmatch/Maint_Mania.dmm b/_maps/map_files/Deathmatch/Maint_Mania.dmm new file mode 100644 index 00000000000..ec04776ae83 --- /dev/null +++ b/_maps/map_files/Deathmatch/Maint_Mania.dmm @@ -0,0 +1,1499 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aD" = ( +/turf/closed/indestructible/reinforced, +/area/deathmatch) +"aP" = ( +/obj/machinery/door/airlock/centcom, +/turf/open/space/basic, +/area/deathmatch) +"bI" = ( +/obj/machinery/light/no_nightlight/directional/north, +/turf/open/indestructible, +/area/deathmatch) +"cn" = ( +/turf/open/indestructible, +/area/deathmatch) +"cx" = ( +/obj/machinery/vending/wallmed/directional/north, +/turf/open/indestructible, +/area/deathmatch) +"cy" = ( +/obj/structure/table/reinforced/ctf, +/obj/item/gun/ballistic/shotgun/riot, +/turf/open/indestructible, +/area/deathmatch) +"eX" = ( +/obj/item/ammo_casing/shotgun/frag12, +/turf/open/indestructible, +/area/deathmatch) +"fh" = ( +/obj/structure/table/reinforced/ctf, +/obj/item/storage/backpack/duffelbag/syndie/ammo, +/turf/open/indestructible, +/area/deathmatch) +"ga" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/template_noop) +"gJ" = ( +/obj/item/ammo_casing/shotgun/stunslug, +/turf/open/indestructible, +/area/deathmatch) +"ho" = ( +/obj/effect/spawner/structure/window/reinforced/indestructible, +/turf/open/floor/plating, +/area/deathmatch) +"hB" = ( +/turf/closed/indestructible/fakedoor, +/area/deathmatch) +"hN" = ( +/obj/structure/lattice, +/obj/effect/decal/cleanable/dirt/dust, +/turf/template_noop, +/area/template_noop) +"ih" = ( +/obj/item/reagent_containers/pill/maintenance, +/turf/open/indestructible, +/area/deathmatch) +"iC" = ( +/obj/machinery/light/small/directional/south, +/obj/structure/table/reinforced, +/turf/open/indestructible, +/area/deathmatch) +"jc" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible, +/area/deathmatch) +"jX" = ( +/obj/machinery/light/small/directional/north, +/turf/open/indestructible, +/area/deathmatch) +"jY" = ( +/obj/item/stack/medical/gauze{ + amount = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"ka" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/open/indestructible, +/area/deathmatch) +"kp" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"kx" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible, +/area/deathmatch) +"lA" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"lJ" = ( +/obj/item/crowbar, +/obj/structure/table/reinforced, +/turf/open/indestructible, +/area/deathmatch) +"lN" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/caution/stand_clear, +/turf/open/indestructible, +/area/deathmatch) +"mS" = ( +/obj/effect/turf_decal/caution/stand_clear, +/turf/open/indestructible, +/area/deathmatch) +"mZ" = ( +/obj/structure/grille, +/turf/open/indestructible, +/area/deathmatch) +"nQ" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible, +/area/deathmatch) +"nS" = ( +/obj/machinery/light/small/directional/north, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood/gibs/old, +/turf/open/indestructible, +/area/deathmatch) +"pT" = ( +/obj/structure/rack, +/obj/item/grenade/chem_grenade/cleaner, +/turf/open/indestructible, +/area/deathmatch) +"pZ" = ( +/obj/structure/sign/poster/random/directional/west, +/turf/open/indestructible, +/area/deathmatch) +"qK" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/reagent_containers/pill/maintenance, +/turf/open/indestructible, +/area/deathmatch) +"sk" = ( +/obj/structure/sign/poster/random/directional/east, +/turf/open/indestructible, +/area/deathmatch) +"sl" = ( +/obj/machinery/door/airlock/public/glass, +/obj/effect/mapping_helpers/airlock/abandoned, +/turf/open/indestructible, +/area/deathmatch) +"sF" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/delivery, +/turf/open/indestructible, +/area/deathmatch) +"sV" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/delivery, +/turf/open/indestructible, +/area/deathmatch) +"sX" = ( +/obj/structure/rack, +/obj/machinery/light/small/directional/north, +/obj/item/reagent_containers/cup/soda_cans/lemon_lime, +/turf/open/indestructible, +/area/deathmatch) +"tT" = ( +/obj/structure/rack, +/obj/item/stack/cable_coil, +/obj/item/assembly/igniter, +/turf/open/indestructible, +/area/deathmatch) +"ur" = ( +/obj/structure/lattice, +/turf/template_noop, +/area/template_noop) +"vB" = ( +/obj/machinery/light/small/directional/east, +/turf/open/indestructible, +/area/deathmatch) +"wi" = ( +/obj/item/screwdriver, +/obj/structure/table/reinforced, +/turf/open/indestructible, +/area/deathmatch) +"wC" = ( +/obj/item/weldingtool, +/obj/structure/rack, +/obj/item/flashlight/flare, +/turf/open/indestructible, +/area/deathmatch) +"zd" = ( +/obj/machinery/vending/medical{ + desc = "Go on, smash this vending machine. You want free healing right? Do it." + }, +/turf/open/indestructible, +/area/deathmatch) +"zF" = ( +/obj/item/ammo_casing/shotgun/improvised, +/turf/open/indestructible, +/area/deathmatch) +"AG" = ( +/obj/structure/lattice/catwalk, +/obj/item/storage/toolbox/mechanical/old/clean{ + desc = "An old, blue toolbox, it looks soulful." + }, +/turf/open/space/basic, +/area/template_noop) +"Bs" = ( +/obj/machinery/light/small/directional/west, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible, +/area/deathmatch) +"BU" = ( +/obj/item/chainsaw, +/turf/open/indestructible, +/area/deathmatch) +"BV" = ( +/obj/structure/table/reinforced, +/turf/open/indestructible, +/area/deathmatch) +"Dh" = ( +/obj/structure/lattice/catwalk, +/obj/effect/mob_spawn/corpse/human/engineer/mod, +/turf/template_noop, +/area/template_noop) +"Dt" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/loading_area{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"Er" = ( +/obj/item/clothing/head/utility/welding, +/obj/structure/table/reinforced, +/turf/open/indestructible, +/area/deathmatch) +"Ew" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/reagent_containers/pill/maintenance, +/turf/open/indestructible, +/area/deathmatch) +"EK" = ( +/obj/machinery/light/small/directional/south, +/turf/open/indestructible, +/area/deathmatch) +"EN" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/turf_decal/bot, +/turf/open/indestructible, +/area/deathmatch) +"EW" = ( +/obj/effect/decal/cleanable/blood/tracks, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible, +/area/deathmatch) +"Fp" = ( +/obj/structure/rack, +/obj/item/reagent_containers/pill/maintenance, +/obj/item/spear, +/turf/open/indestructible, +/area/deathmatch) +"FH" = ( +/obj/effect/decal/cleanable/oil/slippery, +/turf/open/indestructible, +/area/deathmatch) +"FL" = ( +/turf/template_noop, +/area/template_noop) +"Gi" = ( +/obj/effect/decal/cleanable/blood/gibs/limb, +/turf/open/indestructible, +/area/deathmatch) +"GA" = ( +/obj/item/stack/medical/mesh{ + amount = 4 + }, +/obj/item/spear, +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/delivery, +/turf/open/indestructible, +/area/deathmatch) +"GF" = ( +/obj/machinery/light/small/directional/west, +/turf/open/indestructible, +/area/deathmatch) +"Hd" = ( +/obj/machinery/light/small/directional/north, +/obj/item/soap/nanotrasen, +/obj/structure/table/reinforced, +/turf/open/indestructible, +/area/deathmatch) +"Hp" = ( +/obj/item/reagent_containers/pill/maintenance, +/obj/structure/sign/poster/random/directional/north, +/obj/structure/table/reinforced, +/turf/open/indestructible, +/area/deathmatch) +"HE" = ( +/obj/structure/lattice/catwalk, +/obj/structure/statue/sandstone/assistant, +/turf/template_noop, +/area/template_noop) +"Ij" = ( +/turf/open/space/basic, +/area/template_noop) +"It" = ( +/obj/item/gun/ballistic/rifle/boltaction/pipegun/prime, +/obj/effect/turf_decal/box, +/turf/open/indestructible, +/area/deathmatch) +"Kt" = ( +/obj/structure/table/reinforced/ctf, +/obj/item/weldingtool, +/turf/open/indestructible, +/area/deathmatch) +"KW" = ( +/obj/machinery/space_heater, +/obj/effect/turf_decal/bot, +/turf/open/indestructible, +/area/deathmatch) +"La" = ( +/obj/structure/sign/poster/random/directional/south, +/obj/item/flashlight/flare, +/obj/structure/table/reinforced, +/turf/open/indestructible, +/area/deathmatch) +"LJ" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/effect/turf_decal/bot, +/turf/open/indestructible, +/area/deathmatch) +"Mt" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible, +/area/deathmatch) +"MC" = ( +/obj/effect/mob_spawn/corpse/human/assistant, +/turf/template_noop, +/area/template_noop) +"Na" = ( +/obj/structure/rack, +/obj/item/reagent_containers/cup/soda_cans/starkist, +/turf/open/indestructible, +/area/deathmatch) +"Ns" = ( +/obj/item/stack/cable_coil, +/obj/structure/table/reinforced, +/turf/open/indestructible, +/area/deathmatch) +"NO" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/indestructible, +/area/deathmatch) +"NU" = ( +/obj/effect/decal/cleanable/blood, +/turf/open/indestructible, +/area/deathmatch) +"NY" = ( +/obj/item/screwdriver, +/turf/open/indestructible, +/area/deathmatch) +"Ok" = ( +/obj/structure/extinguisher_cabinet/directional/south, +/obj/machinery/light/small/directional/south, +/turf/open/indestructible, +/area/deathmatch) +"Om" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/random/directional/south, +/turf/open/indestructible, +/area/deathmatch) +"OA" = ( +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/indestructible, +/area/deathmatch) +"OO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/tracks, +/obj/structure/sign/poster/random/directional/east, +/turf/open/indestructible, +/area/deathmatch) +"OR" = ( +/obj/item/stack/medical/suture{ + amount = 6 + }, +/turf/open/indestructible, +/area/deathmatch) +"Pp" = ( +/obj/machinery/light/small/directional/south, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible, +/area/deathmatch) +"PW" = ( +/obj/effect/decal/cleanable/blood/gibs/torso, +/turf/open/indestructible, +/area/deathmatch) +"Qr" = ( +/obj/structure/closet/wardrobe, +/turf/open/floor/plating/airless, +/area/template_noop) +"QN" = ( +/obj/item/razor, +/obj/structure/table/reinforced, +/turf/open/indestructible, +/area/deathmatch) +"QQ" = ( +/obj/effect/decal/cleanable/blood/drip, +/obj/effect/turf_decal/box, +/turf/open/indestructible, +/area/deathmatch) +"Rm" = ( +/obj/item/weldingtool, +/obj/structure/rack, +/turf/open/indestructible, +/area/deathmatch) +"Su" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/box, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible, +/area/deathmatch) +"SN" = ( +/obj/effect/decal/cleanable/blood/tracks, +/obj/effect/turf_decal/caution/stand_clear, +/turf/open/indestructible, +/area/deathmatch) +"Tu" = ( +/obj/machinery/light/small/directional/north, +/obj/structure/table/reinforced, +/turf/open/indestructible, +/area/deathmatch) +"TB" = ( +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/delivery, +/turf/open/indestructible, +/area/deathmatch) +"TP" = ( +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/machinery/door/airlock/public/glass, +/turf/open/indestructible, +/area/deathmatch) +"Un" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 10 + }, +/obj/effect/turf_decal/stripes/corner, +/turf/open/indestructible, +/area/deathmatch) +"Vb" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 5 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/indestructible, +/area/deathmatch) +"Xb" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"XC" = ( +/obj/item/assembly/igniter, +/turf/open/indestructible, +/area/deathmatch) +"XD" = ( +/obj/item/holosign_creator/security, +/obj/machinery/light/small/directional/south, +/turf/open/indestructible, +/area/deathmatch) + +(1,1,1) = {" +FL +FL +FL +FL +FL +ur +FL +FL +FL +FL +ur +FL +FL +FL +FL +FL +FL +FL +ur +FL +FL +FL +FL +FL +ur +FL +FL +FL +FL +"} +(2,1,1) = {" +FL +FL +FL +FL +ur +ur +hN +ur +ur +ur +ur +ur +ur +ur +HE +ur +ur +ur +ur +ur +ur +ur +ur +ur +ur +ur +FL +FL +FL +"} +(3,1,1) = {" +FL +FL +FL +FL +FL +ur +FL +FL +FL +FL +ur +FL +FL +FL +FL +FL +FL +FL +ur +FL +FL +FL +FL +FL +ur +FL +FL +FL +FL +"} +(4,1,1) = {" +FL +FL +FL +FL +FL +ur +FL +FL +FL +FL +ur +FL +FL +FL +FL +FL +FL +FL +ur +FL +FL +FL +FL +FL +ur +FL +FL +FL +FL +"} +(5,1,1) = {" +FL +FL +FL +FL +FL +aD +aD +aD +aD +aD +aD +ho +ho +ho +ho +ho +ho +ho +aD +aD +aD +aD +aD +aD +aD +FL +FL +FL +FL +"} +(6,1,1) = {" +FL +FL +FL +FL +FL +aD +cn +lN +cn +pZ +nQ +zF +zF +zF +It +zF +zF +zF +jc +cn +sk +nQ +mS +cn +aD +FL +FL +FL +FL +"} +(7,1,1) = {" +FL +FL +FL +FL +FL +aD +iC +aD +aD +aD +aD +aD +aD +BV +lJ +Ns +aD +aD +aD +aD +aD +aD +aD +Tu +aD +FL +FL +FL +FL +"} +(8,1,1) = {" +FL +FL +FL +FL +FL +aD +cn +mS +nQ +cn +cn +cn +cn +cn +jc +cn +NO +cn +cn +nQ +cn +ih +mS +cn +aD +FL +FL +FL +FL +"} +(9,1,1) = {" +FL +FL +FL +FL +FL +aD +ho +aD +aD +aD +sX +cn +EN +mZ +EN +cn +EK +aD +aD +mZ +aD +aD +aD +TP +aD +FL +FL +FL +FL +"} +(10,1,1) = {" +FL +FL +FL +FL +FL +aD +Ew +mS +Mt +nQ +sk +cn +mZ +GA +mZ +cn +NU +OA +OO +EW +OA +OA +SN +Un +aD +FL +FL +FL +FL +"} +(11,1,1) = {" +FL +FL +FL +FL +FL +aD +cn +aD +aD +aD +aD +aD +aD +aD +aD +aD +nQ +aD +aD +ho +ho +aD +aD +Vb +hB +ur +Dh +FL +FL +"} +(12,1,1) = {" +aD +aD +aD +aD +aD +aD +jX +aD +Ij +Ij +Ij +ga +Ij +Ij +Ij +aD +NY +aD +TB +cn +cn +Rm +aD +Xb +aD +FL +FL +FL +FL +"} +(13,1,1) = {" +aD +bI +cy +cy +cn +ho +jY +ho +Ij +Ij +Ij +AG +Ij +Ij +Ij +ho +Ok +aD +jX +jc +cn +EK +aD +jc +aD +FL +FL +FL +FL +"} +(14,1,1) = {" +aP +cn +cn +cn +gJ +ho +ka +aD +Ij +Ij +Ij +ga +Ij +Ij +Ij +aD +jc +aD +jY +PW +nQ +cn +aD +jX +aD +FL +FL +FL +FL +"} +(15,1,1) = {" +aD +cn +cn +cn +cn +aD +kp +aD +aD +aD +aD +aD +aD +aD +aD +aD +cn +aD +sl +aD +QN +BV +aD +ih +aD +FL +FL +FL +FL +"} +(16,1,1) = {" +aD +cx +cn +cn +cn +hB +kx +mZ +cn +sk +cn +Bs +cn +cn +cn +pZ +cn +cn +nQ +cn +QQ +Su +aD +cn +aD +FL +FL +ur +FL +"} +(17,1,1) = {" +aD +cn +eX +cn +cn +aD +lA +aD +ih +aD +tT +cn +EN +aD +aD +aD +cn +aD +EN +cn +cn +cn +cn +nQ +aD +ur +ur +ur +ur +"} +(18,1,1) = {" +aP +cn +cn +cn +cn +ho +cn +aD +cn +aD +aD +aD +aD +aD +sV +GF +cn +aD +aD +ho +ho +aD +aD +Mt +aD +FL +FL +ur +FL +"} +(19,1,1) = {" +aD +bI +fh +fh +cn +ho +cn +cn +cn +hB +vB +BU +Fp +aD +Kt +cn +Om +aD +Ij +ga +Ij +Ij +aD +mZ +aD +FL +FL +ur +FL +"} +(20,1,1) = {" +aD +aD +aD +aD +aD +aD +lJ +aD +nQ +aD +aD +BV +aD +aD +KW +cn +cn +ho +ga +Qr +ga +Ij +ho +cn +ho +FL +FL +ur +FL +"} +(21,1,1) = {" +FL +FL +FL +FL +FL +aD +aD +aD +cn +aD +Mt +Dt +cn +aD +aD +aD +cn +ho +Ij +Ij +ga +ga +ho +nQ +ho +FL +FL +ur +MC +"} +(22,1,1) = {" +FL +FL +FL +FL +FL +ur +FL +aD +cn +sl +cn +cn +FH +GF +La +aD +cn +aD +Ij +Ij +ga +Ij +aD +XC +aD +FL +FL +ur +FL +"} +(23,1,1) = {" +FL +FL +FL +FL +FL +ur +FL +aD +cn +aD +jX +cn +cn +nQ +LJ +mZ +Mt +aD +aD +ho +ho +aD +aD +cn +aD +FL +FL +ur +FL +"} +(24,1,1) = {" +FL +FL +FL +FL +FL +ur +FL +aD +nS +aD +wi +Er +Gi +cn +Na +aD +jX +jc +jc +cn +qK +cn +sk +XD +aD +ur +ur +ur +ur +"} +(25,1,1) = {" +FL +FL +FL +FL +ur +ur +ur +aD +cn +aD +aD +aD +aD +sl +aD +aD +cn +aD +sl +aD +aD +aD +aD +aD +aD +FL +FL +ur +FL +"} +(26,1,1) = {" +FL +FL +FL +FL +FL +ur +FL +ho +cn +cn +pZ +nQ +cn +cn +cn +cn +cn +aD +OR +aD +FL +FL +FL +ur +FL +FL +FL +ur +FL +"} +(27,1,1) = {" +FL +FL +FL +FL +FL +ur +FL +ho +pT +sF +Mt +mZ +aD +aD +mZ +aD +aD +aD +Pp +aD +FL +FL +FL +ur +FL +FL +FL +ur +FL +"} +(28,1,1) = {" +FL +FL +FL +FL +ur +ur +ur +aD +aD +aD +cn +cn +aD +Hd +nQ +cn +cn +cn +cn +ho +FL +FL +FL +ur +FL +FL +FL +ur +FL +"} +(29,1,1) = {" +FL +FL +FL +FL +FL +ur +FL +FL +FL +aD +wC +EK +aD +Hp +cn +aD +aD +ho +aD +aD +FL +FL +FL +ur +FL +FL +FL +ur +FL +"} +(30,1,1) = {" +FL +FL +FL +FL +FL +FL +FL +FL +FL +aD +zd +nQ +aD +EN +cn +ho +FL +FL +FL +ur +FL +FL +FL +ur +FL +FL +FL +ur +FL +"} +(31,1,1) = {" +FL +FL +FL +FL +FL +FL +FL +FL +FL +aD +mZ +cn +cn +jc +cn +aD +FL +FL +FL +ur +FL +FL +FL +ur +FL +FL +FL +ur +FL +"} +(32,1,1) = {" +FL +FL +FL +FL +FL +FL +FL +FL +FL +aD +aD +ho +ho +ho +aD +aD +ur +ur +ur +ur +ur +ur +ur +ur +ur +ur +ur +ur +ur +"} +(33,1,1) = {" +FL +FL +FL +FL +FL +FL +FL +FL +FL +FL +FL +FL +FL +FL +FL +FL +FL +FL +FL +ur +FL +FL +FL +ur +FL +FL +FL +ur +FL +"} diff --git a/_maps/map_files/Deathmatch/OSHA_Violator.dmm b/_maps/map_files/Deathmatch/OSHA_Violator.dmm new file mode 100644 index 00000000000..fc8291d1814 --- /dev/null +++ b/_maps/map_files/Deathmatch/OSHA_Violator.dmm @@ -0,0 +1,2168 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"ac" = ( +/obj/structure/closet/crate/medical, +/turf/open/space/basic, +/area/template_noop) +"ae" = ( +/obj/effect/mob_spawn/corpse/human/cargo_tech, +/turf/open/space/basic, +/area/template_noop) +"ai" = ( +/turf/closed/indestructible/reinforced, +/area/deathmatch) +"aE" = ( +/turf/closed/indestructible/fakedoor, +/area/deathmatch) +"bl" = ( +/turf/closed/indestructible/fakeglass, +/area/deathmatch) +"bW" = ( +/obj/structure/closet/secure_closet/engineering_welding, +/turf/open/indestructible, +/area/deathmatch) +"cA" = ( +/turf/open/indestructible, +/area/deathmatch) +"cR" = ( +/obj/machinery/field/generator/starts_on, +/obj/effect/turf_decal/bot, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"do" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/indestructible, +/area/deathmatch) +"dt" = ( +/obj/machinery/light/no_nightlight/directional/north, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/field/generator/starts_on, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"dy" = ( +/obj/structure/sign/poster/official/random/directional/north, +/obj/effect/turf_decal/stripes/line, +/turf/open/indestructible, +/area/deathmatch) +"er" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/closed/indestructible/reinforced, +/area/deathmatch) +"fH" = ( +/obj/machinery/light/no_nightlight/directional/east, +/turf/open/indestructible, +/area/deathmatch) +"fN" = ( +/obj/structure/sign/directions/engineering, +/turf/closed/indestructible/reinforced, +/area/deathmatch) +"gd" = ( +/obj/machinery/power/energy_accumulator/grounding_rod/anchored, +/turf/open/indestructible, +/area/deathmatch) +"go" = ( +/obj/machinery/power/energy_accumulator/grounding_rod/anchored, +/obj/machinery/light/red/directional/east, +/turf/open/indestructible, +/area/deathmatch) +"gC" = ( +/obj/machinery/power/emitter/energycannon, +/obj/effect/turf_decal/bot, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"gG" = ( +/obj/structure/cable, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/indestructible, +/area/deathmatch) +"gN" = ( +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"gU" = ( +/obj/structure/cable, +/obj/machinery/conveyor/auto/inverted{ + dir = 5 + }, +/turf/open/indestructible, +/area/deathmatch) +"hj" = ( +/obj/machinery/conveyor/auto{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"hR" = ( +/obj/structure/cable, +/obj/machinery/conveyor/auto/inverted{ + dir = 6 + }, +/turf/open/indestructible, +/area/deathmatch) +"hU" = ( +/obj/machinery/light/no_nightlight/directional/east, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"ig" = ( +/obj/structure/cable, +/obj/effect/turf_decal/delivery, +/turf/open/indestructible, +/area/deathmatch) +"iE" = ( +/obj/structure/cable, +/obj/effect/turf_decal/loading_area, +/turf/open/indestructible, +/area/deathmatch) +"je" = ( +/turf/open/space/basic, +/area/template_noop) +"jn" = ( +/obj/effect/spawner/structure/window/reinforced/plasma, +/obj/structure/cable, +/turf/open/floor/plating, +/area/deathmatch) +"jC" = ( +/obj/structure/cable, +/obj/structure/sign/poster/official/random/directional/east, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible, +/area/deathmatch) +"kh" = ( +/obj/structure/closet/secure_closet/engineering_electrical, +/turf/open/indestructible, +/area/deathmatch) +"kB" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible, +/area/deathmatch) +"kP" = ( +/obj/machinery/conveyor/auto, +/turf/open/indestructible, +/area/deathmatch) +"lu" = ( +/obj/machinery/conveyor/auto{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"ly" = ( +/obj/machinery/conveyor/auto/inverted{ + dir = 6 + }, +/turf/open/indestructible, +/area/deathmatch) +"lU" = ( +/obj/machinery/conveyor/auto{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"mg" = ( +/obj/effect/turf_decal/delivery, +/turf/open/indestructible, +/area/deathmatch) +"mj" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/indestructible, +/area/deathmatch) +"mw" = ( +/obj/machinery/conveyor/auto{ + dir = 8 + }, +/obj/structure/closet, +/obj/item/soap/nanotrasen, +/turf/open/indestructible, +/area/deathmatch) +"mK" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/obj/machinery/conveyor/auto/inverted{ + dir = 6 + }, +/turf/open/indestructible, +/area/deathmatch) +"mO" = ( +/obj/effect/spawner/structure/window/reinforced/plasma, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/deathmatch) +"np" = ( +/obj/structure/reflector/double/mapping{ + dir = 6 + }, +/obj/effect/turf_decal/bot/left, +/turf/open/indestructible, +/area/deathmatch) +"nV" = ( +/obj/item/stack/cable_coil, +/turf/open/indestructible, +/area/deathmatch) +"or" = ( +/obj/machinery/conveyor/auto, +/obj/structure/closet/firecloset, +/turf/open/indestructible, +/area/deathmatch) +"oT" = ( +/obj/effect/spawner/structure/window/reinforced/plasma, +/turf/open/indestructible, +/area/deathmatch) +"pe" = ( +/obj/machinery/conveyor/auto{ + dir = 1 + }, +/obj/item/clothing/glasses/meson/engine/tray, +/turf/open/indestructible, +/area/deathmatch) +"pf" = ( +/obj/structure/reflector/single/mapping{ + dir = 10 + }, +/obj/effect/turf_decal/bot/left, +/turf/open/indestructible, +/area/deathmatch) +"pO" = ( +/obj/structure/table/reinforced, +/obj/item/assembly/prox_sensor, +/turf/open/indestructible, +/area/deathmatch) +"qn" = ( +/obj/structure/reflector/single/mapping{ + dir = 6 + }, +/obj/effect/turf_decal/bot/left, +/turf/open/indestructible, +/area/deathmatch) +"qo" = ( +/obj/structure/cable, +/obj/effect/turf_decal/caution/stand_clear, +/turf/open/indestructible, +/area/deathmatch) +"rz" = ( +/obj/machinery/power/emitter/energycannon{ + dir = 8 + }, +/obj/effect/turf_decal/bot, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"sa" = ( +/turf/cordon, +/area/template_noop) +"sb" = ( +/obj/structure/frame/machine/secured, +/turf/open/indestructible, +/area/deathmatch) +"sp" = ( +/obj/structure/cable, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"sx" = ( +/obj/item/clothing/suit/hazardvest, +/turf/open/indestructible, +/area/deathmatch) +"sP" = ( +/obj/item/stack/rods/fifty, +/obj/structure/rack, +/turf/open/indestructible, +/area/deathmatch) +"sX" = ( +/obj/machinery/conveyor/auto, +/obj/item/stack/sheet/cardboard, +/turf/open/indestructible, +/area/deathmatch) +"sZ" = ( +/obj/structure/cable, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible, +/area/deathmatch) +"ta" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/head/utility/welding, +/turf/open/indestructible, +/area/deathmatch) +"tc" = ( +/obj/machinery/light/red/directional/west, +/turf/open/indestructible, +/area/deathmatch) +"th" = ( +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"tT" = ( +/obj/structure/disposalpipe/trunk{ + dir = 2 + }, +/obj/structure/disposaloutlet{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"tU" = ( +/obj/item/storage/toolbox/drone{ + pixel_y = 5 + }, +/obj/item/storage/toolbox/electrical, +/obj/structure/rack, +/obj/item/crowbar, +/turf/open/indestructible, +/area/deathmatch) +"ub" = ( +/obj/machinery/conveyor/auto{ + dir = 1 + }, +/obj/machinery/light/no_nightlight/directional/west, +/turf/open/indestructible, +/area/deathmatch) +"uv" = ( +/obj/structure/table/reinforced, +/obj/item/weldingtool/largetank, +/turf/open/indestructible, +/area/deathmatch) +"uY" = ( +/obj/structure/closet/crate/engineering, +/turf/open/indestructible, +/area/deathmatch) +"vD" = ( +/obj/machinery/power/energy_accumulator/tesla_coil/anchored, +/turf/open/indestructible, +/area/deathmatch) +"vG" = ( +/obj/item/tank/internals/plasma/full, +/obj/structure/rack, +/turf/open/indestructible, +/area/deathmatch) +"vK" = ( +/obj/structure/cable, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"vT" = ( +/obj/effect/turf_decal/stripes/corner, +/turf/open/indestructible, +/area/deathmatch) +"wb" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/indestructible, +/area/deathmatch) +"wy" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"wI" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"wK" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"wL" = ( +/obj/machinery/conveyor/auto, +/obj/item/shard, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"xa" = ( +/obj/machinery/conveyor/auto, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"xg" = ( +/obj/effect/spawner/structure/window/reinforced/plasma, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/indestructible/plating, +/area/deathmatch) +"xj" = ( +/obj/machinery/conveyor/auto{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"xs" = ( +/obj/machinery/conveyor/auto{ + dir = 1 + }, +/obj/item/crowbar/red, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"xF" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"xN" = ( +/obj/structure/rack, +/obj/item/wrench, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"xW" = ( +/obj/structure/reflector/single/mapping{ + dir = 9 + }, +/obj/effect/turf_decal/bot/left, +/turf/open/indestructible, +/area/deathmatch) +"xY" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/indestructible, +/area/deathmatch) +"yj" = ( +/obj/machinery/conveyor/auto{ + dir = 1 + }, +/obj/structure/closet, +/obj/item/toy/crayon/spraycan, +/turf/open/indestructible, +/area/deathmatch) +"yo" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"ys" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/indestructible/reinforced, +/area/deathmatch) +"yB" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"yW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"yX" = ( +/obj/structure/reflector/single/mapping{ + dir = 5 + }, +/obj/effect/turf_decal/bot/left, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"yY" = ( +/obj/structure/reflector/single/mapping{ + dir = 9 + }, +/obj/effect/turf_decal/bot/left, +/obj/structure/disposalpipe/segment{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"zb" = ( +/obj/structure/table/wood/fancy/black, +/obj/item/hemostat/supermatter, +/turf/open/indestructible, +/area/deathmatch) +"zj" = ( +/obj/machinery/disposal/delivery_chute, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"zl" = ( +/obj/machinery/button/door/directional/north{ + id = "deathmatch_shutter_1"; + name = "Water Vapour Shutter" + }, +/obj/structure/table/reinforced, +/obj/item/clothing/glasses/meson/engine/tray, +/turf/open/indestructible, +/area/deathmatch) +"zw" = ( +/obj/item/kirbyplants, +/obj/machinery/light/no_nightlight/directional/north, +/turf/open/indestructible, +/area/deathmatch) +"zL" = ( +/obj/structure/rack, +/obj/item/extinguisher/mini, +/turf/open/indestructible, +/area/deathmatch) +"Aa" = ( +/obj/effect/turf_decal/box, +/obj/effect/turf_decal/caution/stand_clear, +/turf/open/indestructible, +/area/deathmatch) +"Am" = ( +/obj/machinery/door/airlock/engineering/glass{ + name = "Supermatter Room" + }, +/turf/open/indestructible, +/area/deathmatch) +"Ax" = ( +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/indestructible, +/area/deathmatch) +"AF" = ( +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"AZ" = ( +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/indestructible, +/area/deathmatch) +"Bf" = ( +/obj/effect/spawner/structure/window/reinforced/plasma, +/turf/open/floor/plating, +/area/deathmatch) +"Bv" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/field/generator/starts_on, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"CC" = ( +/obj/machinery/vending/engineering, +/turf/open/indestructible, +/area/deathmatch) +"CH" = ( +/obj/structure/reflector/single/mapping{ + dir = 5 + }, +/obj/effect/turf_decal/bot/left, +/turf/open/indestructible, +/area/deathmatch) +"CI" = ( +/obj/structure/disposalpipe/segment{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"CR" = ( +/obj/machinery/conveyor/auto, +/obj/structure/closet/crate, +/obj/item/toy/spinningtoy, +/turf/open/indestructible, +/area/deathmatch) +"DY" = ( +/obj/structure/cable, +/obj/machinery/power/rtg/advanced{ + power_gen = 50000 + }, +/turf/open/indestructible, +/area/deathmatch) +"Ea" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"Eb" = ( +/obj/structure/table/wood/fancy/black, +/obj/item/nuke_core_container/supermatter, +/obj/machinery/light/no_nightlight/directional/west, +/turf/open/indestructible, +/area/deathmatch) +"Ec" = ( +/obj/machinery/door/poddoor/shutters/indestructible{ + id = "deathmatch_shutter_2" + }, +/obj/effect/turf_decal/caution/stand_clear, +/obj/effect/turf_decal/bot, +/turf/open/indestructible, +/area/deathmatch) +"Em" = ( +/obj/structure/chair/comfy/black, +/turf/open/indestructible, +/area/deathmatch) +"EY" = ( +/obj/machinery/door/airlock/engineering/glass{ + name = "Control Room" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/turf/open/indestructible, +/area/deathmatch) +"Fd" = ( +/obj/structure/reflector/box/mapping{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/turf/open/indestructible, +/area/deathmatch) +"Fv" = ( +/obj/machinery/power/supermatter_crystal/hugbox, +/turf/open/indestructible, +/area/deathmatch) +"FM" = ( +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"FV" = ( +/obj/structure/cable, +/obj/machinery/light/no_nightlight/directional/east, +/turf/open/indestructible, +/area/deathmatch) +"Gq" = ( +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/light/no_nightlight/directional/west, +/turf/open/indestructible, +/area/deathmatch) +"Gx" = ( +/obj/machinery/conveyor/auto, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"Gz" = ( +/obj/machinery/conveyor/auto, +/obj/item/multitool, +/turf/open/indestructible, +/area/deathmatch) +"GB" = ( +/obj/machinery/conveyor/auto{ + dir = 1 + }, +/obj/item/tank/internals/oxygen, +/turf/open/indestructible, +/area/deathmatch) +"GH" = ( +/obj/structure/reflector/single/mapping{ + dir = 6 + }, +/obj/effect/turf_decal/bot/right, +/turf/open/indestructible, +/area/deathmatch) +"GP" = ( +/obj/structure/reflector/single/mapping{ + dir = 10 + }, +/obj/effect/turf_decal/bot/right, +/turf/open/indestructible, +/area/deathmatch) +"GT" = ( +/obj/structure/cable, +/obj/item/clothing/suit/hazardvest, +/turf/open/indestructible, +/area/deathmatch) +"GV" = ( +/obj/structure/cable, +/turf/closed/indestructible/reinforced, +/area/deathmatch) +"Hn" = ( +/obj/structure/table/wood/fancy/black, +/obj/item/scalpel/supermatter, +/turf/open/indestructible, +/area/deathmatch) +"HL" = ( +/obj/item/clothing/gloves/color/yellow{ + desc = "This is it. The only reason of your existence. Grab it, put them on and enjoy your newfound godhood!" + }, +/obj/structure/rack, +/turf/open/indestructible, +/area/deathmatch) +"HP" = ( +/obj/machinery/computer/operating{ + desc = "You start to get the feeling this is the wrong operating console...."; + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"HY" = ( +/obj/structure/reflector/single/mapping{ + dir = 9 + }, +/obj/effect/turf_decal/bot/right, +/turf/open/indestructible, +/area/deathmatch) +"Js" = ( +/obj/structure/table/reinforced, +/obj/item/reagent_containers/pill/patch/aiuri, +/turf/open/indestructible, +/area/deathmatch) +"JF" = ( +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/indestructible, +/area/deathmatch) +"Kd" = ( +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line, +/turf/open/indestructible, +/area/deathmatch) +"KY" = ( +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/indestructible, +/area/deathmatch) +"LK" = ( +/obj/structure/reflector/single/mapping{ + dir = 10 + }, +/obj/effect/turf_decal/bot/right, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/indestructible, +/area/deathmatch) +"Mm" = ( +/obj/machinery/conveyor/auto{ + dir = 8 + }, +/obj/item/clothing/suit/armor/vest, +/turf/open/indestructible, +/area/deathmatch) +"Mp" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/closed/indestructible/reinforced, +/area/deathmatch) +"Mu" = ( +/obj/structure/cable, +/obj/structure/sign/poster/official/random/directional/west, +/turf/open/indestructible, +/area/deathmatch) +"My" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"MC" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"MP" = ( +/obj/structure/cable, +/obj/machinery/power/floodlight, +/turf/open/indestructible, +/area/deathmatch) +"MV" = ( +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/structure/disposaloutlet, +/turf/open/indestructible, +/area/deathmatch) +"NJ" = ( +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/disposal/delivery_chute, +/turf/open/indestructible, +/area/deathmatch) +"NY" = ( +/obj/machinery/power/emitter/energycannon{ + dir = 1 + }, +/obj/effect/turf_decal/bot, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"OL" = ( +/obj/machinery/conveyor/auto/inverted{ + dir = 5 + }, +/turf/open/indestructible, +/area/deathmatch) +"Pg" = ( +/obj/machinery/field/generator/starts_on, +/obj/machinery/light/no_nightlight/directional/north, +/turf/open/indestructible, +/area/deathmatch) +"Pu" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"Px" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"QA" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"QG" = ( +/obj/structure/rack, +/obj/item/reagent_containers/cup/bucket, +/obj/item/pen, +/turf/open/indestructible, +/area/deathmatch) +"QQ" = ( +/obj/machinery/door/poddoor/shutters/indestructible{ + id = "deathmatch_shutter_1" + }, +/obj/effect/turf_decal/caution/stand_clear, +/obj/effect/turf_decal/bot, +/turf/open/indestructible, +/area/deathmatch) +"Rj" = ( +/obj/machinery/portable_atmospherics/canister/water_vapor{ + desc = "You monster." + }, +/obj/machinery/button/door/directional/east{ + id = "deathmatch_shutter_2"; + name = "Supermatter Sampling Shutter" + }, +/turf/open/indestructible, +/area/deathmatch) +"Rk" = ( +/obj/effect/mob_spawn/corpse/human/assistant, +/turf/open/indestructible, +/area/deathmatch) +"Rv" = ( +/obj/structure/table/reinforced, +/obj/item/weldingtool/mini, +/turf/open/indestructible, +/area/deathmatch) +"RF" = ( +/obj/machinery/conveyor/auto{ + dir = 1 + }, +/obj/structure/closet/crate, +/obj/item/stack/medical/suture{ + amount = 6 + }, +/turf/open/indestructible, +/area/deathmatch) +"Sc" = ( +/obj/structure/reflector/double/mapping{ + dir = 5 + }, +/obj/effect/turf_decal/bot/right, +/turf/open/indestructible, +/area/deathmatch) +"Sh" = ( +/obj/effect/spawner/structure/window/reinforced/plasma, +/turf/open/indestructible/plating, +/area/deathmatch) +"Si" = ( +/obj/item/clothing/head/utility/welding, +/turf/open/indestructible, +/area/deathmatch) +"SR" = ( +/obj/machinery/conveyor/auto, +/obj/item/tank/internals/oxygen, +/turf/open/indestructible, +/area/deathmatch) +"SW" = ( +/obj/machinery/conveyor/auto{ + dir = 1 + }, +/obj/structure/closet/cardboard, +/obj/item/dualsaber/toy, +/turf/open/indestructible, +/area/deathmatch) +"Tu" = ( +/obj/structure/table/reinforced, +/obj/item/bodypart/arm/left/robot, +/turf/open/indestructible, +/area/deathmatch) +"TO" = ( +/obj/structure/reflector/single/mapping{ + dir = 5 + }, +/obj/effect/turf_decal/bot/right, +/turf/open/indestructible, +/area/deathmatch) +"TY" = ( +/obj/structure/cable, +/obj/effect/turf_decal/loading_area{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"Ue" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/mask/gas/welding/up, +/turf/open/indestructible, +/area/deathmatch) +"Uu" = ( +/obj/machinery/conveyor/auto{ + dir = 1 + }, +/obj/structure/closet, +/obj/item/pizzabox/meat{ + desc = "In honor of those who fell during the infamous Pizza Riot." + }, +/turf/open/indestructible, +/area/deathmatch) +"UI" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/field/generator/starts_on, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"Vr" = ( +/obj/machinery/conveyor/auto/inverted{ + dir = 9 + }, +/turf/open/indestructible, +/area/deathmatch) +"Vu" = ( +/obj/machinery/conveyor/auto{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"VC" = ( +/obj/machinery/conveyor/auto/inverted{ + dir = 10 + }, +/turf/open/indestructible, +/area/deathmatch) +"VG" = ( +/obj/item/wrench, +/turf/open/indestructible, +/area/deathmatch) +"WI" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/obj/machinery/conveyor/auto/inverted{ + dir = 9 + }, +/turf/open/indestructible, +/area/deathmatch) +"Xp" = ( +/obj/structure/cable, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/item/clothing/suit/armor/vest, +/turf/open/indestructible, +/area/deathmatch) +"XU" = ( +/obj/structure/cable, +/obj/machinery/conveyor/auto/inverted{ + dir = 9 + }, +/turf/open/indestructible, +/area/deathmatch) +"Yn" = ( +/obj/machinery/conveyor/auto{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"Yz" = ( +/obj/machinery/conveyor/auto{ + dir = 4 + }, +/obj/structure/cable, +/obj/item/clothing/glasses/meson/engine/tray, +/turf/open/indestructible, +/area/deathmatch) +"YA" = ( +/obj/structure/cable, +/turf/closed/indestructible/fakeglass, +/area/deathmatch) +"YJ" = ( +/obj/structure/cable, +/obj/machinery/conveyor/auto/inverted{ + dir = 10 + }, +/turf/open/indestructible, +/area/deathmatch) +"YU" = ( +/obj/structure/cable, +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/indestructible, +/area/deathmatch) +"YY" = ( +/obj/machinery/light/no_nightlight/directional/south, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/field/generator/starts_on, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"Zi" = ( +/obj/structure/sign/poster/official/random/directional/south, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"Zr" = ( +/obj/item/storage/backpack/duffelbag/syndie/med/medicalbundle, +/turf/open/space/basic, +/area/template_noop) +"Zz" = ( +/obj/machinery/power/singularity_beacon/syndicate, +/turf/open/space/basic, +/area/template_noop) +"ZD" = ( +/obj/item/storage/toolbox/syndicate, +/turf/open/space/basic, +/area/template_noop) + +(1,1,1) = {" +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +"} +(2,1,1) = {" +sa +je +je +je +je +je +je +je +je +je +ai +ai +ai +ai +ai +je +je +je +je +je +je +je +je +je +sa +"} +(3,1,1) = {" +sa +je +ai +ai +fN +ai +ai +ai +ai +ai +ai +zb +Eb +Hn +ai +ai +ai +ai +je +je +je +je +je +je +sa +"} +(4,1,1) = {" +sa +je +ai +bW +cA +cA +cA +cA +tc +cA +aE +cA +cA +cA +aE +cA +cA +aE +je +je +je +je +je +je +sa +"} +(5,1,1) = {" +sa +je +ai +cA +cA +sb +cA +sb +cA +cA +er +zj +cA +cA +ai +cA +cA +aE +je +je +je +je +je +je +sa +"} +(6,1,1) = {" +sa +je +aE +cA +sb +sb +sb +sb +cA +uY +ys +ai +Ec +ai +ai +cA +cA +ai +je +je +je +je +je +je +sa +"} +(7,1,1) = {" +sa +je +aE +cA +cA +cA +cA +sb +cA +vD +ys +zl +cA +HL +ai +cA +Rk +ai +ai +ai +ai +ai +ai +je +sa +"} +(8,1,1) = {" +sa +je +ai +cA +gd +cA +cA +cA +cA +vD +ys +zw +Em +HP +ai +Pg +cA +cA +cA +cA +cA +cA +aE +je +sa +"} +(9,1,1) = {" +sa +je +ai +cA +go +kh +kh +bW +cA +vG +ys +zL +cA +Js +ai +vG +cA +bW +kh +kh +cA +cA +aE +je +sa +"} +(10,1,1) = {" +sa +je +ai +aE +ai +bl +bl +bl +aE +bl +ys +bl +EY +bl +ai +bl +aE +bl +bl +bl +ai +aE +ai +je +sa +"} +(11,1,1) = {" +sa +je +ai +cR +ai +gN +gN +sp +th +vK +wK +gN +gN +gN +Mu +sp +th +vK +gN +gN +ai +cR +ai +je +sa +"} +(12,1,1) = {" +sa +je +ai +YA +ai +gN +cA +np +cA +vT +yB +Aa +Fd +Aa +My +Pu +cA +Sc +cA +gN +ai +YA +ai +je +sa +"} +(13,1,1) = {" +sa +je +ai +Ea +gG +gN +cA +cA +tT +wb +mO +Am +oT +Am +Bf +Px +cA +cA +nV +gN +Xp +yo +ai +je +sa +"} +(14,1,1) = {" +sa +je +ai +do +gN +kB +cA +sx +cA +wy +mO +Ax +th +JF +Bf +Px +cA +cA +cA +kB +gN +Px +ai +je +sa +"} +(15,1,1) = {" +sa +je +ai +dt +gN +cA +np +cA +cA +wy +mO +AF +Fv +Kd +Bf +Px +cA +cA +Sc +cA +gN +YY +ai +je +sa +"} +(16,1,1) = {" +sa +je +ai +do +gN +cA +cA +cA +cA +wy +mO +AZ +FM +KY +Bf +Px +cA +Si +cA +cA +gN +Px +ai +je +sa +"} +(17,1,1) = {" +sa +je +ai +do +gN +cA +nV +cA +cA +wy +mO +Bf +jn +Bf +Bf +Px +cA +cA +cA +cA +gN +Px +ai +je +sa +"} +(18,1,1) = {" +sa +je +ai +dy +gN +kB +cA +sP +tU +wI +yW +MC +Gq +MC +MC +QA +tU +sP +cA +cA +gN +Px +ai +je +sa +"} +(19,1,1) = {" +sa +je +bl +do +gN +gN +gN +gN +gN +wK +wK +gN +sZ +gN +gN +gN +gN +gN +TY +TY +gN +Px +bl +je +sa +"} +(20,1,1) = {" +sa +je +bl +do +gU +kP +or +kP +kP +wL +xa +kP +Gx +kP +kP +kP +kP +SR +kP +kP +XU +Px +bl +Zr +sa +"} +(21,1,1) = {" +sa +je +bl +do +hj +OL +kP +sX +kP +xa +xa +kP +Gz +kP +kP +kP +kP +kP +kP +Vr +Yn +Px +bl +Zz +sa +"} +(22,1,1) = {" +sa +je +bl +Bv +hj +lu +Sh +Sh +Sh +xg +xg +Sh +Sh +Sh +Sh +Sh +Sh +Sh +Sh +Vu +Yn +UI +bl +je +sa +"} +(23,1,1) = {" +sa +je +bl +do +hj +ly +pe +lU +ub +xj +xj +lU +GB +lU +lU +lU +ub +SW +lU +VC +Yz +Px +bl +je +sa +"} +(24,1,1) = {" +sa +je +bl +do +hR +lU +lU +lU +lU +xs +xj +lU +lU +lU +lU +lU +lU +lU +lU +lU +YJ +Px +bl +ZD +sa +"} +(25,1,1) = {" +sa +ac +bl +do +ig +mg +pf +cA +cA +xF +yX +CC +kB +GH +cA +cA +cA +cA +HY +VG +gN +Px +bl +je +sa +"} +(26,1,1) = {" +sa +ae +ai +do +gN +cA +cA +pf +cA +xF +xF +CH +GH +cA +cA +cA +cA +HY +cA +cA +gN +Px +ai +je +sa +"} +(27,1,1) = {" +sa +je +ai +do +gN +gN +gN +sZ +gN +wK +wK +gN +gN +gN +gN +gN +gN +sZ +gN +gN +gN +Zi +ai +je +sa +"} +(28,1,1) = {" +sa +je +ai +do +gN +mj +pO +ta +uv +xN +xF +cA +cA +cA +MP +QG +Rv +Tu +Ue +mj +gN +Px +ai +je +sa +"} +(29,1,1) = {" +sa +je +ai +dt +gN +cA +cA +cA +cA +xF +xY +CI +CI +CI +MV +cA +nV +cA +cA +cA +gN +YY +ai +je +sa +"} +(30,1,1) = {" +sa +je +ai +do +gN +OL +kP +kP +kP +xa +kP +CR +kP +kP +kP +or +kP +kP +kP +WI +gN +Px +ai +je +sa +"} +(31,1,1) = {" +sa +je +ai +do +iE +mw +qn +cA +cA +xY +yY +CI +CI +LK +cA +cA +cA +cA +TO +Vu +ig +Px +ai +je +sa +"} +(32,1,1) = {" +sa +je +ai +do +iE +Mm +cA +qn +cA +cA +cA +xW +GP +xF +cA +cA +cA +TO +cA +Vu +ig +Px +ai +je +sa +"} +(33,1,1) = {" +sa +je +ai +do +gN +mK +lU +lU +lU +yj +lU +lU +lU +xj +lU +lU +RF +lU +Uu +VC +gN +Px +ai +je +sa +"} +(34,1,1) = {" +sa +je +ai +do +YU +gN +qo +qo +FV +gN +gN +jC +GT +wK +gN +gN +FV +qo +qo +gN +YU +Px +ai +je +sa +"} +(35,1,1) = {" +sa +je +ai +bl +ai +ai +Bf +Bf +ai +ai +ai +ai +GV +ys +ai +QQ +ai +Bf +Bf +ai +ai +bl +ai +je +sa +"} +(36,1,1) = {" +sa +je +ai +cR +NY +ai +rz +rz +ai +gN +DY +DY +gN +Mp +NJ +Rj +ai +rz +rz +ai +gC +cR +ai +je +sa +"} +(37,1,1) = {" +sa +je +aE +cA +gN +ai +ai +GV +ai +gN +cA +cA +gN +ai +ai +ai +ai +GV +ai +ai +gN +cA +aE +je +sa +"} +(38,1,1) = {" +sa +je +ai +fH +gN +gN +gN +hU +gN +gN +cA +cA +hU +gN +gN +gN +gN +hU +gN +gN +gN +fH +ai +je +sa +"} +(39,1,1) = {" +sa +je +ai +ai +ai +ai +ai +ai +ai +ai +ai +ai +ai +ai +ai +ai +ai +ai +ai +ai +ai +ai +ai +je +sa +"} +(40,1,1) = {" +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +sa +"} diff --git a/_maps/map_files/Deathmatch/SecuRing.dmm b/_maps/map_files/Deathmatch/SecuRing.dmm new file mode 100644 index 00000000000..615103813fa --- /dev/null +++ b/_maps/map_files/Deathmatch/SecuRing.dmm @@ -0,0 +1,567 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/template_noop, +/area/template_noop) +"e" = ( +/obj/structure/barricade/security/ctf, +/turf/open/floor/mineral/plastitanium/red, +/area/deathmatch) +"l" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/deathmatch) +"n" = ( +/turf/open/floor/pod/light, +/area/deathmatch) +"o" = ( +/obj/machinery/recharger, +/turf/open/floor/pod/light, +/area/deathmatch) +"t" = ( +/obj/structure/barricade/security/ctf, +/turf/open/floor/pod/light, +/area/deathmatch) +"u" = ( +/turf/open/floor/pod, +/area/deathmatch) +"G" = ( +/obj/structure/barricade/security/ctf, +/turf/open/floor/pod/dark, +/area/deathmatch) +"H" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/pod, +/area/deathmatch) +"I" = ( +/turf/closed/indestructible/reinforced, +/area/deathmatch) +"M" = ( +/obj/machinery/light, +/turf/open/floor/pod, +/area/deathmatch) +"N" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/pod, +/area/deathmatch) +"O" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/deathmatch) +"R" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/pod, +/area/deathmatch) +"S" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/deathmatch) +"T" = ( +/obj/machinery/light, +/turf/open/floor/mineral/plastitanium/red, +/area/deathmatch) +"W" = ( +/turf/open/floor/pod/dark, +/area/deathmatch) +"X" = ( +/turf/open/floor/mineral/plastitanium/red, +/area/deathmatch) +"Y" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/floor/mineral/plastitanium/red, +/area/deathmatch) + +(1,1,1) = {" +a +a +a +a +a +a +a +I +I +I +I +I +I +I +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +a +a +a +a +I +I +I +X +X +O +X +X +I +I +I +a +a +a +a +a +"} +(3,1,1) = {" +a +a +a +a +I +I +X +X +X +X +Y +X +X +X +X +I +I +a +a +a +a +"} +(4,1,1) = {" +a +a +a +I +I +X +X +X +X +n +o +n +X +X +X +X +I +I +a +a +a +"} +(5,1,1) = {" +a +a +I +I +e +X +X +n +n +t +t +t +n +n +X +X +e +I +I +a +a +"} +(6,1,1) = {" +a +I +I +X +X +e +n +n +t +n +W +n +t +n +n +e +X +X +I +I +a +"} +(7,1,1) = {" +a +I +X +X +X +n +o +n +W +W +W +W +W +n +o +n +X +X +X +I +a +"} +(8,1,1) = {" +I +I +X +X +n +n +n +W +W +G +G +G +W +W +n +n +n +X +X +I +I +"} +(9,1,1) = {" +I +X +X +X +n +t +W +W +W +u +u +u +W +W +W +t +n +X +X +X +I +"} +(10,1,1) = {" +I +X +X +n +t +n +W +G +u +u +N +u +u +G +W +n +t +n +X +X +I +"} +(11,1,1) = {" +I +l +Y +o +t +W +W +G +u +M +I +R +u +G +W +W +t +o +Y +T +I +"} +(12,1,1) = {" +I +X +X +n +t +n +W +G +u +u +H +u +u +G +W +n +t +n +X +X +I +"} +(13,1,1) = {" +I +X +X +X +n +t +W +W +W +u +u +u +W +W +W +t +n +X +X +X +I +"} +(14,1,1) = {" +I +I +X +X +n +n +n +W +W +G +G +G +W +W +n +n +n +X +X +I +I +"} +(15,1,1) = {" +a +I +X +X +X +n +o +n +W +W +W +W +W +n +o +n +X +X +X +I +a +"} +(16,1,1) = {" +a +I +I +X +X +e +n +n +t +n +W +n +t +n +n +e +X +X +I +I +a +"} +(17,1,1) = {" +a +a +I +I +e +X +X +n +n +t +t +t +n +n +X +X +e +I +I +a +a +"} +(18,1,1) = {" +a +a +a +I +I +X +X +X +X +n +o +n +X +X +X +X +I +I +a +a +a +"} +(19,1,1) = {" +a +a +a +a +I +I +X +X +X +X +Y +X +X +X +X +I +I +a +a +a +a +"} +(20,1,1) = {" +a +a +a +a +a +I +I +I +X +X +S +X +X +I +I +I +a +a +a +a +a +"} +(21,1,1) = {" +a +a +a +a +a +a +a +I +I +I +I +I +I +I +a +a +a +a +a +a +a +"} diff --git a/_maps/map_files/Deathmatch/Sniper_elite.dmm b/_maps/map_files/Deathmatch/Sniper_elite.dmm new file mode 100644 index 00000000000..3882bd4a814 --- /dev/null +++ b/_maps/map_files/Deathmatch/Sniper_elite.dmm @@ -0,0 +1,802 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/closed/indestructible/reinforced, +/area/deathmatch) +"b" = ( +/obj/item/ammo_casing/spent, +/obj/item/ammo_casing/spent, +/turf/open/floor/carpet/neon, +/area/deathmatch) +"c" = ( +/turf/open/floor/fake_snow, +/area/deathmatch) +"e" = ( +/obj/structure/statue/snow/snowman, +/obj/item/toy/balloon/syndicate{ + pixel_y = 11; + pixel_x = 5 + }, +/turf/open/floor/fake_snow, +/area/deathmatch) +"f" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/ammo_casing/spent, +/obj/item/ammo_casing/spent, +/turf/open/floor/carpet/neon, +/area/deathmatch) +"g" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/carpet/neon, +/area/deathmatch) +"i" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/turf/open/floor/carpet/neon, +/area/deathmatch) +"k" = ( +/obj/structure/rack, +/obj/item/ammo_box/magazine/sniper_rounds/penetrator, +/obj/item/ammo_casing/spent, +/turf/open/floor/carpet/neon, +/area/deathmatch) +"n" = ( +/obj/item/ammo_casing/spent, +/turf/open/floor/carpet/neon, +/area/deathmatch) +"o" = ( +/obj/item/stack/medical/suture, +/turf/open/floor/fake_snow, +/area/deathmatch) +"p" = ( +/obj/structure/barricade/wooden, +/turf/open/floor/carpet/neon, +/area/deathmatch) +"q" = ( +/obj/item/crowbar, +/turf/open/floor/carpet/neon, +/area/deathmatch) +"r" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/barricade/wooden, +/turf/open/floor/carpet/neon, +/area/deathmatch) +"t" = ( +/obj/structure/barricade/wooden, +/obj/item/ammo_casing/spent, +/obj/item/ammo_casing/spent, +/turf/open/floor/carpet/neon, +/area/deathmatch) +"u" = ( +/obj/item/ammo_casing/spent, +/obj/item/ammo_casing/spent, +/obj/item/ammo_casing/spent, +/turf/open/floor/carpet/neon, +/area/deathmatch) +"v" = ( +/obj/structure/rack, +/turf/open/floor/carpet/neon, +/area/deathmatch) +"x" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/obj/item/ammo_casing/spent, +/obj/item/ammo_casing/spent, +/turf/open/floor/carpet/neon, +/area/deathmatch) +"y" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/item/ammo_casing/spent, +/obj/item/ammo_casing/spent, +/turf/open/floor/carpet/neon, +/area/deathmatch) +"z" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/carpet/neon, +/area/deathmatch) +"A" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/item/ammo_casing/spent, +/turf/open/floor/carpet/neon, +/area/deathmatch) +"B" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/fakeice/slippery, +/area/deathmatch) +"C" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/chasm, +/area/deathmatch) +"D" = ( +/turf/open/floor/fakeice/slippery, +/area/deathmatch) +"F" = ( +/obj/structure/closet/crate/secure/science, +/obj/item/toy/plush/lizard_plushie/green, +/turf/open/floor/carpet/neon, +/area/deathmatch) +"H" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/carpet/neon, +/area/deathmatch) +"J" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/item/ammo_casing/spent, +/turf/open/floor/carpet/neon, +/area/deathmatch) +"K" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/fake_snow, +/area/deathmatch) +"L" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/fakeice/slippery, +/area/deathmatch) +"M" = ( +/obj/machinery/door/airlock/freezer, +/obj/structure/barricade/wooden/crude, +/turf/open/floor/iron/freezer, +/area/deathmatch) +"N" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/carpet/neon, +/area/deathmatch) +"O" = ( +/obj/machinery/door/airlock/freezer, +/turf/open/floor/iron/freezer, +/area/deathmatch) +"P" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/ammo_casing/spent, +/turf/open/floor/carpet/neon, +/area/deathmatch) +"Q" = ( +/obj/structure/rack, +/obj/item/reagent_containers/hypospray/medipen/stimulants, +/obj/item/ammo_casing/spent, +/turf/open/floor/carpet/neon, +/area/deathmatch) +"R" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/obj/item/ammo_casing/spent, +/turf/open/floor/carpet/neon, +/area/deathmatch) +"U" = ( +/obj/structure/barricade/wooden, +/obj/item/ammo_casing/spent, +/turf/open/floor/carpet/neon, +/area/deathmatch) +"V" = ( +/obj/structure/rack, +/obj/item/ammo_box/magazine/sniper_rounds/penetrator, +/turf/open/floor/carpet/neon, +/area/deathmatch) +"W" = ( +/obj/structure/toilet{ + dir = 8 + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/iron/freezer, +/area/deathmatch) +"Y" = ( +/turf/open/floor/carpet/neon, +/area/deathmatch) +"Z" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/obj/item/ammo_casing/spent, +/obj/item/ammo_casing/spent, +/obj/item/ammo_casing/spent, +/turf/open/floor/carpet/neon, +/area/deathmatch) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +F +r +Y +p +Y +Y +Y +z +H +Y +Y +p +Y +H +Y +z +Y +Y +i +Y +H +Y +Y +Y +Y +z +Y +Y +Y +a +"} +(3,1,1) = {" +a +p +H +Y +i +Y +H +Y +i +Y +Y +Y +p +Y +Y +Y +i +Y +Y +p +Y +Y +i +Y +Y +H +Y +Y +J +n +a +"} +(4,1,1) = {" +a +Y +Y +H +p +Y +Y +Y +i +Y +Y +Y +i +Y +H +Y +i +H +Y +p +Y +Y +i +H +Y +Y +i +Y +P +P +a +"} +(5,1,1) = {" +a +i +i +Y +a +Y +H +Y +p +Y +H +Y +i +Y +Y +Y +p +Y +Y +a +Y +Y +a +n +J +n +p +n +Y +H +a +"} +(6,1,1) = {" +a +Y +Y +Y +a +n +R +J +a +n +n +n +N +n +n +n +p +b +b +y +b +x +a +b +b +x +p +Y +H +Y +a +"} +(7,1,1) = {" +a +a +p +i +a +P +P +U +a +a +P +P +p +p +P +P +a +a +P +P +P +U +a +f +f +t +a +a +p +a +a +"} +(8,1,1) = {" +a +n +J +n +U +c +c +c +c +e +c +c +c +c +c +c +L +D +D +c +c +c +c +c +D +D +P +J +Y +H +a +"} +(9,1,1) = {" +a +A +n +n +P +c +c +D +D +c +o +D +D +D +c +D +D +D +D +D +D +c +D +D +D +D +P +n +Y +v +a +"} +(10,1,1) = {" +a +k +n +n +P +D +D +D +D +D +D +D +D +D +D +D +D +c +D +D +D +D +D +D +D +c +a +A +H +V +a +"} +(11,1,1) = {" +a +Q +n +J +U +D +D +c +K +D +D +c +c +D +D +c +c +c +c +c +D +D +B +c +c +c +p +Y +Y +Y +a +"} +(12,1,1) = {" +a +p +p +a +U +U +P +P +a +U +P +P +p +P +P +P +a +U +P +P +P +P +a +p +i +i +a +a +p +a +a +"} +(13,1,1) = {" +a +Y +Y +Y +n +n +R +n +p +n +n +n +R +n +n +n +p +x +n +n +n +n +a +Z +u +u +p +Y +Y +H +a +"} +(14,1,1) = {" +a +Y +Y +H +Y +Y +Y +Y +a +Y +Y +Y +Y +Y +Y +H +a +Y +Y +H +Y +Y +i +Y +Y +H +p +p +i +Y +a +"} +(15,1,1) = {" +a +q +Y +Y +a +Y +Y +Y +i +Y +Y +H +a +Y +Y +Y +Y +Y +Y +Y +Y +Y +p +Y +Y +Y +i +Y +H +Y +a +"} +(16,1,1) = {" +a +M +a +O +a +Y +Y +H +i +Y +Y +Y +i +Y +Y +Y +g +Y +Y +i +Y +Y +H +Y +Y +Y +g +Y +i +i +a +"} +(17,1,1) = {" +a +C +a +W +p +Y +Y +Y +g +Y +Y +Y +i +Y +H +Y +a +Y +Y +i +Y +Y +Y +Y +H +Y +a +Y +Y +Y +a +"} +(18,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} diff --git a/_maps/map_files/Deathmatch/The_Brig.dmm b/_maps/map_files/Deathmatch/The_Brig.dmm new file mode 100644 index 00000000000..15048da48e2 --- /dev/null +++ b/_maps/map_files/Deathmatch/The_Brig.dmm @@ -0,0 +1,4779 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/obj/machinery/door/poddoor/shutters{ + id = "dm16"; + name = "Visitation Shutters" + }, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/table, +/turf/open/indestructible, +/area/deathmatch) +"ad" = ( +/obj/structure/rack, +/obj/item/storage/briefcase{ + pixel_x = -3; + pixel_y = 2 + }, +/turf/open/floor/iron/grimy, +/area/deathmatch) +"al" = ( +/obj/structure/marker_beacon/burgundy, +/obj/structure/lattice/catwalk, +/turf/template_noop, +/area/template_noop) +"an" = ( +/obj/structure/lattice, +/turf/template_noop, +/area/space) +"ao" = ( +/obj/structure/rack, +/obj/machinery/camera/motion{ + c_tag = "Armory - Internal"; + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/light/directional/west, +/obj/item/reagent_containers/cup/bucket, +/turf/open/indestructible/dark, +/area/deathmatch) +"aw" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/turf/closed/indestructible/reinforced, +/area/deathmatch) +"aB" = ( +/obj/structure/table, +/obj/item/flashlight, +/turf/open/indestructible/dark, +/area/deathmatch) +"aE" = ( +/obj/structure/chair/wood{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/carpet, +/area/deathmatch) +"aH" = ( +/obj/structure/table/wood, +/obj/item/folder/red, +/obj/item/hand_labeler, +/obj/item/camera/detective, +/turf/open/floor/carpet, +/area/deathmatch) +"aI" = ( +/obj/effect/decal/cleanable/oil/slippery, +/turf/open/floor/iron/grimy, +/area/deathmatch) +"aR" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible/dark, +/area/deathmatch) +"aZ" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/indestructible, +/area/deathmatch) +"bc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"bh" = ( +/obj/effect/decal/cleanable/blood/footprints{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"bj" = ( +/obj/structure/closet{ + name = "Evidence Closet 2" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/indestructible/dark, +/area/deathmatch) +"bp" = ( +/obj/machinery/light/small/directional/south, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/blue/filled/line, +/turf/open/floor/iron/white, +/area/deathmatch) +"br" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable, +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/indestructible, +/area/deathmatch) +"by" = ( +/obj/machinery/photocopier{ + pixel_y = 3 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"bA" = ( +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/indestructible/dark, +/area/deathmatch) +"bI" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"bM" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible, +/area/deathmatch) +"cf" = ( +/obj/structure/cable, +/turf/open/floor/carpet, +/area/deathmatch) +"cl" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"cs" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"ct" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/indestructible/dark, +/area/deathmatch) +"cN" = ( +/obj/effect/decal/cleanable/blood/drip, +/turf/open/indestructible, +/area/deathmatch) +"cW" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/indestructible, +/area/deathmatch) +"cX" = ( +/obj/structure/cable, +/obj/machinery/power/rtg/debug, +/turf/open/indestructible/dark, +/area/deathmatch) +"da" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"dl" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/structure/chair{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"dp" = ( +/turf/open/floor/carpet, +/area/deathmatch) +"dq" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/cable, +/obj/item/shield/riot{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/item/shield/riot, +/obj/item/shield/riot{ + pixel_x = -3; + pixel_y = 3 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"du" = ( +/turf/closed/indestructible/fakedoor, +/area/deathmatch) +"dA" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"dN" = ( +/obj/effect/turf_decal/trimline/red/filled/corner, +/obj/effect/decal/cleanable/oil/slippery, +/turf/open/indestructible/dark, +/area/deathmatch) +"ew" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"eB" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/bodycontainer/morgue, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/deathmatch) +"eC" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"eD" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/grimy, +/area/deathmatch) +"eT" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"eU" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/vehicle/ridden/secway, +/obj/item/spear, +/turf/open/indestructible, +/area/deathmatch) +"eZ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"fB" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"fE" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"fL" = ( +/obj/structure/cable, +/obj/structure/reagent_dispensers/fueltank, +/turf/open/indestructible/dark, +/area/deathmatch) +"fO" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/suit_storage_unit, +/turf/open/indestructible/dark, +/area/deathmatch) +"gd" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/indestructible/dark, +/area/deathmatch) +"gf" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/light/small/directional/east, +/turf/open/indestructible, +/area/deathmatch) +"gC" = ( +/obj/machinery/suit_storage_unit, +/turf/open/indestructible/dark, +/area/deathmatch) +"gE" = ( +/obj/structure/table/wood, +/obj/item/folder/red{ + pixel_x = -7; + pixel_y = 6 + }, +/obj/item/folder/red{ + pixel_x = -7 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"gI" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/grimy, +/area/deathmatch) +"hi" = ( +/turf/open/floor/plating, +/area/deathmatch) +"hv" = ( +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 8 + }, +/obj/structure/rack, +/turf/open/indestructible, +/area/deathmatch) +"hw" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "briglockdown"; + name = "Brig Shutters" + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/deathmatch) +"hx" = ( +/obj/machinery/microwave{ + pixel_x = -3; + pixel_y = 6 + }, +/obj/structure/table, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/indestructible/dark, +/area/deathmatch) +"hG" = ( +/obj/structure/table/wood, +/obj/item/storage/fancy/cigarettes/cigpack_syndicate, +/turf/open/floor/carpet, +/area/deathmatch) +"hK" = ( +/obj/structure/table, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/pen, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/turf/open/floor/iron/white, +/area/deathmatch) +"hS" = ( +/obj/structure/table/wood, +/obj/machinery/computer/security/telescreen{ + desc = "Used for watching Prison Wing holding areas."; + name = "Prison Monitor"; + network = list("prison"); + pixel_y = 30 + }, +/obj/item/flashlight/lamp/green{ + pixel_x = 1; + pixel_y = 5 + }, +/turf/open/floor/carpet, +/area/deathmatch) +"hY" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/chair{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"iy" = ( +/obj/structure/table, +/obj/item/storage/backpack/duffelbag/sec{ + pixel_y = 7 + }, +/obj/item/storage/backpack/duffelbag/sec, +/turf/open/indestructible/dark, +/area/deathmatch) +"iB" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security/glass{ + name = "Security E.V.A. Storage" + }, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/indestructible, +/area/deathmatch) +"iI" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/computer/old{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"ja" = ( +/obj/structure/cable, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/machinery/computer/old{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"je" = ( +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"jr" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 5 + }, +/turf/open/indestructible, +/area/deathmatch) +"jB" = ( +/obj/machinery/light_switch/directional/west, +/turf/open/indestructible/dark, +/area/deathmatch) +"jN" = ( +/obj/structure/table, +/obj/machinery/light/small/directional/north, +/obj/item/folder/red{ + pixel_x = 3 + }, +/obj/item/folder/white{ + pixel_x = -4; + pixel_y = 2 + }, +/obj/item/healthanalyzer, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/deathmatch) +"jQ" = ( +/obj/structure/table/wood, +/obj/machinery/computer/security/wooden_tv{ + pixel_x = 3; + pixel_y = 2 + }, +/obj/machinery/button/door/directional/north{ + id = "dm7"; + name = "detective's office shutters control" + }, +/turf/open/floor/carpet, +/area/deathmatch) +"jT" = ( +/obj/structure/cable, +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/structure/disposalpipe/segment, +/turf/open/indestructible, +/area/deathmatch) +"jX" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security/glass{ + name = "Security Airlock" + }, +/turf/open/indestructible, +/area/deathmatch) +"kf" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 10 + }, +/obj/structure/disposalpipe/segment{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"ki" = ( +/obj/structure/extinguisher_cabinet/directional/south, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"kj" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/structure/chair/stool/directional/south, +/turf/open/indestructible, +/area/deathmatch) +"ku" = ( +/obj/structure/table, +/obj/item/wirecutters, +/obj/item/screwdriver{ + pixel_x = -2; + pixel_y = 10 + }, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/machinery/syndicatebomb/training, +/turf/open/indestructible, +/area/deathmatch) +"kU" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/indestructible, +/area/deathmatch) +"kV" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/structure/bed/dogbed/mcgriff, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 9 + }, +/turf/open/indestructible, +/area/deathmatch) +"la" = ( +/obj/machinery/vending/wardrobe/sec_wardrobe{ + active = 0 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"lf" = ( +/turf/closed/indestructible/fakedoor/glass_airlock, +/area/deathmatch) +"li" = ( +/obj/structure/table, +/obj/item/clothing/mask/surgical, +/obj/item/reagent_containers/spray/cleaner, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/turf/open/floor/iron/white, +/area/deathmatch) +"lj" = ( +/obj/item/paper_bin/carbon, +/obj/item/pen/fountain, +/obj/structure/table, +/turf/open/indestructible/dark, +/area/deathmatch) +"lC" = ( +/obj/structure/filingcabinet, +/turf/open/floor/iron/grimy, +/area/deathmatch) +"lT" = ( +/obj/machinery/button/flasher{ + id = "dm1"; + name = "Brig Entrance Flasher"; + pixel_x = -6; + pixel_y = -38 + }, +/obj/machinery/button/flasher{ + id = "dm2"; + name = "Holding Cell Flasher"; + pixel_x = 6; + pixel_y = -38 + }, +/turf/open/indestructible, +/area/deathmatch) +"lV" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security/glass{ + name = "Security Airlock" + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"ma" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/machinery/door/poddoor/preopen{ + id = "briglockdown"; + name = "Brig Shutters" + }, +/turf/open/floor/plating, +/area/deathmatch) +"mc" = ( +/obj/structure/closet/bombcloset/security, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/window/reinforced/spawner/directional/west, +/turf/open/indestructible, +/area/deathmatch) +"mi" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security/glass{ + name = "Security Airlock" + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"mn" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/secure_closet/brig{ + id = "Cell 3"; + name = "Cell 3 Locker" + }, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"mC" = ( +/obj/effect/turf_decal/bot, +/obj/structure/plasticflaps/opaque{ + name = "Security Deliveries" + }, +/turf/open/indestructible, +/area/deathmatch) +"mE" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 4 + }, +/obj/structure/table, +/obj/machinery/recharger{ + pixel_y = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"mG" = ( +/obj/structure/chair/comfy/black, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible/dark, +/area/deathmatch) +"mJ" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Security Maintenance" + }, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/floor/plating, +/area/deathmatch) +"mR" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/indestructible, +/area/deathmatch) +"mS" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"mW" = ( +/obj/structure/cable, +/obj/machinery/button/door/directional/south{ + id = "dm4"; + name = "Armory Shutters" + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"ne" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/indestructible/hotelwood, +/area/deathmatch) +"nf" = ( +/obj/machinery/light/directional/south, +/obj/structure/fluff/fake_camera{ + dir = 5 + }, +/turf/open/indestructible, +/area/deathmatch) +"nh" = ( +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/flasher/directional/east{ + id = "dm1" + }, +/obj/machinery/door/airlock/security/glass{ + name = "Security Airlock" + }, +/turf/open/indestructible, +/area/deathmatch) +"nq" = ( +/obj/structure/cable, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible, +/area/deathmatch) +"nx" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"nz" = ( +/obj/structure/table, +/obj/item/storage/box/donkpockets{ + pixel_x = -13; + pixel_y = 9 + }, +/obj/item/storage/fancy/donut_box{ + pixel_x = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/cable, +/turf/open/indestructible/dark, +/area/deathmatch) +"nB" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 9 + }, +/turf/open/indestructible, +/area/deathmatch) +"nH" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"nI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"nN" = ( +/obj/structure/table, +/obj/item/flashlight/lamp, +/turf/open/indestructible/dark, +/area/deathmatch) +"nY" = ( +/obj/structure/table/wood, +/obj/machinery/light/small/directional/west, +/obj/machinery/button/door/directional/west{ + id = "dm6"; + name = "Privacy Shutters Control" + }, +/turf/open/indestructible/hotelwood, +/area/deathmatch) +"ob" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/cable, +/obj/structure/chair{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"os" = ( +/obj/structure/sign/warning/pods{ + pixel_x = 32 + }, +/turf/open/indestructible, +/area/deathmatch) +"oy" = ( +/obj/machinery/light_switch/directional/west, +/turf/open/floor/iron/grimy, +/area/deathmatch) +"oA" = ( +/obj/machinery/light/directional/north, +/turf/open/indestructible, +/area/deathmatch) +"oB" = ( +/obj/structure/closet/secure_closet/evidence, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/spawner/random/contraband/narcotics, +/turf/open/indestructible/dark, +/area/deathmatch) +"oD" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/disposaloutlet{ + dir = 4; + name = "Cargo Deliveries" + }, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 9 + }, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 9 + }, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/effect/turf_decal/siding/red{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"oN" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/light/directional/north, +/obj/structure/reagent_dispensers/fueltank, +/turf/open/indestructible/dark, +/area/deathmatch) +"oQ" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/structure/cable, +/obj/machinery/door/airlock/security/glass{ + name = "Security Airlock" + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"oY" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 5 + }, +/turf/open/indestructible, +/area/deathmatch) +"pa" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/light/directional/east, +/obj/structure/closet/secure_closet/security/sec{ + anchored = 1 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"pc" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/indestructible, +/area/deathmatch) +"pe" = ( +/obj/effect/turf_decal/bot, +/turf/open/indestructible/dark, +/area/deathmatch) +"pg" = ( +/obj/machinery/door/poddoor/shutters{ + id = "dm16"; + name = "Visitation Shutters" + }, +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/turf/open/floor/plating, +/area/deathmatch) +"ph" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/deathmatch) +"pr" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/machinery/door/poddoor/preopen{ + id = "dm6"; + name = "Privacy Shutters" + }, +/turf/open/floor/plating, +/area/deathmatch) +"pC" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"pF" = ( +/obj/structure/rack, +/obj/item/book/manual/wiki/security_space_law{ + pixel_x = -5; + pixel_y = 7 + }, +/obj/item/book/manual/wiki/security_space_law{ + pixel_y = 4 + }, +/obj/item/book/manual/wiki/security_space_law{ + pixel_x = 5; + pixel_y = 2 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/indestructible/hotelwood, +/area/deathmatch) +"pM" = ( +/obj/structure/table, +/obj/machinery/recharger{ + pixel_y = 4 + }, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"pV" = ( +/obj/machinery/computer/old{ + dir = 8 + }, +/turf/open/floor/carpet, +/area/deathmatch) +"pY" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/red/filled/line, +/turf/open/indestructible, +/area/deathmatch) +"qd" = ( +/obj/structure/cable, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/deathmatch) +"qf" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"qk" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/blood/gibs/body, +/turf/open/indestructible, +/area/deathmatch) +"qv" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron/grimy, +/area/deathmatch) +"qy" = ( +/obj/structure/table, +/obj/item/folder/blue{ + pixel_x = -2; + pixel_y = 3 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"qC" = ( +/obj/effect/turf_decal/tile/red, +/turf/open/indestructible, +/area/deathmatch) +"qE" = ( +/obj/effect/turf_decal/trimline/neutral/filled/corner{ + dir = 8 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"qP" = ( +/obj/machinery/light/directional/east, +/turf/open/indestructible/hotelwood, +/area/deathmatch) +"qS" = ( +/obj/structure/table, +/obj/item/reagent_containers/cup/bottle/epinephrine, +/obj/item/reagent_containers/cup/bottle/multiver, +/obj/item/reagent_containers/syringe, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/deathmatch) +"ri" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/indestructible, +/area/deathmatch) +"rl" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 1 + }, +/obj/effect/decal/cleanable/oil/slippery, +/turf/open/indestructible, +/area/deathmatch) +"rN" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/machinery/light_switch/directional/east, +/turf/open/indestructible, +/area/deathmatch) +"sb" = ( +/obj/structure/closet{ + name = "Evidence Closet 4" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/item/storage/toolbox/emergency/old, +/turf/open/indestructible/dark, +/area/deathmatch) +"sg" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/grimy, +/area/deathmatch) +"sr" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 9 + }, +/obj/structure/disposalpipe/segment{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"st" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible, +/area/deathmatch) +"sw" = ( +/obj/item/target, +/obj/item/target, +/obj/item/target/alien, +/obj/item/target/alien, +/obj/item/target/clown, +/obj/item/target/clown, +/obj/item/target/syndicate, +/obj/item/target/syndicate, +/obj/structure/closet/crate/secure{ + desc = "A secure crate containing various materials for building a customised test-site."; + name = "Firing Range Gear Crate" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"sA" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 1 + }, +/obj/effect/turf_decal/siding/red{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/indestructible, +/area/deathmatch) +"sG" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"sJ" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"sL" = ( +/obj/structure/chair{ + dir = 4 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"sR" = ( +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/door/airlock/security/glass{ + name = "Security Airlock" + }, +/obj/structure/disposalpipe/segment{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"sZ" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/effect/decal/cleanable/blood/drip, +/turf/open/indestructible, +/area/deathmatch) +"th" = ( +/obj/structure/grille/broken, +/turf/open/floor/plating, +/area/deathmatch) +"tl" = ( +/obj/structure/table/wood, +/obj/machinery/recharger, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/indestructible/hotelwood, +/area/deathmatch) +"tn" = ( +/obj/structure/chair, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible, +/area/deathmatch) +"tH" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"tQ" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red, +/turf/open/indestructible, +/area/deathmatch) +"tR" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/indestructible, +/area/deathmatch) +"ua" = ( +/obj/machinery/door/poddoor/preopen{ + id = "dm10"; + name = "Brig Shutters" + }, +/obj/structure/cable, +/obj/structure/grille/broken, +/turf/open/floor/plating, +/area/deathmatch) +"ue" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/indestructible, +/area/deathmatch) +"us" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/indestructible, +/area/deathmatch) +"uD" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"uF" = ( +/obj/effect/turf_decal/tile/red, +/obj/machinery/light/directional/north, +/turf/open/indestructible, +/area/deathmatch) +"uI" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 5 + }, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 5 + }, +/obj/effect/turf_decal/siding/red{ + dir = 1 + }, +/obj/structure/reagent_dispensers/fueltank, +/turf/open/indestructible, +/area/deathmatch) +"uN" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/floor/carpet, +/area/deathmatch) +"uQ" = ( +/obj/structure/rack, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/item/restraints/handcuffs/fake{ + desc = "Commonly used for stopping criminals."; + name = "handcuffs" + }, +/turf/open/indestructible, +/area/deathmatch) +"uT" = ( +/obj/machinery/door/window/brigdoor/left/directional/south{ + name = "Cell 2" + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"vf" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/floor/iron/white, +/area/deathmatch) +"vl" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"vo" = ( +/obj/structure/extinguisher_cabinet/directional/north, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/closet/secure_closet/security/sec{ + anchored = 1 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"vt" = ( +/obj/item/storage/box/deputy, +/obj/structure/table, +/turf/open/indestructible/dark, +/area/deathmatch) +"vC" = ( +/obj/structure/lattice, +/turf/template_noop, +/area/template_noop) +"vD" = ( +/obj/structure/table, +/obj/structure/cable, +/obj/machinery/button/flasher{ + id = "dm1"; + name = "Brig Entrance Flasher"; + pixel_y = -3 + }, +/turf/open/indestructible, +/area/deathmatch) +"vJ" = ( +/obj/machinery/computer/old{ + dir = 8 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"vL" = ( +/obj/machinery/light/small/directional/east, +/obj/item/toy/plush/beeplushie, +/turf/open/indestructible/dark, +/area/deathmatch) +"vU" = ( +/obj/structure/rack, +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/cable, +/obj/item/storage/fancy/cigarettes/cigpack_syndicate, +/turf/open/indestructible/dark, +/area/deathmatch) +"vZ" = ( +/obj/machinery/light/small/directional/north, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"wc" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/effect/decal/cleanable/blood/drip, +/turf/open/indestructible, +/area/deathmatch) +"wm" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/light_switch/directional/west{ + pixel_y = -12 + }, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/indestructible/dark, +/area/deathmatch) +"wn" = ( +/obj/structure/fluff/fake_camera{ + dir = 9 + }, +/turf/open/indestructible, +/area/deathmatch) +"wR" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 10 + }, +/obj/machinery/disposal/delivery_chute{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"wT" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/blood/gibs/limb, +/turf/open/indestructible, +/area/deathmatch) +"wX" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible, +/area/deathmatch) +"xi" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/spawner/random/contraband/plus, +/turf/open/indestructible/dark, +/area/deathmatch) +"xk" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/closet/secure_closet/security/sec{ + anchored = 1 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"xm" = ( +/obj/structure/table, +/obj/item/implanter{ + pixel_x = 5; + pixel_y = 12 + }, +/obj/item/storage/box/evidence{ + pixel_x = -5; + pixel_y = 12 + }, +/obj/item/toy/crayon/white{ + pixel_y = -4 + }, +/obj/item/toy/crayon/white{ + pixel_x = -5; + pixel_y = -4 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"xu" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"xD" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"xS" = ( +/obj/machinery/button/door/directional/north{ + id = "dm5"; + name = "Space Shutters Control"; + pixel_x = -24 + }, +/obj/machinery/computer/old{ + dir = 4 + }, +/turf/open/indestructible/hotelwood, +/area/deathmatch) +"yy" = ( +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"yH" = ( +/obj/structure/table, +/obj/machinery/recharger{ + pixel_y = 4 + }, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"yN" = ( +/turf/cordon, +/area/template_noop) +"yO" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"yR" = ( +/obj/structure/chair/stool/directional/east, +/obj/effect/turf_decal/trimline/red/warning{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"yS" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/brigdoor/left/directional/north{ + name = "Brig Control Desk" + }, +/obj/item/folder/red, +/obj/item/folder/red, +/obj/item/poster/random_official, +/obj/structure/cable, +/obj/item/book/manual/wiki/security_space_law{ + pixel_x = -3; + pixel_y = 5 + }, +/turf/open/floor/iron/showroomfloor, +/area/deathmatch) +"yT" = ( +/obj/effect/turf_decal/tile/red, +/obj/machinery/light/directional/west, +/obj/machinery/light_switch/directional/west, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"yY" = ( +/obj/structure/cable, +/obj/machinery/computer/old{ + dir = 4 + }, +/turf/open/indestructible/hotelwood, +/area/deathmatch) +"zg" = ( +/obj/machinery/light/directional/south, +/turf/open/indestructible, +/area/deathmatch) +"zh" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/chair{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"zj" = ( +/obj/machinery/airalarm/directional/west, +/turf/open/indestructible, +/area/deathmatch) +"zm" = ( +/obj/machinery/light/small/directional/east, +/turf/open/indestructible/dark, +/area/deathmatch) +"zq" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/turf/open/floor/iron/grimy, +/area/deathmatch) +"zu" = ( +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 1 + }, +/obj/machinery/door/airlock/security/glass{ + name = "Security Airlock" + }, +/obj/structure/disposalpipe/segment{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"zG" = ( +/obj/machinery/light/directional/south, +/obj/machinery/firealarm/directional/south, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"zU" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"Ae" = ( +/obj/structure/cable, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"Am" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/item/restraints/handcuffs/fake{ + desc = "Commonly used for stopping criminals."; + name = "handcuffs" + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"An" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/frame/machine/secured, +/turf/open/indestructible/dark, +/area/deathmatch) +"As" = ( +/obj/machinery/vending/wardrobe/det_wardrobe, +/turf/open/floor/iron/grimy, +/area/deathmatch) +"Ay" = ( +/obj/structure/table, +/obj/item/inspector{ + pixel_x = -5; + pixel_y = 12 + }, +/obj/item/inspector{ + pixel_x = 5 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"AF" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/light/directional/north, +/turf/open/indestructible, +/area/deathmatch) +"AS" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/obj/machinery/door/airlock/security/glass{ + name = "Security Airlock" + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"Bf" = ( +/obj/machinery/light/directional/west, +/turf/open/indestructible/dark, +/area/deathmatch) +"Bt" = ( +/obj/machinery/computer/old{ + dir = 4 + }, +/turf/open/indestructible/hotelwood, +/area/deathmatch) +"By" = ( +/obj/machinery/vending/security{ + active = 0 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"Bz" = ( +/obj/structure/table, +/obj/machinery/recharger{ + pixel_y = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/indestructible/dark, +/area/deathmatch) +"BK" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/chair{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"BM" = ( +/obj/structure/table, +/obj/item/poster/random_official{ + pixel_y = 13 + }, +/obj/item/poster/random_official{ + pixel_y = 5 + }, +/obj/item/poster/random_official, +/turf/open/indestructible/dark, +/area/deathmatch) +"Cc" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/brigdoor/left/directional/north{ + name = "Weapon Distribution"; + req_access = list("armory") + }, +/obj/item/paper, +/obj/machinery/door/firedoor, +/obj/structure/cable, +/obj/item/pen, +/turf/open/indestructible/dark, +/area/deathmatch) +"Cx" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/cable, +/obj/structure/disposalpipe/trunk{ + dir = 2 + }, +/obj/structure/disposaloutlet, +/turf/open/indestructible/dark, +/area/deathmatch) +"CH" = ( +/obj/structure/table, +/obj/item/folder/red, +/obj/item/taperecorder, +/turf/open/indestructible/dark, +/area/deathmatch) +"CM" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/indestructible/hotelwood, +/area/deathmatch) +"CP" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/item/weldingtool, +/turf/open/indestructible/dark, +/area/deathmatch) +"CS" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"Dd" = ( +/obj/structure/filingcabinet/security{ + pixel_x = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"Dk" = ( +/obj/structure/cable, +/obj/machinery/computer/old{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"Dm" = ( +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 1 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"Dp" = ( +/obj/machinery/door/poddoor{ + name = "Lockdown Door" + }, +/turf/open/floor/plating, +/area/deathmatch) +"Dz" = ( +/obj/machinery/door/poddoor/shutters{ + id = "dm16"; + name = "Visitation Shutters" + }, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/table, +/turf/open/indestructible, +/area/deathmatch) +"DD" = ( +/obj/structure/table/wood, +/obj/item/paper_bin/carbon{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/pen, +/obj/item/book/manual/wiki/security_space_law, +/turf/open/floor/carpet, +/area/deathmatch) +"DL" = ( +/obj/structure/cable, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"DR" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/grille/broken, +/turf/open/indestructible/dark, +/area/deathmatch) +"Eb" = ( +/obj/machinery/door/window/brigdoor/left/directional/south{ + name = "Cell 3" + }, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/indestructible, +/area/deathmatch) +"Ee" = ( +/obj/structure/cable, +/turf/open/indestructible/hotelwood, +/area/deathmatch) +"Ef" = ( +/obj/effect/turf_decal/box, +/obj/structure/cable, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible/dark, +/area/deathmatch) +"Ep" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/cable, +/obj/machinery/door/poddoor{ + name = "Prison Lockdown" + }, +/turf/open/indestructible, +/area/deathmatch) +"Et" = ( +/obj/structure/table, +/obj/item/storage/box/evidence{ + pixel_x = 9; + pixel_y = 8 + }, +/obj/item/hand_labeler{ + pixel_x = -8; + pixel_y = 10 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/item/storage/box/evidence{ + pixel_x = 9; + pixel_y = 8 + }, +/obj/item/storage/box/evidence{ + pixel_x = 9; + pixel_y = 8 + }, +/obj/item/storage/box/prisoner{ + pixel_x = 9 + }, +/obj/machinery/recharger{ + pixel_x = -5; + pixel_y = -3 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"EA" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible, +/area/deathmatch) +"EJ" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 6 + }, +/obj/machinery/computer/old{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"EP" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/item/reagent_containers/cup/bucket, +/turf/open/indestructible/dark, +/area/deathmatch) +"EX" = ( +/obj/machinery/light/directional/east, +/turf/open/indestructible, +/area/deathmatch) +"Fi" = ( +/turf/template_noop, +/area/space) +"Fj" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/cable, +/obj/structure/closet/secure_closet/security/sec{ + anchored = 1 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"Fr" = ( +/obj/machinery/light/small/directional/south, +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/iron/grimy, +/area/deathmatch) +"Fx" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"FK" = ( +/obj/machinery/light/small/directional/east, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/flasher/directional/east{ + id = "dm2" + }, +/turf/open/indestructible, +/area/deathmatch) +"FQ" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/computer/old{ + dir = 8 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"FY" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/turf/open/floor/carpet, +/area/deathmatch) +"Gi" = ( +/obj/structure/cable, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/indestructible/hotelwood, +/area/deathmatch) +"Gm" = ( +/obj/effect/turf_decal/trimline/neutral/filled/corner{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/indestructible/dark, +/area/deathmatch) +"Gs" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible/dark, +/area/deathmatch) +"GM" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"GO" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/chair{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"GR" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible, +/area/deathmatch) +"GU" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/tracks, +/obj/effect/decal/cleanable/blood, +/turf/open/indestructible, +/area/deathmatch) +"GY" = ( +/obj/structure/table/wood, +/obj/item/phone{ + desc = "Supposedly a direct line to Nanotrasen Central Command. It's not even plugged in."; + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/cigbutt/cigarbutt{ + pixel_x = 5; + pixel_y = -1 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/indestructible/hotelwood, +/area/deathmatch) +"Hd" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/blood/drip, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"He" = ( +/obj/structure/tank_dispenser/oxygen, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"Ho" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"Hp" = ( +/obj/machinery/recharger{ + pixel_y = 4 + }, +/obj/structure/table, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"Hv" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/structure/cable, +/obj/effect/decal/cleanable/blood/drip, +/turf/open/indestructible, +/area/deathmatch) +"Hz" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"HK" = ( +/turf/closed/indestructible/fakeglass, +/area/deathmatch) +"HV" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/item/gun/ballistic/shotgun/riot, +/obj/item/gun/ballistic/shotgun/riot{ + pixel_y = 3 + }, +/obj/item/gun/ballistic/shotgun/riot{ + pixel_y = 6 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"Ii" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/light_switch/directional/east, +/turf/open/indestructible/dark, +/area/deathmatch) +"Ik" = ( +/obj/effect/turf_decal/trimline/red/filled/corner, +/turf/open/indestructible, +/area/deathmatch) +"Iy" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/turf/open/indestructible, +/area/deathmatch) +"IJ" = ( +/turf/closed/indestructible/reinforced, +/area/deathmatch) +"IL" = ( +/obj/machinery/light/small/directional/east, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"IS" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/computer/old{ + dir = 8 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"IU" = ( +/obj/structure/sign/warning/pods, +/turf/closed/wall/r_wall, +/area/deathmatch) +"Jb" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"Jo" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/carpet, +/area/deathmatch) +"Jp" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/door/poddoor/shutters/window/preopen{ + id = "dm4"; + name = "Armory Shutters" + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"Jv" = ( +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 1 + }, +/obj/machinery/button/door/directional/west{ + id = "dm8"; + name = "Labor Camp Shuttle Lockdown" + }, +/obj/machinery/disposal/delivery_chute{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"Jw" = ( +/obj/vehicle/ridden/secway, +/obj/effect/turf_decal/bot, +/turf/open/indestructible/dark, +/area/deathmatch) +"JC" = ( +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"JF" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/brigdoor/left/directional/north{ + name = "Brig Control Desk" + }, +/obj/item/paper, +/obj/machinery/door/firedoor, +/obj/structure/cable, +/obj/item/storage/fancy/donut_box, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "dm11"; + name = "Warden Desk Shutters" + }, +/turf/open/floor/iron/showroomfloor, +/area/deathmatch) +"JM" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/item/soap/nanotrasen, +/turf/open/indestructible/dark, +/area/deathmatch) +"JU" = ( +/obj/structure/table, +/obj/item/folder/red, +/obj/item/clothing/head/cone{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/clothing/head/cone{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/clothing/head/cone{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/clothing/head/cone{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/clothing/head/cone{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/structure/cable, +/turf/open/indestructible/dark, +/area/deathmatch) +"JZ" = ( +/obj/machinery/door/poddoor/preopen{ + id = "dm8"; + name = "Prisoner Processing" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/button/door/directional/west{ + id = "dm8"; + name = "Labor Camp Shuttle Lockdown" + }, +/turf/open/indestructible, +/area/deathmatch) +"Ke" = ( +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/airlock/security/glass{ + name = "Security Airlock" + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"Kh" = ( +/obj/structure/cable, +/turf/closed/indestructible/fakeglass, +/area/deathmatch) +"Ki" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"Km" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"Ku" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/cable, +/obj/effect/decal/cleanable/blood, +/turf/open/indestructible, +/area/deathmatch) +"Kz" = ( +/obj/structure/cable, +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/machinery/computer/old{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"KO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/structure/window/reinforced/spawner/directional/west, +/turf/open/indestructible, +/area/deathmatch) +"KQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair, +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible, +/area/deathmatch) +"Lk" = ( +/obj/structure/chair, +/obj/structure/cable, +/turf/open/indestructible/hotelwood, +/area/deathmatch) +"Lp" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/poddoor{ + name = "Prison Lockdown" + }, +/turf/open/indestructible, +/area/deathmatch) +"Ls" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"Lz" = ( +/obj/structure/sign/directions/security{ + dir = 1; + pixel_y = 8 + }, +/turf/closed/indestructible/reinforced, +/area/deathmatch) +"LL" = ( +/obj/effect/spawner/structure/window/reinforced/tinted, +/turf/open/floor/plating, +/area/deathmatch) +"LU" = ( +/obj/machinery/photocopier, +/turf/open/indestructible/dark, +/area/deathmatch) +"LX" = ( +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/structure/table/wood, +/obj/item/taperecorder{ + pixel_x = 8; + pixel_y = -1 + }, +/turf/open/floor/iron/grimy, +/area/deathmatch) +"Ma" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/indestructible, +/area/deathmatch) +"Mb" = ( +/obj/structure/sign/warning/vacuum/external{ + pixel_y = 32 + }, +/obj/machinery/light/small/directional/north, +/turf/open/indestructible, +/area/deathmatch) +"Mk" = ( +/obj/item/phone{ + desc = "Supposedly a direct line to Nanotrasen Central Command. It's not even plugged in."; + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/cigbutt/cigarbutt{ + pixel_x = 5; + pixel_y = -1 + }, +/obj/structure/table/wood, +/turf/open/floor/iron/grimy, +/area/deathmatch) +"Mx" = ( +/obj/structure/table, +/obj/item/clothing/mask/gas/sechailer{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/item/clothing/mask/gas/sechailer{ + pixel_x = -6; + pixel_y = 4 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"MG" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"MN" = ( +/obj/structure/table, +/obj/item/folder/red{ + pixel_x = -5 + }, +/obj/item/storage/fancy/cigarettes/cigpack_syndicate, +/turf/open/indestructible/dark, +/area/deathmatch) +"MP" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"MS" = ( +/obj/structure/table, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/deathmatch) +"MV" = ( +/obj/machinery/light/small/directional/south, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/indestructible/dark, +/area/deathmatch) +"MX" = ( +/obj/structure/table, +/obj/item/folder/blue{ + pixel_x = -18; + pixel_y = 3 + }, +/obj/item/paper_bin{ + pixel_x = 3; + pixel_y = 7 + }, +/obj/item/pen{ + pixel_x = 3; + pixel_y = 8 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"Ni" = ( +/obj/effect/turf_decal/tile/red, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"Nw" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"ND" = ( +/obj/structure/cable, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"NW" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/red/filled/warning{ + dir = 8 + }, +/obj/machinery/computer{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"NZ" = ( +/turf/open/floor/iron/white, +/area/deathmatch) +"Oi" = ( +/obj/structure/closet{ + name = "Evidence Closet 3" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/indestructible/dark, +/area/deathmatch) +"Os" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"Ox" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/secure_closet/brig{ + id = "Cell 2"; + name = "Cell 2 Locker" + }, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"Oy" = ( +/obj/effect/decal/cleanable/blood/gibs/torso, +/turf/open/indestructible, +/area/deathmatch) +"Oz" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/turf/open/indestructible/dark, +/area/deathmatch) +"OF" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"OJ" = ( +/obj/item/target/syndicate, +/obj/structure/training_machine, +/turf/open/indestructible, +/area/deathmatch) +"OK" = ( +/obj/structure/chair/office, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/red/filled/line, +/turf/open/indestructible, +/area/deathmatch) +"OU" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security/glass{ + name = "Security Airlock" + }, +/turf/open/floor/iron/grimy, +/area/deathmatch) +"Pj" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security/glass{ + name = "Secure Gear Storage" + }, +/obj/effect/turf_decal/delivery, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/indestructible/dark, +/area/deathmatch) +"Pn" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/item/reagent_containers/cup/glass/drinkingglass{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/reagent_containers/cup/glass/drinkingglass{ + pixel_x = -2; + pixel_y = -3 + }, +/obj/item/reagent_containers/cup/glass/bottle/amaretto{ + pixel_x = -10; + pixel_y = 10 + }, +/turf/open/indestructible/hotelwood, +/area/deathmatch) +"Pt" = ( +/turf/open/floor/iron/grimy, +/area/deathmatch) +"PM" = ( +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/structure/cable, +/obj/structure/disposalpipe/junction{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"PO" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security/glass{ + name = "Prison Wing" + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/indestructible, +/area/deathmatch) +"PT" = ( +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"PV" = ( +/obj/machinery/computer/security/telescreen{ + desc = "Used for watching Prison Wing holding areas."; + dir = 1; + name = "Prison Monitor"; + network = list("prison"); + pixel_y = -30 + }, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"Qd" = ( +/obj/structure/table, +/obj/item/clothing/glasses/sunglasses{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/item/clothing/ears/earmuffs{ + pixel_y = 7 + }, +/obj/machinery/light/small/directional/south, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"Qe" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/blood, +/turf/open/indestructible/dark, +/area/deathmatch) +"Qp" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 10 + }, +/obj/effect/turf_decal/trimline/red/filled/warning{ + dir = 10 + }, +/obj/machinery/computer{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"Qt" = ( +/obj/machinery/light/small/directional/west, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/machinery/disposal/delivery_chute{ + dir = 4 + }, +/turf/open/floor/iron/grimy, +/area/deathmatch) +"Qz" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "dm10"; + name = "Brig Shutters" + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/deathmatch) +"QG" = ( +/obj/machinery/door/window/left/directional/north, +/turf/open/floor/iron/grimy, +/area/deathmatch) +"Rd" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/indestructible, +/area/deathmatch) +"Rp" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"Rq" = ( +/obj/structure/cable, +/turf/closed/indestructible/reinforced, +/area/deathmatch) +"Rv" = ( +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"Rx" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall/r_wall, +/area/deathmatch) +"Ry" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/cable, +/obj/item/crowbar, +/turf/open/indestructible, +/area/deathmatch) +"RL" = ( +/obj/machinery/light_switch/directional/south, +/obj/structure/cable, +/turf/open/floor/carpet, +/area/deathmatch) +"RR" = ( +/obj/structure/cable, +/obj/machinery/door/poddoor/preopen{ + id = "dm5"; + name = "Space Shutters" + }, +/turf/closed/indestructible/fakeglass, +/area/deathmatch) +"RY" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"Se" = ( +/obj/effect/decal/cleanable/blood/gibs, +/turf/open/indestructible, +/area/deathmatch) +"Sg" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"St" = ( +/obj/effect/turf_decal/delivery, +/turf/open/indestructible, +/area/deathmatch) +"Sz" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/photocopier{ + pixel_y = 3 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"SA" = ( +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 8 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 1 + }, +/turf/open/indestructible, +/area/deathmatch) +"SB" = ( +/obj/structure/bed, +/obj/item/bedsheet, +/obj/machinery/iv_drip, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/blue/filled/line, +/turf/open/floor/iron/white, +/area/deathmatch) +"SF" = ( +/obj/structure/extinguisher_cabinet/directional/north, +/obj/machinery/light/directional/north, +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/indestructible, +/area/deathmatch) +"SG" = ( +/obj/effect/turf_decal/tile/red, +/obj/machinery/computer/old{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"SI" = ( +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/turf/open/indestructible, +/area/deathmatch) +"SO" = ( +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security/glass{ + name = "Security Airlock" + }, +/turf/open/indestructible, +/area/deathmatch) +"SR" = ( +/obj/structure/cable, +/turf/open/indestructible/dark, +/area/deathmatch) +"Tx" = ( +/obj/machinery/status_display/evac/directional/north, +/obj/machinery/light/directional/north, +/obj/structure/cable, +/turf/open/floor/carpet, +/area/deathmatch) +"TK" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/blood, +/turf/open/indestructible, +/area/deathmatch) +"TY" = ( +/obj/effect/turf_decal/trimline/neutral/filled/corner{ + dir = 4 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"Ub" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/machinery/door/poddoor/preopen{ + id = "dm11"; + name = "Brig Shutters" + }, +/turf/open/floor/plating, +/area/deathmatch) +"Uc" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable, +/obj/machinery/door/airlock/security/glass{ + name = "Security Airlock" + }, +/obj/structure/disposalpipe/segment, +/turf/open/indestructible, +/area/deathmatch) +"Ue" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/red/filled/corner, +/turf/open/indestructible, +/area/deathmatch) +"Ui" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/item/storage/toolbox/mechanical/old{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/item/storage/toolbox/mechanical/old, +/obj/item/storage/toolbox/mechanical/old{ + pixel_x = -3; + pixel_y = 3 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"Ux" = ( +/turf/open/indestructible/dark, +/area/deathmatch) +"Uz" = ( +/obj/structure/table, +/obj/item/folder/red{ + pixel_x = 14 + }, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/pen{ + pixel_x = -3; + pixel_y = 8 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"UD" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/spawner/random/contraband/armory, +/turf/open/indestructible/dark, +/area/deathmatch) +"UQ" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"UU" = ( +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"Vg" = ( +/obj/effect/turf_decal/trimline/red/filled/corner, +/turf/open/indestructible/dark, +/area/deathmatch) +"Vr" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"Vu" = ( +/obj/structure/cable, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible/dark, +/area/deathmatch) +"Vv" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/machinery/computer/old{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"VG" = ( +/obj/machinery/light/small/directional/east, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"VI" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security/glass{ + name = "Labor Camp Shuttle Airlock" + }, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/indestructible/dark, +/area/deathmatch) +"VL" = ( +/obj/structure/cable, +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/deathmatch) +"VO" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red, +/turf/open/indestructible, +/area/deathmatch) +"VR" = ( +/obj/structure/cable, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 + }, +/turf/open/floor/iron/white, +/area/deathmatch) +"Wd" = ( +/obj/machinery/door/airlock/command{ + name = "Head of Security's Office" + }, +/obj/structure/cable, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/indestructible/hotelwood, +/area/deathmatch) +"Wg" = ( +/turf/open/indestructible/hotelwood, +/area/deathmatch) +"Wo" = ( +/obj/structure/cable, +/obj/structure/grille/broken, +/turf/open/floor/plating, +/area/deathmatch) +"Wp" = ( +/obj/effect/decal/cleanable/oil/slippery, +/turf/open/indestructible, +/area/deathmatch) +"Wv" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"Wz" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/sign/warning/vacuum/external{ + pixel_x = -32 + }, +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"WD" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable, +/obj/machinery/door/airlock/security/glass{ + name = "Security Airlock" + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"WI" = ( +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"WO" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/turf/open/indestructible/hotelwood, +/area/deathmatch) +"WR" = ( +/obj/structure/closet{ + name = "Evidence Closet 1" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/indestructible/dark, +/area/deathmatch) +"WV" = ( +/obj/machinery/door/window/brigdoor/left/directional/south{ + name = "Cell 1" + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"WW" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/table, +/obj/machinery/button/door{ + desc = "Controls the shutters over the cell windows."; + id = "dm10"; + name = "Cell Window Control"; + pixel_x = -6; + pixel_y = 7; + specialfunctions = 4 + }, +/obj/machinery/button/door{ + desc = "Controls the shutters over the brig windows."; + id = "dm11"; + name = "Brig Lockdown Control"; + pixel_x = 6; + pixel_y = 7 + }, +/obj/item/key/security, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/turf/open/indestructible, +/area/deathmatch) +"WX" = ( +/obj/machinery/light/small/directional/south, +/turf/open/indestructible, +/area/deathmatch) +"XA" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 6 + }, +/turf/open/indestructible, +/area/deathmatch) +"XI" = ( +/turf/open/indestructible, +/area/deathmatch) +"XK" = ( +/turf/closed/wall, +/area/deathmatch) +"XL" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/oil/slippery, +/turf/open/indestructible, +/area/deathmatch) +"XS" = ( +/obj/machinery/light/directional/east, +/obj/structure/table, +/obj/machinery/recharger{ + pixel_x = 6; + pixel_y = 4 + }, +/obj/item/paper_bin{ + pixel_x = -11; + pixel_y = 7 + }, +/obj/item/pen{ + pixel_x = -11; + pixel_y = 7 + }, +/obj/item/hand_labeler{ + pixel_x = -10; + pixel_y = -6 + }, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"XX" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"Yg" = ( +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/structure/cable, +/obj/machinery/door/airlock/security/glass{ + name = "Security Airlock" + }, +/turf/open/indestructible, +/area/deathmatch) +"Yh" = ( +/turf/closed/wall/r_wall, +/area/deathmatch) +"Yz" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/indestructible, +/area/deathmatch) +"YI" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/suit_storage_unit, +/turf/open/indestructible/dark, +/area/deathmatch) +"YN" = ( +/obj/structure/chair/wood{ + dir = 8 + }, +/obj/structure/cable, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/floor/carpet, +/area/deathmatch) +"YQ" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/carpet, +/area/deathmatch) +"YS" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"YU" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/door/airlock/security/glass{ + name = "Security Airlock" + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"YW" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/turf/open/floor/plating, +/area/deathmatch) +"YY" = ( +/obj/structure/rack, +/obj/item/gun/energy/laser/practice{ + pixel_x = 2; + pixel_y = 5 + }, +/obj/item/gun/energy/laser/practice{ + pixel_x = 2; + pixel_y = 1 + }, +/obj/item/gun/energy/laser/practice{ + pixel_x = 2; + pixel_y = -2 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/indestructible/dark, +/area/deathmatch) +"YZ" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/rack, +/obj/item/healthanalyzer{ + pixel_y = -2 + }, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 6 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/deathmatch) +"Zj" = ( +/obj/machinery/door/window/brigdoor/security/holding{ + id = "Holding Cell"; + name = "Holding Cell" + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) +"Zq" = ( +/turf/template_noop, +/area/template_noop) +"Zr" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/bed, +/obj/item/bedsheet, +/turf/open/indestructible, +/area/deathmatch) +"Zv" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "dm7"; + name = "Detective's Office Shutters" + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/deathmatch) +"Zz" = ( +/obj/structure/table/wood, +/obj/item/taperecorder{ + pixel_x = 3 + }, +/obj/item/storage/box/evidence, +/obj/item/flashlight/seclite, +/turf/open/floor/iron/grimy, +/area/deathmatch) +"ZC" = ( +/obj/structure/chair, +/turf/open/floor/iron/grimy, +/area/deathmatch) +"ZF" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/indestructible/dark, +/area/deathmatch) +"ZJ" = ( +/obj/structure/closet/l3closet/security, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner/directional/west, +/turf/open/indestructible, +/area/deathmatch) +"ZO" = ( +/obj/effect/decal/cleanable/robot_debris/down, +/turf/open/floor/plating, +/area/deathmatch) + +(1,1,1) = {" +Zq +IJ +Yh +Yh +Yh +yN +yN +yN +IJ +IJ +IJ +IJ +du +IJ +Zq +Zq +Zq +Zq +Zq +Zq +Zq +Zq +Zq +Zq +Zq +Zq +"} +(2,1,1) = {" +Zq +IJ +YI +ZF +Yh +aa +pg +Dz +Yh +li +qS +eB +VR +Yh +HK +HK +lf +HK +Zq +HK +lf +HK +IJ +IJ +Kh +Yh +"} +(3,1,1) = {" +Zq +IJ +He +MV +XK +yR +YW +yR +XK +jN +NZ +NZ +bp +Yh +iI +HK +Ux +HK +Zq +XK +zm +VI +JZ +zj +eC +IJ +"} +(4,1,1) = {" +Zq +IJ +fO +ZF +ZO +XI +WI +WX +XK +MS +NZ +vf +SB +XK +oA +XK +VI +XK +XK +Yh +Yh +Yh +XK +Mb +eC +Kh +"} +(5,1,1) = {" +Zq +IJ +XK +iB +XK +YW +YW +jX +XK +hK +ph +ph +YZ +XK +XI +Wz +Vr +Jv +YW +GR +Zr +Qz +kj +Wp +eC +IJ +"} +(6,1,1) = {" +Zq +du +Lp +Ki +PO +GM +ND +GM +bI +Fx +Fx +Fx +XX +sZ +XI +Yz +WI +WI +WV +nI +nI +ua +Ho +XI +ki +IJ +"} +(7,1,1) = {" +Zq +Kh +Ep +Ki +YW +WI +WI +nq +WI +WI +WI +WI +WI +WI +WI +Rd +Ku +zg +XK +YW +Wo +Yh +Ho +XI +eC +IJ +"} +(8,1,1) = {" +Zq +du +Lp +VG +PO +os +EX +Ik +Os +yy +XI +XI +XI +XI +XI +XI +wc +XI +YW +GR +Zr +Qz +kj +XI +eC +IJ +"} +(9,1,1) = {" +Zq +IJ +Yh +Yh +Yh +XK +XK +XK +YU +XK +Et +FQ +IS +An +Sz +IU +Sg +WI +uT +nI +Ox +Qz +Ho +XI +eC +IJ +"} +(10,1,1) = {" +Zq +Zq +Zq +Zq +Yh +Oi +bj +WR +zU +Yh +Yh +YW +Yh +mc +ZJ +YW +Sg +zg +XK +Wo +YW +Yh +Ho +nq +je +IJ +"} +(11,1,1) = {" +Zq +Zq +Zq +Zq +Yh +vZ +aR +MG +zU +YW +vU +SR +Jp +Ho +cN +XI +Sg +XI +YW +GR +Zr +Qz +kj +WI +Wv +IJ +"} +(12,1,1) = {" +vC +vC +vC +vC +Yh +oB +pC +sb +Dd +Yh +JM +SR +Jp +Ho +Ue +Rp +da +UQ +Eb +nI +mn +Qz +Ho +WI +oD +IJ +"} +(13,1,1) = {" +vC +Zq +Zq +Zq +Yh +Yh +DR +Yh +Yh +Yh +nH +mW +Yh +SI +PT +Yh +qd +YW +Yh +Wo +YW +Yh +tR +cs +sA +Kh +"} +(14,1,1) = {" +vC +Zq +Zq +Zq +Yh +Ui +OF +UD +CP +ao +pe +SR +Yh +wn +PM +Rx +kV +eU +WW +Vr +wR +Yh +xD +WI +uI +IJ +"} +(15,1,1) = {" +al +Zq +Zq +Zq +Yh +Ux +Vg +TY +dN +TY +Vg +Gm +Cc +yy +PT +YW +DL +wX +XI +XI +Kz +ma +xD +WI +Wv +Dp +"} +(16,1,1) = {" +vC +Zq +Zq +Zq +Yh +Ux +qE +Dm +qE +Dm +qE +Dm +Ke +Hv +PT +SO +DL +WI +vD +WI +OK +JF +xD +WI +WI +Dp +"} +(17,1,1) = {" +vC +Zq +Zq +Zq +Yh +oN +tH +tH +xi +Am +EP +Ii +Kh +Rv +UU +YW +oY +Vv +XS +ja +EJ +hw +JC +WI +qC +Dp +"} +(18,1,1) = {" +IJ +Kh +Kh +IJ +Yh +Yh +VL +VL +Yh +Yh +Yh +Yh +Yh +oA +UU +Yh +yS +YW +Yh +YW +YW +Yh +Ae +WI +qC +Lz +"} +(19,1,1) = {" +IJ +HV +dq +MP +IJ +vo +yH +uD +xk +Bf +jB +JU +YW +yy +SA +RY +rl +Ls +zu +sr +kf +sR +mR +XI +qC +IJ +"} +(20,1,1) = {" +aw +Ux +SR +SR +Pj +SR +SR +Vu +SR +SR +SR +SR +oQ +Ho +WI +Hd +nq +XI +qd +nx +pY +Ub +DL +XI +qC +IJ +"} +(21,1,1) = {" +IJ +dA +gd +IL +IJ +pa +pM +eT +SR +By +Fj +la +YW +NW +Qp +bh +WI +WI +Yg +jr +XA +nh +sG +EX +SG +IJ +"} +(22,1,1) = {" +IJ +Kh +Kh +IJ +Yh +Yh +Yh +YW +oQ +XK +YW +XK +XK +YW +XK +SF +wT +lT +Yh +YW +Wo +Yh +Rq +Rq +IJ +IJ +"} +(23,1,1) = {" +Yh +sw +sJ +wm +YW +nB +GM +GM +Jb +GM +GM +ku +XK +Jw +XK +Se +TK +Oy +YW +KQ +GR +uQ +Yh +cX +Ux +IJ +"} +(24,1,1) = {" +Kh +YY +Ef +ct +lV +sG +XL +Ni +ob +ob +tQ +mS +yT +Ux +YW +yy +qk +XI +YW +tn +GR +st +Yh +cX +Ux +IJ +"} +(25,1,1) = {" +Yh +Bz +fB +Qd +XK +XK +uF +vl +xm +BM +qy +hY +Iy +Oz +AS +Nw +pc +WI +Zj +xu +bM +nI +Rq +SR +Ux +IJ +"} +(26,1,1) = {" +Yh +cl +bc +KO +XK +pe +Ma +Ux +Ux +Ux +MX +GO +br +Ux +WD +DL +Hz +XI +YW +KQ +EA +st +Yh +vL +Ux +IJ +"} +(27,1,1) = {" +Yh +YS +XI +kU +XK +pe +Ma +by +Qe +CS +aB +GO +VO +Ux +YW +Rv +Hz +XI +YW +KQ +FK +Yh +IJ +IJ +IJ +IJ +"} +(28,1,1) = {" +Yh +YS +XI +kU +XK +pe +Ma +mG +vt +CS +bA +GU +PV +XK +XK +XI +Hz +nf +Yh +Yh +Yh +Yh +Qt +zq +Zz +IJ +"} +(29,1,1) = {" +Kh +YS +OJ +kU +XK +pe +Ma +vJ +lj +Ux +Uz +GO +WI +Dk +qd +XI +Hz +Ik +Zv +ad +oy +Pt +eD +QG +lC +IJ +"} +(30,1,1) = {" +Yh +ew +gf +eZ +XK +XK +AF +Ux +Ux +Ux +MN +GO +XL +Km +qd +XI +Rd +jT +Uc +YQ +YQ +uN +qv +zq +Fr +IJ +"} +(31,1,1) = {" +Yh +Kh +Yh +Kh +Yh +hx +Wv +ue +iy +Mx +Ay +zh +zG +XK +XK +XI +XI +hv +Zv +hG +aH +DD +sg +IJ +IJ +IJ +"} +(32,1,1) = {" +an +Fi +Fi +Fi +Kh +nz +WI +eC +BK +dl +us +aZ +WI +Ry +YW +Ik +Os +mE +Yh +hS +FY +dp +Pt +du +Zq +Zq +"} +(33,1,1) = {" +Yh +Yh +RR +Yh +Yh +Cx +ri +yO +cW +rN +Os +Hp +UQ +fE +Yh +Yh +mi +Yh +Yh +jQ +pV +pV +As +IJ +Zq +Zq +"} +(34,1,1) = {" +Yh +xS +yY +Bt +Yh +pr +Yh +pF +ne +Yh +St +Yh +OU +Yh +Yh +Ux +Ux +Ux +IJ +IJ +IJ +IJ +IJ +IJ +Zq +Zq +"} +(35,1,1) = {" +RR +Wg +Ee +WO +nY +Wg +Yh +Lk +Wg +Yh +mC +Yh +Pt +ZC +th +Ux +Gs +sL +IJ +Zq +Zq +Zq +Zq +Zq +Zq +Zq +"} +(36,1,1) = {" +RR +CM +GY +Pn +tl +Gi +Wd +Ee +Wg +mJ +hi +XK +aI +ZC +LL +Ux +nN +CH +IJ +Zq +Zq +Zq +Zq +Zq +Zq +Zq +"} +(37,1,1) = {" +RR +cf +cf +YN +aE +RL +Yh +Wg +qP +Yh +hi +XK +gI +ZC +LL +Ux +qf +qf +IJ +Zq +Zq +Zq +Zq +Zq +Zq +Zq +"} +(38,1,1) = {" +Yh +Tx +dp +dp +dp +Jo +Yh +Yh +Yh +Yh +du +XK +Mk +LX +XK +Ux +Ux +Ux +IJ +Zq +Zq +Zq +Zq +Zq +Zq +Zq +"} +(39,1,1) = {" +Yh +fL +gC +gE +LU +Yh +Yh +Zq +Zq +Zq +Zq +IJ +IJ +IJ +IJ +IJ +IJ +IJ +IJ +Zq +Zq +Zq +Zq +Zq +Zq +Zq +"} +(40,1,1) = {" +Yh +RR +Yh +Yh +Yh +Yh +Zq +Zq +Zq +Zq +Zq +Zq +Zq +Zq +Zq +Zq +Zq +Zq +Zq +Zq +Zq +Zq +Zq +Zq +Zq +Zq +"} diff --git a/_maps/map_files/Deathmatch/arena.dmm b/_maps/map_files/Deathmatch/arena.dmm new file mode 100644 index 00000000000..d407234f0ab --- /dev/null +++ b/_maps/map_files/Deathmatch/arena.dmm @@ -0,0 +1,1978 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aj" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/indestructible/vault, +/area/deathmatch) +"ao" = ( +/obj/structure/grille/broken, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/indestructible/plating, +/area/deathmatch) +"aD" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 5 + }, +/obj/machinery/light/floor, +/turf/open/indestructible/vault, +/area/deathmatch) +"aI" = ( +/turf/open/chasm/true, +/area/deathmatch) +"bg" = ( +/obj/effect/turf_decal/siding/wideplating/dark/corner{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/vault, +/area/deathmatch) +"bw" = ( +/obj/item/gun/ballistic/automatic/wt550, +/obj/structure/table/reinforced, +/obj/item/ammo_box/magazine/wt550m9, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"bC" = ( +/obj/structure/barricade/wooden, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"cf" = ( +/obj/structure/table/reinforced, +/obj/item/storage/box/donkpockets/donkpocketpizza, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"cw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/old, +/obj/machinery/light/floor, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"cM" = ( +/obj/structure/grille/broken, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/indestructible/plating, +/area/deathmatch) +"cY" = ( +/obj/structure/barricade/security/murderdome, +/obj/effect/decal/cleanable/blood/old, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"dp" = ( +/obj/structure/lattice/catwalk, +/obj/effect/light_emitter{ + set_cap = 2; + light_color = "#DEEFFF"; + set_luminosity = 4 + }, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/chasm/true, +/area/deathmatch) +"dN" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"dU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/landmark/deathmatch_player_spawn, +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"ek" = ( +/obj/item/gun/ballistic/shotgun/sc_pump, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"eC" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/indestructible/vault, +/area/deathmatch) +"fp" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/storage/medkit/tactical/premium, +/obj/structure/table/reinforced, +/obj/structure/window/spawner/directional/south, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"fX" = ( +/obj/structure/railing, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"hb" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/vault, +/area/deathmatch) +"hG" = ( +/obj/effect/spawner/structure/window, +/turf/open/indestructible/plating, +/area/deathmatch) +"ir" = ( +/obj/effect/turf_decal/siding/wideplating/dark, +/turf/open/indestructible/vault, +/area/deathmatch) +"jA" = ( +/obj/effect/turf_decal/siding/wideplating/dark/corner{ + dir = 8 + }, +/turf/open/indestructible/vault, +/area/deathmatch) +"kk" = ( +/turf/open/indestructible/vault, +/area/deathmatch) +"lv" = ( +/obj/structure/chair/office/tactical{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"lQ" = ( +/obj/item/gun/ballistic/revolver/reverse, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/light_emitter{ + set_cap = 2; + light_color = "#DEEFFF"; + set_luminosity = 4 + }, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"lS" = ( +/obj/structure/table/reinforced, +/obj/item/grenade/frag/mega, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"lT" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/obj/structure/bed/maint, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"mz" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 6 + }, +/turf/open/indestructible/vault, +/area/deathmatch) +"mI" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 8 + }, +/obj/structure/barricade/security/murderdome, +/turf/open/indestructible/vault, +/area/deathmatch) +"mV" = ( +/obj/structure/grille/broken, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/indestructible/plating, +/area/deathmatch) +"ns" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/vault, +/area/deathmatch) +"nI" = ( +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"nT" = ( +/obj/effect/light_emitter{ + set_cap = 2; + light_color = "#DEEFFF"; + set_luminosity = 4 + }, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"pt" = ( +/obj/item/clothing/suit/armor/swat, +/obj/item/clothing/head/helmet/swat/nanotrasen, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/melee/energy/sword, +/obj/effect/light_emitter{ + set_cap = 2; + light_color = "#DEEFFF"; + set_luminosity = 4 + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/indestructible/plating, +/area/deathmatch) +"pR" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 8 + }, +/turf/open/indestructible/vault, +/area/deathmatch) +"qa" = ( +/turf/closed/indestructible/riveted, +/area/deathmatch) +"qH" = ( +/obj/item/food/roast_dinner, +/obj/structure/table/reinforced, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"qP" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/indestructible/vault, +/area/deathmatch) +"rc" = ( +/obj/effect/turf_decal/siding/wideplating/dark, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 1 + }, +/turf/open/indestructible/vault, +/area/deathmatch) +"sd" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 10 + }, +/turf/open/indestructible/vault, +/area/deathmatch) +"sk" = ( +/obj/item/gun/ballistic/rifle/rebarxbow/syndie, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"st" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/item/shield/roman, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wideplating/dark, +/turf/open/indestructible/vault, +/area/deathmatch) +"sK" = ( +/obj/effect/light_emitter{ + set_cap = 2; + light_color = "#DEEFFF"; + set_luminosity = 4 + }, +/turf/open/indestructible/vault, +/area/deathmatch) +"tc" = ( +/obj/item/stack/rods/ten, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wideplating/dark, +/turf/open/indestructible/vault, +/area/deathmatch) +"tF" = ( +/obj/structure/mystery_box/tdome, +/turf/open/indestructible/vault, +/area/deathmatch) +"tT" = ( +/obj/structure/barricade/security/murderdome, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"ud" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/light_emitter{ + set_cap = 2; + light_color = "#DEEFFF"; + set_luminosity = 4 + }, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"un" = ( +/obj/structure/barricade/security/murderdome, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/blood/old, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"vm" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/light/floor, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"vM" = ( +/obj/structure/table/reinforced, +/obj/item/reagent_containers/spray/waterflower/superlube, +/obj/structure/window/plasma/spawner/directional/east, +/obj/structure/window/plasma/spawner/directional/north, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"vW" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 4 + }, +/obj/item/gun/ballistic/automatic/m90/unrestricted, +/turf/open/indestructible/vault, +/area/deathmatch) +"wg" = ( +/obj/structure/table/reinforced, +/obj/item/ammo_casing/shotgun/frag12, +/obj/item/ammo_casing/shotgun/frag12, +/obj/item/ammo_casing/shotgun/frag12, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"wz" = ( +/obj/effect/spawner/random/contraband/armory, +/obj/item/clothing/suit/armor/bone, +/turf/open/indestructible/vault, +/area/deathmatch) +"xD" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"xG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 2 + }, +/obj/machinery/conveyor/auto, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"xJ" = ( +/obj/machinery/door/airlock/grunge, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"xK" = ( +/obj/effect/spawner/random/contraband/grenades/cluster, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"yb" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/vault, +/area/deathmatch) +"yA" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"zd" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"zy" = ( +/obj/structure/mystery_box/tdome, +/obj/effect/light_emitter{ + set_cap = 2; + light_color = "#DEEFFF"; + set_luminosity = 4 + }, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"An" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/suit/armor/vest/alt, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"As" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/deathmatch) +"Bl" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/machinery/microwave, +/obj/item/kitchen/fork, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wideplating/dark, +/turf/open/indestructible/vault, +/area/deathmatch) +"Br" = ( +/obj/effect/turf_decal/siding/wideplating/dark/corner{ + dir = 4 + }, +/turf/open/indestructible/vault, +/area/deathmatch) +"BH" = ( +/obj/structure/lattice/catwalk, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/chasm/true, +/area/deathmatch) +"Db" = ( +/obj/item/gun/ballistic/revolver/nagant, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/vault, +/area/deathmatch) +"Dp" = ( +/obj/item/gun/ballistic/automatic/pistol/m1911, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"DC" = ( +/obj/structure/grille/broken, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/indestructible/plating, +/area/deathmatch) +"DF" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/vault, +/area/deathmatch) +"Ef" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 5 + }, +/turf/open/indestructible/vault, +/area/deathmatch) +"En" = ( +/turf/cordon, +/area/deathmatch) +"EA" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"EQ" = ( +/obj/effect/turf_decal/siding/wideplating/dark, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/indestructible/vault, +/area/deathmatch) +"Gb" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/conveyor/auto{ + dir = 4 + }, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"Go" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/vault, +/area/deathmatch) +"Gz" = ( +/obj/item/gun/ballistic/rifle/boltaction/prime, +/obj/structure/table/reinforced, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"GY" = ( +/obj/structure/table/reinforced, +/obj/item/grenade/mirage, +/obj/item/grenade/mirage, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"HD" = ( +/obj/lightning_thrower, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/deathmatch) +"Ig" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 4 + }, +/turf/open/indestructible/vault, +/area/deathmatch) +"Ih" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/open/indestructible/vault, +/area/deathmatch) +"In" = ( +/obj/structure/mystery_box/tdome, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"IJ" = ( +/obj/effect/light_emitter{ + set_cap = 2; + light_color = "#DEEFFF"; + set_luminosity = 2 + }, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"Jm" = ( +/obj/effect/light_emitter{ + set_cap = 2; + light_color = "#DEEFFF"; + set_luminosity = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"Jq" = ( +/obj/structure/lattice/catwalk, +/turf/open/chasm/true, +/area/deathmatch) +"JN" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"Kb" = ( +/obj/structure/table/reinforced, +/obj/item/ammo_box/strilka310/surplus, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"Kr" = ( +/obj/item/stack/rods/ten, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/light_emitter{ + set_cap = 2; + light_color = "#DEEFFF"; + set_luminosity = 4 + }, +/obj/effect/turf_decal/siding/wideplating/dark, +/turf/open/indestructible/vault, +/area/deathmatch) +"KT" = ( +/obj/structure/chair/office/tactical{ + dir = 1 + }, +/turf/open/indestructible/vault, +/area/deathmatch) +"KX" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 8 + }, +/obj/machinery/light/floor, +/turf/open/indestructible/vault, +/area/deathmatch) +"Lh" = ( +/obj/item/clothing/suit/armor/vest/russian_coat, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"LA" = ( +/obj/effect/spawner/random/medical/medkit_rare, +/obj/effect/decal/cleanable/blood/old, +/turf/open/indestructible/vault, +/area/deathmatch) +"Ml" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 10 + }, +/obj/structure/barricade/security/murderdome, +/turf/open/indestructible/vault, +/area/deathmatch) +"Mq" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/vault, +/area/deathmatch) +"ML" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/obj/effect/light_emitter{ + set_cap = 2; + light_color = "#DEEFFF"; + set_luminosity = 4 + }, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"Om" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/remains/human, +/turf/open/indestructible/plating, +/area/deathmatch) +"OK" = ( +/obj/effect/turf_decal/siding/wideplating/dark, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 1 + }, +/obj/structure/barricade/security/murderdome, +/turf/open/indestructible/vault, +/area/deathmatch) +"OU" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/blood/old, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"PU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/spawner/random/contraband/grenades/cluster, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"Qd" = ( +/obj/structure/table/reinforced, +/obj/item/storage/medkit/tactical/premium, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"QQ" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood/old, +/turf/open/indestructible/plating, +/area/deathmatch) +"QY" = ( +/obj/structure/table/reinforced, +/obj/item/gun/ballistic/automatic/pistol/m1911, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"Rq" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/vault, +/area/deathmatch) +"RE" = ( +/obj/effect/light_emitter{ + set_cap = 2; + light_color = "#DEEFFF"; + set_luminosity = 2 + }, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/vault, +/area/deathmatch) +"Sy" = ( +/obj/machinery/light/floor, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"SZ" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/obj/effect/light_emitter{ + set_cap = 2; + light_color = "#DEEFFF"; + set_luminosity = 2 + }, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"TC" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/railing/corner/end, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"TQ" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/machinery/light/floor, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"Uk" = ( +/obj/structure/lattice/catwalk, +/obj/effect/light_emitter{ + set_cap = 2; + light_color = "#DEEFFF"; + set_luminosity = 4 + }, +/turf/open/chasm/true, +/area/deathmatch) +"Uv" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"UU" = ( +/obj/structure/table/reinforced, +/obj/structure/window/plasma/spawner/directional/north, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"UV" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 5 + }, +/obj/machinery/deployable_turret, +/turf/open/indestructible/vault, +/area/deathmatch) +"Vl" = ( +/obj/structure/mystery_box/tdome, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"Vx" = ( +/obj/structure/barricade/security/murderdome, +/obj/effect/turf_decal/siding/wideplating/dark, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/vault, +/area/deathmatch) +"VA" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/item/gun/ballistic/revolver/c38, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/vault, +/area/deathmatch) +"Wd" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible/vault, +/area/deathmatch) +"We" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 8 + }, +/turf/open/indestructible/vault, +/area/deathmatch) +"Ws" = ( +/obj/effect/turf_decal/siding/wideplating/dark/corner{ + dir = 8 + }, +/obj/structure/barricade/security/murderdome, +/turf/open/indestructible/vault, +/area/deathmatch) +"WE" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wideplating/dark, +/turf/open/indestructible/vault, +/area/deathmatch) +"WP" = ( +/obj/structure/table/reinforced, +/obj/item/gun/ballistic/revolver/c38, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"WQ" = ( +/obj/effect/spawner/random/entertainment/drugs, +/obj/effect/spawner/random/entertainment/drugs, +/obj/effect/spawner/random/entertainment/drugs, +/obj/effect/spawner/random/entertainment/drugs, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"Xc" = ( +/obj/effect/spawner/random/contraband/armory, +/obj/item/clothing/suit/armor/bone, +/obj/structure/table/reinforced, +/turf/open/indestructible/vault, +/area/deathmatch) +"XG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"XP" = ( +/obj/machinery/light/floor, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"XR" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 9 + }, +/turf/open/indestructible/vault, +/area/deathmatch) +"XT" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/mystery_box/tdome, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/vault, +/area/deathmatch) +"Yc" = ( +/obj/effect/turf_decal/siding/wideplating/dark, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/indestructible/vault, +/area/deathmatch) +"YI" = ( +/obj/structure/lattice/catwalk, +/obj/item/storage/toolbox/guncase/rocketlauncher{ + weapon_to_spawn = /obj/item/gun/ballistic/rocketlauncher/unrestricted + }, +/obj/effect/light_emitter{ + set_cap = 2; + light_color = "#DEEFFF"; + set_luminosity = 2 + }, +/turf/open/chasm/true, +/area/deathmatch) +"ZO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/railing/corner/end{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"ZR" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/vault, +/area/deathmatch) +"ZZ" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 4 + }, +/obj/structure/barricade/security/murderdome, +/turf/open/indestructible/vault, +/area/deathmatch) + +(1,1,1) = {" +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +"} +(2,1,1) = {" +En +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +En +"} +(3,1,1) = {" +En +qa +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +qa +En +"} +(4,1,1) = {" +En +qa +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +qa +En +"} +(5,1,1) = {" +En +qa +aI +aI +qa +PU +zd +XG +qa +qa +qa +XG +zd +vm +TC +dU +JN +ZO +cw +dN +zd +qa +qa +qa +XG +zd +qa +qa +aI +aI +qa +En +"} +(6,1,1) = {" +En +qa +aI +aI +EQ +nI +nI +nI +Vl +qa +Vl +nI +nI +yA +nI +nI +nI +yA +yA +yA +yA +Vl +qa +Vl +nI +nI +vM +qa +aI +aI +qa +En +"} +(7,1,1) = {" +En +qa +aI +aI +EQ +nI +XP +nI +nI +qa +nI +nI +nI +qa +qa +hG +hG +qa +qa +nI +nI +nI +qa +nI +XP +XP +yA +qa +aI +aI +qa +En +"} +(8,1,1) = {" +En +qa +aI +aI +EQ +nI +Jq +nI +nI +rc +nI +nI +yA +qa +tF +kk +LA +wz +qa +nI +nI +yA +rc +nI +Jq +Jq +yA +qa +aI +aI +qa +En +"} +(9,1,1) = {" +En +qa +aI +aI +EQ +nI +Uk +nI +nI +OK +nI +ud +nI +aj +kk +Wd +sK +Ih +ir +nI +lQ +yA +OK +yA +Jq +Uk +nI +qa +aI +aI +qa +En +"} +(10,1,1) = {" +En +qa +aI +aI +EQ +nI +BH +nI +nI +rc +nI +nI +nI +qa +Xc +KT +Ih +tF +qa +Uv +nI +nI +rc +nI +Jq +BH +An +qa +aI +aI +qa +En +"} +(11,1,1) = {" +En +qa +aI +aI +qa +nI +XP +nI +WP +qa +Qd +EA +nI +qa +qa +hG +hG +qa +qa +Uv +Uv +nI +qa +nI +XP +XP +bw +qa +aI +aI +qa +En +"} +(12,1,1) = {" +En +qa +aI +aI +qa +nI +nI +nI +An +qa +An +nI +nI +nI +nI +nI +ek +nI +nI +yA +nI +lS +qa +qa +bC +bC +qa +qa +aI +aI +qa +En +"} +(13,1,1) = {" +En +qa +aI +aI +XR +We +We +We +We +mI +We +We +We +KX +sd +yA +nI +nI +TQ +yA +EA +wg +qa +Vl +EA +nI +GY +qa +aI +aI +qa +En +"} +(14,1,1) = {" +En +qa +aI +aI +aI +aI +Jq +aI +aI +aI +aI +Jq +aI +aI +jA +We +We +qP +sd +nI +nI +QY +qa +nI +nI +nT +nI +fX +aI +aI +qa +En +"} +(15,1,1) = {" +En +qa +aI +aI +aI +aI +Uk +aI +aI +aI +aI +Uk +aI +aI +Jq +Jq +Jq +aI +jA +We +We +We +Ml +nI +yA +nI +nI +xK +aI +aI +qa +En +"} +(16,1,1) = {" +En +qa +aI +aI +aI +aI +Jq +aI +aI +aI +aI +Jq +aI +aI +Jq +dp +Jq +aI +aI +aI +aI +aI +Ws +We +We +We +qP +sd +aI +aI +qa +En +"} +(17,1,1) = {" +En +qa +aI +aI +UV +ZZ +Ig +Ig +vW +eC +Ig +eC +Br +aI +Jq +Jq +Jq +aI +aI +YI +aI +aI +aI +aI +aI +Jq +aI +aI +aI +aI +qa +En +"} +(18,1,1) = {" +En +qa +aI +aI +qa +qa +Uv +nI +SZ +nI +nI +nI +Ef +Ig +Ig +Ig +Br +aI +aI +Jq +aI +aI +aI +aI +aI +Uk +aI +aI +aI +aI +qa +En +"} +(19,1,1) = {" +En +qa +aI +aI +qa +fp +Uv +yA +nI +yA +nI +nI +yA +nI +Uv +yA +Ef +Ig +eC +hb +bg +aI +aI +aI +aI +Jq +aI +aI +aI +aI +qa +En +"} +(20,1,1) = {" +En +qa +aI +aI +qa +qa +qa +tT +Uv +nI +tT +tT +nI +Uv +Uv +IJ +nI +nI +nI +Uv +aD +Ig +Ig +Ig +Ig +Ig +Ig +mz +aI +aI +qa +En +"} +(21,1,1) = {" +En +qa +aI +aI +Bl +cf +qa +Jm +Uv +yA +zy +tT +OU +qa +qa +DC +DC +mV +DC +mV +qa +qa +xJ +UU +qa +nT +yA +qa +aI +aI +qa +En +"} +(22,1,1) = {" +En +qa +aI +aI +WE +yA +rc +Uv +Uv +nI +Uv +nI +nI +Kb +qa +As +HD +Om +HD +As +qa +lT +Sy +lv +qa +cY +yA +qa +aI +aI +qa +En +"} +(23,1,1) = {" +En +qa +aI +aI +WE +nI +rc +Dp +nI +Uv +Uv +nI +nI +Gz +qa +As +As +pt +Om +As +qa +WQ +xD +In +qa +nI +nI +qa +aI +aI +qa +En +"} +(24,1,1) = {" +En +qa +aI +aI +Kr +nI +qa +ML +nI +Uv +zy +tT +nI +SZ +qa +Om +HD +As +HD +QQ +qa +qa +qa +qa +qa +nI +cY +qa +aI +aI +qa +En +"} +(25,1,1) = {" +En +qa +aI +aI +tc +yA +qa +qa +bC +bC +tT +tT +nI +nI +qa +ao +cM +ao +ao +ao +qa +Lh +yA +nI +nI +sk +nI +xG +aI +aI +qa +En +"} +(26,1,1) = {" +En +qa +aI +aI +st +nI +qH +qa +ZR +Db +qa +nI +yA +nI +Yc +nI +nI +nI +nI +yA +rc +nT +tT +nI +un +ML +nI +xG +aI +aI +qa +En +"} +(27,1,1) = {" +En +qa +aI +aI +qa +XP +yA +Go +RE +DF +Vx +nI +yA +XP +rc +nI +nI +ML +yA +nI +rc +nI +nI +yA +nI +nI +Vl +qa +aI +aI +qa +En +"} +(28,1,1) = {" +En +qa +aI +aI +qa +qa +pR +qa +Mq +yb +qa +Rq +Rq +qa +qa +qa +VA +ns +XT +qa +qa +qa +Gb +Gb +Gb +Gb +qa +qa +aI +aI +qa +En +"} +(29,1,1) = {" +En +qa +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +qa +En +"} +(30,1,1) = {" +En +qa +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +qa +En +"} +(31,1,1) = {" +En +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +qa +En +"} +(32,1,1) = {" +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +"} diff --git a/_maps/map_files/Deathmatch/chinatown.dmm b/_maps/map_files/Deathmatch/chinatown.dmm new file mode 100644 index 00000000000..78cb949235d --- /dev/null +++ b/_maps/map_files/Deathmatch/chinatown.dmm @@ -0,0 +1,1417 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"bd" = ( +/turf/open/floor/wood/parquet, +/area/deathmatch) +"ce" = ( +/obj/structure/chair/stool/bamboo{ + dir = 4 + }, +/obj/item/spear/bamboospear, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"ch" = ( +/obj/item/kirbyplants{ + icon_state = "plant-10" + }, +/turf/open/floor/bamboo, +/area/deathmatch) +"cr" = ( +/obj/item/stack/sheet/mineral/bamboo, +/turf/open/misc/grass, +/area/deathmatch) +"dm" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/item/fishing_rod/bone, +/obj/item/fishing_hook/bone, +/obj/item/fishing_line/sinew, +/obj/structure/fermenting_barrel/gunpowder, +/turf/open/indestructible/hotelwood, +/area/deathmatch) +"dp" = ( +/obj/item/food/grown/wheat{ + pixel_y = 4; + pixel_x = 7 + }, +/obj/item/food/grown/wheat{ + pixel_y = 17; + pixel_x = -12 + }, +/obj/item/reagent_containers/cup/bucket/wooden{ + pixel_y = -1; + pixel_x = -9 + }, +/turf/open/misc/dirt, +/area/deathmatch) +"dr" = ( +/obj/structure/closet/crate/wooden, +/obj/item/throwing_star, +/obj/item/stack/medical/suture, +/obj/machinery/light, +/turf/open/floor/wood/large, +/area/deathmatch) +"dy" = ( +/obj/structure/headpike/bamboo, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"dI" = ( +/obj/machinery/light/floor{ + pixel_x = 16; + pixel_y = -17 + }, +/turf/open/water, +/area/deathmatch) +"el" = ( +/obj/structure/flora/bush/flowers_yw, +/turf/open/misc/grass, +/area/deathmatch) +"fk" = ( +/obj/item/storage/box/matches, +/turf/open/floor/bamboo, +/area/deathmatch) +"fn" = ( +/obj/structure/flora/tree/jungle/style_random, +/turf/open/misc/grass, +/area/deathmatch) +"fs" = ( +/obj/structure/chair/stool/bamboo{ + dir = 4 + }, +/obj/item/gun/syringe/blowgun, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"fD" = ( +/obj/structure/flora/bush/stalky/style_random, +/turf/open/misc/grass, +/area/deathmatch) +"gH" = ( +/turf/open/floor/engine/cult, +/area/deathmatch) +"ha" = ( +/obj/item/kirbyplants{ + icon_state = "plant-10" + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/bamboo/tatami/purple, +/area/deathmatch) +"iq" = ( +/turf/open/floor/carpet/green, +/area/deathmatch) +"iI" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/mortar, +/obj/item/pestle, +/turf/open/floor/wood/large, +/area/deathmatch) +"iL" = ( +/obj/structure/flora/bush/leavy/style_2, +/turf/open/misc/grass, +/area/deathmatch) +"jc" = ( +/obj/structure/table/wood, +/obj/item/food/fishmeat/carp{ + pixel_y = 8 + }, +/obj/item/food/fishmeat/carp, +/turf/open/floor/stone, +/area/deathmatch) +"kY" = ( +/obj/structure/flora/bush/flowers_br/style_random, +/turf/open/misc/grass, +/area/deathmatch) +"lr" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/deathmatch) +"lA" = ( +/obj/structure/statue/bone/skull, +/obj/item/clothing/suit/hooded/cultrobes/hardened, +/turf/open/floor/engine/cult, +/area/deathmatch) +"lD" = ( +/obj/structure/table/wood, +/obj/item/food/vegetariansushislice{ + pixel_y = 9; + pixel_x = 5 + }, +/obj/item/food/vegetariansushislice{ + pixel_y = 5 + }, +/obj/item/food/vegetariansushislice{ + pixel_x = -5 + }, +/obj/item/throwing_star{ + pixel_x = 8; + pixel_y = -2 + }, +/turf/open/floor/wood/tile, +/area/deathmatch) +"lO" = ( +/obj/structure/flora/bush/generic, +/turf/open/misc/grass, +/area/deathmatch) +"ma" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible/hotelwood, +/area/deathmatch) +"mb" = ( +/obj/structure/flora/bush/sparsegrass, +/turf/open/misc/grass, +/area/deathmatch) +"mf" = ( +/obj/structure/flora/tree/jungle/style_3, +/turf/open/misc/grass, +/area/deathmatch) +"mt" = ( +/obj/structure/flora/tree/jungle/style_2, +/turf/open/misc/grass, +/area/deathmatch) +"mC" = ( +/obj/structure/table/wood, +/obj/item/food/sashimi, +/turf/open/floor/wood/tile, +/area/deathmatch) +"mT" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/engine/cult, +/area/deathmatch) +"nE" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/floor/bamboo/tatami, +/area/deathmatch) +"nU" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/barricade/wooden, +/turf/open/floor/wood/large, +/area/deathmatch) +"of" = ( +/obj/structure/flora/rock/pile/jungle, +/turf/open/water, +/area/deathmatch) +"oo" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/engine/cult, +/area/deathmatch) +"oy" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/bottle/potassium{ + pixel_y = 8; + pixel_x = 10 + }, +/obj/item/reagent_containers/cup/bottle/iron{ + pixel_y = 12; + pixel_x = -4 + }, +/obj/item/reagent_containers/cup/bottle/frostoil, +/turf/open/floor/bamboo, +/area/deathmatch) +"oN" = ( +/obj/item/stack/sheet/bone, +/turf/open/floor/bamboo, +/area/deathmatch) +"oR" = ( +/obj/structure/table/bronze, +/obj/item/nullrod/claymore/bostaff, +/obj/structure/window/spawner/directional/south, +/obj/structure/window/spawner/directional/west, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/stone, +/area/deathmatch) +"oX" = ( +/obj/structure/closet/crate/wooden, +/obj/item/stack/medical/bruise_pack{ + pixel_y = 8; + pixel_x = -6 + }, +/obj/item/food/grown/banana, +/turf/open/floor/wood/large, +/area/deathmatch) +"oY" = ( +/obj/item/food/grown/wheat{ + pixel_y = 4; + pixel_x = 7 + }, +/obj/item/food/grown/wheat{ + pixel_x = -8; + pixel_y = 10 + }, +/obj/item/food/grown/wheat{ + pixel_x = -10 + }, +/turf/open/misc/dirt, +/area/deathmatch) +"pG" = ( +/turf/open/floor/wood/large, +/area/deathmatch) +"pV" = ( +/obj/structure/fermenting_barrel/gunpowder, +/turf/open/floor/wood/large, +/area/deathmatch) +"qo" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/misc/grass, +/area/deathmatch) +"qu" = ( +/obj/structure/table/wood, +/obj/item/retractor, +/obj/item/stack/medical/gauze{ + pixel_x = 4; + pixel_y = 1 + }, +/turf/open/floor/wood/large, +/area/deathmatch) +"qI" = ( +/obj/item/knife/ritual, +/turf/open/floor/engine/cult, +/area/deathmatch) +"rl" = ( +/obj/structure/table/wood/fancy, +/obj/item/clothing/head/costume/crown, +/turf/open/floor/carpet, +/area/deathmatch) +"rP" = ( +/obj/structure/table/bronze, +/obj/item/flashlight/lantern{ + light_on = 1 + }, +/obj/machinery/light, +/turf/open/floor/stone, +/area/deathmatch) +"rU" = ( +/obj/item/food/meat/slab/human{ + pixel_x = -7; + pixel_y = -5 + }, +/obj/item/food/meat/slab/gondola, +/obj/structure/bonfire/prelit, +/turf/open/indestructible/necropolis, +/area/deathmatch) +"sa" = ( +/obj/item/clothing/head/costume/rice_hat, +/obj/item/hatchet/wooden, +/obj/structure/bed/maint, +/turf/open/floor/wood/large, +/area/deathmatch) +"so" = ( +/obj/machinery/light, +/turf/open/floor/bamboo, +/area/deathmatch) +"tM" = ( +/obj/structure/flora/bush/flowers_pp/style_random, +/turf/open/misc/grass, +/area/deathmatch) +"tT" = ( +/obj/structure/chair/stool/bamboo{ + dir = 4 + }, +/turf/open/floor/bamboo/tatami, +/area/deathmatch) +"uc" = ( +/obj/structure/flora/bush/leafy, +/turf/open/misc/grass, +/area/deathmatch) +"ui" = ( +/turf/open/floor/bamboo/tatami, +/area/deathmatch) +"ut" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/item/clothing/shoes/cult/alt, +/turf/open/floor/engine/cult, +/area/deathmatch) +"uP" = ( +/mob/living/basic/cow, +/obj/machinery/light, +/turf/open/misc/dirt, +/area/deathmatch) +"vC" = ( +/obj/structure/mineral_door/paperframe, +/turf/open/floor/wood/large, +/area/deathmatch) +"wF" = ( +/obj/structure/flora/bush/flowers_yw/style_2, +/turf/open/misc/grass, +/area/deathmatch) +"xk" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/floor/bamboo, +/area/deathmatch) +"xm" = ( +/obj/machinery/light, +/turf/open/water, +/area/deathmatch) +"xz" = ( +/turf/open/lava/smooth, +/area/deathmatch) +"xJ" = ( +/obj/structure/table/wood, +/obj/item/stack/medical/poultice, +/obj/item/stack/medical/poultice{ + pixel_x = 8; + pixel_y = -3 + }, +/obj/item/stack/medical/aloe{ + pixel_x = -9; + pixel_y = 8 + }, +/obj/item/stack/medical/aloe{ + pixel_x = -10; + pixel_y = 12 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/bamboo, +/area/deathmatch) +"yl" = ( +/obj/structure/chair/stool/bamboo{ + dir = 4 + }, +/obj/item/reagent_containers/syringe/crude{ + pixel_y = -1 + }, +/obj/item/reagent_containers/syringe/crude{ + pixel_y = 3 + }, +/obj/item/reagent_containers/syringe/crude{ + pixel_y = -4 + }, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"yz" = ( +/obj/structure/flora/bush/flowers_pp, +/obj/item/food/pie/cream, +/obj/item/clothing/mask/gas/clown_hat, +/turf/open/misc/grass, +/area/deathmatch) +"yA" = ( +/obj/structure/flora/rock/pile/jungle/large, +/obj/machinery/light/floor, +/turf/open/water, +/area/deathmatch) +"yE" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"yI" = ( +/obj/structure/barricade/wooden/crude, +/obj/structure/mineral_door/paperframe, +/turf/open/floor/engine/cult, +/area/deathmatch) +"yL" = ( +/obj/structure/table/bronze, +/obj/item/throwing_star{ + pixel_x = 2 + }, +/obj/structure/window/spawner/directional/east, +/obj/structure/window/spawner/directional/north, +/obj/item/throwing_star{ + pixel_x = -9; + pixel_y = 3 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/stone, +/area/deathmatch) +"zb" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/item/bedsheet/cult, +/turf/open/floor/engine/cult, +/area/deathmatch) +"zu" = ( +/obj/structure/barricade/wooden, +/turf/open/floor/wood/large, +/area/deathmatch) +"zE" = ( +/obj/structure/table/wood, +/obj/item/stack/medical/ointment{ + pixel_y = 6; + pixel_x = 12 + }, +/obj/item/stack/medical/ointment{ + pixel_y = 2; + pixel_x = 12 + }, +/obj/item/stack/medical/suture/medicated, +/obj/item/stack/medical/suture/medicated{ + pixel_y = -4 + }, +/turf/open/floor/bamboo, +/area/deathmatch) +"zG" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/bamboo, +/area/deathmatch) +"zV" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/indestructible/hotelwood, +/area/deathmatch) +"Az" = ( +/obj/structure/flora/bush/reed, +/turf/open/water, +/area/deathmatch) +"Bn" = ( +/obj/structure/mineral_door/paperframe, +/obj/structure/barricade/wooden/crude, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/engine/cult, +/area/deathmatch) +"Cr" = ( +/obj/item/sharpener, +/obj/structure/window/spawner/directional/east, +/obj/structure/window/spawner/directional/north, +/obj/structure/window/spawner/directional/west, +/turf/open/water, +/area/deathmatch) +"DD" = ( +/obj/structure/closet/cabinet, +/obj/item/throwing_star{ + pixel_x = 2 + }, +/obj/item/clothing/suit/hooded/chaplainsuit/monkhabit, +/turf/open/floor/wood/large, +/area/deathmatch) +"Ea" = ( +/obj/structure/table/wood, +/obj/item/knife/butcher, +/turf/open/floor/stone, +/area/deathmatch) +"EJ" = ( +/obj/structure/flora/bush/flowers_br/style_random, +/obj/machinery/light, +/turf/open/misc/grass, +/area/deathmatch) +"Fl" = ( +/obj/structure/window/spawner/directional/east, +/obj/structure/window/spawner/directional/south, +/obj/structure/window/spawner/directional/west, +/turf/open/water, +/area/deathmatch) +"Fu" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/deathmatch) +"FV" = ( +/obj/structure/table/wood, +/obj/item/food/nigiri_sushi{ + pixel_y = 5; + pixel_x = -7 + }, +/obj/item/food/nigiri_sushi, +/turf/open/floor/wood/tile, +/area/deathmatch) +"Gf" = ( +/obj/structure/flora/bush/flowers_pp, +/turf/open/misc/grass, +/area/deathmatch) +"Gv" = ( +/obj/structure/chair/stool/bamboo{ + dir = 4 + }, +/obj/item/clothing/suit/armor/bone, +/obj/item/clothing/accessory/talisman, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"GQ" = ( +/obj/structure/closet/crate/coffin, +/obj/item/toy/plush/lizard_plushie/green, +/obj/structure/window/spawner/directional/east, +/obj/structure/window/spawner/directional/west, +/obj/structure/window/spawner/directional/north, +/turf/open/floor/carpet, +/area/deathmatch) +"GX" = ( +/turf/open/misc/grass/jungle, +/area/deathmatch) +"JP" = ( +/obj/structure/table/bronze, +/obj/item/restraints/legcuffs/bola/tactical, +/obj/structure/window/spawner/directional/north, +/obj/structure/window/spawner/directional/west, +/turf/open/floor/stone, +/area/deathmatch) +"Kd" = ( +/turf/open/floor/bamboo, +/area/deathmatch) +"Kx" = ( +/obj/structure/fermenting_barrel/gunpowder, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/deathmatch) +"KM" = ( +/obj/item/flashlight/lantern{ + light_on = 1 + }, +/obj/structure/table/bronze, +/obj/machinery/light, +/turf/open/floor/stone, +/area/deathmatch) +"KN" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/indestructible/hotelwood, +/area/deathmatch) +"LN" = ( +/obj/structure/closet/cabinet, +/mob/living/carbon/human/species/monkey/angry, +/obj/item/nullrod/tribal_knife, +/turf/open/floor/wood/large, +/area/deathmatch) +"MN" = ( +/obj/structure/flora/bush/flowers_yw/style_random, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/misc/grass, +/area/deathmatch) +"Na" = ( +/turf/open/misc/dirt, +/area/deathmatch) +"Nn" = ( +/obj/structure/flora/bush/flowers_br/style_random, +/obj/item/cultivator/rake, +/turf/open/misc/grass, +/area/deathmatch) +"No" = ( +/turf/open/water, +/area/deathmatch) +"NJ" = ( +/obj/structure/table/bronze, +/obj/item/clothing/suit/armor/riot/knight, +/obj/item/clothing/head/helmet/knight, +/obj/structure/window/spawner/directional/east, +/obj/structure/window/spawner/directional/south, +/turf/open/floor/stone, +/area/deathmatch) +"Op" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/floor/wood/large, +/area/deathmatch) +"OA" = ( +/obj/item/clothing/shoes/cowboy, +/turf/open/misc/dirt, +/area/deathmatch) +"OV" = ( +/obj/structure/chair/stool/bamboo{ + dir = 4 + }, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/floor/bamboo/tatami, +/area/deathmatch) +"Pk" = ( +/obj/structure/flora/bush/leavy/style_random, +/turf/open/misc/grass, +/area/deathmatch) +"Py" = ( +/obj/structure/flora/rock/pile/jungle/style_random{ + pixel_x = -12; + pixel_y = 15 + }, +/turf/open/water, +/area/deathmatch) +"PE" = ( +/obj/structure/water_source/puddle, +/turf/open/misc/dirt, +/area/deathmatch) +"PF" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/structure/statue/bone/rib{ + dir = 8 + }, +/obj/machinery/light/floor{ + pixel_y = -8; + pixel_x = -4 + }, +/turf/open/floor/engine/cult, +/area/deathmatch) +"PN" = ( +/obj/effect/mob_spawn/corpse/human, +/obj/structure/bonfire/prelit, +/turf/open/indestructible/necropolis, +/area/deathmatch) +"PP" = ( +/turf/open/misc/grass, +/area/deathmatch) +"Qb" = ( +/turf/open/floor/stone, +/area/deathmatch) +"Qp" = ( +/obj/structure/flora/bush/flowers_yw/style_random, +/turf/open/misc/grass, +/area/deathmatch) +"QC" = ( +/turf/open/floor/wood/tile, +/area/deathmatch) +"QG" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/glass/bottle/sake{ + pixel_x = -6; + pixel_y = 17 + }, +/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ + pixel_y = 3; + pixel_x = 7 + }, +/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ + pixel_y = -1; + pixel_x = -3 + }, +/turf/open/floor/wood/tile, +/area/deathmatch) +"RI" = ( +/obj/structure/punji_sticks, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"RR" = ( +/obj/item/stack/sheet/bone, +/turf/open/misc/grass/jungle, +/area/deathmatch) +"Su" = ( +/obj/structure/flora/rock/pile/jungle/style_3, +/obj/machinery/light/floor, +/turf/open/water, +/area/deathmatch) +"SJ" = ( +/obj/item/kirbyplants{ + icon_state = "plant-10" + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/bamboo/tatami/purple, +/area/deathmatch) +"SO" = ( +/obj/item/grown/bananapeel, +/turf/open/floor/wood/large, +/area/deathmatch) +"TW" = ( +/obj/structure/table/bronze, +/obj/item/flashlight/lantern{ + light_on = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/stone, +/area/deathmatch) +"Uk" = ( +/obj/structure/closet/crate/coffin, +/obj/item/organ/internal/cyberimp/arm/shard/katana, +/obj/structure/window/spawner/directional/east, +/obj/structure/window/spawner/directional/west, +/obj/structure/window/spawner/directional/south, +/turf/open/floor/carpet, +/area/deathmatch) +"UO" = ( +/turf/open/floor/carpet, +/area/deathmatch) +"UU" = ( +/obj/item/kirbyplants{ + icon_state = "plant-10" + }, +/turf/open/floor/wood/tile, +/area/deathmatch) +"UY" = ( +/obj/structure/flora/bush/leavy, +/turf/open/misc/grass, +/area/deathmatch) +"Vi" = ( +/obj/item/food/grown/wheat{ + pixel_y = 10; + pixel_x = -6 + }, +/obj/item/food/grown/wheat{ + pixel_x = 4 + }, +/obj/item/food/grown/wheat{ + pixel_x = -10 + }, +/turf/open/misc/dirt, +/area/deathmatch) +"Vm" = ( +/obj/structure/table/wood, +/obj/item/food/vegetariansushiroll{ + pixel_y = 2; + pixel_x = 4 + }, +/obj/item/food/vegetariansushiroll, +/turf/open/floor/stone, +/area/deathmatch) +"Vt" = ( +/turf/closed/indestructible/wood, +/area/deathmatch) +"VA" = ( +/obj/structure/table/wood/fancy, +/obj/item/clothing/mask/gas/tiki_mask, +/obj/item/flashlight/flare/torch, +/turf/open/floor/carpet, +/area/deathmatch) +"We" = ( +/obj/structure/statue/bone/rib{ + dir = 8 + }, +/turf/open/floor/engine/cult, +/area/deathmatch) +"Ya" = ( +/obj/structure/table/wood, +/obj/structure/chem_separator, +/turf/open/floor/bamboo, +/area/deathmatch) +"Yo" = ( +/obj/item/kirbyplants{ + icon_state = "plant-10" + }, +/turf/open/floor/stone, +/area/deathmatch) +"Zm" = ( +/obj/item/toy/plush/carpplushie/dehy_carp, +/obj/structure/window/spawner/directional/east, +/obj/structure/window/spawner/directional/west, +/turf/open/water, +/area/deathmatch) +"Zu" = ( +/obj/structure/statue/bone/rib, +/turf/open/floor/engine/cult, +/area/deathmatch) + +(1,1,1) = {" +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +"} +(2,1,1) = {" +Vt +UU +Cr +Zm +Fl +UU +Vt +oX +Kx +Vt +dy +ce +Gv +yl +fs +dy +Vt +Fu +pG +Vt +pG +pG +nU +Na +OA +Vt +"} +(3,1,1) = {" +Vt +QC +QC +QC +QC +QC +vC +pG +pG +bd +RI +Kd +Kd +Kd +oN +yE +bd +pG +pG +vC +pG +pG +nU +Na +uP +Vt +"} +(4,1,1) = {" +Vt +zG +Kd +Kd +Kd +so +Vt +pG +pG +bd +GX +Kd +PN +rU +Kd +GX +bd +pG +pG +Vt +Fu +pG +Vt +Vt +Vt +Vt +"} +(5,1,1) = {" +Vt +Kd +Ea +jc +Vm +Kd +zu +pG +pG +bd +RR +fk +Kd +Kd +Kd +RI +bd +pG +pG +Vt +pG +pG +pG +pG +dr +Vt +"} +(6,1,1) = {" +Vt +Kd +Kd +xk +Kd +Kd +Vt +pG +pG +Vt +dy +GX +GX +GX +GX +dy +Vt +Fu +pG +zu +pG +Op +pG +pV +sa +Vt +"} +(7,1,1) = {" +Vt +QG +FV +QG +lD +mC +Vt +Kd +Kd +Vt +Vt +zu +Vt +Vt +zu +Vt +Vt +Kd +Kd +Vt +vC +Vt +Vt +zu +Vt +Vt +"} +(8,1,1) = {" +Vt +ui +tT +ui +OV +ui +ha +ui +ui +ha +ui +ui +ui +ui +ui +ui +ha +ui +ui +ha +ui +ui +ui +ui +ui +Vt +"} +(9,1,1) = {" +Vt +MN +PP +wF +Gf +PP +tM +PP +PP +PP +PP +Gf +PP +cr +PP +Qp +PP +PP +PP +mb +PP +Nn +Vi +dp +PE +Vt +"} +(10,1,1) = {" +Vt +No +No +PP +tM +fn +fD +zV +KN +mb +Az +No +No +No +No +cr +el +zV +KN +lO +kY +oY +No +No +xm +Vt +"} +(11,1,1) = {" +Vt +No +No +No +No +yz +No +zV +KN +No +No +No +No +of +Su +No +No +ma +KN +No +No +No +No +No +No +Vt +"} +(12,1,1) = {" +Vt +fD +tM +Az +dI +No +No +zV +KN +No +No +kY +No +No +yA +No +No +dm +KN +No +No +No +cr +PP +PP +Vt +"} +(13,1,1) = {" +Vt +el +UY +PP +No +Py +No +zV +KN +PP +Gf +Gf +mt +No +No +No +mb +zV +KN +PP +PP +PP +PP +mf +EJ +Vt +"} +(14,1,1) = {" +Vt +qo +PP +Qp +iL +cr +mb +PP +PP +PP +PP +PP +PP +uc +Pk +PP +kY +PP +PP +PP +PP +PP +PP +kY +PP +Vt +"} +(15,1,1) = {" +Vt +ui +ui +ui +ui +ui +SJ +ui +ui +SJ +ui +ui +nE +ui +ui +ui +SJ +ui +ui +SJ +ui +ui +ui +ui +ui +Vt +"} +(16,1,1) = {" +Vt +Vt +zu +vC +vC +vC +Vt +Kd +Kd +Vt +Vt +zu +Vt +Vt +zu +Vt +Vt +Kd +Kd +Vt +Vt +Vt +Bn +Vt +Vt +Vt +"} +(17,1,1) = {" +Vt +zE +pG +pG +pG +pG +Vt +pG +pG +Vt +TW +Qb +yL +NJ +Yo +KM +Vt +pG +Op +Vt +xz +mT +gH +ut +xz +Vt +"} +(18,1,1) = {" +Vt +xJ +pG +Kd +Kd +pG +Vt +pG +pG +Kd +iq +iq +iq +iq +iq +iq +Kd +pG +pG +Vt +gH +PF +gH +We +gH +Vt +"} +(19,1,1) = {" +Vt +Ya +pG +iI +qu +pG +vC +pG +Op +Kd +UO +VA +GQ +Uk +rl +UO +Kd +pG +pG +yI +gH +gH +qI +gH +gH +Vt +"} +(20,1,1) = {" +Vt +ch +pG +Kd +Kd +pG +Vt +pG +pG +Kd +iq +iq +iq +iq +iq +iq +Kd +SO +pG +Vt +gH +Zu +gH +lA +oo +Vt +"} +(21,1,1) = {" +Vt +oy +pG +lr +pG +pG +zu +lr +pG +Vt +TW +Qb +JP +oR +Qb +rP +Vt +LN +DD +Vt +xz +zb +gH +mT +xz +Vt +"} +(22,1,1) = {" +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +Vt +"} diff --git a/_maps/map_files/Deathmatch/instagib.dmm b/_maps/map_files/Deathmatch/instagib.dmm new file mode 100644 index 00000000000..915aa9338da --- /dev/null +++ b/_maps/map_files/Deathmatch/instagib.dmm @@ -0,0 +1,808 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/closed/wall/mineral/titanium, +/area/deathmatch/fullbright) +"c" = ( +/turf/open/floor/light/colour_cycle/dancefloor_b, +/area/deathmatch/fullbright) +"e" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/circuit/green, +/area/deathmatch/fullbright) +"q" = ( +/obj/machinery/door/airlock/titanium/glass, +/turf/open/floor/mineral/abductor, +/area/deathmatch/fullbright) +"u" = ( +/turf/template_noop, +/area/template_noop) +"v" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/circuit/green, +/area/deathmatch/fullbright) +"y" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/circuit/green, +/area/deathmatch/fullbright) +"A" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/vault/alien, +/area/deathmatch/fullbright) +"B" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/vault/alien, +/area/deathmatch/fullbright) +"C" = ( +/turf/open/floor/circuit/green, +/area/deathmatch/fullbright) +"D" = ( +/turf/closed/indestructible/alien, +/area/deathmatch/fullbright) +"E" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/vault/alien, +/area/deathmatch/fullbright) +"F" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/obj/machinery/light/floor, +/turf/open/floor/vault/alien, +/area/deathmatch/fullbright) +"H" = ( +/turf/open/floor/vault/alien, +/area/deathmatch/fullbright) +"I" = ( +/obj/machinery/light, +/turf/open/floor/vault/alien, +/area/deathmatch/fullbright) +"L" = ( +/obj/machinery/light, +/turf/open/floor/circuit/green, +/area/deathmatch/fullbright) +"N" = ( +/obj/machinery/door/airlock/titanium/glass, +/turf/open/floor/plating/abductor2, +/area/deathmatch/fullbright) +"Y" = ( +/turf/open/floor/light/colour_cycle/dancefloor_a, +/area/deathmatch/fullbright) + +(1,1,1) = {" +u +u +D +D +D +D +D +D +D +D +D +D +D +D +D +D +D +D +D +D +D +D +D +D +u +u +"} +(2,1,1) = {" +u +D +D +H +H +H +H +H +H +H +N +Y +Y +Y +Y +N +H +H +H +H +H +H +H +D +D +u +"} +(3,1,1) = {" +D +D +H +H +H +H +H +H +H +H +N +Y +Y +Y +Y +N +H +H +H +H +H +H +H +H +D +D +"} +(4,1,1) = {" +D +H +H +F +H +a +a +H +H +I +a +Y +Y +Y +Y +a +E +H +H +a +a +H +F +H +H +D +"} +(5,1,1) = {" +D +H +H +H +H +H +B +H +H +H +H +a +Y +Y +a +H +H +H +H +B +H +H +H +H +H +D +"} +(6,1,1) = {" +D +H +H +a +H +H +H +H +H +H +H +H +a +a +H +H +H +H +H +H +H +H +a +H +H +D +"} +(7,1,1) = {" +D +H +H +a +E +H +H +H +a +H +H +H +H +H +H +H +H +a +H +H +H +I +a +H +H +D +"} +(8,1,1) = {" +D +H +H +H +H +H +H +a +E +H +H +v +C +C +v +H +H +I +a +H +H +H +H +H +H +D +"} +(9,1,1) = {" +D +H +H +H +H +H +a +B +F +C +C +a +q +q +a +C +H +F +B +a +H +H +H +H +H +D +"} +(10,1,1) = {" +D +H +H +A +H +H +H +H +H +C +a +c +c +c +c +a +C +C +H +H +H +H +A +H +H +D +"} +(11,1,1) = {" +D +N +N +a +H +H +H +H +C +a +c +c +c +c +c +c +a +C +H +H +H +H +a +N +N +D +"} +(12,1,1) = {" +D +Y +Y +Y +a +H +H +L +a +c +c +c +c +c +c +c +c +a +y +H +H +a +Y +Y +Y +D +"} +(13,1,1) = {" +D +Y +Y +Y +Y +a +H +C +q +c +c +c +c +c +c +c +c +q +C +H +a +Y +Y +Y +Y +D +"} +(14,1,1) = {" +D +Y +Y +Y +Y +a +H +C +q +c +c +c +c +c +c +c +c +q +C +H +a +Y +Y +Y +Y +D +"} +(15,1,1) = {" +D +Y +Y +Y +a +H +H +L +a +c +c +c +c +c +c +c +c +a +y +H +H +a +Y +Y +Y +D +"} +(16,1,1) = {" +D +N +N +a +H +H +H +H +C +a +c +c +c +c +c +c +a +C +H +H +H +H +a +N +N +D +"} +(17,1,1) = {" +D +H +H +B +H +H +H +H +H +C +a +c +c +c +c +a +C +H +H +H +H +H +B +H +H +D +"} +(18,1,1) = {" +D +H +H +H +H +H +a +A +F +C +C +a +q +q +a +C +C +F +A +a +H +H +H +H +H +D +"} +(19,1,1) = {" +D +H +H +H +H +H +H +a +E +H +H +e +C +C +e +H +H +I +a +H +H +H +H +H +H +D +"} +(20,1,1) = {" +D +H +H +a +E +H +H +H +a +H +H +H +H +H +H +H +H +a +H +H +H +I +a +H +H +D +"} +(21,1,1) = {" +D +H +H +a +H +H +H +H +H +H +H +H +a +a +H +H +H +H +H +H +H +H +a +H +H +D +"} +(22,1,1) = {" +D +H +H +H +H +H +A +H +H +H +H +a +Y +Y +a +H +H +H +H +A +H +H +H +H +H +D +"} +(23,1,1) = {" +D +H +H +F +H +a +a +H +H +I +a +Y +Y +Y +Y +a +E +H +H +a +a +H +F +H +H +D +"} +(24,1,1) = {" +D +D +H +H +H +H +H +H +H +H +N +Y +Y +Y +Y +N +H +H +H +H +H +H +H +H +D +D +"} +(25,1,1) = {" +u +D +D +H +H +H +H +H +H +H +N +Y +Y +Y +Y +N +H +H +H +H +H +H +H +D +D +u +"} +(26,1,1) = {" +u +u +D +D +D +D +D +D +D +D +D +D +D +D +D +D +D +D +D +D +D +D +D +D +u +u +"} diff --git a/_maps/map_files/Deathmatch/meatower.dmm b/_maps/map_files/Deathmatch/meatower.dmm new file mode 100644 index 00000000000..47613f89885 --- /dev/null +++ b/_maps/map_files/Deathmatch/meatower.dmm @@ -0,0 +1,1105 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aD" = ( +/obj/machinery/conveyor/auto, +/obj/item/food/meat/slab/human/mutant/skeleton, +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"db" = ( +/obj/machinery/griddle, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"et" = ( +/obj/machinery/conveyor/auto{ + dir = 4 + }, +/obj/item/food/meat/slab/corgi, +/obj/effect/turf_decal/siding/dark{ + dir = 1 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"eB" = ( +/obj/machinery/light{ + dir = 4 + }, +/mob/living/basic/goat/pete, +/turf/open/indestructible/necropolis/air, +/area/deathmatch) +"eH" = ( +/obj/structure/reagent_dispensers/cooking_oil, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/indestructible/necropolis/air, +/area/deathmatch) +"fq" = ( +/obj/structure/table, +/obj/machinery/microwave, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"fU" = ( +/obj/machinery/conveyor/auto{ + dir = 4 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 1 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"gh" = ( +/obj/machinery/deepfryer, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"gk" = ( +/obj/machinery/conveyor/auto{ + dir = 1 + }, +/obj/item/food/pizza/meat, +/obj/effect/landmark/deathmatch_player_spawn, +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"gD" = ( +/obj/structure/table, +/obj/item/reagent_containers/condiment/saltshaker{ + pixel_x = -3 + }, +/obj/item/reagent_containers/condiment/peppermill{ + pixel_x = 3 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"gS" = ( +/turf/open/indestructible/necropolis/air, +/area/deathmatch) +"hz" = ( +/obj/machinery/conveyor/auto{ + dir = 1 + }, +/obj/item/food/meat/slab/human/mutant/skeleton, +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"ip" = ( +/obj/structure/table, +/obj/item/food/pizza/donkpocket, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"iZ" = ( +/obj/item/food/pizza/pineapple, +/turf/open/lava/smooth, +/area/deathmatch) +"jq" = ( +/obj/machinery/conveyor/auto{ + dir = 4 + }, +/obj/item/knife/butcher, +/obj/effect/turf_decal/siding/dark{ + dir = 1 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"jT" = ( +/obj/machinery/gibber, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/indestructible/necropolis/air, +/area/deathmatch) +"jZ" = ( +/obj/structure/sign/poster/contraband/moffuchis_pizza, +/turf/closed/indestructible/necropolis, +/area/deathmatch) +"kn" = ( +/obj/item/food/pizzaslice/sassysage, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"kL" = ( +/obj/machinery/light, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"lu" = ( +/obj/machinery/conveyor/auto{ + dir = 8 + }, +/obj/effect/landmark/deathmatch_player_spawn, +/obj/effect/turf_decal/siding/dark, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"me" = ( +/obj/machinery/conveyor/auto, +/obj/item/pizzabox/bomb, +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"mu" = ( +/obj/item/stack/sheet/pizza/five, +/turf/open/indestructible/necropolis/air, +/area/deathmatch) +"nl" = ( +/obj/machinery/conveyor/auto{ + dir = 1 + }, +/obj/item/pizzabox/mushroom, +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"nr" = ( +/obj/structure/table, +/obj/item/pizzabox/bomb/armed, +/obj/item/knife/butcher, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"nt" = ( +/obj/machinery/conveyor/auto{ + dir = 8 + }, +/obj/item/pizzabox/bomb/armed, +/obj/effect/turf_decal/siding/dark, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"oB" = ( +/obj/machinery/conveyor/auto, +/obj/item/food/meat/slab/human, +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"oH" = ( +/obj/machinery/conveyor/auto{ + dir = 8 + }, +/obj/effect/turf_decal/siding/dark, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"pg" = ( +/obj/machinery/vending/dinnerware, +/obj/machinery/light, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"pE" = ( +/obj/structure/table, +/obj/item/knife/butcher, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"pL" = ( +/obj/machinery/conveyor/auto{ + dir = 4 + }, +/obj/item/pizzabox/margherita/robo, +/obj/effect/turf_decal/siding/dark{ + dir = 1 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"qa" = ( +/obj/structure/table, +/obj/item/stack/sheet/animalhide/corgi, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"qg" = ( +/turf/closed/indestructible/reinforced, +/area/deathmatch) +"qL" = ( +/obj/machinery/conveyor/auto{ + dir = 6 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 5 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"rb" = ( +/obj/structure/table, +/obj/machinery/microwave, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"sf" = ( +/obj/machinery/conveyor/auto{ + dir = 1 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"sQ" = ( +/obj/structure/closet/crate/coffin, +/obj/item/gun/magic/hook, +/obj/item/book/manual/wiki/cooking_to_serve_man, +/turf/open/indestructible/necropolis/air, +/area/deathmatch) +"tB" = ( +/turf/open/indestructible/kitchen, +/area/deathmatch) +"uJ" = ( +/obj/item/food/meat/slab/corgi, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"uM" = ( +/obj/item/food/meat/slab/corgi, +/turf/open/indestructible/necropolis/air, +/area/deathmatch) +"uV" = ( +/obj/machinery/conveyor/auto{ + dir = 4 + }, +/obj/effect/landmark/deathmatch_player_spawn, +/obj/effect/turf_decal/siding/dark{ + dir = 1 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"uW" = ( +/obj/structure/reagent_dispensers/cooking_oil, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"wF" = ( +/obj/structure/kitchenspike, +/obj/item/food/pizza/arnold, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/indestructible/necropolis/air, +/area/deathmatch) +"zB" = ( +/obj/item/food/pizzaslice/meat, +/turf/open/indestructible/necropolis/air, +/area/deathmatch) +"zH" = ( +/obj/structure/table, +/obj/item/pizzabox/margherita, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"zR" = ( +/obj/structure/table, +/obj/item/pizzabox/bomb/armed, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"Ce" = ( +/obj/machinery/conveyor/auto{ + dir = 9 + }, +/obj/item/food/meat/slab/human, +/obj/effect/turf_decal/siding/dark{ + dir = 10 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"Ch" = ( +/obj/structure/table, +/obj/item/pizzabox, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"DJ" = ( +/obj/machinery/conveyor/auto{ + dir = 8 + }, +/obj/item/food/meat/slab/human/mutant/slime, +/obj/effect/turf_decal/siding/dark, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"DU" = ( +/obj/machinery/conveyor/auto, +/obj/item/food/meat/slab/corgi, +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"EC" = ( +/obj/machinery/conveyor/auto, +/obj/item/food/pizzaslice/arnold, +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"EU" = ( +/obj/item/food/pizzaslice/moldy/bacteria, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"Fs" = ( +/obj/structure/barricade/wooden/crude, +/obj/structure/barricade/wooden, +/turf/open/indestructible/necropolis/air, +/area/deathmatch) +"FA" = ( +/turf/open/lava/smooth, +/area/deathmatch) +"Ge" = ( +/obj/machinery/conveyor/auto{ + dir = 10 + }, +/obj/item/food/meat/slab/human, +/obj/effect/turf_decal/siding/dark{ + dir = 6 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"GS" = ( +/obj/item/food/pizzaslice/ants, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"Hg" = ( +/obj/machinery/oven, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"Hj" = ( +/obj/machinery/conveyor/auto, +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"Hx" = ( +/obj/structure/table, +/obj/item/food/pizzaslice/mothic_garlic, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"HR" = ( +/obj/machinery/conveyor/auto{ + dir = 8 + }, +/obj/item/food/meat/slab/gorilla, +/obj/effect/turf_decal/siding/dark, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"Io" = ( +/obj/machinery/conveyor/auto{ + dir = 4 + }, +/obj/item/food/meat/slab/gorilla, +/obj/effect/turf_decal/siding/dark{ + dir = 1 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"Jo" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"KO" = ( +/obj/machinery/vending/dinnerware, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"KP" = ( +/obj/structure/table, +/obj/structure/desk_bell{ + pixel_x = 7 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"KW" = ( +/obj/structure/sign/poster/contraband/pizza_imperator, +/turf/closed/indestructible/necropolis, +/area/deathmatch) +"KZ" = ( +/obj/machinery/griddle, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"La" = ( +/obj/machinery/conveyor/auto{ + dir = 4 + }, +/obj/item/food/meat/slab/gondola, +/obj/effect/turf_decal/siding/dark{ + dir = 1 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"Lg" = ( +/obj/structure/barricade/wooden, +/obj/structure/barricade/wooden/crude, +/turf/open/indestructible/necropolis/air, +/area/deathmatch) +"Lo" = ( +/obj/machinery/conveyor/auto, +/obj/item/pizzabox/vegetable, +/obj/effect/landmark/deathmatch_player_spawn, +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"Mn" = ( +/obj/machinery/conveyor/auto{ + dir = 5 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 9 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"Mr" = ( +/obj/machinery/deepfryer, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"NF" = ( +/obj/machinery/conveyor/auto{ + dir = 1 + }, +/obj/item/food/meat/slab/human/mutant/slime, +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"NG" = ( +/obj/machinery/conveyor/auto{ + dir = 4 + }, +/obj/item/pizzabox/bomb/armed, +/obj/effect/turf_decal/siding/dark{ + dir = 1 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"Oq" = ( +/turf/closed/indestructible/necropolis, +/area/deathmatch) +"Tn" = ( +/obj/item/pizzabox/infinite, +/turf/open/indestructible/necropolis/air, +/area/deathmatch) +"Ue" = ( +/obj/item/food/pizzaslice/sassysage, +/turf/open/indestructible/necropolis/air, +/area/deathmatch) +"Up" = ( +/obj/structure/table, +/obj/machinery/reagentgrinder{ + pixel_x = 6; + pixel_y = 6 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"XA" = ( +/obj/structure/table, +/obj/machinery/reagentgrinder{ + pixel_x = 6; + pixel_y = 6 + }, +/obj/item/reagent_containers/condiment/saltshaker{ + pixel_x = -3 + }, +/obj/item/reagent_containers/condiment/peppermill{ + pixel_x = -9 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"XQ" = ( +/obj/machinery/conveyor/auto{ + dir = 4 + }, +/obj/structure/closet/secure_closet/freezer/meat, +/obj/item/toy/plush/lizard_plushie/green, +/obj/effect/turf_decal/siding/dark{ + dir = 1 + }, +/turf/open/indestructible/kitchen, +/area/deathmatch) +"XU" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/obj/machinery/light/floor, +/turf/open/indestructible/kitchen, +/area/deathmatch) + +(1,1,1) = {" +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +"} +(2,1,1) = {" +qg +FA +FA +FA +FA +FA +FA +FA +FA +FA +FA +FA +FA +FA +FA +FA +FA +FA +FA +FA +FA +iZ +qg +"} +(3,1,1) = {" +qg +FA +Mn +sf +sf +NF +sf +sf +sf +sf +sf +gk +sf +sf +sf +hz +sf +nl +sf +sf +Ce +FA +qg +"} +(4,1,1) = {" +qg +FA +pL +tB +zR +gD +db +tB +uJ +tB +tB +tB +tB +GS +tB +zR +Up +db +tB +uW +oH +FA +qg +"} +(5,1,1) = {" +qg +FA +fU +tB +tB +XU +tB +tB +tB +tB +tB +tB +tB +tB +tB +tB +tB +tB +XU +qa +nt +FA +qg +"} +(6,1,1) = {" +qg +FA +Io +tB +tB +tB +tB +tB +Mr +Up +KP +tB +tB +tB +Mr +tB +tB +tB +tB +zR +oH +FA +qg +"} +(7,1,1) = {" +qg +FA +XQ +gh +tB +tB +tB +tB +Oq +Oq +Oq +gS +Oq +Oq +Oq +Ch +tB +tB +tB +tB +oH +FA +qg +"} +(8,1,1) = {" +qg +FA +fU +fq +tB +GS +pg +Oq +Oq +gS +gS +zB +gS +mu +Oq +Oq +db +tB +EU +tB +oH +FA +qg +"} +(9,1,1) = {" +qg +FA +fU +nr +tB +tB +Oq +Oq +eH +gS +Oq +gS +Oq +gS +jT +Oq +Oq +rb +tB +XA +HR +FA +qg +"} +(10,1,1) = {" +qg +FA +La +db +tB +tB +Oq +mu +gS +gS +gS +gS +gS +gS +gS +gS +Oq +gh +tB +pE +oH +FA +qg +"} +(11,1,1) = {" +qg +FA +fU +tB +tB +tB +Oq +gS +Oq +gS +KW +Lg +Oq +gS +Oq +uM +Oq +tB +tB +tB +oH +FA +qg +"} +(12,1,1) = {" +qg +FA +uV +kn +tB +tB +gS +gS +gS +Tn +Fs +sQ +Fs +gS +gS +gS +gS +tB +tB +tB +lu +FA +qg +"} +(13,1,1) = {" +qg +FA +fU +tB +tB +tB +Oq +gS +Oq +gS +Oq +Lg +jZ +gS +Oq +gS +Oq +Hx +tB +tB +DJ +FA +qg +"} +(14,1,1) = {" +qg +FA +jq +tB +tB +tB +Oq +gS +gS +Ue +gS +gS +gS +gS +gS +gS +Oq +zH +tB +tB +oH +FA +qg +"} +(15,1,1) = {" +qg +FA +fU +tB +tB +kL +Oq +Oq +eB +gS +Oq +gS +Oq +gS +wF +Oq +Oq +KZ +tB +tB +oH +FA +qg +"} +(16,1,1) = {" +qg +FA +NG +tB +tB +tB +gh +Oq +Oq +mu +gS +gS +gS +gS +Oq +Oq +gh +tB +tB +tB +oH +FA +qg +"} +(17,1,1) = {" +qg +FA +fU +tB +fq +tB +tB +Hg +Oq +Oq +Oq +gS +Oq +Oq +Oq +tB +tB +tB +tB +KO +oH +FA +qg +"} +(18,1,1) = {" +qg +FA +et +tB +ip +tB +tB +tB +Jo +tB +tB +tB +tB +GS +Jo +tB +Hg +tB +tB +KP +oH +FA +qg +"} +(19,1,1) = {" +qg +FA +fU +tB +tB +XU +tB +tB +tB +tB +tB +tB +tB +tB +tB +tB +db +tB +XU +pE +oH +FA +qg +"} +(20,1,1) = {" +qg +FA +fU +tB +tB +tB +tB +tB +tB +tB +db +zR +Up +tB +tB +tB +KP +tB +tB +tB +oH +FA +qg +"} +(21,1,1) = {" +qg +FA +qL +Hj +Hj +aD +Hj +EC +Hj +DU +Hj +Lo +Hj +Hj +oB +Hj +Hj +me +Hj +Hj +Ge +FA +qg +"} +(22,1,1) = {" +qg +FA +FA +FA +FA +FA +FA +FA +FA +FA +FA +FA +FA +FA +FA +FA +FA +FA +FA +FA +FA +FA +qg +"} +(23,1,1) = {" +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +qg +"} diff --git a/_maps/map_files/Deathmatch/mech_madness.dmm b/_maps/map_files/Deathmatch/mech_madness.dmm new file mode 100644 index 00000000000..d36ccfb16cc --- /dev/null +++ b/_maps/map_files/Deathmatch/mech_madness.dmm @@ -0,0 +1,1649 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"ac" = ( +/turf/closed/indestructible/alien, +/area/deathmatch) +"ad" = ( +/obj/structure/table/reinforced, +/obj/item/mecha_ammo/lmg, +/obj/item/mecha_ammo/lmg{ + pixel_y = 12 + }, +/obj/item/mecha_ammo/scattershot{ + pixel_y = 18 + }, +/obj/item/mecha_ammo/scattershot{ + pixel_y = 24 + }, +/turf/open/floor/carpet/neon/simple/yellow, +/area/deathmatch) +"ae" = ( +/obj/machinery/door/poddoor/shutters{ + id = "dm4" + }, +/turf/open/floor/engine, +/area/deathmatch) +"af" = ( +/obj/machinery/button/door{ + id = "dm3"; + pixel_y = 24 + }, +/turf/open/floor/carpet/neon/simple/teal, +/area/deathmatch) +"aj" = ( +/turf/open/floor/engine, +/area/deathmatch) +"am" = ( +/turf/open/floor/carpet/neon/simple/green, +/area/deathmatch) +"an" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/head/utility/welding, +/obj/machinery/light/directional/west, +/obj/item/inducer, +/obj/item/weldingtool/largetank, +/turf/open/floor/carpet/neon/simple/yellow, +/area/deathmatch) +"ao" = ( +/obj/structure/table/reinforced, +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg{ + pixel_y = -8 + }, +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot{ + pixel_y = 8 + }, +/turf/open/floor/carpet/neon/simple/yellow, +/area/deathmatch) +"as" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/obj/effect/turf_decal/box, +/obj/machinery/button/door{ + id = "dm1"; + pixel_x = 24 + }, +/turf/open/floor/carpet/neon/simple/yellow, +/area/deathmatch) +"at" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/obj/effect/turf_decal/box, +/obj/machinery/button/door{ + id = "dm4"; + pixel_y = 0; + pixel_x = -24 + }, +/turf/open/floor/carpet/neon/simple/green, +/area/deathmatch) +"aw" = ( +/turf/open/floor/carpet/neon/simple/purple, +/area/deathmatch) +"ax" = ( +/turf/closed/wall/mineral/plastitanium, +/area/deathmatch) +"az" = ( +/obj/structure/tank_holder/extinguisher, +/turf/open/floor/carpet/neon/simple/red, +/area/deathmatch) +"aA" = ( +/obj/vehicle/sealed/mecha/gygax, +/turf/open/floor/carpet/neon/simple/yellow, +/area/deathmatch) +"aB" = ( +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 4; + icon_state = "trimline_warn_fill" + }, +/turf/open/floor/engine, +/area/deathmatch) +"aC" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/engine, +/area/deathmatch) +"aE" = ( +/mob/living/carbon/human/species/monkey/angry, +/turf/open/floor/engine, +/area/deathmatch) +"aG" = ( +/turf/open/lava, +/area/deathmatch) +"aH" = ( +/obj/vehicle/sealed/mecha/gygax, +/turf/open/floor/carpet/neon/simple/green, +/area/deathmatch) +"aI" = ( +/turf/open/floor/carpet/neon/simple/lime, +/area/deathmatch) +"aJ" = ( +/turf/open/floor/carpet/neon/simple/red, +/area/deathmatch) +"aK" = ( +/turf/open/floor/carpet/neon/simple/violet, +/area/deathmatch) +"aL" = ( +/obj/item/chair, +/turf/open/floor/engine, +/area/deathmatch) +"aN" = ( +/obj/structure/table/reinforced, +/obj/item/gun/energy/laser, +/turf/open/floor/engine, +/area/deathmatch) +"aP" = ( +/turf/open/floor/light/colour_cycle/dancefloor_a, +/area/deathmatch) +"aQ" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/engine, +/area/deathmatch) +"aR" = ( +/obj/effect/decal/cleanable/blood/drip, +/turf/open/floor/engine, +/area/deathmatch) +"aS" = ( +/obj/structure/table/reinforced, +/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy, +/turf/open/floor/engine, +/area/deathmatch) +"aV" = ( +/obj/structure/barricade/security, +/turf/open/floor/carpet/neon/simple/red, +/area/deathmatch) +"aW" = ( +/obj/structure/table, +/turf/open/floor/engine, +/area/deathmatch) +"aY" = ( +/obj/structure/closet/crate/trashcart/filled, +/obj/item/weldingtool, +/turf/open/floor/engine, +/area/deathmatch) +"aZ" = ( +/obj/structure/barricade/wooden, +/turf/open/floor/engine, +/area/deathmatch) +"ba" = ( +/obj/structure/closet/crate/trashcart/filled, +/obj/machinery/light/directional/west, +/turf/open/floor/engine, +/area/deathmatch) +"bb" = ( +/obj/structure/barricade/sandbags, +/turf/open/floor/engine, +/area/deathmatch) +"bc" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/engine, +/area/deathmatch) +"bd" = ( +/obj/item/gun/energy/laser/hellgun, +/obj/structure/closet/crate/trashcart/filled, +/turf/open/floor/engine, +/area/deathmatch) +"be" = ( +/obj/machinery/stasis, +/turf/open/floor/engine, +/area/deathmatch) +"bf" = ( +/obj/machinery/door/airlock/hatch, +/turf/open/floor/carpet/neon/simple/purple, +/area/deathmatch) +"bh" = ( +/turf/open/floor/carpet/neon/simple/orange, +/area/deathmatch) +"bi" = ( +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 1; + icon_state = "trimline_warn_fill" + }, +/turf/open/floor/engine, +/area/deathmatch) +"bj" = ( +/obj/machinery/sleeper{ + dir = 4; + icon_state = "sleeper" + }, +/turf/open/floor/engine, +/area/deathmatch) +"bk" = ( +/obj/vehicle/ridden/atv, +/obj/item/key/atv, +/turf/open/floor/engine, +/area/deathmatch) +"bl" = ( +/obj/machinery/sleeper{ + dir = 8; + icon_state = "sleeper" + }, +/turf/open/floor/engine, +/area/deathmatch) +"bm" = ( +/obj/machinery/vending/cigarette, +/turf/open/floor/engine, +/area/deathmatch) +"bn" = ( +/obj/machinery/vending/assist, +/turf/open/floor/engine, +/area/deathmatch) +"bo" = ( +/obj/machinery/vending/sustenance, +/turf/open/floor/engine, +/area/deathmatch) +"bp" = ( +/obj/item/grenade/smokebomb, +/turf/open/floor/engine, +/area/deathmatch) +"bq" = ( +/obj/item/mecha_parts/mecha_equipment/armor/antiproj_armor_booster, +/turf/open/floor/engine, +/area/deathmatch) +"br" = ( +/obj/item/mecha_parts/mecha_equipment/armor/anticcw_armor_booster, +/turf/open/floor/engine, +/area/deathmatch) +"bs" = ( +/turf/open/floor/carpet/neon/simple/blue, +/area/deathmatch) +"bt" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/obj/effect/turf_decal/box, +/obj/machinery/button/door{ + id = "dm2"; + pixel_x = 24 + }, +/turf/open/floor/carpet/neon/simple/orange, +/area/deathmatch) +"bu" = ( +/turf/open/floor/carpet/neon/simple/yellow, +/area/deathmatch) +"bv" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/head/utility/welding, +/obj/machinery/light/directional/east, +/obj/item/inducer, +/obj/item/weldingtool/largetank, +/turf/open/floor/carpet/neon/simple/teal, +/area/deathmatch) +"bw" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/carpet/neon/simple/teal, +/area/deathmatch) +"bx" = ( +/obj/machinery/door/poddoor/shutters{ + id = "dm1" + }, +/turf/open/floor/engine, +/area/deathmatch) +"by" = ( +/obj/structure/table/reinforced, +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg{ + pixel_y = -8 + }, +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot{ + pixel_y = 8 + }, +/turf/open/floor/carpet/neon/simple/green, +/area/deathmatch) +"bz" = ( +/obj/machinery/vending/medical, +/turf/open/floor/engine, +/area/deathmatch) +"bB" = ( +/obj/effect/turf_decal/trimline/yellow/filled/warning, +/turf/open/floor/engine, +/area/deathmatch) +"bF" = ( +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 8; + icon_state = "trimline_warn_fill" + }, +/turf/open/floor/engine, +/area/deathmatch) +"bG" = ( +/obj/structure/table/reinforced, +/obj/item/mecha_ammo/lmg, +/obj/item/mecha_ammo/lmg{ + pixel_y = 12 + }, +/obj/item/mecha_ammo/scattershot{ + pixel_y = 18 + }, +/obj/item/mecha_ammo/scattershot{ + pixel_y = 24 + }, +/turf/open/floor/carpet/neon/simple/green, +/area/deathmatch) +"bH" = ( +/obj/structure/table_frame, +/turf/open/floor/carpet/neon/simple/violet, +/area/deathmatch) +"bJ" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/engine, +/area/deathmatch) +"bL" = ( +/obj/effect/decal/cleanable/blood/gibs, +/turf/open/floor/engine, +/area/deathmatch) +"bM" = ( +/obj/structure/window/fulltile, +/turf/open/floor/engine, +/area/deathmatch) +"bN" = ( +/obj/structure/showcase/horrific_experiment, +/turf/open/floor/engine, +/area/deathmatch) +"bO" = ( +/obj/structure/reagent_dispensers/water_cooler, +/turf/open/floor/engine, +/area/deathmatch) +"bP" = ( +/obj/machinery/door/airlock/hatch, +/turf/open/floor/carpet/neon/simple/teal, +/area/deathmatch) +"bR" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/engine, +/area/deathmatch) +"bS" = ( +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/floor/engine, +/area/deathmatch) +"bT" = ( +/obj/item/shard, +/turf/open/floor/engine, +/area/deathmatch) +"bV" = ( +/turf/open/floor/noslip, +/area/deathmatch) +"bW" = ( +/obj/structure/barricade/wooden, +/turf/open/floor/carpet/neon/simple/green, +/area/deathmatch) +"bY" = ( +/obj/structure/barricade/wooden, +/turf/open/floor/carpet/neon/simple/teal, +/area/deathmatch) +"bZ" = ( +/obj/machinery/recharger, +/obj/structure/table, +/turf/open/floor/engine, +/area/deathmatch) +"ca" = ( +/obj/structure/table, +/obj/item/storage/briefcase, +/turf/open/floor/engine, +/area/deathmatch) +"cc" = ( +/obj/structure/table, +/obj/item/storage/toolbox/mechanical, +/turf/open/floor/engine, +/area/deathmatch) +"cd" = ( +/obj/item/grenade/smokebomb, +/turf/open/floor/carpet/neon/simple/green, +/area/deathmatch) +"ce" = ( +/obj/structure/chair{ + dir = 1; + icon_state = "chair" + }, +/turf/open/floor/engine, +/area/deathmatch) +"cg" = ( +/obj/structure/showcase/machinery/cloning_pod, +/turf/open/floor/engine, +/area/deathmatch) +"ch" = ( +/obj/structure/chair/office, +/turf/open/floor/engine, +/area/deathmatch) +"ci" = ( +/obj/structure/cannon{ + dir = 8; + icon_state = "falconet_patina" + }, +/turf/open/floor/sepia, +/area/deathmatch) +"ck" = ( +/turf/open/floor/sepia, +/area/deathmatch) +"cl" = ( +/obj/item/reagent_containers/syringe, +/turf/open/floor/light/colour_cycle/dancefloor_b, +/area/deathmatch) +"cm" = ( +/obj/item/gun/ballistic/revolver/c38/detective, +/obj/structure/table/wood, +/turf/open/floor/sepia, +/area/deathmatch) +"cn" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/sepia, +/area/deathmatch) +"cp" = ( +/obj/structure/window/spawner/directional/south, +/turf/open/floor/sepia, +/area/deathmatch) +"cq" = ( +/obj/item/gun/ballistic/rifle/boltaction/pipegun, +/obj/structure/table/wood, +/turf/open/floor/sepia, +/area/deathmatch) +"cr" = ( +/obj/item/gun/ballistic/rifle/boltaction, +/obj/structure/table/wood, +/turf/open/floor/sepia, +/area/deathmatch) +"ct" = ( +/obj/structure/window/spawner/directional/west{ + icon_state = "window" + }, +/obj/item/lighter, +/turf/open/floor/sepia, +/area/deathmatch) +"cv" = ( +/obj/item/reagent_containers/cup/bucket/wooden, +/obj/machinery/light/directional/south, +/turf/open/floor/sepia, +/area/deathmatch) +"cw" = ( +/obj/machinery/door/airlock/hatch, +/turf/open/floor/carpet/neon/simple/green, +/area/deathmatch) +"cx" = ( +/obj/structure/fermenting_barrel/gunpowder, +/turf/open/floor/sepia, +/area/deathmatch) +"cy" = ( +/obj/structure/toilet{ + dir = 8; + icon_state = "toilet00" + }, +/turf/open/floor/light, +/area/deathmatch) +"cz" = ( +/obj/item/stack/cannonball/fourteen, +/obj/structure/table/wood, +/turf/open/floor/sepia, +/area/deathmatch) +"cA" = ( +/obj/item/reagent_containers/cup/glass/drinkingglass/filled/nuka_cola, +/turf/open/floor/light/colour_cycle/dancefloor_a, +/area/deathmatch) +"cB" = ( +/obj/item/reagent_containers/pill/stimulant, +/turf/open/floor/light/colour_cycle/dancefloor_b, +/area/deathmatch) +"cC" = ( +/obj/machinery/recharge_station, +/turf/open/floor/engine, +/area/deathmatch) +"cD" = ( +/obj/structure/barricade/security, +/turf/open/floor/engine, +/area/deathmatch) +"cE" = ( +/obj/structure/table, +/turf/open/floor/carpet/neon/simple/violet, +/area/deathmatch) +"cF" = ( +/obj/structure/barricade/security, +/turf/open/floor/carpet/neon/simple/violet, +/area/deathmatch) +"cG" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/head/utility/welding, +/obj/machinery/light/directional/east, +/obj/item/inducer, +/obj/item/weldingtool/largetank, +/turf/open/floor/carpet/neon/simple/green, +/area/deathmatch) +"cH" = ( +/obj/machinery/sheetifier, +/turf/open/floor/engine, +/area/deathmatch) +"cI" = ( +/obj/machinery/door/airlock/hatch, +/turf/open/floor/carpet/neon/simple/lime, +/area/deathmatch) +"cK" = ( +/obj/structure/table, +/obj/item/mecha_parts/mecha_equipment/repair_droid, +/turf/open/floor/engine, +/area/deathmatch) +"cL" = ( +/obj/structure/table, +/obj/item/grenade/smokebomb, +/turf/open/floor/engine, +/area/deathmatch) +"cM" = ( +/obj/item/reagent_containers/pill/happinesspsych, +/turf/open/floor/light/colour_cycle/dancefloor_b, +/area/deathmatch) +"cN" = ( +/obj/item/fireaxe, +/turf/open/floor/light/colour_cycle/dancefloor_a, +/area/deathmatch) +"cO" = ( +/obj/structure/table_frame, +/turf/open/floor/engine, +/area/deathmatch) +"cP" = ( +/obj/structure/urinal{ + pixel_y = 24 + }, +/turf/open/floor/noslip, +/area/deathmatch) +"cQ" = ( +/obj/item/reagent_containers/pill/lsd, +/turf/open/floor/light/colour_cycle/dancefloor_a, +/area/deathmatch) +"cR" = ( +/obj/item/reagent_containers/pill/probital, +/turf/open/floor/light/colour_cycle/dancefloor_b, +/area/deathmatch) +"cS" = ( +/obj/structure/reagent_dispensers/cooking_oil, +/turf/open/floor/engine, +/area/deathmatch) +"cT" = ( +/obj/item/inducer, +/obj/item/weldingtool, +/turf/open/floor/engine, +/area/deathmatch) +"cU" = ( +/obj/machinery/door/poddoor/shutters{ + id = "dm2" + }, +/turf/open/floor/engine, +/area/deathmatch) +"cV" = ( +/obj/item/mecha_ammo/scattershot, +/turf/open/floor/engine, +/area/deathmatch) +"cW" = ( +/obj/machinery/grill, +/turf/open/floor/engine, +/area/deathmatch) +"cX" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/obj/effect/turf_decal/box, +/obj/machinery/button/door{ + id = "dm3"; + pixel_x = -24 + }, +/turf/open/floor/carpet/neon/simple/teal, +/area/deathmatch) +"cY" = ( +/obj/machinery/door/poddoor/shutters{ + id = "dm3" + }, +/turf/open/floor/engine, +/area/deathmatch) +"cZ" = ( +/obj/machinery/sheetifier, +/obj/machinery/light/directional/east, +/turf/open/floor/engine, +/area/deathmatch) +"da" = ( +/obj/machinery/door/airlock/hatch, +/turf/open/floor/engine, +/area/deathmatch) +"db" = ( +/obj/vehicle/sealed/mecha/gygax, +/turf/open/floor/carpet/neon/simple/orange, +/area/deathmatch) +"dc" = ( +/obj/machinery/grill, +/obj/machinery/light/directional/west, +/turf/open/floor/engine, +/area/deathmatch) +"dd" = ( +/obj/structure/table, +/obj/item/food/meat/rawcutlet, +/turf/open/floor/engine, +/area/deathmatch) +"df" = ( +/turf/open/floor/carpet/neon/simple/teal, +/area/deathmatch) +"dg" = ( +/obj/vehicle/sealed/mecha/gygax, +/turf/open/floor/carpet/neon/simple/teal, +/area/deathmatch) +"dh" = ( +/obj/structure/closet/l3closet/janitor, +/turf/open/floor/engine, +/area/deathmatch) +"di" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/head/utility/welding, +/obj/item/weldingtool/largetank, +/obj/machinery/light/directional/west, +/obj/item/inducer, +/turf/open/floor/carpet/neon/simple/orange, +/area/deathmatch) +"dk" = ( +/obj/structure/table, +/obj/item/storage/belt/janitor, +/turf/open/floor/engine, +/area/deathmatch) +"eK" = ( +/obj/structure/table, +/obj/item/food/meat/slab/bear, +/turf/open/floor/engine, +/area/deathmatch) +"gg" = ( +/obj/structure/table, +/obj/item/mop, +/turf/open/floor/engine, +/area/deathmatch) +"go" = ( +/turf/open/floor/carpet/neon/simple/pink, +/area/deathmatch) +"gF" = ( +/obj/structure/table/reinforced, +/obj/item/mecha_ammo/lmg, +/obj/item/mecha_ammo/lmg{ + pixel_y = 12 + }, +/obj/item/mecha_ammo/scattershot{ + pixel_y = 18 + }, +/obj/item/mecha_ammo/scattershot{ + pixel_y = 24 + }, +/turf/open/floor/carpet/neon/simple/teal, +/area/deathmatch) +"nE" = ( +/obj/structure/table/reinforced, +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg{ + pixel_y = -8 + }, +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot{ + pixel_y = 8 + }, +/turf/open/floor/carpet/neon/simple/orange, +/area/deathmatch) +"ot" = ( +/obj/structure/mop_bucket/janitorialcart{ + dir = 4 + }, +/turf/open/floor/engine, +/area/deathmatch) +"pD" = ( +/obj/machinery/button/door{ + id = "dm1"; + pixel_y = -24 + }, +/turf/open/floor/carpet/neon/simple/yellow, +/area/deathmatch) +"sc" = ( +/obj/structure/table/reinforced, +/obj/item/mecha_ammo/lmg, +/obj/item/mecha_ammo/lmg{ + pixel_y = 12 + }, +/obj/item/mecha_ammo/scattershot{ + pixel_y = 18 + }, +/obj/item/mecha_ammo/scattershot{ + pixel_y = 24 + }, +/turf/open/floor/carpet/neon/simple/orange, +/area/deathmatch) +"tY" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/engine, +/area/deathmatch) +"yI" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/machinery/light/directional/south, +/turf/open/floor/engine, +/area/deathmatch) +"Br" = ( +/obj/machinery/button/door{ + id = "dm4"; + pixel_y = -24 + }, +/turf/open/floor/carpet/neon/simple/green, +/area/deathmatch) +"ES" = ( +/obj/item/storage/bag/trash, +/turf/open/floor/engine, +/area/deathmatch) +"Ij" = ( +/obj/structure/table, +/obj/item/reagent_containers/cup/bucket, +/turf/open/floor/engine, +/area/deathmatch) +"Jo" = ( +/obj/machinery/vending/wardrobe/jani_wardrobe, +/turf/open/floor/engine, +/area/deathmatch) +"ME" = ( +/obj/structure/table, +/obj/item/food/meat/slab/pig, +/turf/open/floor/engine, +/area/deathmatch) +"PK" = ( +/obj/item/storage/medkit/regular, +/turf/open/floor/noslip, +/area/deathmatch) +"RN" = ( +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/deathmatch) +"XP" = ( +/obj/machinery/button/door{ + id = "dm2"; + pixel_y = 24 + }, +/turf/open/floor/carpet/neon/simple/orange, +/area/deathmatch) +"Zw" = ( +/obj/structure/table/reinforced, +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg{ + pixel_y = -8 + }, +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot{ + pixel_y = 8 + }, +/turf/open/floor/carpet/neon/simple/teal, +/area/deathmatch) + +(1,1,1) = {" +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +"} +(2,1,1) = {" +ac +ad +an +bu +bx +aj +ax +aQ +bM +aj +ax +be +bj +bj +br +ax +aQ +bb +aj +ax +cC +aQ +cU +bh +di +sc +ac +"} +(3,1,1) = {" +ac +ao +aJ +pD +ac +aj +ax +aj +bM +aZ +bP +bY +aj +aj +aj +ax +aj +bb +aj +ax +cC +aj +ac +XP +bs +nE +ac +"} +(4,1,1) = {" +ac +bu +as +aA +ac +aj +da +aj +bM +aj +ax +df +df +df +bw +ax +aj +bb +aj +ax +aj +aj +ac +db +bt +bh +ac +"} +(5,1,1) = {" +ac +bx +ac +ac +ac +aj +ax +aj +bM +aj +ax +bR +aj +aj +bY +cw +bW +am +am +cw +aj +aj +ac +ac +ac +cU +ac +"} +(6,1,1) = {" +ac +aj +aj +aj +aj +aj +ax +aj +bM +aj +ax +aj +bk +aj +aj +ax +aj +cd +aj +ax +aj +aj +aj +aj +aj +aj +ac +"} +(7,1,1) = {" +ac +aj +aj +aj +aj +aj +ax +aj +bM +bc +ax +bZ +bl +bl +bz +ax +aj +am +bc +ax +aj +cH +cH +cZ +aj +aj +ac +"} +(8,1,1) = {" +ac +ax +ax +da +ax +ax +ax +ax +ax +ax +ax +ax +ax +ax +ax +ax +ax +cw +ax +ax +ax +ax +ax +ax +ax +da +ac +"} +(9,1,1) = {" +ac +az +aJ +aJ +aJ +aJ +aJ +aJ +aJ +aJ +az +ax +bm +aj +aQ +bO +aj +aK +aj +aj +aQ +aj +aj +ax +dk +aj +ac +"} +(10,1,1) = {" +ac +aJ +cD +cD +cD +aj +aj +aj +aj +aj +aJ +ax +bn +aj +aK +aK +aK +aK +cD +cD +cE +cK +aj +ax +Ij +aj +ac +"} +(11,1,1) = {" +ac +aJ +aj +aB +aB +aj +aj +aB +aB +aj +aJ +ax +bo +aj +aK +aj +aj +aj +aj +aj +aK +cL +aj +ax +gg +yI +ac +"} +(12,1,1) = {" +ac +aJ +bB +aG +aG +bi +bB +aG +aG +bi +aJ +aC +aj +aj +aK +aj +ca +ce +aj +aj +aK +aj +aj +ax +aj +aj +ac +"} +(13,1,1) = {" +ac +aJ +aj +bF +bF +aj +aj +bF +bF +aj +aJ +bf +aK +aK +aK +ch +aW +ce +aj +aj +aK +aK +aK +bf +aj +aj +ac +"} +(14,1,1) = {" +ac +aJ +aj +aj +aj +aj +aj +aj +aj +cD +aV +aC +aj +cD +aK +aj +cc +ce +aj +aj +aK +aj +aj +ax +ot +aj +ac +"} +(15,1,1) = {" +ac +aV +cD +aj +aJ +aJ +aJ +aJ +aj +aj +aJ +ax +aj +cD +aK +aj +aj +aj +aj +aj +cF +cD +aj +ax +ES +tY +ac +"} +(16,1,1) = {" +ac +aJ +aj +aj +aJ +aN +aS +aJ +aj +aj +aJ +ax +aj +cD +bH +aK +aK +aK +aK +aK +cF +cO +aL +ax +dh +aj +ac +"} +(17,1,1) = {" +ac +aJ +aj +aj +aJ +bJ +aN +aJ +aj +aj +aJ +ax +aj +aL +bc +aj +aj +aK +aj +aj +bc +aj +cV +ax +Jo +aj +ac +"} +(18,1,1) = {" +ac +aJ +aj +aj +aJ +aJ +aJ +aJ +aj +aj +aJ +ax +ax +ax +ax +ax +RN +da +ax +ax +ax +ax +ax +ax +ax +da +ac +"} +(19,1,1) = {" +ac +aJ +aj +aj +aj +aj +aj +aj +aj +aj +aJ +ax +aj +bq +aj +aj +ax +ck +cp +cm +ax +cP +bV +bV +PK +bV +ac +"} +(20,1,1) = {" +ac +aJ +aj +aB +aB +aj +aj +aB +aB +aj +aV +ax +aj +cg +cg +aj +ax +ck +cp +cq +ax +cP +cy +cy +bV +bV +ac +"} +(21,1,1) = {" +ac +aJ +bB +aG +aG +bi +bB +aG +aG +bi +aJ +ax +aj +aj +aj +aE +ax +ck +cp +cr +ax +ax +ax +ax +ax +da +ac +"} +(22,1,1) = {" +ac +aJ +aj +bF +bF +aj +aj +bF +bF +aj +aJ +ax +bp +cg +cg +aj +ax +cn +ck +ct +ax +cS +cW +dc +aj +aj +ac +"} +(23,1,1) = {" +ac +aJ +cD +cD +cD +aj +aj +aj +aj +aj +aJ +cI +aI +aI +aI +aI +cI +ck +ck +ck +da +aj +aj +aj +aj +aj +ac +"} +(24,1,1) = {" +ac +az +aJ +aJ +aJ +aJ +aJ +aJ +aJ +aJ +az +ax +aj +aE +bL +aj +ax +ck +ck +cv +ax +cT +aj +dd +ME +eK +ac +"} +(25,1,1) = {" +ac +ax +ax +da +ax +ax +ax +ax +ax +ax +ax +ax +aj +cg +bN +bS +ax +ci +ck +cx +ax +ax +da +ax +ax +ax +ac +"} +(26,1,1) = {" +ac +aj +aj +aj +aj +aQ +aj +ax +aY +ba +bd +ax +aE +aj +aR +bT +ax +ck +ck +cz +ax +aj +aj +aQ +aj +aj +ac +"} +(27,1,1) = {" +ac +ae +ac +ac +ac +aj +aj +da +aj +aj +aj +ax +aj +cg +cg +aE +ax +ax +da +ax +ax +aj +ac +ac +ac +cY +ac +"} +(28,1,1) = {" +ac +am +at +aH +ac +aj +aj +ax +aj +bb +aj +ax +ax +ax +ax +ax +RN +aP +cl +cA +ax +aj +ac +dg +cX +df +ac +"} +(29,1,1) = {" +ac +by +aw +Br +ac +aj +aj +ax +aj +bb +aj +aj +bb +aj +aj +aj +da +cM +cQ +cB +ax +aj +ac +af +go +Zw +ac +"} +(30,1,1) = {" +ac +bG +cG +am +ae +aj +aj +ax +aj +bb +aj +bc +aj +aj +bb +aj +ax +cN +cR +cQ +da +aj +cY +df +bv +gF +ac +"} +(31,1,1) = {" +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +"} diff --git a/_maps/map_files/Deathmatch/ragecage.dmm b/_maps/map_files/Deathmatch/ragecage.dmm new file mode 100644 index 00000000000..b5871e89c24 --- /dev/null +++ b/_maps/map_files/Deathmatch/ragecage.dmm @@ -0,0 +1,575 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/item/melee/baseball_bat, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/deathmatch) +"b" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/deathmatch) +"c" = ( +/obj/item/cardboard_cutout/adaptive{ + starting_cutout = "Private Security Officer" + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/cardboard_cutout/adaptive{ + starting_cutout = "Private Security Officer" + }, +/turf/open/indestructible/plating, +/area/deathmatch) +"d" = ( +/obj/effect/spawner/structure/electrified_grille, +/obj/structure/window/reinforced/spawner/directional/north, +/turf/open/indestructible/plating, +/area/deathmatch) +"f" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/deathmatch) +"g" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/effect/spawner/structure/electrified_grille, +/obj/structure/window/reinforced/spawner/directional/west, +/turf/open/indestructible/plating, +/area/deathmatch) +"i" = ( +/obj/effect/spawner/random/trash/mess, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/deathmatch) +"k" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/deathmatch) +"l" = ( +/obj/effect/decal/cleanable/blood, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/deathmatch) +"m" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/cardboard_cutout/adaptive{ + starting_cutout = "Private Security Officer" + }, +/turf/open/indestructible/plating, +/area/deathmatch) +"o" = ( +/turf/closed/indestructible/grille, +/area/deathmatch) +"p" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/power/rtg/debug{ + power_gen = 50000; + name = "dumb idiot shocker powerer"; + desc = "Dont touch the grilles idiot" + }, +/obj/structure/cable, +/turf/open/indestructible/plating, +/area/deathmatch) +"q" = ( +/turf/closed/indestructible/fakedoor/engineering, +/area/deathmatch) +"t" = ( +/obj/effect/spawner/random/trash/graffiti, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/deathmatch) +"u" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/cable, +/turf/open/indestructible/plating, +/area/deathmatch) +"w" = ( +/obj/effect/decal/cleanable/blood/gibs/limb, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/deathmatch) +"x" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/effect/spawner/structure/electrified_grille, +/turf/open/indestructible/plating, +/area/deathmatch) +"z" = ( +/obj/effect/spawner/structure/electrified_grille, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/window/reinforced/spawner/directional/east, +/turf/open/indestructible/plating, +/area/deathmatch) +"A" = ( +/obj/effect/spawner/structure/electrified_grille, +/obj/structure/window/reinforced/spawner/directional/west, +/turf/open/indestructible/plating, +/area/deathmatch) +"B" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/cardboard_cutout/adaptive{ + starting_cutout = "Private Security Officer" + }, +/obj/structure/cable, +/turf/open/indestructible/plating, +/area/deathmatch) +"C" = ( +/obj/effect/decal/cleanable/blood/tracks, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/deathmatch) +"D" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/clothing/mask/gas, +/turf/open/indestructible/plating, +/area/deathmatch) +"G" = ( +/turf/closed/indestructible/reinforced, +/area/deathmatch) +"H" = ( +/turf/closed/indestructible/fakedoor/maintenance, +/area/deathmatch) +"I" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/spear, +/turf/open/indestructible/plating, +/area/deathmatch) +"K" = ( +/obj/effect/spawner/structure/electrified_grille, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/window/reinforced/spawner/directional/east, +/turf/open/indestructible/plating, +/area/deathmatch) +"L" = ( +/obj/effect/spawner/structure/electrified_grille, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/window/reinforced/spawner/directional/north, +/turf/open/indestructible/plating, +/area/deathmatch) +"M" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/flashlight/flare{ + start_on = 1; + icon_state = "flare-on" + }, +/turf/open/indestructible/plating, +/area/deathmatch) +"N" = ( +/obj/effect/decal/cleanable/blood/gibs/down, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/deathmatch) +"P" = ( +/obj/effect/spawner/structure/electrified_grille, +/obj/structure/window/reinforced/spawner/directional/east, +/turf/open/indestructible/plating, +/area/deathmatch) +"Q" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/deathmatch) +"R" = ( +/obj/effect/spawner/structure/electrified_grille, +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/indestructible/plating, +/area/deathmatch) +"S" = ( +/obj/effect/decal/cleanable/blood/gibs/torso, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/deathmatch) +"U" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/indestructible/plating, +/area/deathmatch) +"V" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/cardboard_cutout/adaptive{ + starting_cutout = "Private Security Officer" + }, +/turf/open/indestructible/plating, +/area/deathmatch) +"X" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/storage/toolbox/mechanical/old, +/turf/open/indestructible/plating, +/area/deathmatch) +"Z" = ( +/turf/cordon, +/area/deathmatch) + +(1,1,1) = {" +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +"} +(2,1,1) = {" +Z +G +G +H +G +o +G +H +G +H +G +o +G +H +G +G +Z +"} +(3,1,1) = {" +Z +G +p +u +U +U +U +D +U +U +U +I +U +U +f +G +Z +"} +(4,1,1) = {" +Z +G +U +B +V +V +V +V +V +V +V +c +V +V +X +G +Z +"} +(5,1,1) = {" +Z +G +U +L +A +A +A +A +A +A +A +A +A +g +U +G +Z +"} +(6,1,1) = {" +Z +G +U +d +U +U +U +l +C +Q +t +U +U +x +U +G +Z +"} +(7,1,1) = {" +Z +G +X +d +U +M +U +U +b +k +U +U +U +x +U +q +Z +"} +(8,1,1) = {" +Z +G +U +d +U +U +t +U +U +k +U +M +U +R +U +G +Z +"} +(9,1,1) = {" +Z +G +U +d +U +U +U +i +a +U +N +U +U +R +U +o +Z +"} +(10,1,1) = {" +Z +G +D +d +U +b +U +a +U +a +U +b +t +R +D +o +Z +"} +(11,1,1) = {" +Z +G +U +d +t +U +S +U +a +U +U +U +U +R +U +o +Z +"} +(12,1,1) = {" +Z +G +I +d +U +U +U +M +U +U +U +U +U +R +U +G +Z +"} +(13,1,1) = {" +Z +G +U +d +U +U +U +U +b +t +U +U +i +R +I +q +Z +"} +(14,1,1) = {" +Z +G +U +d +U +U +w +U +U +U +U +U +M +R +U +G +Z +"} +(15,1,1) = {" +Z +G +U +z +P +P +P +P +P +P +P +P +P +K +U +G +Z +"} +(16,1,1) = {" +Z +G +U +m +m +m +m +m +m +m +m +m +m +m +U +G +Z +"} +(17,1,1) = {" +Z +G +f +U +U +X +U +U +U +U +I +U +U +U +f +G +Z +"} +(18,1,1) = {" +Z +G +G +H +G +o +G +H +G +H +G +o +G +H +G +G +Z +"} +(19,1,1) = {" +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +Z +"} diff --git a/_maps/map_files/Deathmatch/raidthebase.dmm b/_maps/map_files/Deathmatch/raidthebase.dmm new file mode 100644 index 00000000000..99e501a1b3a --- /dev/null +++ b/_maps/map_files/Deathmatch/raidthebase.dmm @@ -0,0 +1,1250 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"bc" = ( +/obj/machinery/door/poddoor/shutters/indestructible/preopen{ + dir = 1 + }, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"bw" = ( +/obj/machinery/griddle, +/turf/open/indestructible/stone, +/area/deathmatch) +"bR" = ( +/obj/effect/turf_decal/caution, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"cF" = ( +/obj/structure/sign/poster/contraband/donk_co/directional/south, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"cH" = ( +/obj/structure/table, +/obj/item/food/meatball{ + pixel_y = 6; + pixel_x = -5 + }, +/obj/item/food/meatball{ + pixel_y = 1; + pixel_x = 4 + }, +/obj/item/food/meatball{ + pixel_y = 8; + pixel_x = 4 + }, +/obj/item/food/meatball{ + pixel_y = -4; + pixel_x = -6 + }, +/turf/open/indestructible/stone, +/area/deathmatch) +"cP" = ( +/obj/effect/spawner/random/trash/hobo_squat, +/obj/item/clothing/gloves/tackler/offbrand, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"df" = ( +/obj/structure/mystery_box/tdome{ + pixel_y = 0 + }, +/turf/open/indestructible/dark, +/area/deathmatch) +"fu" = ( +/obj/effect/spawner/random/trash/hobo_squat, +/obj/item/claymore, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"fv" = ( +/obj/structure/rack, +/obj/item/grenade/chem_grenade/clf3{ + pixel_y = 6; + pixel_x = -1 + }, +/obj/item/grenade/chem_grenade/clf3{ + pixel_x = 7 + }, +/obj/item/grenade/frag, +/obj/item/grenade/frag{ + pixel_y = 6; + pixel_x = 9 + }, +/turf/open/indestructible/stone, +/area/deathmatch) +"fx" = ( +/obj/structure/closet/crate/trashcart/filled, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"fE" = ( +/obj/machinery/door/poddoor/shutters/indestructible/preopen{ + dir = 1 + }, +/obj/structure/barricade/sandbags, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"fI" = ( +/obj/structure/table, +/obj/item/food/bbqribs{ + pixel_y = 8; + pixel_x = -1 + }, +/obj/item/food/bbqribs{ + pixel_y = 5 + }, +/obj/item/food/bbqribs{ + pixel_y = 2; + pixel_x = -2 + }, +/turf/open/indestructible/stone, +/area/deathmatch) +"fT" = ( +/obj/structure/shipping_container/nakamura, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"fU" = ( +/obj/structure/table, +/turf/open/indestructible/dark, +/area/deathmatch) +"gg" = ( +/obj/structure/closet/crate/cardboard, +/obj/item/storage/toolbox/mechanical, +/obj/item/storage/toolbox/emergency/turret, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"gG" = ( +/obj/structure/barricade/sandbags, +/turf/open/indestructible/stone, +/area/deathmatch) +"hC" = ( +/obj/item/stack/spacecash/c1000, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"hN" = ( +/turf/open/indestructible/stone, +/area/deathmatch) +"im" = ( +/obj/structure/closet/crate/medical, +/obj/item/storage/medkit/advanced, +/turf/open/indestructible/dark, +/area/deathmatch) +"in" = ( +/obj/structure/fence{ + dir = 4 + }, +/obj/structure/sign/departments/med/directional/west, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"iQ" = ( +/obj/structure/barricade/sandbags, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"iS" = ( +/obj/structure/rack, +/obj/item/storage/medkit/advanced, +/turf/open/indestructible/dark, +/area/deathmatch) +"jy" = ( +/obj/structure/sign/poster/contraband/donk_co/directional/north, +/obj/structure/mystery_box/tdome{ + pixel_y = 0 + }, +/turf/open/indestructible/stone, +/area/deathmatch) +"jH" = ( +/turf/open/indestructible/dark, +/area/deathmatch) +"kc" = ( +/obj/effect/spawner/random/trash/hobo_squat, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"kU" = ( +/obj/machinery/light/cold/directional/west, +/turf/open/indestructible/dark, +/area/deathmatch) +"mg" = ( +/obj/machinery/oven, +/turf/open/indestructible/stone, +/area/deathmatch) +"ms" = ( +/obj/effect/spawner/random/trash/hobo_squat, +/obj/item/gun/ballistic/automatic/pistol/m1911, +/obj/item/clothing/suit/armor/vest/alt, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"mB" = ( +/obj/structure/fence/door/opened{ + dir = 4 + }, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"nS" = ( +/obj/structure/table/reinforced, +/obj/item/storage/toolbox/guncase/doublesword, +/obj/structure/window/reinforced/unanchored/spawner/directional/south, +/obj/structure/window/reinforced/unanchored/spawner/directional/east, +/turf/open/indestructible/stone, +/area/deathmatch) +"oU" = ( +/turf/closed/indestructible/fakedoor/maintenance, +/area/deathmatch) +"pc" = ( +/obj/structure/plasticflaps/opaque, +/obj/machinery/conveyor/auto{ + dir = 8 + }, +/turf/open/indestructible/plating, +/area/deathmatch) +"re" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"sR" = ( +/obj/structure/closet/crate/cardboard, +/obj/item/storage/toolbox/ammobox/strilka310, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"tQ" = ( +/obj/structure/table, +/obj/machinery/microwave{ + pixel_y = 5; + pixel_x = -1 + }, +/turf/open/indestructible/stone, +/area/deathmatch) +"ub" = ( +/obj/structure/barricade/security/murderdome, +/turf/open/indestructible/stone, +/area/deathmatch) +"uB" = ( +/obj/structure/fence/end, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"uW" = ( +/obj/structure/table, +/obj/effect/spawner/random/food_or_drink/donkpockets, +/turf/open/indestructible/stone, +/area/deathmatch) +"uY" = ( +/obj/structure/fence/door{ + dir = 4 + }, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"vV" = ( +/obj/machinery/light/floor, +/turf/open/indestructible/plating, +/area/deathmatch) +"wt" = ( +/obj/structure/fence, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"wR" = ( +/obj/structure/table, +/obj/item/food/bun{ + pixel_y = 8; + pixel_x = -2 + }, +/obj/item/food/bun{ + pixel_y = 5; + pixel_x = 3 + }, +/obj/item/food/bun{ + pixel_y = -1 + }, +/turf/open/indestructible/stone, +/area/deathmatch) +"xi" = ( +/obj/effect/spawner/random/trash/garbage, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"xp" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/poddoor/shutters/window{ + dir = 8; + id = "outskirtshutter" + }, +/turf/open/indestructible/stone, +/area/deathmatch) +"xy" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle, +/turf/open/indestructible/plating, +/area/deathmatch) +"zl" = ( +/obj/structure/barricade/security/murderdome, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"zr" = ( +/obj/effect/spawner/random/trash/hobo_squat, +/turf/open/indestructible/stone, +/area/deathmatch) +"zP" = ( +/obj/structure/table, +/obj/item/food/cheese/wheel{ + pixel_y = 4 + }, +/turf/open/indestructible/stone, +/area/deathmatch) +"zQ" = ( +/obj/effect/mine/stun, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"AZ" = ( +/obj/machinery/door/poddoor/shutters/indestructible/preopen{ + dir = 1 + }, +/obj/machinery/light/floor, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"Bf" = ( +/obj/item/clothing/suit/armor/vest/alt, +/obj/item/gun/ballistic/revolver/nagant, +/obj/item/suppressor, +/obj/structure/closet/crate/cardboard, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"BC" = ( +/obj/structure/table, +/obj/item/stack/medical/suture, +/turf/open/indestructible/dark, +/area/deathmatch) +"Cd" = ( +/obj/structure/table, +/obj/item/reagent_containers/cup/glass/coffee{ + pixel_y = 2; + pixel_x = 5 + }, +/obj/item/reagent_containers/cup/glass/coffee{ + pixel_y = 9; + pixel_x = -5 + }, +/obj/machinery/light/directional/east, +/turf/open/indestructible/stone, +/area/deathmatch) +"Ce" = ( +/obj/structure/table, +/obj/item/food/dough{ + pixel_y = 7; + pixel_x = -2 + }, +/obj/item/food/dough{ + pixel_x = 5 + }, +/turf/open/indestructible/stone, +/area/deathmatch) +"CJ" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/replica_spawner{ + obvious_replica = 0; + target_path = /obj/machinery/exoscanner + }, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"CP" = ( +/obj/effect/spawner/random/trash/hobo_squat, +/obj/item/reagent_containers/hypospray/medipen/stimulants, +/obj/item/spear, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"Dq" = ( +/obj/effect/turf_decal/caution{ + dir = 1 + }, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"DJ" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/open/indestructible/white/textured, +/area/deathmatch) +"Ea" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/machinery/computer/security/telescreen/entertainment/directional/west, +/turf/open/indestructible/white/textured, +/area/deathmatch) +"Eb" = ( +/obj/structure/mystery_box/tdome{ + pixel_y = 0 + }, +/turf/open/indestructible/stone, +/area/deathmatch) +"Ei" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/obj/effect/light_emitter/fake_outdoors, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"EL" = ( +/obj/structure/rack, +/obj/item/gun/ballistic/shotgun/lethal, +/obj/item/storage/box/lethalshot, +/obj/item/gun/ballistic/shotgun/lethal, +/obj/item/storage/box/lethalshot, +/turf/open/indestructible/stone, +/area/deathmatch) +"EZ" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"FF" = ( +/obj/item/wirecutters/caravan, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"FP" = ( +/obj/effect/turf_decal/arrows{ + dir = 8 + }, +/obj/item/stack/spacecash/c1000{ + pixel_y = 10 + }, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"Ip" = ( +/obj/item/shard{ + pixel_y = -5; + pixel_x = 7 + }, +/obj/item/shard{ + pixel_y = 5; + pixel_x = -4 + }, +/obj/effect/mine/shrapnel, +/turf/open/indestructible/plating, +/area/deathmatch) +"IR" = ( +/obj/structure/mystery_box/tdome{ + pixel_y = 0 + }, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"JD" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/item/weldingtool, +/turf/open/indestructible/plating, +/area/deathmatch) +"JR" = ( +/obj/machinery/door/airlock/maintenance_hatch, +/obj/effect/mapping_helpers/airlock/welded, +/turf/open/indestructible/stone, +/area/deathmatch) +"Kp" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible/white/textured, +/area/deathmatch) +"KL" = ( +/obj/structure/barricade/security/murderdome, +/obj/effect/turf_decal/siding/thinplating/light{ + dir = 8 + }, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"Mh" = ( +/obj/structure/shipping_container/gorlex, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"MF" = ( +/mob/living/basic/bot/medbot, +/obj/structure/closet/crate/medical, +/turf/open/indestructible/dark, +/area/deathmatch) +"MJ" = ( +/obj/effect/turf_decal/caution{ + dir = 8 + }, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"Nn" = ( +/turf/open/indestructible/white/textured, +/area/deathmatch) +"NT" = ( +/obj/effect/spawner/random/structure/crate_abandoned, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"NZ" = ( +/obj/structure/fence{ + dir = 4 + }, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"Oc" = ( +/obj/effect/mine/explosive, +/turf/open/indestructible/plating, +/area/deathmatch) +"Ol" = ( +/obj/machinery/light/floor, +/turf/open/indestructible/stone, +/area/deathmatch) +"Oz" = ( +/turf/open/indestructible/rockyground, +/area/deathmatch) +"Pi" = ( +/obj/structure/closet/crate/wooden, +/obj/effect/spawner/random/maintenance/four, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"Ps" = ( +/obj/structure/fence/corner, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"PB" = ( +/obj/structure/fermenting_barrel/gunpowder, +/turf/open/indestructible/stone, +/area/deathmatch) +"PN" = ( +/obj/structure/fence/corner{ + dir = 8 + }, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"PP" = ( +/obj/machinery/light/directional/south, +/turf/open/indestructible/stone, +/area/deathmatch) +"Qa" = ( +/turf/closed/indestructible/riveted, +/area/deathmatch) +"Qb" = ( +/obj/structure/sign/departments/exam_room/directional/south, +/obj/structure/chair{ + dir = 8 + }, +/turf/open/indestructible/white/textured, +/area/deathmatch) +"Re" = ( +/obj/structure/reagent_dispensers/fueltank/large, +/turf/open/indestructible/plating, +/area/deathmatch) +"RE" = ( +/obj/machinery/griddle, +/obj/item/storage/box/syndie_kit/throwing_weapons{ + pixel_y = 7 + }, +/turf/open/indestructible/stone, +/area/deathmatch) +"RX" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible/stone, +/area/deathmatch) +"Sv" = ( +/obj/structure/table, +/obj/item/stack/medical/mesh, +/turf/open/indestructible/dark, +/area/deathmatch) +"SG" = ( +/obj/machinery/button/door/directional/west{ + id = "outskirtshutter" + }, +/turf/open/indestructible/stone, +/area/deathmatch) +"Tr" = ( +/obj/effect/turf_decal/caution{ + dir = 4 + }, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"TE" = ( +/obj/machinery/light/floor, +/obj/effect/turf_decal/siding/thinplating/light{ + dir = 8 + }, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"TK" = ( +/obj/structure/sign/departments/med/directional/west, +/obj/structure/closet/crate/trashcart/filled, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"Vh" = ( +/obj/effect/spawner/random/trash/hobo_squat, +/obj/item/melee/baseball_bat, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"Wa" = ( +/obj/structure/showcase/machinery/tv, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"WB" = ( +/obj/structure/closet/crate/trashcart/filled, +/obj/effect/light_emitter/fake_outdoors, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"XD" = ( +/obj/structure/rack, +/turf/open/indestructible/dark, +/area/deathmatch) +"Yf" = ( +/obj/effect/light_emitter/fake_outdoors, +/turf/open/indestructible/rockyground, +/area/deathmatch) +"Yg" = ( +/obj/structure/sign/poster/contraband/donk_co/directional/north, +/turf/open/indestructible/stone, +/area/deathmatch) +"YU" = ( +/obj/structure/barricade/wooden, +/obj/structure/barricade/wooden/crude, +/turf/open/indestructible/plating, +/area/deathmatch) +"YV" = ( +/obj/structure/closet/secure_closet/freezer/fridge/all_access, +/obj/item/reagent_containers/condiment/bbqsauce, +/obj/item/reagent_containers/condiment/bbqsauce, +/turf/open/indestructible/stone, +/area/deathmatch) +"Ze" = ( +/obj/structure/chair/stool/directional/west, +/turf/open/indestructible/stone, +/area/deathmatch) + +(1,1,1) = {" +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +"} +(2,1,1) = {" +Qa +jH +jH +jH +jH +kU +jH +im +MF +Qa +fu +Oz +Oz +xi +Oz +iQ +Oz +Oz +Oz +Oz +iQ +Oz +Vh +Qa +"} +(3,1,1) = {" +Qa +jH +jH +iS +XD +jH +jH +jH +jH +Qa +xi +Oz +Yf +Oz +Oz +Oz +Yf +IR +Oz +Oz +Yf +EZ +Oz +Qa +"} +(4,1,1) = {" +Qa +jH +jH +Qa +Qa +BC +Sv +fU +Qa +Qa +fx +xi +Oz +Oz +xi +fx +xi +Oz +Oz +Oz +Wa +Oz +Oz +Qa +"} +(5,1,1) = {" +Qa +jH +jH +Qa +Nn +Nn +Nn +Nn +Ea +Qa +IR +Oz +MJ +Oz +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +"} +(6,1,1) = {" +Qa +jH +jH +oU +Nn +DJ +Kp +DJ +Qb +Qa +EZ +Dq +CJ +bR +Oz +Qa +Oz +Oz +Oz +Oz +Yf +xi +Oz +Qa +"} +(7,1,1) = {" +Qa +df +jH +Qa +Nn +Nn +Nn +Nn +DJ +Qa +re +Oz +Tr +Oz +xi +Oz +Yf +Oz +Qa +IR +Oz +iQ +Oz +Qa +"} +(8,1,1) = {" +Qa +Qa +Qa +Qa +Qa +KL +TE +KL +Qa +Qa +Qa +wt +wt +mB +Qa +Qa +pc +Qa +Qa +Qa +Qa +Oz +Oz +Qa +"} +(9,1,1) = {" +Qa +Oz +ms +xi +in +Oz +Oz +Oz +TK +xi +Oz +Oz +zl +Oz +Qa +Re +Oc +Re +Re +Re +Qa +kc +Oz +Qa +"} +(10,1,1) = {" +Qa +Oz +Yf +EZ +NZ +Oz +Oz +Yf +Oz +Oz +zl +Oz +Yf +Oz +Qa +Qa +pc +Qa +Qa +Qa +Qa +Oz +Oz +Qa +"} +(11,1,1) = {" +Qa +Oz +Oz +FF +NZ +Oz +xi +cP +Oz +Oz +Oz +Oz +Oz +Oz +Oz +hC +FP +zl +IR +Oz +Oz +Oz +iQ +Qa +"} +(12,1,1) = {" +Qa +Oz +Oz +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +kc +Oz +Oz +zl +Oz +Yf +Oz +Oz +Oz +Yf +xi +fx +Qa +"} +(13,1,1) = {" +Qa +Oz +xi +Qa +nS +Eb +hN +Qa +EZ +Oz +Oz +Oz +Oz +Oz +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +"} +(14,1,1) = {" +Qa +Oz +WB +Qa +hN +Ol +hN +xy +Oz +PN +uY +uB +Mh +Oz +Qa +hN +zr +hN +hN +hN +hN +hN +hN +Qa +"} +(15,1,1) = {" +Qa +Oz +xi +Qa +hN +hN +hN +xy +Oz +NZ +Pi +Oz +Oz +Oz +Qa +hN +hN +hN +fI +wR +hN +YV +PP +Qa +"} +(16,1,1) = {" +Qa +zl +Oz +Qa +oU +Ip +Qa +Qa +Oz +NZ +Bf +Oz +Oz +cF +Qa +jy +hN +RX +hN +hN +hN +hN +hN +Qa +"} +(17,1,1) = {" +Qa +Oz +Oz +iQ +Oz +Oz +kc +iQ +Oz +Ps +fT +Oz +sR +Oz +bc +gG +hN +ub +RE +bw +hN +ub +hN +Qa +"} +(18,1,1) = {" +Qa +Oz +Oz +zQ +Oz +Yf +Oz +zQ +Oz +Oz +Oz +gg +Yf +iQ +AZ +hN +hN +hN +hN +hN +hN +hN +hN +Qa +"} +(19,1,1) = {" +Qa +Oz +zl +Qa +Qa +YU +Qa +Qa +Oz +Oz +Oz +NT +Oz +Oz +AZ +hN +ub +hN +hN +hN +ub +hN +hN +Qa +"} +(20,1,1) = {" +Qa +Oz +Oz +Qa +JD +vV +JD +Qa +Oz +Oz +Oz +Oz +zl +Oz +fE +hN +hN +hN +mg +mg +hN +Eb +hN +Qa +"} +(21,1,1) = {" +Qa +Oz +Oz +Qa +Qa +Qa +Qa +Qa +xp +xp +Qa +Oz +Oz +cF +Qa +Yg +uW +hN +hN +hN +hN +cH +hN +Qa +"} +(22,1,1) = {" +Qa +Oz +Oz +Qa +hN +Eb +hN +SG +Ze +hN +Qa +Oz +Oz +zl +Qa +hN +zP +hN +hN +RX +hN +Ce +PP +Qa +"} +(23,1,1) = {" +Qa +xi +Yf +JR +hN +hN +hN +hN +hN +hN +Qa +CP +Ei +Oz +Qa +hN +hN +hN +tQ +uW +hN +PB +hN +Qa +"} +(24,1,1) = {" +Qa +fx +xi +Qa +hN +hN +Cd +hN +EL +fv +Qa +Oz +Oz +Oz +Qa +hN +hN +hN +hN +hN +hN +hN +hN +Qa +"} +(25,1,1) = {" +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +Qa +"} diff --git a/_maps/map_files/Deathmatch/shooting_range.dmm b/_maps/map_files/Deathmatch/shooting_range.dmm new file mode 100644 index 00000000000..e6d04007ebd --- /dev/null +++ b/_maps/map_files/Deathmatch/shooting_range.dmm @@ -0,0 +1,750 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/wood, +/area/deathmatch) +"b" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/floor/wood/large, +/area/deathmatch) +"c" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/spawner/structure/window, +/turf/open/floor/wood/large, +/area/deathmatch) +"d" = ( +/obj/item/ammo_box/magazine/m9mm/ap, +/turf/open/floor/wood, +/area/deathmatch) +"e" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/wood, +/area/deathmatch) +"f" = ( +/obj/machinery/light/directional/west, +/obj/structure/barricade/sandbags, +/turf/open/floor/wood, +/area/deathmatch) +"g" = ( +/turf/closed/indestructible/iron, +/area/deathmatch) +"h" = ( +/obj/structure/barricade/wooden, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood/tile, +/area/deathmatch) +"i" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/wood, +/area/deathmatch) +"j" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood/tile, +/area/deathmatch) +"k" = ( +/obj/structure/table/reinforced, +/obj/item/ammo_box/magazine/m9mm/fire, +/turf/open/floor/wood/large, +/area/deathmatch) +"l" = ( +/obj/structure/table/reinforced, +/obj/item/ammo_box/magazine/m9mm, +/obj/item/ammo_box/magazine/m9mm, +/obj/item/ammo_box/magazine/m9mm, +/obj/item/ammo_box/magazine/m9mm, +/obj/item/ammo_box/magazine/m9mm, +/obj/item/ammo_box/magazine/m9mm, +/obj/item/ammo_box/magazine/m9mm, +/obj/item/ammo_box/magazine/m9mm, +/obj/item/ammo_box/magazine/m9mm, +/obj/item/ammo_box/magazine/m9mm, +/obj/item/ammo_box/magazine/m9mm, +/turf/open/floor/wood/large, +/area/deathmatch) +"m" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/tile, +/area/deathmatch) +"n" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/wood, +/area/deathmatch) +"o" = ( +/obj/item/ammo_box/magazine/m9mm/ap, +/obj/structure/closet/crate/secure/weapon{ + locked = 0 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/floor/wood/tile, +/area/deathmatch) +"p" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/wood/tile, +/area/deathmatch) +"q" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood/tile, +/area/deathmatch) +"r" = ( +/obj/item/flashlight/flare, +/turf/open/floor/wood, +/area/deathmatch) +"s" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/wood, +/area/deathmatch) +"t" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/tile, +/area/deathmatch) +"u" = ( +/obj/structure/barricade/sandbags, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/wood, +/area/deathmatch) +"v" = ( +/obj/item/reagent_containers/hypospray/medipen, +/turf/open/floor/wood, +/area/deathmatch) +"x" = ( +/obj/item/ammo_box/magazine/m9mm/fire, +/turf/open/floor/wood, +/area/deathmatch) +"y" = ( +/obj/item/ammo_box/magazine/m9mm/fire, +/obj/structure/closet/crate/secure/weapon{ + locked = 0 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/floor/wood/tile, +/area/deathmatch) +"z" = ( +/turf/open/floor/wood, +/area/deathmatch) +"A" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood/tile, +/area/deathmatch) +"B" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/wood, +/area/deathmatch) +"C" = ( +/obj/structure/table/reinforced, +/obj/item/flashlight/lamp, +/turf/open/floor/wood/large, +/area/deathmatch) +"D" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood/tile, +/area/deathmatch) +"E" = ( +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/wood/tile, +/area/deathmatch) +"F" = ( +/obj/structure/barricade/wooden, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/tile, +/area/deathmatch) +"I" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/tile, +/area/deathmatch) +"K" = ( +/turf/closed/wall, +/area/deathmatch) +"M" = ( +/obj/structure/barricade/sandbags, +/turf/open/floor/wood, +/area/deathmatch) +"O" = ( +/obj/structure/barricade/wooden, +/turf/open/floor/wood, +/area/deathmatch) +"Q" = ( +/obj/item/ammo_box/magazine/m9mm/hp, +/obj/structure/closet/crate/secure/weapon{ + locked = 0 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood/tile, +/area/deathmatch) +"T" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/floor/wood, +/area/deathmatch) +"U" = ( +/turf/open/floor/wood/large, +/area/deathmatch) +"W" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/wood, +/area/deathmatch) +"X" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/large, +/area/deathmatch) +"Y" = ( +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/wood, +/area/deathmatch) + +(1,1,1) = {" +g +g +g +g +g +g +g +g +g +g +g +g +g +g +g +g +g +g +g +g +g +g +"} +(2,1,1) = {" +g +E +j +q +q +h +q +q +q +q +q +q +Q +q +q +q +j +q +q +q +o +g +"} +(3,1,1) = {" +g +I +z +z +T +K +z +z +M +z +z +z +z +z +z +i +z +z +z +z +m +g +"} +(4,1,1) = {" +g +I +z +z +z +K +M +M +M +z +z +z +z +z +O +K +z +z +K +O +m +g +"} +(5,1,1) = {" +g +I +z +a +z +K +z +z +z +z +z +z +e +z +O +z +z +z +z +K +m +g +"} +(6,1,1) = {" +g +F +O +K +z +n +z +z +z +a +z +e +z +z +K +W +e +z +z +z +t +g +"} +(7,1,1) = {" +g +I +z +f +e +z +r +K +K +K +O +O +K +z +K +z +z +T +z +z +m +g +"} +(8,1,1) = {" +g +I +z +M +M +M +z +c +U +U +U +U +X +z +O +z +z +z +z +K +m +g +"} +(9,1,1) = {" +g +I +e +z +v +z +z +K +U +l +b +U +X +z +O +K +K +K +K +O +m +g +"} +(10,1,1) = {" +g +I +z +z +z +z +z +K +U +C +k +U +K +z +z +z +z +M +z +z +m +g +"} +(11,1,1) = {" +g +I +z +z +z +z +z +c +U +U +U +U +O +e +v +z +z +M +x +z +m +g +"} +(12,1,1) = {" +g +I +z +M +M +z +z +K +O +O +K +K +K +z +z +z +z +M +M +z +t +g +"} +(13,1,1) = {" +g +I +z +e +M +z +z +B +z +z +z +u +d +z +z +r +z +z +z +z +m +g +"} +(14,1,1) = {" +g +I +z +z +M +z +z +z +z +M +z +M +z +z +s +K +K +O +O +K +m +g +"} +(15,1,1) = {" +g +I +K +O +O +K +O +z +z +M +z +z +z +z +z +K +T +z +z +K +m +g +"} +(16,1,1) = {" +g +I +z +z +z +z +O +z +K +K +z +K +O +z +z +O +z +z +s +K +m +g +"} +(17,1,1) = {" +g +I +e +z +T +s +K +z +K +z +z +z +O +z +z +O +e +z +z +K +m +g +"} +(18,1,1) = {" +g +I +z +z +z +z +K +Y +K +W +z +z +O +z +z +K +z +z +z +z +m +g +"} +(19,1,1) = {" +g +I +z +z +z +z +K +e +K +z +e +z +K +z +z +K +K +K +K +K +m +g +"} +(20,1,1) = {" +g +I +z +K +K +z +K +z +K +K +z +z +K +e +z +z +z +z +z +z +m +g +"} +(21,1,1) = {" +g +y +D +D +D +D +D +D +D +A +D +D +D +D +D +D +D +D +D +D +p +g +"} +(22,1,1) = {" +g +g +g +g +g +g +g +g +g +g +g +g +g +g +g +g +g +g +g +g +g +g +"} diff --git a/_maps/map_files/Deathmatch/starwars.dmm b/_maps/map_files/Deathmatch/starwars.dmm new file mode 100644 index 00000000000..c1f00546107 --- /dev/null +++ b/_maps/map_files/Deathmatch/starwars.dmm @@ -0,0 +1,2040 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"ai" = ( +/obj/effect/turf_decal/tile/brown/half, +/obj/item/stack/package_wrap, +/turf/open/indestructible/large, +/area/deathmatch) +"ay" = ( +/obj/structure/chair{ + dir = 1 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"aM" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible/large, +/area/deathmatch) +"aY" = ( +/obj/effect/turf_decal/tile/blue/full, +/obj/item/reagent_containers/syringe, +/turf/open/indestructible/white/smooth_large, +/area/deathmatch) +"bE" = ( +/obj/structure/lattice, +/turf/template_noop, +/area/template_noop) +"bR" = ( +/obj/machinery/computer{ + dir = 4 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"ch" = ( +/obj/effect/turf_decal/bot, +/obj/structure/tank_holder/extinguisher, +/turf/open/indestructible/large, +/area/deathmatch) +"cj" = ( +/obj/effect/turf_decal/tile/red/anticorner{ + dir = 1 + }, +/obj/structure/barricade/security/murderdome, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"cp" = ( +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 8 + }, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"cs" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/blood/gibs/down, +/turf/open/indestructible/plating, +/area/deathmatch) +"cL" = ( +/obj/machinery/door/poddoor/shutters/indestructible/preopen{ + id = "Starwars" + }, +/turf/open/indestructible/plating, +/area/deathmatch) +"cM" = ( +/obj/effect/turf_decal/bot, +/turf/open/indestructible/large, +/area/deathmatch) +"dc" = ( +/obj/effect/turf_decal/tile/dark_red{ + dir = 1 + }, +/obj/machinery/computer, +/turf/open/indestructible/large, +/area/deathmatch) +"dg" = ( +/obj/effect/turf_decal/tile/brown/half, +/turf/open/indestructible/large, +/area/deathmatch) +"dw" = ( +/obj/structure/closet/crate/cardboard, +/obj/effect/turf_decal/tile/brown/fourcorners, +/obj/item/mail/junkmail, +/obj/item/ammo_casing/a357, +/obj/item/reagent_containers/syringe/plasma, +/turf/open/indestructible, +/area/deathmatch) +"dF" = ( +/obj/effect/turf_decal/tile/brown/fourcorners, +/obj/effect/turf_decal/delivery, +/turf/open/indestructible, +/area/deathmatch) +"dV" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/structure/table/glass, +/obj/item/stack/medical/mesh, +/turf/open/indestructible/white, +/area/deathmatch) +"ep" = ( +/obj/effect/turf_decal/tile/dark_red/anticorner{ + dir = 4 + }, +/obj/machinery/computer{ + dir = 4 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"ew" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/fluff/fake_scrubber, +/turf/open/indestructible/plating, +/area/deathmatch) +"eH" = ( +/obj/effect/turf_decal/delivery, +/turf/open/indestructible/large, +/area/deathmatch) +"eJ" = ( +/obj/effect/turf_decal/tile/red/full, +/obj/machinery/door/poddoor/shutters/indestructible/preopen{ + id = "Starwars" + }, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"eV" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/structure/table/glass, +/obj/item/reagent_containers/syringe/epinephrine, +/turf/open/indestructible/white, +/area/deathmatch) +"fe" = ( +/obj/effect/turf_decal/tile/red/anticorner{ + dir = 8 + }, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"fs" = ( +/obj/structure/ore_box, +/turf/open/indestructible/large, +/area/deathmatch) +"fy" = ( +/obj/structure/table/glass, +/obj/item/retractor, +/turf/open/indestructible/white/smooth_large, +/area/deathmatch) +"fD" = ( +/obj/effect/turf_decal/tile/dark_red/half{ + dir = 1 + }, +/obj/machinery/computer, +/turf/open/indestructible/large, +/area/deathmatch) +"fN" = ( +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"fU" = ( +/obj/structure/chair, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"gf" = ( +/obj/structure/closet/crate/cardboard, +/obj/effect/turf_decal/tile/brown/fourcorners, +/obj/effect/turf_decal/delivery, +/obj/item/mail/junkmail, +/obj/effect/spawner/random/maintenance, +/obj/item/assembly/igniter, +/turf/open/indestructible, +/area/deathmatch) +"gE" = ( +/obj/effect/turf_decal/box, +/turf/open/indestructible/large, +/area/deathmatch) +"gJ" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/spawner/random/trash/grille_or_waste, +/turf/open/indestructible/plating, +/area/deathmatch) +"gN" = ( +/obj/machinery/button/door{ + id = "Starwars" + }, +/obj/structure/table/reinforced, +/obj/structure/window/spawner/directional/north, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"gR" = ( +/obj/structure/closet/crate/large, +/obj/effect/turf_decal/tile/brown/fourcorners, +/obj/effect/turf_decal/delivery, +/obj/item/mail/junkmail, +/obj/item/stack/cable_coil, +/turf/open/indestructible, +/area/deathmatch) +"ht" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"hJ" = ( +/obj/structure/table/reinforced, +/obj/machinery/button/door{ + id = "Starwars" + }, +/obj/structure/window/spawner/directional/south, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"hV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/insectguts, +/turf/open/indestructible/plating, +/area/deathmatch) +"il" = ( +/obj/structure/table/glass, +/obj/effect/spawner/random/medical/surgery_tool, +/turf/open/indestructible/white/smooth_large, +/area/deathmatch) +"in" = ( +/obj/effect/turf_decal/tile/red/full, +/obj/effect/turf_decal/bot, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"iq" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/gibs/core, +/obj/effect/spawner/random/maintenance/two, +/turf/open/indestructible/plating, +/area/deathmatch) +"ir" = ( +/obj/effect/turf_decal/tile/brown/half{ + dir = 8 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"iz" = ( +/obj/structure/rack, +/obj/item/shield/riot, +/turf/open/indestructible/vault, +/area/deathmatch) +"iH" = ( +/obj/effect/turf_decal/tile/blue/full, +/obj/machinery/light/directional/west, +/obj/structure/table/glass, +/obj/item/stack/medical/suture, +/turf/open/indestructible/white, +/area/deathmatch) +"jh" = ( +/obj/machinery/stasis{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue/full, +/obj/item/reagent_containers/cup/beaker/large, +/turf/open/indestructible/white/smooth_large, +/area/deathmatch) +"jK" = ( +/obj/effect/turf_decal/tile/dark_red/anticorner, +/turf/open/indestructible/large, +/area/deathmatch) +"ks" = ( +/obj/structure/table/glass, +/obj/item/storage/medkit/toxin, +/obj/machinery/light/directional/north, +/turf/open/indestructible/white, +/area/deathmatch) +"kz" = ( +/obj/item/storage/medkit/fire, +/obj/structure/table/glass, +/turf/open/indestructible/white, +/area/deathmatch) +"kA" = ( +/obj/effect/spawner/random/maintenance/three, +/obj/structure/table, +/turf/open/indestructible/plating, +/area/deathmatch) +"kC" = ( +/obj/structure/rack, +/obj/item/gun/energy/e_gun/mini, +/turf/open/indestructible/vault, +/area/deathmatch) +"kD" = ( +/obj/item/reagent_containers/syringe/multiver, +/turf/open/indestructible/white/smooth_large, +/area/deathmatch) +"kF" = ( +/obj/effect/turf_decal/tile/red/full, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"kG" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"mu" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/glass, +/turf/open/indestructible/plating, +/area/deathmatch) +"my" = ( +/obj/effect/turf_decal/tile/blue/full, +/obj/structure/table/glass, +/obj/item/reagent_containers/syringe/contraband/krokodil, +/turf/open/indestructible/white, +/area/deathmatch) +"mz" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/structure/table/glass, +/obj/item/reagent_containers/syringe/contraband/morphine, +/turf/open/indestructible/white, +/area/deathmatch) +"mK" = ( +/obj/structure/tank_holder/extinguisher, +/turf/open/indestructible/white, +/area/deathmatch) +"nl" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/insectguts, +/turf/open/indestructible/plating, +/area/deathmatch) +"nG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/trash/grille_or_waste, +/turf/open/indestructible/plating, +/area/deathmatch) +"nT" = ( +/obj/structure/fluff/fake_scrubber, +/turf/open/indestructible/plating, +/area/deathmatch) +"nV" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/spawner/random/trash/bin, +/obj/item/reagent_containers/cup/glass/drinkingglass, +/turf/open/indestructible/plating, +/area/deathmatch) +"oo" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/trash/grille_or_waste, +/turf/open/indestructible/plating, +/area/deathmatch) +"oq" = ( +/obj/effect/turf_decal/tile/blue/anticorner{ + dir = 1 + }, +/obj/structure/table/glass, +/obj/item/reagent_containers/syringe/contraband/space_drugs, +/turf/open/indestructible/white/smooth_large, +/area/deathmatch) +"oC" = ( +/obj/effect/turf_decal/tile/red/anticorner, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"oL" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/effect/spawner/random/medical/surgery_tool, +/turf/open/indestructible/white, +/area/deathmatch) +"pU" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/table/glass, +/obj/item/reagent_containers/syringe/multiver, +/turf/open/indestructible/white, +/area/deathmatch) +"pX" = ( +/obj/effect/turf_decal/tile/dark_red{ + dir = 8 + }, +/obj/machinery/computer{ + dir = 4 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"qf" = ( +/obj/effect/turf_decal/tile/brown/half{ + dir = 1 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"qm" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/clothing/mask/gas/sechailer/swat, +/obj/machinery/light/floor, +/obj/item/dualsaber/red, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"qs" = ( +/obj/machinery/computer, +/obj/structure/window/spawner/directional/north, +/obj/structure/window/spawner/directional/west, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"qR" = ( +/obj/machinery/computer{ + dir = 1 + }, +/obj/structure/window/spawner/directional/south, +/obj/structure/window/spawner/directional/east, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"qT" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/indestructible/plating, +/area/deathmatch) +"qU" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/grille, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/indestructible/plating, +/area/deathmatch) +"rc" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/indestructible/plating, +/area/deathmatch) +"rj" = ( +/obj/structure/ore_box, +/obj/effect/turf_decal/tile/brown/fourcorners, +/turf/open/indestructible, +/area/deathmatch) +"rk" = ( +/obj/effect/turf_decal/tile/brown/fourcorners, +/obj/item/knife/kitchen, +/turf/open/indestructible, +/area/deathmatch) +"rw" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/vehicle/ridden/wheelchair{ + dir = 1 + }, +/turf/open/indestructible/white, +/area/deathmatch) +"rA" = ( +/obj/effect/turf_decal/tile/red/anticorner{ + dir = 4 + }, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"rO" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/dropper, +/turf/open/indestructible/white/smooth_large, +/area/deathmatch) +"rR" = ( +/obj/structure/closet/crate/large, +/obj/effect/turf_decal/tile/brown/fourcorners, +/obj/item/mail/junkmail, +/obj/item/mail/junkmail, +/obj/item/stack/medical/mesh, +/turf/open/indestructible, +/area/deathmatch) +"rU" = ( +/obj/item/storage/medkit/brute, +/obj/structure/table/glass, +/obj/machinery/light/directional/west, +/turf/open/indestructible/white, +/area/deathmatch) +"rX" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/pill/patch/synthflesh, +/turf/open/indestructible/white, +/area/deathmatch) +"sk" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/glass, +/turf/open/indestructible/plating, +/area/deathmatch) +"sl" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/blue/anticorner{ + dir = 1 + }, +/obj/item/reagent_containers/syringe/contraband/morphine, +/turf/open/indestructible/white/smooth_large, +/area/deathmatch) +"sx" = ( +/obj/effect/turf_decal/tile/red/full, +/obj/machinery/light/directional/west, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"sM" = ( +/obj/effect/turf_decal/tile/red/anticorner{ + dir = 1 + }, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"sQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible/plating, +/area/deathmatch) +"sZ" = ( +/turf/open/indestructible/white/smooth_large, +/area/deathmatch) +"tb" = ( +/obj/effect/turf_decal/tile/red/anticorner{ + dir = 8 + }, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"tl" = ( +/obj/effect/turf_decal/tile/blue/full, +/turf/open/indestructible/white/smooth_large, +/area/deathmatch) +"tm" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/indestructible/plating, +/area/deathmatch) +"to" = ( +/obj/effect/turf_decal/tile/brown/fourcorners, +/obj/effect/turf_decal/delivery, +/obj/machinery/light/directional/east, +/turf/open/indestructible, +/area/deathmatch) +"ty" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/indestructible/plating, +/area/deathmatch) +"tS" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/light/directional/east, +/turf/open/indestructible/large, +/area/deathmatch) +"tU" = ( +/obj/effect/turf_decal/tile/red/full, +/turf/closed/indestructible/reinforced, +/area/deathmatch) +"tV" = ( +/turf/template_noop, +/area/template_noop) +"ub" = ( +/obj/effect/turf_decal/tile/blue/full, +/obj/structure/table/glass, +/obj/item/stack/medical/bone_gel, +/turf/open/indestructible/white/smooth_large, +/area/deathmatch) +"ul" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/indestructible/plating, +/area/deathmatch) +"uC" = ( +/obj/machinery/computer{ + dir = 8 + }, +/obj/structure/window/spawner/directional/east, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"vl" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/heretic_rune/big, +/turf/open/indestructible/plating, +/area/deathmatch) +"vq" = ( +/obj/machinery/computer{ + dir = 4 + }, +/obj/structure/window/spawner/directional/north, +/obj/structure/window/spawner/directional/west, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"vz" = ( +/obj/structure/table/glass, +/turf/open/indestructible/white, +/area/deathmatch) +"vH" = ( +/obj/effect/turf_decal/tile/dark_red/half{ + dir = 8 + }, +/obj/machinery/computer{ + dir = 4 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"vS" = ( +/obj/effect/turf_decal/tile/blue/full, +/obj/structure/table/glass, +/obj/item/reagent_containers/syringe/contraband/bath_salts, +/turf/open/indestructible/white, +/area/deathmatch) +"wd" = ( +/obj/effect/turf_decal/tile/brown/fourcorners, +/obj/structure/reagent_dispensers/beerkeg, +/turf/open/indestructible, +/area/deathmatch) +"yA" = ( +/obj/effect/decal/cleanable/glass, +/turf/open/indestructible/plating, +/area/deathmatch) +"yH" = ( +/obj/machinery/computer, +/turf/open/indestructible/large, +/area/deathmatch) +"zn" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/computer{ + dir = 1 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"zp" = ( +/obj/structure/closet/crate/large, +/obj/item/mail/junkmail, +/obj/item/stack/medical/suture, +/obj/item/food/pie/cream, +/turf/open/floor/glass/reinforced/plasma, +/area/deathmatch) +"zB" = ( +/obj/structure/grille/broken, +/obj/effect/decal/cleanable/blood/gibs/up, +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/indestructible/plating, +/area/deathmatch) +"zF" = ( +/obj/effect/turf_decal/bot_red, +/turf/open/indestructible/large, +/area/deathmatch) +"zH" = ( +/obj/effect/turf_decal/tile/red/anticorner{ + dir = 4 + }, +/obj/structure/barricade/security/murderdome, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"zK" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/turf/open/indestructible/white, +/area/deathmatch) +"Ax" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/trash/can/food, +/turf/open/indestructible/plating, +/area/deathmatch) +"AT" = ( +/turf/open/indestructible/plating, +/area/deathmatch) +"AU" = ( +/obj/machinery/light/directional/north, +/obj/structure/tank_holder/extinguisher, +/turf/open/indestructible/white, +/area/deathmatch) +"Bf" = ( +/obj/effect/turf_decal/bot/left, +/turf/open/indestructible/large, +/area/deathmatch) +"Bg" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/indestructible/plating, +/area/deathmatch) +"Bm" = ( +/obj/effect/spawner/random/trash/grille_or_waste, +/turf/open/indestructible/plating, +/area/deathmatch) +"Bp" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/assembly/igniter, +/turf/open/indestructible/plating, +/area/deathmatch) +"Bt" = ( +/obj/effect/spawner/random/structure/closet_maintenance, +/obj/item/reagent_containers/cup/glass/drinkingglass, +/obj/item/reagent_containers/syringe/plasma, +/turf/open/indestructible/plating, +/area/deathmatch) +"BC" = ( +/turf/open/floor/glass/reinforced/plasma, +/area/deathmatch) +"Cf" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/computer{ + dir = 4 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"Cj" = ( +/obj/effect/turf_decal/tile/dark_red, +/turf/open/indestructible/large, +/area/deathmatch) +"Co" = ( +/obj/effect/turf_decal/tile/blue/anticorner{ + dir = 1 + }, +/turf/open/indestructible/white/smooth_large, +/area/deathmatch) +"Cv" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/directional/north, +/turf/open/indestructible/plating, +/area/deathmatch) +"CX" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/structure/bed/medical/emergency, +/turf/open/indestructible/white, +/area/deathmatch) +"Df" = ( +/obj/effect/turf_decal/tile/brown/fourcorners, +/turf/open/indestructible, +/area/deathmatch) +"DA" = ( +/obj/effect/turf_decal/tile/dark_red/anticorner{ + dir = 1 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"DD" = ( +/obj/effect/turf_decal/tile/brown/fourcorners, +/obj/effect/turf_decal/delivery, +/obj/machinery/light/directional/south, +/obj/structure/tank_holder/extinguisher, +/turf/open/indestructible, +/area/deathmatch) +"Ef" = ( +/obj/structure/closet/crate/cardboard, +/obj/item/mail/junkmail, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/glass/reinforced/plasma, +/area/deathmatch) +"Et" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible/white, +/area/deathmatch) +"Ew" = ( +/obj/effect/turf_decal/tile/dark_red{ + dir = 1 + }, +/obj/machinery/computer{ + dir = 8 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"Ey" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/grille, +/turf/open/indestructible/plating, +/area/deathmatch) +"EG" = ( +/obj/effect/turf_decal/tile/dark_red/anticorner{ + dir = 8 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"ES" = ( +/obj/structure/grille/broken, +/obj/effect/decal/cleanable/glass, +/turf/open/indestructible/plating, +/area/deathmatch) +"EZ" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/item/reagent_containers/syringe/plasma, +/turf/open/indestructible/white, +/area/deathmatch) +"Fg" = ( +/obj/effect/turf_decal/tile/blue/full, +/obj/structure/table/glass, +/obj/item/circular_saw, +/turf/open/indestructible/white/smooth_large, +/area/deathmatch) +"Gv" = ( +/obj/effect/turf_decal/tile/brown/half{ + dir = 4 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"GT" = ( +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/bot, +/turf/open/indestructible/large, +/area/deathmatch) +"Hq" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/closet/crate/trashcart/filled, +/obj/item/reagent_containers/cup/glass/drinkingglass, +/turf/open/indestructible/plating, +/area/deathmatch) +"HE" = ( +/obj/structure/closet/crate/large, +/obj/item/mail/junkmail, +/obj/item/mail/junkmail, +/obj/item/mail/junkmail, +/obj/item/storage/toolbox/ammobox/strilka310, +/turf/open/indestructible/large, +/area/deathmatch) +"HL" = ( +/obj/structure/reagent_dispensers/watertank, +/turf/open/indestructible/plating, +/area/deathmatch) +"Is" = ( +/obj/machinery/light/floor, +/turf/open/indestructible/vault, +/area/deathmatch) +"Iw" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/structure/bed/medical/emergency, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible/white, +/area/deathmatch) +"IC" = ( +/obj/effect/spawner/structure/window/reinforced/indestructible, +/turf/open/indestructible/plating, +/area/deathmatch) +"Jc" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/syringe, +/turf/open/indestructible/white/smooth_large, +/area/deathmatch) +"Js" = ( +/obj/effect/turf_decal/bot_red/left, +/turf/open/indestructible/large, +/area/deathmatch) +"Jv" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/indestructible/plating, +/area/deathmatch) +"Jx" = ( +/obj/machinery/computer{ + dir = 8 + }, +/obj/structure/window/spawner/directional/south, +/obj/structure/window/spawner/directional/east, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"JE" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/computer{ + dir = 8 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"JF" = ( +/obj/structure/closet/crate/large, +/obj/item/mail/junkmail, +/obj/item/ammo_casing/shotgun/buckshot, +/turf/open/floor/glass/reinforced/plasma, +/area/deathmatch) +"Ke" = ( +/obj/machinery/computer{ + dir = 4 + }, +/obj/structure/window/spawner/directional/west, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"Ku" = ( +/obj/effect/turf_decal/tile/red/anticorner, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"Ky" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/item/reagent_containers/syringe/calomel, +/turf/open/indestructible/white, +/area/deathmatch) +"Kz" = ( +/obj/effect/spawner/random/trash/box, +/obj/item/ammo_box/a357, +/turf/open/indestructible/plating, +/area/deathmatch) +"KC" = ( +/obj/structure/closet/crate/cardboard, +/obj/effect/turf_decal/tile/brown/fourcorners, +/obj/item/mail/junkmail, +/obj/item/mail/junkmail, +/obj/effect/spawner/random/maintenance, +/turf/open/indestructible, +/area/deathmatch) +"KJ" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/floor/glass/reinforced/plasma, +/area/deathmatch) +"KM" = ( +/obj/effect/turf_decal/tile/blue/full, +/obj/structure/table/glass, +/obj/item/reagent_containers/syringe, +/turf/open/indestructible/white, +/area/deathmatch) +"KS" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/item/spear/explosive, +/obj/effect/spawner/random/trash/box, +/turf/open/indestructible/plating, +/area/deathmatch) +"KX" = ( +/turf/closed/indestructible/reinforced, +/area/deathmatch) +"LE" = ( +/obj/effect/turf_decal/tile/dark_red{ + dir = 1 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"LM" = ( +/obj/structure/closet/crate/large, +/obj/item/mail/junkmail, +/obj/item/mail/junkmail, +/obj/item/throwing_star, +/turf/open/indestructible/large, +/area/deathmatch) +"LS" = ( +/obj/effect/turf_decal/tile/dark_red{ + dir = 8 + }, +/obj/machinery/computer{ + dir = 1 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"LY" = ( +/obj/structure/closet/secure_closet, +/obj/item/gun/energy/beam_rifle, +/turf/open/indestructible/vault, +/area/deathmatch) +"Mc" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/glass, +/turf/open/indestructible/plating, +/area/deathmatch) +"Me" = ( +/obj/structure/rack, +/obj/item/throwing_star, +/turf/open/indestructible/vault, +/area/deathmatch) +"Mx" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/syringe/calomel, +/turf/open/indestructible/white/smooth_large, +/area/deathmatch) +"ME" = ( +/obj/effect/spawner/random/trash/soap, +/obj/machinery/door/poddoor/shutters/indestructible/preopen{ + id = "Starwars" + }, +/turf/open/indestructible/plating, +/area/deathmatch) +"MN" = ( +/obj/structure/ore_box, +/obj/effect/turf_decal/tile/brown/fourcorners, +/obj/effect/turf_decal/delivery, +/turf/open/indestructible, +/area/deathmatch) +"MT" = ( +/obj/structure/grille/broken, +/turf/open/indestructible/plating, +/area/deathmatch) +"Nc" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/grille/broken, +/obj/item/extinguisher, +/turf/open/indestructible/plating, +/area/deathmatch) +"Nv" = ( +/obj/item/reagent_containers/syringe/syriniver, +/turf/open/indestructible/white/smooth_large, +/area/deathmatch) +"NF" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/light/directional/north, +/obj/machinery/computer, +/turf/open/indestructible/large, +/area/deathmatch) +"NL" = ( +/obj/structure/ore_box, +/obj/effect/turf_decal/box, +/turf/open/indestructible/large, +/area/deathmatch) +"NP" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/light/directional/south, +/obj/machinery/computer{ + dir = 1 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"NV" = ( +/obj/machinery/computer{ + dir = 8 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"Og" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/grille/broken, +/obj/effect/decal/cleanable/glass, +/turf/open/indestructible/plating, +/area/deathmatch) +"Ot" = ( +/obj/effect/turf_decal/tile/dark_red{ + dir = 4 + }, +/obj/machinery/computer, +/turf/open/indestructible/large, +/area/deathmatch) +"Pj" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/computer{ + dir = 8 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"Po" = ( +/obj/effect/turf_decal/tile/red/full, +/obj/machinery/light/directional/south, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"Pp" = ( +/obj/structure/ore_box, +/turf/open/floor/glass/reinforced/plasma, +/area/deathmatch) +"PH" = ( +/obj/machinery/computer{ + dir = 1 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"PK" = ( +/obj/structure/holosign/barrier, +/turf/open/indestructible/vault, +/area/deathmatch) +"PV" = ( +/obj/effect/turf_decal/tile/dark_red/half{ + dir = 4 + }, +/obj/machinery/computer{ + dir = 8 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"Qd" = ( +/turf/open/indestructible/large, +/area/deathmatch) +"Qh" = ( +/obj/structure/grille/broken, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/indestructible/plating, +/area/deathmatch) +"QE" = ( +/obj/effect/turf_decal/bot_red, +/obj/structure/chair{ + dir = 4 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"QF" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/computer, +/turf/open/indestructible/large, +/area/deathmatch) +"QG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/trash/boritos, +/turf/open/indestructible/plating, +/area/deathmatch) +"QO" = ( +/obj/structure/closet, +/obj/item/toy/plush/lizard_plushie/green, +/turf/template_noop, +/area/template_noop) +"QS" = ( +/obj/effect/turf_decal/bot_red, +/turf/open/indestructible/plating, +/area/deathmatch) +"QU" = ( +/obj/effect/turf_decal/bot, +/obj/structure/chair{ + dir = 8 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"Ra" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/glass, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/indestructible/plating, +/area/deathmatch) +"Rt" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/stack/cable_coil, +/turf/open/indestructible/plating, +/area/deathmatch) +"RJ" = ( +/obj/effect/decal/cleanable/greenglow, +/obj/item/stack/medical/suture, +/turf/open/indestructible/plating, +/area/deathmatch) +"Sh" = ( +/obj/effect/turf_decal/tile/dark_red/half, +/obj/machinery/computer{ + dir = 1 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"SI" = ( +/obj/effect/turf_decal/tile/brown/fourcorners, +/obj/structure/closet/crate/mail, +/obj/item/clothing/under/misc/mailman, +/obj/item/clothing/head/costume/mailman, +/turf/open/indestructible, +/area/deathmatch) +"SV" = ( +/obj/structure/closet/crate/cardboard, +/obj/effect/turf_decal/tile/brown/fourcorners, +/obj/item/mail/junkmail, +/obj/effect/spawner/random/maintenance, +/turf/open/indestructible, +/area/deathmatch) +"Tj" = ( +/turf/open/indestructible/white, +/area/deathmatch) +"TB" = ( +/obj/effect/turf_decal/tile/dark_red/anticorner{ + dir = 4 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"UQ" = ( +/obj/effect/turf_decal/tile/dark_red{ + dir = 4 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"US" = ( +/turf/closed/indestructible/reinforced, +/area/deathmatch) +"Ve" = ( +/obj/effect/turf_decal/tile/red/full, +/obj/structure/barricade/security/murderdome, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"Vz" = ( +/obj/machinery/stasis{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue/full, +/turf/open/indestructible/white/smooth_large, +/area/deathmatch) +"VG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/grille, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/indestructible/plating, +/area/deathmatch) +"WG" = ( +/obj/structure/table, +/obj/effect/spawner/random/maintenance/four, +/turf/open/indestructible/plating, +/area/deathmatch) +"Xf" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/light/directional/west, +/obj/machinery/computer{ + dir = 4 + }, +/turf/open/indestructible/large, +/area/deathmatch) +"Xk" = ( +/obj/effect/turf_decal/tile/blue/anticorner, +/turf/open/indestructible/white/smooth_large, +/area/deathmatch) +"Xn" = ( +/obj/structure/grille, +/turf/open/indestructible/plating, +/area/deathmatch) +"Xq" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/cup/beaker/large, +/obj/item/stack/medical/mesh, +/turf/open/indestructible/white, +/area/deathmatch) +"XG" = ( +/obj/effect/spawner/structure/window, +/turf/open/indestructible/plating, +/area/deathmatch) +"XV" = ( +/obj/effect/spawner/random/structure/closet_maintenance, +/obj/item/stack/cable_coil, +/turf/open/indestructible/plating, +/area/deathmatch) +"Ye" = ( +/obj/effect/turf_decal/tile/brown/fourcorners, +/obj/structure/closet/crate/large, +/obj/item/mail/junkmail, +/obj/item/mail/junkmail, +/obj/item/mail/junkmail, +/obj/item/reagent_containers/medigel/synthflesh, +/turf/open/indestructible, +/area/deathmatch) +"Yf" = ( +/obj/effect/turf_decal/tile/red/anticorner, +/obj/structure/barricade/security/murderdome, +/turf/open/indestructible/dark/smooth_large, +/area/deathmatch) +"Yg" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/blue/full, +/obj/item/reagent_containers/syringe/contraband/saturnx, +/turf/open/indestructible/white/smooth_large, +/area/deathmatch) +"Yk" = ( +/turf/open/indestructible/vault, +/area/deathmatch) +"Ym" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/glass, +/obj/machinery/light/directional/east, +/turf/open/indestructible/plating, +/area/deathmatch) +"Yz" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/blood/tracks, +/obj/structure/fluff/fake_scrubber, +/turf/open/indestructible/plating, +/area/deathmatch) +"Za" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/vehicle/ridden/wheelchair{ + dir = 8 + }, +/turf/open/indestructible/white, +/area/deathmatch) +"ZC" = ( +/obj/effect/turf_decal/tile/brown/half{ + dir = 1 + }, +/obj/item/stack/package_wrap, +/turf/open/indestructible/large, +/area/deathmatch) + +(1,1,1) = {" +tV +bE +bE +bE +bE +bE +bE +KX +KX +KX +KX +KX +KX +KX +KX +KX +KX +KX +KX +KX +tV +tV +tV +tV +tV +tV +tV +"} +(2,1,1) = {" +bE +QO +bE +tV +tV +IC +KX +KX +vS +iH +mK +vz +mz +KX +Ve +Ve +kF +sx +kF +KX +KX +tV +tV +tV +tV +tV +tV +"} +(3,1,1) = {" +bE +bE +tV +tV +IC +IC +US +Vz +sZ +sZ +sZ +Tj +zK +kF +sM +tb +sM +tb +Ve +kF +tU +KX +KX +tV +tV +tV +tV +"} +(4,1,1) = {" +bE +tV +tV +IC +IC +rU +KX +ub +sZ +Jc +fy +Tj +zK +kF +rA +Ku +zH +cp +tb +Ve +KX +kC +KX +KX +tV +tV +tV +"} +(5,1,1) = {" +bE +tV +IC +IC +kz +Xk +Fg +sl +sZ +sZ +sZ +Tj +Et +KX +kF +cj +tb +rA +Ku +KX +LY +Yk +Is +KX +KX +tV +tV +"} +(6,1,1) = {" +bE +IC +IC +ks +Xk +tl +Co +sZ +sZ +Nv +sZ +Xq +eV +KX +kF +rA +oC +cj +tb +KX +Yk +Yk +Yk +iz +KX +tV +tV +"} +(7,1,1) = {" +bE +KX +KX +KX +aY +Co +sZ +sZ +il +Za +CX +XG +XG +KX +KX +KX +Ve +rA +Ku +kF +PK +Yk +Me +KX +tU +KX +tV +"} +(8,1,1) = {" +KX +KX +jh +Yg +oq +sZ +sZ +sZ +pU +XG +XG +XG +eH +Xf +Cf +KX +KX +kF +sM +tb +kF +KX +KX +kF +kF +KX +KX +"} +(9,1,1) = {" +KX +my +sZ +sZ +sZ +sZ +Jc +rO +XG +XG +QF +eH +Qd +Qd +Qd +bR +bR +in +rA +Ku +sM +tb +cj +tb +Ve +kF +KX +"} +(10,1,1) = {" +KX +KM +kD +Mx +il +sZ +rw +XG +XG +eH +yH +Qd +pX +vH +LE +QU +GT +Js +in +kF +rA +Yf +rA +cp +fe +Ve +KX +"} +(11,1,1) = {" +KX +AU +sZ +sZ +sZ +sZ +Iw +XG +QF +Qd +Cj +jK +BC +BC +BC +ep +UQ +cM +PH +KX +kF +sM +tb +rA +Ku +kF +KX +"} +(12,1,1) = {" +KX +rX +Tj +Tj +Tj +Tj +XG +XG +eH +Qd +jK +BC +vq +Ke +fN +BC +TB +cM +PH +KX +KX +rA +Ku +cj +tb +Po +KX +"} +(13,1,1) = {" +KX +oL +EZ +zK +dV +Ky +XG +QF +ay +Ot +BC +qs +fN +fN +fN +fN +BC +Cj +Qd +ch +KX +kF +Ve +rA +Ku +kF +KX +"} +(14,1,1) = {" +KX +KX +ME +cL +KX +KX +KX +NF +aM +fD +BC +gN +fN +qm +fN +hJ +BC +Sh +aM +NP +KX +KX +KX +eJ +eJ +KX +KX +"} +(15,1,1) = {" +KX +nV +Jv +Yz +Bm +RJ +KX +ch +Qd +dc +BC +fN +fN +fN +fU +qR +BC +LS +Qd +zn +XG +SV +Df +Df +Df +gR +KX +"} +(16,1,1) = {" +KX +ul +mu +Ra +yA +gJ +KX +KX +Qd +zF +EG +BC +fN +uC +Jx +BC +DA +Qd +eH +XG +XG +fs +dg +BC +BC +MN +KX +"} +(17,1,1) = {" +KX +Cv +hV +rc +vl +Ey +ES +KX +yH +zF +pX +EG +BC +BC +BC +DA +Ew +Qd +eH +XG +SI +fs +ai +BC +BC +MN +KX +"} +(18,1,1) = {" +KX +XV +ul +cs +iq +Ey +nT +AT +QS +Bf +QE +zF +Cj +PV +UQ +Qd +Qd +eH +XG +XG +fs +HE +dg +BC +BC +DD +KX +"} +(19,1,1) = {" +KX +ty +Bm +Ey +zB +sk +qT +nl +qT +QS +NV +NV +Qd +Qd +Qd +JE +JE +XG +XG +wd +Qd +Qd +kG +ir +ir +gf +KX +"} +(20,1,1) = {" +KX +KX +MT +Ax +tm +Jv +Jv +Ey +mu +AT +KX +KX +Pj +tS +JE +XG +XG +XG +KC +Qd +gE +BC +KJ +LM +rj +KX +KX +"} +(21,1,1) = {" +tV +KX +Kz +AT +qT +oo +Ey +Bp +Bg +QG +Bm +KX +KX +KX +XG +XG +rR +Qd +Qd +NL +Pp +Ef +BC +fs +rj +KX +tV +"} +(22,1,1) = {" +tV +KX +KX +KS +AT +qT +qT +AT +ew +sQ +VG +kA +AT +KX +Df +fs +fs +Qd +Qd +Pp +Pp +zp +gE +rk +IC +IC +bE +"} +(23,1,1) = {" +tV +tV +KX +KX +AT +Qh +qT +mu +Mc +ul +qU +mu +Nc +KX +Df +Gv +Gv +Gv +ht +BC +BC +gE +Df +IC +IC +tV +bE +"} +(24,1,1) = {" +tV +tV +tV +KX +KX +WG +AT +Xn +nl +qT +Og +ul +ul +AT +Df +BC +KJ +BC +qf +fs +fs +dw +IC +IC +tV +tV +bE +"} +(25,1,1) = {" +tV +tV +tV +tV +KX +KX +HL +Bm +qT +Rt +Ey +ew +rc +AT +Df +JF +Pp +BC +ZC +rj +Ye +IC +IC +tV +bE +tV +bE +"} +(26,1,1) = {" +tV +tV +tV +tV +tV +KX +KX +KX +Bt +Ym +ty +nG +Hq +KX +dF +MN +MN +to +dF +KX +KX +IC +tV +tV +tV +bE +tV +"} +(27,1,1) = {" +tV +tV +tV +tV +tV +tV +tV +KX +KX +KX +KX +KX +KX +KX +KX +KX +KX +KX +KX +KX +tV +bE +bE +bE +bE +tV +tV +"} diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 1ed7706202c..28143ce53ea 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -1408,7 +1408,7 @@ /obj/structure/bed{ dir = 4 }, -/obj/item/bedsheet/dorms{ +/obj/effect/spawner/random/bedsheet{ dir = 1 }, /obj/item/pillow/random, @@ -30045,10 +30045,7 @@ location = "QM #1" }, /obj/effect/turf_decal/delivery, -/mob/living/simple_animal/bot/mulebot{ - home_destination = "QM #3"; - suffix = "#3" - }, +/mob/living/simple_animal/bot/mulebot, /turf/open/floor/iron, /area/station/cargo/storage) "htQ" = ( @@ -55692,7 +55689,7 @@ /area/station/maintenance/department/science) "nTU" = ( /obj/structure/bed, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/start/hangover, /obj/item/pillow/random, @@ -58795,7 +58792,7 @@ /area/station/maintenance/department/science) "oLO" = ( /obj/structure/bed, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/machinery/status_display/evac/directional/east, /obj/item/pillow/random, /turf/open/floor/wood, @@ -63738,7 +63735,7 @@ /obj/structure/bed{ dir = 4 }, -/obj/item/bedsheet/dorms{ +/obj/effect/spawner/random/bedsheet{ dir = 1 }, /obj/machinery/status_display/evac/directional/north, @@ -81530,10 +81527,7 @@ id = "warehouse_shutters"; name = "warehouse shutters control" }, -/mob/living/simple_animal/bot/mulebot{ - home_destination = "QM #1"; - suffix = "#1" - }, +/mob/living/simple_animal/bot/mulebot, /turf/open/floor/iron, /area/station/cargo/storage) "upB" = ( @@ -82693,7 +82687,7 @@ /area/station/tcommsat/server) "uEo" = ( /obj/structure/bed/double, -/obj/item/bedsheet/dorms_double, +/obj/effect/spawner/random/bedsheet/double, /obj/machinery/status_display/evac/directional/east, /obj/effect/landmark/start/hangover, /obj/item/pillow/random, @@ -93655,7 +93649,7 @@ /area/station/science/genetics) "xso" = ( /obj/structure/bed/double, -/obj/item/bedsheet/random/double, +/obj/effect/spawner/random/bedsheet/any/double, /turf/open/floor/wood, /area/station/maintenance/port/aft) "xsp" = ( diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index bb606d6d2a9..dc78c9b621c 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -6937,7 +6937,7 @@ /area/station/engineering/atmos/project) "ccp" = ( /obj/structure/bed, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/effect/landmark/start/hangover, /obj/machinery/button/door/directional/south{ id = "Dorm5"; @@ -10056,7 +10056,7 @@ /area/station/cargo/office) "cXp" = ( /obj/structure/bed/pod, -/obj/item/bedsheet/random, +/obj/effect/spawner/random/bedsheet/any, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/maintenance/port/fore) @@ -10419,7 +10419,7 @@ "dcq" = ( /obj/structure/bed, /obj/machinery/airalarm/directional/north, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/machinery/button/door/directional/east{ id = "Dorm3"; name = "Dorm Bolt Control"; @@ -34263,7 +34263,7 @@ /area/station/hallway/secondary/service) "kzv" = ( /obj/structure/bed, -/obj/item/bedsheet/random, +/obj/effect/spawner/random/bedsheet/any, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) "kzw" = ( @@ -41239,7 +41239,7 @@ }, /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, -/obj/machinery/bouldertech/brm, +/obj/machinery/brm, /turf/open/floor/iron, /area/mine/production) "mHu" = ( @@ -41366,7 +41366,7 @@ "mJO" = ( /obj/structure/bed, /obj/machinery/airalarm/directional/north, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/machinery/button/door/directional/east{ id = "Dorm2"; name = "Dorm Bolt Control"; @@ -45231,7 +45231,7 @@ "nOl" = ( /obj/structure/bed, /obj/machinery/airalarm/directional/north, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/effect/landmark/start/hangover, /obj/machinery/button/door/directional/east{ id = "Dorm4"; @@ -49810,7 +49810,7 @@ /area/station/hallway/primary/central) "piC" = ( /obj/structure/bed, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/machinery/button/door/directional/south{ id = "Dorm6"; name = "Cabin Bolt Control"; @@ -58780,10 +58780,7 @@ }, /obj/effect/turf_decal/bot, /obj/machinery/light/small/directional/east, -/mob/living/simple_animal/bot/mulebot{ - home_destination = "QM #2"; - suffix = "#2" - }, +/mob/living/simple_animal/bot/mulebot, /turf/open/floor/iron, /area/station/cargo/storage) "rUz" = ( @@ -63486,7 +63483,7 @@ /obj/structure/bed{ dir = 1 }, -/obj/item/bedsheet/dorms{ +/obj/effect/spawner/random/bedsheet{ dir = 1 }, /obj/effect/spawner/random/contraband/permabrig_gear, @@ -66638,7 +66635,7 @@ /obj/structure/bed{ dir = 1 }, -/obj/item/bedsheet/dorms{ +/obj/effect/spawner/random/bedsheet{ dir = 1 }, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -75177,10 +75174,7 @@ location = "QM #1" }, /obj/effect/turf_decal/bot, -/mob/living/simple_animal/bot/mulebot{ - home_destination = "QM #1"; - suffix = "#1" - }, +/mob/living/simple_animal/bot/mulebot, /turf/open/floor/iron, /area/station/cargo/storage) "xaH" = ( diff --git a/_maps/map_files/KiloStation2/KiloStation2.dmm b/_maps/map_files/KiloStation2/KiloStation2.dmm index a11adf92b82..bd6142a8329 100644 --- a/_maps/map_files/KiloStation2/KiloStation2.dmm +++ b/_maps/map_files/KiloStation2/KiloStation2.dmm @@ -7215,10 +7215,7 @@ /obj/effect/decal/cleanable/oil, /obj/effect/decal/cleanable/dirt, /obj/structure/sign/poster/contraband/the_griffin/directional/north, -/mob/living/simple_animal/bot/mulebot{ - home_destination = "QM #1"; - suffix = "#1" - }, +/mob/living/simple_animal/bot/mulebot, /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron/dark, /area/station/cargo/storage) @@ -7647,7 +7644,7 @@ /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/machinery/airalarm/directional/east, /obj/effect/landmark/start/assistant, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/effect/landmark/start/hangover, /obj/machinery/button/door/directional/north{ id = "Cabin_2"; @@ -18539,10 +18536,7 @@ /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/machinery/airalarm/directional/north, /obj/machinery/light/small/directional/north, -/mob/living/simple_animal/bot/mulebot{ - home_destination = "QM #2"; - suffix = "#2" - }, +/mob/living/simple_animal/bot/mulebot, /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron/dark, /area/station/cargo/storage) @@ -21960,7 +21954,7 @@ }, /obj/machinery/airalarm/directional/west, /obj/effect/landmark/start/assistant, -/obj/item/bedsheet/dorms{ +/obj/effect/spawner/random/bedsheet{ dir = 4 }, /obj/effect/landmark/start/hangover, @@ -55143,7 +55137,7 @@ dir = 4 }, /obj/effect/landmark/start/assistant, -/obj/item/bedsheet/dorms{ +/obj/effect/spawner/random/bedsheet{ dir = 4 }, /obj/effect/landmark/start/hangover, @@ -61124,7 +61118,7 @@ /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/rack/gunrack, -/obj/effect/spawner/armory_spawn/microfusion, +/obj/effect/spawner/armory_spawn/mod_lasers_small, /turf/open/floor/iron/showroomfloor, /area/station/ai_monitored/security/armory) "tGb" = ( @@ -72276,7 +72270,7 @@ "xds" = ( /obj/structure/bed, /obj/effect/landmark/start/assistant, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/effect/landmark/start/hangover, /obj/item/pillow/random, /turf/open/floor/wood, diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index b2a9971f12f..443f7049dea 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -1124,7 +1124,7 @@ /area/station/maintenance/fore/lesser) "avU" = ( /obj/structure/bed, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/machinery/button/door/directional/east{ id = "Cabin2"; @@ -23833,7 +23833,7 @@ /obj/machinery/conveyor{ id = "mining" }, -/obj/machinery/bouldertech/brm, +/obj/machinery/brm, /turf/open/floor/iron, /area/station/cargo/miningoffice) "iIf" = ( @@ -24819,13 +24819,9 @@ /turf/open/floor/iron/white, /area/station/science/ordnance/storage) "iWB" = ( -/obj/structure/rack{ - icon = 'icons/obj/fluff/general.dmi'; - icon_state = "minibar"; - name = "skeletal minibar" - }, /obj/item/storage/fancy/candle_box, /obj/machinery/light/small/directional/east, +/obj/structure/rack/skeletal, /turf/open/floor/engine/cult, /area/station/service/library) "iWD" = ( @@ -31986,7 +31982,7 @@ /area/station/medical/virology) "lxf" = ( /obj/structure/bed, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/machinery/button/door/directional/west{ id = "Cabin5"; @@ -41784,7 +41780,7 @@ "oYv" = ( /obj/effect/decal/cleanable/cobweb, /obj/structure/bed, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/machinery/button/door/directional/west{ id = "Cabin4"; @@ -50133,7 +50129,7 @@ /area/station/commons/locker) "rUo" = ( /obj/structure/bed, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 }, @@ -51804,7 +51800,7 @@ "sBa" = ( /obj/structure/bed, /obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/machinery/button/door/directional/east{ id = "Cabin3"; @@ -56637,10 +56633,6 @@ "uhI" = ( /obj/structure/cable, /obj/effect/landmark/event_spawn, -/obj/machinery/requests_console/directional/north{ - department = "Security"; - name = "Security Requests Console" - }, /turf/open/floor/iron, /area/station/security/checkpoint/customs) "uhP" = ( @@ -64199,7 +64191,7 @@ "wNp" = ( /obj/structure/bed, /obj/effect/decal/cleanable/cobweb, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/effect/landmark/start/hangover, /obj/machinery/button/door/directional/west{ diff --git a/_maps/map_files/NSSJourney/NSSJourney.dmm b/_maps/map_files/NSSJourney/NSSJourney.dmm index 11cc24a54dd..fffdc892162 100644 --- a/_maps/map_files/NSSJourney/NSSJourney.dmm +++ b/_maps/map_files/NSSJourney/NSSJourney.dmm @@ -2292,7 +2292,7 @@ /area/station/maintenance/solars/starboard/fore) "apC" = ( /obj/structure/bed/pod, -/obj/item/bedsheet/random, +/obj/effect/spawner/random/bedsheet/any, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/maintenance/port/fore) @@ -2411,7 +2411,7 @@ /area/station/security/execution/education) "aqn" = ( /obj/structure/bed, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/effect/landmark/start/hangover, /obj/machinery/button/door{ id = "Dorm3"; @@ -2902,7 +2902,7 @@ /area/station/commons/fitness) "ast" = ( /obj/structure/bed, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /turf/open/floor/carpet, /area/station/commons/dorms) "asu" = ( @@ -3442,7 +3442,7 @@ /area/station/security/checkpoint/customs) "auw" = ( /obj/structure/bed, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/machinery/button/door{ id = "Dorm2"; name = "Dorm Bolt Control"; @@ -4775,7 +4775,7 @@ /area/station/ai_monitored/command/storage/eva) "ayV" = ( /obj/structure/bed, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/machinery/button/door{ id = "Dorm1"; name = "Dorm Bolt Control"; @@ -6955,7 +6955,7 @@ /area/station/commons/dorms) "aHG" = ( /obj/structure/bed, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/effect/landmark/start/hangover, /obj/machinery/button/door{ id = "Dorm4"; @@ -7065,7 +7065,7 @@ /area/station/commons/dorms) "aHU" = ( /obj/structure/bed, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/machinery/button/door{ id = "Dorm5"; name = "Cabin Bolt Control"; @@ -17148,10 +17148,7 @@ location = "QM #1" }, /obj/effect/turf_decal/bot, -/mob/living/simple_animal/bot/mulebot{ - home_destination = "QM #1"; - suffix = "#1" - }, +/mob/living/simple_animal/bot/mulebot, /turf/open/floor/iron/dark/textured_large, /area/station/cargo/storage) "brO" = ( @@ -17733,10 +17730,7 @@ location = "QM #2" }, /obj/effect/turf_decal/bot, -/mob/living/simple_animal/bot/mulebot{ - home_destination = "QM #2"; - suffix = "#2" - }, +/mob/living/simple_animal/bot/mulebot, /turf/open/floor/iron/dark/textured_large, /area/station/cargo/storage) "btt" = ( @@ -34332,7 +34326,7 @@ "dZT" = ( /obj/machinery/airalarm/directional/north, /obj/structure/rack/gunrack, -/obj/effect/spawner/armory_spawn/microfusion, +/obj/effect/spawner/armory_spawn/mod_lasers_small, /obj/effect/turf_decal/delivery/red, /turf/open/floor/iron/smooth, /area/station/ai_monitored/security/armory) diff --git a/_maps/map_files/NSVBlueshift/Blueshift.dmm b/_maps/map_files/NSVBlueshift/Blueshift.dmm index 51457f5c2a0..e61c50ca1c0 100644 --- a/_maps/map_files/NSVBlueshift/Blueshift.dmm +++ b/_maps/map_files/NSVBlueshift/Blueshift.dmm @@ -542,7 +542,7 @@ /obj/structure/bed{ dir = 1 }, -/obj/item/bedsheet/dorms{ +/obj/effect/spawner/random/bedsheet{ dir = 1 }, /obj/machinery/light_switch/directional/west, @@ -25949,7 +25949,7 @@ /obj/effect/turf_decal/delivery, /obj/structure/rack/gunrack, /obj/machinery/airalarm/directional/south, -/obj/effect/spawner/armory_spawn/shotguns, +/obj/effect/spawner/armory_spawn/mod_lasers_small, /turf/open/floor/iron, /area/station/ai_monitored/security/armory) "eTk" = ( @@ -48382,7 +48382,7 @@ /obj/effect/turf_decal/stripes{ dir = 1 }, -/obj/machinery/bouldertech/brm, +/obj/machinery/brm, /obj/machinery/conveyor{ dir = 8; id = "mining" @@ -76512,6 +76512,8 @@ /obj/item/melee/baton/security/loaded, /obj/structure/cable, /obj/effect/spawner/random/armory/riot_shield, +/obj/item/gun/energy/e_gun/dragnet, +/obj/item/gun/energy/e_gun/dragnet, /turf/open/floor/iron, /area/station/ai_monitored/security/armory) "oGG" = ( @@ -103491,7 +103493,7 @@ /obj/structure/bed{ dir = 1 }, -/obj/item/bedsheet/dorms{ +/obj/effect/spawner/random/bedsheet{ dir = 1 }, /obj/effect/landmark/start/hangover, @@ -108840,13 +108842,13 @@ /turf/closed/wall/r_wall, /area/station/maintenance/rus_gambling) "uKW" = ( -/obj/structure/table/reinforced, -/obj/item/gun/energy/e_gun/dragnet, -/obj/item/gun/energy/e_gun/dragnet, /obj/machinery/camera/directional/south{ c_tag = "Armory - Interior" }, /obj/machinery/light/directional/south, +/obj/structure/rack/gunrack, +/obj/effect/turf_decal/delivery, +/obj/effect/spawner/armory_spawn/mod_lasers_big, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) "uLe" = ( @@ -117173,7 +117175,7 @@ /obj/effect/turf_decal/delivery, /obj/structure/rack/gunrack, /obj/machinery/firealarm/directional/south, -/obj/effect/spawner/armory_spawn/microfusion, +/obj/effect/spawner/armory_spawn/shotguns, /turf/open/floor/iron/dark/corner{ dir = 8 }, diff --git a/_maps/map_files/NorthStar/north_star.dmm b/_maps/map_files/NorthStar/north_star.dmm index e01fb546e4c..63a8be2d8cf 100644 --- a/_maps/map_files/NorthStar/north_star.dmm +++ b/_maps/map_files/NorthStar/north_star.dmm @@ -26977,7 +26977,7 @@ /area/station/medical/pharmacy) "heS" = ( /obj/structure/bed/double, -/obj/item/bedsheet/dorms_double, +/obj/effect/spawner/random/bedsheet/double, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, @@ -27019,7 +27019,7 @@ /area/station/maintenance/floor1/starboard/aft) "hfy" = ( /obj/structure/bed/double, -/obj/item/bedsheet/dorms_double, +/obj/effect/spawner/random/bedsheet/double, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, @@ -33741,7 +33741,7 @@ /area/station/maintenance/floor1/starboard/fore) "iTn" = ( /obj/structure/bed, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /turf/open/floor/carpet/black, /area/station/hallway/secondary/service) "iTu" = ( @@ -63497,7 +63497,7 @@ /area/station/science/genetics) "qBh" = ( /obj/structure/bed/double, -/obj/item/bedsheet/dorms_double, +/obj/effect/spawner/random/bedsheet/double, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, @@ -63553,7 +63553,7 @@ /area/station/commons/fitness) "qCn" = ( /obj/structure/bed, -/obj/item/bedsheet/random, +/obj/effect/spawner/random/bedsheet/any, /turf/open/floor/wood, /area/station/medical/psychology) "qCo" = ( @@ -73293,7 +73293,7 @@ /area/station/security/detectives_office/private_investigators_office) "thH" = ( /obj/structure/cable, -/obj/machinery/bouldertech/brm, +/obj/machinery/brm, /obj/machinery/conveyor{ dir = 4; id = "mining" diff --git a/_maps/map_files/VoidRaptor/VoidRaptor.dmm b/_maps/map_files/VoidRaptor/VoidRaptor.dmm index 4df7be29bc7..dfcd9235830 100644 --- a/_maps/map_files/VoidRaptor/VoidRaptor.dmm +++ b/_maps/map_files/VoidRaptor/VoidRaptor.dmm @@ -5175,19 +5175,6 @@ dir = 8 }, /area/station/hallway/secondary/construction) -"bzd" = ( -/obj/structure/chair/sofa/corp/right{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 8 - }, -/obj/machinery/light/small/directional/west, -/obj/effect/landmark/start/bitrunner, -/turf/open/floor/iron/smooth_edge{ - dir = 4 - }, -/area/space) "bzg" = ( /obj/structure/flora/tree/jungle/small, /obj/structure/window/spawner/directional/south, @@ -5378,7 +5365,7 @@ /area/station/science/ordnance/bomb) "bBE" = ( /obj/machinery/newscaster/directional/east, -/obj/item/bedsheet/random, +/obj/effect/spawner/random/bedsheet/any, /obj/structure/bed, /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -5636,16 +5623,6 @@ }, /turf/open/floor/engine, /area/station/science/ordnance/storage) -"bIo" = ( -/obj/structure/table, -/obj/machinery/microwave, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 5 - }, -/obj/machinery/light/small/directional/east, -/obj/structure/sign/poster/contraband/random/directional/east, -/turf/open/floor/iron/smooth, -/area/space) "bIs" = ( /obj/machinery/atmospherics/components/binary/valve/digital{ dir = 4 @@ -12557,7 +12534,7 @@ /area/station/medical/treatment_center) "dIL" = ( /obj/structure/bed/double, -/obj/item/bedsheet/random/double, +/obj/effect/spawner/random/bedsheet/any/double, /obj/effect/turf_decal/siding/wood, /turf/open/floor/wood, /area/station/maintenance/department/science/xenobiology) @@ -14911,7 +14888,7 @@ /turf/open/floor/iron/freezer, /area/station/medical/treatment_center) "enw" = ( -/obj/machinery/bouldertech/brm, +/obj/machinery/brm, /obj/machinery/conveyor{ dir = 4; id = "mining" @@ -14924,7 +14901,7 @@ /area/station/cargo/miningfoundry) "enC" = ( /obj/structure/bed/double, -/obj/item/bedsheet/random/double, +/obj/effect/spawner/random/bedsheet/any/double, /obj/item/radio/intercom/directional/east, /turf/open/floor/carpet, /area/station/commons/dorms) @@ -16758,25 +16735,6 @@ dir = 1 }, /area/station/commons/storage/primary) -"eOA" = ( -/obj/structure/table, -/obj/item/food/ready_donk/mac_n_cheese{ - pixel_y = 3; - pixel_x = 2 - }, -/obj/item/food/ready_donk/nachos_grandes{ - pixel_y = 7 - }, -/obj/item/food/ready_donk/donkhiladas{ - pixel_y = 11; - pixel_x = 1 - }, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 6 - }, -/obj/machinery/airalarm/directional/east, -/turf/open/floor/iron/smooth, -/area/space) "eOF" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -18699,7 +18657,7 @@ }, /area/station/hallway/primary/aft) "fsk" = ( -/obj/item/bedsheet/random/double, +/obj/effect/spawner/random/bedsheet/any/double, /obj/machinery/newscaster/directional/east, /obj/structure/bed/double/pod, /turf/open/floor/carpet/cyan, @@ -21895,11 +21853,11 @@ /area/station/medical/medbay/central) "gra" = ( /obj/structure/rack/gunrack, -/obj/effect/spawner/armory_spawn/microfusion, /obj/effect/turf_decal/tile/dark_red/half{ dir = 1 }, /obj/effect/turf_decal/delivery, +/obj/effect/spawner/armory_spawn/shotguns, /turf/open/floor/engine, /area/station/ai_monitored/security/armory) "grg" = ( @@ -25572,15 +25530,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/circuit, /area/station/command/teleporter) -"hsX" = ( -/obj/structure/chair/plastic, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/landmark/start/bitrunner, -/obj/structure/cable, -/turf/open/floor/iron/smooth_large, -/area/space) "htb" = ( /obj/machinery/status_display/evac/directional/south, /obj/structure/rack, @@ -29022,17 +28971,6 @@ }, /turf/open/floor/iron/white/smooth_large, /area/station/science/lab) -"iqv" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/smooth_edge{ - dir = 4 - }, -/area/space) "iqx" = ( /obj/machinery/digital_clock, /turf/closed/wall/r_wall, @@ -30005,15 +29943,6 @@ /obj/machinery/light/cold/directional/east, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) -"iCU" = ( -/obj/structure/table, -/obj/item/modular_computer/laptop/preset/civilian{ - pixel_y = 5; - pixel_x = 2 - }, -/obj/structure/cable, -/turf/open/floor/iron/smooth_large, -/area/space) "iCZ" = ( /obj/machinery/computer/communications, /obj/machinery/keycard_auth{ @@ -35915,7 +35844,6 @@ /area/station/commons/lounge) "kjG" = ( /obj/structure/rack/gunrack, -/obj/effect/spawner/armory_spawn/shotguns, /obj/effect/turf_decal/tile/dark_red/half{ dir = 1 }, @@ -35924,6 +35852,7 @@ /obj/machinery/digital_clock/directional/north{ pixel_y = 37 }, +/obj/effect/spawner/armory_spawn/mod_lasers_big, /turf/open/floor/engine, /area/station/ai_monitored/security/armory) "kjL" = ( @@ -41159,19 +41088,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/maintenance/department/engine/atmos) -"lDU" = ( -/obj/structure/chair/sofa/corp/left{ - desc = "Looks like someone threw it out. Covered in donut crumbs."; - dir = 4; - name = "couch" - }, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 9 - }, -/obj/structure/sign/poster/contraband/random/directional/west, -/obj/effect/landmark/start/bitrunner, -/turf/open/floor/iron/smooth, -/area/space) "lDY" = ( /turf/closed/wall/r_wall, /area/station/hallway/primary/aft) @@ -49263,7 +49179,7 @@ /area/station/maintenance/department/crew_quarters/bar) "nQh" = ( /obj/structure/bed/double, -/obj/item/bedsheet/random/double, +/obj/effect/spawner/random/bedsheet/any/double, /obj/machinery/newscaster/directional/east, /turf/open/floor/carpet/black, /area/station/commons/dorms) @@ -59043,15 +58959,6 @@ /obj/effect/turf_decal/siding/thinplating/dark/end, /turf/open/floor/iron/checker, /area/station/science/xenobiology) -"qtJ" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/table, -/obj/item/plate, -/obj/effect/spawner/random/trash/food_packaging, -/obj/structure/cable, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/iron/smooth_edge, -/area/space) "qtL" = ( /turf/closed/mineral, /area/space/nearstation) @@ -60213,18 +60120,6 @@ }, /area/station/science/ordnance/testlab) "qKP" = ( -/obj/structure/table/reinforced, -/obj/item/clothing/suit/armor/vest/alt/sec{ - pixel_y = 2 - }, -/obj/item/clothing/suit/armor/vest/alt/sec{ - pixel_x = -4; - pixel_y = -6 - }, -/obj/item/clothing/suit/armor/vest/alt/sec{ - pixel_x = 4; - pixel_y = -6 - }, /obj/structure/window/reinforced/spawner/directional/north{ pixel_y = 1 }, @@ -60238,6 +60133,8 @@ pixel_x = 32 }, /obj/effect/turf_decal/delivery, +/obj/structure/rack, +/obj/effect/spawner/random/armory/disablers, /turf/open/floor/engine, /area/station/ai_monitored/security/armory) "qLf" = ( @@ -67406,11 +67303,6 @@ /obj/machinery/light/directional/west, /turf/open/floor/noslip, /area/station/service/janitor) -"sLi" = ( -/obj/machinery/holopad, -/obj/effect/turf_decal/trimline/brown/filled/corner, -/turf/open/floor/iron/smooth_corner, -/area/space) "sLk" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/trimline/yellow/filled/corner{ @@ -70110,15 +70002,6 @@ /obj/machinery/light/cold/directional/south, /turf/open/floor/iron/dark/diagonal, /area/station/engineering/transit_tube) -"tuN" = ( -/obj/effect/spawner/random/trash/grime, -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 4 - }, -/turf/open/floor/iron/smooth_corner{ - dir = 4 - }, -/area/space) "tuU" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -70938,10 +70821,7 @@ location = "QM #4" }, /obj/effect/turf_decal/box, -/mob/living/simple_animal/bot/mulebot{ - home_destination = "QM #1"; - suffix = "#1" - }, +/mob/living/simple_animal/bot/mulebot, /turf/open/floor/iron/smooth_edge, /area/station/cargo/storage) "tEK" = ( @@ -71028,9 +70908,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/service/chapel/office) -"tFN" = ( -/turf/closed/wall, -/area/space) "tFW" = ( /obj/effect/turf_decal/trimline/dark_red/arrow_cw{ dir = 1 @@ -77552,13 +77429,13 @@ /turf/open/floor/iron/smooth_large, /area/station/cargo/sorting) "vwn" = ( -/obj/structure/rack, /obj/effect/turf_decal/tile/dark_red/anticorner{ dir = 1 }, /obj/machinery/requests_console/auto_name/directional/north, /obj/effect/turf_decal/delivery, -/obj/effect/spawner/random/armory/disablers, +/obj/structure/rack/gunrack, +/obj/effect/spawner/armory_spawn/mod_lasers_small, /turf/open/floor/engine, /area/station/ai_monitored/security/armory) "vwo" = ( @@ -83101,10 +82978,7 @@ location = "QM #1" }, /obj/effect/turf_decal/box, -/mob/living/simple_animal/bot/mulebot{ - home_destination = "QM #3"; - suffix = "#3" - }, +/mob/living/simple_animal/bot/mulebot, /turf/open/floor/iron/smooth_edge, /area/station/cargo/storage) "wWw" = ( @@ -85898,18 +85772,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/tcoms, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/tcommsat/computer) -"xPd" = ( -/obj/structure/chair/plastic{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 5 - }, -/obj/machinery/computer/security/telescreen/entertainment/directional/east, -/obj/structure/sign/poster/contraband/random/directional/north, -/obj/effect/landmark/start/bitrunner, -/turf/open/floor/iron/smooth, -/area/space) "xPf" = ( /obj/structure/chair/wood, /obj/item/radio/intercom/chapel{ @@ -135436,10 +135298,10 @@ ttw ttw ttw ttw -tFN -lDU -bzd -iqv +ttw +ttw +ttw +ttw ttw ttw ttw @@ -135693,10 +135555,10 @@ ttw ttw ttw ttw -tFN -qtJ -iCU -hsX +ttw +ttw +ttw +ttw ttw ttw ttw @@ -135950,10 +135812,10 @@ ttw ttw ttw ttw -tFN -xPd -tuN -sLi +ttw +ttw +ttw +ttw ttw ttw ttw @@ -136207,10 +136069,10 @@ ttw ttw ttw ttw -tFN -tFN -bIo -eOA +ttw +ttw +ttw +ttw ttw ttw ttw @@ -136464,10 +136326,10 @@ ttw ttw ttw ttw -kXK -tFN -tFN -tFN +ttw +ttw +ttw +ttw ttw ttw ttw diff --git a/_maps/map_files/generic/CentCom_nova_z2.dmm b/_maps/map_files/generic/CentCom_nova_z2.dmm index c13b11890c5..7f12a58bb35 100644 --- a/_maps/map_files/generic/CentCom_nova_z2.dmm +++ b/_maps/map_files/generic/CentCom_nova_z2.dmm @@ -570,7 +570,7 @@ /turf/open/misc/grass/planet, /area/centcom/holding/cafepark) "alk" = ( -/obj/item/bedsheet/dorms_double, +/obj/effect/spawner/random/bedsheet/double, /obj/structure/bed/double, /turf/open/indestructible/carpet, /area/centcom/holding/cafe) @@ -1084,7 +1084,7 @@ specialfunctions = 4 }, /obj/structure/bed/double/pod, -/obj/item/bedsheet/dorms_double, +/obj/effect/spawner/random/bedsheet/double, /turf/open/indestructible/carpet, /area/centcom/holding/cafe) "aqy" = ( @@ -2499,13 +2499,13 @@ /area/centcom/holding/cafe) "aGY" = ( /obj/structure/rack, -/obj/item/bedsheet/dorms_double, -/obj/item/bedsheet/dorms_double, -/obj/item/bedsheet/dorms_double, -/obj/item/bedsheet/dorms_double, -/obj/item/bedsheet/dorms_double, -/obj/item/bedsheet/dorms_double, -/obj/item/bedsheet/dorms_double, +/obj/effect/spawner/random/bedsheet/double, +/obj/effect/spawner/random/bedsheet/double, +/obj/effect/spawner/random/bedsheet/double, +/obj/effect/spawner/random/bedsheet/double, +/obj/effect/spawner/random/bedsheet/double, +/obj/effect/spawner/random/bedsheet/double, +/obj/effect/spawner/random/bedsheet/double, /turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) "aHb" = ( @@ -4203,6 +4203,12 @@ }, /turf/open/floor/iron, /area/centcom/interlink) +"baA" = ( +/obj/structure/chair/sofa/bamboo/left{ + dir = 1 + }, +/turf/open/water/hot_spring/cafe, +/area/centcom/holding/cafepark) "baM" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -4776,9 +4782,40 @@ /obj/machinery/light/warm/directional/south, /turf/open/floor/iron/cafeteria, /area/centcom/interlink) +"bUH" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/rack/wooden, +/obj/item/towel{ + pixel_y = -2; + pixel_x = -4 + }, +/obj/item/towel{ + pixel_y = 1; + pixel_x = 1 + }, +/obj/item/towel{ + pixel_y = 6; + pixel_x = 7 + }, +/obj/item/towel{ + pixel_y = -2; + pixel_x = -4 + }, +/obj/item/towel{ + pixel_y = 1; + pixel_x = 1 + }, +/obj/item/towel{ + pixel_y = 6; + pixel_x = 7 + }, +/turf/open/floor/wood, +/area/centcom/holding/cafepark) "bUO" = ( /obj/structure/bed/double, -/obj/item/bedsheet/random/double, +/obj/effect/spawner/random/bedsheet/any/double, /turf/open/floor/wood, /area/centcom/interlink/dorm_rooms) "bUS" = ( @@ -4850,6 +4887,10 @@ }, /turf/open/floor/iron, /area/centcom/holding/cafe) +"bWP" = ( +/obj/structure/wall_torch/spawns_lit/directional/south, +/turf/open/floor/wood, +/area/centcom/holding/cafepark) "bXF" = ( /obj/structure/table/wood, /turf/open/floor/wood, @@ -5211,7 +5252,7 @@ /area/centcom/interlink) "cGX" = ( /obj/structure/bed, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/structure/sign/painting/library_secure{ pixel_x = 32 }, @@ -6436,6 +6477,15 @@ }, /turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) +"ffD" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 5 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) "fiC" = ( /obj/structure/closet/crate/bin, /obj/item/paper/crumpled{ @@ -6831,6 +6881,9 @@ }, /turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) +"fVc" = ( +/turf/open/water/hot_spring/cafe, +/area/centcom/holding/cafepark) "fVr" = ( /obj/effect/light_emitter/interlink, /obj/effect/turf_decal/weather/dirt, @@ -6862,6 +6915,17 @@ }, /turf/open/floor/iron/dark, /area/centcom/interlink) +"gbM" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/structure/rack/wooden, +/obj/item/food/grown/poppy/geranium, +/obj/structure/railing/wooden_fencing{ + dir = 1 + }, +/turf/open/floor/wood, +/area/centcom/holding/cafepark) "gdL" = ( /obj/structure/towel_bin, /obj/structure/table/wood, @@ -7581,6 +7645,10 @@ /obj/effect/turf_decal/trimline/green/filled/arrow_ccw, /turf/open/floor/iron/dark, /area/centcom/interlink) +"hsW" = ( +/obj/structure/chair/sofa/bamboo/right, +/turf/open/water/hot_spring/cafe, +/area/centcom/holding/cafepark) "huq" = ( /obj/structure/chair/sofa/bench/right{ dir = 4 @@ -7592,6 +7660,10 @@ /obj/machinery/door/poddoor/shuttledock/interlink, /turf/open/floor/plating, /area/centcom/interlink) +"hvL" = ( +/obj/structure/chair/sofa/bamboo, +/turf/open/water/hot_spring/cafe, +/area/centcom/holding/cafepark) "hvQ" = ( /turf/open/floor/iron, /area/centcom/interlink) @@ -7933,6 +8005,15 @@ }, /turf/open/floor/grass, /area/centcom/interlink) +"iet" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/obj/structure/railing/wooden_fencing{ + dir = 8 + }, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) "ifp" = ( /obj/structure/spacevine{ name = "thick vines"; @@ -8489,6 +8570,13 @@ smoothing_flags = 0 }, /area/centcom/holding/cafepark) +"jdW" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/obj/structure/water_source/puddle, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) "jeI" = ( /obj/machinery/cryopod/quiet{ dir = 1 @@ -8771,6 +8859,18 @@ /obj/item/pen, /turf/open/floor/iron/dark/textured_large, /area/centcom/interlink) +"jGP" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/chair/wood{ + dir = 4 + }, +/obj/structure/railing/wooden_fencing{ + dir = 1 + }, +/turf/open/floor/wood, +/area/centcom/holding/cafepark) "jHv" = ( /obj/structure/bookcase/random/reference, /turf/open/floor/wood, @@ -9933,7 +10033,7 @@ /obj/structure/bed/double{ dir = 8 }, -/obj/item/bedsheet/dorms_double{ +/obj/effect/spawner/random/bedsheet/double{ dir = 8 }, /turf/open/floor/carpet/red, @@ -10234,6 +10334,12 @@ }, /turf/open/floor/iron/dark, /area/centcom/interlink) +"mvU" = ( +/obj/structure/chair/sofa/bamboo/right{ + dir = 1 + }, +/turf/open/water/hot_spring/cafe, +/area/centcom/holding/cafepark) "mwo" = ( /obj/structure/table/wood, /obj/item/reagent_containers/cup/glass/mug{ @@ -10944,7 +11050,7 @@ /area/centcom/interlink) "nCY" = ( /obj/structure/bed/double, -/obj/item/bedsheet/random/double, +/obj/effect/spawner/random/bedsheet/any/double, /obj/effect/turf_decal/siding/wood/corner, /turf/open/floor/wood, /area/centcom/interlink/dorm_rooms) @@ -11132,6 +11238,13 @@ /obj/structure/flora/grass/jungle/a/style_2, /turf/open/misc/dirt/planet, /area/centcom/holding/cafepark) +"nVZ" = ( +/obj/structure/fake_stairs/wood/directional/east, +/obj/structure/railing/wooden_fencing{ + dir = 1 + }, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) "nWn" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -12869,6 +12982,13 @@ icon_state = "floor" }, /area/centcom/holding/cafepark) +"qIH" = ( +/obj/effect/turf_decal/siding/wood/corner, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/floor/wood, +/area/centcom/holding/cafepark) "qIY" = ( /obj/effect/turf_decal/tile/green/opposingcorners, /turf/open/floor/iron, @@ -13105,7 +13225,7 @@ /obj/structure/bed/double{ pixel_y = -9 }, -/obj/item/bedsheet/dorms_double{ +/obj/effect/spawner/random/bedsheet/double{ pixel_y = -9 }, /turf/open/floor/bamboo, @@ -13218,10 +13338,6 @@ }, /turf/open/floor/iron/white, /area/centcom/holding/cafe) -"rnM" = ( -/obj/structure/wall_torch/spawns_lit/directional/south, -/turf/open/misc/asteroid/snow/indestructible/planet, -/area/centcom/holding/cafepark) "roh" = ( /obj/structure/flora/grass/jungle/a/style_3, /obj/structure/flora/tree/jungle/small/style_random, @@ -13246,6 +13362,12 @@ smoothing_flags = 0 }, /area/centcom/holding/cafepark) +"rvt" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) "rxB" = ( /obj/structure/closet/secure_closet/freezer/meat, /turf/open/indestructible/hoteltile{ @@ -13339,7 +13461,6 @@ /area/centcom/holding/cafepark) "rHH" = ( /obj/structure/railing/wooden_fencing, -/obj/structure/water_source/puddle, /turf/open/misc/dirt/planet, /area/centcom/holding/cafepark) "rHY" = ( @@ -13851,7 +13972,7 @@ specialfunctions = 4 }, /obj/structure/bed/double, -/obj/item/bedsheet/dorms_double, +/obj/effect/spawner/random/bedsheet/double, /turf/open/indestructible/carpet, /area/centcom/holding/cafepark) "ssn" = ( @@ -14121,7 +14242,7 @@ /area/centcom/holding/cafe) "sNs" = ( /obj/structure/bed/double/pod, -/obj/item/bedsheet/random/double, +/obj/effect/spawner/random/bedsheet/any/double, /turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) "sOj" = ( @@ -14423,6 +14544,15 @@ }, /turf/open/floor/wood/tile, /area/centcom/interlink) +"tnL" = ( +/obj/effect/turf_decal/siding/wood/end{ + dir = 4 + }, +/obj/structure/railing/wooden_fencing{ + dir = 1 + }, +/turf/open/floor/wood, +/area/centcom/holding/cafepark) "tpU" = ( /turf/open/misc/dirt/planet, /area/centcom/interlink) @@ -14795,6 +14925,13 @@ /obj/structure/flora/bush/fullgrass/style_random, /turf/open/floor/grass, /area/centcom/interlink) +"uaY" = ( +/obj/structure/wall_torch/spawns_lit/directional/south, +/obj/structure/chair/sofa/bamboo{ + dir = 1 + }, +/turf/open/water/hot_spring/cafe, +/area/centcom/holding/cafepark) "ubn" = ( /obj/effect/turf_decal/tile/dark_blue/opposingcorners, /obj/effect/turf_decal/siding/wood, @@ -15183,7 +15320,7 @@ /obj/structure/bed/double{ dir = 8 }, -/obj/item/bedsheet/dorms_double{ +/obj/effect/spawner/random/bedsheet/double{ dir = 8 }, /turf/open/floor/carpet/blue, @@ -15593,6 +15730,22 @@ "vLx" = ( /turf/closed/indestructible/rock, /area/centcom/interlink) +"vLz" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/structure/table/wood, +/obj/item/paper_bin/bundlenatural, +/obj/item/pen/charcoal, +/obj/item/pen/charcoal{ + pixel_y = 5; + pixel_x = 2 + }, +/obj/structure/railing/wooden_fencing{ + dir = 1 + }, +/turf/open/floor/wood, +/area/centcom/holding/cafepark) "vLY" = ( /obj/effect/turf_decal/trimline/green/corner{ dir = 8 @@ -15639,6 +15792,10 @@ /obj/structure/table/wood, /turf/open/misc/dirt/planet, /area/centcom/holding/cafepark) +"vQP" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) "vRf" = ( /obj/machinery/door/airlock/multi_tile/public/glass{ dir = 4; @@ -15856,7 +16013,6 @@ /obj/structure/chair/wood{ dir = 1 }, -/obj/effect/turf_decal/weather/snow/corner, /turf/open/misc/dirt/planet, /area/centcom/holding/cafepark) "wlA" = ( @@ -15962,6 +16118,12 @@ /obj/effect/light_emitter/interlink, /turf/open/floor/grass, /area/centcom/interlink) +"wyd" = ( +/obj/structure/railing/wooden_fencing{ + dir = 8 + }, +/turf/open/misc/asteroid/snow/indestructible/planet, +/area/centcom/holding/cafepark) "wyn" = ( /obj/machinery/duct, /turf/open/floor/iron/freezer, @@ -16324,6 +16486,14 @@ }, /turf/open/indestructible/hotelwood, /area/centcom/holding/cafepark) +"xei" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/structure/wall_torch/spawns_lit/directional/south, +/obj/structure/closet/crate/wooden/storage_barrel, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) "xfD" = ( /obj/structure/punching_bag, /turf/open/indestructible/hotelwood, @@ -16461,6 +16631,13 @@ /obj/effect/turf_decal/trimline/green/filled/arrow_cw, /turf/open/floor/iron/dark, /area/centcom/interlink) +"xso" = ( +/obj/structure/rack/wooden, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood, +/area/centcom/holding/cafepark) "xsM" = ( /obj/structure/window/spawner/directional/south, /obj/structure/reagent_dispensers/water_cooler, @@ -16589,6 +16766,19 @@ /obj/machinery/door/window/left/directional/south, /turf/open/floor/iron/dark, /area/centcom/interlink) +"xFa" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood, +/area/centcom/holding/cafepark) +"xFg" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafepark) "xFE" = ( /obj/structure/chair/sofa/bench/right{ dir = 1 @@ -16655,6 +16845,10 @@ /obj/effect/turf_decal/trimline/blue/filled/warning, /turf/open/floor/iron/white, /area/centcom/interlink) +"xNO" = ( +/obj/structure/chair/sofa/bamboo/left, +/turf/open/water/hot_spring/cafe, +/area/centcom/holding/cafepark) "xOm" = ( /obj/structure/chair/sofa/bench/corner{ dir = 1 @@ -16705,7 +16899,7 @@ /area/centcom/interlink) "xQK" = ( /obj/structure/bed/double, -/obj/item/bedsheet/dorms_double, +/obj/effect/spawner/random/bedsheet/double, /obj/structure/sign/painting/library_secure{ pixel_y = -32 }, @@ -16865,7 +17059,7 @@ dir = 4 }, /obj/structure/bed, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /turf/open/floor/iron, /area/centcom/holding/cafe) "ycD" = ( @@ -64646,9 +64840,10 @@ pib pib aDB aAd -aAd -izJ izJ +aAd +gbM +xso amx ajj ajj @@ -64800,7 +64995,6 @@ aaa aaa aaa aaa -aaa "} (187,1,1) = {" aaa @@ -64905,12 +65099,12 @@ aSZ aDB aAd aAd -aEX +jGP +bWP amx amx ajj -aaa -aaa +ajj aaa aaa aaa @@ -65155,20 +65349,20 @@ rjk dIM vTT amx -aiD +jdW eFC aAd aAd aCX aDB aAd -aAd -izJ -aAd +vLz +xFa +qIH +xFa +bUH +ajj ajj -aaa -aaa -aaa aaa aaa aaa @@ -65418,10 +65612,13 @@ izJ aAd aSZ ayI -aDB -aAd -aAd -izJ +aiD +iet +wyd +tnL +fVc +fVc +baA ajj aaa aaa @@ -65569,9 +65766,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa "} (190,1,1) = {" aaa @@ -65676,9 +65870,12 @@ amU aAd aCX hRJ +ayI aDB -aAd -aAd +nVZ +fVc +fVc +uaY ajj aaa aaa @@ -65826,9 +66023,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa "} (191,1,1) = {" aaa @@ -65934,8 +66128,11 @@ aAd cnz hfJ wkQ -aAd -aAd +ayI +rvt +hsW +fVc +mvU ajj aaa aaa @@ -66083,9 +66280,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa "} (192,1,1) = {" aaa @@ -66190,13 +66384,13 @@ aAd rOQ ayI kLW -eNw -aAd -aAd +pib +pib +vQP +hvL +fVc +ajj ajj -aaa -aaa -aaa aaa aaa aaa @@ -66449,7 +66643,9 @@ ayI eNw aAd aAd -izJ +xFg +xNO +fVc ajj aaa aaa @@ -66598,8 +66794,6 @@ aaa aaa aaa aaa -aaa -aaa "} (194,1,1) = {" aaa @@ -66704,12 +66898,12 @@ jxl aAd aoE aAd -aAd -izJ izJ +aAd +ffD +xei +ajj ajj -aaa -aaa aaa aaa aaa @@ -66961,12 +67155,12 @@ izJ aAd aoE aAd -rnM +aAd +aEX amx amx ajj -aaa -aaa +ajj aaa aaa aaa @@ -67219,6 +67413,7 @@ aAd aoE aAd izJ +aAd amx ajj ajj @@ -67370,7 +67565,6 @@ aaa aaa aaa aaa -aaa "} (197,1,1) = {" aaa diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm index 9f005e43e00..ba8942326bc 100644 --- a/_maps/map_files/tramstation/tramstation.dmm +++ b/_maps/map_files/tramstation/tramstation.dmm @@ -2585,13 +2585,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/engineering/atmos) -"akS" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 8 - }, -/obj/structure/table, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "ala" = ( /obj/machinery/button/door/directional/west{ id = "private_g"; @@ -4550,13 +4543,10 @@ /area/station/security/prison) "aFP" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/neutral/filled/corner{ - dir = 1 + dir = 4 }, /turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) +/area/station/hallway/secondary/exit) "aFU" = ( /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /obj/machinery/door/airlock/maintenance_hatch{ @@ -4580,11 +4570,6 @@ /turf/open/floor/iron, /area/station/security/brig) "aFZ" = ( -/obj/effect/landmark/event_spawn, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit) -"aGa" = ( /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/iron, /area/station/hallway/secondary/exit) @@ -4630,23 +4615,13 @@ /turf/open/floor/iron/grimy, /area/station/service/lawoffice) "aGq" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/effect/turf_decal/trimline/neutral/filled/corner{ - dir = 4 +/obj/machinery/vending/snack/blue, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 6 }, -/turf/open/floor/iron, +/turf/open/floor/iron/dark, /area/station/hallway/secondary/exit) -"aGr" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Escape Wing" - }, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "aGs" = ( /obj/structure/chair, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -4664,10 +4639,9 @@ /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "aGw" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 8 - }, -/obj/machinery/status_display/ai/directional/west, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/effect/turf_decal/stripes/white/full, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "aGx" = ( @@ -6247,6 +6221,14 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) +"aZm" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) "aZo" = ( /obj/effect/turf_decal/siding/thinplating/dark{ dir = 4 @@ -7278,16 +7260,13 @@ /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 9 }, -/obj/structure/chair{ - dir = 4 - }, /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 4 }, -/obj/effect/landmark/start/hangover, /obj/effect/turf_decal/trimline/neutral/corner{ dir = 4 }, +/obj/machinery/firealarm/directional/north, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "bxG" = ( @@ -7420,7 +7399,7 @@ /obj/structure/bed{ dir = 4 }, -/obj/item/bedsheet/dorms{ +/obj/effect/spawner/random/bedsheet{ dir = 4 }, /obj/structure/sign/clock/directional/west, @@ -8858,9 +8837,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "bYd" = ( @@ -9831,6 +9807,7 @@ /obj/effect/turf_decal/trimline/neutral/corner{ dir = 4 }, +/obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "cpR" = ( @@ -10176,7 +10153,7 @@ /area/station/command/heads_quarters/captain) "cvg" = ( /obj/structure/bed/double, -/obj/item/bedsheet/dorms_double, +/obj/effect/spawner/random/bedsheet/double, /obj/effect/landmark/start/assistant, /obj/structure/sign/clock/directional/north, /obj/item/pillow/random, @@ -10723,18 +10700,6 @@ /obj/structure/sign/warning/electric_shock, /turf/closed/wall/r_wall, /area/station/hallway/secondary/exit) -"cFg" = ( -/obj/effect/turf_decal/trimline/neutral/filled/corner{ - dir = 4 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit) "cFh" = ( /obj/machinery/modular_computer/preset/engineering{ dir = 8 @@ -11316,11 +11281,6 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"cOM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "cON" = ( /obj/machinery/deepfryer, /turf/open/floor/iron/white/side{ @@ -11408,7 +11368,7 @@ /obj/structure/bed{ dir = 4 }, -/obj/item/bedsheet/dorms{ +/obj/effect/spawner/random/bedsheet{ dir = 4 }, /obj/effect/landmark/start/assistant, @@ -13099,6 +13059,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron, /area/station/hallway/secondary/exit) "duB" = ( @@ -13973,15 +13934,6 @@ }, /turf/open/floor/iron/white, /area/station/science/ordnance) -"dLs" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit) "dLt" = ( /obj/effect/turf_decal/bot{ dir = 1 @@ -14198,6 +14150,8 @@ /obj/effect/turf_decal/trimline/neutral/corner{ dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "dPe" = ( @@ -14385,7 +14339,7 @@ /obj/structure/bed{ dir = 4 }, -/obj/item/bedsheet/dorms{ +/obj/effect/spawner/random/bedsheet{ dir = 4 }, /obj/structure/sign/clock/directional/south, @@ -17448,7 +17402,7 @@ /turf/open/floor/iron/dark, /area/station/cargo/miningdock/oresilo) "fdc" = ( -/obj/machinery/bouldertech/brm, +/obj/machinery/brm, /obj/machinery/conveyor{ dir = 8; id = "mining" @@ -18442,6 +18396,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/storage) +"ftZ" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/station/hallway/primary/tram/right) "fuj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/engine, @@ -19216,7 +19174,7 @@ /turf/open/floor/iron/white, /area/station/science/lower) "fKO" = ( -/obj/effect/spawner/structure/window/reinforced, +/obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/command/heads_quarters/hop) "fKW" = ( @@ -22648,10 +22606,6 @@ /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 10 }, -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/landmark/start/hangover, /obj/machinery/firealarm/directional/south, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) @@ -22946,18 +22900,7 @@ /area/station/ai_monitored/command/storage/eva) "heS" = ( /obj/machinery/holopad, -/obj/effect/turf_decal/trimline/neutral/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/corner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/neutral/filled/corner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/filled/corner, /obj/effect/turf_decal/bot, -/obj/machinery/status_display/evac/directional/east, /obj/machinery/camera/directional/east{ c_tag = "Departures - West Main" }, @@ -22966,6 +22909,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/landmark/transport/nav_beacon/tram/nav/immovable_rod, +/obj/machinery/status_display/ai/directional/east, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "heY" = ( @@ -22999,7 +22946,7 @@ /obj/structure/bed{ dir = 8 }, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/structure/sign/clock/directional/east, /obj/item/pillow/random, /turf/open/floor/wood, @@ -23717,13 +23664,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/tram/right) -"hsT" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 8 - }, -/obj/machinery/status_display/evac/directional/west, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "htb" = ( /obj/structure/closet/secure_closet/courtroom, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -24598,23 +24538,6 @@ }, /turf/open/floor/engine/hull, /area/station/solars/starboard/fore) -"hNh" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Escape Wing" - }, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "hNo" = ( /obj/machinery/door/firedoor, /obj/structure/disposalpipe/segment, @@ -24884,7 +24807,7 @@ /area/station/security/brig) "hRK" = ( /obj/structure/bed, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/effect/landmark/start/hangover, /obj/structure/sign/clock/directional/south, /obj/item/pillow/random, @@ -24917,9 +24840,6 @@ c_tag = "Hallway - Central Escape Wing Entry" }, /obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, @@ -26301,6 +26221,15 @@ /obj/effect/turf_decal/stripes/white/full, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"iur" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "iuz" = ( /obj/machinery/door/airlock/external{ name = "Port Docking Bay 1"; @@ -26311,7 +26240,7 @@ /area/station/hallway/secondary/entry) "iuJ" = ( /obj/structure/bed/double, -/obj/item/bedsheet/dorms_double, +/obj/effect/spawner/random/bedsheet/double, /obj/structure/sign/clock/directional/north, /obj/item/pillow/random, /turf/open/floor/carpet, @@ -28451,6 +28380,16 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"jhn" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) "jhs" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 5 @@ -28841,7 +28780,7 @@ /obj/structure/bed{ dir = 8 }, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/effect/landmark/start/assistant, /obj/structure/sign/clock/directional/east, /obj/item/pillow/random, @@ -29049,12 +28988,12 @@ /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 }, -/obj/effect/turf_decal/trimline/red/corner{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 4 + }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "jrz" = ( @@ -29675,11 +29614,9 @@ "jBk" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner, /obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "jBn" = ( @@ -30950,6 +30887,14 @@ "jYS" = ( /turf/closed/wall, /area/station/medical/chemistry) +"jYT" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/white/full, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "jYU" = ( /obj/structure/transport/linear/public, /obj/effect/turf_decal/trimline/dark_red/warning{ @@ -30967,8 +30912,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/light/directional/south, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) @@ -35579,13 +35522,13 @@ /turf/open/floor/iron/white, /area/station/science/xenobiology) "lyR" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 10 - }, -/obj/structure/chair{ +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/trimline/neutral/filled/line, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "lyV" = ( @@ -36227,7 +36170,7 @@ /obj/structure/bed{ dir = 8 }, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/effect/landmark/start/assistant, /obj/structure/sign/clock/directional/east, /obj/item/pillow/random, @@ -36569,10 +36512,7 @@ location = "QM #2" }, /obj/effect/turf_decal/tile/brown/fourcorners, -/mob/living/simple_animal/bot/mulebot{ - home_destination = "QM #2"; - suffix = "#2" - }, +/mob/living/simple_animal/bot/mulebot, /turf/open/floor/iron, /area/station/cargo/warehouse) "lQH" = ( @@ -36622,14 +36562,9 @@ /turf/open/floor/iron/smooth, /area/station/hallway/primary/tram/right) "lRx" = ( -/obj/structure/chair{ +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 }, -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/effect/landmark/start/hangover, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "lRC" = ( @@ -41744,10 +41679,7 @@ location = "QM #6" }, /obj/effect/turf_decal/tile/brown/fourcorners, -/mob/living/simple_animal/bot/mulebot{ - home_destination = "QM #6"; - suffix = "#6" - }, +/mob/living/simple_animal/bot/mulebot, /turf/open/floor/iron, /area/station/cargo/warehouse) "nIQ" = ( @@ -41780,9 +41712,10 @@ /turf/open/floor/plating, /area/station/maintenance/tram/left) "nJx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, +/obj/structure/railing{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "nJF" = ( @@ -42175,12 +42108,9 @@ /turf/open/floor/iron, /area/station/hallway/secondary/construction/engineering) "nQq" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "nQr" = ( @@ -44293,6 +44223,15 @@ }, /turf/open/floor/iron, /area/station/cargo/office) +"oGG" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) "oGJ" = ( /turf/closed/mineral/random/stationside/asteroid/porus, /area/station/medical/chemistry) @@ -44591,6 +44530,16 @@ }, /turf/open/space/openspace, /area/station/solars/port) +"oOP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/filled/corner, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) "oOT" = ( /obj/structure/table/wood, /obj/item/food/grown/poppy{ @@ -45408,7 +45357,7 @@ /turf/open/floor/iron/showroomfloor, /area/station/security/warden) "pfm" = ( -/obj/item/bedsheet/dorms_double{ +/obj/effect/spawner/random/bedsheet/double{ dir = 4 }, /obj/structure/bed/double{ @@ -47219,21 +47168,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/checkpoint/engineering) -"pKa" = ( -/obj/effect/turf_decal/trimline/neutral/filled/corner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/neutral/filled/corner{ - dir = 1 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "pKk" = ( /obj/machinery/portable_atmospherics/canister/oxygen, /obj/effect/turf_decal/bot{ @@ -47715,7 +47649,7 @@ /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 }, -/obj/structure/extinguisher_cabinet/directional/east, +/obj/structure/sign/departments/evac/directional/east, /turf/open/floor/iron, /area/station/hallway/secondary/exit) "pUi" = ( @@ -47921,10 +47855,7 @@ location = "QM #3" }, /obj/effect/turf_decal/tile/brown/fourcorners, -/mob/living/simple_animal/bot/mulebot{ - home_destination = "QM #3"; - suffix = "#3" - }, +/mob/living/simple_animal/bot/mulebot, /turf/open/floor/iron, /area/station/cargo/warehouse) "pXC" = ( @@ -48171,7 +48102,6 @@ /area/station/security/checkpoint/engineering) "qbW" = ( /obj/machinery/holopad, -/obj/effect/landmark/observer_start, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -48183,6 +48113,7 @@ id = 2 }, /obj/machinery/transport/destination_sign/indicator/directional/south, +/obj/effect/landmark/observer_start, /turf/open/floor/iron, /area/station/hallway/primary/tram/center) "qch" = ( @@ -48449,7 +48380,6 @@ "qfQ" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/east, -/obj/machinery/transport/power_rectifier, /turf/open/floor/catwalk_floor, /area/station/hallway/primary/tram/right) "qfS" = ( @@ -49076,7 +49006,6 @@ "qrs" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/decal/cleanable/dirt, -/obj/structure/sign/clock/directional/east, /obj/structure/closet/secure_closet/personal, /obj/effect/spawner/random/bureaucracy/briefcase, /obj/machinery/power/apc/auto_name/directional/north, @@ -49878,7 +49807,9 @@ /turf/open/floor/iron/white, /area/station/science/research) "qFH" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/structure/railing{ + dir = 1 + }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "qFK" = ( @@ -51031,7 +50962,9 @@ dir = 8 }, /obj/structure/cable, -/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/light/directional/west, @@ -52540,10 +52473,7 @@ location = "QM #1" }, /obj/effect/turf_decal/tile/brown/fourcorners, -/mob/living/simple_animal/bot/mulebot{ - home_destination = "QM #1"; - suffix = "#1" - }, +/mob/living/simple_animal/bot/mulebot, /turf/open/floor/iron, /area/station/cargo/warehouse) "rCL" = ( @@ -54601,6 +54531,14 @@ }, /turf/open/floor/iron, /area/station/commons/fitness) +"snF" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit) "snK" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 1 @@ -55766,8 +55704,6 @@ }, /obj/effect/turf_decal/trimline/neutral/filled/line, /obj/effect/landmark/start/hangover, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "sJQ" = ( @@ -56470,10 +56406,7 @@ /area/station/service/theater) "sWq" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 9 - }, -/obj/structure/chair{ - dir = 4 + dir = 1 }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) @@ -56541,14 +56474,14 @@ /turf/open/floor/iron, /area/station/cargo/drone_bay) "sXo" = ( -/obj/structure/chair{ +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/filled/warning{ dir = 1 }, -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "sXL" = ( @@ -58372,9 +58305,8 @@ /area/station/service/theater) "tEk" = ( /obj/effect/landmark/event_spawn, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "tEl" = ( @@ -58604,6 +58536,18 @@ /mob/living/simple_animal/bot/floorbot, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) +"tIk" = ( +/obj/effect/turf_decal/trimline/neutral/filled/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "tID" = ( /obj/structure/transport/linear/public, /obj/effect/landmark/transport/transport_id{ @@ -59292,7 +59236,7 @@ /obj/structure/bed{ dir = 4 }, -/obj/item/bedsheet/dorms{ +/obj/effect/spawner/random/bedsheet{ dir = 4 }, /obj/structure/sign/clock/directional/west, @@ -59904,7 +59848,7 @@ /obj/structure/bed{ dir = 8 }, -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/structure/sign/clock/directional/east, /obj/item/pillow/random, /turf/open/floor/carpet, @@ -60506,7 +60450,7 @@ /area/station/hallway/secondary/command) "upb" = ( /obj/structure/bed/double, -/obj/item/bedsheet/dorms_double, +/obj/effect/spawner/random/bedsheet/double, /obj/effect/landmark/start/hangover, /obj/structure/sign/clock/directional/north, /obj/item/pillow/random, @@ -67537,7 +67481,7 @@ /obj/structure/bed/double{ dir = 4 }, -/obj/item/bedsheet/dorms_double{ +/obj/effect/spawner/random/bedsheet/double{ dir = 4 }, /obj/structure/sign/clock/directional/north, @@ -67565,6 +67509,18 @@ dir = 1 }, /area/station/command/bridge) +"wJF" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/effect/turf_decal/stripes/white/full, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "wJM" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -68066,17 +68022,12 @@ /turf/open/floor/wood, /area/station/command/meeting_room) "wWh" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/filled/corner, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/machinery/vending/cola/blue, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 5 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, /area/station/hallway/secondary/exit) "wWn" = ( /obj/effect/decal/cleanable/dirt, @@ -185052,9 +185003,9 @@ bAj dJk vUE vUE +ftZ vUE -vUE -vUE +ftZ vUE nSI tXz @@ -186079,11 +186030,11 @@ qUB hAR veA lCy -lCy -lCy +cFb +kDH nzx +kDH cFb -lCy nSI tXz tXz @@ -186336,13 +186287,13 @@ jha qDn ajg qZZ -ajg +kAO hSt pgo kAO kAO udX -kAO +jhn duA bPO iVy @@ -186592,9 +186543,9 @@ fZS kDH vPB pzv +oGG geG geG -dLs aFZ geG geG @@ -186848,15 +186799,15 @@ lMg qbu riS gAH -wuF -wuF -wuF -cFg -aGa -aDI +aFP +oOP pTW wuF +aZm wuF +pTW +aFP +aDI aHw aHE aHS @@ -187105,15 +187056,15 @@ pSV pSV pSV pEx -pEx -pEx +jYT +wJF fmy wWh -wuF +snF aGq fmy -pEx -pEx +jYT +aGw pEx fmy dbV @@ -187362,15 +187313,15 @@ gbB pkD pSV bxC -akS +joi lyR -fmy -hNh -pEx -aGr -fmy +xWu +rUQ +rUQ +rUQ +xWu sWq -akS +eKD gXH fmy fmy @@ -187620,12 +187571,12 @@ aDN wzg tiM qSm -eKD -hsT -pKa +tIk +aGb +aGb +aGb +aGb aGb -aFP -aGw joi qSm swr @@ -187877,7 +187828,7 @@ aDN wzg tiM qFH -kIo +iur tEk jBk heS @@ -188133,10 +188084,10 @@ wXP loQ wAh cpK -qSm -kIo -qSm -sXo +nJx +nQq +lRx +jZe fmy aGs kIo @@ -188390,10 +188341,10 @@ fam aDN wzg tiM +qFH +nQq qSm -kIo -qSm -lRx +sJx rUQ aGt kIo @@ -188649,7 +188600,7 @@ vQX dJp jrc fio -nJx +qSm bYa rUQ lai @@ -189162,9 +189113,9 @@ ifU kLI kFu uCy -tiM +sXo qSm -nQq +bYa rUQ lai qSm @@ -189420,7 +189371,7 @@ hoN cHS svC nny -cOM +qSm jZe xWu uuS diff --git a/_maps/nova/automapper/templates/birdshot/birdshot_armory.dmm b/_maps/nova/automapper/templates/birdshot/birdshot_armory.dmm index eef058070d4..4964ab7de12 100644 --- a/_maps/nova/automapper/templates/birdshot/birdshot_armory.dmm +++ b/_maps/nova/automapper/templates/birdshot/birdshot_armory.dmm @@ -7,9 +7,9 @@ dir = 1 }, /obj/structure/rack/gunrack, -/obj/effect/spawner/armory_spawn/microfusion, /obj/effect/decal/cleanable/dirt, /obj/machinery/airalarm/directional/west, +/obj/effect/spawner/armory_spawn/smg, /turf/open/floor/iron/dark/small, /area/station/ai_monitored/security/armory) "f" = ( @@ -30,53 +30,36 @@ }, /obj/structure/rack/gunrack, /obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/armory_spawn/smg, +/obj/effect/spawner/armory_spawn/mod_lasers_big, /turf/open/floor/iron/dark/small, /area/station/ai_monitored/security/armory) "A" = ( -/obj/structure/rack, -/obj/item/clothing/head/helmet/sec{ - pixel_x = -3; - pixel_y = 3 +/obj/structure/cable, +/obj/item/storage/barricade{ + pixel_y = 5 + }, +/obj/item/storage/barricade, +/obj/item/storage/barricade{ + pixel_y = -5 }, -/obj/item/clothing/head/helmet/sec, -/obj/item/clothing/head/helmet/sec{ +/obj/structure/table, +/obj/item/flashlight/seclite, +/obj/item/flashlight/seclite, +/obj/item/flashlight/seclite, +/obj/item/clothing/mask/gas/sechailer{ pixel_x = 3; pixel_y = -3 }, -/obj/item/clothing/suit/armor/vest/alt/sec{ +/obj/item/clothing/mask/gas/sechailer, +/obj/item/clothing/mask/gas/sechailer{ pixel_x = -3; pixel_y = 3 }, -/obj/item/clothing/suit/armor/vest/alt/sec, -/obj/item/clothing/suit/armor/vest/alt/sec{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/structure/cable, /turf/open/floor/iron/dark/small, /area/station/ai_monitored/security/armory) "B" = ( -/obj/item/clothing/mask/gas/sechailer{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/clothing/mask/gas/sechailer, -/obj/item/clothing/mask/gas/sechailer{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/flashlight/seclite, -/obj/item/flashlight/seclite, -/obj/item/flashlight/seclite, -/obj/structure/table, -/obj/item/storage/barricade{ - pixel_y = -5 - }, -/obj/item/storage/barricade, -/obj/item/storage/barricade{ - pixel_y = 5 - }, +/obj/structure/rack/gunrack, +/obj/effect/spawner/armory_spawn/mod_lasers_small, /turf/open/floor/iron/dark/small, /area/station/ai_monitored/security/armory) "Q" = ( diff --git a/_maps/nova/automapper/templates/deltastation/deltastation_armory.dmm b/_maps/nova/automapper/templates/deltastation/deltastation_armory.dmm index 903d69e1062..b31565808ac 100644 --- a/_maps/nova/automapper/templates/deltastation/deltastation_armory.dmm +++ b/_maps/nova/automapper/templates/deltastation/deltastation_armory.dmm @@ -22,33 +22,18 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/rack/gunrack, -/obj/effect/spawner/armory_spawn/microfusion, +/obj/item/gun/energy/temperature/security, +/obj/item/clothing/suit/hooded/ablative, +/obj/item/gun/energy/ionrifle, +/obj/structure/rack, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) "E" = ( -/obj/structure/rack, /obj/structure/window/reinforced/spawner/directional/north, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/bot, -/obj/item/clothing/suit/armor/vest/alt/sec{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/clothing/suit/armor/vest/alt/sec, -/obj/item/clothing/suit/armor/vest/alt/sec{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/clothing/head/helmet/sec{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/clothing/head/helmet/sec, -/obj/item/clothing/head/helmet/sec{ - pixel_x = -3; - pixel_y = 3 - }, +/obj/structure/rack/gunrack, +/obj/effect/spawner/armory_spawn/mod_lasers_small, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) "L" = ( @@ -62,13 +47,13 @@ /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) "M" = ( -/obj/structure/rack, -/obj/item/gun/energy/ionrifle, -/obj/item/clothing/suit/hooded/ablative, -/obj/item/gun/energy/temperature/security, /obj/structure/window/reinforced/spawner/directional/south, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/bot, +/obj/effect/spawner/random/armory/riot_shield, +/obj/effect/spawner/random/armory/riot_armor, +/obj/effect/spawner/random/armory/riot_helmet, +/obj/structure/rack, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) "O" = ( @@ -85,20 +70,18 @@ /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) "R" = ( -/obj/structure/rack, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/bot, -/obj/effect/spawner/random/armory/riot_helmet, -/obj/effect/spawner/random/armory/riot_armor, -/obj/effect/spawner/random/armory/riot_shield, +/obj/effect/spawner/random/armory/bulletproof_armor, +/obj/effect/spawner/random/armory/bulletproof_helmet, +/obj/structure/rack, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) "U" = ( -/obj/structure/rack, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/bot, -/obj/effect/spawner/random/armory/bulletproof_armor, -/obj/effect/spawner/random/armory/bulletproof_helmet, +/obj/structure/rack/gunrack, +/obj/effect/spawner/armory_spawn/mod_lasers_big, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) "X" = ( diff --git a/_maps/nova/automapper/templates/icebox/icebox_armory_middle.dmm b/_maps/nova/automapper/templates/icebox/icebox_armory_middle.dmm index d6797c049ee..03b1654a5c6 100644 --- a/_maps/nova/automapper/templates/icebox/icebox_armory_middle.dmm +++ b/_maps/nova/automapper/templates/icebox/icebox_armory_middle.dmm @@ -32,28 +32,11 @@ /turf/open/floor/iron/dark/textured, /area/station/ai_monitored/security/armory) "i" = ( -/obj/structure/rack, -/obj/item/clothing/head/helmet/sec{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/clothing/head/helmet/sec, -/obj/item/clothing/head/helmet/sec{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/clothing/suit/armor/vest/alt/sec{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/clothing/suit/armor/vest/alt/sec, -/obj/item/clothing/suit/armor/vest/alt/sec{ - pixel_x = -3; - pixel_y = 3 - }, /obj/effect/turf_decal/tile/red/half{ dir = 8 }, +/obj/effect/spawner/armory_spawn/shotguns, +/obj/structure/rack/gunrack, /turf/open/floor/iron/dark/textured, /area/station/ai_monitored/security/armory) "q" = ( @@ -64,7 +47,7 @@ dir = 4 }, /obj/structure/rack/gunrack, -/obj/effect/spawner/armory_spawn/shotguns, +/obj/effect/spawner/armory_spawn/mod_lasers_small, /turf/open/floor/iron/dark/textured, /area/station/ai_monitored/security/armory) "x" = ( @@ -72,7 +55,7 @@ dir = 4 }, /obj/structure/rack/gunrack, -/obj/effect/spawner/armory_spawn/microfusion, +/obj/effect/spawner/armory_spawn/mod_lasers_big, /turf/open/floor/iron/dark/textured, /area/station/ai_monitored/security/armory) "B" = ( diff --git a/_maps/nova/automapper/templates/metastation/metastation_armory.dmm b/_maps/nova/automapper/templates/metastation/metastation_armory.dmm index 5375cc02872..a467bc31da2 100644 --- a/_maps/nova/automapper/templates/metastation/metastation_armory.dmm +++ b/_maps/nova/automapper/templates/metastation/metastation_armory.dmm @@ -8,8 +8,8 @@ "e" = ( /obj/machinery/airalarm/directional/north, /obj/structure/rack/gunrack, -/obj/effect/spawner/armory_spawn/microfusion, /obj/effect/turf_decal/delivery/red, +/obj/effect/spawner/armory_spawn/mod_lasers_small, /turf/open/floor/iron/smooth, /area/station/ai_monitored/security/armory) "f" = ( @@ -128,7 +128,7 @@ "C" = ( /obj/effect/turf_decal/delivery/red, /obj/structure/rack/gunrack, -/obj/effect/spawner/armory_spawn/smg, +/obj/effect/spawner/armory_spawn/mod_lasers_big, /turf/open/floor/iron/smooth, /area/station/ai_monitored/security/armory) "D" = ( @@ -239,6 +239,14 @@ /obj/effect/spawner/random/armory/bulletproof_helmet, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) +"P" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/warning{ + dir = 1 + }, +/obj/structure/rack/gunrack, +/obj/effect/spawner/armory_spawn/smg, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) "Q" = ( /obj/effect/turf_decal/trimline/dark_blue/filled/corner, /obj/effect/turf_decal/trimline/dark_blue/filled/warning{ @@ -342,7 +350,7 @@ N (5,1,1) = {" N b -D +P r t F diff --git a/_maps/nova/automapper/templates/northstar/northstar_armory.dmm b/_maps/nova/automapper/templates/northstar/northstar_armory.dmm index 3c8ea12baed..9c66b751297 100644 --- a/_maps/nova/automapper/templates/northstar/northstar_armory.dmm +++ b/_maps/nova/automapper/templates/northstar/northstar_armory.dmm @@ -3,14 +3,13 @@ /turf/template_noop, /area/template_noop) "y" = ( +/obj/effect/spawner/armory_spawn/shotguns, /obj/structure/rack/gunrack, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/effect/spawner/armory_spawn/smg, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) "F" = ( /obj/structure/rack/gunrack, -/obj/effect/spawner/armory_spawn/shotguns, +/obj/effect/spawner/armory_spawn/mod_lasers_small, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) "I" = ( @@ -20,20 +19,15 @@ /area/station/ai_monitored/security/armory) "O" = ( /obj/structure/rack/gunrack, -/obj/effect/spawner/armory_spawn/microfusion, /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/cable, +/obj/effect/spawner/armory_spawn/mod_lasers_big, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) "Z" = ( -/obj/structure/table/reinforced, -/obj/item/storage/barricade{ - pixel_y = 10 - }, -/obj/item/storage/barricade{ - pixel_y = 5 - }, -/obj/item/storage/barricade, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/effect/spawner/armory_spawn/smg, +/obj/structure/rack/gunrack, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) diff --git a/_maps/nova/automapper/templates/tramstation/tramstation_armory.dmm b/_maps/nova/automapper/templates/tramstation/tramstation_armory.dmm index 6b9b4479c1d..05c9bdb7d5a 100644 --- a/_maps/nova/automapper/templates/tramstation/tramstation_armory.dmm +++ b/_maps/nova/automapper/templates/tramstation/tramstation_armory.dmm @@ -52,8 +52,8 @@ dir = 1 }, /obj/structure/rack/gunrack, -/obj/effect/spawner/armory_spawn/microfusion, /obj/structure/cable, +/obj/effect/spawner/armory_spawn/mod_lasers_small, /turf/open/floor/iron, /area/station/ai_monitored/security/armory) "Mp" = ( @@ -61,18 +61,11 @@ layer = 2.9 }, /obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/closet/secure_closet/armory_kiboko, +/obj/structure/rack/gunrack, +/obj/effect/spawner/armory_spawn/mod_lasers_big, /turf/open/floor/iron, /area/station/ai_monitored/security/armory) "SD" = ( -/obj/structure/rack, -/obj/item/storage/barricade{ - pixel_y = -5 - }, -/obj/item/storage/barricade, -/obj/item/storage/barricade{ - pixel_y = 5 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -83,6 +76,7 @@ dir = 8 }, /obj/effect/turf_decal/tile/neutral, +/obj/structure/closet/secure_closet/armory_kiboko, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) "TP" = ( diff --git a/_maps/shuttles/emergency_clown.dmm b/_maps/shuttles/emergency_clown.dmm index f5c0ca4ea61..fc943e5287b 100644 --- a/_maps/shuttles/emergency_clown.dmm +++ b/_maps/shuttles/emergency_clown.dmm @@ -158,7 +158,7 @@ /area/shuttle/escape) "aM" = ( /obj/structure/bed, -/obj/item/bedsheet/random, +/obj/effect/spawner/random/bedsheet/any, /turf/open/floor/mineral/bananium, /area/shuttle/escape) "aQ" = ( @@ -246,7 +246,7 @@ /area/shuttle/escape) "iU" = ( /obj/structure/bed, -/obj/item/bedsheet/random, +/obj/effect/spawner/random/bedsheet/any, /obj/machinery/light/small/directional/east, /turf/open/floor/mineral/bananium, /area/shuttle/escape) @@ -254,7 +254,7 @@ /obj/structure/bed{ dir = 4 }, -/obj/item/bedsheet/random{ +/obj/effect/spawner/random/bedsheet/any{ dir = 4 }, /turf/open/floor/mineral/bananium, @@ -289,7 +289,7 @@ /obj/structure/bed{ dir = 4 }, -/obj/item/bedsheet/random{ +/obj/effect/spawner/random/bedsheet/any{ dir = 4 }, /obj/machinery/light/small/directional/west, @@ -300,7 +300,7 @@ /obj/structure/bed{ dir = 4 }, -/obj/item/bedsheet/random{ +/obj/effect/spawner/random/bedsheet/any{ dir = 4 }, /turf/open/floor/mineral/bananium, @@ -315,7 +315,7 @@ "XT" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/bed, -/obj/item/bedsheet/random, +/obj/effect/spawner/random/bedsheet/any, /turf/open/floor/mineral/bananium, /area/shuttle/escape) "YC" = ( diff --git a/_maps/shuttles/emergency_hugcage.dmm b/_maps/shuttles/emergency_hugcage.dmm index 6e68506c433..4b500f7bdbd 100644 --- a/_maps/shuttles/emergency_hugcage.dmm +++ b/_maps/shuttles/emergency_hugcage.dmm @@ -3,7 +3,7 @@ /turf/closed/wall/mineral/titanium/nodiagonal, /area/shuttle/escape/brig) "aR" = ( -/obj/item/bedsheet/random{ +/obj/effect/spawner/random/bedsheet/any{ dir = 8 }, /obj/structure/bed, @@ -83,7 +83,7 @@ /turf/closed/wall/mineral/titanium, /area/shuttle/escape) "gg" = ( -/obj/item/bedsheet/random{ +/obj/effect/spawner/random/bedsheet/any{ dir = 4 }, /obj/structure/bed{ @@ -116,7 +116,7 @@ /area/shuttle/escape) "iI" = ( /obj/structure/bed, -/obj/item/bedsheet/random, +/obj/effect/spawner/random/bedsheet/any, /obj/item/pillow/random, /obj/effect/spawner/random/entertainment/plushie_delux, /turf/open/floor/mineral/titanium/yellow, @@ -148,7 +148,7 @@ /obj/structure/bed{ dir = 1 }, -/obj/item/bedsheet/random{ +/obj/effect/spawner/random/bedsheet/any{ dir = 4 }, /obj/item/pillow/random, @@ -211,7 +211,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "ys" = ( -/obj/item/bedsheet/random{ +/obj/effect/spawner/random/bedsheet/any{ dir = 4 }, /obj/structure/bed{ @@ -327,7 +327,7 @@ /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) "KW" = ( -/obj/item/bedsheet/random{ +/obj/effect/spawner/random/bedsheet/any{ dir = 8 }, /obj/structure/bed, diff --git a/_maps/shuttles/emergency_monastery.dmm b/_maps/shuttles/emergency_monastery.dmm index b115aa5d423..890cf947340 100644 --- a/_maps/shuttles/emergency_monastery.dmm +++ b/_maps/shuttles/emergency_monastery.dmm @@ -2444,16 +2444,12 @@ /turf/open/floor/carpet, /area/shuttle/escape) "Ju" = ( -/obj/structure/rack{ - icon = 'icons/obj/fluff/general.dmi'; - icon_state = "minibar"; - name = "skeletal minibar" - }, /obj/item/book/codex_gigas, /obj/machinery/camera/directional/south{ c_tag = "Monastery Archives Aft"; network = list("ss13","monastery") }, +/obj/structure/rack/skeletal, /turf/open/floor/iron/dark, /area/shuttle/escape) "Jv" = ( diff --git a/_maps/shuttles/ferry_base.dmm b/_maps/shuttles/ferry_base.dmm index 4f9861db6d5..69a4d6fa18c 100644 --- a/_maps/shuttles/ferry_base.dmm +++ b/_maps/shuttles/ferry_base.dmm @@ -62,6 +62,12 @@ }, /turf/open/floor/mineral/titanium/blue, /area/shuttle/transport) +"J" = ( +/obj/machinery/power/shuttle_engine/propulsion{ + dir = 8 + }, +/turf/closed/wall/mineral/titanium, +/area/shuttle/transport) "U" = ( /obj/structure/chair/comfy/shuttle{ dir = 1 @@ -72,17 +78,17 @@ (1,1,1) = {" a -b +J k -b +J a "} (2,1,1) = {" -b +J g l g -b +J "} (3,1,1) = {" c @@ -148,9 +154,9 @@ q c "} (12,1,1) = {" -c +b e m e -c +b "} diff --git a/_maps/shuttles/ferry_lighthouse.dmm b/_maps/shuttles/ferry_lighthouse.dmm index 48d0c4f558f..18197d61f14 100644 --- a/_maps/shuttles/ferry_lighthouse.dmm +++ b/_maps/shuttles/ferry_lighthouse.dmm @@ -4,7 +4,7 @@ /area/template_noop) "ab" = ( /obj/machinery/power/shuttle_engine/propulsion/left{ - dir = 4 + dir = 8 }, /turf/open/floor/plating/airless, /area/shuttle/transport) @@ -257,6 +257,13 @@ }, /turf/open/floor/wood, /area/shuttle/transport) +"sy" = ( +/obj/machinery/power/shuttle_engine/propulsion/left{ + dir = 8; + pixel_x = 1 + }, +/turf/open/floor/plating/airless, +/area/shuttle/transport) "ZS" = ( /obj/machinery/light/warm/directional/west, /turf/open/floor/wood, @@ -299,7 +306,7 @@ ac aa "} (3,1,1) = {" -ab +sy af ag ag diff --git a/_maps/shuttles/ferry_meat.dmm b/_maps/shuttles/ferry_meat.dmm index 35188f97429..fc986bcda50 100644 --- a/_maps/shuttles/ferry_meat.dmm +++ b/_maps/shuttles/ferry_meat.dmm @@ -4,7 +4,7 @@ /area/template_noop) "b" = ( /obj/machinery/power/shuttle_engine/propulsion{ - dir = 4 + dir = 8 }, /turf/closed/wall/mineral/titanium, /area/shuttle/transport) diff --git a/_maps/shuttles/nova/pirate_nri_raider.dmm b/_maps/shuttles/nova/pirate_nri_raider.dmm index 72e7adb01f2..f691dc8f150 100644 --- a/_maps/shuttles/nova/pirate_nri_raider.dmm +++ b/_maps/shuttles/nova/pirate_nri_raider.dmm @@ -675,6 +675,17 @@ }, /turf/closed/wall/mineral/titanium/spaceship/nodiagonal, /area/shuttle/pirate/nri) +"yP" = ( +/obj/effect/turf_decal/stripes/line, +/obj/item/ammo_box/advanced/s12gauge/magnum, +/obj/item/ammo_box/advanced/s12gauge/magnum, +/obj/item/ammo_box/advanced/s12gauge/magnum, +/obj/item/ammo_box/advanced/s12gauge/beehive, +/obj/item/ammo_box/advanced/s12gauge/beehive, +/obj/item/ammo_box/advanced/s12gauge/beehive, +/obj/structure/rack/shelf, +/turf/open/floor/pod/light, +/area/shuttle/pirate/nri) "zb" = ( /obj/structure/deployable_barricade/guardrail, /obj/structure/lattice/catwalk, @@ -885,17 +896,6 @@ }, /turf/open/floor/engine/hull/reinforced, /area/shuttle/pirate/nri) -"Gh" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/rack/shelf, -/obj/item/ammo_box/advanced/s12gauge/bean, -/obj/item/ammo_box/advanced/s12gauge/bean, -/obj/item/ammo_box/advanced/s12gauge/magnum, -/obj/item/ammo_box/advanced/s12gauge/magnum, -/obj/item/ammo_box/advanced/s12gauge/rubber, -/obj/item/ammo_box/advanced/s12gauge/rubber, -/turf/open/floor/pod/light, -/area/shuttle/pirate/nri) "GO" = ( /turf/open/floor/engine/hull, /area/shuttle/pirate/nri) @@ -1602,7 +1602,7 @@ Hz "} (12,1,1) = {" Hz -Gh +yP qp qp wM diff --git a/_maps/shuttles/nova/ruin_tarkon_driver.dmm b/_maps/shuttles/nova/ruin_tarkon_driver.dmm index d0e3819e11c..b10221a5542 100644 --- a/_maps/shuttles/nova/ruin_tarkon_driver.dmm +++ b/_maps/shuttles/nova/ruin_tarkon_driver.dmm @@ -9,6 +9,7 @@ /obj/machinery/light/directional/east, /obj/structure/table/reinforced, /obj/effect/spawner/random/food_or_drink/snack, +/obj/item/crowbar/red, /turf/open/floor/mineral/titanium, /area/shuttle/tarkon_driver) "cP" = ( @@ -31,6 +32,11 @@ "ef" = ( /turf/open/floor/iron/recharge_floor, /area/shuttle/tarkon_driver) +"eP" = ( +/obj/machinery/power/smes/tarkon_driver, +/obj/structure/cable, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) "fg" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -59,6 +65,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/closed/wall/mineral/titanium/spaceship, /area/shuttle/tarkon_driver) +"hT" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/machinery/camera/tarkon/directional/south, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) "hW" = ( /obj/structure/chair/comfy/shuttle{ dir = 8 @@ -94,6 +107,7 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/camera/tarkon/directional/south, /turf/open/floor/mineral/titanium, /area/shuttle/tarkon_driver) "ni" = ( @@ -122,6 +136,12 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, +/obj/machinery/camera/tarkon/directional/south, +/turf/open/floor/mineral/titanium, +/area/shuttle/tarkon_driver) +"pi" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/camera/tarkon/directional/south, /turf/open/floor/mineral/titanium, /area/shuttle/tarkon_driver) "rr" = ( @@ -194,7 +214,7 @@ /obj/item/flashlight/flare, /obj/item/flashlight/flare, /obj/item/flashlight/flare, -/obj/machinery/door/window/right/directional/west, +/obj/machinery/door/window/brigdoor/tarkon/right/directional/west, /turf/open/floor/mineral/titanium, /area/shuttle/tarkon_driver) "Cn" = ( @@ -202,8 +222,9 @@ /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/emergency_oxygen, -/obj/machinery/door/window/right/directional/west, +/obj/machinery/door/window/brigdoor/tarkon/right/directional/west, /obj/machinery/light/directional/south, +/obj/machinery/camera/tarkon/directional/south, /turf/open/floor/mineral/titanium, /area/shuttle/tarkon_driver) "Cv" = ( @@ -227,8 +248,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/tarkon_driver) "Fp" = ( -/obj/structure/table/reinforced, -/obj/item/crowbar/red, +/obj/machinery/computer/camera_advanced/tarkon_cam, /turf/open/floor/mineral/titanium, /area/shuttle/tarkon_driver) "GN" = ( @@ -258,8 +278,9 @@ /obj/item/clothing/suit/space/eva, /obj/item/clothing/head/helmet/space/eva, /obj/item/clothing/mask/breath, -/obj/machinery/door/window/right/directional/east, +/obj/machinery/door/window/brigdoor/tarkon/right/directional/east, /obj/machinery/light/directional/south, +/obj/machinery/camera/tarkon/directional/south, /turf/open/floor/mineral/titanium, /area/shuttle/tarkon_driver) "Jo" = ( @@ -318,8 +339,10 @@ /turf/open/floor/mineral/titanium, /area/shuttle/tarkon_driver) "Pn" = ( -/obj/machinery/power/smes/engineering, -/obj/structure/cable, +/obj/machinery/power/smes/engineering{ + input_level = 5000 + }, +/obj/machinery/power/smes/tarkon_driver, /turf/open/floor/mineral/titanium, /area/shuttle/tarkon_driver) "Qe" = ( @@ -352,7 +375,7 @@ /obj/item/clothing/suit/space/eva, /obj/item/clothing/head/helmet/space/eva, /obj/item/clothing/mask/breath, -/obj/machinery/door/window/right/directional/east, +/obj/machinery/door/window/brigdoor/tarkon/right/directional/east, /turf/open/floor/mineral/titanium, /area/shuttle/tarkon_driver) "Tp" = ( @@ -360,7 +383,7 @@ /obj/item/oxygen_candle, /obj/item/oxygen_candle, /obj/item/oxygen_candle, -/obj/machinery/door/window/right/directional/west, +/obj/machinery/door/window/brigdoor/tarkon/right/directional/west, /turf/open/floor/mineral/titanium, /area/shuttle/tarkon_driver) "TS" = ( @@ -373,6 +396,7 @@ /obj/structure/table/reinforced, /obj/machinery/cell_charger, /obj/machinery/light_switch/directional/east, +/obj/machinery/camera/tarkon/directional/east, /turf/open/floor/mineral/titanium, /area/shuttle/tarkon_driver) "Ut" = ( @@ -490,7 +514,7 @@ IP LG Vp Xb -XN +pi hH zL "} @@ -608,7 +632,7 @@ Em uk Kv gu -Xb +hT JF Tp Cf @@ -632,7 +656,7 @@ fy fy tV LG -Pn +eP Vt Pn GN diff --git a/_maps/shuttles/nova/whiteship_blueshift.dmm b/_maps/shuttles/nova/whiteship_blueshift.dmm index 9d8e943f27e..58d0ff34ac6 100644 --- a/_maps/shuttles/nova/whiteship_blueshift.dmm +++ b/_maps/shuttles/nova/whiteship_blueshift.dmm @@ -161,7 +161,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/structure/alien/weeds/node, /obj/structure/bed/double/pod, -/obj/item/bedsheet/dorms_double, +/obj/effect/spawner/random/bedsheet/double, /obj/structure/sign/poster/random/directional/east, /turf/open/floor/wood, /area/shuttle/abandoned/crew) @@ -1493,7 +1493,7 @@ /turf/open/floor/plating, /area/shuttle/abandoned/bridge) "nX" = ( -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -3601,7 +3601,7 @@ /obj/structure/alien/weeds, /obj/structure/alien/weeds, /obj/structure/bed/double/pod, -/obj/item/bedsheet/dorms_double, +/obj/effect/spawner/random/bedsheet/double, /obj/structure/sign/poster/random/directional/east, /turf/open/floor/wood, /area/shuttle/abandoned/crew) @@ -3901,7 +3901,7 @@ /turf/template_noop, /area/shuttle/abandoned/bridge) "LG" = ( -/obj/item/bedsheet/dorms, +/obj/effect/spawner/random/bedsheet, /obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/effect/decal/cleanable/dirt, /obj/structure/alien/weeds, diff --git a/_maps/shuttles/pirate_dutchman.dmm b/_maps/shuttles/pirate_dutchman.dmm index 86b85f7b70e..fb36638173e 100644 --- a/_maps/shuttles/pirate_dutchman.dmm +++ b/_maps/shuttles/pirate_dutchman.dmm @@ -464,15 +464,11 @@ /obj/effect/turf_decal/siding/wood{ dir = 8 }, -/obj/structure/rack{ - icon = 'icons/obj/fluff/general.dmi'; - icon_state = "minibar"; - name = "skeletal minibar" - }, /obj/item/food/grown/sugarcane, /obj/item/food/grown/sugarcane, /obj/item/food/grown/sugarcane, /obj/item/reagent_containers/cup/bucket/wooden, +/obj/structure/rack/skeletal, /turf/open/floor/wood/airless, /area/shuttle/pirate/flying_dutchman) "vT" = ( @@ -550,17 +546,13 @@ dir = 10 }, /obj/machinery/light/floor, -/obj/structure/rack{ - icon = 'icons/obj/fluff/general.dmi'; - icon_state = "minibar"; - name = "skeletal minibar" - }, /obj/item/reagent_containers/condiment/milk{ pixel_x = -5 }, /obj/item/reagent_containers/condiment/milk{ pixel_x = 5 }, +/obj/structure/rack/skeletal, /turf/open/floor/wood/airless, /area/shuttle/pirate/flying_dutchman) "zE" = ( diff --git a/_maps/shuttles/pirate_grey.dmm b/_maps/shuttles/pirate_grey.dmm index 0726d8d1ea1..7ba8fdd5a5c 100644 --- a/_maps/shuttles/pirate_grey.dmm +++ b/_maps/shuttles/pirate_grey.dmm @@ -955,7 +955,7 @@ /area/shuttle/pirate) "DP" = ( /obj/structure/bed, -/obj/item/bedsheet/random, +/obj/effect/spawner/random/bedsheet/any, /turf/open/floor/plating, /area/shuttle/pirate) "DX" = ( diff --git a/_maps/shuttles/pirate_silverscale.dmm b/_maps/shuttles/pirate_silverscale.dmm index e4838e040e4..d4bd9d0c16b 100644 --- a/_maps/shuttles/pirate_silverscale.dmm +++ b/_maps/shuttles/pirate_silverscale.dmm @@ -91,7 +91,7 @@ /obj/structure/bed/pod{ dir = 4 }, -/obj/item/bedsheet/black{ +/obj/item/bedsheet/pirate{ dir = 4 }, /turf/open/floor/carpet/royalblack, @@ -288,7 +288,7 @@ /area/shuttle/pirate) "uP" = ( /obj/structure/bed/pod, -/obj/item/bedsheet/black, +/obj/item/bedsheet/pirate, /turf/open/floor/carpet/royalblack, /area/shuttle/pirate) "vw" = ( @@ -381,7 +381,7 @@ /obj/machinery/airalarm/directional/east, /obj/effect/mapping_helpers/airalarm/all_access, /obj/structure/bed/pod, -/obj/item/bedsheet/black, +/obj/item/bedsheet/pirate, /turf/open/floor/carpet/royalblack, /area/shuttle/pirate) "zB" = ( diff --git a/_maps/shuttles/ruin_pirate_cutter.dmm b/_maps/shuttles/ruin_pirate_cutter.dmm index 9fa1943c5f8..e99c5097664 100644 --- a/_maps/shuttles/ruin_pirate_cutter.dmm +++ b/_maps/shuttles/ruin_pirate_cutter.dmm @@ -344,7 +344,7 @@ "wV" = ( /obj/machinery/light/small/directional/north, /obj/structure/bed, -/obj/item/bedsheet/brown, +/obj/item/bedsheet/pirate, /turf/open/floor/iron/dark, /area/shuttle/ruin/caravan/pirate) "xb" = ( @@ -501,7 +501,7 @@ /obj/structure/bed{ dir = 4 }, -/obj/item/bedsheet/brown{ +/obj/item/bedsheet/pirate{ dir = 4 }, /obj/machinery/airalarm/directional/west, @@ -514,7 +514,7 @@ "Ha" = ( /obj/machinery/light/small/directional/south, /obj/structure/bed, -/obj/item/bedsheet/brown, +/obj/item/bedsheet/pirate, /turf/open/floor/iron/dark, /area/shuttle/ruin/caravan/pirate) "Hb" = ( @@ -838,7 +838,7 @@ /obj/structure/bed{ dir = 4 }, -/obj/item/bedsheet/brown{ +/obj/item/bedsheet/pirate{ dir = 4 }, /obj/machinery/firealarm/directional/west, diff --git a/_maps/shuttles/whiteship_cere.dmm b/_maps/shuttles/whiteship_cere.dmm index e6a677d57c3..1f0308690e7 100644 --- a/_maps/shuttles/whiteship_cere.dmm +++ b/_maps/shuttles/whiteship_cere.dmm @@ -388,7 +388,7 @@ /area/shuttle/abandoned/cargo) "oB" = ( /obj/structure/bed, -/obj/item/bedsheet/random, +/obj/effect/spawner/random/bedsheet/any, /obj/machinery/light/small/directional/east, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, diff --git a/_maps/shuttles/whiteship_kilo.dmm b/_maps/shuttles/whiteship_kilo.dmm index 2dc2e1c54d5..cbc214f21d8 100644 --- a/_maps/shuttles/whiteship_kilo.dmm +++ b/_maps/shuttles/whiteship_kilo.dmm @@ -1176,7 +1176,7 @@ /obj/structure/bed/pod{ dir = 1 }, -/obj/item/bedsheet/dorms{ +/obj/effect/spawner/random/bedsheet{ dir = 4 }, /obj/effect/decal/cleanable/dirt, diff --git a/_maps/shuttles/whiteship_personalshuttle.dmm b/_maps/shuttles/whiteship_personalshuttle.dmm index e3f432f350b..8e041082bc6 100644 --- a/_maps/shuttles/whiteship_personalshuttle.dmm +++ b/_maps/shuttles/whiteship_personalshuttle.dmm @@ -273,7 +273,7 @@ /area/shuttle/abandoned/bridge) "pS" = ( /obj/machinery/light/small/directional/south, -/obj/item/bedsheet/dorms{ +/obj/effect/spawner/random/bedsheet{ dir = 4 }, /obj/structure/bed/pod{ diff --git a/_maps/templates/hilbertshotel.dmm b/_maps/templates/hilbertshotel.dmm index 2895d104069..8c425aa9c13 100644 --- a/_maps/templates/hilbertshotel.dmm +++ b/_maps/templates/hilbertshotel.dmm @@ -76,7 +76,7 @@ /area/misc/hilbertshotel) "q" = ( /obj/structure/bed, -/obj/item/bedsheet/random, +/obj/effect/spawner/random/bedsheet/any, /turf/open/indestructible/hotelwood, /area/misc/hilbertshotel) "r" = ( diff --git a/_maps/templates/hilbertshotellore.dmm b/_maps/templates/hilbertshotellore.dmm index a9333eaea8b..716fa330de5 100644 --- a/_maps/templates/hilbertshotellore.dmm +++ b/_maps/templates/hilbertshotellore.dmm @@ -204,7 +204,7 @@ /area/misc/hilbertshotel) "aU" = ( /obj/structure/bed, -/obj/item/bedsheet/random, +/obj/effect/spawner/random/bedsheet/any, /obj/effect/decal/cleanable/dirt, /turf/open/indestructible/hotelwood, /area/misc/hilbertshotel) diff --git a/_maps/templates/lazy_templates/wizard_den.dmm b/_maps/templates/lazy_templates/wizard_den.dmm index 8c2ad8d2153..58e09b40a0a 100644 --- a/_maps/templates/lazy_templates/wizard_den.dmm +++ b/_maps/templates/lazy_templates/wizard_den.dmm @@ -229,7 +229,8 @@ "nV" = ( /obj/structure/flora/bush/fullgrass/style_random, /mob/living/simple_animal/hostile/ooze/gelatinous{ - name = "Jimmy" + name = "Jimmy"; + faction = list("slime", "Wizard") }, /turf/open/floor/grass, /area/centcom/wizard_station) @@ -536,7 +537,8 @@ /area/centcom/wizard_station) "AW" = ( /mob/living/simple_animal/pet/gondola{ - name = "Jommy" + name = "Jommy"; + faction = list("gondola", "Wizard") }, /obj/structure/flora/bush/fullgrass/style_random, /turf/open/floor/grass, diff --git a/_maps/virtual_domains/beach_bar.dmm b/_maps/virtual_domains/beach_bar.dmm index edea28b064f..63681684161 100644 --- a/_maps/virtual_domains/beach_bar.dmm +++ b/_maps/virtual_domains/beach_bar.dmm @@ -84,34 +84,7 @@ /turf/open/water/beach, /area/virtual_domain/fullbright) "db" = ( -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/vending_refill/cigarette, -/obj/item/vending_refill/boozeomat, -/obj/structure/closet/secure_closet{ - icon_state = "cabinet"; - name = "booze storage"; - req_access = list("bar") - }, -/obj/item/storage/backpack/duffelbag, -/obj/item/etherealballdeployer, -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/reagent_containers/cup/glass/colocup, -/obj/item/reagent_containers/cup/glass/colocup, -/obj/item/reagent_containers/cup/glass/colocup, -/obj/item/reagent_containers/cup/glass/colocup, -/obj/item/reagent_containers/cup/glass/colocup, +/obj/structure/closet/secure_closet/bar/lavaland_bartender_booze, /turf/open/floor/wood, /area/virtual_domain/fullbright) "di" = ( @@ -395,19 +368,8 @@ /turf/open/misc/asteroid/basalt/lava_land_surface, /area/virtual_domain/fullbright) "ug" = ( -/obj/structure/closet/secure_closet{ - icon_state = "cabinet"; - name = "bartender's closet"; - req_access = list("bar") - }, -/obj/item/clothing/shoes/sandal{ - desc = "A very fashionable pair of flip-flops."; - name = "flip-flops" - }, -/obj/item/clothing/neck/beads, -/obj/item/clothing/glasses/sunglasses/reagent, -/obj/item/clothing/suit/costume/hawaiian, /obj/machinery/light/small/directional/east, +/obj/structure/closet/secure_closet/bar/lavaland_bartender_clothes, /turf/open/floor/wood, /area/virtual_domain/fullbright) "uk" = ( @@ -897,7 +859,7 @@ /turf/open/misc/beach/sand, /area/virtual_domain/fullbright) "Nw" = ( -/obj/item/bedsheet/dorms{ +/obj/effect/spawner/random/bedsheet{ dir = 4 }, /obj/structure/bed{ diff --git a/_maps/virtual_domains/pirates.dmm b/_maps/virtual_domains/pirates.dmm index 5db01cc36a9..5b681ab7a30 100644 --- a/_maps/virtual_domains/pirates.dmm +++ b/_maps/virtual_domains/pirates.dmm @@ -480,14 +480,10 @@ /area/virtual_domain/fullbright) "AF" = ( /obj/effect/mapping_helpers/burnt_floor, -/obj/structure/rack{ - icon = 'icons/obj/fluff/general.dmi'; - icon_state = "minibar"; - name = "skeletal minibar" - }, /obj/item/storage/bag/money/dutchmen{ pixel_y = 13 }, +/obj/structure/rack/skeletal, /turf/open/floor/wood/parquet, /area/virtual_domain) "AP" = ( diff --git a/code/__DEFINES/_flags.dm b/code/__DEFINES/_flags.dm index 012ded7eac1..55b5b12b531 100644 --- a/code/__DEFINES/_flags.dm +++ b/code/__DEFINES/_flags.dm @@ -133,22 +133,36 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 the atom/checkpass() proc uses them (tables will call movable atom checkpass(PASSTABLE) for example) */ //flags for pass_flags +/// Allows you to pass over tables. #define PASSTABLE (1<<0) +/// Allows you to pass over glass(this generally includes anything see-through that's glass-adjacent, ie. windows, windoors, airlocks with glass, etc.) #define PASSGLASS (1<<1) +/// Allows you to pass over grilles. #define PASSGRILLE (1<<2) +/// Allows you to pass over blob tiles. #define PASSBLOB (1<<3) +/// Allows you to pass over mobs. #define PASSMOB (1<<4) +/// Allows you to pass over closed turfs, ie. walls. #define PASSCLOSEDTURF (1<<5) /// Let thrown things past us. **ONLY MEANINGFUL ON pass_flags_self!** #define LETPASSTHROW (1<<6) +/// Allows you to pass over machinery, ie. vending machines, computers, protolathes, etc. #define PASSMACHINE (1<<7) +/// Allows you to pass over structures, ie. racks, tables(if you don't already have PASSTABLE), etc. #define PASSSTRUCTURE (1<<8) +/// Allows you to pass over plastic flaps, often found at cargo or MULE dropoffs. #define PASSFLAPS (1<<9) +/// Allows you to pass over airlocks and mineral doors. #define PASSDOORS (1<<10) +/// Allows you to pass over vehicles, ie. mecha, secways, the pimpin' ride, etc. #define PASSVEHICLE (1<<11) +/// Allows you to pass over dense items. #define PASSITEM (1<<12) /// Do not intercept click attempts during Adjacent() checks. See [turf/proc/ClickCross]. **ONLY MEANINGFUL ON pass_flags_self!** #define LETPASSCLICKS (1<<13) +/// Allows you to pass over windows and window-adjacent stuff, like windows and windoors. Does not include airlocks with glass in them. +#define PASSWINDOW (1<<14) //Movement Types #define GROUND (1<<0) diff --git a/code/__DEFINES/ai/ai_blackboard.dm b/code/__DEFINES/ai/ai_blackboard.dm index daa5d4285f9..6dc90ea4d64 100644 --- a/code/__DEFINES/ai/ai_blackboard.dm +++ b/code/__DEFINES/ai/ai_blackboard.dm @@ -141,5 +141,8 @@ /// The next time at which this mob can call for reinforcements #define BB_BASIC_MOB_REINFORCEMENTS_COOLDOWN "BB_basic_mob_reinforcements_cooldown" +/// the direction we started when executing stare at things +#define BB_STARTING_DIRECTION "BB_startdir" + ///Text we display when we befriend someone #define BB_FRIENDLY_MESSAGE "friendly_message" diff --git a/code/__DEFINES/antagonists.dm b/code/__DEFINES/antagonists.dm index d750a0a3631..888164e5256 100644 --- a/code/__DEFINES/antagonists.dm +++ b/code/__DEFINES/antagonists.dm @@ -213,6 +213,9 @@ GLOBAL_LIST_INIT(ai_employers, list( /// Checks if the given mob is a blood cultist #define IS_CULTIST(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/cult)) +/// Checks if the given mob is a changeling +#define IS_CHANGELING(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/changeling)) + /// Checks if the given mob is a nuclear operative #define IS_NUKE_OP(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/nukeop)) diff --git a/code/__DEFINES/atmospherics/atmos_machinery.dm b/code/__DEFINES/atmospherics/atmos_machinery.dm index eb0f853ee94..ef1d06f7eee 100644 --- a/code/__DEFINES/atmospherics/atmos_machinery.dm +++ b/code/__DEFINES/atmospherics/atmos_machinery.dm @@ -49,6 +49,13 @@ /// Fire alarm has all components but isn't completed #define FIRE_ALARM_BUILD_SECURED 2 +// Fault levels for air alarm display +/// Area faults clear +#define AREA_FAULT_NONE 0 +/// Fault triggered by manual intervention (ie: fire alarm pull) +#define AREA_FAULT_MANUAL 1 +/// Fault triggered automatically (ie: firedoor detection) +#define AREA_FAULT_AUTOMATIC 2 // threshold_type values for [/datum/tlv/proc/set_value] and [/datum/tlv/proc/reset_value] /// [/datum/tlv/var/warning_min] diff --git a/code/__DEFINES/colors.dm b/code/__DEFINES/colors.dm index c7da3473fa3..bcb63c15382 100644 --- a/code/__DEFINES/colors.dm +++ b/code/__DEFINES/colors.dm @@ -61,6 +61,7 @@ #define COLOR_VERY_SOFT_YELLOW "#FAE48E" #define COLOR_GOLD "#FFD700" #define COLOR_ETHIOPIA_YELLOW "#FCDD09" +#define COLOR_LIGHT_YELLOW "#FFFEE0" #define COLOR_OLIVE "#808000" #define COLOR_ASSISTANT_OLIVE "#828163" diff --git a/code/__DEFINES/dcs/signals/signals_camera.dm b/code/__DEFINES/dcs/signals/signals_camera.dm index 6ec142f54fa..92e9b94f35b 100644 --- a/code/__DEFINES/dcs/signals/signals_camera.dm +++ b/code/__DEFINES/dcs/signals/signals_camera.dm @@ -1,2 +1,4 @@ -///Signal sent when a /datum/trackable found a target: (datum/trackable/source, mob/living/target) +///Signal sent when a /datum/trackable found a target: (mob/living/target) #define COMSIG_TRACKABLE_TRACKING_TARGET "comsig_trackable_tracking_target" +///Signal sent when the mob a /datum/trackable is actively following changes glide size: mob/living/target, new_glide_size) +#define COMSIG_TRACKABLE_GLIDE_CHANGED "comsig_trackable_glide_changed" diff --git a/code/__DEFINES/dcs/signals/signals_fish.dm b/code/__DEFINES/dcs/signals/signals_fish.dm index a40e731fc7b..c70cdfde1a3 100644 --- a/code/__DEFINES/dcs/signals/signals_fish.dm +++ b/code/__DEFINES/dcs/signals/signals_fish.dm @@ -28,6 +28,8 @@ #define COMSIG_FISHING_ROD_CAUGHT_FISH "fishing_rod_caught_fish" /// From /obj/item/fishing_rod/proc/hook_item(): (reward, user) #define COMSIG_FISHING_ROD_HOOKED_ITEM "fishing_rod_hooked_item" +/// From /datum/fish_source/proc/use_slot(), sent to the slotted item: (obj/item/fishing_rod/rod) +#define COMSIG_FISHING_EQUIPMENT_SLOTTED "fishing_equipment_slotted" /// Sent when the challenge is to be interrupted: (reason) #define COMSIG_FISHING_SOURCE_INTERRUPT_CHALLENGE "fishing_spot_interrupt_challenge" diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm index 2b113f853da..533ad2e1ae8 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm @@ -12,8 +12,6 @@ #define COMSIG_ORGAN_BEING_REPLACED "organ_being_replaced" /// Called when an organ gets surgically removed (mob/living/user, mob/living/carbon/old_owner, target_zone, obj/item/tool) #define COMSIG_ORGAN_SURGICALLY_REMOVED "organ_surgically_removed" -/// Called when using the *wag emote -#define COMSIG_ORGAN_WAG_TAIL "wag_tail" ///from base of mob/update_transform() #define COMSIG_LIVING_POST_UPDATE_TRANSFORM "living_post_update_transform" diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm index 6b63c1aaa9f..cd1c636c283 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm @@ -240,3 +240,9 @@ #define COMPONENT_BLOCK_MOB_CHANGE (1<<0) /// from /mob/proc/change_mob_type_unchecked() : () #define COMSIG_MOB_CHANGED_TYPE "mob_changed_type" + +/// from /mob/proc/slip(): (knockdown_amonut, obj/slipped_on, lube_flags [mobs.dm], paralyze, force_drop) +#define COMSIG_MOB_SLIPPED "mob_slipped" + +/// from /mob/proc/key_down(): (key, client/client, full_key) +#define COMSIG_MOB_KEYDOWN "mob_key_down" diff --git a/code/__DEFINES/dcs/signals/signals_reagent.dm b/code/__DEFINES/dcs/signals/signals_reagent.dm index a73d59a234c..38d2ae92d9d 100644 --- a/code/__DEFINES/dcs/signals/signals_reagent.dm +++ b/code/__DEFINES/dcs/signals/signals_reagent.dm @@ -55,3 +55,7 @@ #define COMSIG_REAGENTS_EXPOSE_TURF "reagents_expose_turf" ///from base of [/datum/component/personal_crafting/proc/del_reqs]: () #define COMSIG_REAGENTS_CRAFTING_PING "reagents_crafting_ping" +/// sent when reagents are transfered from a cup, to something refillable (atom/transfer_to) +#define COMSIG_REAGENTS_CUP_TRANSFER_TO "reagents_cup_transfer_to" +/// sent when reagents are transfered from some reagent container, to a cup (atom/transfer_from) +#define COMSIG_REAGENTS_CUP_TRANSFER_FROM "reagents_cup_transfer_from" diff --git a/code/__DEFINES/dcs/signals/uplink.dm b/code/__DEFINES/dcs/signals/uplink.dm new file mode 100644 index 00000000000..1daa4f31270 --- /dev/null +++ b/code/__DEFINES/dcs/signals/uplink.dm @@ -0,0 +1,2 @@ +///Signal sent to a mob when they purchase an item from their uplink: (datum/uplink_handler/uplink_handler_source, atom/spawned_item, mob/user) +#define COMSIG_ON_UPLINK_PURCHASE "comsig_on_uplink_purchase" diff --git a/code/__DEFINES/fish.dm b/code/__DEFINES/fish.dm index 62954a649e2..24c3c963598 100644 --- a/code/__DEFINES/fish.dm +++ b/code/__DEFINES/fish.dm @@ -3,6 +3,7 @@ // Baseline fishing difficulty levels #define FISHING_DEFAULT_DIFFICULTY 15 +#define FISHING_EASY_DIFFICULTY 10 /// Difficulty modifier when bait is fish's favorite #define FAV_BAIT_DIFFICULTY_MOD -5 @@ -52,6 +53,8 @@ #define FISHING_LINE_BOUNCY (1 << 2) /// The sorta opposite of FISHING_LINE_BOUNCY. It makes it slower to gain completion and faster to lose it. #define FISHING_LINE_STIFF (1 << 3) +///Skip the biting phase and go straight to the fishing phase. +#define FISHING_LINE_AUTOREEL (1 << 4) ///Keeps the bait from falling from gravity, instead allowing the player to move the bait down with right click. #define FISHING_MINIGAME_RULE_BIDIRECTIONAL (1 << 0) @@ -65,6 +68,8 @@ #define FISHING_MINIGAME_RULE_ANTIGRAV (1 << 4) ///Will filp the minigame hud for the duration of the effect #define FISHING_MINIGAME_RULE_FLIP (1 << 5) +///Skip the biting phase and go straight to the minigame, avoiding the penalty for having slow reflexes. +#define FISHING_MINIGAME_AUTOREEL (1 << 6) ///all the effects that are active and will last for a few seconds before triggering a cooldown #define FISHING_MINIGAME_ACTIVE_EFFECTS (FISHING_MINIGAME_RULE_ANTIGRAV|FISHING_MINIGAME_RULE_FLIP) diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm index 4f741b58e4e..23c7428625d 100644 --- a/code/__DEFINES/inventory.dm +++ b/code/__DEFINES/inventory.dm @@ -210,7 +210,6 @@ GLOBAL_LIST_INIT(detective_vest_allowed, list( /obj/item/storage/belt/holster/nukie, /obj/item/storage/belt/holster/energy, /obj/item/gun/ballistic/shotgun/automatic/combat/compact, - /obj/item/gun/microfusion, //NOVA EDIT ADDITION )) GLOBAL_LIST_INIT(security_vest_allowed, list( @@ -228,7 +227,6 @@ GLOBAL_LIST_INIT(security_vest_allowed, list( /obj/item/storage/belt/holster/energy, /obj/item/gun/ballistic/shotgun/automatic/combat/compact, /obj/item/pen/red/security, - /obj/item/gun/microfusion, //NOVA EDIT ADDITION )) GLOBAL_LIST_INIT(security_wintercoat_allowed, list( @@ -241,7 +239,6 @@ GLOBAL_LIST_INIT(security_wintercoat_allowed, list( /obj/item/storage/belt/holster/nukie, /obj/item/storage/belt/holster/energy, /obj/item/gun/ballistic/shotgun/automatic/combat/compact, - /obj/item/gun/microfusion, //NOVA EDIT ADDITION )) //Allowed list for all chaplain suits (except the honkmother robe) diff --git a/code/__DEFINES/lighting.dm b/code/__DEFINES/lighting.dm index 3316aa6afe2..ca03017686f 100644 --- a/code/__DEFINES/lighting.dm +++ b/code/__DEFINES/lighting.dm @@ -1,17 +1,17 @@ /// Object doesn't use any of the light systems. Should be changed to add a light source to the object. #define NO_LIGHT_SUPPORT 0 /// Light made with the lighting datums, applying a matrix. -#define STATIC_LIGHT 1 +#define COMPLEX_LIGHT 1 /// Light made by masking the lighting darkness plane. -#define MOVABLE_LIGHT 2 +#define OVERLAY_LIGHT 2 /// Light made by masking the lighting darkness plane, and is directional. -#define MOVABLE_LIGHT_DIRECTIONAL 3 +#define OVERLAY_LIGHT_DIRECTIONAL 3 ///Light made by masking the lighting darkness plane, and is a directionally focused beam. -#define MOVABLE_LIGHT_BEAM 4 +#define OVERLAY_LIGHT_BEAM 4 /// Nonesensical value for light color, used for null checks. #define NONSENSICAL_VALUE -99999 -/// Is a movable light source attached to another movable (its loc), meaning that the lighting component should go one level deeper. +/// Is our overlay light source attached to another movable (its loc), meaning that the lighting component should go one level deeper. #define LIGHT_ATTACHED (1<<0) /// Freezes a light in its current state, blocking any attempts at modification #define LIGHT_FROZEN (1<<1) diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 4c2eea59834..87450bf333e 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -504,9 +504,6 @@ #define ROBOTIC_BRUTE_EXAMINE_TEXT "denting" #define ROBOTIC_BURN_EXAMINE_TEXT "charring" -// If a mob has a higher threshold than this, the icon shown will be increased to the big fire icon. -#define MOB_BIG_FIRE_STACK_THRESHOLD 3 - #define GRAB_PIXEL_SHIFT_PASSIVE 6 #define GRAB_PIXEL_SHIFT_AGGRESSIVE 12 #define GRAB_PIXEL_SHIFT_NECK 16 @@ -785,8 +782,8 @@ GLOBAL_LIST_INIT(human_heights_to_offsets, list( #define WOUND_LAYER 3 /// Blood cult ascended halo layer, because there's currently no better solution for adding/removing #define HALO_LAYER 2 -/// Fire layer when you're on fire -#define FIRE_LAYER 1 +/// The highest most layer for mob overlays. Unused +#define HIGHEST_LAYER 1 #define UPPER_BODY "upper body" #define LOWER_BODY "lower body" @@ -827,7 +824,7 @@ GLOBAL_LIST_INIT(layers_to_offset, list( // BODY_BEHIND_LAYER (external organs like wings) // BODY_FRONT_LAYER (external organs like wings) // DAMAGE_LAYER (full body) - // FIRE_LAYER (full body) + // HIGHEST_LAYER (full body) // UNIFORM_LAYER (full body) // WOUND_LAYER (full body) )) diff --git a/code/__DEFINES/random_spawner.dm b/code/__DEFINES/random_spawner.dm new file mode 100644 index 00000000000..2a012e79048 --- /dev/null +++ b/code/__DEFINES/random_spawner.dm @@ -0,0 +1,3 @@ +///Used by bedsheets spawners to tell if it's a single or double bedsheet. +#define BEDSHEET_SINGLE "single" +#define BEDSHEET_DOUBLE "double" diff --git a/code/__DEFINES/research/anomalies.dm b/code/__DEFINES/research/anomalies.dm index 0ae1c24b0e3..6f4bc3cd89d 100644 --- a/code/__DEFINES/research/anomalies.dm +++ b/code/__DEFINES/research/anomalies.dm @@ -7,6 +7,7 @@ #define MAX_CORES_HALLUCINATION 8 #define MAX_CORES_BIOSCRAMBLER 8 #define MAX_CORES_DIMENSIONAL 8 +#define MAX_CORES_ECTOPLASMIC 8 ///Defines for the different types of explosion a flux anomaly can have #define FLUX_NO_EXPLOSION 0 diff --git a/code/__DEFINES/research/research_categories.dm b/code/__DEFINES/research/research_categories.dm index 65de3edca53..3f6428eb731 100644 --- a/code/__DEFINES/research/research_categories.dm +++ b/code/__DEFINES/research/research_categories.dm @@ -187,6 +187,7 @@ #define RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_TOOLS "/Cybernetic Implanting Tools" #define RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_UTILITY "/Cybernetic Utility Implants" #define RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_MISC "/Cybernetic Miscellaneous Implants" +#define RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_SECURITY "/Cybernetic Security Implants" #define RND_SUBCATEGORY_CYBERNETICS_ADVANCED_LIMBS "/Cybernetic Advanced Limbs" // Limb Categories diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index 768f1faa514..4e901c4ba2c 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -31,6 +31,11 @@ /// If the incapacitated status effect will ignore a mob being agressively grabbed #define IGNORE_GRAB (1<<2) +/// Maxamounts of fire stacks a mob can get +#define MAX_FIRE_STACKS 20 +/// If a mob has a higher threshold than this, the icon shown will be increased to the big fire icon. +#define MOB_BIG_FIRE_STACK_THRESHOLD 3 + // Grouped effect sources, see also code/__DEFINES/traits.dm #define STASIS_MACHINE_EFFECT "stasis_machine" diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm index bdb16c191bc..88d4a6a50f2 100644 --- a/code/__DEFINES/traits/declarations.dm +++ b/code/__DEFINES/traits/declarations.dm @@ -317,6 +317,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Is a medbot healing you #define TRAIT_MEDIBOTCOMINGTHROUGH "medbot" #define TRAIT_PASSTABLE "passtable" +/// Lets you fly through windows +#define TRAIT_PASSWINDOW "passwindow" /// Makes you immune to flashes #define TRAIT_NOFLASH "noflash" /// prevents xeno huggies implanting skeletons @@ -341,6 +343,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_DEL_ON_SPACE_DUMP "del_on_hyperspace_leave" /// We can walk up or around cliffs, or at least we don't fall off of it #define TRAIT_CLIFF_WALKER "cliff_walker" +/// This means the user is currently holding/wearing a "tactical camouflage" item (like a potted plant). +#define TRAIT_TACTICALLY_CAMOUFLAGED "tactically_camouflaged" /// Gets double arcade prizes #define TRAIT_GAMERGOD "gamer-god" #define TRAIT_GIANT "giant" @@ -353,10 +357,13 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_TUMOR_SUPPRESSED "brain_tumor_suppressed" /// Prevents hallucinations from the hallucination brain trauma (RDS) #define TRAIT_RDS_SUPPRESSED "rds_suppressed" -/// mobs that have this trait cannot be extinguished -#define TRAIT_PERMANENTLY_ONFIRE "permanently_onfire" +/// Mobs that have this trait cannot be extinguished +#define TRAIT_NO_EXTINGUISH "no_extinguish" /// Indicates if the mob is currently speaking with sign language #define TRAIT_SIGN_LANG "sign_language" +/// Trait given to mobs to indicate that they can catch papers thrown at them midair without trying, +/// and make syndicate airplanes when folding paper up. +#define TRAIT_PAPER_MASTER "paper_master" /// This mob is able to use sign language over the radio. #define TRAIT_CAN_SIGN_ON_COMMS "can_sign_on_comms" /// nobody can use martial arts on this mob @@ -601,6 +608,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_LAVA_STOPPED "lava_stopped" ///Chasms will be safe to cross while they've this trait. #define TRAIT_CHASM_STOPPED "chasm_stopped" +///Chasms will be safe to cross if there is something with this trait on it +#define TRAIT_CHASM_STOPPER "chasm_stopper" ///The effects of the immerse element will be halted while this trait is present. #define TRAIT_IMMERSE_STOPPED "immerse_stopped" /// The effects of hyperspace drift are blocked when the tile has this trait @@ -630,6 +639,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Used by the honkspam element to avoid spamming the sound. Amusing considering its name. #define TRAIT_HONKSPAMMING "trait_honkspamming" +/// Required by the waddling element since there are multiple sources of it. +#define TRAIT_WADDLING "trait_waddling" ///Used for managing KEEP_TOGETHER in [/atom/var/appearance_flags] #define TRAIT_KEEP_TOGETHER "keep-together" @@ -929,6 +940,11 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// This atom is currently spinning. #define TRAIT_SPINNING "spinning" +/// This limb can't be torn open anymore +#define TRAIT_IMMUNE_TO_CRANIAL_FISSURE "immune_to_cranial_fissure" +/// Trait given if the mob has a cranial fissure. +#define TRAIT_HAS_CRANIAL_FISSURE "has_cranial_fissure" + /// Denotes that this id card was given via the job outfit, aka the first ID this player got. #define TRAIT_JOB_FIRST_ID_CARD "job_first_id_card" /// ID cards with this trait will attempt to forcibly occupy the front-facing ID card slot in wallets. diff --git a/code/__DEFINES/traits/sources.dm b/code/__DEFINES/traits/sources.dm index f9cdbe4326d..dd237bf54b7 100644 --- a/code/__DEFINES/traits/sources.dm +++ b/code/__DEFINES/traits/sources.dm @@ -41,6 +41,9 @@ /// Trait from light debugging #define LIGHT_DEBUG_TRAIT "light-debug" +/// Trait given by an Action datum +#define ACTION_TRAIT "action" + #define CLOTHING_TRAIT "clothing" #define HELMET_TRAIT "helmet" /// inherited from the mask @@ -180,6 +183,8 @@ #define TRAIT_SUBTREE_REQUIRED_OPERATIONAL_DATUM "element-required" /// Trait applied by MODsuits. #define MOD_TRAIT "mod" +/// Trait applied to tram passengers +#define TRAM_PASSENGER_TRAIT "tram-passenger" /// Trait granted by the berserker hood. #define BERSERK_TRAIT "berserk_trait" @@ -279,3 +284,6 @@ #define ORGAN_INSIDE_BODY_TRAIT "organ_inside_body" /// Trait when something was labelled by a pen. #define PEN_LABEL_TRAIT "pen_label" + +/// Trait when a drink was renamed by a shaker +#define SHAKER_LABEL_TRAIT "shaker_trait" diff --git a/code/__DEFINES/wounds.dm b/code/__DEFINES/wounds.dm index 224b2c973cb..7d02aa7f3eb 100644 --- a/code/__DEFINES/wounds.dm +++ b/code/__DEFINES/wounds.dm @@ -123,6 +123,8 @@ GLOBAL_LIST_INIT(bio_state_anatomy, list( #define WOUND_SERIES_FLESH_PUNCTURE_BLEED "wound_series_flesh_puncture_bleed" /// Generic loss wounds. See loss.dm #define WOUND_SERIES_LOSS_BASIC "wound_series_loss_basic" +/// Cranial fissure wound. +#define WOUND_SERIES_CRANIAL_FISSURE "wound_series_cranial_fissure" // NOVA EDIT ADDITION BEGIN - MUSCLE AND SYNTH WOUNDS // Have to put it here so I can use it in the global list of wound series diff --git a/code/__DEFINES/~nova_defines/colony_fabricator_misc.dm b/code/__DEFINES/~nova_defines/colony_fabricator_misc.dm index 0ebd9a14240..5e741ddfa69 100644 --- a/code/__DEFINES/~nova_defines/colony_fabricator_misc.dm +++ b/code/__DEFINES/~nova_defines/colony_fabricator_misc.dm @@ -2,8 +2,6 @@ #define RND_CATEGORY_AKHTER_CLOTHING "Clothing" /// Category for equipment like belts and bags in the organics printer #define RND_CATEGORY_AKHTER_EQUIPMENT "Equipment" -/// Category for medical items in the organics printer -#define RND_CATEGORY_AKHTER_MEDICAL "Emergency Medical" /// Category for resources made by the organics printer #define RND_CATEGORY_AKHTER_RESOURCES "Resources" @@ -18,6 +16,11 @@ /// Category for the seeds the organics printer can make #define RND_CATEGORY_AKHTER_SEEDS "Synthesized Seeds" +/// Medical items in the deforest medstation +#define RND_CATEGORY_DEFOREST_MEDICAL "Emergency Medical" +/// Blood and blood bags +#define RND_CATEGORY_DEFOREST_BLOOD "Synthesized Blood" + /// The items the frontier clothing can hold GLOBAL_LIST_INIT(colonist_suit_allowed, list( /obj/item/ammo_box, diff --git a/code/__DEFINES/~nova_defines/manufacturer_strings.dm b/code/__DEFINES/~nova_defines/manufacturer_strings.dm index b9cdddc78b0..81819d4f0ef 100644 --- a/code/__DEFINES/~nova_defines/manufacturer_strings.dm +++ b/code/__DEFINES/~nova_defines/manufacturer_strings.dm @@ -8,14 +8,17 @@ #define COMPANY_CARWO "It has a small [span_cyan("four pointed star")] alongside [span_cyan("Carwo Defense Systems")] etched into it." #define COMPANY_TRAPPISTE "It has a small [span_red("pattern of five squares")] alongside [span_red("Trappiste Fabriek")] etched into it." +#define COMPANY_CYBERSUN "It has a [span_red("red circle")] broken by a hexagonal flower alongside [span_red("Cybersun Industries")] in Konjin etched into it." #define COMPANY_SCARBOROUGH "It has [span_orange("Scarborough Arms")] stamped onto it." #define COMPANY_INTERDYNE "It has [span_cyan("Interdyne Pharmaceuticals")] stamped onto it." #define COMPANY_ALLSTAR "It has [span_red("Allstar Lasers Inc.")] stamped onto it." #define COMPANY_MICRON "It has [span_cyan("Micron Control Sys.")] cut into it." +#define COMPANY_NAKAMURA "It has [span_orange("Nakamura Engineering")] embossed onto it." +#define COMPANY_BLACKSTEEL "It bears the [span_grey("crossed sword and hammer")] crafter's mark of the [span_grey("Jarnsmiour Blacksteel Foundation")] upon its fore." + #define COMPANY_SZOT "It has a small [span_engradio("three point crown")] alongside [span_engradio("Szot Dynamica")] cut into it." -#define COMPANY_TKACH "It has [span_robot("Tkach Design Bureau")] stamped onto it." #define COMPANY_SAKHNO "It has [span_green("Sakhno Concern")] stamped onto it." #define COMPANY_XHIHAO "It has [span_purple("Xhihao Light Arms")] etched into it." diff --git a/code/__HELPERS/colors.dm b/code/__HELPERS/colors.dm index 4742118bebe..9f17d4c0028 100644 --- a/code/__HELPERS/colors.dm +++ b/code/__HELPERS/colors.dm @@ -47,24 +47,24 @@ var/list/color = rgb2num(HTMLstring) return rgb(255 - color[1], 255 - color[2], 255 - color[3]) -///Flash a color on the client +///Flash a color on the passed mob /proc/flash_color(mob_or_client, flash_color="#960000", flash_time=20) - var/client/flashed_client + var/mob/flashed_mob if(ismob(mob_or_client)) - var/mob/client_mob = mob_or_client - if(client_mob.client) - flashed_client = client_mob.client - else - return + flashed_mob = mob_or_client else if(istype(mob_or_client, /client)) - flashed_client = mob_or_client + var/client/flashed_client = mob_or_client + flashed_mob = flashed_client.mob - if(!istype(flashed_client)) + if(!istype(flashed_mob)) return - var/animate_color = flashed_client.color - flashed_client.color = flash_color - animate(flashed_client, color = animate_color, time = flash_time) + var/datum/client_colour/temp/temp_color = new(flashed_mob) + temp_color.colour = flash_color + temp_color.fade_in = flash_time * 0.25 + temp_color.fade_out = flash_time * 0.25 + QDEL_IN(temp_color, (flash_time * 0.5) + 1) + flashed_mob.add_client_colour(temp_color) /// Blends together two colors (passed as 3 or 4 length lists) using the screen blend mode /// Much like multiply, screen effects the brightness of the resulting color @@ -103,4 +103,3 @@ #define RANDOM_COLOUR (rgb(rand(0,255),rand(0,255),rand(0,255))) - diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 1e447ac1470..c54c052d05d 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -27,7 +27,6 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/wings_open, GLOB.wings_open_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/frills, GLOB.frills_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/spines, GLOB.spines_list) - init_sprite_accessory_subtypes(/datum/sprite_accessory/spines_animated, GLOB.animated_spines_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/tail_spines, GLOB.tail_spines_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/legs, GLOB.legs_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/caps, GLOB.caps_list) diff --git a/code/__HELPERS/memory_helpers.dm b/code/__HELPERS/memory_helpers.dm index bc916b2d20f..807610af864 100644 --- a/code/__HELPERS/memory_helpers.dm +++ b/code/__HELPERS/memory_helpers.dm @@ -113,6 +113,11 @@ /datum/mind/proc/wipe_memory() QDEL_LIST_ASSOC_VAL(memories) +/// Helder to wipe the passed memory type ONLY from our list of memories +/datum/mind/proc/wipe_memory_type(memory_type) + qdel(memories[memory_type]) + memories -= memory_type + /// Helper to create quick copies of all of our memories /// Quick copies aren't full copies - just basic copies containing necessities. /// They cannot be used in stories. diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index c35c591bc7c..9f4fea5ed11 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -501,6 +501,19 @@ GLOBAL_LIST_EMPTY(species_list) if(!HAS_TRAIT(L, TRAIT_PASSTABLE)) L.pass_flags &= ~PASSTABLE +/proc/passwindow_on(target, source) + var/mob/living/target_mob = target + if (!HAS_TRAIT(target_mob, TRAIT_PASSWINDOW) && target_mob.pass_flags & PASSWINDOW) + ADD_TRAIT(target_mob, TRAIT_PASSWINDOW, INNATE_TRAIT) + ADD_TRAIT(target_mob, TRAIT_PASSWINDOW, source) + target_mob.pass_flags |= PASSWINDOW + +/proc/passwindow_off(target, source) + var/mob/living/target_mob = target + REMOVE_TRAIT(target_mob, TRAIT_PASSWINDOW, source) + if(!HAS_TRAIT(target_mob, TRAIT_PASSWINDOW)) + target_mob.pass_flags &= ~PASSWINDOW + /proc/dance_rotate(atom/movable/AM, datum/callback/callperrotate, set_original_dir=FALSE) set waitfor = FALSE var/originaldir = AM.dir diff --git a/code/__HELPERS/pronouns.dm b/code/__HELPERS/pronouns.dm index a099199cce0..df84c1cdcf4 100644 --- a/code/__HELPERS/pronouns.dm +++ b/code/__HELPERS/pronouns.dm @@ -386,3 +386,33 @@ temp_gender = gender if(temp_gender != PLURAL) return "es" + +/datum/mind/p_they(temp_gender) + return current?.p_they(temp_gender) || ..() + +/datum/mind/p_their(temp_gender) + return current?.p_their(temp_gender) || ..() + +/datum/mind/p_theirs(temp_gender) + return current?.p_theirs(temp_gender) || ..() + +/datum/mind/p_them(capitalized, temp_gender) + return current?.p_them(capitalized, temp_gender) || ..() + +/datum/mind/p_have(temp_gender) + return current?.p_have(temp_gender) || ..() + +/datum/mind/p_are(temp_gender) + return current?.p_are(temp_gender) || ..() + +/datum/mind/p_were(temp_gender) + return current?.p_were(temp_gender) || ..() + +/datum/mind/p_do(temp_gender) + return current?.p_do(temp_gender) || ..() + +/datum/mind/p_s(temp_gender) + return current?.p_s(temp_gender) || ..() + +/datum/mind/p_es(temp_gender) + return current?.p_es(temp_gender) || ..() diff --git a/code/__HELPERS/~nova_helpers/is_helpers.dm b/code/__HELPERS/~nova_helpers/is_helpers.dm index 6c46b9295b1..75aa3ca1001 100644 --- a/code/__HELPERS/~nova_helpers/is_helpers.dm +++ b/code/__HELPERS/~nova_helpers/is_helpers.dm @@ -17,6 +17,7 @@ #define ishemophage(A) (is_species(A, /datum/species/hemophage)) #define issnail(A) (is_species(A, /datum/species/snail)) #define isluminescent(A) (is_species(A, /datum/species/jelly/luminescent)) +#define isprimitivedemihuman(A) (is_species(A, /datum/species/human/felinid/primitive)) //Antags #define ishorrorling(A) (istype(A, /mob/living/simple_animal/hostile/true_changeling)) #define iscorticalborer(A) (istype(A, /mob/living/basic/cortical_borer)) diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index 6c5f013a379..ba2177ef64c 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -306,6 +306,7 @@ DEFINE_BITFIELD(pass_flags, list( "PASSGRILLE" = PASSGRILLE, "PASSMOB" = PASSMOB, "PASSTABLE" = PASSTABLE, + "PASSWINDOW" = PASSWINDOW, )) DEFINE_BITFIELD(resistance_flags, list( diff --git a/code/_globalvars/game_modes.dm b/code/_globalvars/game_modes.dm index 893d5de66ce..8a1493e383d 100644 --- a/code/_globalvars/game_modes.dm +++ b/code/_globalvars/game_modes.dm @@ -7,3 +7,5 @@ GLOBAL_DATUM(start_state, /datum/station_state) // Used in round-end report /// We want reality_smash_tracker to exist only once and be accessible from anywhere. GLOBAL_DATUM_INIT(reality_smash_track, /datum/reality_smash_tracker, new) + +GLOBAL_DATUM(deathmatch_game, /datum/deathmatch_controller) // Deathmatch Minigame controller diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index a26ff1752f2..d6ec01e5912 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -28,7 +28,6 @@ GLOBAL_LIST_EMPTY(frills_list) GLOBAL_LIST_EMPTY(spines_list) GLOBAL_LIST_EMPTY(tail_spines_list) GLOBAL_LIST_EMPTY(legs_list) -GLOBAL_LIST_EMPTY(animated_spines_list) //Mutant Human bits GLOBAL_LIST_EMPTY(tails_list_human) diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index 3ff0dbfd8e8..3d1087dcd6d 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -64,7 +64,9 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_UNIQUE_IMMERSE" = TRAIT_UNIQUE_IMMERSE, "TRAIT_VOIDSTORM_IMMUNE" = TRAIT_VOIDSTORM_IMMUNE, "TRAIT_WAS_RENAMED" = TRAIT_WAS_RENAMED, + "TRAIT_WADDLING" = TRAIT_WADDLING, "TRAIT_WEATHER_IMMUNE" = TRAIT_WEATHER_IMMUNE, + "TRAIT_CHASM_STOPPER" = TRAIT_CHASM_STOPPER, ), /datum/controller/subsystem/economy = list( "TRAIT_MARKET_CRASHING" = TRAIT_MARKET_CRASHING, @@ -110,17 +112,18 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_ADVANCEDTOOLUSER" = TRAIT_ADVANCEDTOOLUSER, "TRAIT_AGENDER" = TRAIT_AGENDER, "TRAIT_AGEUSIA" = TRAIT_AGEUSIA, - "TRAIT_AI_BAGATTACK" = TRAIT_AI_BAGATTACK, "TRAIT_AIRLOCK_SHOCKIMMUNE" = TRAIT_AIRLOCK_SHOCKIMMUNE, + "TRAIT_AI_BAGATTACK" = TRAIT_AI_BAGATTACK, "TRAIT_ALCOHOL_TOLERANCE" = TRAIT_ALCOHOL_TOLERANCE, - "TRAIT_ALLOW_HERETIC_CASTING" = TRAIT_ALLOW_HERETIC_CASTING, "TRAIT_ALLOWED_HONORBOUND_ATTACK" = TRAIT_ALLOWED_HONORBOUND_ATTACK, + "TRAIT_ALLOW_HERETIC_CASTING" = TRAIT_ALLOW_HERETIC_CASTING, "TRAIT_ALWAYS_NO_ACCESS" = TRAIT_ALWAYS_NO_ACCESS, + "TRAIT_ALWAYS_WANTED" = TRAIT_ALWAYS_WANTED, "TRAIT_ANGELIC" = TRAIT_ANGELIC, "TRAIT_ANTENNAE" = TRAIT_ANTENNAE, "TRAIT_ANTICONVULSANT" = TRAIT_ANTICONVULSANT, - "TRAIT_ANTIMAGIC_NO_SELFBLOCK" = TRAIT_ANTIMAGIC_NO_SELFBLOCK, "TRAIT_ANTIMAGIC" = TRAIT_ANTIMAGIC, + "TRAIT_ANTIMAGIC_NO_SELFBLOCK" = TRAIT_ANTIMAGIC_NO_SELFBLOCK, "TRAIT_ANXIOUS" = TRAIT_ANXIOUS, "TRAIT_BADDNA" = TRAIT_BADDNA, "TRAIT_BADTOUCH" = TRAIT_BADTOUCH, @@ -128,37 +131,36 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_BATON_RESISTANCE" = TRAIT_BATON_RESISTANCE, "TRAIT_BEING_BLADE_SHIELDED" = TRAIT_BEING_BLADE_SHIELDED, "TRAIT_BLOB_ALLY" = TRAIT_BLOB_ALLY, - "TRAIT_BLOOD_CLANS" = TRAIT_BLOOD_CLANS, - "TRAIT_BLOOD_DEFICIENCY" = TRAIT_BLOOD_DEFICIENCY, "TRAIT_BLOODSHOT_EYES" = TRAIT_BLOODSHOT_EYES, "TRAIT_BLOODY_MESS" = TRAIT_BLOODY_MESS, + "TRAIT_BLOOD_CLANS" = TRAIT_BLOOD_CLANS, + "TRAIT_BLOOD_DEFICIENCY" = TRAIT_BLOOD_DEFICIENCY, "TRAIT_BOMBIMMUNE" = TRAIT_BOMBIMMUNE, "TRAIT_BONSAI" = TRAIT_BONSAI, "TRAIT_BOOZE_SLIDER" = TRAIT_BOOZE_SLIDER, "TRAIT_BRAINWASHING" = TRAIT_BRAINWASHING, "TRAIT_BYPASS_EARLY_IRRADIATED_CHECK" = TRAIT_BYPASS_EARLY_IRRADIATED_CHECK, "TRAIT_BYPASS_MEASURES" = TRAIT_BYPASS_MEASURES, - "TRAIT_CAN_HOLD_ITEMS" = TRAIT_CAN_HOLD_ITEMS, - "TRAIT_CAN_SIGN_ON_COMMS" = TRAIT_CAN_SIGN_ON_COMMS, - "TRAIT_CAN_STRIP" = TRAIT_CAN_STRIP, - "TRAIT_CAN_USE_NUKE" = TRAIT_CAN_USE_NUKE, "TRAIT_CANNOT_BE_UNBUCKLED" = TRAIT_CANNOT_BE_UNBUCKLED, "TRAIT_CANNOT_CRYSTALIZE" = TRAIT_CANNOT_CRYSTALIZE, "TRAIT_CANNOT_OPEN_PRESENTS" = TRAIT_CANNOT_OPEN_PRESENTS, "TRAIT_CANT_RIDE" = TRAIT_CANT_RIDE, + "TRAIT_CAN_HOLD_ITEMS" = TRAIT_CAN_HOLD_ITEMS, + "TRAIT_CAN_SIGN_ON_COMMS" = TRAIT_CAN_SIGN_ON_COMMS, + "TRAIT_CAN_STRIP" = TRAIT_CAN_STRIP, + "TRAIT_CAN_USE_NUKE" = TRAIT_CAN_USE_NUKE, "TRAIT_CATLIKE_GRACE" = TRAIT_CATLIKE_GRACE, "TRAIT_CHANGELING_HIVEMIND_MUTE" = TRAIT_CHANGELING_HIVEMIND_MUTE, "TRAIT_CHASM_DESTROYED" = TRAIT_CHASM_DESTROYED, "TRAIT_CHEF_KISS" = TRAIT_CHEF_KISS, - "TRAIT_CHUNKYFINGERS_IGNORE_BATON" = TRAIT_CHUNKYFINGERS_IGNORE_BATON, "TRAIT_CHUNKYFINGERS" = TRAIT_CHUNKYFINGERS, + "TRAIT_CHUNKYFINGERS_IGNORE_BATON" = TRAIT_CHUNKYFINGERS_IGNORE_BATON, "TRAIT_CLEANBOT_WHISPERER" = TRAIT_CLEANBOT_WHISPERER, "TRAIT_CLIFF_WALKER" = TRAIT_CLIFF_WALKER, "TRAIT_CLOWN_ENJOYER" = TRAIT_CLOWN_ENJOYER, "TRAIT_CLUMSY" = TRAIT_CLUMSY, "TRAIT_COAGULATING" = TRAIT_COAGULATING, "TRAIT_CORPSELOCKED" = TRAIT_CORPSELOCKED, - "TRAIT_ALWAYS_WANTED" = TRAIT_ALWAYS_WANTED, "TRAIT_CRITICAL_CONDITION" = TRAIT_CRITICAL_CONDITION, "TRAIT_CULT_HALO" = TRAIT_CULT_HALO, "TRAIT_CURSED" = TRAIT_CURSED, @@ -181,8 +183,8 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_DUMB" = TRAIT_DUMB, "TRAIT_DWARF" = TRAIT_DWARF, "TRAIT_EASILY_WOUNDED" = TRAIT_EASILY_WOUNDED, - "TRAIT_EASYDISMEMBER" = TRAIT_EASYDISMEMBER, "TRAIT_EASYBLEED" = TRAIT_EASYBLEED, + "TRAIT_EASYDISMEMBER" = TRAIT_EASYDISMEMBER, "TRAIT_ECHOLOCATION_EXTRA_RANGE" = TRAIT_ECHOLOCATION_EXTRA_RANGE, "TRAIT_ECHOLOCATION_RECEIVER" = TRAIT_ECHOLOCATION_RECEIVER, "TRAIT_ELDRITCH_PAINTING_EXAMINE" = TRAIT_ELDRITCH_PAINTING_EXAMINE, @@ -211,10 +213,10 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_FORCED_GRAVITY" = TRAIT_FORCED_GRAVITY, "TRAIT_FORCED_STANDING" = TRAIT_FORCED_STANDING, "TRAIT_FOV_APPLIED" = TRAIT_FOV_APPLIED, + "TRAIT_FREERUNNING" = TRAIT_FREERUNNING, "TRAIT_FREE_FLOAT_MOVEMENT" = TRAIT_FREE_FLOAT_MOVEMENT, "TRAIT_FREE_HYPERSPACE_MOVEMENT" = TRAIT_FREE_HYPERSPACE_MOVEMENT, "TRAIT_FREE_HYPERSPACE_SOFTCORDON_MOVEMENT" = TRAIT_FREE_HYPERSPACE_SOFTCORDON_MOVEMENT, - "TRAIT_FREERUNNING" = TRAIT_FREERUNNING, "TRAIT_FRIENDLY" = TRAIT_FRIENDLY, "TRAIT_FUGU_GLANDED" = TRAIT_FUGU_GLANDED, "TRAIT_GAMER" = TRAIT_GAMER, @@ -226,12 +228,13 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_GOOD_HEARING" = TRAIT_GOOD_HEARING, "TRAIT_GRABWEAKNESS" = TRAIT_GRABWEAKNESS, "TRAIT_GREENTEXT_CURSED" = TRAIT_GREENTEXT_CURSED, - "TRAIT_GUN_NATURAL" = TRAIT_GUN_NATURAL, "TRAIT_GUNFLIP" = TRAIT_GUNFLIP, + "TRAIT_GUN_NATURAL" = TRAIT_GUN_NATURAL, "TRAIT_HALT_RADIATION_EFFECTS" = TRAIT_HALT_RADIATION_EFFECTS, "TRAIT_HANDS_BLOCKED" = TRAIT_HANDS_BLOCKED, "TRAIT_HARDLY_WOUNDED" = TRAIT_HARDLY_WOUNDED, "TRAIT_HAS_BEEN_KIDNAPPED" = TRAIT_HAS_BEEN_KIDNAPPED, + "TRAIT_HAS_CRANIAL_FISSURE" = TRAIT_HAS_CRANIAL_FISSURE, "TRAIT_HAS_MARKINGS" = TRAIT_HAS_MARKINGS, "TRAIT_HATED_BY_DOGS" = TRAIT_HATED_BY_DOGS, "TRAIT_HEALS_FROM_CARP_RIFTS" = TRAIT_HEALS_FROM_CARP_RIFTS, @@ -252,36 +255,34 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_IGNORING_GRAVITY" = TRAIT_IGNORING_GRAVITY, "TRAIT_ILLITERATE" = TRAIT_ILLITERATE, "TRAIT_IMMOBILIZED" = TRAIT_IMMOBILIZED, - "TRAIT_IN_CALL" = TRAIT_IN_CALL, "TRAIT_INCAPACITATED" = TRAIT_INCAPACITATED, "TRAIT_INTROVERT" = TRAIT_INTROVERT, "TRAIT_INVISIBLE_MAN" = TRAIT_INVISIBLE_MAN, "TRAIT_INVISIMIN" = TRAIT_INVISIMIN, + "TRAIT_IN_CALL" = TRAIT_IN_CALL, "TRAIT_IWASBATONED" = TRAIT_IWASBATONED, "TRAIT_JOLLY" = TRAIT_JOLLY, "TRAIT_KISS_OF_DEATH" = TRAIT_KISS_OF_DEATH, "TRAIT_KNOCKEDOUT" = TRAIT_KNOCKEDOUT, "TRAIT_KNOW_ENGI_WIRES" = TRAIT_KNOW_ENGI_WIRES, "TRAIT_KNOW_ROBO_WIRES" = TRAIT_KNOW_ROBO_WIRES, + "TRAIT_LIGHTBULB_REMOVER" = TRAIT_LIGHTBULB_REMOVER, "TRAIT_LIGHT_DRINKER" = TRAIT_LIGHT_DRINKER, "TRAIT_LIGHT_STEP" = TRAIT_LIGHT_STEP, - "TRAIT_LIGHTBULB_REMOVER" = TRAIT_LIGHTBULB_REMOVER, "TRAIT_LIMBATTACHMENT" = TRAIT_LIMBATTACHMENT, "TRAIT_LITERATE" = TRAIT_LITERATE, "TRAIT_LIVERLESS_METABOLISM" = TRAIT_LIVERLESS_METABOLISM, - "TRAIT_LIVERLESS_METABOLISM" = TRAIT_LIVERLESS_METABOLISM, "TRAIT_MADNESS_IMMUNE" = TRAIT_MADNESS_IMMUNE, "TRAIT_MAGICALLY_GIFTED" = TRAIT_MAGICALLY_GIFTED, "TRAIT_MAGICALLY_PHASED" = TRAIT_MAGICALLY_PHASED, "TRAIT_MARTIAL_ARTS_IMMUNE" = TRAIT_MARTIAL_ARTS_IMMUNE, "TRAIT_MEDIBOTCOMINGTHROUGH" = TRAIT_MEDIBOTCOMINGTHROUGH, - "TRAIT_MEDIBOTCOMINGTHROUGH" = TRAIT_MEDIBOTCOMINGTHROUGH, "TRAIT_MEDICAL_HUD" = TRAIT_MEDICAL_HUD, "TRAIT_MESON_VISION" = TRAIT_MESON_VISION, "TRAIT_MIME_FAN" = TRAIT_MIME_FAN, "TRAIT_MIMING" = TRAIT_MIMING, - "TRAIT_MIND_TEMPORARILY_GONE" = TRAIT_MIND_TEMPORARILY_GONE, "TRAIT_MINDSHIELD" = TRAIT_MINDSHIELD, + "TRAIT_MIND_TEMPORARILY_GONE" = TRAIT_MIND_TEMPORARILY_GONE, "TRAIT_MOB_BREEDER" = TRAIT_MOB_BREEDER, "TRAIT_MOB_TIPPED" = TRAIT_MOB_TIPPED, "TRAIT_MORBID" = TRAIT_MORBID, @@ -319,6 +320,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_NO_DEBRAIN_OVERLAY" = TRAIT_NO_DEBRAIN_OVERLAY, "TRAIT_NO_DNA_COPY" = TRAIT_NO_DNA_COPY, "TRAIT_NO_DNA_SCRAMBLE" = TRAIT_NO_DNA_SCRAMBLE, + "TRAIT_NO_EXTINGUISH" = TRAIT_NO_EXTINGUISH, "TRAIT_NO_FLOATING_ANIM" = TRAIT_NO_FLOATING_ANIM, "TRAIT_NO_GLIDE" = TRAIT_NO_GLIDE, "TRAIT_NO_PLASMA_TRANSFORM" = TRAIT_NO_PLASMA_TRANSFORM, @@ -340,31 +342,13 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_NOCRITDAMAGE" = TRAIT_NOCRITDAMAGE, "TRAIT_NO_UNDERWEAR" = TRAIT_NO_UNDERWEAR, "TRAIT_NO_ZOMBIFY" = TRAIT_NO_ZOMBIFY, - "TRAIT_NOBLOOD" = TRAIT_NOBLOOD, - "TRAIT_NOBREATH" = TRAIT_NOBREATH, - "TRAIT_NOCRITDAMAGE" = TRAIT_NOCRITDAMAGE, - "TRAIT_NOCRITOVERLAY" = TRAIT_NOCRITOVERLAY, - "TRAIT_NODEATH" = TRAIT_NODEATH, - "TRAIT_NODISMEMBER" = TRAIT_NODISMEMBER, - "TRAIT_NOFAT" = TRAIT_NOFAT, - "TRAIT_NOFEAR_HOLDUPS" = TRAIT_NOFEAR_HOLDUPS, - "TRAIT_NOFIRE_SPREAD" = TRAIT_NOFIRE_SPREAD, - "TRAIT_NOFIRE" = TRAIT_NOFIRE, - "TRAIT_NOFLASH" = TRAIT_NOFLASH, - "TRAIT_NOGUNS" = TRAIT_NOGUNS, - "TRAIT_NOHARDCRIT" = TRAIT_NOHARDCRIT, - "TRAIT_NOHUNGER" = TRAIT_NOHUNGER, - "TRAIT_NOLIMBDISABLE" = TRAIT_NOLIMBDISABLE, - "TRAIT_NOMOBSWAP" = TRAIT_NOMOBSWAP, - "TRAIT_NOSELFIGNITION_HEAD_ONLY" = TRAIT_NOSELFIGNITION_HEAD_ONLY, - "TRAIT_NOSOFTCRIT" = TRAIT_NOSOFTCRIT, "TRAIT_NUKEIMMUNE" = TRAIT_NUKEIMMUNE, "TRAIT_OIL_FRIED" = TRAIT_OIL_FRIED, "TRAIT_ON_ELEVATED_SURFACE" = TRAIT_ON_ELEVATED_SURFACE, "TRAIT_ORBITING_FORBIDDEN" = TRAIT_ORBITING_FORBIDDEN, "TRAIT_OVERDOSEIMMUNE" = TRAIT_OVERDOSEIMMUNE, - "TRAIT_OVERWATCH_IMMUNE" = TRAIT_OVERWATCH_IMMUNE, "TRAIT_OVERWATCHED" = TRAIT_OVERWATCHED, + "TRAIT_OVERWATCH_IMMUNE" = TRAIT_OVERWATCH_IMMUNE, "TRAIT_PACIFISM" = TRAIT_PACIFISM, "TRAIT_PARALYSIS_L_ARM" = TRAIT_PARALYSIS_L_ARM, "TRAIT_PARALYSIS_L_LEG" = TRAIT_PARALYSIS_L_LEG, @@ -372,9 +356,9 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_PARALYSIS_R_LEG" = TRAIT_PARALYSIS_R_LEG, "TRAIT_PARROT_PERCHED" = TRAIT_PARROT_PERCHED, "TRAIT_PASSTABLE" = TRAIT_PASSTABLE, + "TRAIT_PASSWINDOW" = TRAIT_PASSWINDOW, "TRAIT_PERFECT_ATTACKER" = TRAIT_PERFECT_ATTACKER, "TRAIT_PERMANENTLY_MORTAL" = TRAIT_PERMANENTLY_MORTAL, - "TRAIT_PERMANENTLY_ONFIRE" = TRAIT_PERMANENTLY_ONFIRE, "TRAIT_PHOTOGRAPHER" = TRAIT_PHOTOGRAPHER, "TRAIT_PIERCEIMMUNE" = TRAIT_PIERCEIMMUNE, "TRAIT_PLANT_SAFE" = TRAIT_PLANT_SAFE, @@ -387,9 +371,9 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_PROSOPAGNOSIA" = TRAIT_PROSOPAGNOSIA, "TRAIT_PULL_BLOCKED" = TRAIT_PULL_BLOCKED, "TRAIT_PUSHIMMUNE" = TRAIT_PUSHIMMUNE, + "TRAIT_QUICKER_CARRY" = TRAIT_QUICKER_CARRY, "TRAIT_QUICK_BUILD" = TRAIT_QUICK_BUILD, "TRAIT_QUICK_CARRY" = TRAIT_QUICK_CARRY, - "TRAIT_QUICKER_CARRY" = TRAIT_QUICKER_CARRY, "TRAIT_RADIMMUNE" = TRAIT_RADIMMUNE, "TRAIT_RDS_SUPPRESSED" = TRAIT_RDS_SUPPRESSED, "TRAIT_REAGENT_SCANNER" = TRAIT_REAGENT_SCANNER, @@ -421,6 +405,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_SHOCKIMMUNE" = TRAIT_SHOCKIMMUNE, "TRAIT_SHOVE_KNOCKDOWN_BLOCKED" = TRAIT_SHOVE_KNOCKDOWN_BLOCKED, "TRAIT_SIGN_LANG" = TRAIT_SIGN_LANG, + "TRAIT_PAPER_MASTER" = TRAIT_PAPER_MASTER, "TRAIT_SILENT_FOOTSTEPS" = TRAIT_SILENT_FOOTSTEPS, "TRAIT_SIXTHSENSE" = TRAIT_SIXTHSENSE, "TRAIT_SKITTISH" = TRAIT_SKITTISH, @@ -450,6 +435,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_TACKLING_FRAIL_ATTACKER" = TRAIT_TACKLING_FRAIL_ATTACKER, "TRAIT_TACKLING_TAILED_DEFENDER" = TRAIT_TACKLING_TAILED_DEFENDER, "TRAIT_TACKLING_WINGED_ATTACKER" = TRAIT_TACKLING_WINGED_ATTACKER, + "TRAIT_TACTICALLY_CAMOUFLAGED" = TRAIT_TACTICALLY_CAMOUFLAGED, "TRAIT_TAGGER" = TRAIT_TAGGER, "TRAIT_TEMPORARY_BODY" = TRAIT_TEMPORARY_BODY, "TRAIT_TENACIOUS" = TRAIT_TENACIOUS, @@ -481,16 +467,16 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_VATGROWN" = TRAIT_VATGROWN, "TRAIT_VENTCRAWLER_ALWAYS" = TRAIT_VENTCRAWLER_ALWAYS, "TRAIT_VENTCRAWLER_NUDE" = TRAIT_VENTCRAWLER_NUDE, - "TRAIT_VIRUS_RESISTANCE" = TRAIT_VIRUS_RESISTANCE, "TRAIT_VIRUSIMMUNE" = TRAIT_VIRUSIMMUNE, + "TRAIT_VIRUS_RESISTANCE" = TRAIT_VIRUS_RESISTANCE, "TRAIT_VORACIOUS" = TRAIT_VORACIOUS, "TRAIT_WAS_EVOLVED" = TRAIT_WAS_EVOLVED, "TRAIT_WEAK_SOUL" = TRAIT_WEAK_SOUL, "TRAIT_WEB_SURFER" = TRAIT_WEB_SURFER, "TRAIT_WEB_WEAVER" = TRAIT_WEB_WEAVER, "TRAIT_WINE_TASTER" = TRAIT_WINE_TASTER, - "TRAIT_WING_BUFFET_TIRED" = TRAIT_WING_BUFFET_TIRED, "TRAIT_WING_BUFFET" = TRAIT_WING_BUFFET, + "TRAIT_WING_BUFFET_TIRED" = TRAIT_WING_BUFFET_TIRED, "TRAIT_XENO_HOST" = TRAIT_XENO_HOST, "TRAIT_XENO_IMMUNE" = TRAIT_XENO_IMMUNE, "TRAIT_XRAY_HEARING" = TRAIT_XRAY_HEARING, @@ -530,6 +516,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( /obj/item/bodypart = list( "TRAIT_DISABLED_BY_WOUND" = TRAIT_DISABLED_BY_WOUND, "TRAIT_IGNORED_BY_LIVING_FLESH" = TRAIT_IGNORED_BY_LIVING_FLESH, + "TRAIT_IMMUNE_TO_CRANIAL_FISSURE" = TRAIT_IMMUNE_TO_CRANIAL_FISSURE, ), /obj/item/bodypart = list( "TRAIT_PARALYSIS" = TRAIT_PARALYSIS, diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm index 02499c7b889..54f9db6b89c 100644 --- a/code/_globalvars/traits/admin_tooling.dm +++ b/code/_globalvars/traits/admin_tooling.dm @@ -113,7 +113,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_LIMBATTACHMENT" = TRAIT_LIMBATTACHMENT, "TRAIT_LITERATE" = TRAIT_LITERATE, "TRAIT_LIVERLESS_METABOLISM" = TRAIT_LIVERLESS_METABOLISM, - "TRAIT_LIVERLESS_METABOLISM" = TRAIT_LIVERLESS_METABOLISM, + "TRAIT_MAGICALLY_GIFTED" = TRAIT_MAGICALLY_GIFTED, "TRAIT_MEDICAL_HUD" = TRAIT_MEDICAL_HUD, "TRAIT_MIME_FAN" = TRAIT_MIME_FAN, "TRAIT_MIMING" = TRAIT_MIMING, @@ -129,6 +129,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_NO_AUGMENTS" = TRAIT_NO_AUGMENTS, "TRAIT_NO_BLOOD_OVERLAY" = TRAIT_NO_BLOOD_OVERLAY, "TRAIT_NO_DNA_COPY" = TRAIT_NO_DNA_COPY, + "TRAIT_NO_EXTINGUISH" = TRAIT_NO_EXTINGUISH, "TRAIT_NO_GLIDE" = TRAIT_NO_GLIDE, "TRAIT_NO_PLASMA_TRANSFORM" = TRAIT_NO_PLASMA_TRANSFORM, "TRAIT_NO_SLIP_ALL" = TRAIT_NO_SLIP_ALL, @@ -161,8 +162,8 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_PARALYSIS_R_ARM" = TRAIT_PARALYSIS_R_ARM, "TRAIT_PARALYSIS_R_LEG" = TRAIT_PARALYSIS_R_LEG, "TRAIT_PASSTABLE" = TRAIT_PASSTABLE, + "TRAIT_PASSWINDOW" = TRAIT_PASSWINDOW, "TRAIT_PERFECT_ATTACKER" = TRAIT_PERFECT_ATTACKER, - "TRAIT_PERMANENTLY_ONFIRE" = TRAIT_PERMANENTLY_ONFIRE, "TRAIT_PHOTOGRAPHER" = TRAIT_PHOTOGRAPHER, "TRAIT_PIERCEIMMUNE" = TRAIT_PIERCEIMMUNE, "TRAIT_PLANT_SAFE" = TRAIT_PLANT_SAFE, @@ -188,6 +189,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_SHIFTY_EYES" = TRAIT_SHIFTY_EYES, "TRAIT_SHOCKIMMUNE" = TRAIT_SHOCKIMMUNE, "TRAIT_SIGN_LANG" = TRAIT_SIGN_LANG, + "TRAIT_PAPER_MASTER" = TRAIT_PAPER_MASTER, "TRAIT_SILENT_FOOTSTEPS" = TRAIT_SILENT_FOOTSTEPS, "TRAIT_SIXTHSENSE" = TRAIT_SIXTHSENSE, "TRAIT_SKITTISH" = TRAIT_SKITTISH, diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm index 7660b0c7bc3..067f2b013b7 100644 --- a/code/_onclick/ai.dm +++ b/code/_onclick/ai.dm @@ -11,7 +11,7 @@ return if(ismob(A)) - ai_tracking_tool.set_tracked_mob(src, A.name) + ai_tracking_tool.track_mob(src, A) else A.move_camera_by_click() diff --git a/code/_onclick/hud/action_button.dm b/code/_onclick/hud/action_button.dm index 533e8f1e8dd..92defc66101 100644 --- a/code/_onclick/hud/action_button.dm +++ b/code/_onclick/hud/action_button.dm @@ -18,6 +18,8 @@ /// A weakref of the last thing we hovered over /// God I hate how dragging works var/datum/weakref/last_hovored_ref + /// overlay for keybind maptext + var/mutable_appearance/keybind_maptext /atom/movable/screen/movable/action_button/Destroy() if(our_hud) @@ -48,6 +50,9 @@ return FALSE var/list/modifiers = params2list(params) + if(LAZYACCESS(modifiers, ALT_CLICK)) + begin_creating_bind(usr) + return TRUE if(LAZYACCESS(modifiers, SHIFT_CLICK)) var/datum/hud/our_hud = usr.hud_used our_hud.position_action(src, SCRN_OBJ_DEFAULT) @@ -61,6 +66,14 @@ linked_action.Trigger(trigger_flags = trigger_flags) return TRUE +/atom/movable/screen/movable/action_button/proc/begin_creating_bind(mob/user) + if(!isnull(linked_action.full_key)) + linked_action.full_key = null + linked_action.update_button_status(src) + return + linked_action.full_key = tgui_input_keycombo(user, "Please bind a key for this action.") + linked_action.update_button_status(src) + // Entered and Exited won't fire while you're dragging something, because you're still "holding" it // Very much byond logic, but I want nice behavior, so we fake it with drag /atom/movable/screen/movable/action_button/MouseDrag(atom/over_object, src_location, over_location, src_control, over_control, params) @@ -149,6 +162,15 @@ return user.client.prefs.action_buttons_screen_locs -= "[name]_[id]" +/atom/movable/screen/movable/action_button/proc/update_keybind_maptext(key) + cut_overlay(keybind_maptext) + if(!key) + return + keybind_maptext = new + keybind_maptext.maptext = MAPTEXT("[key]") + keybind_maptext.transform = keybind_maptext.transform.Translate(-4, length(key) > 1 ? -6 : 2) //with modifiers, its placed lower so cooldown is visible + add_overlay(keybind_maptext) + /** * This is a silly proc used in hud code code to determine what icon and icon state we should be using * for hud elements (such as action buttons) that don't have their own icon and icon state set. @@ -241,7 +263,7 @@ action.HideFrom(src) /atom/movable/screen/button_palette - desc = "Drag buttons to move them
Shift-click any button to reset it
Alt-click this to reset all buttons" + desc = "Drag buttons to move them
Shift-click any button to reset it
Alt-click any button to begin binding it to a key
Alt-click this to reset all buttons" icon = 'icons/hud/64x16_actions.dmi' icon_state = "screen_gen_palette" screen_loc = ui_action_palette diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index e73cebf14c0..1f5f7588162 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -464,7 +464,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." var/mob/living/living_owner = owner var/last_whisper if(!HAS_TRAIT(living_owner, TRAIT_SUCCUMB_OVERRIDE)) - last_whisper = tgui_input_text(usr, "Do you have any last words?", "Goodnight, Sweet Prince") + last_whisper = tgui_input_text(usr, "Do you have any last words?", "Goodnight, Sweet Prince", encode = FALSE) // saycode already handles sanitization if(isnull(last_whisper)) if(!HAS_TRAIT(living_owner, TRAIT_SUCCUMB_OVERRIDE)) return diff --git a/code/_onclick/hud/fullscreen.dm b/code/_onclick/hud/fullscreen.dm index e928a2b8b3e..79f857e8cbe 100644 --- a/code/_onclick/hud/fullscreen.dm +++ b/code/_onclick/hud/fullscreen.dm @@ -223,4 +223,3 @@ icon_state = "noise" color = "#04a8d1" alpha = 80 - diff --git a/code/_onclick/hud/rendering/render_plate.dm b/code/_onclick/hud/rendering/render_plate.dm index e42c1f94f68..d33162a5b5f 100644 --- a/code/_onclick/hud/rendering/render_plate.dm +++ b/code/_onclick/hud/rendering/render_plate.dm @@ -212,7 +212,7 @@
That's how lighting functions at base. Because it uses BLEND_MULTIPLY and occasionally color matrixes, it needs a backdrop of blackness.\
See This byond post\
Lemme see uh, we're masked by the emissive plane so it can actually function (IE: make things glow in the dark).\ -
We're also masked by the overlay lighting plane, which contains all the movable lights in the game. It draws to us and also the game plane.\ +
We're also masked by the overlay lighting plane, which contains all the well overlay lights in the game. It draws to us and also the game plane.\
Masks us out so it has the breathing room to apply its effect.\
Oh and we quite often have our alpha changed to achive night vision effects, or things of that sort." plane = RENDER_PLANE_LIGHTING diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index 04bbc048e66..ec79374cb4f 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -229,6 +229,9 @@ /mob/living/carbon/alien/larva/resolve_right_click_attack(atom/target, list/modifiers) return target.attack_larva_secondary(src, modifiers) +/mob/living/carbon/alien/larva/can_unarmed_attack() //We bite stuff, and our head is always free. + return TRUE + /atom/proc/attack_larva(mob/user, list/modifiers) return diff --git a/code/controllers/master.dm b/code/controllers/master.dm index ce660ff512b..32093c12745 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -688,10 +688,16 @@ GLOBAL_REAL(Master, /datum/controller/master) queue_node.state = SS_RUNNING + if(queue_node.profiler_focused) + world.Profile(PROFILE_START) + tick_usage = TICK_USAGE var/state = queue_node.ignite(queue_node_paused) tick_usage = TICK_USAGE - tick_usage + if(queue_node.profiler_focused) + world.Profile(PROFILE_STOP) + if (state == SS_RUNNING) state = SS_IDLE current_tick_budget -= queue_node_priority diff --git a/code/controllers/subsystem.dm b/code/controllers/subsystem.dm index ddeb9368f50..b01f4b17b9d 100644 --- a/code/controllers/subsystem.dm +++ b/code/controllers/subsystem.dm @@ -38,6 +38,12 @@ ///Bitmap of what game states can this subsystem fire at. See [RUNLEVELS_DEFAULT] for more details. var/runlevels = RUNLEVELS_DEFAULT //points of the game at which the SS can fire + /** + * boolean set by admins. if TRUE then this subsystem will stop the world profiler after ignite() returns and start it again when called. + * used so that you can audit a specific subsystem or group of subsystems' synchronous call chain. + */ + var/profiler_focused = FALSE + /* * The following variables are managed by the MC and should not be modified directly. */ @@ -65,7 +71,7 @@ /// Tracks the current execution state of the subsystem. Used to handle subsystems that sleep in fire so the mc doesn't run them again while they are sleeping var/state = SS_IDLE - + /// Tracks how many times a subsystem has ever slept in fire(). var/slept_count = 0 diff --git a/code/controllers/subsystem/atoms.dm b/code/controllers/subsystem/atoms.dm index 916bbed6e4e..71eaed14ea2 100644 --- a/code/controllers/subsystem/atoms.dm +++ b/code/controllers/subsystem/atoms.dm @@ -1,4 +1,3 @@ -#define SUBSYSTEM_INIT_SOURCE "subsystem init" SUBSYSTEM_DEF(atoms) name = "Atoms" init_order = INIT_ORDER_ATOMS @@ -41,11 +40,16 @@ SUBSYSTEM_DEF(atoms) if(initialized == INITIALIZATION_INSSATOMS) return - set_tracked_initalized(INITIALIZATION_INNEW_MAPLOAD, SUBSYSTEM_INIT_SOURCE) + // Generate a unique mapload source for this run of InitializeAtoms + var/static/uid = 0 + uid = (uid + 1) % (SHORT_REAL_LIMIT - 1) + var/source = "subsystem init [uid]" + set_tracked_initalized(INITIALIZATION_INNEW_MAPLOAD, source) // This may look a bit odd, but if the actual atom creation runtimes for some reason, we absolutely need to set initialized BACK - CreateAtoms(atoms, atoms_to_return) - clear_tracked_initalize(SUBSYSTEM_INIT_SOURCE) + CreateAtoms(atoms, atoms_to_return, source) + clear_tracked_initalize(source) + SSicon_smooth.free_deferred(source) if(late_loaders.len) for(var/I in 1 to late_loaders.len) @@ -72,7 +76,7 @@ SUBSYSTEM_DEF(atoms) #endif /// Actually creates the list of atoms. Exists soley so a runtime in the creation logic doesn't cause initalized to totally break -/datum/controller/subsystem/atoms/proc/CreateAtoms(list/atoms, list/atoms_to_return = null) +/datum/controller/subsystem/atoms/proc/CreateAtoms(list/atoms, list/atoms_to_return = null, mapload_source = null) if (atoms_to_return) LAZYINITLIST(created_atoms) @@ -90,7 +94,12 @@ SUBSYSTEM_DEF(atoms) for(var/I in 1 to atoms.len) var/atom/A = atoms[I] if(!(A.flags_1 & INITIALIZED_1)) - CHECK_TICK + // Unrolled CHECK_TICK setup to let us enable/disable mapload based off source + if(TICK_CHECK) + clear_tracked_initalize(mapload_source) + stoplag() + if(mapload_source) + set_tracked_initalized(INITIALIZATION_INNEW_MAPLOAD, mapload_source) PROFILE_INIT_ATOM_BEGIN() InitAtom(A, TRUE, mapload_arg) PROFILE_INIT_ATOM_END(A) @@ -107,7 +116,11 @@ SUBSYSTEM_DEF(atoms) #ifdef TESTING ++count #endif - CHECK_TICK + if(TICK_CHECK) + clear_tracked_initalize(mapload_source) + stoplag() + if(mapload_source) + set_tracked_initalized(INITIALIZATION_INNEW_MAPLOAD, mapload_source) testing("Initialized [count] atoms") @@ -117,6 +130,13 @@ SUBSYSTEM_DEF(atoms) /datum/controller/subsystem/atoms/proc/map_loader_stop(source) clear_tracked_initalize(source) +/// Returns the source currently modifying SSatom's init behavior +/datum/controller/subsystem/atoms/proc/get_initialized_source() + var/state_length = length(initialized_state) + if(!state_length) + return null + return initialized_state[state_length][1] + /// Use this to set initialized to prevent error states where the old initialized is overriden, and we end up losing all context /// Accepts a state and a source, the most recent state is used, sources exist to prevent overriding old values accidentially /datum/controller/subsystem/atoms/proc/set_tracked_initalized(state, source) @@ -199,5 +219,3 @@ SUBSYSTEM_DEF(atoms) var/initlog = InitLog() if(initlog) text2file(initlog, "[GLOB.log_directory]/initialize.log") - -#undef SUBSYSTEM_INIT_SOURCE diff --git a/code/controllers/subsystem/economy.dm b/code/controllers/subsystem/economy.dm index f8377302bd3..7b3f93f5d82 100644 --- a/code/controllers/subsystem/economy.dm +++ b/code/controllers/subsystem/economy.dm @@ -29,6 +29,8 @@ SUBSYSTEM_DEF(economy) * A list of sole account datums can be obtained with flatten_list(), another variable would be redundant rn. */ var/list/bank_accounts_by_id = list() + /// A list of bank accounts indexed by their assigned job. + var/list/bank_accounts_by_job = list() ///List of the departmental budget cards in existance. var/list/dep_cards = list() /// A var that collects the total amount of credits owned in player accounts on station, reset and recounted on fire() diff --git a/code/controllers/subsystem/icon_smooth.dm b/code/controllers/subsystem/icon_smooth.dm index 4d5f3069eca..9e5e9ffa99d 100644 --- a/code/controllers/subsystem/icon_smooth.dm +++ b/code/controllers/subsystem/icon_smooth.dm @@ -9,6 +9,7 @@ SUBSYSTEM_DEF(icon_smooth) var/list/blueprint_queue = list() var/list/smooth_queue = list() var/list/deferred = list() + var/list/deferred_by_source = list() /datum/controller/subsystem/icon_smooth/fire() // We do not want to smooth icons of atoms whose neighbors are not initialized yet, @@ -61,16 +62,30 @@ SUBSYSTEM_DEF(icon_smooth) return SS_INIT_SUCCESS +/// Releases a pool of delayed smooth attempts from a particular source +/datum/controller/subsystem/icon_smooth/proc/free_deferred(source_to_free) + smooth_queue += deferred_by_source[source_to_free] + deferred_by_source -= source_to_free + if(!can_fire) + can_fire = TRUE /datum/controller/subsystem/icon_smooth/proc/add_to_queue(atom/thing) if(thing.smoothing_flags & SMOOTH_QUEUED) return thing.smoothing_flags |= SMOOTH_QUEUED + // If we're currently locked into mapload BY something + // Then put us in a deferred list that we release when this mapload run is finished + if(initialized && length(SSatoms.initialized_state) && SSatoms.initialized == INITIALIZATION_INNEW_MAPLOAD) + var/source = SSatoms.get_initialized_source() + LAZYADD(deferred_by_source[source], thing) + return smooth_queue += thing if(!can_fire) can_fire = TRUE /datum/controller/subsystem/icon_smooth/proc/remove_from_queues(atom/thing) + // Lack of removal from deferred_by_source is safe because the lack of SMOOTH_QUEUED will just free it anyway + // Hopefully this'll never cause a harddel (dies) thing.smoothing_flags &= ~SMOOTH_QUEUED smooth_queue -= thing if(blueprint_queue) diff --git a/code/controllers/subsystem/ore_generation.dm b/code/controllers/subsystem/ore_generation.dm index 162bc2e99d9..ca8aa09d611 100644 --- a/code/controllers/subsystem/ore_generation.dm +++ b/code/controllers/subsystem/ore_generation.dm @@ -6,11 +6,11 @@ SUBSYSTEM_DEF(ore_generation) runlevels = RUNLEVEL_GAME /// All ore vents that are currently producing boulders. - var/list/processed_vents = list() - /// All the boulders that have been produced by ore vents to be pulled by BRM machines. - var/list/available_boulders = list() + var/list/obj/structure/ore_vent/processed_vents = list() /// All the ore vents that are currently in the game, not just the ones that are producing boulders. - var/list/possible_vents = list() + var/list/obj/structure/ore_vent/possible_vents = list() + /// All the boulders that have been produced by ore vents to be pulled by BRM machines. + var/list/obj/item/boulder/available_boulders = list() /** * A list of all the minerals that are being mined by ore vents. We reset this list every time cave generation is done. * Generally Should be empty by the time initialize ends on lavaland. @@ -18,6 +18,7 @@ SUBSYSTEM_DEF(ore_generation) * If we call cave_generation more than once, we copy a list from the lists in lists/ores_spawned.dm */ var/list/ore_vent_minerals = list() + /// A tracker of how many of each ore vent size we have in the game. Useful for tracking purposes. var/list/ore_vent_sizes = list( LARGE_VENT_TYPE = 0, @@ -60,7 +61,7 @@ SUBSYSTEM_DEF(ore_generation) return SS_INIT_SUCCESS /datum/controller/subsystem/ore_generation/fire(resumed) - available_boulders = list() // reset upon new fire. + available_boulders.Cut() // reset upon new fire. for(var/obj/structure/ore_vent/current_vent as anything in processed_vents) var/local_vent_count = 0 @@ -71,6 +72,4 @@ SUBSYSTEM_DEF(ore_generation) if(local_vent_count >= MAX_BOULDERS_PER_VENT) continue //We don't want to be accountable for literally hundreds of unprocessed boulders for no reason. - var/obj/item/boulder/new_rock = current_vent.produce_boulder() - available_boulders += new_rock - + available_boulders += current_vent.produce_boulder() diff --git a/code/controllers/subsystem/polling.dm b/code/controllers/subsystem/polling.dm index 8bbb37661c0..038050cfb7d 100644 --- a/code/controllers/subsystem/polling.dm +++ b/code/controllers/subsystem/polling.dm @@ -16,7 +16,38 @@ SUBSYSTEM_DEF(polling) if(running_poll.time_left() <= 0) polling_finished(running_poll) -/datum/controller/subsystem/polling/proc/poll_candidates(question, role, check_jobban, poll_time = 30 SECONDS, ignore_category = null, flash_window = TRUE, list/group = null, pic_source, role_name_text, list/custom_response_messages) +/** + * Starts a poll. + * + * Arguments + * * question: Optional, The question to ask the candidates. If null, a default question will be used. ("Do you want to play as role?") + * * role: Optional, An antag role (IE, ROLE_TRAITOR) to pass, it won't show to any candidates who don't have it in their preferences. + * * check_jobban: Optional, What jobban role / flag to check, it won't show to any candidates who have this jobban. + * * poll_time: How long the poll will last. + * * ignore_category: Optional, A poll category. If a candidate has this category in their ignore list, they won't be polled. + * * flash_window: If TRUE, the candidate's window will flash when they're polled. + * * list/group: A list of candidates to poll. + * * pic_source: Optional, An /atom or an /image to display on the poll alert. + * * role_name_text: Optional, A string to display in logging / the (default) question. If null, the role name will be used. + * * list/custom_response_messages: Optional, A list of strings to use as responses to the poll. If null, the default responses will be used. see __DEFINES/polls.dm for valid keys to use. + * * start_signed_up: If TRUE, all candidates will start signed up for the poll, making it opt-out rather than opt-in. + * + * Returns a list of all mobs who signed up for the poll. + */ +/datum/controller/subsystem/polling/proc/poll_candidates( + question, + role, + check_jobban, + poll_time = 30 SECONDS, + ignore_category = null, + flash_window = TRUE, + list/group = null, + pic_source, + role_name_text, + list/custom_response_messages, + start_signed_up = FALSE, +) + RETURN_TYPE(/list/mob) if(group.len == 0) return list() if(role && !role_name_text) @@ -49,7 +80,8 @@ SUBSYSTEM_DEF(polling) if(role && !is_eligible(candidate_mob, role, check_jobban, ignore_category)) continue - SEND_SOUND(candidate_mob, 'sound/misc/notice2.ogg') + if(start_signed_up) + new_poll.sign_up(candidate_mob, TRUE) if(flash_window) window_flash(candidate_mob.client) @@ -76,6 +108,8 @@ SUBSYSTEM_DEF(polling) poll_alert_button.poll = alert_poll poll_alert_button.set_role_overlay() poll_alert_button.update_stacks_overlay() + poll_alert_button.update_candidates_number_overlay() + poll_alert_button.update_signed_up_overlay() // Sign up inheritance and stacking @@ -111,12 +145,15 @@ SUBSYSTEM_DEF(polling) // Chat message var/act_jump = "" if(isatom(pic_source) && isobserver(candidate_mob)) - act_jump = "\[Teleport]" - var/act_signup = "\[Sign Up]" + act_jump = "\[Teleport\]" + var/act_signup = "\[[start_signed_up ? "Opt out" : "Sign Up"]\]" var/act_never = "" if(ignore_category) - act_never = "\[Never For This Round]" - to_chat(candidate_mob, span_boldnotice(examine_block("Now looking for candidates [role_name_text ? "to play as \an [role_name_text]." : "\"[question]\""] [act_jump] [act_signup] [act_never]"))) + act_never = "\[Never For This Round\]" + + if(!duplicate_message_check(alert_poll)) //Only notify people once. They'll notice if there are multiple and we don't want to spam people. + SEND_SOUND(candidate_mob, 'sound/misc/notice2.ogg') + to_chat(candidate_mob, span_boldnotice(examine_block("Now looking for candidates [role_name_text ? "to play as \an [role_name_text]." : "\"[question]\""] [act_jump] [act_signup] [act_never]"))) // Start processing it so it updates visually the timer START_PROCESSING(SSprocessing, poll_alert_button) @@ -197,13 +234,8 @@ SUBSYSTEM_DEF(polling) // Take care of updating the remaining screen alerts if a similar poll is found, or deleting them. if(length(finishing_poll.alert_buttons)) - var/polls_of_same_type_left = FALSE - for(var/datum/candidate_poll/running_poll as anything in currently_polling) - if(running_poll.poll_key == finishing_poll.poll_key && running_poll.time_left() > 0) - polls_of_same_type_left = TRUE - break for(var/atom/movable/screen/alert/poll_alert/alert as anything in finishing_poll.alert_buttons) - if(polls_of_same_type_left) + if(duplicate_message_check(finishing_poll)) alert.update_stacks_overlay() else alert.owner.clear_alert("[finishing_poll.poll_key]_poll_alert") @@ -218,6 +250,13 @@ SUBSYSTEM_DEF(polling) msg += " | Next: [DisplayTimeText(soonest_to_complete.time_left())] ([length(soonest_to_complete.signed_up)] candidates)" return ..() +///Is there a multiple of the given event type running right now? +/datum/controller/subsystem/polling/proc/duplicate_message_check(datum/candidate_poll/poll_to_check) + for(var/datum/candidate_poll/running_poll as anything in currently_polling) + if((running_poll.poll_key == poll_to_check.poll_key && running_poll != poll_to_check) && running_poll.time_left() > 0) + return TRUE + return FALSE + /datum/controller/subsystem/polling/proc/get_next_poll_to_finish() var/lowest_time_left = INFINITY var/next_poll_to_finish diff --git a/code/controllers/subsystem/processing/quirks.dm b/code/controllers/subsystem/processing/quirks.dm index d112cfe49e2..040276b5596 100644 --- a/code/controllers/subsystem/processing/quirks.dm +++ b/code/controllers/subsystem/processing/quirks.dm @@ -5,6 +5,7 @@ // Shifted to glob so they are generated at world start instead of risking players doing preference stuff before the subsystem inits GLOBAL_LIST_INIT_TYPED(quirk_blacklist, /list/datum/quirk, list( list(/datum/quirk/item_quirk/blindness, /datum/quirk/item_quirk/nearsighted), + list(/datum/quirk/item_quirk/blindness, /datum/quirk/touchy), list(/datum/quirk/jolly, /datum/quirk/depression, /datum/quirk/apathetic, /datum/quirk/hypersensitive), list(/datum/quirk/no_taste, /datum/quirk/vegetarian, /datum/quirk/deviant_tastes, /datum/quirk/gamer), list(/datum/quirk/pineapple_liker, /datum/quirk/pineapple_hater, /datum/quirk/gamer), diff --git a/code/controllers/subsystem/research.dm b/code/controllers/subsystem/research.dm index 40600aaafbb..8bba21500b5 100644 --- a/code/controllers/subsystem/research.dm +++ b/code/controllers/subsystem/research.dm @@ -62,6 +62,7 @@ SUBSYSTEM_DEF(research) /obj/item/assembly/signaler/anomaly/hallucination = MAX_CORES_HALLUCINATION, /obj/item/assembly/signaler/anomaly/bioscrambler = MAX_CORES_BIOSCRAMBLER, /obj/item/assembly/signaler/anomaly/dimensional = MAX_CORES_DIMENSIONAL, + /obj/item/assembly/signaler/anomaly/ectoplasm = MAX_CORES_ECTOPLASMIC, ) /// Lookup list for ordnance briefers. diff --git a/code/controllers/subsystem/server_maint.dm b/code/controllers/subsystem/server_maint.dm index 69a5edcca3a..f011d01ca67 100644 --- a/code/controllers/subsystem/server_maint.dm +++ b/code/controllers/subsystem/server_maint.dm @@ -19,6 +19,9 @@ SUBSYSTEM_DEF(server_maint) world.hub_password = "" //quickly! before the hubbies see us. /datum/controller/subsystem/server_maint/Initialize() + if (fexists("tmp/")) + fdel("tmp/") + if (CONFIG_GET(flag/hub)) world.update_hub_visibility(TRUE) //Keep in mind, because of how delay works adding a list here makes each list take wait * delay more time to clear @@ -82,6 +85,8 @@ SUBSYSTEM_DEF(server_maint) return /datum/controller/subsystem/server_maint/Shutdown() + if (fexists("tmp/")) + fdel("tmp/") kick_clients_in_lobby(span_boldannounce("The round came to an end with you in the lobby."), TRUE) //second parameter ensures only afk clients are kicked var/server = CONFIG_GET(string/server) for(var/thing in GLOB.clients) diff --git a/code/controllers/subsystem/timer.dm b/code/controllers/subsystem/timer.dm index 80ee843bf8b..bc894de9bee 100644 --- a/code/controllers/subsystem/timer.dm +++ b/code/controllers/subsystem/timer.dm @@ -4,8 +4,6 @@ #define BUCKET_POS(timer) (((ROUND_UP((timer.timeToRun - timer.timer_subsystem.head_offset) / world.tick_lag)+1) % BUCKET_LEN) || BUCKET_LEN) /// Gets the maximum time at which timers will be invoked from buckets, used for deferring to secondary queue #define TIMER_MAX(timer_ss) (timer_ss.head_offset + TICKS2DS(BUCKET_LEN + timer_ss.practical_offset - 1)) -/// Max float with integer precision -#define TIMER_ID_MAX (2**24) /** * # Timer Subsystem @@ -731,4 +729,3 @@ SUBSYSTEM_DEF(timer) #undef BUCKET_LEN #undef BUCKET_POS #undef TIMER_MAX -#undef TIMER_ID_MAX diff --git a/code/datums/achievements/_achievement_data.dm b/code/datums/achievements/_achievement_data.dm index 295770b89b5..8b78cf7c8f3 100644 --- a/code/datums/achievements/_achievement_data.dm +++ b/code/datums/achievements/_achievement_data.dm @@ -113,7 +113,7 @@ "name" = award.name, "desc" = award.desc, "category" = award.category, - "icon_class" = assets.icon_class_name(award.icon), + "icon_class" = assets.icon_class_name("achievement-[award.icon_state]"), "value" = data[achievement_type], ) award_data += award.get_ui_data(user.ckey) diff --git a/code/datums/achievements/_awards.dm b/code/datums/achievements/_awards.dm index 23ab5e81001..d99659ea780 100644 --- a/code/datums/achievements/_awards.dm +++ b/code/datums/achievements/_awards.dm @@ -2,8 +2,10 @@ ///Name of the achievement, If null it won't show up in the achievement browser. (Handy for inheritance trees) var/name var/desc = "You did it." - ///The icon state for this award. The icon file is found in ui_icons/achievements. - var/icon = "default" + ///The dmi icon file that holds the award's icon state. + var/icon = ACHIEVEMENTS_SET + ///The icon state for this award. + var/icon_state = "default" var/category = "Normal" @@ -80,7 +82,7 @@ ///Achievements are one-off awards for usually doing cool things. /datum/award/achievement desc = "Achievement for epic people" - icon = "" // This should warn contributors that do not declare an icon when contributing new achievements. + icon_state = "" // This should warn contributors that do not declare an icon when contributing new achievements. ///How many players have earned this achievement var/times_achieved = 0 @@ -171,7 +173,7 @@ /datum/award/score/achievements_score name = "Achievements Unlocked" desc = "Don't worry, metagaming is all that matters." - icon = "elephant" //Obey the reference + icon_state = "elephant" //Obey the reference database_id = ACHIEVEMENTS_SCORE /datum/award/score/achievements_score/get_ui_data(key) diff --git a/code/datums/achievements/boss_achievements.dm b/code/datums/achievements/boss_achievements.dm index a378b703e46..c02286b8f7a 100644 --- a/code/datums/achievements/boss_achievements.dm +++ b/code/datums/achievements/boss_achievements.dm @@ -5,119 +5,119 @@ name = "Tendril Exterminator" desc = "Watch your step" database_id = BOSS_MEDAL_TENDRIL - icon = "tendril" + icon_state = "tendril" /datum/award/achievement/boss/boss_killer name = "Boss Killer" desc = "You've come a long ways from asking how to switch hands." database_id = "Boss Killer" - icon = "firstboss" + icon_state = "firstboss" /datum/award/achievement/boss/blood_miner_kill name = "Blood-Drunk Miner Killer" desc = "I guess he couldn't handle his drink that well." database_id = BOSS_MEDAL_MINER - icon = "miner" + icon_state = "miner" /datum/award/achievement/boss/demonic_miner_kill name = "Demonic-Frost Miner Killer" desc = "Definitely harder than the Blood-Drunk Miner." database_id = BOSS_MEDAL_FROSTMINER - icon = "frostminer" + icon_state = "frostminer" /datum/award/achievement/boss/bubblegum_kill name = "Bubblegum Killer" desc = "I guess he wasn't made of candy after all" database_id = BOSS_MEDAL_BUBBLEGUM - icon = "bbgum" + icon_state = "bbgum" /datum/award/achievement/boss/colossus_kill name = "Colossus Killer" desc = "The bigger they are... the better the loot" database_id = BOSS_MEDAL_COLOSSUS - icon = "colossus" + icon_state = "colossus" /datum/award/achievement/boss/drake_kill name = "Drake Killer" desc = "Now I can wear Rune Platebodies!" database_id = BOSS_MEDAL_DRAKE - icon = "drake" + icon_state = "drake" /datum/award/achievement/boss/hierophant_kill name = "Hierophant Killer" desc = "Hierophant, but not triumphant." database_id = BOSS_MEDAL_HIEROPHANT - icon = "hierophant" + icon_state = "hierophant" /datum/award/achievement/boss/legion_kill name = "Legion Killer" desc = "We were many..now we are none." database_id = BOSS_MEDAL_LEGION - icon = "legion" + icon_state = "legion" /datum/award/achievement/boss/wendigo_kill name = "Wendigo Killer" desc = "You've now ruined years of mythical storytelling." database_id = BOSS_MEDAL_WENDIGO - icon = "wendigo" + icon_state = "wendigo" /datum/award/achievement/boss/blood_miner_crusher name = "Blood-Drunk Miner Crusher" desc = "I guess he couldn't handle his drink that well." database_id = BOSS_MEDAL_MINER_CRUSHER - icon = "miner" + icon_state = "miner" /datum/award/achievement/boss/demonic_miner_crusher name = "Demonic-Frost Miner Crusher" desc = "Definitely harder than the Blood-Drunk Miner." database_id = BOSS_MEDAL_FROSTMINER_CRUSHER - icon = "frostminer" + icon_state = "frostminer" /datum/award/achievement/boss/bubblegum_crusher name = "Bubblegum Crusher" desc = "I guess he wasn't made of candy after all" database_id = BOSS_MEDAL_BUBBLEGUM_CRUSHER - icon = "bbgum" + icon_state = "bbgum" /datum/award/achievement/boss/colossus_crusher name = "Colossus Crusher" desc = "The bigger they are... the better the loot" database_id = BOSS_MEDAL_COLOSSUS_CRUSHER - icon = "colossus" + icon_state = "colossus" /datum/award/achievement/boss/drake_crusher name = "Drake Crusher" desc = "Now I can wear Rune Platebodies!" database_id = BOSS_MEDAL_DRAKE_CRUSHER - icon = "drake" + icon_state = "drake" /datum/award/achievement/boss/hierophant_crusher name = "Hierophant Crusher" desc = "Hierophant, but not triumphant." database_id = BOSS_MEDAL_HIEROPHANT_CRUSHER - icon = "hierophant" + icon_state = "hierophant" /datum/award/achievement/boss/legion_crusher name = "Legion Crusher" desc = "We were many... now we are none." database_id = BOSS_MEDAL_LEGION_CRUSHER - icon = "legion" + icon_state = "legion" /datum/award/achievement/boss/wendigo_crusher name = "Wendigo Crusher" desc = "You've now ruined years of mythical storytelling." database_id = BOSS_MEDAL_WENDIGO_CRUSHER - icon = "wendigo" + icon_state = "wendigo" //should be removed soon /datum/award/achievement/boss/king_goat_kill name = "King Goat Killer" desc = "The king is dead, long live the king!" database_id = BOSS_MEDAL_KINGGOAT - icon = "goatboss" + icon_state = "goatboss" /datum/award/achievement/boss/king_goat_crusher name = "King Goat Crusher" desc = "The king is dead, long live the king!" database_id = BOSS_MEDAL_KINGGOAT_CRUSHER - icon = "goatboss" + icon_state = "goatboss" diff --git a/code/datums/achievements/job_achievements.dm b/code/datums/achievements/job_achievements.dm index 6aafbee8e68..bd37de7c0e1 100644 --- a/code/datums/achievements/job_achievements.dm +++ b/code/datums/achievements/job_achievements.dm @@ -8,7 +8,7 @@ name = "All Within Theoretical Limits" desc = "I never thought I'd see a resonance cascade, let alone prevent one..." database_id = MEDAL_THEORETICAL_LIMITS - icon = "theoreticallimits" + icon_state = "theoreticallimits" //medical @@ -16,13 +16,13 @@ name = "Mister Sandman" desc = "Mechanically speaking, there's no real benefit to being unconscious during surgery. Weird how insistent this doctor is about using the N2O anyway though, huh?" database_id = MEDAL_SANDMAN - icon = "basemisc" + icon_state = "basemisc" /datum/award/achievement/jobs/helbitaljanken name = "Helbitaljanken" desc = "You janked hard" database_id = MEDAL_HELBITALJANKEN - icon = "helbital" + icon_state = "helbital" //mining @@ -30,7 +30,7 @@ name = "Frenching" desc = "Just a taste, for science!" database_id = MEDAL_FRENCHING - icon = "frenchingthebubble" + icon_state = "frenchingthebubble" //science @@ -38,13 +38,13 @@ name = "Feat of Strength" desc = "If the rod is immovable, is it passing you or are you passing it?" database_id = MEDAL_RODSUPLEX - icon = "featofstrength" + icon_state = "featofstrength" /datum/award/achievement/jobs/snail name = "KKKiiilll mmmeee" desc = "You were a little too ambitious, but hey, I guess you're still alive?" database_id = MEDAL_SNAIL - icon = "snail" + icon_state = "snail" //all of service! hip hip! @@ -52,18 +52,18 @@ name = "Centcom Grade: Shitty Service" desc = "Well, you at least tried. How about trying harder?" database_id = MEDAL_BAD_SERVICE - icon = "service_bad" + icon_state = "service_bad" /datum/award/achievement/jobs/service_okay name = "Centcom Grade: Acceptable Service" desc = "Well, it'll do! You and your department did just fine." database_id = MEDAL_OKAY_SERVICE - icon = "service_okay" + icon_state = "service_okay" /datum/award/achievement/jobs/service_good name = "Centcom Grade: Exemplary Service" desc = "Centcom is very impressed with your department!" database_id = MEDAL_GOOD_SERVICE - icon = "service_good" + icon_state = "service_good" //civilian achievies! while not recognized by the code, it is recognized by our hearts diff --git a/code/datums/achievements/mafia_achievements.dm b/code/datums/achievements/mafia_achievements.dm index da70fb11e87..31462f7a0ce 100644 --- a/code/datums/achievements/mafia_achievements.dm +++ b/code/datums/achievements/mafia_achievements.dm @@ -7,103 +7,103 @@ name = "Assistant Victory" desc = "If you got killed instead of someone more important, you just flexed the true strength of your \"\"\"\"role\"\"\"\"." database_id = MAFIA_MEDAL_ASSISTANT - icon = "town" + icon_state = "town" /datum/award/achievement/mafia/detective name = "Detective Victory" desc = "If you did this with a Medical Doctor in the game, i'm not really that impressed." database_id = MAFIA_MEDAL_DETECTIVE - icon = "town" + icon_state = "town" /datum/award/achievement/mafia/psychologist name = "Psychologist Victory" desc = "You learned how to not reveal someone random night one! Or... maybe you're just a lucky bastard." database_id = MAFIA_MEDAL_PSYCHOLOGIST - icon = "town" + icon_state = "town" /datum/award/achievement/mafia/chaplain name = "Chaplain Victory" desc = "Useless... until the one night the thoughtfeeder confidently claims themselves as detective. Mafia's true bullshit detector." database_id = MAFIA_MEDAL_CHAPLAIN - icon = "town" + icon_state = "town" /datum/award/achievement/mafia/md name = "Medical Doctor Victory" desc = "Congratulations on learning how to not talk!" database_id = MAFIA_MEDAL_MD - icon = "town" + icon_state = "town" /datum/award/achievement/mafia/officer name = "Security Officer Victory" desc = "Don't worry, you can win this if you're dead! You... did use your ability to become dead, right?" database_id = MAFIA_MEDAL_OFFICER - icon = "town" + icon_state = "town" /datum/award/achievement/mafia/lawyer name = "Lawyer Victory" desc = "Oh don't mind me, i'm just the worst rol- Oops, I just instantly ended the game." database_id = MAFIA_MEDAL_LAWYER - icon = "town" + icon_state = "town" /datum/award/achievement/mafia/hop name = "Head of Personnel Victory" desc = "King of Assistants, waster of a single mafia's night, thrower of games." database_id = MAFIA_MEDAL_HOP - icon = "town" + icon_state = "town" /datum/award/achievement/mafia/warden name = "Warden Victory" desc = "Make changelings think you're detective, go on lockdown, actual detective investigates you and dies. Cha cha real smooth!" database_id = MAFIA_MEDAL_WARDEN - icon = "town" + icon_state = "town" /datum/award/achievement/mafia/hos name = "Head of Security Victory" desc = "Certified not shitcurity." database_id = MAFIA_MEDAL_HOS - icon = "town" + icon_state = "town" /datum/award/achievement/mafia/changeling name = "Changeling Victory" desc = "I think the changelings are metacomming." database_id = MAFIA_MEDAL_CHANGELING - icon = "mafia" + icon_state = "mafia" /datum/award/achievement/mafia/thoughtfeeder name = "Thoughtfeeder Victory" desc = "Clown's best friend. And Obsessed. And fugitive? Whose side are you on?!" database_id = MAFIA_MEDAL_THOUGHTFEEDER - icon = "mafia" + icon_state = "mafia" /datum/award/achievement/mafia/traitor name = "Traitor Victory" desc = "Guys, we still have two more changelings to ki-!! TRAITOR VICTORY !!" database_id = MAFIA_MEDAL_TRAITOR - icon = "neutral" + icon_state = "neutral" /datum/award/achievement/mafia/nightmare name = "Nightmare Victory" desc = "DID YOUR LIGHT FLICKER?!" database_id = MAFIA_MEDAL_NIGHTMARE - icon = "neutral" + icon_state = "neutral" /datum/award/achievement/mafia/fugitive name = "Fugitive Victory" desc = "I'm just the description on an achievement, but if you end up having to choose between town and changelings, go changelings." database_id = MAFIA_MEDAL_FUGITIVE - icon = "neutral" + icon_state = "neutral" /datum/award/achievement/mafia/obsessed name = "Obsessed Victory" desc = "You got your target lynched, so instead of being spiteful and annoying, you're just smug and annoying." database_id = MAFIA_MEDAL_OBSESSED - icon = "neutral" + icon_state = "neutral" /datum/award/achievement/mafia/clown name = "Clown Victory" desc = "Did you know this works on traitors, despite their immunity? If you hit the jackpot and manage to kill one, they'll salt into the next dimension. Clown tips!" database_id = MAFIA_MEDAL_CLOWN - icon = "neutral" + icon_state = "neutral" ///ALL THE ACHIEVEMENTS FOR MISC MAFIA ODDITIES/// @@ -111,4 +111,4 @@ name = "Universally Hated" desc = "Managed to get more than 12 votes when put up on trial, jesus christ." database_id = MAFIA_MEDAL_HATED - icon = "hated" + icon_state = "hated" diff --git a/code/datums/achievements/misc_achievements.dm b/code/datums/achievements/misc_achievements.dm index e452b860f00..e92fc3bc56b 100644 --- a/code/datums/achievements/misc_achievements.dm +++ b/code/datums/achievements/misc_achievements.dm @@ -1,54 +1,54 @@ /datum/award/achievement/misc category = "Misc" - icon = "basemisc" //for those achievements that still need an actual icon, later. + icon_state = "basemisc" //for those achievements that still need an actual icon, later. /datum/award/achievement/misc/meteor_examine name = "Your Life Before Your Eyes" desc = "Take a close look at hurtling space debris" database_id = MEDAL_METEOR - icon = "meteors" + icon_state = "meteors" /datum/award/achievement/misc/pulse name = "Jackpot" desc = "Win a pulse rifle from an arcade machine" database_id = MEDAL_PULSE - icon = "jackpot" + icon_state = "jackpot" /datum/award/achievement/misc/time_waste name = "Time waster" desc = "Speak no evil, hear no evil, see just errors" database_id = MEDAL_TIMEWASTE - icon = "timewaste" + icon_state = "timewaste" /datum/award/achievement/misc/round_and_full name = "Round and Full" desc = "Well at least you aren't down the river, I hear they eat people there." database_id = MEDAL_CLOWNCARKING - icon = "clownking" + icon_state = "clownking" /datum/award/achievement/misc/the_best_driver name = "The Best Driver" desc = "100 honks later" database_id = MEDAL_THANKSALOT - icon = "clownthanks" + icon_state = "clownthanks" /datum/award/achievement/misc/getting_an_upgrade name = "Getting an upgrade" desc = "Make your first unique material item!" database_id = MEDAL_MATERIALCRAFT - icon = "upgrade" + icon_state = "upgrade" /datum/award/achievement/misc/rocket_holdup name = "Disk, Please!" desc = "Is the man currently pointing a loaded rocket launcher at your head point blank really dumb enough to pull the trigger? Do you really want to find out?" database_id = MEDAL_DISKPLEASE - icon = "rocket_holdup" + icon_state = "rocket_holdup" /datum/award/achievement/misc/gamer name = "My Watchlist Status is Not Important" desc = "You may be under the impression that violent video games are a harmless pastime, but the security and medical personnel swarming your location with batons and knockout gas look like they disagree." database_id = MEDAL_GAMER - icon = "live_sec_reaction" + icon_state = "live_sec_reaction" /datum/award/achievement/misc/vendor_squish name = "I Was a Teenage Anarchist" @@ -69,161 +69,161 @@ name = "One Lean, Mean, Cleaning Machine" desc = "How does it feel to know that your workplace values a mop bucket on wheels more than you?" // i can do better than this give me time database_id = MEDAL_CLEANBOSS - icon = "cleanboss" + icon_state = "cleanboss" /datum/award/achievement/misc/rule8 name = "Rule 8" desc = "Call an admin this is ILLEGAL!!" database_id = MEDAL_RULE8 - icon = "rule8" + icon_state = "rule8" /datum/award/achievement/misc/speed_round name = "Long shift" desc = "Well, that didn't take long." database_id = MEDAL_LONGSHIFT - icon = "longshift" + icon_state = "longshift" /datum/award/achievement/misc/lookoutsir name = "Look Out, Sir!" desc = "Either awarded for making the ultimate sacrifice for your comrades, or a really dumb attempt at grenade jumping." database_id = MEDAL_LOOKOUTSIR - icon = "martyr" // purple heart on an explosive danger warning sign (well, sort of) + icon_state = "martyr" // purple heart on an explosive danger warning sign (well, sort of) /datum/award/achievement/misc/gottem name = "HA, GOTTEM" desc = "Made you look!" database_id = MEDAL_GOTTEM - icon = "gottem" + icon_state = "gottem" /datum/award/achievement/misc/ascension name = "Ascension" desc = "Caedite eos. Novit enim Dominus qui sunt eius." database_id = MEDAL_ASCENSION - icon = "ascension" + icon_state = "ascension" /datum/award/achievement/misc/ash_ascension name = "Nightwatcher's Eyes" desc = "You've risen above the flames, became one with the ashes. You've been reborn as one with the Nightwatcher." database_id = MEDAL_ASH_ASCENSION - icon = "ashascend" + icon_state = "ashascend" /datum/award/achievement/misc/flesh_ascension name = "Vortex of Arms" desc = "You've became something more, something greater. A piece of the emperor resides within you, and you within him." database_id = MEDAL_FLESH_ASCENSION - icon = "fleshascend" + icon_state = "fleshascend" /datum/award/achievement/misc/rust_ascension name = "Hills of Rust" desc = "You've summoned a piece of the Hill of rust, and so the Hills welcome you." database_id = MEDAL_RUST_ASCENSION - icon = "rustascend" + icon_state = "rustascend" /datum/award/achievement/misc/void_ascension name = "All that perish" desc = "Place of a different being, different time. Everything ends there... but maybe it is just the beginning?" database_id = MEDAL_VOID_ASCENSION - icon = "voidascend" + icon_state = "voidascend" /datum/award/achievement/misc/blade_ascension name = "Silver and Steel" desc = "You've become the master of all duellists - the paragon of blades." database_id = MEDAL_BLADE_ASCENSION - icon = "bladeascend" + icon_state = "bladeascend" /datum/award/achievement/misc/cosmic_ascension name = "It arrived" desc = "You managed to teleport an entity on the station that really shouldn't be there." database_id = MEDAL_COSMOS_ASCENSION - icon = "cosmicascend" + icon_state = "cosmicascend" /datum/award/achievement/misc/lock_ascension name = "Secrets of the Locked Labyrinth" desc = "You managed to open a gate into the mansus." database_id = MEDAL_LOCK_ASCENSION - icon = "lockascend" + icon_state = "lockascend" /datum/award/achievement/misc/moon_ascension name = "The Last Act" desc = "You managed to become the ringleader and slay the lie." database_id = MEDAL_MOON_ASCENSION - icon = "moonascend" + icon_state = "moonascend" /datum/award/achievement/misc/grand_ritual_finale name = "Archmage" desc = "Made a big impression on the station with your phenomenal cosmic power." database_id = MEDAL_ARCHMAGE - icon = "archmage" + icon_state = "archmage" /datum/award/achievement/misc/toolbox_soul name = "SOUL'd Out" desc = "My eternal soul was destroyed to make a toolbox look funny and all I got was this achievement..." database_id = MEDAL_TOOLBOX_SOUL - icon = "toolbox_soul" + icon_state = "toolbox_soul" /datum/award/achievement/misc/hot_damn name = "Hot Damn!" desc = "Sometimes you need to make some noise to make a point." database_id = MEDAL_HOT_DAMN - icon = "hotdamn" + icon_state = "hotdamn" /datum/award/achievement/misc/cayenne_disk name = "Very Important Piscis" desc = "You can rest well now." database_id = MEDAL_CAYENNE_DISK - icon = "cayenne_disk" + icon_state = "cayenne_disk" /datum/award/achievement/misc/tram_surfer name = "Tram Surfer" desc = "Lights out, guerilla radio!" database_id = MEDAL_TRAM_SURFER - icon = "tram_surfer" + icon_state = "tram_surfer" /datum/award/achievement/misc/cult_shuttle_omfg name = "WHAT JUST HAPPENED" desc = "As a blood cultist, be part of a team that summons 3 shuttle curses within 10 seconds. Imagine cleaning up after them, g r o s s!" database_id = MEDAL_CULT_SHUTTLE_OMFG - icon = "cult_shuttle_omfg" + icon_state = "cult_shuttle_omfg" /datum/award/achievement/misc/clickbait name = "Clickbait" desc = "Where's my free smartphone?!?" database_id = MEDAL_CLICKBAIT - icon = "bait" + icon_state = "bait" /datum/award/achievement/misc/narsupreme name = "If Nar'Sie is so good, why isn't there a..." desc = "Even interdimensional space deitys need a friend." database_id = MEDAL_NARSUPREME - icon = "narsupreme" + icon_state = "narsupreme" /datum/award/achievement/misc/springlock name = "The Man Inside the MODsuit" desc = "Ignore the warning label on a springlock MODsuit." database_id = MEDAL_SPRINGLOCK - icon = "springlock" + icon_state = "springlock" /datum/award/achievement/misc/healthy name = "The Picture of Health" desc = "Don't be such a baby, it's just a heart attack. You've bounced back from worse!" database_id = MEDAL_HEALTHY - icon = "picofhealth" + icon_state = "picofhealth" /datum/award/achievement/misc/gods_wrath name = "God's Wrath" desc = "Did you think you could get away with defiling the word of God?" database_id = MEDAL_GODS_WRATH - icon = "godswrath" + icon_state = "godswrath" /datum/award/achievement/misc/earthquake_victim name = "A Nasty Fall" desc = "...And the earth opened its mouth and swallowed them and their station- all the HOP's men and all their possessions." database_id = MEDAL_EARTHQUAKE_VICTIM - icon = "earthquake" + icon_state = "earthquake" /datum/award/achievement/misc/debt_extinguished name = "Outdebted" desc = "I've paid my dues, shift after shift... I've done my sentence but commited no griff..." database_id = MEDAL_DEBT_EXTINGUISHED - icon = "outdebted" + icon_state = "outdebted" diff --git a/code/datums/achievements/skill_achievements.dm b/code/datums/achievements/skill_achievements.dm index 6384b1b3db4..7e2f3f1a247 100644 --- a/code/datums/achievements/skill_achievements.dm +++ b/code/datums/achievements/skill_achievements.dm @@ -5,10 +5,10 @@ name = "Legendary miner" desc = "No mere rock can stop me!" database_id = MEDAL_LEGENDARY_MINER - icon = "mining" + icon_state = "mining" /datum/award/achievement/skill/legendary_fisher name = "Legendary fisher" desc = "Give a spaceman a fish and you feed him for a while; teach a spaceman to fish and you feed him until the shuttle arrives." database_id = MEDAL_LEGENDARY_FISHER - icon = "fishing_hat" + icon_state = "fishing_hat" diff --git a/code/datums/actions/action.dm b/code/datums/actions/action.dm index 75c9cf59aeb..39e69ba9fa8 100644 --- a/code/datums/actions/action.dm +++ b/code/datums/actions/action.dm @@ -46,6 +46,10 @@ var/overlay_icon = 'icons/mob/actions/backgrounds.dmi' /// This is the icon state for any FOREGROUND overlay icons on the button (such as borders) var/overlay_icon_state + + /// full key we are bound to + var/full_key + /// Toggles whether this action is usable or not var/action_disabled = FALSE @@ -110,6 +114,7 @@ RegisterSignals(owner, list(SIGNAL_ADDTRAIT(TRAIT_MAGICALLY_PHASED), SIGNAL_REMOVETRAIT(TRAIT_MAGICALLY_PHASED)), PROC_REF(update_status_on_signal)) if(owner_has_control) + RegisterSignal(grant_to, COMSIG_MOB_KEYDOWN, PROC_REF(keydown), override = TRUE) GiveAction(grant_to) /// Remove the passed mob from being owner of our action @@ -122,6 +127,7 @@ HideFrom(hud.mymob) LAZYREMOVE(remove_from?.actions, src) // We aren't always properly inserted into the viewers list, gotta make sure that action's cleared viewers = list() + UnregisterSignal(remove_from, COMSIG_MOB_KEYDOWN) if(isnull(owner)) return @@ -312,6 +318,7 @@ * force - whether an update is forced regardless of existing status */ /datum/action/proc/update_button_status(atom/movable/screen/movable/action_button/current_button, force = FALSE) + current_button.update_keybind_maptext(full_key) if(IsAvailable()) current_button.color = rgb(255,255,255,255) else @@ -411,3 +418,14 @@ /// Checks if our action is actively selected. Used for selecting icons primarily. /datum/action/proc/is_action_active(atom/movable/screen/movable/action_button/current_button) return FALSE + +/datum/action/proc/keydown(mob/source, key, client/client, full_key) + SIGNAL_HANDLER + if(isnull(full_key) || full_key != src.full_key) + return + if(istype(source)) + if(source.next_click > world.time) + return + else + source.next_click = world.time + CLICK_CD_RANGE + INVOKE_ASYNC(src, PROC_REF(Trigger)) diff --git a/code/datums/actions/mobs/assume_form.dm b/code/datums/actions/mobs/assume_form.dm index a335d0e745d..03a1a38d3c8 100644 --- a/code/datums/actions/mobs/assume_form.dm +++ b/code/datums/actions/mobs/assume_form.dm @@ -64,7 +64,7 @@ // important: do this at the very end because we might have SIGNAL_ADDTRAIT for this on the mob that's dependent on the above logic SEND_SIGNAL(owner, COMSIG_ACTION_DISGUISED_APPEARANCE, target_atom) - ADD_TRAIT(owner, TRAIT_DISGUISED, REF(src)) + ADD_TRAIT(owner, TRAIT_DISGUISED, ACTION_TRAIT) /// Resets the appearances of the mob to the default. /datum/action/cooldown/mob_cooldown/assume_form/proc/reset_appearances() @@ -85,4 +85,4 @@ owner.cut_overlays() // important: do this very end because we might have SIGNAL_REMOVETRAIT for this on the mob that's dependent on the above logic - REMOVE_TRAIT(owner, TRAIT_DISGUISED, REF(src)) + REMOVE_TRAIT(owner, TRAIT_DISGUISED, ACTION_TRAIT) diff --git a/code/datums/actions/mobs/lava_swoop.dm b/code/datums/actions/mobs/lava_swoop.dm index b86a710fbf2..a6c8282fd10 100644 --- a/code/datums/actions/mobs/lava_swoop.dm +++ b/code/datums/actions/mobs/lava_swoop.dm @@ -14,11 +14,11 @@ /datum/action/cooldown/mob_cooldown/lava_swoop/Grant(mob/M) . = ..() - M.add_traits(list(TRAIT_LAVA_IMMUNE, TRAIT_NOFIRE), REF(src)) + M.add_traits(list(TRAIT_LAVA_IMMUNE, TRAIT_NOFIRE), ACTION_TRAIT) /datum/action/cooldown/mob_cooldown/lava_swoop/Remove(mob/M) . = ..() - M.remove_traits(list(TRAIT_LAVA_IMMUNE, TRAIT_NOFIRE), REF(src)) + M.remove_traits(list(TRAIT_LAVA_IMMUNE, TRAIT_NOFIRE), ACTION_TRAIT) /datum/action/cooldown/mob_cooldown/lava_swoop/Activate(atom/target_atom) disable_cooldown_actions() diff --git a/code/datums/actions/mobs/sign_language.dm b/code/datums/actions/mobs/sign_language.dm index da375fd1f85..20c1157f326 100644 --- a/code/datums/actions/mobs/sign_language.dm +++ b/code/datums/actions/mobs/sign_language.dm @@ -42,17 +42,17 @@ SIGNAL_ADDTRAIT(TRAIT_MUTE), SIGNAL_REMOVETRAIT(TRAIT_MUTE) )) - REMOVE_TRAIT(grant_to, TRAIT_SIGN_LANG, TRAIT_GENERIC) + REMOVE_TRAIT(grant_to, TRAIT_SIGN_LANG, ACTION_TRAIT) /datum/action/innate/sign_language/Activate() active = TRUE - ADD_TRAIT(owner, TRAIT_SIGN_LANG, TRAIT_GENERIC) + ADD_TRAIT(owner, TRAIT_SIGN_LANG, ACTION_TRAIT) to_chat(owner, span_green("You are now communicating with sign language.")) build_all_button_icons(UPDATE_BUTTON_BACKGROUND) /datum/action/innate/sign_language/Deactivate() active = FALSE - REMOVE_TRAIT(owner, TRAIT_SIGN_LANG, TRAIT_GENERIC) + REMOVE_TRAIT(owner, TRAIT_SIGN_LANG, ACTION_TRAIT) to_chat(owner, span_green("You have stopped using sign language.")) build_all_button_icons(UPDATE_BUTTON_BACKGROUND) diff --git a/code/datums/actions/mobs/sneak.dm b/code/datums/actions/mobs/sneak.dm index 738bb7b70cf..521181fa19b 100644 --- a/code/datums/actions/mobs/sneak.dm +++ b/code/datums/actions/mobs/sneak.dm @@ -16,7 +16,7 @@ /datum/action/cooldown/mob_cooldown/sneak/Remove(mob/living/remove_from) if(HAS_TRAIT(remove_from, TRAIT_SNEAK)) remove_from.alpha = initial(remove_from.alpha) - REMOVE_TRAIT(remove_from, TRAIT_SNEAK, name) + REMOVE_TRAIT(remove_from, TRAIT_SNEAK, ACTION_TRAIT) return ..() @@ -26,11 +26,11 @@ // Otherwise we get permanent invisbility exploits. animate(owner, alpha = initial(owner.alpha), time = animation_time) owner.balloon_alert(owner, "you reveal yourself") - REMOVE_TRAIT(owner, TRAIT_SNEAK, name) + REMOVE_TRAIT(owner, TRAIT_SNEAK, ACTION_TRAIT) else animate(owner, alpha = sneak_alpha, time = animation_time) owner.balloon_alert(owner, "you blend into the environment") - ADD_TRAIT(owner, TRAIT_SNEAK, name) + ADD_TRAIT(owner, TRAIT_SNEAK, ACTION_TRAIT) return TRUE diff --git a/code/datums/ai/hunting_behavior/hunting_mouse.dm b/code/datums/ai/hunting_behavior/hunting_mouse.dm index d4160f826dd..d0e7161fd2d 100644 --- a/code/datums/ai/hunting_behavior/hunting_mouse.dm +++ b/code/datums/ai/hunting_behavior/hunting_mouse.dm @@ -11,7 +11,7 @@ finding_behavior = /datum/ai_behavior/find_hunt_target/mouse_cable hunt_targets = list(/obj/structure/cable) hunt_range = 0 // Only look below us - hunt_chance = 5 + hunt_chance = 1 // When looking for a cable, we can only bite things we can reach. /datum/ai_behavior/find_hunt_target/mouse_cable diff --git a/code/datums/ai/objects/vending_machines/vending_machine_controller.dm b/code/datums/ai/objects/vending_machines/vending_machine_controller.dm index cd779b7d691..50523db946c 100644 --- a/code/datums/ai/objects/vending_machines/vending_machine_controller.dm +++ b/code/datums/ai/objects/vending_machines/vending_machine_controller.dm @@ -14,7 +14,7 @@ return AI_CONTROLLER_INCOMPATIBLE var/obj/machinery/vending/vendor_pawn = new_pawn vendor_pawn.tiltable = FALSE //Not manually tiltable by hitting it anymore. We are now aggressively doing it ourselves. - vendor_pawn.AddElement(/datum/element/waddling) + vendor_pawn.AddElementTrait(TRAIT_WADDLING, REF(src), /datum/element/waddling) vendor_pawn.AddElement(/datum/element/footstep, FOOTSTEP_OBJ_MACHINE, 1, -6, sound_vary = TRUE) vendor_pawn.squish_damage = 15 return ..() //Run parent at end @@ -22,7 +22,7 @@ /datum/ai_controller/vending_machine/UnpossessPawn(destroy) var/obj/machinery/vending/vendor_pawn = pawn vendor_pawn.tiltable = TRUE - vendor_pawn.RemoveElement(/datum/element/waddling) + REMOVE_TRAIT(vendor_pawn, TRAIT_WADDLING, REF(src)) vendor_pawn.squish_damage = initial(vendor_pawn.squish_damage) RemoveElement(/datum/element/footstep, FOOTSTEP_OBJ_MACHINE, 1, -6, sound_vary = TRUE) return ..() //Run parent at end diff --git a/code/datums/components/chasm.dm b/code/datums/components/chasm.dm index 9829dfc3f52..b4406857ac1 100644 --- a/code/datums/components/chasm.dm +++ b/code/datums/components/chasm.dm @@ -109,6 +109,9 @@ return CHASM_NOT_DROPPING if(dropped_thing.throwing || (dropped_thing.movement_type & MOVETYPES_NOT_TOUCHING_GROUND)) return CHASM_REGISTER_SIGNALS + for(var/atom/thing_to_check as anything in parent) + if(HAS_TRAIT(thing_to_check, TRAIT_CHASM_STOPPER)) + return CHASM_NOT_DROPPING //Flies right over the chasm if(ismob(dropped_thing)) diff --git a/code/datums/components/jetpack.dm b/code/datums/components/jetpack.dm index 3e0fd28ed80..437660abc82 100644 --- a/code/datums/components/jetpack.dm +++ b/code/datums/components/jetpack.dm @@ -116,7 +116,7 @@ return if(user.throwing)//You don't must use jet if you thrown return - if(length(user.client.keys_held & user.client.movement_keys))//You use jet when press keys. yes. + if(user.client.intended_direction)//You use jet when press keys. yes. thrust() /datum/component/jetpack/proc/pre_move_react(mob/user) diff --git a/code/datums/components/marionette.dm b/code/datums/components/marionette.dm new file mode 100644 index 00000000000..a2f58031768 --- /dev/null +++ b/code/datums/components/marionette.dm @@ -0,0 +1,77 @@ +/** + * Marionette component + * + * Upon being grabbed, we will align the direction of the parent with the direction of the grabber when they rotate. + * While grabbed, will also speak out whatever the original person says + */ +/datum/component/marionette + ///Reference to the mob that is grabbing us, which we hook signals to for marionette stuff. + var/mob/grabber + +/datum/component/marionette/Destroy() + if(grabber) + UnregisterSignal(grabber, list(COMSIG_MOVABLE_KEYBIND_FACE_DIR, COMSIG_MOB_SAY, COMSIG_QDELETING)) + grabber = null + return ..() + +/datum/component/marionette/RegisterWithParent() + RegisterSignal(parent, COMSIG_LIVING_TRYING_TO_PULL, PROC_REF(on_pull)) + RegisterSignal(parent, COMSIG_ATOM_NO_LONGER_PULLED, PROC_REF(on_stop_pull)) + +/datum/component/marionette/UnregisterFromParent() + UnregisterSignal(parent, list( + COMSIG_LIVING_TRYING_TO_PULL, + COMSIG_ATOM_NO_LONGER_PULLED, + )) + return ..() + +///Called when something starts pulling us, we now listen in to that thing for rotation. +/datum/component/marionette/proc/on_pull(atom/movable/source, atom/movable/puller, force) + SIGNAL_HANDLER + + if(!puller) + return + grabber = puller + RegisterSignal(grabber, COMSIG_MOVABLE_KEYBIND_FACE_DIR, PROC_REF(on_puller_turn)) + RegisterSignal(grabber, COMSIG_MOB_SAY, PROC_REF(on_puller_speech)) + RegisterSignal(grabber, COMSIG_QDELETING, PROC_REF(on_puller_qdel)) + +///Stopped pulling, we clear out signals and references. +/datum/component/marionette/proc/on_stop_pull(datum/source, atom/movable/was_pulling) + SIGNAL_HANDLER + if(grabber) + UnregisterSignal(grabber, list(COMSIG_MOVABLE_KEYBIND_FACE_DIR, COMSIG_MOB_SAY, COMSIG_QDELETING)) + grabber = null + +///Callled when the person grabbin us turns, we rotate to match their direction. +/datum/component/marionette/proc/on_puller_turn(mob/living/source, direction) + SIGNAL_HANDLER + var/atom/movable/parent_movable = parent + parent_movable.setDir(direction) + +///Called when the person grabbing us speaks, we lower their volume to 1 tile and speak what they said through us. +/datum/component/marionette/proc/on_puller_speech(datum/source, list/speech_args) + SIGNAL_HANDLER + + if(HAS_TRAIT(grabber, TRAIT_SIGN_LANG)) + return + + var/message = speech_args[SPEECH_MESSAGE] + var/list/spans = speech_args[SPEECH_SPANS] + var/language = speech_args[SPEECH_LANGUAGE] + var/saymode = speech_args[SPEECH_SAYMODE] + var/atom/movable/movable_parent = parent + movable_parent.say( + message = message, + spans = spans.Copy(), + language = language, + forced = "[source]'s marionette", + saymode = saymode, + ) + speech_args[SPEECH_RANGE] = WHISPER_RANGE + +///Called when our puller is somehow deleted, we simply clear the reference to them. +/datum/component/marionette/proc/on_puller_qdel() + SIGNAL_HANDLER + + grabber = null diff --git a/code/datums/components/material/material_container.dm b/code/datums/components/material/material_container.dm index b69ae91825e..69f67d46df3 100644 --- a/code/datums/components/material/material_container.dm +++ b/code/datums/components/material/material_container.dm @@ -275,10 +275,9 @@ var/inserted = 0 //All messages to be displayed to chat var/list/chat_msgs = list() - //differs from held_item when using TK var/active_held = user.get_active_held_item() - + //storage items to retrive items from var/static/list/storage_items if(isnull(storage_items)) storage_items = list( @@ -288,7 +287,7 @@ ) //1st iteration consumes all items that do not have contents inside - //2nd iteration consumes items who do have contents inside(but they were consumed in the 1st iteration si its empty now) + //2nd iteration consumes items who do have contents inside(but they were consumed in the 1st iteration so its empty now) for(var/i in 1 to 2) //no point inserting more items if(inserted == MATERIAL_INSERT_ITEM_NO_SPACE) @@ -311,15 +310,11 @@ //can't allow abstract, hologram items if((target_item.item_flags & ABSTRACT) || (target_item.flags_1 & HOLOGRAM_1)) continue - //untouchable, move it out the way, code copied from recycler - if(target_item.resistance_flags & INDESTRUCTIBLE) - target_item.forceMove(get_turf(parent)) - continue //user defined conditions if(SEND_SIGNAL(src, COMSIG_MATCONTAINER_PRE_USER_INSERT, target_item, user) & MATCONTAINER_BLOCK_INSERT) continue - //item is either not allowed for redemption, not in the allowed types - if((target_item.item_flags & NO_MAT_REDEMPTION) || (allowed_item_typecache && !is_type_in_typecache(target_item, allowed_item_typecache))) + //item is either indestructible, not allowed for redemption or not in the allowed types + if((target_item.resistance_flags & INDESTRUCTIBLE) || (target_item.item_flags & NO_MAT_REDEMPTION) || (allowed_item_typecache && !is_type_in_typecache(target_item, allowed_item_typecache))) if(!(mat_container_flags & MATCONTAINER_SILENT) && i == 1) //count only child items the 1st time around var/list/status_data = chat_msgs["[MATERIAL_INSERT_ITEM_FAILURE]"] || list() var/list/item_data = status_data[target_item.name] || list() @@ -327,6 +322,10 @@ status_data[target_item.name] = item_data chat_msgs["[MATERIAL_INSERT_ITEM_FAILURE]"] = status_data + if(target_item.resistance_flags & INDESTRUCTIBLE) + if(i == 1 && target_item != active_held) //move it out of any storage medium its in so it doesn't get consumed with its parent, but only if that storage medium is not our hand + target_item.forceMove(get_turf(context)) + continue //storage items usually come here but we make the exception only on the 1st iteration //this is so players can insert items from their bags into machines for convinience if(!is_type_in_list(target_item, storage_items)) diff --git a/code/datums/components/overlay_lighting.dm b/code/datums/components/overlay_lighting.dm index 180c65b2239..efff82b703a 100644 --- a/code/datums/components/overlay_lighting.dm +++ b/code/datums/components/overlay_lighting.dm @@ -78,8 +78,8 @@ return COMPONENT_INCOMPATIBLE var/atom/movable/movable_parent = parent - if(movable_parent.light_system != MOVABLE_LIGHT && movable_parent.light_system != MOVABLE_LIGHT_DIRECTIONAL && movable_parent.light_system != MOVABLE_LIGHT_BEAM) - stack_trace("[type] added to [parent], with [movable_parent.light_system] value for the light_system var. Use [MOVABLE_LIGHT], [MOVABLE_LIGHT_DIRECTIONAL] or [MOVABLE_LIGHT_BEAM] instead.") + if(movable_parent.light_system != OVERLAY_LIGHT && movable_parent.light_system != OVERLAY_LIGHT_DIRECTIONAL && movable_parent.light_system != OVERLAY_LIGHT_BEAM) + stack_trace("[type] added to [parent], with [movable_parent.light_system] value for the light_system var. Use [OVERLAY_LIGHT], [OVERLAY_LIGHT_DIRECTIONAL] or [OVERLAY_LIGHT_BEAM] instead.") return COMPONENT_INCOMPATIBLE . = ..() diff --git a/code/datums/components/rotation.dm b/code/datums/components/rotation.dm index 4bcfa8b01c9..7c55579c999 100644 --- a/code/datums/components/rotation.dm +++ b/code/datums/components/rotation.dm @@ -1,6 +1,6 @@ /datum/component/simple_rotation /// Additional stuff to do after rotation - var/datum/callback/AfterRotation + var/datum/callback/post_rotation /// Rotation flags for special behavior var/rotation_flags = NONE @@ -9,9 +9,9 @@ * * args: * * rotation_flags (optional) Bitflags that determine behavior for rotation (defined at the top of this file) - * * AfterRotation (optional) Callback proc that is used after the object is rotated (sound effects, balloon alerts, etc.) -**/ -/datum/component/simple_rotation/Initialize(rotation_flags = NONE, AfterRotation) + * * post_rotation (optional) Callback proc that is used after the object is rotated (sound effects, balloon alerts, etc.) + **/ +/datum/component/simple_rotation/Initialize(rotation_flags = NONE, post_rotation) if(!ismovable(parent)) return COMPONENT_INCOMPATIBLE @@ -19,19 +19,13 @@ source.flags_1 |= HAS_CONTEXTUAL_SCREENTIPS_1 src.rotation_flags = rotation_flags - src.AfterRotation = AfterRotation || CALLBACK(src, PROC_REF(DefaultAfterRotation)) + src.post_rotation = post_rotation || CALLBACK(src, PROC_REF(default_post_rotation)) -/datum/component/simple_rotation/proc/AddSignals() - RegisterSignal(parent, COMSIG_CLICK_ALT, PROC_REF(RotateLeft)) - RegisterSignal(parent, COMSIG_CLICK_ALT_SECONDARY, PROC_REF(RotateRight)) +/datum/component/simple_rotation/RegisterWithParent() + RegisterSignal(parent, COMSIG_CLICK_ALT, PROC_REF(rotate_left)) + RegisterSignal(parent, COMSIG_CLICK_ALT_SECONDARY, PROC_REF(rotate_right)) RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(ExamineMessage)) RegisterSignal(parent, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM, PROC_REF(on_requesting_context_from_item)) - -/datum/component/simple_rotation/proc/RemoveSignals() - UnregisterSignal(parent, list(COMSIG_CLICK_ALT, COMSIG_CLICK_ALT_SECONDARY, COMSIG_ATOM_EXAMINE, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM)) - -/datum/component/simple_rotation/RegisterWithParent() - AddSignals() return ..() /datum/component/simple_rotation/PostTransfer() @@ -41,15 +35,16 @@ return COMPONENT_NOTRANSFER /datum/component/simple_rotation/UnregisterFromParent() - RemoveSignals() + UnregisterSignal(parent, list( + COMSIG_CLICK_ALT, + COMSIG_CLICK_ALT_SECONDARY, + COMSIG_ATOM_EXAMINE, + COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM, + )) return ..() /datum/component/simple_rotation/Destroy() - AfterRotation = null - //Signals + verbs removed via UnRegister - return ..() - -/datum/component/simple_rotation/ClearFromParent() + post_rotation = null return ..() /datum/component/simple_rotation/proc/ExamineMessage(datum/source, mob/user, list/examine_list) @@ -57,15 +52,15 @@ if(rotation_flags & ROTATION_REQUIRE_WRENCH) examine_list += span_notice("This requires a wrench to be rotated.") -/datum/component/simple_rotation/proc/RotateRight(datum/source, mob/user) +/datum/component/simple_rotation/proc/rotate_right(datum/source, mob/user) SIGNAL_HANDLER - Rotate(user, ROTATION_CLOCKWISE) + rotate(user, ROTATION_CLOCKWISE) -/datum/component/simple_rotation/proc/RotateLeft(datum/source, mob/user) +/datum/component/simple_rotation/proc/rotate_left(datum/source, mob/user) SIGNAL_HANDLER - Rotate(user, ROTATION_COUNTERCLOCKWISE) + rotate(user, ROTATION_COUNTERCLOCKWISE) -/datum/component/simple_rotation/proc/Rotate(mob/user, degrees) +/datum/component/simple_rotation/proc/rotate(mob/user, degrees) if(QDELETED(user)) CRASH("[src] is being rotated [user ? "with a qdeleting" : "without a"] user") if(!istype(user)) @@ -73,7 +68,7 @@ if(!isnum(degrees)) CRASH("[src] is being rotated without providing the amount of degrees needed") - if(!CanBeRotated(user, degrees) || !CanUserRotate(user, degrees)) + if(!can_be_rotated(user, degrees) || !can_user_rotate(user, degrees)) return var/obj/rotated_obj = parent @@ -81,16 +76,16 @@ if(rotation_flags & ROTATION_REQUIRE_WRENCH) playsound(rotated_obj, 'sound/items/ratchet.ogg', 50, TRUE) - AfterRotation.Invoke(user, degrees) + post_rotation.Invoke(user, degrees) -/datum/component/simple_rotation/proc/CanUserRotate(mob/user, degrees) +/datum/component/simple_rotation/proc/can_user_rotate(mob/user, degrees) if(isliving(user) && user.can_perform_action(parent, NEED_DEXTERITY)) return TRUE if((rotation_flags & ROTATION_GHOSTS_ALLOWED) && isobserver(user) && CONFIG_GET(flag/ghost_interaction)) return TRUE return FALSE -/datum/component/simple_rotation/proc/CanBeRotated(mob/user, degrees, silent=FALSE) +/datum/component/simple_rotation/proc/can_be_rotated(mob/user, degrees, silent=FALSE) var/obj/rotated_obj = parent if(!rotated_obj.Adjacent(user)) silent = TRUE @@ -120,7 +115,7 @@ return FALSE return TRUE -/datum/component/simple_rotation/proc/DefaultAfterRotation(mob/user, degrees) +/datum/component/simple_rotation/proc/default_post_rotation(mob/user, degrees) return // maybe we don't need the item context proc but instead the hand one? since we don't need to check held_item @@ -129,10 +124,10 @@ var/rotation_screentip = FALSE - if(CanBeRotated(user, ROTATION_CLOCKWISE, silent=TRUE)) + if(can_be_rotated(user, ROTATION_CLOCKWISE, silent=TRUE)) context[SCREENTIP_CONTEXT_ALT_LMB] = "Rotate left" rotation_screentip = TRUE - if(CanBeRotated(user, ROTATION_COUNTERCLOCKWISE, silent=TRUE)) + if(can_be_rotated(user, ROTATION_COUNTERCLOCKWISE, silent=TRUE)) context[SCREENTIP_CONTEXT_ALT_RMB] = "Rotate right" rotation_screentip = TRUE diff --git a/code/datums/components/scope.dm b/code/datums/components/scope.dm index b413b6f8e51..531ff9e9962 100644 --- a/code/datums/components/scope.dm +++ b/code/datums/components/scope.dm @@ -60,7 +60,7 @@ stop_zooming(user_mob) return tracker.calculate_params() - if(!length(user_client.keys_held & user_client.movement_keys)) + if(!user_client.intended_direction) user_mob.face_atom(tracker.given_turf) animate(user_client, world.tick_lag, pixel_x = tracker.given_x, pixel_y = tracker.given_y) diff --git a/code/datums/components/tactical.dm b/code/datums/components/tactical.dm index e8e54926949..e0f131258e7 100644 --- a/code/datums/components/tactical.dm +++ b/code/datums/components/tactical.dm @@ -1,5 +1,8 @@ +///A simple component that replacess the user's appearance with that of the parent item when equipped. /datum/component/tactical + ///The allowed slot(s) for the effect. var/allowed_slot + ///A cached of where the item is currently equipped. var/current_slot /datum/component/tactical/Initialize(allowed_slot) @@ -11,50 +14,63 @@ /datum/component/tactical/RegisterWithParent() RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(modify)) RegisterSignal(parent, COMSIG_ITEM_DROPPED, PROC_REF(unmodify)) + RegisterSignal(parent, COMSIG_ATOM_UPDATED_ICON, PROC_REF(tactical_update)) + var/obj/item/item = parent + if(ismob(item.loc)) + var/mob/holder = item.loc + modify(item, holder, holder.get_slot_by_item(item)) /datum/component/tactical/UnregisterFromParent() - UnregisterSignal(parent, list(COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED)) + UnregisterSignal(parent, list( + COMSIG_ITEM_EQUIPPED, + COMSIG_ITEM_DROPPED, + COMSIG_ATOM_UPDATED_ICON, + )) unmodify() /datum/component/tactical/Destroy() unmodify() return ..() -/datum/component/tactical/proc/on_z_move(datum/source) - SIGNAL_HANDLER - var/obj/item/master = parent - if(!ismob(master.loc)) - return - var/old_slot = current_slot - unmodify(master, master.loc) - modify(master, master.loc, old_slot) - /datum/component/tactical/proc/modify(obj/item/source, mob/user, slot) SIGNAL_HANDLER if(allowed_slot && !(slot & allowed_slot)) - unmodify() + if(current_slot) + unmodify(source, user) return + if(current_slot) //If the current slot is set, this means the icon was updated or the item changed z-levels. + user.remove_alt_appearance("sneaking_mission[REF(src)]") + else + RegisterSignal(parent, COMSIG_MOVABLE_Z_CHANGED, PROC_REF(tactical_update)) + current_slot = slot var/obj/item/master = parent - var/image/I = image(icon = master.icon, icon_state = master.icon_state, loc = user) - I.copy_overlays(master) - I.override = TRUE - source.add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/everyone, "sneaking_mission", I) - I.layer = ABOVE_MOB_LAYER - RegisterSignal(parent, COMSIG_MOVABLE_Z_CHANGED, PROC_REF(on_z_move)) + var/image/image = image(master, loc = user) + image.copy_overlays(master) + image.override = TRUE + image.layer = ABOVE_MOB_LAYER + image.plane = FLOAT_PLANE + source.add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/everyone, "sneaking_mission[REF(src)]", image) /datum/component/tactical/proc/unmodify(obj/item/source, mob/user) SIGNAL_HANDLER - var/obj/item/master = source || parent + var/obj/item/master = parent if(!user) if(!ismob(master.loc)) return user = master.loc - user.remove_alt_appearance("sneaking_mission") + user.remove_alt_appearance("sneaking_mission[REF(src)]") current_slot = null UnregisterSignal(parent, COMSIG_MOVABLE_Z_CHANGED) + +/datum/component/tactical/proc/tactical_update(datum/source) + SIGNAL_HANDLER + var/obj/item/master = parent + if(!ismob(master.loc)) + return + modify(master, master.loc, current_slot) diff --git a/code/datums/components/tameable.dm b/code/datums/components/tameable.dm index 3da6d616149..67325b489d3 100644 --- a/code/datums/components/tameable.dm +++ b/code/datums/components/tameable.dm @@ -70,18 +70,28 @@ return living_parent.faction.Find(REF(potential_friend)) ///Ran once taming succeeds -/datum/component/tameable/proc/on_tame(datum/source, mob/living/tamer, atom/food, inform_tamer = FALSE) +/datum/component/tameable/proc/on_tame(atom/source, mob/living/tamer, atom/food, inform_tamer = FALSE) SIGNAL_HANDLER after_tame?.Invoke(tamer, food)//Run custom behavior if needed if(isliving(parent) && isliving(tamer)) - var/mob/living/tamed = parent - INVOKE_ASYNC(tamed, TYPE_PROC_REF(/mob/living, befriend), tamer) + INVOKE_ASYNC(source, TYPE_PROC_REF(/mob/living, befriend), tamer) if(inform_tamer) - var/atom/atom_parent = source - atom_parent.balloon_alert(tamer, "tamed") + source.balloon_alert(tamer, "tamed") + if(HAS_TRAIT(tamer, TRAIT_SETTLER)) + INVOKE_ASYNC(src, PROC_REF(rename_pet), source, tamer) if(unique) qdel(src) else current_tame_chance = tame_chance + +/datum/component/tameable/proc/rename_pet(mob/living/animal, mob/living/tamer) + var/chosen_name = sanitize_name(tgui_input_text(tamer, "Choose your pet's name!", "Name pet", animal.name, MAX_NAME_LEN), allow_numbers = TRUE) + if(QDELETED(animal) || chosen_name == animal.name) + return + if(!chosen_name) + to_chat(tamer, span_warning("Please enter a valid name.")) + rename_pet(animal, tamer) + return + animal.fully_replace_character_name(animal.name, chosen_name) diff --git a/code/datums/components/uplink.dm b/code/datums/components/uplink.dm index e418988c058..e4e6e611ebc 100644 --- a/code/datums/components/uplink.dm +++ b/code/datums/components/uplink.dm @@ -113,15 +113,6 @@ new /obj/effect/decal/cleanable/ash(get_turf(uplink_item)) qdel(uplink_item) -/// Adds telecrystals to the uplink. It is bad practice to use this outside of the component itself. -/datum/component/uplink/proc/add_telecrystals(telecrystals_added) - set_telecrystals(uplink_handler.telecrystals + telecrystals_added) - -/// Sets the telecrystals of the uplink. It is bad practice to use this outside of the component itself. -/datum/component/uplink/proc/set_telecrystals(new_telecrystal_amount) - uplink_handler.telecrystals = new_telecrystal_amount - uplink_handler.on_update() - /datum/component/uplink/InheritComponent(datum/component/uplink/uplink) lockable |= uplink.lockable active |= uplink.active @@ -135,7 +126,7 @@ if(!silent) to_chat(user, span_notice("You slot [telecrystals] into [parent] and charge its internal uplink.")) var/amt = telecrystals.amount - uplink_handler.telecrystals += amt + uplink_handler.add_telecrystals(amt) telecrystals.use(amt) log_uplink("[key_name(user)] loaded [amt] telecrystals into [parent]'s uplink") diff --git a/code/datums/elements/ELEMENT_TEMPLATE.md b/code/datums/elements/ELEMENT_TEMPLATE.md index 8dedfbaef43..4bc1f72f2dc 100644 --- a/code/datums/elements/ELEMENT_TEMPLATE.md +++ b/code/datums/elements/ELEMENT_TEMPLATE.md @@ -5,8 +5,8 @@ See _element.dm for detailed explanations ```dm /datum/element/myelement - element_flags = ELEMENT_BESPOKE | ELEMENT_COMPLEX_DETACH | ELEMENT_DETACH_ON_HOST_DESTROY | ELEMENT_NOTAREALFLAG // code/__DEFINES/dcs/flags.dm - //argument_hash_start_idx = 2 // Use with ELEMENT_BESPOKE + element_flags = ELEMENT_BESPOKE | ELEMENT_COMPLEX_DETACH | ELEMENT_DETACH_ON_HOST_DESTROY | ELEMENT_NOTAREALFLAG // code/__DEFINES/dcs/flags.dm + //argument_hash_start_idx = 2 // Use with ELEMENT_BESPOKE var/list/myvar = list() /datum/element/myelement/Attach(datum/target) diff --git a/code/datums/elements/_element.dm b/code/datums/elements/_element.dm index bcafc83497c..b2e021ad2be 100644 --- a/code/datums/elements/_element.dm +++ b/code/datums/elements/_element.dm @@ -28,7 +28,7 @@ if(element_flags & ELEMENT_DETACH_ON_HOST_DESTROY) RegisterSignal(target, COMSIG_QDELETING, PROC_REF(OnTargetDelete), override = TRUE) -/datum/element/proc/OnTargetDelete(datum/source, force) +/datum/element/proc/OnTargetDelete(datum/source) SIGNAL_HANDLER Detach(source) @@ -75,3 +75,29 @@ ele.Detach(arglist(arguments)) else ele.Detach(src) + +/** + * Used to manage (typically non_bespoke) elements with multiple sources through traits + * so we don't have to make them a components again. + * The element will be later removed once all trait sources are gone, there's no need of a + * "RemoveElementTrait" counterpart. + */ +/datum/proc/AddElementTrait(trait, source, datum/element/eletype, ...) + if(!ispath(eletype, /datum/element)) + CRASH("AddElementTrait called, but [eletype] is not of a /datum/element path") + ADD_TRAIT(src, trait, source) + if(HAS_TRAIT_NOT_FROM(src, trait, source)) + return + var/list/arguments = list(eletype) + /// 3 is the length of fixed args of this proc, any further one is passed down to AddElement. + if(length(args) > 3) + arguments += args.Copy(4) + /// We actually pass down a copy of the arguments since it's manipulated by the end of the proc. + _AddElement(arguments.Copy()) + var/datum/ele = SSdcs.GetElement(arguments) + ele.RegisterSignal(src, SIGNAL_REMOVETRAIT(trait), TYPE_PROC_REF(/datum/element, _detach_on_trait_removed)) + +/datum/element/proc/_detach_on_trait_removed(datum/source, trait) + SIGNAL_HANDLER + Detach(source) + UnregisterSignal(source, SIGNAL_REMOVETRAIT(trait)) diff --git a/code/datums/elements/light_eaten.dm b/code/datums/elements/light_eaten.dm index 39550a99124..e3bcc079318 100644 --- a/code/datums/elements/light_eaten.dm +++ b/code/datums/elements/light_eaten.dm @@ -15,9 +15,9 @@ RegisterSignal(atom_target, COMSIG_ATOM_SET_LIGHT_ON, PROC_REF(block_light_on)) RegisterSignal(atom_target, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) - /// Because the lighting system does not like movable lights getting set_light() called. + /// Because the lighting system does not like overlay lights getting set_light() called. switch(atom_target.light_system) - if(STATIC_LIGHT) + if(COMPLEX_LIGHT) target.set_light(0, 0, null, l_on = FALSE) else target.set_light_power(0) diff --git a/code/datums/elements/permanent_fire_overlay.dm b/code/datums/elements/permanent_fire_overlay.dm new file mode 100644 index 00000000000..514d0f121a4 --- /dev/null +++ b/code/datums/elements/permanent_fire_overlay.dm @@ -0,0 +1,24 @@ +/// When applied to a mob, they will always have a fire overlay regardless of if they are *actually* on fire. +/datum/element/perma_fire_overlay + +/datum/element/perma_fire_overlay/Attach(atom/target) + . = ..() + if(!isliving(target)) + return ELEMENT_INCOMPATIBLE + + RegisterSignal(target, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(add_fire_overlay)) + target.update_appearance(UPDATE_OVERLAYS) + +/datum/element/perma_fire_overlay/Detach(atom/target) + . = ..() + UnregisterSignal(target, COMSIG_ATOM_UPDATE_OVERLAYS) + target.update_appearance(UPDATE_OVERLAYS) + +/datum/element/perma_fire_overlay/proc/add_fire_overlay(mob/living/source, list/overlays) + SIGNAL_HANDLER + + var/mutable_appearance/created_overlay = source.get_fire_overlay(stacks = MAX_FIRE_STACKS, on_fire = TRUE) + if(isnull(created_overlay)) + return + + overlays |= created_overlay diff --git a/code/datums/elements/squish_sound.dm b/code/datums/elements/squish_sound.dm new file mode 100644 index 00000000000..a245bb48a73 --- /dev/null +++ b/code/datums/elements/squish_sound.dm @@ -0,0 +1,27 @@ +///Plays a sound when walked into, lower sounding if the person walking into it has light stepping. +/datum/element/squish_sound + element_flags = ELEMENT_BESPOKE + argument_hash_start_idx = 2 + ///The sound to play when something holding this element is entered. + var/sound_to_play + +/datum/element/squish_sound/Attach( + datum/target, + sound = 'sound/effects/footstep/gib_step.ogg', +) + . = ..() + sound_to_play = sound + RegisterSignal(target, COMSIG_MOVABLE_CROSS, PROC_REF(on_cross)) + +///Plays the set sound upon being entered, as long as the person walking into it can actually walk. +/datum/element/squish_sound/proc/on_cross(atom/movable/source, atom/movable/crossed) + SIGNAL_HANDLER + + if(!isliving(crossed) || (crossed.movement_type & MOVETYPES_NOT_TOUCHING_GROUND) || crossed.throwing) + return + playsound( + source = source, + soundin = sound_to_play, + vol = HAS_TRAIT(crossed, TRAIT_LIGHT_STEP) ? 20 : 50, + vary = TRUE, + ) diff --git a/code/datums/elements/uplink_reimburse.dm b/code/datums/elements/uplink_reimburse.dm index 3ff182ec231..73a2032fee1 100644 --- a/code/datums/elements/uplink_reimburse.dm +++ b/code/datums/elements/uplink_reimburse.dm @@ -22,7 +22,7 @@ RegisterSignal(target, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) RegisterSignal(target, COMSIG_ITEM_ATTEMPT_TC_REIMBURSE, PROC_REF(reimburse)) RegisterSignal(target,COMSIG_TRAITOR_ITEM_USED(target.type), PROC_REF(used)) - + /datum/element/uplink_reimburse/Detach(datum/target) UnregisterSignal(target, list(COMSIG_ATOM_EXAMINE, COMSIG_TRAITOR_ITEM_USED(target.type), COMSIG_ITEM_ATTEMPT_TC_REIMBURSE)) @@ -47,10 +47,11 @@ to_chat(user, span_notice("You tap [uplink_comp.uplink_handler] with [refund_item], and a moment after [refund_item] disappears in a puff of red smoke!")) do_sparks(2, source = uplink_comp.uplink_handler) - uplink_comp.add_telecrystals(refundable_tc) + uplink_comp.uplink_handler.add_telecrystals(refundable_tc) qdel(refund_item) + /// If the item is used, it needs to no longer be refundable /datum/element/uplink_reimburse/proc/used(datum/target) SIGNAL_HANDLER - + Detach(target) diff --git a/code/datums/elements/waddling.dm b/code/datums/elements/waddling.dm index c51a1759768..e63d0329bb6 100644 --- a/code/datums/elements/waddling.dm +++ b/code/datums/elements/waddling.dm @@ -4,6 +4,8 @@ . = ..() if(!ismovable(target)) return ELEMENT_INCOMPATIBLE + if(!HAS_TRAIT(target, TRAIT_WADDLING)) + stack_trace("[type] added to [target] without adding TRAIT_WADDLING first. Please use AddElementTrait instead.") RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(Waddle)) /datum/element/waddling/Detach(datum/source) diff --git a/code/datums/elements/window_smash.dm b/code/datums/elements/window_smash.dm new file mode 100644 index 00000000000..fbe2674b86c --- /dev/null +++ b/code/datums/elements/window_smash.dm @@ -0,0 +1,30 @@ +/** + * # Window Smashing + * An element you put on mobs to let them smash through walls on movement + * For example, throwing someone through a glass window + */ +/datum/element/window_smashing + +/datum/element/window_smashing/Attach(datum/target, duration = 1.5 SECONDS) + . = ..() + if(!isliving(target)) + return ELEMENT_INCOMPATIBLE + var/mob/living/living_target = target + RegisterSignal(living_target, COMSIG_MOVABLE_MOVED, PROC_REF(flying_window_smash)) + passwindow_on(target, TRAM_PASSENGER_TRAIT) + addtimer(CALLBACK(src, PROC_REF(Detach), living_target), duration) + +/// Smash any windows that the mob is flying through +/datum/element/window_smashing/proc/flying_window_smash(atom/movable/flying_mob, atom/old_loc, direction) + SIGNAL_HANDLER + var/turf/target_turf = get_turf(flying_mob) + for(var/obj/structure/tram/tram_wall in target_turf) + tram_wall.smash_and_injure(flying_mob, old_loc, direction) + + for(var/obj/structure/window/window in target_turf) + window.smash_and_injure(flying_mob, old_loc, direction) + +/datum/element/window_smashing/Detach(datum/source) + UnregisterSignal(source, COMSIG_MOVABLE_MOVED) + passwindow_off(source, TRAM_PASSENGER_TRAIT) + return ..() diff --git a/code/datums/greyscale/config_types/greyscale_configs/greyscale_clothes.dm b/code/datums/greyscale/config_types/greyscale_configs/greyscale_clothes.dm index a277ec50544..9860bbff9a7 100644 --- a/code/datums/greyscale/config_types/greyscale_configs/greyscale_clothes.dm +++ b/code/datums/greyscale/config_types/greyscale_configs/greyscale_clothes.dm @@ -150,6 +150,43 @@ NOVA EDIT END */ icon_file = 'icons/mob/inhands/clothing/masks_righthand.dmi' json_config = 'code/datums/greyscale/json_configs/bandanaskull_inhands.json' +/datum/greyscale_config/facescarf + name = "Facescarf" + icon_file = 'icons/obj/clothing/masks.dmi' + json_config = 'code/datums/greyscale/json_configs/facescarf.json' + +/datum/greyscale_config/facescarf/worn + name = "Facescarf (Worn)" + icon_file = 'icons/mob/clothing/mask.dmi' + +/datum/greyscale_config/facescarf/inhands_left + name = "Facescarf (Held, Left)" + icon_file = 'icons/mob/inhands/clothing/masks_lefthand.dmi' + json_config = 'code/datums/greyscale/json_configs/facescarf_inhands.json' + +/datum/greyscale_config/facescarf/inhands_right + name = "Facescarf (Held, Right)" + icon_file = 'icons/mob/inhands/clothing/masks_righthand.dmi' + json_config = 'code/datums/greyscale/json_configs/facescarf_inhands.json' + +/datum/greyscale_config/kitsune + name = "Kitsune mask" + icon_file = 'icons/obj/clothing/masks.dmi' + json_config = 'code/datums/greyscale/json_configs/kitsune.json' + +/datum/greyscale_config/kitsune/worn + name = "Kitsune mask (Worn)" + icon_file = 'icons/mob/clothing/mask.dmi' + +/datum/greyscale_config/rebellion_mask + name = "Rebellion mask" + icon_file = 'icons/obj/clothing/masks.dmi' + json_config = 'code/datums/greyscale/json_configs/rebellion_mask.json' + +/datum/greyscale_config/rebellion_mask/worn + name = "Rebellion mask (Worn)" + icon_file = 'icons/mob/clothing/mask.dmi' + // // NECK // diff --git a/code/datums/greyscale/json_configs/facescarf.json b/code/datums/greyscale/json_configs/facescarf.json new file mode 100644 index 00000000000..eadb07dd927 --- /dev/null +++ b/code/datums/greyscale/json_configs/facescarf.json @@ -0,0 +1,18 @@ +{ + "facescarf": [ + { + "type": "icon_state", + "icon_state": "facescarf", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "facescarf_up": [ + { + "type": "icon_state", + "icon_state": "facescarf_up", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ] +} diff --git a/code/datums/greyscale/json_configs/facescarf_inhands.json b/code/datums/greyscale/json_configs/facescarf_inhands.json new file mode 100644 index 00000000000..eee4225a050 --- /dev/null +++ b/code/datums/greyscale/json_configs/facescarf_inhands.json @@ -0,0 +1,10 @@ +{ + "greyscale_facescarf": [ + { + "type": "icon_state", + "icon_state": "greyscale_bandana", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ] +} diff --git a/code/datums/greyscale/json_configs/kitsune.json b/code/datums/greyscale/json_configs/kitsune.json new file mode 100644 index 00000000000..bee64183213 --- /dev/null +++ b/code/datums/greyscale/json_configs/kitsune.json @@ -0,0 +1,16 @@ +{ + "kitsune": [ + { + "type": "icon_state", + "icon_state": "kitsune_base", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "kitsune_stripe", + "blend_mode": "overlay", + "color_ids": [ 2 ] + } + ] +} diff --git a/code/datums/greyscale/json_configs/rebellion_mask.json b/code/datums/greyscale/json_configs/rebellion_mask.json new file mode 100644 index 00000000000..1c421b00b79 --- /dev/null +++ b/code/datums/greyscale/json_configs/rebellion_mask.json @@ -0,0 +1,10 @@ +{ + "rebellion_mask": [ + { + "type": "icon_state", + "icon_state": "rebellion_mask", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ] +} diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm index bee48a2bb49..b979c9cda0f 100644 --- a/code/datums/helper_datums/teleport.dm +++ b/code/datums/helper_datums/teleport.dm @@ -70,6 +70,9 @@ teleatom.balloon_alert(teleatom, "something holds you back!") return FALSE + SEND_SIGNAL(teleatom, COMSIG_MOVABLE_TELEPORTED, destination, channel) + SEND_SIGNAL(destturf, COMSIG_ATOM_INTERCEPT_TELEPORTED, channel, curturf, destturf) + if(isobserver(teleatom)) teleatom.abstract_move(destturf) return TRUE @@ -85,7 +88,7 @@ teleatom.log_message("teleported from [loc_name(curturf)] to [loc_name(destturf)].", LOG_GAME, log_globally = FALSE) M.cancel_camera() - SEND_SIGNAL(teleatom, COMSIG_MOVABLE_POST_TELEPORT) + SEND_SIGNAL(teleatom, COMSIG_MOVABLE_POST_TELEPORT, destination, channel) return TRUE @@ -209,7 +212,4 @@ if(SEND_SIGNAL(destination_turf, COMSIG_ATOM_INTERCEPT_TELEPORTING, channel, origin_turf, destination_turf) & COMPONENT_BLOCK_TELEPORT) return FALSE - SEND_SIGNAL(teleported_atom, COMSIG_MOVABLE_TELEPORTED, destination, channel) - SEND_SIGNAL(destination_turf, COMSIG_ATOM_INTERCEPT_TELEPORTED, channel, origin_turf, destination_turf) - return TRUE diff --git a/code/datums/mapgen/Cavegens/IcemoonCaves.dm b/code/datums/mapgen/Cavegens/IcemoonCaves.dm index 91348dd5c17..b477b16e116 100644 --- a/code/datums/mapgen/Cavegens/IcemoonCaves.dm +++ b/code/datums/mapgen/Cavegens/IcemoonCaves.dm @@ -2,7 +2,7 @@ weighted_open_turf_types = list(/turf/open/misc/asteroid/snow/icemoon = 19, /turf/open/misc/ice/icemoon = 1) weighted_closed_turf_types = list( /turf/closed/mineral/random/snow = 100, - /turf/closed/mineral/gibtonite/ice/icemoon = 4, + //turf/closed/mineral/gibtonite/ice/icemoon = 4, // NOVA EDIT REMOVAL - Removes additional gibtonite call ) diff --git a/code/datums/martial/krav_maga.dm b/code/datums/martial/krav_maga.dm index 0a9fea43f5f..66d092e886e 100644 --- a/code/datums/martial/krav_maga.dm +++ b/code/datums/martial/krav_maga.dm @@ -102,6 +102,8 @@ /datum/martial_art/krav_maga/proc/leg_sweep(mob/living/attacker, mob/living/defender) if(defender.stat != CONSCIOUS || defender.IsParalyzed()) return MARTIAL_ATTACK_INVALID + if(HAS_TRAIT(attacker, TRAIT_PACIFISM)) + return MARTIAL_ATTACK_INVALID // Does 5 damage, so we can't let pacifists leg sweep. defender.visible_message( span_warning("[attacker] leg sweeps [defender]!"), span_userdanger("Your legs are sweeped by [attacker]!"), @@ -134,6 +136,8 @@ return MARTIAL_ATTACK_SUCCESS /datum/martial_art/krav_maga/proc/neck_chop(mob/living/attacker, mob/living/defender) + if(HAS_TRAIT(attacker, TRAIT_PACIFISM)) + return MARTIAL_ATTACK_INVALID // Does 10 damage, so we can't let pacifists neck chop. attacker.do_attack_animation(defender) defender.visible_message( span_warning("[attacker] karate chops [defender]'s neck!"), diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm index a52d2724ca2..0dd7b6dd327 100644 --- a/code/datums/martial/sleeping_carp.dm +++ b/code/datums/martial/sleeping_carp.dm @@ -323,6 +323,37 @@ return ..() return FALSE +/obj/item/clothing/gloves/the_sleeping_carp + name = "carp gloves" + desc = "This gloves are capable of making people use The Sleeping Carp." + icon_state = "black" + greyscale_colors = "#000000" + cold_protection = HANDS + min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT + heat_protection = HANDS + max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT + resistance_flags = NONE + var/datum/martial_art/the_sleeping_carp/style + +/obj/item/clothing/gloves/the_sleeping_carp/Initialize(mapload) + . = ..() + style = new() + style.allow_temp_override = FALSE + +/obj/item/clothing/gloves/the_sleeping_carp/Destroy() + QDEL_NULL(style) + return ..() + +/obj/item/clothing/gloves/the_sleeping_carp/equipped(mob/user, slot) + . = ..() + if(slot & ITEM_SLOT_GLOVES) + style.teach(user, TRUE) + +/obj/item/clothing/gloves/the_sleeping_carp/dropped(mob/user) + . = ..() + if(!isnull(style)) + style.fully_remove(user) + #undef STRONG_PUNCH_COMBO #undef LAUNCH_KICK_COMBO #undef DROP_KICK_COMBO diff --git a/code/datums/mind/_mind.dm b/code/datums/mind/_mind.dm index 23921bd84af..eaac3221998 100644 --- a/code/datums/mind/_mind.dm +++ b/code/datums/mind/_mind.dm @@ -451,15 +451,20 @@ current.dropItemToGround(W, TRUE) //The TRUE forces all items to drop, since this is an admin undress. if("takeuplink") take_uplink() - wipe_memory()//Remove any memory they may have had. + wipe_memory_type(/datum/memory/key/traitor_uplink/implant) log_admin("[key_name(usr)] removed [current]'s uplink.") if("crystals") if(check_rights(R_FUN)) var/datum/component/uplink/U = find_syndicate_uplink() if(U) - var/crystals = input("Amount of telecrystals for [key]","Syndicate uplink", U.uplink_handler.telecrystals) as null | num - if(!isnull(crystals)) - U.uplink_handler.telecrystals = crystals + var/crystals = tgui_input_number( + user = usr, + message = "Amount of telecrystals for [key]", + title = "Syndicate uplink", + default = U.uplink_handler.telecrystals, + ) + if(isnum(crystals)) + U.uplink_handler.set_telecrystals(crystals) message_admins("[key_name_admin(usr)] changed [current]'s telecrystal count to [crystals].") log_admin("[key_name(usr)] changed [current]'s telecrystal count to [crystals].") if("progression") diff --git a/code/datums/minigames_menu.dm b/code/datums/minigames_menu.dm index 13e4112daca..cb083026b2f 100644 --- a/code/datums/minigames_menu.dm +++ b/code/datums/minigames_menu.dm @@ -37,6 +37,10 @@ ui.close() basketball() return TRUE + if("deathmatch") + ui.close() + deathmatch() + return TRUE /datum/minigames_menu/proc/mafia() var/datum/mafia_controller/game = GLOB.mafia_game //this needs to change if you want multiple mafia games up at once. @@ -55,3 +59,8 @@ if(!game) game = create_basketball_game() game.ui_interact(usr) + +/datum/minigames_menu/proc/deathmatch() + if(isnull(GLOB.deathmatch_game)) + GLOB.deathmatch_game = new + GLOB.deathmatch_game.ui_interact(usr) diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index cc3af071eef..afcb5d688ed 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -112,8 +112,8 @@ /datum/mood_event/table/add_effects() if(isfelinid(owner)) //Holy snowflake batman! - var/mob/living/carbon/human/H = owner - SEND_SIGNAL(H, COMSIG_ORGAN_WAG_TAIL, TRUE, 3 SECONDS) + var/mob/living/carbon/human/feline = owner + feline.wag_tail(3 SECONDS) description = "They want to play on the table!" mood_change = 2 diff --git a/code/datums/quirks/negative_quirks/all_nighter.dm b/code/datums/quirks/negative_quirks/all_nighter.dm index 798add0539f..253ce12b41f 100644 --- a/code/datums/quirks/negative_quirks/all_nighter.dm +++ b/code/datums/quirks/negative_quirks/all_nighter.dm @@ -14,7 +14,7 @@ mail_goodies = list( /obj/item/clothing/glasses/blindfold, - /obj/item/bedsheet/random, + /obj/effect/spawner/random/bedsheet/any, /obj/item/clothing/under/misc/pj/red, /obj/item/clothing/head/costume/nightcap/red, /obj/item/clothing/under/misc/pj/blue, diff --git a/code/datums/quirks/negative_quirks/unusual.dm b/code/datums/quirks/negative_quirks/unusual.dm new file mode 100644 index 00000000000..79cfac06c13 --- /dev/null +++ b/code/datums/quirks/negative_quirks/unusual.dm @@ -0,0 +1,22 @@ +/datum/quirk/touchy + name = "Touchy" + desc = "You are very touchy and have to physically be able to touch something to examine it." + icon = FA_ICON_HAND + value = -2 + gain_text = span_danger("You feel like you can't examine things from a distance.") + lose_text = span_notice("You feel like you can examine things from a distance.") + medical_record_text = "Patient is unable to tell objects apart from a distance." + hardcore_value = 4 + +/datum/quirk/touchy/add(client/client_source) + RegisterSignal(quirk_holder, COMSIG_CLICK_SHIFT, PROC_REF(examinate_check)) + +/datum/quirk/touchy/remove() + UnregisterSignal(quirk_holder, COMSIG_CLICK_SHIFT) + +///Checks if the mob is besides the thing being examined, if they aren't then we cancel their examinate. +/datum/quirk/touchy/proc/examinate_check(mob/examiner, atom/examined) + SIGNAL_HANDLER + + if(!examined.Adjacent(examiner)) + return COMSIG_MOB_CANCEL_CLICKON diff --git a/code/datums/saymode.dm b/code/datums/saymode.dm index 363f484a415..3598bd764ca 100644 --- a/code/datums/saymode.dm +++ b/code/datums/saymode.dm @@ -20,7 +20,7 @@ if(user.mind.has_antag_datum(/datum/antagonist/fallen_changeling)) to_chat(user, span_changeling("We're cut off from the hivemind! We've lost everything! EVERYTHING!!")) return FALSE - var/datum/antagonist/changeling/ling_sender = user.mind.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/ling_sender = IS_CHANGELING(user) if(!ling_sender) return FALSE if(HAS_TRAIT(user, TRAIT_CHANGELING_HIVEMIND_MUTE)) diff --git a/code/datums/spawners_menu.dm b/code/datums/spawners_menu.dm index 06b6dbc76a8..c6b64cc3a7a 100644 --- a/code/datums/spawners_menu.dm +++ b/code/datums/spawners_menu.dm @@ -30,9 +30,9 @@ this["important_warning"] = "" this["amount_left"] = 0 for(var/spawner_obj in GLOB.mob_spawners[spawner]) + var/obj/effect/mob_spawn/ghost_role/mob_spawner = spawner_obj if(!this["desc"]) if(istype(spawner_obj, /obj/effect/mob_spawn)) - var/obj/effect/mob_spawn/ghost_role/mob_spawner = spawner_obj if(!mob_spawner.allow_spawn(user, silent = TRUE)) continue this["you_are_text"] = mob_spawner.you_are_text @@ -41,8 +41,9 @@ else var/obj/object = spawner_obj this["desc"] = object.desc - this["amount_left"] += 1 - if(this["amount_left"] > 0) + this["amount_left"] += mob_spawner.uses + this["infinite"] += mob_spawner.infinite_use + if(this["amount_left"] > 0 || this["infinite"]) data["spawners"] += list(this) for(var/mob_type in GLOB.joinable_mobs) var/list/this = list() diff --git a/code/datums/sprite_accessories.dm b/code/datums/sprite_accessories.dm index 4ce7cb55177..c356ef669f7 100644 --- a/code/datums/sprite_accessories.dm +++ b/code/datums/sprite_accessories.dm @@ -2091,10 +2091,6 @@ icon = 'icons/mob/human/species/lizard/lizard_spines.dmi' em_block = TRUE -/datum/sprite_accessory/spines_animated - icon = 'icons/mob/human/species/lizard/lizard_spines.dmi' - em_block = TRUE - /datum/sprite_accessory/tail_spines icon = 'icons/mob/human/species/lizard/lizard_spines.dmi' em_block = TRUE @@ -2103,10 +2099,6 @@ name = "None" icon_state = "none" -/datum/sprite_accessory/spines_animated/none - name = "None" - icon_state = "none" - /datum/sprite_accessory/tail_spines/none name = "None" icon_state = "none" @@ -2115,10 +2107,6 @@ name = "Short" icon_state = "short" -/datum/sprite_accessory/spines_animated/short - name = "Short" - icon_state = "short" - /datum/sprite_accessory/tail_spines/short name = "Short" icon_state = "short" @@ -2127,10 +2115,6 @@ name = "Short + Membrane" icon_state = "shortmeme" -/datum/sprite_accessory/spines_animated/shortmeme - name = "Short + Membrane" - icon_state = "shortmeme" - /datum/sprite_accessory/tail_spines/shortmeme name = "Short + Membrane" icon_state = "shortmeme" @@ -2139,10 +2123,6 @@ name = "Long" icon_state = "long" -/datum/sprite_accessory/spines_animated/long - name = "Long" - icon_state = "long" - /datum/sprite_accessory/tail_spines/long name = "Long" icon_state = "long" @@ -2151,10 +2131,6 @@ name = "Long + Membrane" icon_state = "longmeme" -/datum/sprite_accessory/spines_animated/longmeme - name = "Long + Membrane" - icon_state = "longmeme" - /datum/sprite_accessory/tail_spines/longmeme name = "Long + Membrane" icon_state = "longmeme" @@ -2163,10 +2139,6 @@ name = "Aquatic" icon_state = "aqua" -/datum/sprite_accessory/spines_animated/aquatic - name = "Aquatic" - icon_state = "aqua" - /datum/sprite_accessory/tail_spines/aquatic name = "Aquatic" icon_state = "aqua" diff --git a/code/datums/status_effects/debuffs/debuffs.dm b/code/datums/status_effects/debuffs/debuffs.dm index a3c52f2e204..6fa59c1c2d3 100644 --- a/code/datums/status_effects/debuffs/debuffs.dm +++ b/code/datums/status_effects/debuffs/debuffs.dm @@ -795,6 +795,8 @@ processing_speed = STATUS_EFFECT_NORMAL_PROCESS /// Will act as the main timer as well as changing how much damage the ants do. var/ants_remaining = 0 + /// Amount of damage done per ant on the victim + var/damage_per_ant = 0.0016 /// Common phrases people covered in ants scream var/static/list/ant_debuff_speech = list( "GET THEM OFF ME!!", @@ -841,7 +843,7 @@ /datum/status_effect/ants/tick(seconds_between_ticks) var/mob/living/carbon/human/victim = owner var/need_mob_update - need_mob_update = victim.adjustBruteLoss(max(0.1, round((ants_remaining * 0.0016) * seconds_between_ticks,0.1)), updating_health = FALSE) //Scales with # of ants (lowers with time). Roughly 10 brute over 50 seconds. + need_mob_update = victim.adjustBruteLoss(max(0.1, round((ants_remaining * damage_per_ant) * seconds_between_ticks,0.1)), updating_health = FALSE) //Scales with # of ants (lowers with time). Roughly 10 brute over 50 seconds. if(victim.stat <= SOFT_CRIT) //Makes sure people don't scratch at themselves while they're in a critical condition if(prob(15)) switch(rand(1,2)) @@ -871,7 +873,7 @@ if(need_mob_update) victim.updatehealth() if(ants_remaining <= 0 || victim.stat >= HARD_CRIT) - victim.remove_status_effect(/datum/status_effect/ants) //If this person has no more ants on them or are dead, they are no longer affected. + victim.remove_status_effect(type) //If this person has no more ants on them or are dead, they are no longer affected. /atom/movable/screen/alert/status_effect/ants name = "Ants!" @@ -889,6 +891,15 @@ to_chat(living, span_notice("You manage to get some of the ants off!")) ant_covered.ants_remaining -= 10 // 5 Times more ants removed per second than just waiting in place +/datum/status_effect/ants/fire + id = "fire_ants" + alert_type = /atom/movable/screen/alert/status_effect/ants/fire + damage_per_ant = 0.0064 + +/atom/movable/screen/alert/status_effect/ants/fire + name = "Fire Ants!" + desc = span_warning("JESUS FUCKING CHRIST IT BURNS! CLICK TO GET THOSE THINGS OFF!") + /datum/status_effect/stagger id = "stagger" status_type = STATUS_EFFECT_REFRESH diff --git a/code/datums/status_effects/debuffs/fire_stacks.dm b/code/datums/status_effects/debuffs/fire_stacks.dm index 4a6e7b6b730..2f32ff5b3be 100644 --- a/code/datums/status_effects/debuffs/fire_stacks.dm +++ b/code/datums/status_effects/debuffs/fire_stacks.dm @@ -7,7 +7,7 @@ /// Current amount of stacks we have var/stacks /// Maximum of stacks that we could possibly get - var/stack_limit = 20 + var/stack_limit = MAX_FIRE_STACKS /// What status effect types do we remove uppon being applied. These are just deleted without any deduction from our or their stacks when forced. var/list/enemy_types /// What status effect types do we merge into if they exist. Ignored when forced. @@ -116,12 +116,8 @@ owner.clear_alert(ALERT_FIRE) else if(!was_on_fire && owner.on_fire) owner.throw_alert(ALERT_FIRE, /atom/movable/screen/alert/fire) - -/** - * Used to update owner's effect overlay - */ - -/datum/status_effect/fire_handler/proc/update_overlay() + owner.update_appearance(UPDATE_OVERLAYS) + update_particles() /datum/status_effect/fire_handler/fire_stacks id = "fire_stacks" //fire_stacks and wet_stacks should have different IDs or else has_status_effect won't work @@ -132,8 +128,6 @@ /// If we're on fire var/on_fire = FALSE - /// Stores current fire overlay icon state, for optimisation purposes - var/last_icon_state /// Reference to the mob light emitter itself var/obj/effect/dummy/lighting_obj/moblight /// Type of mob light emitter we use when on fire @@ -160,8 +154,6 @@ return TRUE deal_damage(seconds_between_ticks) - update_overlay() - update_particles() /datum/status_effect/fire_handler/fire_stacks/update_particles() if(on_fire) @@ -239,8 +231,6 @@ moblight = new moblight_type(owner) cache_stacks() - update_overlay() - update_particles() SEND_SIGNAL(owner, COMSIG_LIVING_IGNITED, owner) return TRUE @@ -254,8 +244,6 @@ owner.clear_mood_event("on_fire") SEND_SIGNAL(owner, COMSIG_LIVING_EXTINGUISHED, owner) cache_stacks() - update_overlay() - update_particles() for(var/obj/item/equipped in owner.get_equipped_items()) equipped.extinguish() @@ -263,16 +251,26 @@ if(on_fire) extinguish() set_stacks(0) - update_overlay() - update_particles() + UnregisterSignal(owner, COMSIG_ATOM_UPDATE_OVERLAYS) + owner.update_appearance(UPDATE_OVERLAYS) return ..() -/datum/status_effect/fire_handler/fire_stacks/update_overlay() - last_icon_state = owner.update_fire_overlay(stacks, on_fire, last_icon_state) - /datum/status_effect/fire_handler/fire_stacks/on_apply() . = ..() - update_overlay() + RegisterSignal(owner, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(add_fire_overlay)) + owner.update_appearance(UPDATE_OVERLAYS) + +/datum/status_effect/fire_handler/fire_stacks/proc/add_fire_overlay(mob/living/source, list/overlays) + SIGNAL_HANDLER + + if(stacks <= 0 || !on_fire) + return + + var/mutable_appearance/created_overlay = owner.get_fire_overlay(stacks, on_fire) + if(isnull(created_overlay)) + return + + overlays |= created_overlay /obj/effect/dummy/lighting_obj/moblight/fire name = "fire" diff --git a/code/datums/status_effects/neutral.dm b/code/datums/status_effects/neutral.dm index 84f30ab7855..3f267cb3bad 100644 --- a/code/datums/status_effects/neutral.dm +++ b/code/datums/status_effects/neutral.dm @@ -61,6 +61,7 @@ /datum/atom_hud/alternate_appearance/basic/one_person, "in_love", image(icon = 'icons/effects/effects.dmi', icon_state = "love_hearts", loc = date), + null, new_owner, )) diff --git a/code/datums/storage/storage.dm b/code/datums/storage/storage.dm index 915bdea22d4..8213bf347ab 100644 --- a/code/datums/storage/storage.dm +++ b/code/datums/storage/storage.dm @@ -605,12 +605,11 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) */ /datum/storage/proc/return_inv(recursive = TRUE) var/list/ret = list() - ret |= real_location.contents for(var/atom/found_thing as anything in real_location) ret |= found_thing - if(recursive) - ret |= found_thing.atom_storage?.return_inv(ret, recursive = TRUE) + if(recursive && found_thing.atom_storage) + ret |= found_thing.atom_storage.return_inv(recursive = TRUE) return ret diff --git a/code/datums/votes/map_vote.dm b/code/datums/votes/map_vote.dm index e30451c5d5e..f50c43d6c52 100644 --- a/code/datums/votes/map_vote.dm +++ b/code/datums/votes/map_vote.dm @@ -1,7 +1,7 @@ /datum/vote/map_vote name = "Map" message = "Vote for next round's map!" - count_method = VOTE_COUNT_METHOD_MULTI + count_method = VOTE_COUNT_METHOD_SINGLE winner_method = VOTE_WINNER_METHOD_WEIGHTED_RANDOM /datum/vote/map_vote/New() diff --git a/code/datums/wires/brm.dm b/code/datums/wires/brm.dm deleted file mode 100644 index c00d7875035..00000000000 --- a/code/datums/wires/brm.dm +++ /dev/null @@ -1,14 +0,0 @@ -/datum/wires/brm - holder_type = /obj/machinery/bouldertech/brm - proper_name = "Boulder Retrieval Matrix" - -/datum/wires/brm/New(atom/holder) - add_duds(1) - return ..() - -/datum/wires/brm/on_pulse(wire) - var/obj/machinery/bouldertech/brm/brm_holder = holder - if(brm_holder.panel_open) - return - brm_holder.toggle_auto_on() - diff --git a/code/datums/wounds/cranial_fissure.dm b/code/datums/wounds/cranial_fissure.dm new file mode 100644 index 00000000000..b723d410d60 --- /dev/null +++ b/code/datums/wounds/cranial_fissure.dm @@ -0,0 +1,123 @@ +/datum/wound_pregen_data/cranial_fissure + wound_path_to_generate = /datum/wound/cranial_fissure + required_limb_biostate = BIO_BONE + + required_wounding_types = list(WOUND_ALL) + + wound_series = WOUND_SERIES_CRANIAL_FISSURE + + threshold_minimum = 150 + weight = 0 //FLUFFY FRONTIER EDIT. ORIGINAL //weight = 10 + + viable_zones = list(BODY_ZONE_HEAD) + +/datum/wound_pregen_data/cranial_fissure/get_weight(obj/item/bodypart/limb, woundtype, damage, attack_direction, damage_source) + if (limb.owner?.stat < HARD_CRIT) + return 0 + + return ..() + +/// A wound applied when receiving significant enough damage to the head. +/// Will allow other players to take your eyes out of your head, and slipping +/// will cause your brain to fall out of your head. +/datum/wound/cranial_fissure + name = "Cranial Fissure" + desc = "Patient's crown is agape, revealing severe damage to the skull." + treat_text = "Immediate surgical reconstruction of the skull." + examine_desc = "is split open" + occur_text = "is split into two separated chunks" + + simple_desc = "Patient's skull is split open." + threshold_penalty = 40 + + severity = WOUND_SEVERITY_CRITICAL + sound_effect = 'sound/effects/dismember.ogg' + +#define CRANIAL_FISSURE_FILTER_DISPLACEMENT "cranial_fissure_displacement" + +/datum/wound/cranial_fissure/wound_injury(datum/wound/old_wound = null, attack_direction = null) + ADD_TRAIT(limb, TRAIT_IMMUNE_TO_CRANIAL_FISSURE, type) + ADD_TRAIT(victim, TRAIT_HAS_CRANIAL_FISSURE, type) + + victim.add_filter(CRANIAL_FISSURE_FILTER_DISPLACEMENT, 2, displacement_map_filter(icon('icons/effects/cranial_fissure.dmi', "displacement"), size = 3)) + + RegisterSignal(victim, COMSIG_MOB_SLIPPED, PROC_REF(on_owner_slipped)) + +/datum/wound/cranial_fissure/remove_wound(ignore_limb, replaced) + REMOVE_TRAIT(limb, TRAIT_IMMUNE_TO_CRANIAL_FISSURE, type) + REMOVE_TRAIT(victim, TRAIT_HAS_CRANIAL_FISSURE, type) + + victim.remove_filter(CRANIAL_FISSURE_FILTER_DISPLACEMENT) + + UnregisterSignal(victim, COMSIG_MOB_SLIPPED) + + return ..() + +/datum/wound/cranial_fissure/proc/on_owner_slipped(mob/source) + SIGNAL_HANDLER + + if (source.stat == DEAD) + return + + var/obj/item/organ/internal/brain/brain = source.get_organ_by_type(/obj/item/organ/internal/brain) + if (isnull(brain)) + return + + brain.Remove(source) + + var/turf/source_turf = get_turf(source) + brain.forceMove(source_turf) + brain.throw_at(get_step(source_turf, source.dir), 1, 1) + + source.visible_message( + span_boldwarning("[source]'s brain spills right out of [source.p_their()] head!"), + span_userdanger("Your brain spills right out of your head!"), + ) + +/datum/wound/cranial_fissure/try_handling(mob/living/carbon/human/user) + if (user.zone_selected != BODY_ZONE_HEAD && user.zone_selected != BODY_ZONE_PRECISE_EYES) + return FALSE + + if (victim.body_position != LYING_DOWN) + return FALSE + + var/obj/item/organ/internal/eyes/eyes = victim.get_organ_by_type(/obj/item/organ/internal/eyes) + if (isnull(eyes)) + victim.balloon_alert(user, "no eyes to take!") + return TRUE + + victim.balloon_alert(user, "pulling out eyes...") + victim.show_message( + span_userdanger("[victim] starts to pull out your eyes!"), + MSG_VISUAL, + span_userdanger("An arm reaches inside your brain, and starts pulling on your eyes!"), + ) + + if (!do_after(user, 10 SECONDS, victim, extra_checks = CALLBACK(src, PROC_REF(still_has_eyes), eyes))) + return TRUE + + eyes.Remove(victim) + user.put_in_hands(eyes) + + log_combat(user, victim, "pulled out the eyes of") + + user.visible_message( + span_boldwarning("You rip out [victim]'s eyes!"), + span_boldwarning("[user] rips out [victim]'s eyes!"), + ignored_mobs = victim, + ) + + victim.show_message( + span_userdanger("[user] rips out your eyes!"), + MSG_VISUAL, + span_userdanger("You feel an arm yank from inside your head, as you feel something very important is missing!"), + ) + + return TRUE + +/datum/wound/cranial_fissure/proc/still_has_eyes(obj/item/organ/internal/eyes/eyes) + PRIVATE_PROC(TRUE) + + return victim?.get_organ_by_type(/obj/item/organ/internal/eyes) == eyes + +#undef CRANIAL_FISSURE_FILTER_DISPLACEMENT diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index c5ea5ff66e2..64b4ee9bca4 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -38,6 +38,10 @@ var/list/firealarms = list() ///Alarm type to count of sources. Not usable for ^ because we handle fires differently var/list/active_alarms = list() + /// The current alarm fault status + var/fault_status = AREA_FAULT_NONE + /// The source machinery for the area's fault status + var/fault_location ///List of all lights in our area var/list/lights = list() ///We use this just for fire alarms, because they're area based right now so one alarm going poof shouldn't prevent you from clearing your alarms listing. Fire alarms and fire locks will set and clear alarms. @@ -394,10 +398,15 @@ GLOBAL_LIST_EMPTY(teleportlocs) * * Allows interested parties (lights and fire alarms) to react */ -/area/proc/set_fire_effect(new_fire) +/area/proc/set_fire_effect(new_fire, fault_type, fault_source) if(new_fire == fire) return fire = new_fire + fault_status = fault_type + if(fire) + fault_location = fault_source + else + fault_location = null SEND_SIGNAL(src, COMSIG_AREA_FIRE_CHANGED, fire) /** diff --git a/code/game/area/areas/away_content.dm b/code/game/area/areas/away_content.dm index b5f63c41398..395cd85c87e 100644 --- a/code/game/area/areas/away_content.dm +++ b/code/game/area/areas/away_content.dm @@ -23,6 +23,18 @@ Unused icons for new areas are "awaycontent1" ~ "awaycontent30" has_gravity = STANDARD_GRAVITY ambientsounds = list('sound/ambience/shore.ogg', 'sound/ambience/seag1.ogg','sound/ambience/seag2.ogg','sound/ambience/seag2.ogg','sound/ambience/ambiodd.ogg','sound/ambience/ambinice.ogg') +/area/awaymission/museum + name = "Nanotrasen Museum" + icon_state = "awaycontent28" + sound_environment = SOUND_ENVIRONMENT_CONCERT_HALL + +/area/awaymission/museum/mothroachvoid + static_lighting = FALSE + base_lighting_alpha = 200 + base_lighting_color = "#FFF4AA" + sound_environment = SOUND_ENVIRONMENT_PLAIN + ambientsounds = list('sound/ambience/shore.ogg', 'sound/ambience/ambiodd.ogg','sound/ambience/ambinice.ogg') + /area/awaymission/errorroom name = "Super Secret Room" static_lighting = FALSE diff --git a/code/game/area/areas/ruins/space.dm b/code/game/area/areas/ruins/space.dm index 9004969f916..773922d6670 100644 --- a/code/game/area/areas/ruins/space.dm +++ b/code/game/area/areas/ruins/space.dm @@ -33,7 +33,7 @@ // Ruins of "onehalf" ship /area/ruin/space/has_grav/onehalf/hallway - name = "\improper Hallway" + name = "\improper Half-Station Hallway" /area/ruin/space/has_grav/onehalf/drone_bay name = "\improper Mining Drone Bay" @@ -42,7 +42,7 @@ name = "\improper Crew Quarters" /area/ruin/space/has_grav/onehalf/bridge - name = "\improper Bridge" + name = "\improper Half-Station Bridge" /area/ruin/space/has_grav/powered/dinner_for_two name = "Dinner for Two" @@ -639,25 +639,25 @@ name = "Waystation Maintenance" /area/ruin/space/has_grav/waystation/qm - name = "Quartermaster Office" + name = "Waystation Quartermaster Office" /area/ruin/space/has_grav/waystation/dorms - name = "Living Space" + name = "Waystation Living Space" /area/ruin/space/has_grav/waystation/kitchen - name = "Kitchen" + name = "Waystation Kitchen" /area/ruin/space/has_grav/waystation/cargobay - name = "Cargo Bay" + name = "Waystation Cargo Bay" /area/ruin/space/has_grav/waystation/securestorage - name = "Secure Storage" + name = "Waystation Secure Storage" /area/ruin/space/has_grav/waystation/cargooffice - name = "Cargo Office" + name = "Waystation Cargo Office" /area/ruin/space/has_grav/powered/waystation/assaultpod - name = "Assault Pod" + name = "Waystation Assault Pod" /area/ruin/space/has_grav/waystation/power name = "Waystation Electrical" diff --git a/code/game/atom/_atom.dm b/code/game/atom/_atom.dm index 5bd8346f57f..4a7d113ba65 100644 --- a/code/game/atom/_atom.dm +++ b/code/game/atom/_atom.dm @@ -65,7 +65,7 @@ var/datum/wires/wires = null ///Light systems, both shouldn't be active at the same time. - var/light_system = STATIC_LIGHT + var/light_system = COMPLEX_LIGHT ///Range of the light in tiles. Zero means no light. var/light_range = 0 ///Intensity of the light. The stronger, the less shadows you will see on the lit area. diff --git a/code/game/atom/alternate_appearance.dm b/code/game/atom/alternate_appearance.dm index 86732dd9ed4..228462f7936 100644 --- a/code/game/atom/alternate_appearance.dm +++ b/code/game/atom/alternate_appearance.dm @@ -166,8 +166,8 @@ GLOBAL_LIST_EMPTY(active_alternate_appearances) return TRUE return FALSE -/datum/atom_hud/alternate_appearance/basic/one_person/New(key, image/I, mob/living/M) - ..(key, I, FALSE) - seer = M +/datum/atom_hud/alternate_appearance/basic/one_person/New(key, image/I, options = NONE, mob/living/seer) + src.seer = seer + return ..() /datum/atom_hud/alternate_appearance/basic/food_demands diff --git a/code/game/atom/atom_vv.dm b/code/game/atom/atom_vv.dm index b5a572749a6..8830a4af2f4 100644 --- a/code/game/atom/atom_vv.dm +++ b/code/game/atom/atom_vv.dm @@ -222,37 +222,37 @@ light_flags &= ~LIGHT_FROZEN switch(var_name) if(NAMEOF(src, light_range)) - if(light_system == STATIC_LIGHT) + if(light_system == COMPLEX_LIGHT) set_light(l_range = var_value) else set_light_range(var_value) . = TRUE if(NAMEOF(src, light_power)) - if(light_system == STATIC_LIGHT) + if(light_system == COMPLEX_LIGHT) set_light(l_power = var_value) else set_light_power(var_value) . = TRUE if(NAMEOF(src, light_color)) - if(light_system == STATIC_LIGHT) + if(light_system == COMPLEX_LIGHT) set_light(l_color = var_value) else set_light_color(var_value) . = TRUE if(NAMEOF(src, light_angle)) - if(light_system == STATIC_LIGHT) + if(light_system == COMPLEX_LIGHT) set_light(l_angle = var_value) . = TRUE if(NAMEOF(src, light_dir)) - if(light_system == STATIC_LIGHT) + if(light_system == COMPLEX_LIGHT) set_light(l_dir = var_value) . = TRUE if(NAMEOF(src, light_height)) - if(light_system == STATIC_LIGHT) + if(light_system == COMPLEX_LIGHT) set_light(l_height = var_value) . = TRUE if(NAMEOF(src, light_on)) - if(light_system == STATIC_LIGHT) + if(light_system == COMPLEX_LIGHT) set_light(l_on = var_value) else set_light_on(var_value) diff --git a/code/game/atom/atoms_initializing_EXPENSIVE.dm b/code/game/atom/atoms_initializing_EXPENSIVE.dm index 2a3a442e04d..ea8bf9b125d 100644 --- a/code/game/atom/atoms_initializing_EXPENSIVE.dm +++ b/code/game/atom/atoms_initializing_EXPENSIVE.dm @@ -128,7 +128,7 @@ if(color) add_atom_colour(color, FIXED_COLOUR_PRIORITY) - if (light_system == STATIC_LIGHT && light_power && light_range) + if (light_system == COMPLEX_LIGHT && light_power && light_range) update_light() SETUP_SMOOTHING() diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 990f9812126..f82fb690405 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -181,11 +181,11 @@ if(opacity) AddElement(/datum/element/light_blocking) switch(light_system) - if(MOVABLE_LIGHT) + if(OVERLAY_LIGHT) AddComponent(/datum/component/overlay_lighting) - if(MOVABLE_LIGHT_DIRECTIONAL) + if(OVERLAY_LIGHT_DIRECTIONAL) AddComponent(/datum/component/overlay_lighting, is_directional = TRUE) - if(MOVABLE_LIGHT_BEAM) + if(OVERLAY_LIGHT_BEAM) AddComponent(/datum/component/overlay_lighting, is_directional = TRUE, is_beam = TRUE) /atom/movable/Destroy(force) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index ba0d7b931cd..f8a2cbede01 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -792,7 +792,7 @@ GLOBAL_LIST_EMPTY(possible_items) n_p ++ else if (SSticker.IsRoundInProgress()) for(var/mob/living/carbon/human/P in GLOB.player_list) - if(!(P.mind.has_antag_datum(/datum/antagonist/changeling)) && !(P.mind in owners)) + if(!(IS_CHANGELING(P)) && !(P.mind in owners)) n_p ++ target_amount = min(target_amount, n_p) diff --git a/code/game/machinery/PDApainter.dm b/code/game/machinery/PDApainter.dm index c4cf5bb125a..679a3182a57 100644 --- a/code/game/machinery/PDApainter.dm +++ b/code/game/machinery/PDApainter.dm @@ -67,7 +67,7 @@ QDEL_NULL(stored_id_card) return ..() -/obj/machinery/pdapainter/on_deconstruction() +/obj/machinery/pdapainter/on_deconstruction(disassembled) // Don't use ejection procs as we're gonna be destroyed anyway, so no need to update icons or anything. if(stored_pda) stored_pda.forceMove(loc) diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index 33cd8a96968..3ce26e0d4e1 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -198,9 +198,8 @@ end_processing() clear_components() - dump_contents() - unset_static_power() + return ..() /** @@ -819,11 +818,15 @@ deconstruct(TRUE) /obj/machinery/deconstruct(disassembled = TRUE) + SHOULD_NOT_OVERRIDE(TRUE) + if(obj_flags & NO_DECONSTRUCTION) + dump_contents() //drop everything inside us return ..() //Just delete us, no need to call anything else. - on_deconstruction() + on_deconstruction(disassembled) if(!LAZYLEN(component_parts)) + dump_contents() //drop everything inside us return ..() //we don't have any parts. spawn_frame(disassembled) @@ -842,8 +845,12 @@ continue var/obj/item/stack/stack_path = component new stack_path(loc, board.req_components[component]) - LAZYCLEARLIST(component_parts) + + //drop everything inside us. we do this last to give machines a chance + //to handle their contents before we dump them + dump_contents() + return ..() /** @@ -1129,8 +1136,14 @@ /obj/machinery/proc/on_construction(mob/user) return -//called on deconstruction before the final deletion -/obj/machinery/proc/on_deconstruction() +/** + * called on deconstruction before the final deletion + * Arguments + * + * * disassembled - if TRUE means we used tools to deconstruct it, FALSE means it got destroyed by other means + */ +/obj/machinery/proc/on_deconstruction(disassembled) + PROTECTED_PROC(TRUE) return /obj/machinery/proc/can_be_overridden() diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index f6600942cde..ba9667b3e58 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -97,7 +97,8 @@ flick("autolathe_[item_inserted.has_material_type(/datum/material/glass) ? "r" : "o"]", src) - directly_use_power(round((amount_inserted / SHEET_MATERIAL_AMOUNT) * active_power_usage * 0.0025)) + //we use initial(active_power_usage) because higher tier parts will have higher active usage but we have no benifit from it + directly_use_power(ROUND_UP((amount_inserted / (MAX_STACK_SIZE * SHEET_MATERIAL_AMOUNT)) * 0.01 * initial(active_power_usage))) /obj/machinery/autolathe/ui_interact(mob/user, datum/tgui/ui) if(!is_operational) @@ -273,7 +274,7 @@ var/charge_per_item = 0 for(var/material in design.materials) charge_per_item += design.materials[material] - charge_per_item = min(active_power_usage, round(charge_per_item * material_cost_coefficient)) + charge_per_item = ROUND_UP((charge_per_item / (MAX_STACK_SIZE * SHEET_MATERIAL_AMOUNT)) * material_cost_coefficient * 0.05 * active_power_usage) var/build_time_per_item = (design.construction_time * design.lathe_time_factor) ** 0.8 //do the printing sequentially diff --git a/code/game/machinery/barsigns.dm b/code/game/machinery/barsigns.dm index 593a58d165c..faa29c2673e 100644 --- a/code/game/machinery/barsigns.dm +++ b/code/game/machinery/barsigns.dm @@ -91,15 +91,12 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/barsign, 32) if((machine_stat & BROKEN) && !(obj_flags & NO_DECONSTRUCTION)) set_sign(new /datum/barsign/hiddensigns/signoff) -/obj/machinery/barsign/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - if(disassembled) - new disassemble_result(drop_location()) - else - new /obj/item/stack/sheet/iron(drop_location(), 2) - new /obj/item/stack/cable_coil(drop_location(), 2) - - qdel(src) +/obj/machinery/barsign/on_deconstruction(disassembled) + if(disassembled) + new disassemble_result(drop_location()) + else + new /obj/item/stack/sheet/iron(drop_location(), 2) + new /obj/item/stack/cable_coil(drop_location(), 2) /obj/machinery/barsign/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) switch(damage_type) diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 213c43b5a11..69c01a22f62 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -443,21 +443,20 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) triggerCameraAlarm() toggle_cam(null, 0) -/obj/machinery/camera/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - if(disassembled) - var/obj/structure/camera_assembly/assembly = assembly_ref?.resolve() - if(!assembly) - assembly = new() - assembly.forceMove(drop_location()) - assembly.state = 1 - assembly.setDir(dir) - assembly_ref = null - else - var/obj/item/I = new /obj/item/wallframe/camera (loc) - I.update_integrity(I.max_integrity * 0.5) - new /obj/item/stack/cable_coil(loc, 2) - qdel(src) +/obj/machinery/camera/on_deconstruction(disassembled) + if(disassembled) + var/obj/structure/camera_assembly/assembly = assembly_ref?.resolve() + if(!assembly) + assembly = new() + assembly.forceMove(drop_location()) + assembly.state = 1 + assembly.setDir(dir) + assembly_ref = null + return + + var/obj/item/I = new /obj/item/wallframe/camera (loc) + I.update_integrity(I.max_integrity * 0.5) + new /obj/item/stack/cable_coil(loc, 2) /obj/machinery/camera/update_icon_state() //TO-DO: Make panel open states, xray camera, and indicator lights overlays instead. var/xray_module diff --git a/code/game/machinery/camera/trackable.dm b/code/game/machinery/camera/trackable.dm index 884f38f750b..7155dc10e8e 100644 --- a/code/game/machinery/camera/trackable.dm +++ b/code/game/machinery/camera/trackable.dm @@ -2,13 +2,13 @@ #define CAMERA_TICK_LIMIT 10 /datum/trackable - ///Boolean on whether or not we are currently trying to track something. - var/tracking = FALSE ///Reference to the atom that owns us, used for tracking. var/atom/tracking_holder - ///If there is a mob currently being tracked, this will be the weakref to it. - var/datum/weakref/tracked_mob + ///What mob are we currently tracking, if any + var/mob/living/tracked_mob + ///If we're currently rechecking our target's trackability in hopes of something changing + var/rechecking = FALSE ///How many times we've failed to locate our target. var/cameraticks = 0 @@ -24,7 +24,7 @@ /datum/trackable/New(atom/source) . = ..() tracking_holder = source - RegisterSignal(tracking_holder, COMSIG_MOB_RESET_PERSPECTIVE, PROC_REF(cancel_target_tracking)) + RegisterSignal(tracking_holder, COMSIG_MOB_RESET_PERSPECTIVE, PROC_REF(perspective_reset)) /datum/trackable/Destroy(force) tracking_holder = null @@ -32,27 +32,6 @@ STOP_PROCESSING(SSprocessing, src) return ..() -/datum/trackable/process() - var/mob/living/tracked_target = tracked_mob?.resolve() - if(!tracked_target || !tracking) - set_tracking(FALSE) - return - - if(tracked_target.can_track(tracking_holder)) - cameraticks = initial(cameraticks) - SEND_SIGNAL(tracking_holder, COMSIG_TRACKABLE_TRACKING_TARGET, tracked_target) - return - - if(cameraticks < CAMERA_TICK_LIMIT) - if(!cameraticks) - to_chat(tracking_holder, span_warning("Target is not near any active cameras. Attempting to reacquire...")) - cameraticks++ - return - - to_chat(tracking_holder, span_warning("Unable to reacquire, cancelling track...")) - cameraticks = initial(cameraticks) - set_tracking(FALSE) - ///Generates a list of trackable people by name, returning a list of Humans + Non-Humans that can be tracked. /datum/trackable/proc/find_trackable_mobs() RETURN_TYPE(/list) @@ -82,47 +61,140 @@ var/list/targets = sort_list(humans) + sort_list(others) return targets -///Toggles whether or not we're tracking something. Arg is whether it's on or off. -/datum/trackable/proc/set_tracking(on = FALSE) - if(on) +/// Takes a mob to track, resets our state and begins trying to follow it +/// Best we can at least +/datum/trackable/proc/set_tracked_mob(mob/living/track) + set_rechecking(FALSE) + if(tracked_mob) + UnregisterSignal(tracked_mob, list(COMSIG_QDELETING, COMSIG_MOVABLE_MOVED, COMSIG_MOVABLE_UPDATE_GLIDE_SIZE)) + if(track && !isliving(track)) + tracked_mob = null + return + tracked_mob = track + if(tracked_mob) + RegisterSignal(tracked_mob, COMSIG_QDELETING, PROC_REF(target_deleted)) + RegisterSignal(tracked_mob, COMSIG_MOVABLE_MOVED, PROC_REF(target_moved)) + RegisterSignal(tracked_mob, COMSIG_MOVABLE_UPDATE_GLIDE_SIZE, PROC_REF(glide_size_changed)) + attempt_track() + +/datum/trackable/proc/target_deleted(datum/source) + SIGNAL_HANDLER + reset_tracking() + +/datum/trackable/proc/perspective_reset(atom/source) + SIGNAL_HANDLER + reset_tracking() + +/datum/trackable/proc/target_moved(datum/source) + SIGNAL_HANDLER + if(attempt_track()) + return + set_rechecking(TRUE) + +/// Controls if we're processing to recheck the conditions that prevent tracking or not +/datum/trackable/proc/set_rechecking(should_check) + if(should_check) START_PROCESSING(SSprocessing, src) - tracking = TRUE + cameraticks = initial(cameraticks) + rechecking = TRUE else STOP_PROCESSING(SSprocessing, src) - tracking = FALSE - tracked_mob = null + rechecking = FALSE + +/datum/trackable/process() + if(!rechecking) + return PROCESS_KILL + + if(attempt_track()) + set_rechecking(FALSE) + return + + if(cameraticks < CAMERA_TICK_LIMIT) + if(!cameraticks) + to_chat(tracking_holder, span_warning("Target is not near any active cameras. Attempting to reacquire...")) + cameraticks++ + return -///Called by Signals, used to cancel tracking of a target. -/datum/trackable/proc/cancel_target_tracking(atom/source) + to_chat(tracking_holder, span_warning("Unable to reacquire, cancelling track...")) + reset_tracking() + +/// Tries to track onto our target mob. Returns true if it succeeds, false otherwise +/datum/trackable/proc/attempt_track() + if(!tracked_mob) + reset_tracking() + return FALSE + + if(!tracked_mob.can_track(tracking_holder)) + return FALSE + // In case we've been checking + set_rechecking(FALSE) + SEND_SIGNAL(src, COMSIG_TRACKABLE_TRACKING_TARGET, tracked_mob) + return TRUE + +/datum/trackable/proc/glide_size_changed(datum/source, new_glide_size) SIGNAL_HANDLER - set_tracking(FALSE) + SEND_SIGNAL(src, COMSIG_TRACKABLE_GLIDE_CHANGED, tracked_mob, new_glide_size) /** - * set_tracked_mob + * reset_tracking * - * Sets a mob as being tracked, if a target is already provided then it will track that directly, - * otherwise it will give a tgui input list to find targets to track. + * Resets our tracking + */ +/datum/trackable/proc/reset_tracking() + set_tracked_mob(null) + +/** + * track_input + * + * Sets a mob as being tracked, will give a tgui input list to find targets to track. * Args: * tracker - The person trying to track, used for feedback messages. This is not the same as tracking_holder - * tracked_mob_name - (Optional) The person being tracked, to skip the input list. */ -/datum/trackable/proc/set_tracked_mob(mob/living/tracker, tracked_mob_name) +/datum/trackable/proc/track_input(mob/living/tracker) if(!tracker || tracker.stat == DEAD) return - if(tracked_mob_name) - find_trackable_mobs() //this is in case the tracked mob is newly/no-longer in camera field of view. - tracked_mob = isnull(humans[tracked_mob_name]) ? others[tracked_mob_name] : humans[tracked_mob_name] - if(isnull(tracked_mob)) - to_chat(tracker, span_notice("Target is not on or near any active cameras. Tracking failed.")) - return - to_chat(tracker, span_notice("Now tracking [tracked_mob_name] on camera.")) - else - var/target_name = tgui_input_list(tracker, "Select a target", "Tracking", find_trackable_mobs()) - if(!target_name || isnull(target_name)) - return - tracked_mob = isnull(humans[target_name]) ? others[target_name] : humans[target_name] + var/target_name = tgui_input_list(tracker, "Select a target", "Tracking", find_trackable_mobs()) + if(!target_name || isnull(target_name)) + return + var/datum/weakref/mob_ref = isnull(humans[target_name]) ? others[target_name] : humans[target_name] + if(isnull(mob_ref)) + to_chat(tracker, span_notice("Target is not on or near any active cameras. Tracking failed.")) + return + set_tracked_mob(mob_ref.resolve()) + +/** + * track_name + * + * Sets a mob as being tracked, will track the passed in target name's target + * Args: + * tracker - The person trying to track, used for feedback messages. This is not the same as tracking_holder + * tracked_mob_name - The person being tracked. + */ +/datum/trackable/proc/track_name(mob/living/tracker, tracked_mob_name) + if(!tracker || tracker.stat == DEAD) + return + + find_trackable_mobs() //this is in case the tracked mob is newly/no-longer in camera field of view. + var/datum/weakref/mob_ref = isnull(humans[tracked_mob_name]) ? others[tracked_mob_name] : humans[tracked_mob_name] + if(isnull(mob_ref)) + to_chat(tracker, span_notice("Target is not on or near any active cameras. Tracking failed.")) + return + to_chat(tracker, span_notice("Now tracking [tracked_mob_name] on camera.")) + set_tracked_mob(mob_ref.resolve()) - set_tracking(TRUE) +/** + * track_mob + * + * Sets a mob as being tracked, will track the passed in target + * Args: + * tracker - The person trying to track, used for feedback messages. This is not the same as tracking_holder + * tracked - The person being tracked. + */ +/datum/trackable/proc/track_mob(mob/living/tracker, mob/living/tracked) + if(!tracker || tracker.stat == DEAD) + return + // Need to make sure the tracked mob is in our list + track_name(tracker, tracked.name) #undef CAMERA_TICK_LIMIT diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index 8d3e4b3e661..c9acc0de7c9 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -80,10 +80,9 @@ return return ..() -/obj/machinery/cell_charger/deconstruct() +/obj/machinery/cell_charger/on_deconstruction(disassembled) if(charging) charging.forceMove(drop_location()) - return ..() /obj/machinery/cell_charger/Destroy() QDEL_NULL(charging) diff --git a/code/game/machinery/computer/_computer.dm b/code/game/machinery/computer/_computer.dm index a9954a71f12..116b8ff062e 100644 --- a/code/game/machinery/computer/_computer.dm +++ b/code/game/machinery/computer/_computer.dm @@ -98,33 +98,25 @@ if(prob(10)) atom_break(ENERGY) -/obj/machinery/computer/deconstruct(disassembled = TRUE, mob/user) - on_deconstruction() - if(!(obj_flags & NO_DECONSTRUCTION)) - if(circuit) //no circuit, no computer frame - var/obj/structure/frame/computer/A = new /obj/structure/frame/computer(src.loc) - A.setDir(dir) - A.circuit = circuit - // Circuit removal code is handled in /obj/machinery/Exited() - circuit.forceMove(A) - A.set_anchored(TRUE) - if(machine_stat & BROKEN) - if(user) - to_chat(user, span_notice("The broken glass falls out.")) - else - 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" - else - if(user) - to_chat(user, span_notice("You disconnect the monitor.")) - A.state = 4 - A.icon_state = "4" - for(var/obj/C in src) - C.forceMove(loc) - qdel(src) +/obj/machinery/computer/spawn_frame(disassembled) + if(QDELETED(circuit)) //no circuit, no computer frame + return + + var/obj/structure/frame/computer/A = new /obj/structure/frame/computer(src.loc) + A.setDir(dir) + A.circuit = circuit + // Circuit removal code is handled in /obj/machinery/Exited() + circuit.forceMove(A) + A.set_anchored(TRUE) + if(machine_stat & BROKEN) + 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" + else + A.state = 4 + A.icon_state = "4" /obj/machinery/computer/AltClick(mob/user) . = ..() diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm index 2ddbb3baadd..74632b926b1 100644 --- a/code/game/machinery/computer/aifixer.dm +++ b/code/game/machinery/computer/aifixer.dm @@ -138,6 +138,6 @@ QDEL_NULL(occupier) return ..() -/obj/machinery/computer/aifixer/on_deconstruction() +/obj/machinery/computer/aifixer/on_deconstruction(disassembled) if(occupier) QDEL_NULL(occupier) diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm index 3145bcdbdaa..0a49365e1ee 100644 --- a/code/game/machinery/computer/crew.dm +++ b/code/game/machinery/computer/crew.dm @@ -301,7 +301,7 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) var/mob/living/silicon/ai/AI = usr if(!istype(AI)) return - AI.ai_tracking_tool.set_tracked_mob(AI, params["name"]) + AI.ai_tracking_tool.track_name(AI, params["name"]) #undef SENSORS_UPDATE_PERIOD #undef UNKNOWN_JOB_ID diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm index 1fe999010b7..0982c98dd1c 100644 --- a/code/game/machinery/computer/dna_console.dm +++ b/code/game/machinery/computer/dna_console.dm @@ -548,6 +548,7 @@ var/truegenes = GET_SEQUENCE(path) newgene = truegenes[genepos] joker_ready = world.time + JOKER_TIMEOUT - (JOKER_UPGRADE * (connected_scanner.precision_coeff-1)) + tgui_view_state["jokerActive"] = FALSE else var/current_letter = gene_letters.Find(sequence[genepos]) newgene = (current_letter == gene_letter_count) ? gene_letters[1] : gene_letters[current_letter + 1] diff --git a/code/game/machinery/computer/prisoner/_prisoner.dm b/code/game/machinery/computer/prisoner/_prisoner.dm index 5785734a437..f1ce2555936 100644 --- a/code/game/machinery/computer/prisoner/_prisoner.dm +++ b/code/game/machinery/computer/prisoner/_prisoner.dm @@ -3,9 +3,8 @@ /// ID card currently inserted into the computer. VAR_FINAL/obj/item/card/id/advanced/prisoner/contained_id -/obj/machinery/computer/prisoner/deconstruct(disassembled, mob/user) +/obj/machinery/computer/prisoner/on_deconstruction(disassembled) contained_id?.forceMove(drop_location()) - return ..() /obj/machinery/computer/prisoner/Destroy() QDEL_NULL(contained_id) diff --git a/code/game/machinery/computer/records/records.dm b/code/game/machinery/computer/records/records.dm index 531e1725e33..4a13dc17cd5 100644 --- a/code/game/machinery/computer/records/records.dm +++ b/code/game/machinery/computer/records/records.dm @@ -67,6 +67,10 @@ if("purge_records") // Don't let people off station futz with the station network. + //NOVA EDIT BEGIN: disable record purging/expunging to stop people messing around with the AI effortlessly + balloon_alert(usr, "access denied!") + return TRUE + /* if(!is_station_level(z)) balloon_alert(usr, "out of range!") return TRUE @@ -86,6 +90,8 @@ balloon_alert(usr, "interrupted!") return TRUE + */ + //NOVA EDIT END if("view_record") if(!target) diff --git a/code/game/machinery/computer/telescreen.dm b/code/game/machinery/computer/telescreen.dm index 90e53c2f452..7b1e62e2cb7 100644 --- a/code/game/machinery/computer/telescreen.dm +++ b/code/game/machinery/computer/telescreen.dm @@ -21,10 +21,8 @@ result_path = /obj/machinery/computer/security/telescreen pixel_shift = 32 -/obj/machinery/computer/security/telescreen/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - new frame_type(loc) - qdel(src) +/obj/machinery/computer/security/telescreen/on_deconstruction(disassembled) + new frame_type(loc) /obj/machinery/computer/security/telescreen/update_icon_state() icon_state = initial(icon_state) diff --git a/code/game/machinery/digital_clock.dm b/code/game/machinery/digital_clock.dm index a0dc87dba08..febc6a4b091 100644 --- a/code/game/machinery/digital_clock.dm +++ b/code/game/machinery/digital_clock.dm @@ -69,16 +69,13 @@ . = ..() emag_act() -/obj/machinery/digital_clock/deconstruct(disassembled = TRUE) - if(obj_flags & NO_DECONSTRUCTION) - return +/obj/machinery/digital_clock/on_deconstruction(disassembled) if(disassembled) new /obj/item/wallframe/digital_clock(drop_location()) else new /obj/item/stack/sheet/iron(drop_location(), 2) new /obj/item/shard(drop_location()) new /obj/item/shard(drop_location()) - qdel(src) /obj/machinery/digital_clock/Initialize(mapload) . = ..() diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 9878ea869d8..566c4eb360c 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -1527,38 +1527,32 @@ assembly.update_name() assembly.update_appearance() -/obj/machinery/door/airlock/deconstruct(disassembled = TRUE, mob/user) - if(!(obj_flags & NO_DECONSTRUCTION)) - var/obj/structure/door_assembly/A - if(assemblytype) - A = new assemblytype(loc) - else - A = new /obj/structure/door_assembly(loc) - //If you come across a null assemblytype, it will produce the default assembly instead of disintegrating. - prepare_deconstruction_assembly(A) - - if(!disassembled) - A?.update_integrity(A.max_integrity * 0.5) - else if(obj_flags & EMAGGED) - if(user) - to_chat(user, span_warning("You discard the damaged electronics.")) - else - if(user) - to_chat(user, span_notice("You remove the airlock electronics.")) - - var/obj/item/electronics/airlock/ae - if(!electronics) - ae = new/obj/item/electronics/airlock(loc) - if(length(req_one_access)) - ae.one_access = 1 - ae.accesses = req_one_access - else - ae.accesses = req_access +/obj/machinery/door/airlock/on_deconstruction(disassembled) + var/obj/structure/door_assembly/A + if(assemblytype) + A = new assemblytype(loc) + else + A = new /obj/structure/door_assembly(loc) + //If you come across a null assemblytype, it will produce the default assembly instead of disintegrating. + prepare_deconstruction_assembly(A) + + if(!disassembled) + A?.update_integrity(A.max_integrity * 0.5) + else if(obj_flags & EMAGGED) + //no electronics nothing + else + var/obj/item/electronics/airlock/ae + if(!electronics) + ae = new/obj/item/electronics/airlock(loc) + if(length(req_one_access)) + ae.one_access = 1 + ae.accesses = req_one_access else - ae = electronics - electronics = null - ae.forceMove(drop_location()) - qdel(src) + ae.accesses = req_access + else + ae = electronics + electronics = null + ae.forceMove(drop_location()) /obj/machinery/door/airlock/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) switch(the_rcd.mode) diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 8c6e5174a28..279119bd21e 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -74,9 +74,12 @@ /obj/machinery/door/firedoor/Initialize(mapload) . = ..() + id_tag = assign_random_name() soundloop = new(src, FALSE) CalculateAffectingAreas() my_area = get_area(src) + if(name == initial(name)) + update_name() if(!merger_typecache) merger_typecache = typecacheof(/obj/machinery/door/firedoor) @@ -180,6 +183,10 @@ return . +/obj/machinery/door/firedoor/update_name(updates) + . = ..() + name = "[get_area_name(my_area)] [initial(name)] [id_tag]" + /** * Calculates what areas we should worry about. * @@ -272,11 +279,14 @@ /obj/machinery/door/firedoor/proc/check_atmos(turf/checked_turf) var/datum/gas_mixture/environment = checked_turf.return_air() + if(!environment) + stack_trace("We tried to check a gas_mixture that doesn't exist for its firetype, what are you DOING") + return var/pressure = environment?.return_pressure() //NOVA EDIT ADDITION - Micro optimisation - if(environment?.temperature >= BODYTEMP_HEAT_DAMAGE_LIMIT || pressure > WARNING_HIGH_PRESSURE) //NOVA EDIT CHANGE - BETTER LOCKS + if(environment.temperature >= FIRE_MINIMUM_TEMPERATURE_TO_EXIST || pressure > WARNING_HIGH_PRESSURE) //NOVA EDIT CHANGE ADDITION - ORIGINAL: if(environment.temperature >= FIRE_MINIMUM_TEMPERATURE_TO_EXIST) return FIRELOCK_ALARM_TYPE_HOT - if(environment?.temperature <= BODYTEMP_COLD_DAMAGE_LIMIT || pressure < WARNING_LOW_PRESSURE) //NOVA EDIT CHANGE - BETTER LOCKS + if(environment.temperature <= BODYTEMP_COLD_DAMAGE_LIMIT || pressure < WARNING_LOW_PRESSURE) //NOVA EDIT CHANGE ADDITION - ORIGINAL: if(environment.temperature <= BODYTEMP_COLD_DAMAGE_LIMIT) return FIRELOCK_ALARM_TYPE_COLD return @@ -321,6 +331,8 @@ return //We're already active soundloop.start() is_playing_alarm = TRUE + my_area.fault_status = AREA_FAULT_AUTOMATIC + my_area.fault_location = name var/datum/merger/merge_group = GetMergeGroup(merger_id, merger_typecache) for(var/obj/machinery/door/firedoor/buddylock as anything in merge_group.members) buddylock.activate(code) @@ -333,6 +345,8 @@ /obj/machinery/door/firedoor/proc/start_deactivation_process() soundloop.stop() is_playing_alarm = FALSE + my_area.fault_status = AREA_FAULT_NONE + my_area.fault_location = null var/datum/merger/merge_group = GetMergeGroup(merger_id, merger_typecache) for(var/obj/machinery/door/firedoor/buddylock as anything in merge_group.members) buddylock.reset() @@ -369,7 +383,7 @@ if(LAZYLEN(place.active_firelocks) != 1) continue //if we're the first to activate in this particular area - place.set_fire_effect(TRUE) //bathe in red + place.set_fire_effect(TRUE, AREA_FAULT_AUTOMATIC, name) //bathe in red if(place == my_area) // We'll limit our reporting to just the area we're on. If the issue affects bordering areas, they can report it themselves place.alarm_manager.send_alarm(ALARM_FIRE, place) @@ -429,7 +443,7 @@ LAZYREMOVE(place.active_firelocks, src) if(LAZYLEN(place.active_firelocks)) // If we were the last firelock still active, clear the area effects continue - place.set_fire_effect(FALSE) + place.set_fire_effect(FALSE, AREA_FAULT_NONE, name) if(place == my_area) place.alarm_manager.clear_alarm(ALARM_FIRE, place) @@ -656,20 +670,18 @@ if(old_activity != active) //Something changed while we were sleeping correct_state() //So we should re-evaluate our state -/obj/machinery/door/firedoor/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - var/turf/targetloc = get_turf(src) - if(disassembled || prob(40)) - var/obj/structure/firelock_frame/unbuilt_lock = new assemblytype(targetloc) - if(disassembled) - unbuilt_lock.constructionStep = CONSTRUCTION_PANEL_OPEN - else - unbuilt_lock.constructionStep = CONSTRUCTION_NO_CIRCUIT - unbuilt_lock.update_integrity(unbuilt_lock.max_integrity * 0.5) - unbuilt_lock.update_appearance() +/obj/machinery/door/firedoor/on_deconstruction(disassembled) + var/turf/targetloc = get_turf(src) + if(disassembled || prob(40)) + var/obj/structure/firelock_frame/unbuilt_lock = new assemblytype(targetloc) + if(disassembled) + unbuilt_lock.constructionStep = CONSTRUCTION_PANEL_OPEN else - new /obj/item/electronics/firelock (targetloc) - qdel(src) + unbuilt_lock.constructionStep = CONSTRUCTION_NO_CIRCUIT + unbuilt_lock.update_integrity(unbuilt_lock.max_integrity * 0.5) + unbuilt_lock.update_appearance() + else + new /obj/item/electronics/firelock (targetloc) /obj/machinery/door/firedoor/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) . = ..() diff --git a/code/game/machinery/doors/shutters.dm b/code/game/machinery/doors/shutters.dm index 5d390019f9b..eca8d88da4b 100644 --- a/code/game/machinery/doors/shutters.dm +++ b/code/game/machinery/doors/shutters.dm @@ -66,3 +66,12 @@ /obj/machinery/door/poddoor/shutters/window/preopen icon_state = "open" density = FALSE + +/obj/machinery/door/poddoor/shutters/window/indestructible + name = "hardened windowed shutters" + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + +/obj/machinery/door/poddoor/shutters/window/indestructible/preopen + icon_state = "open" + density = FALSE + opacity = FALSE diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 9179dbaf94f..bbe443bf380 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -14,7 +14,7 @@ visible = FALSE flags_1 = ON_BORDER_1 opacity = FALSE - pass_flags_self = PASSGLASS + pass_flags_self = PASSGLASS | PASSWINDOW can_atmos_pass = ATMOS_PASS_PROC interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON | INTERACT_MACHINE_REQUIRES_SILICON | INTERACT_MACHINE_OPEN set_dir_on_move = FALSE @@ -301,15 +301,16 @@ playsound(src, 'sound/items/welder.ogg', 100, TRUE) -/obj/machinery/door/window/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION) && !disassembled) - for(var/i in 1 to shards) - drop_debris(new /obj/item/shard(src)) - if(rods) - drop_debris(new /obj/item/stack/rods(src, rods)) - if(cable) - drop_debris(new /obj/item/stack/cable_coil(src, cable)) - qdel(src) +/obj/machinery/door/window/on_deconstruction(disassembled) + if(disassembled) + return + + for(var/i in 1 to shards) + drop_debris(new /obj/item/shard(src)) + if(rods) + drop_debris(new /obj/item/stack/rods(src, rods)) + if(cable) + drop_debris(new /obj/item/stack/cable_coil(src, cable)) /obj/machinery/door/window/proc/drop_debris(obj/item/debris) debris.forceMove(loc) diff --git a/code/game/machinery/droneDispenser.dm b/code/game/machinery/droneDispenser.dm index 1d428e7547e..91e7d1a3d48 100644 --- a/code/game/machinery/droneDispenser.dm +++ b/code/game/machinery/droneDispenser.dm @@ -260,11 +260,6 @@ if(break_sound) playsound(src, break_sound, 50, TRUE) -/obj/machinery/drone_dispenser/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - new /obj/item/stack/sheet/iron(loc, 5) - qdel(src) - #undef DRONE_PRODUCTION #undef DRONE_RECHARGING #undef DRONE_READY diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index cef15f43caa..85225abef5f 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -42,11 +42,12 @@ /obj/machinery/firealarm/Initialize(mapload, dir, building) . = ..() + id_tag = assign_random_name() if(building) buildstage = FIRE_ALARM_BUILD_NO_CIRCUIT set_panel_open(TRUE) if(name == initial(name)) - name = "[get_area_name(src)] [initial(name)]" + update_name() my_area = get_area(src) LAZYADD(my_area.firealarms, src) @@ -114,7 +115,7 @@ /obj/machinery/firealarm/update_name(updates) . = ..() - name = "[get_area_name(my_area)] [initial(name)]" + name = "[get_area_name(my_area)] [initial(name)] [id_tag]" /obj/machinery/firealarm/on_exit_area(datum/source, area/area_to_unregister) //we cannot unregister from an area we never registered to in the first place @@ -269,6 +270,8 @@ if(user) balloon_alert(user, "triggered alarm!") user.log_message("triggered a fire alarm.", LOG_GAME) + my_area.fault_status = AREA_FAULT_MANUAL + my_area.fault_location = name soundloop.start() //Manually pulled fire alarms will make the sound, rather than the doors. SEND_SIGNAL(src, COMSIG_FIREALARM_ON_TRIGGER) update_use_power(ACTIVE_POWER_USE) @@ -450,22 +453,21 @@ return return ..() -/obj/machinery/firealarm/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - new /obj/item/stack/sheet/iron(loc, 1) - if(buildstage > FIRE_ALARM_BUILD_NO_CIRCUIT) - var/obj/item/item = new /obj/item/electronics/firealarm(loc) - if(!disassembled) - item.update_integrity(item.max_integrity * 0.5) - if(buildstage > FIRE_ALARM_BUILD_NO_WIRES) - new /obj/item/stack/cable_coil(loc, 3) - qdel(src) +/obj/machinery/firealarm/on_deconstruction(disassembled) + new /obj/item/stack/sheet/iron(loc, 1) + if(buildstage > FIRE_ALARM_BUILD_NO_CIRCUIT) + var/obj/item/item = new /obj/item/electronics/firealarm(loc) + if(!disassembled) + item.update_integrity(item.max_integrity * 0.5) + if(buildstage > FIRE_ALARM_BUILD_NO_WIRES) + new /obj/item/stack/cable_coil(loc, 3) // Allows users to examine the state of the thermal sensor /obj/machinery/firealarm/examine(mob/user) . = ..() if((my_area?.fire || LAZYLEN(my_area?.active_firelocks))) . += "The local area hazard light is flashing." + . += "The fault location display is [my_area.fault_location] ([my_area.fault_status == AREA_FAULT_AUTOMATIC ? "Automatic Detection" : "Manual Trigger"])." if(is_station_level(z)) . += "The station security alert level is [SSsecurity_level.get_current_level_as_text()]." . += "Left-Click to activate all firelocks in this area." diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index efe28051a21..678b2c65509 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -144,18 +144,16 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/flasher, 26) bulb.burn_out() power_change() -/obj/machinery/flasher/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - if(bulb) - bulb.forceMove(loc) - if(disassembled) - var/obj/item/wallframe/flasher/flasher_obj = new(get_turf(src)) - transfer_fingerprints_to(flasher_obj) - flasher_obj.id = id - playsound(loc, 'sound/items/deconstruct.ogg', 50, TRUE) - else - new /obj/item/stack/sheet/iron (loc, 2) - qdel(src) +/obj/machinery/flasher/on_deconstruction(disassembled) + if(bulb) + bulb.forceMove(loc) + if(disassembled) + var/obj/item/wallframe/flasher/flasher_obj = new(get_turf(src)) + transfer_fingerprints_to(flasher_obj) + flasher_obj.id = id + playsound(loc, 'sound/items/deconstruct.ogg', 50, TRUE) + else + new /obj/item/stack/sheet/iron (loc, 2) /obj/machinery/flasher/portable //Portable version of the flasher. Only flashes when anchored name = "portable flasher" diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm index a28f855862a..75d0566e42c 100644 --- a/code/game/machinery/igniter.dm +++ b/code/game/machinery/igniter.dm @@ -55,11 +55,9 @@ deconstruct(TRUE) return ITEM_INTERACT_SUCCESS -/obj/machinery/igniter/deconstruct(disassembled) - if(!(obj_flags & NO_DECONSTRUCTION)) - new /obj/item/stack/sheet/iron(loc, 5) - new /obj/item/assembly/igniter(loc) - return ..() +/obj/machinery/igniter/on_deconstruction(disassembled) + new /obj/item/stack/sheet/iron(loc, 5) + new /obj/item/assembly/igniter(loc) /obj/machinery/igniter/multitool_act(mob/living/user, obj/item/tool) var/change_id = tgui_input_number(user, "Set the igniter controller's ID", "Igniter ID", id, 100) @@ -200,10 +198,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/sparker, 26) deconstruct(TRUE) return ITEM_INTERACT_SUCCESS -/obj/machinery/sparker/deconstruct(disassembled) - if(!(obj_flags & NO_DECONSTRUCTION)) - new /obj/item/wallframe/sparker(loc) - return ..() +/obj/machinery/sparker/on_deconstruction(disassembled) + new /obj/item/wallframe/sparker(loc) /obj/machinery/sparker/multitool_act(mob/living/user, obj/item/tool) var/change_id = tgui_input_number(user, "Set the sparker controller's ID", "Sparker ID", id, 100) diff --git a/code/game/machinery/incident_display.dm b/code/game/machinery/incident_display.dm index 63418e4457e..fcdfecf6a31 100644 --- a/code/game/machinery/incident_display.dm +++ b/code/game/machinery/incident_display.dm @@ -164,16 +164,11 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/incident_display/tram, 32) delam_record = rand(1,99) update_appearance() -/obj/machinery/incident_display/deconstruct() - if(obj_flags & NO_DECONSTRUCTION) - return - +/obj/machinery/incident_display/on_deconstruction(disassembled) new /obj/item/stack/sheet/mineral/titanium(drop_location(), 2) new /obj/item/shard(drop_location()) new /obj/item/shard(drop_location()) - qdel(src) - /obj/machinery/incident_display/proc/update_delam_count(new_count, record) delam_record = record last_delam = min(new_count, 199) diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index 25e963ad6d5..6244dcdd2db 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -217,10 +217,8 @@ return ..() set_transfer_rate(transfer_rate > MIN_IV_TRANSFER_RATE ? MIN_IV_TRANSFER_RATE : MAX_IV_TRANSFER_RATE) -/obj/machinery/iv_drip/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - new /obj/item/stack/sheet/iron(loc) - qdel(src) +/obj/machinery/iv_drip/on_deconstruction(disassembled = TRUE) + new /obj/item/stack/sheet/iron(loc) /obj/machinery/iv_drip/process(seconds_per_tick) if(!attached) diff --git a/code/game/machinery/launch_pad.dm b/code/game/machinery/launch_pad.dm index 910f3802bfd..a950750f4d8 100644 --- a/code/game/machinery/launch_pad.dm +++ b/code/game/machinery/launch_pad.dm @@ -152,7 +152,7 @@ return "ERROR: Launchpad busy." var/area/surrounding = get_area(src) - if(is_centcom_level(z) || istype(surrounding, /area/shuttle)) + if(is_centcom_level(z) || istype(surrounding, /area/shuttle/supply) ||istype(surrounding, /area/shuttle/transport)) return "ERROR: Launchpad not operative. Heavy area shielding makes teleporting impossible." return null diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm index 0c621c6ed19..243cb8f4116 100644 --- a/code/game/machinery/lightswitch.dm +++ b/code/game/machinery/lightswitch.dm @@ -107,10 +107,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/light_switch, 26) if(!(machine_stat & (BROKEN|NOPOWER))) power_change() -/obj/machinery/light_switch/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - new /obj/item/wallframe/light_switch(loc) - qdel(src) +/obj/machinery/light_switch/on_deconstruction(disassembled) + new /obj/item/wallframe/light_switch(loc) /obj/item/wallframe/light_switch name = "light switch" diff --git a/code/game/machinery/limbgrower.dm b/code/game/machinery/limbgrower.dm index 0e81f839838..197feb4118d 100644 --- a/code/game/machinery/limbgrower.dm +++ b/code/game/machinery/limbgrower.dm @@ -116,7 +116,7 @@ return data -/obj/machinery/limbgrower/on_deconstruction() +/obj/machinery/limbgrower/on_deconstruction(disassembled) for(var/obj/item/reagent_containers/cup/our_beaker in component_parts) reagents.trans_to(our_beaker, our_beaker.reagents.maximum_volume) return ..() diff --git a/code/game/machinery/newscaster/newscaster_machine.dm b/code/game/machinery/newscaster/newscaster_machine.dm index e667fe5b96f..7f3d8ea806f 100644 --- a/code/game/machinery/newscaster/newscaster_machine.dm +++ b/code/game/machinery/newscaster/newscaster_machine.dm @@ -534,12 +534,10 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/newscaster, 30) playsound(src.loc, 'sound/items/welder.ogg', 100, TRUE) -/obj/machinery/newscaster/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - new /obj/item/stack/sheet/iron(loc, 2) - new /obj/item/shard(loc) - new /obj/item/shard(loc) - qdel(src) +/obj/machinery/newscaster/on_deconstruction(disassembled) + new /obj/item/stack/sheet/iron(loc, 2) + new /obj/item/shard(loc) + new /obj/item/shard(loc) /obj/machinery/newscaster/atom_break(damage_flag) . = ..() diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index 76b1b73ba53..d0c0744f19e 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -402,9 +402,6 @@ DEFINE_BITFIELD(turret_flags, list( /obj/machinery/porta_turret/proc/reset_attacked() turret_flags &= ~TURRET_FLAG_SHOOT_ALL_REACT -/obj/machinery/porta_turret/deconstruct(disassembled = TRUE) - qdel(src) - /obj/machinery/porta_turret/atom_break(damage_flag) . = ..() if(.) diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index f9747843d57..12a9ec25284 100755 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -13,8 +13,6 @@ var/finished_recharging = FALSE var/static/list/allowed_devices = typecacheof(list( - /obj/item/stock_parts/cell/microfusion, //NOVA EDIT ADDITION - /obj/item/gun/microfusion, // NOVA EDIT ADDITION /obj/item/gun/energy, /obj/item/melee/baton/security, /obj/item/ammo_box/magazine/recharge, @@ -99,21 +97,6 @@ if(!energy_gun.can_charge) to_chat(user, span_notice("Your gun has no external power connector.")) return TRUE - - //NOVA EDIT ADDITION - if (istype(attacking_item, /obj/item/gun/microfusion)) - var/obj/item/gun/microfusion/microfusion_gun = attacking_item - if(microfusion_gun.cell?.chargerate <= 0) - to_chat(user, span_notice("[microfusion_gun] cannot be recharged!")) - return TRUE - - if (istype(attacking_item, /obj/item/stock_parts/cell/microfusion)) - var/obj/item/stock_parts/cell/microfusion/inserting_cell = attacking_item - if(inserting_cell.chargerate <= 0) - to_chat(user, span_notice("[inserting_cell] cannot be recharged!")) - return TRUE - //NOVA EDIT END - user.transferItemToLoc(attacking_item, src) return TRUE diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm index 0f6002c9725..1014393c008 100644 --- a/code/game/machinery/recycler.dm +++ b/code/game/machinery/recycler.dm @@ -83,6 +83,12 @@ default_unfasten_wrench(user, tool) return ITEM_INTERACT_SUCCESS +/obj/machinery/recycler/can_be_unfasten_wrench(mob/user, silent) + if(!(isfloorturf(loc) || isindestructiblefloor(loc)) && !anchored) + to_chat(user, span_warning("[src] needs to be on the floor to be secured!")) + return FAILED_UNFASTEN + return SUCCESSFUL_UNFASTEN + /obj/machinery/recycler/attackby(obj/item/I, mob/user, params) if(default_deconstruction_screwdriver(user, "grinder-oOpen", "grinder-o0", I)) return @@ -241,7 +247,7 @@ L.Unconscious(100) L.adjustBruteLoss(crush_damage) -/obj/machinery/recycler/on_deconstruction() +/obj/machinery/recycler/on_deconstruction(disassembled) safety_mode = TRUE /obj/machinery/recycler/deathtrap diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index 1d0f00517dd..11ed91914c2 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -394,10 +394,8 @@ GLOBAL_LIST_EMPTY(req_console_ckey_departments) return return ..() -/obj/machinery/requests_console/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - new /obj/item/wallframe/requests_console(loc) - qdel(src) +/obj/machinery/requests_console/on_deconstruction(disassembled) + new /obj/item/wallframe/requests_console(loc) /obj/machinery/requests_console/auto_name // Register an autoname variant and then make the directional helpers before undefing all the magic bits auto_name = TRUE diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index 7660e9cf803..0483b258ae6 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -81,7 +81,7 @@ set_panel_open(TRUE) QDEL_NULL(cell) -/obj/machinery/space_heater/on_deconstruction() +/obj/machinery/space_heater/on_deconstruction(disassembled) if(cell) LAZYADD(component_parts, cell) cell = null diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm index fae7ee98d09..6284b8eef9d 100644 --- a/code/game/machinery/status_display.dm +++ b/code/game/machinery/status_display.dm @@ -72,16 +72,13 @@ update_appearance() return TRUE -/obj/machinery/status_display/deconstruct(disassembled = TRUE) - if(obj_flags & NO_DECONSTRUCTION) - return +/obj/machinery/status_display/on_deconstruction(disassembled) if(!disassembled) new /obj/item/stack/sheet/iron(drop_location(), 2) new /obj/item/shard(drop_location()) new /obj/item/shard(drop_location()) else new /obj/item/wallframe/status_display(drop_location()) - qdel(src) /// Immediately change the display to the given picture. /obj/machinery/status_display/proc/set_picture(state) @@ -549,6 +546,19 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/status_display/ai, 32) connected_display.receive_signal(status_signal) +/obj/machinery/status_display/random_message + current_mode = SD_MESSAGE + /// list to pick the first line from + var/list/firstline_to_secondline = list() + +/obj/machinery/status_display/random_message/Initialize(mapload, ndir, building) + if(firstline_to_secondline?.len) + message1 = pick(firstline_to_secondline) + message2 = firstline_to_secondline[message1] + return ..() // status displays call update appearance on init so i suppose we should set the messages before calling parent as to not call it twice + +MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/status_display/random_message, 32) + #undef MAX_STATIC_WIDTH #undef FONT_STYLE #undef SCROLL_RATE diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 0bf6bf7872d..b34f7873648 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -307,13 +307,9 @@ storage = null set_occupant(null) -/obj/machinery/suit_storage_unit/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - open_machine() - dump_inventory_contents() - if(card_reader_installed) - new /obj/item/stock_parts/card_reader(loc) - return ..() +/obj/machinery/suit_storage_unit/on_deconstruction(disassembled) + if(card_reader_installed) + new /obj/item/stock_parts/card_reader(loc) /obj/machinery/suit_storage_unit/proc/access_check(mob/living/user) if(!isnull(id_card)) diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index 2f150d109f7..fd0fea92292 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -415,10 +415,8 @@ GLOBAL_LIST_INIT(dye_registry, list( /obj/machinery/washing_machine/attack_ai_secondary(mob/user, modifiers) return attack_hand_secondary(user, modifiers) -/obj/machinery/washing_machine/deconstruct(disassembled = TRUE) - if (!(obj_flags & NO_DECONSTRUCTION)) - new /obj/item/stack/sheet/iron(drop_location(), 2) - qdel(src) +/obj/machinery/washing_machine/on_deconstruction(disassembled) + new /obj/item/stack/sheet/iron(drop_location(), 2) /obj/machinery/washing_machine/open_machine(drop = TRUE, density_to_set = FALSE) . = ..() diff --git a/code/game/objects/effects/anomalies/_anomalies.dm b/code/game/objects/effects/anomalies/_anomalies.dm index 02c3e024c2a..530da562827 100644 --- a/code/game/objects/effects/anomalies/_anomalies.dm +++ b/code/game/objects/effects/anomalies/_anomalies.dm @@ -27,7 +27,8 @@ /obj/effect/anomaly/Initialize(mapload, new_lifespan, drops_core = TRUE) . = ..() - SSpoints_of_interest.make_point_of_interest(src) + if(!mapload) + SSpoints_of_interest.make_point_of_interest(src) START_PROCESSING(SSobj, src) impact_area = get_area(src) diff --git a/code/game/objects/effects/decals/cleanable/humans.dm b/code/game/objects/effects/decals/cleanable/humans.dm index b195f115d46..01b26ee3de6 100644 --- a/code/game/objects/effects/decals/cleanable/humans.dm +++ b/code/game/objects/effects/decals/cleanable/humans.dm @@ -115,6 +115,7 @@ /obj/effect/decal/cleanable/blood/gibs/Initialize(mapload, list/datum/disease/diseases) . = ..() + AddElement(/datum/element/squish_sound) RegisterSignal(src, COMSIG_MOVABLE_PIPE_EJECTING, PROC_REF(on_pipe_eject)) /obj/effect/decal/cleanable/blood/gibs/Destroy() @@ -133,11 +134,6 @@ /obj/effect/decal/cleanable/blood/gibs/ex_act(severity, target) return FALSE -/obj/effect/decal/cleanable/blood/gibs/on_entered(datum/source, atom/movable/L) - if(isliving(L) && has_gravity(loc)) - playsound(loc, 'sound/effects/footstep/gib_step.ogg', HAS_TRAIT(L, TRAIT_LIGHT_STEP) ? 20 : 50, TRUE) - return ..() - /obj/effect/decal/cleanable/blood/gibs/proc/on_pipe_eject(atom/source, direction) SIGNAL_HANDLER diff --git a/code/game/objects/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm index c93b105767a..7fe6c59075f 100644 --- a/code/game/objects/effects/decals/cleanable/misc.dm +++ b/code/game/objects/effects/decals/cleanable/misc.dm @@ -403,6 +403,7 @@ /obj/effect/decal/cleanable/ants/fire name = "space fire ants" desc = "A small colony no longer. We are the fire nation." + decal_reagent = /datum/reagent/ants/fire icon_state = "fire_ants" mergeable_decal = FALSE @@ -485,6 +486,9 @@ ignite() return ..() +/obj/effect/decal/cleanable/fuel_pool/hivis + icon_state = "fuel_pool_hivis" + /obj/effect/decal/cleanable/rubble name = "rubble" desc = "A pile of rubble." diff --git a/code/game/objects/effects/effect_system/effects_sparks.dm b/code/game/objects/effects/effect_system/effects_sparks.dm index 86800d0522c..c3fad6d26b6 100644 --- a/code/game/objects/effects/effect_system/effects_sparks.dm +++ b/code/game/objects/effects/effect_system/effects_sparks.dm @@ -16,7 +16,7 @@ name = "sparks" icon_state = "sparks" anchored = TRUE - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 2 light_power = 0.5 light_color = LIGHT_COLOR_FIRE diff --git a/code/game/objects/effects/lighting.dm b/code/game/objects/effects/lighting.dm index 4e95e72f429..1de9fad39ee 100644 --- a/code/game/objects/effects/lighting.dm +++ b/code/game/objects/effects/lighting.dm @@ -8,7 +8,7 @@ name = "lighting" desc = "Tell a coder if you're seeing this." icon_state = "nothing" - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = MINIMUM_USEFUL_LIGHT_RANGE light_color = COLOR_WHITE blocks_emissive = EMISSIVE_BLOCK_NONE diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index e63e7e39c4a..cd8a859f86f 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -117,8 +117,7 @@ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread s.set_up(3, 1, src) s.start() - if(ismob(triggerer)) - mineEffect(triggerer) + mineEffect(triggerer) triggered = TRUE SEND_SIGNAL(src, COMSIG_MINE_TRIGGERED, triggerer) qdel(src) diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm index 091b4700673..8c52a76dbc0 100644 --- a/code/game/objects/effects/portals.dm +++ b/code/game/objects/effects/portals.dm @@ -18,7 +18,7 @@ anchored = TRUE density = TRUE // dense for receiving bumbs layer = HIGH_OBJ_LAYER - light_system = STATIC_LIGHT + light_system = COMPLEX_LIGHT light_range = 3 light_power = 1 light_on = TRUE diff --git a/code/game/objects/effects/spawners/random/bedsheet.dm b/code/game/objects/effects/spawners/random/bedsheet.dm new file mode 100644 index 00000000000..3fb39c5de4a --- /dev/null +++ b/code/game/objects/effects/spawners/random/bedsheet.dm @@ -0,0 +1,64 @@ +/obj/effect/spawner/random/bedsheet + name = "random dorm bedsheet" + icon_state = "random_bedsheet" + loot = list(/obj/item/bedsheet = 8, + /obj/item/bedsheet/blue = 8, + /obj/item/bedsheet/green = 8, + /obj/item/bedsheet/grey = 8, + /obj/item/bedsheet/orange = 8, + /obj/item/bedsheet/purple = 8, + /obj/item/bedsheet/red = 8, + /obj/item/bedsheet/yellow = 8, + /obj/item/bedsheet/brown = 8, + /obj/item/bedsheet/black = 8, + /obj/item/bedsheet/patriot = 2, + /obj/item/bedsheet/rainbow = 2, + /obj/item/bedsheet/ian = 2, + /obj/item/bedsheet/runtime = 2, + /obj/item/bedsheet/cosmos = 2, + /obj/item/bedsheet/nanotrasen = 2, + /obj/item/bedsheet/pirate = 2, + /obj/item/bedsheet/gondola = 1, + ) + +/obj/effect/spawner/random/bedsheet/double + name = "random dorm double bedsheet" + icon_state = "random_doublesheet" + loot = list( + /obj/item/bedsheet/double = 4, + /obj/item/bedsheet/blue/double = 4, + /obj/item/bedsheet/green/double = 4, + /obj/item/bedsheet/grey/double = 4, + /obj/item/bedsheet/orange/double = 4, + /obj/item/bedsheet/purple/double = 4, + /obj/item/bedsheet/red/double = 4, + /obj/item/bedsheet/yellow/double = 4, + /obj/item/bedsheet/brown/double = 4, + /obj/item/bedsheet/black/double = 4, + /obj/item/bedsheet/patriot/double = 1, + /obj/item/bedsheet/rainbow/double = 1, + /obj/item/bedsheet/ian/double = 1, + /obj/item/bedsheet/runtime/double = 1, + /obj/item/bedsheet/cosmos/double = 1, + /obj/item/bedsheet/nanotrasen/double = 1, + ) + +/obj/effect/spawner/random/bedsheet/any + name = "random single bedsheet" + loot = null + var/static/list/bedsheet_list = list() + var/spawn_type = BEDSHEET_SINGLE + +/obj/effect/spawner/random/bedsheet/any/Initialize(mapload) + if(isnull(bedsheet_list[spawn_type])) + var/list/spawn_list = list() + for(var/obj/item/bedsheet/sheet as anything in typesof(/obj/item/bedsheet)) + if(initial(sheet.bedsheet_type) == spawn_type) + spawn_list += sheet + bedsheet_list[spawn_type] = spawn_list + loot = bedsheet_list[spawn_type] + return ..() + +/obj/effect/spawner/random/bedsheet/any/double + icon_state = "random_doublesheet" + spawn_type = BEDSHEET_DOUBLE diff --git a/code/game/objects/effects/step_triggers.dm b/code/game/objects/effects/step_triggers.dm index a014857994a..ecfa560bfe6 100644 --- a/code/game/objects/effects/step_triggers.dm +++ b/code/game/objects/effects/step_triggers.dm @@ -19,7 +19,7 @@ /obj/effect/step_trigger/proc/on_entered(datum/source, H as mob|obj) SIGNAL_HANDLER - if(!H) + if(!H || H == src) return if(isobserver(H) && !affect_ghosts) return @@ -138,6 +138,26 @@ if (T) A.forceMove(T) +/* Teleports atoms directly to an offset, no randomness, looping hallways! */ + +/obj/effect/step_trigger/teleporter/offset + var/teleport_x_offset = 0 + var/teleport_y_offset = 0 + +/obj/effect/step_trigger/teleporter/offset/on_entered(datum/source, H as mob|obj, atom/old_loc) + if(!old_loc?.Adjacent(loc)) // prevents looping, if we were teleported into this then the old loc is usually not adjacent + return + return ..() + +/obj/effect/step_trigger/teleporter/offset/Trigger(atom/movable/poor_soul) + var/turf/destination = locate(x + teleport_x_offset, y + teleport_y_offset, z) + if(!destination) + return + poor_soul.forceMove(destination) + var/mob/living/living_soul = poor_soul + if(istype(living_soul) && living_soul.client) + living_soul.client.move_delay = 0 + /* Fancy teleporter, creates sparks and smokes when used */ /obj/effect/step_trigger/teleport_fancy diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index c82164dd7f4..ba9e4912aff 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -545,20 +545,20 @@ return return attempt_pickup(user) -/obj/item/proc/attempt_pickup(mob/user) +/obj/item/proc/attempt_pickup(mob/user, skip_grav = FALSE) . = TRUE if(!(interaction_flags_item & INTERACT_ITEM_ATTACK_HAND_PICKUP)) //See if we're supposed to auto pickup. return - //Heavy gravity makes picking up things very slow. - var/grav = user.has_gravity() - if(grav > STANDARD_GRAVITY) - var/grav_power = min(3,grav - STANDARD_GRAVITY) - to_chat(user,span_notice("You start picking up [src]...")) - if(!do_after(user, 30 * grav_power, src)) - return - + if(!skip_grav) + //Heavy gravity makes picking up things very slow. + var/grav = user.has_gravity() + if(grav > STANDARD_GRAVITY) + var/grav_power = min(3,grav - STANDARD_GRAVITY) + to_chat(user,span_notice("You start picking up [src]...")) + if(!do_after(user, 30 * grav_power, src)) + return //If the item is in a storage item, take it out var/outside_storage = !loc.atom_storage diff --git a/code/game/objects/items/cardboard_cutouts.dm b/code/game/objects/items/cardboard_cutouts.dm index f58ea90211d..97f9c29491e 100644 --- a/code/game/objects/items/cardboard_cutouts.dm +++ b/code/game/objects/items/cardboard_cutouts.dm @@ -14,11 +14,19 @@ var/deceptive = FALSE /// What cutout datum we spawn at the start? Uses the name, not the path. var/starting_cutout + /// Reference to the tactical component that should be deleted when the cutout is toppled. + var/datum/component/tactical/tacticool /obj/item/cardboard_cutout/Initialize(mapload) . = ..() if(starting_cutout) return INITIALIZE_HINT_LATELOAD + if(!pushed_over) + AddComponent(/datum/component/tactical) + +/obj/item/cardboard_cutout/Destroy() + tacticool = null + return ..() /obj/item/cardboard_cutout/LateInitialize() ASSERT(!isnull(starting_cutout)) @@ -33,6 +41,8 @@ ASSERT(!isnull(cutout), "No cutout found with name [starting_cutout]") cutout.apply(src) + if(!pushed_over) + tacticool = AddComponent(/datum/component/tactical) //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/item/cardboard_cutout/attack_hand(mob/living/user, list/modifiers) @@ -42,12 +52,22 @@ playsound(src, 'sound/weapons/genhit.ogg', 50, TRUE) push_over() +/obj/item/cardboard_cutout/equipped(mob/living/user, slot) + . = ..() + //Because of the tactical element, the user won't tilt left and right, but it'll still hop. + user.AddElementTrait(TRAIT_WADDLING, REF(src), /datum/element/waddling) + +/obj/item/cardboard_cutout/dropped(mob/living/user) + . = ..() + REMOVE_TRAIT(user, TRAIT_WADDLING, REF(src)) + /obj/item/cardboard_cutout/proc/push_over() appearance = initial(appearance) desc = "[initial(desc)] It's been pushed over." icon_state = "cutout_pushed_over" remove_atom_colour(FIXED_COLOUR_PRIORITY) pushed_over = TRUE + QDEL_NULL(tacticool) /obj/item/cardboard_cutout/attack_self(mob/living/user) if(!pushed_over) @@ -57,6 +77,7 @@ icon = initial(icon) icon_state = initial(icon_state) //This resets a cutout to its blank state - this is intentional to allow for resetting pushed_over = FALSE + tacticool = AddComponent(/datum/component/tactical) /obj/item/cardboard_cutout/attackby(obj/item/I, mob/living/user, params) if(istype(I, /obj/item/toy/crayon)) @@ -100,7 +121,7 @@ for (var/datum/cardboard_cutout/cutout_subtype as anything in subtypesof(/datum/cardboard_cutout)) var/datum/cardboard_cutout/cutout = get_cardboard_cutout_instance(cutout_subtype) appearances_by_name[cutout.name] = cutout - possible_appearances[cutout.name] = image(icon = cutout.applied_appearance) + possible_appearances[cutout.name] = image(icon = cutout.preview_appearance) var/new_appearance = show_radial_menu(user, src, possible_appearances, custom_check = CALLBACK(src, PROC_REF(check_menu), user, crayon), radius = 36, require_near = TRUE) if(!new_appearance) @@ -144,19 +165,16 @@ return FALSE return TRUE -// Cutouts always face forward -/obj/item/cardboard_cutout/setDir(newdir) - SHOULD_CALL_PARENT(FALSE) - return - /obj/item/cardboard_cutout/adaptive //Purchased by Syndicate agents, these cutouts are indistinguishable from normal cutouts but aren't discolored when their appearance is changed deceptive = TRUE /datum/cardboard_cutout /// Name of the cutout, used for radial selection and the global list. var/name = "Boardjak" - /// The appearance we apply to the cardboard cutout. - var/mutable_appearance/applied_appearance = null + /// The appearance of the cardboard cutout that we show in the radial menu. + var/mutable_appearance/preview_appearance + /// A flat appearance, with only one direction, that we apply to the cardboard cutout. + var/image/applied_appearance /// The base name we actually give to to the cardboard cutout. Can be overridden in get_name(). var/applied_name = "boardjak" /// The desc we give to the cardboard cutout. @@ -179,9 +197,9 @@ /datum/cardboard_cutout/New() . = ..() if(direct_icon) - applied_appearance = mutable_appearance(direct_icon, direct_icon_state) + preview_appearance = mutable_appearance(direct_icon, direct_icon_state) else - applied_appearance = get_dynamic_human_appearance(outfit, species, mob_spawner, l_hand, r_hand, animated = FALSE) + preview_appearance = get_dynamic_human_appearance(outfit, species, mob_spawner, l_hand, r_hand, animated = FALSE) /// This proc returns the name that the cardboard cutout item will use. /datum/cardboard_cutout/proc/get_name() @@ -189,9 +207,14 @@ /// This proc sets the cardboard cutout item's vars. /datum/cardboard_cutout/proc/apply(obj/item/cardboard_cutout/cutouts) + if(isnull(applied_appearance)) + applied_appearance = image(fcopy_rsc(getFlatIcon(preview_appearance, no_anim = TRUE))) + applied_appearance.plane = cutouts.plane + applied_appearance.layer = cutouts.layer cutouts.appearance = applied_appearance cutouts.name = get_name() cutouts.desc = applied_desc + cutouts.update_appearance() //forces an update on the tactical comp's appearance. /datum/cardboard_cutout/assistant name = "Assistant" diff --git a/code/game/objects/items/chainsaw.dm b/code/game/objects/items/chainsaw.dm index 0805f6b5233..68501057ebf 100644 --- a/code/game/objects/items/chainsaw.dm +++ b/code/game/objects/items/chainsaw.dm @@ -99,6 +99,28 @@ armour_penetration = 100 force_on = 30 +/obj/item/chainsaw/doomslayer/attack(mob/living/target_mob, mob/living/user, params) + if (target_mob.stat != DEAD) + return ..() + + if (user.zone_selected != BODY_ZONE_HEAD) + return ..() + + var/obj/item/bodypart/head = target_mob.get_bodypart(BODY_ZONE_HEAD) + if (isnull(head)) + return ..() + + playsound(user, 'sound/weapons/slice.ogg', vol = 80, vary = TRUE) + + target_mob.balloon_alert(user, "cutting off head...") + if (!do_after(user, 2 SECONDS, target_mob, extra_checks = CALLBACK(src, PROC_REF(has_same_head), target_mob, head))) + return TRUE + + head.dismember(silent = FALSE) + user.put_in_hands(head) + + return TRUE + /obj/item/chainsaw/doomslayer/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK, damage_type = BRUTE) if(attack_type == PROJECTILE_ATTACK) owner.visible_message(span_danger("Ranged attacks just make [owner] angrier!")) @@ -106,6 +128,9 @@ return TRUE return FALSE +/obj/item/chainsaw/doomslayer/proc/has_same_head(mob/living/target_mob, obj/item/bodypart/head) + return target_mob.get_bodypart(BODY_ZONE_HEAD) == head + /obj/item/chainsaw/mounted_chainsaw name = "mounted chainsaw" desc = "A chainsaw that has replaced your arm." diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm index ee78b11c720..5740f6aaa4d 100644 --- a/code/game/objects/items/cigs_lighters.dm +++ b/code/game/objects/items/cigs_lighters.dm @@ -742,7 +742,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM resistance_flags = FIRE_PROOF grind_results = list(/datum/reagent/iron = 1, /datum/reagent/fuel = 5, /datum/reagent/fuel/oil = 5) custom_price = PAYCHECK_CREW * 1.1 - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 2 light_power = 0.6 light_color = LIGHT_COLOR_FIRE diff --git a/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm index 851e08beb15..1480ac23c5a 100644 --- a/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm @@ -664,6 +664,7 @@ /obj/machinery/vending/imported/mothic = "Nomad Fleet Ration Chit Exchange", //NOVA EDIT ADDITION /obj/machinery/vending/imported/tiziran = "Tiziran Imported Delicacies", //NOVA EDIT ADDITION /obj/machinery/vending/imported/yangyu = "Fudobenda", //NOVA EDIT ADDITION + /obj/machinery/vending/deforest_medvend = "DeForest Med-Vend", //NOVA EDIT ADDITION ) /obj/item/circuitboard/machine/vendor/screwdriver_act(mob/living/user, obj/item/tool) @@ -1565,7 +1566,7 @@ /obj/item/circuitboard/machine/brm name = "Boulder Retrieval Matrix" greyscale_colors = CIRCUIT_COLOR_SUPPLY - build_path = /obj/machinery/bouldertech/brm + build_path = /obj/machinery/brm req_components = list( /datum/stock_part/capacitor = 1, /datum/stock_part/scanning_module = 1, @@ -1577,10 +1578,9 @@ greyscale_colors = CIRCUIT_COLOR_SUPPLY build_path = /obj/machinery/bouldertech/refinery req_components = list( - /obj/item/reagent_containers/cup/beaker = 1, /obj/item/assembly/igniter/condenser = 1, /datum/stock_part/servo = 2, - /datum/stock_part/matter_bin = 1, + /datum/stock_part/matter_bin = 2, ) /obj/item/circuitboard/machine/smelter diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index f7c9b4eda7d..28f5b405821 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -19,7 +19,7 @@ slot_flags = ITEM_SLOT_BELT custom_materials = list(/datum/material/iron= SMALL_MATERIAL_AMOUNT * 0.5, /datum/material/glass= SMALL_MATERIAL_AMOUNT * 0.2) actions_types = list(/datum/action/item_action/toggle_light) - light_system = MOVABLE_LIGHT_DIRECTIONAL + light_system = OVERLAY_LIGHT_DIRECTIONAL light_range = 4 light_power = 1 light_on = FALSE @@ -76,7 +76,7 @@ /obj/item/flashlight/proc/update_brightness() update_appearance(UPDATE_ICON) - if(light_system == STATIC_LIGHT) + if(light_system == COMPLEX_LIGHT) update_light() /obj/item/flashlight/proc/toggle_light(mob/user) @@ -364,7 +364,7 @@ righthand_file = 'icons/mob/inhands/items_righthand.dmi' force = 10 light_range = 3.5 - light_system = STATIC_LIGHT + light_system = COMPLEX_LIGHT light_color = LIGHT_COLOR_FAINT_BLUE w_class = WEIGHT_CLASS_BULKY obj_flags = CONDUCTS_ELECTRICITY @@ -397,7 +397,7 @@ actions_types = list() heat = 1000 light_color = LIGHT_COLOR_FLARE - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT grind_results = list(/datum/reagent/sulfur = 15) sound_on = 'sound/items/match_strike.ogg' toggle_context = FALSE @@ -656,7 +656,7 @@ righthand_file = 'icons/mob/inhands/equipment/mining_righthand.dmi' desc = "A mining lantern." light_range = 6 // luminosity when on - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT /obj/item/flashlight/lantern/heirloom_moth name = "old lantern" @@ -687,7 +687,7 @@ slot_flags = ITEM_SLOT_BELT custom_materials = null light_range = 7 //luminosity when on - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT /obj/item/flashlight/emp special_desc_requirement = EXAMINE_CHECK_SYNDICATE // NOVA EDIT @@ -753,7 +753,7 @@ custom_price = PAYCHECK_LOWER w_class = WEIGHT_CLASS_SMALL light_range = 4 - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT color = LIGHT_COLOR_GREEN icon_state = "glowstick" base_icon_state = "glowstick" @@ -860,7 +860,7 @@ name = "disco light" desc = "Groovy..." icon_state = null - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 4 light_power = 10 alpha = 0 @@ -888,7 +888,7 @@ desc = "A strange device manufactured with mysterious elements that somehow emits darkness. Or maybe it just sucks in light? Nobody knows for sure." icon_state = "flashdark" inhand_icon_state = "flashdark" - light_system = STATIC_LIGHT //The overlay light component is not yet ready to produce darkness. + light_system = COMPLEX_LIGHT //The overlay light component is not yet ready to produce darkness. light_range = 0 ///Variable to preserve old lighting behavior in flashlights, to handle darkness. var/dark_light_range = 2.5 @@ -907,23 +907,15 @@ /obj/item/flashlight/eyelight name = "eyelight" desc = "This shouldn't exist outside of someone's head, how are you seeing this?" - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 15 light_power = 1 obj_flags = CONDUCTS_ELECTRICITY item_flags = DROPDEL actions_types = list() -/obj/item/flashlight/eyelight/adapted - name = "adaptedlight" - desc = "There is no possible way for a player to see this, so I can safely talk at length about why this exists. Adapted eyes come \ - with icons that go above the lighting layer so to make sure the red eyes that pierce the darkness are always visible we make the \ - human emit the smallest amount of light possible. Thanks for reading :)" - light_range = 1 - light_power = 0.07 - /obj/item/flashlight/eyelight/glow - light_system = MOVABLE_LIGHT_BEAM + light_system = OVERLAY_LIGHT_BEAM light_range = 4 light_power = 2 diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index 99322597b4b..ce1245098c8 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -410,7 +410,7 @@ effective or pretty fucking useless. balloon_alert(user, "repaired!") -/obj/machinery/porta_turret/syndicate/toolbox/deconstruct(disassembled) +/obj/machinery/porta_turret/syndicate/toolbox/on_deconstruction(disassembled) if(disassembled) var/atom/movable/old_toolbox = toolbox toolbox = null diff --git a/code/game/objects/items/dualsaber.dm b/code/game/objects/items/dualsaber.dm index 04b95f1049b..7d5bc0b9528 100644 --- a/code/game/objects/items/dualsaber.dm +++ b/code/game/objects/items/dualsaber.dm @@ -17,7 +17,7 @@ w_class = WEIGHT_CLASS_SMALL hitsound = SFX_SWING_HIT armour_penetration = 35 - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 6 //TWICE AS BRIGHT AS A REGULAR ESWORD light_color = LIGHT_COLOR_ELECTRIC_GREEN light_on = FALSE diff --git a/code/game/objects/items/flamethrower.dm b/code/game/objects/items/flamethrower.dm index b7896c64381..1a31c5d58a2 100644 --- a/code/game/objects/items/flamethrower.dm +++ b/code/game/objects/items/flamethrower.dm @@ -15,7 +15,7 @@ custom_materials = list(/datum/material/iron= HALF_SHEET_MATERIAL_AMOUNT * 0.5) resistance_flags = FIRE_PROOF trigger_guard = TRIGGER_GUARD_NORMAL - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_on = FALSE var/status = FALSE var/lit = FALSE //on or off diff --git a/code/game/objects/items/food/cake.dm b/code/game/objects/items/food/cake.dm index 07d5818b466..0b443554bb3 100644 --- a/code/game/objects/items/food/cake.dm +++ b/code/game/objects/items/food/cake.dm @@ -288,16 +288,23 @@ tastes = list("cake" = 3, "a Vlad's Salad" = 1) crafting_complexity = FOOD_COMPLEXITY_4 -/obj/item/food/cakeslice/birthday/energy/proc/energy_bite(mob/living/user) - to_chat(user, "As you eat the cake slice, you accidentally hurt yourself on the embedded energy dagger!") - user.apply_damage(18, BRUTE, BODY_ZONE_HEAD) - playsound(user, 'sound/weapons/blade1.ogg', 5, TRUE) +/obj/item/food/cakeslice/birthday/energy/Initialize(mapload) + . = ..() + RegisterSignal(src, COMSIG_FOOD_EATEN, PROC_REF(bite_taken)) /obj/item/food/cakeslice/birthday/energy/attack(mob/living/target_mob, mob/living/user) - . = ..() if(HAS_TRAIT(user, TRAIT_PACIFISM) && target_mob != user) //Prevents pacifists from attacking others directly - return - energy_bite(target_mob, user) + balloon_alert(user, "that's dangerous!") + return FALSE + return ..() + +/obj/item/food/cakeslice/birthday/energy/proc/bite_taken(datum/source, mob/living/eater, mob/living/feeder) + SIGNAL_HANDLER + to_chat(eater, "As you eat the cake slice, you accidentally hurt yourself on the embedded energy dagger!") + if(eater != feeder) + log_combat(feeder, eater, "fed an energy cake to", src) + eater.apply_damage(18, BRUTE, BODY_ZONE_HEAD) + playsound(eater, 'sound/weapons/blade1.ogg', 5, TRUE) /obj/item/food/cake/apple name = "apple cake" diff --git a/code/game/objects/items/food/meatdish.dm b/code/game/objects/items/food/meatdish.dm index b928a460abb..b9a6c34df04 100644 --- a/code/game/objects/items/food/meatdish.dm +++ b/code/game/objects/items/food/meatdish.dm @@ -750,6 +750,19 @@ foodtypes = MEAT | SUGAR crafting_complexity = FOOD_COMPLEXITY_2 +///Special private component to handle how bbq is grilled, not meant to be used anywhere else +/datum/component/grillable/bbq + +/datum/component/grillable/bbq/finish_grilling(atom/grill_source) + //when on a grill allow it to roast without deleting itself + if(istype(grill_source, /obj/machinery/grill)) + grill_source.visible_message(span_notice("[parent] is grilled to perfection!")) + else //when on a girddle allow it to burn into an mouldy mess + return ..() + +/obj/item/food/bbqribs/make_grillable() + AddComponent(/datum/component/grillable/bbq, /obj/item/food/badrecipe, rand(30 SECONDS, 40 SECONDS), FALSE) + /obj/item/food/meatclown name = "meat clown" desc = "A delicious, round piece of meat clown. How horrifying." diff --git a/code/game/objects/items/granters/oragami.dm b/code/game/objects/items/granters/oragami.dm index 0b7d6d92615..0691349756c 100644 --- a/code/game/objects/items/granters/oragami.dm +++ b/code/game/objects/items/granters/oragami.dm @@ -21,11 +21,13 @@ check_flags = NONE /datum/action/innate/origami/Activate() + ADD_TRAIT(owner, TRAIT_PAPER_MASTER, ACTION_TRAIT) to_chat(owner, span_notice("You will now fold origami planes.")) active = TRUE build_all_button_icons(UPDATE_BUTTON_ICON) /datum/action/innate/origami/Deactivate() + REMOVE_TRAIT(owner, TRAIT_PAPER_MASTER, ACTION_TRAIT) to_chat(owner, span_notice("You will no longer fold origami planes.")) active = FALSE build_all_button_icons(UPDATE_BUTTON_ICON) diff --git a/code/game/objects/items/hand_items.dm b/code/game/objects/items/hand_items.dm index c6dc9cb7a2f..2255afe1054 100644 --- a/code/game/objects/items/hand_items.dm +++ b/code/game/objects/items/hand_items.dm @@ -219,9 +219,9 @@ /obj/item/hand_item/slapper/attack(mob/living/slapped, mob/living/carbon/human/user) SEND_SIGNAL(user, COMSIG_LIVING_SLAP_MOB, slapped) - if(ishuman(slapped)) - var/mob/living/carbon/human/human_slapped = slapped - SEND_SIGNAL(human_slapped, COMSIG_ORGAN_WAG_TAIL, FALSE) + if(iscarbon(slapped)) + var/mob/living/carbon/potential_tailed = slapped + potential_tailed.unwag_tail() user.do_attack_animation(slapped) var/slap_volume = 50 diff --git a/code/game/objects/items/implants/implant_freedom.dm b/code/game/objects/items/implants/implant_freedom.dm index f4480f5cff8..4bce618ede9 100644 --- a/code/game/objects/items/implants/implant_freedom.dm +++ b/code/game/objects/items/implants/implant_freedom.dm @@ -17,17 +17,31 @@ /obj/item/implant/freedom/activate() . = ..() var/mob/living/carbon/carbon_imp_in = imp_in - if(!carbon_imp_in.handcuffed && !carbon_imp_in.legcuffed) + if(!can_trigger(carbon_imp_in)) balloon_alert(carbon_imp_in, "no restraints!") return uses-- carbon_imp_in.uncuff() + var/obj/item/clothing/shoes/shoes = carbon_imp_in.shoes + if(istype(shoes) && shoes.tied == SHOES_KNOTTED) + shoes.adjust_laces(SHOES_TIED, carbon_imp_in) + if(!uses) addtimer(CALLBACK(carbon_imp_in, TYPE_PROC_REF(/atom, balloon_alert), carbon_imp_in, "implant degraded!"), 1 SECONDS) qdel(src) +/obj/item/implant/freedom/proc/can_trigger(mob/living/carbon/implanted_in) + if(implanted_in.handcuffed || implanted_in.legcuffed) + return TRUE + + var/obj/item/clothing/shoes/shoes = implanted_in.shoes + if(istype(shoes) && shoes.tied == SHOES_KNOTTED) + return TRUE + + return FALSE + /obj/item/implant/freedom/get_data() return "Implant Specifications:
\ Name: Freedom Beacon
\ diff --git a/code/game/objects/items/knives.dm b/code/game/objects/items/knives.dm index b7273ed0a32..8b4808848c2 100644 --- a/code/game/objects/items/knives.dm +++ b/code/game/objects/items/knives.dm @@ -124,6 +124,7 @@ name = "combat knife" icon = 'icons/obj/weapons/stabby.dmi' icon_state = "buckknife" + worn_icon_state = "buckknife" desc = "A military combat utility survival knife." embedding = list("pain_mult" = 4, "embed_chance" = 65, "fall_chance" = 10, "ignore_throwspeed_threshold" = TRUE) force = 20 @@ -131,11 +132,32 @@ attack_verb_continuous = list("slashes", "stabs", "slices", "tears", "lacerates", "rips", "cuts") attack_verb_simple = list("slash", "stab", "slice", "tear", "lacerate", "rip", "cut") bayonet = TRUE + slot_flags = ITEM_SLOT_MASK + +/obj/item/knife/combat/Initialize(mapload) + . = ..() + AddComponent(/datum/component/knockoff, 90, list(BODY_ZONE_PRECISE_MOUTH), slot_flags) //90% to knock off when wearing a mask + +/obj/item/knife/combat/dropped(mob/living/user, slot) + . = ..() + if(user.get_item_by_slot(ITEM_SLOT_MASK) == src && !user.has_status_effect(/datum/status_effect/choke) && prob(20)) + user.apply_damage(5, BRUTE, BODY_ZONE_HEAD) + playsound(user, 'sound/weapons/slice.ogg', 50, TRUE) + user.visible_message(span_danger("[user] accidentally cuts [user.p_them()]self while pulling [src] out of [user.p_them()] teeth! What a doofus!"), span_userdanger("You accidentally cut your mouth with [src]!")) + +/obj/item/knife/combat/equipped(mob/living/user, slot, initial = FALSE) + . = ..() + if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(20)) + if(user.get_item_by_slot(ITEM_SLOT_MASK) == src) + user.apply_status_effect(/datum/status_effect/choke, src) + user.visible_message(span_danger("[user] accidentally swallows [src]!")) + playsound(user, 'sound/items/eatfood.ogg', 100, TRUE) /obj/item/knife/combat/survival name = "survival knife" icon = 'icons/obj/weapons/stabby.dmi' icon_state = "survivalknife" + worn_icon_state = "survivalknife" embedding = list("pain_mult" = 4, "embed_chance" = 35, "fall_chance" = 10) desc = "A hunting grade survival knife." force = 15 @@ -153,6 +175,7 @@ desc = "A sharpened bone. The bare minimum in survival." embedding = list("pain_mult" = 4, "embed_chance" = 35, "fall_chance" = 10) obj_flags = parent_type::obj_flags & ~CONDUCTS_ELECTRICITY + slot_flags = NONE force = 15 throwforce = 15 custom_materials = null diff --git a/code/game/objects/items/melee/baton.dm b/code/game/objects/items/melee/baton.dm index cdafb81b62c..f57d9af87f0 100644 --- a/code/game/objects/items/melee/baton.dm +++ b/code/game/objects/items/melee/baton.dm @@ -427,6 +427,12 @@ on_stun_volume = 50 active = FALSE context_living_rmb_active = "Harmful Stun" + light_range = 1.5 + light_system = OVERLAY_LIGHT + light_on = FALSE + light_color = LIGHT_COLOR_ORANGE + light_power = 0.5 + var/throw_stun_chance = 35 var/obj/item/stock_parts/cell/cell @@ -541,6 +547,8 @@ active = !active balloon_alert(user, "turned [active ? "on" : "off"]") playsound(src, SFX_SPARKS, 75, TRUE, -1) + toggle_light(user) + do_sparks(1, TRUE, src) else active = FALSE if(!cell) @@ -550,6 +558,11 @@ update_appearance() add_fingerprint(user) +/// Toggles the stun baton's light +/obj/item/melee/baton/security/proc/toggle_light(mob/user) + set_light_on(!light_on) + return + /obj/item/melee/baton/security/proc/deductcharge(deducted_charge) if(!cell) return @@ -559,6 +572,7 @@ if(active && cell.charge < cell_hit_cost) //we're below minimum, turn off active = FALSE + set_light_on(FALSE) update_appearance() playsound(src, SFX_SPARKS, 75, TRUE, -1) @@ -649,6 +663,8 @@ if (!cell || cell.charge < cell_hit_cost) return active = !active + toggle_light() + do_sparks(1, TRUE, src) playsound(src, SFX_SPARKS, 75, TRUE, -1) update_appearance() diff --git a/code/game/objects/items/melee/energy.dm b/code/game/objects/items/melee/energy.dm index 9882f515d0d..948a582651e 100644 --- a/code/game/objects/items/melee/energy.dm +++ b/code/game/objects/items/melee/energy.dm @@ -5,7 +5,7 @@ attack_verb_continuous = list("hits", "taps", "pokes") attack_verb_simple = list("hit", "tap", "poke") resistance_flags = FIRE_PROOF - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 3 light_power = 1 light_on = FALSE diff --git a/code/game/objects/items/puzzle_pieces.dm b/code/game/objects/items/puzzle_pieces.dm index 8eba5081d22..7ac22d00897 100644 --- a/code/game/objects/items/puzzle_pieces.dm +++ b/code/game/objects/items/puzzle_pieces.dm @@ -403,3 +403,61 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/puzzle_keycardpad, 32) playsound(src, SFX_SPARKS, 100, vary = TRUE, extrarange = SHORT_RANGE_SOUND_EXTRARANGE) do_sparks(3, cardinal_only = FALSE, source = src) qdel(src) + +/obj/structure/puzzle_blockade/oneway + name = "one-way gate" + desc = "A wall of solid light, likely defending something important. Virtually indestructible." + icon = 'icons/obj/structures.dmi' + icon_state = "oneway" + base_icon_state = "oneway" + light_color = COLOR_BIOLUMINESCENCE_BLUE + light_range = 1 + density = FALSE + +/obj/structure/puzzle_blockade/oneway/update_icon_state() + icon_state = "[base_icon_state][density ? "" : "-off"]" + return ..() + +/obj/structure/puzzle_blockade/oneway/CanAllowThrough(atom/movable/mover, border_dir) + return ..() && (REVERSE_DIR(border_dir) == dir || get_turf(mover) == get_turf(src)) + +/obj/structure/puzzle_blockade/oneway/CanAStarPass(border_dir, datum/can_pass_info/pass_info) + return REVERSE_DIR(border_dir) == dir + +/obj/structure/puzzle_blockade/oneway/try_signal(datum/source) + density = FALSE + update_appearance(UPDATE_ICON) + +/obj/effect/puzzle_poddoor_open + name = "puzzle-poddoor relay" + desc = "activates poddoors if activated with a puzzle signal." + icon = 'icons/effects/mapping_helpers.dmi' + icon_state = "" + anchored = TRUE + invisibility = INVISIBILITY_MAXIMUM + /// if we receive a puzzle signal with this we do our thing + var/queue_id + /// door id + var/id + +/obj/effect/puzzle_poddoor_open/Initialize(mapload) + . = ..() + if(isnull(id) || isnull(queue_id)) + log_mapping("[src] id:[id] has no id or door id and has been deleted") + return INITIALIZE_HINT_QDEL + + SSqueuelinks.add_to_queue(src, queue_id) + +/obj/effect/puzzle_poddoor_open/MatchedLinks(id, list/partners) + for(var/partner in partners) + RegisterSignal(partner, COMSIG_PUZZLE_COMPLETED, PROC_REF(try_signal)) + +/obj/effect/puzzle_poddoor_open/proc/try_signal(datum/source) + SIGNAL_HANDLER + var/openclose + for(var/obj/machinery/door/poddoor/door as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/door/poddoor)) + if(door.id != id) + continue + if(isnull(openclose)) + openclose = door.density + INVOKE_ASYNC(door, openclose ? TYPE_PROC_REF(/obj/machinery/door/poddoor, open) : TYPE_PROC_REF(/obj/machinery/door/poddoor, close)) diff --git a/code/game/objects/items/rcd/RPD.dm b/code/game/objects/items/rcd/RPD.dm index 9af1041779e..e4777977605 100644 --- a/code/game/objects/items/rcd/RPD.dm +++ b/code/game/objects/items/rcd/RPD.dm @@ -587,7 +587,7 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( if(queued_pipe_flipped) tube.setDir(turn(queued_pipe_dir, 45 + ROTATION_FLIP)) - tube.AfterRotation(user, ROTATION_FLIP) + tube.post_rotation(user, ROTATION_FLIP) tube.add_fingerprint(usr) if(mode & WRENCH_MODE) diff --git a/code/game/objects/items/stacks/golem_food/golem_status_effects.dm b/code/game/objects/items/stacks/golem_food/golem_status_effects.dm index c89fae800b9..514ab36ed66 100644 --- a/code/game/objects/items/stacks/golem_food/golem_status_effects.dm +++ b/code/game/objects/items/stacks/golem_food/golem_status_effects.dm @@ -404,7 +404,7 @@ . = ..() if (!.) return - owner.AddElement(/datum/element/waddling) + owner.AddElementTrait(TRAIT_WADDLING, TRAIT_STATUS_EFFECT(id), /datum/element/waddling) ADD_TRAIT(owner, TRAIT_NO_SLIP_WATER, TRAIT_STATUS_EFFECT(id)) slipperiness = owner.AddComponent(\ /datum/component/slippery,\ @@ -418,8 +418,7 @@ return owner.body_position == LYING_DOWN /datum/status_effect/golem/bananium/on_remove() - REMOVE_TRAIT(owner, TRAIT_NO_SLIP_WATER, TRAIT_STATUS_EFFECT(id)) - owner.RemoveElement(/datum/element/waddling) + owner.remove_traits(owner, list(TRAIT_WADDLING, TRAIT_NO_SLIP_WATER), TRAIT_STATUS_EFFECT(id)) QDEL_NULL(slipperiness) return ..() @@ -441,7 +440,7 @@ if (!.) return to_chat(owner, span_notice("You start to emit a healthy glow.")) - owner.light_system = MOVABLE_LIGHT + owner.light_system = OVERLAY_LIGHT lightbulb = owner.AddComponent(/datum/component/overlay_lighting, _range = glow_range, _power = glow_power, _color = glow_color) owner.add_filter(LIGHTBULB_FILTER, 2, list("type" = "outline", "color" = glow_color, "alpha" = 60, "size" = 1)) diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm index 500b2500c8a..e9426a913ec 100644 --- a/code/game/objects/items/stacks/sheets/leather.dm +++ b/code/game/objects/items/stacks/sheets/leather.dm @@ -40,11 +40,6 @@ GLOBAL_LIST_INIT(human_recipes, list( \ inhand_icon_state = null merge_type = /obj/item/stack/sheet/animalhide/corgi -GLOBAL_LIST_INIT(gondola_recipes, list ( \ - new/datum/stack_recipe("gondola mask", /obj/item/clothing/mask/gondola, 1, check_density = FALSE, category = CAT_CLOTHING), \ - new/datum/stack_recipe("gondola suit", /obj/item/clothing/under/costume/gondola, 2, check_density = FALSE, category = CAT_CLOTHING), \ - )) - /obj/item/stack/sheet/animalhide/corgi/five amount = 5 @@ -59,6 +54,12 @@ GLOBAL_LIST_INIT(gondola_recipes, list ( \ /obj/item/stack/sheet/animalhide/mothroach/five amount = 5 +GLOBAL_LIST_INIT(gondola_recipes, list ( \ + new/datum/stack_recipe("gondola mask", /obj/item/clothing/mask/gondola, 1, check_density = FALSE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("gondola suit", /obj/item/clothing/under/costume/gondola, 2, check_density = FALSE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("gondola bedsheet", /obj/item/bedsheet/gondola, 1, check_density = FALSE, category = CAT_FURNITURE), \ + )) + /obj/item/stack/sheet/animalhide/gondola name = "gondola hide" desc = "The extremely valuable product of gondola hunting." diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 4228866506a..a72599fac9b 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -788,7 +788,8 @@ GLOBAL_LIST_INIT(plastic_recipes, list( new /datum/stack_recipe("mannequin", /obj/structure/mannequin/plastic, 25, time = 5 SECONDS, one_per_turf = TRUE, check_density = FALSE, category = CAT_ENTERTAINMENT), \ new /datum/stack_recipe("wet floor sign", /obj/item/clothing/suit/caution, 2, check_density = FALSE, category = CAT_EQUIPMENT), \ new /datum/stack_recipe("warning cone", /obj/item/clothing/head/cone, 2, check_density = FALSE, category = CAT_EQUIPMENT), \ - new /datum/stack_recipe("blank wall sign", /obj/item/sign, 1, check_density = FALSE, category = CAT_FURNITURE))) + new /datum/stack_recipe("blank wall sign", /obj/item/sign, 1, check_density = FALSE, category = CAT_FURNITURE), \ + new /datum/stack_recipe("rebellion mask", /obj/item/clothing/mask/rebellion, 1, check_density = FALSE, category = CAT_CLOTHING))) /obj/item/stack/sheet/plastic name = "plastic" diff --git a/code/game/objects/items/stacks/telecrystal.dm b/code/game/objects/items/stacks/telecrystal.dm index 51d21d6ef6c..a6bbe3bfe19 100644 --- a/code/game/objects/items/stacks/telecrystal.dm +++ b/code/game/objects/items/stacks/telecrystal.dm @@ -21,7 +21,7 @@ var/datum/component/uplink/hidden_uplink = uplink.GetComponent(/datum/component/uplink) if(hidden_uplink) - hidden_uplink.add_telecrystals(amount) + hidden_uplink.uplink_handler.add_telecrystals(amount) use(amount) to_chat(user, span_notice("You press [src] onto yourself and charge your hidden uplink.")) return ITEM_INTERACT_SUCCESS diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index dfdaff500b1..282ced06519 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -376,7 +376,6 @@ /obj/item/reagent_containers/spray/pepper, /obj/item/restraints/handcuffs, /obj/item/restraints/legcuffs/bola, - /obj/item/stock_parts/cell/microfusion, //NOVA EDIT ADDITION )) /obj/item/storage/belt/security/full/PopulateContents() diff --git a/code/game/objects/items/storage/boxes/job_boxes.dm b/code/game/objects/items/storage/boxes/job_boxes.dm index b77d52ab3b9..8960470bb79 100644 --- a/code/game/objects/items/storage/boxes/job_boxes.dm +++ b/code/game/objects/items/storage/boxes/job_boxes.dm @@ -29,15 +29,9 @@ return if(!isnull(mask_type)) new mask_type(src) - //NOVA EDIT ADDITION START - VOX INTERNALS - Honestly I dont know if this has a function any more with wardrobe_removal(), but TG still uses the plasmaman one so better safe than sorry - if(!isplasmaman(loc)) - if(isvox(loc)) - new /obj/item/tank/internals/nitrogen/belt/emergency(src) - else - new internal_type(src) - else - new /obj/item/tank/internals/plasmaman/belt(src) - //NOVA EDIT ADDITION END - VOX INTERNALS + + if(!isnull(internal_type)) + new internal_type(src) if(!isnull(medipen_type)) new medipen_type(src) diff --git a/code/game/objects/items/storage/lockbox.dm b/code/game/objects/items/storage/lockbox.dm index 9c42113d263..97fe36137a2 100644 --- a/code/game/objects/items/storage/lockbox.dm +++ b/code/game/objects/items/storage/lockbox.dm @@ -239,6 +239,8 @@ desc = "A box used to secure small cargo orders from being looted by those who didn't order it. Yeah, cargo tech, that means you." icon = 'icons/obj/storage/case.dmi' icon_state = "secure" + icon_closed = "secure" + icon_locked = "secure_locked" icon_broken = "secure+b" inhand_icon_state = "sec-case" lefthand_file = 'icons/mob/inhands/equipment/briefcase_lefthand.dmi' @@ -273,8 +275,10 @@ if(privacy_lock) atom_storage.locked = STORAGE_NOT_LOCKED + icon_state = icon_locked else atom_storage.locked = STORAGE_FULLY_LOCKED + icon_state = icon_closed privacy_lock = atom_storage.locked user.visible_message(span_notice("[user] [privacy_lock ? "" : "un"]locks [src]'s privacy lock."), span_notice("You [privacy_lock ? "" : "un"]lock [src]'s privacy lock.")) diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index bcf6a491d71..7546028dded 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -770,36 +770,9 @@ illustration = "writing_syndie" /obj/item/storage/box/syndicate/contract_kit/PopulateContents() - new /obj/item/modular_computer/pda/contractor(src) // SKYRAT EDIT CHANGE - ORIGINAL : /obj/item/modular_computer/pda/syndicate_contract_uplink(src) + new /obj/item/modular_computer/pda/contractor(src) // NOVA EDIT CHANGE - ORIGINAL : /obj/item/modular_computer/pda/syndicate_contract_uplink(src) new /obj/item/storage/box/syndicate/contractor_loadout(src) new /obj/item/melee/baton/telescopic/contractor_baton(src) - - // All about 4 TC or less - some nukeops only items, but fit nicely to the theme. - var/static/list/item_list = list( - /obj/item/storage/backpack/duffelbag/syndie/x4, - /obj/item/storage/box/syndie_kit/throwing_weapons, - /obj/item/gun/syringe/syndicate, - /obj/item/pen/edagger, - /obj/item/pen/sleepy, - /obj/item/flashlight/emp, - /obj/item/reagent_containers/syringe/mulligan, - /obj/item/clothing/shoes/chameleon/noslip, - /obj/item/storage/medkit/tactical, - /obj/item/encryptionkey/syndicate, - /obj/item/clothing/glasses/thermal/syndi, - /obj/item/slimepotion/slime/sentience/nuclear, - /obj/item/storage/box/syndie_kit/imp_radio, - ///obj/item/storage/box/syndie_kit/imp_uplink, // SKYRAT EDIT REMOVAL - ///obj/item/clothing/gloves/krav_maga/combatglovesplus, // SKYRAT EDIT REMOVAL - /obj/item/gun/ballistic/automatic/c20r/toy/unrestricted/riot, - /obj/item/reagent_containers/hypospray/medipen/stimulants, - /obj/item/storage/box/syndie_kit/imp_freedom, - /obj/item/toy/eightball/haunted, - ) - for(var/i in 1 to 3) - var/selected_item = pick_n_take(item_list + modular_item_list) // NOVA EDIT CHANGE - ORIGINAL : var/selected_item = pick_n_take(item_list) - new selected_item(src) - // Paper guide is always last. new /obj/item/paper/contractor_guide(src) @@ -810,14 +783,18 @@ illustration = "writing_syndie" /obj/item/storage/box/syndicate/contractor_loadout/PopulateContents() - /* SKYRAT EDIT REMOVAL BEGIN - Contractors get MODSuits instead, see contractor modular for overrides + /* NOVA EDIT REMOVAL BEGIN - Contractors get MODSuits instead, see contractor modular for overrides + new /obj/item/mod/control/pre_equipped/infiltrator(src) new /obj/item/clothing/head/helmet/space/syndicate/contract(src) new /obj/item/clothing/suit/space/syndicate/contract(src) - SKYRAT EDIT REMOVAL END */ + NOVA EDIT REMOVAL END */ new /obj/item/clothing/under/chameleon(src) new /obj/item/clothing/mask/chameleon(src) - new /obj/item/storage/fancy/cigarettes/cigpack_syndicate(src) new /obj/item/card/id/advanced/chameleon(src) + new /obj/item/clothing/glasses/thermal/syndi(src) + new /obj/item/storage/toolbox/syndicate(src) + new /obj/item/jammer(src) + new /obj/item/storage/fancy/cigarettes/cigpack_syndicate(src) new /obj/item/lighter(src) #undef KIT_RECON diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm index 6c11c435507..a670a966805 100644 --- a/code/game/objects/items/tanks/tanks.dm +++ b/code/game/objects/items/tanks/tanks.dm @@ -440,6 +440,10 @@ if(LAZYLEN(assembly.assemblies) == igniter_count) return + + if(isitem(loc)) // we are in a storage item + balloon_alert(user, "can't reach!") + return if((src in user.get_equipped_items(include_pockets = TRUE, include_accessories = TRUE)) && !user.canUnEquip(src)) balloon_alert(user, "it's stuck!") @@ -456,6 +460,7 @@ tank_assembly = assembly //Tell the tank about its assembly part assembly.master = src //Tell the assembly about its new owner assembly.on_attach() + w_class = WEIGHT_CLASS_BULKY balloon_alert(user, "bomb assembled") update_appearance(UPDATE_OVERLAYS) @@ -469,6 +474,7 @@ user.put_in_hands(tank_assembly) tank_assembly.master = null tank_assembly = null + w_class = initial(w_class) update_appearance(UPDATE_OVERLAYS) /// Ignites the contents of the tank. Called when receiving a signal if the tank is welded and has an igniter attached. diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm index b48106d0c1d..7995267954e 100644 --- a/code/game/objects/items/tools/weldingtool.dm +++ b/code/game/objects/items/tools/weldingtool.dm @@ -17,7 +17,7 @@ usesound = list('sound/items/welder.ogg', 'sound/items/welder2.ogg') drop_sound = 'sound/items/handling/weldingtool_drop.ogg' pickup_sound = 'sound/items/handling/weldingtool_pickup.ogg' - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 2 light_power = 0.75 light_color = LIGHT_COLOR_FIRE diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 91f1ca925ab..cb57c5049bb 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -373,6 +373,8 @@ GLOBAL_LIST_EMPTY(objects_by_id_tag) /// If we can unwrench this object; returns SUCCESSFUL_UNFASTEN and FAILED_UNFASTEN, which are both TRUE, or CANT_UNFASTEN, which isn't. /obj/proc/can_be_unfasten_wrench(mob/user, silent) + if(obj_flags & NO_DECONSTRUCTION) + return CANT_UNFASTEN if(!(isfloorturf(loc) || isindestructiblefloor(loc)) && !anchored) to_chat(user, span_warning("[src] needs to be on the floor to be secured!")) return FAILED_UNFASTEN @@ -380,7 +382,7 @@ GLOBAL_LIST_EMPTY(objects_by_id_tag) /// Try to unwrench an object in a WONDERFUL DYNAMIC WAY /obj/proc/default_unfasten_wrench(mob/user, obj/item/wrench, time = 20) - if((obj_flags & NO_DECONSTRUCTION) || wrench.tool_behaviour != TOOL_WRENCH) + if(wrench.tool_behaviour != TOOL_WRENCH) return CANT_UNFASTEN var/turf/ground = get_turf(src) diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 1943f0aa398..3d976b72cca 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -69,3 +69,10 @@ /obj/structure/animate_atom_living(mob/living/owner) new /mob/living/simple_animal/hostile/mimic/copy(drop_location(), src, owner) + +/// For when a mob comes flying through the window, smash it and damage the mob +/obj/structure/proc/smash_and_injure(mob/living/flying_mob, atom/oldloc, direction) + flying_mob.balloon_alert_to_viewers("smashed through!") + flying_mob.apply_damage(damage = rand(5, 15), damagetype = BRUTE, wound_bonus = 15, bare_wound_bonus = 25, sharpness = SHARP_EDGED, attack_direction = get_dir(src, oldloc)) + new /obj/effect/decal/cleanable/glass(get_step(flying_mob, flying_mob.dir)) + deconstruct(disassembled = FALSE) diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index 5ea634cf5f8..f80042f5679 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -4,10 +4,6 @@ BEDSHEETS LINEN BINS */ -#define BEDSHEET_ABSTRACT "abstract" -#define BEDSHEET_SINGLE "single" -#define BEDSHEET_DOUBLE "double" - /obj/item/bedsheet name = "bedsheet" desc = "A surprisingly soft linen bedsheet." @@ -28,7 +24,9 @@ LINEN BINS dog_fashion = /datum/dog_fashion/head/ghost /// Custom nouns to act as the subject of dreams var/list/dream_messages = list("white") - /// The number of cloth sheets to be dropped by this bedsheet when cut + /// Cutting it up will yield this. + var/stack_type = /obj/item/stack/sheet/cloth + /// The number of sheets dropped by this bedsheet when cut var/stack_amount = 3 /// Denotes if the bedsheet is a single, double, or other kind of bedsheet var/bedsheet_type = BEDSHEET_SINGLE @@ -126,7 +124,7 @@ LINEN BINS /obj/item/bedsheet/attackby(obj/item/I, mob/user, params) if(I.tool_behaviour == TOOL_WIRECUTTER || I.get_sharpness()) if (!(flags_1 & HOLOGRAM_1)) - var/obj/item/stack/sheet/cloth/shreds = new (get_turf(src), stack_amount) + var/obj/item/stack/shreds = new stack_type(get_turf(src), stack_amount) if(!QDELETED(shreds)) //stacks merged transfer_fingerprints_to(shreds) shreds.add_fingerprint(user) @@ -338,6 +336,60 @@ LINEN BINS inhand_icon_state = "sheetian" dream_messages = list("a dog", "a corgi", "woof", "bark", "arf") +/obj/item/bedsheet/runtime + icon_state = "sheetruntime" + inhand_icon_state = "sheetruntime" + dream_messages = list("a kitty", "a cat", "meow", "purr", "nya~") + +/obj/item/bedsheet/pirate + name = "pirate's bedsheet" + desc = "It has a Jolly Roger emblem on it and has a faint scent of grog." + icon_state = "sheetpirate" + inhand_icon_state = "sheetpirate" + dream_messages = list( + "a buried treasure", + "an island", + "a monkey", + "a parrot", + "a swashbuckler", + "a talking skull", + "avast", + "being a pirate", + "'cause a pirate is free", + "doing whatever you want", + "gold", + "landlubbers", + "stealing", + "sailing the Seven Seas", + "yarr", + ) + +/obj/item/bedsheet/gondola + name = "gondola bedsheet" + desc = "A precious bedsheet made from the hide of a endangered and peculiar critter." + icon_state = "sheetgondola" + inhand_icon_state = "sheetgondola" + dream_messages = list("peace", "comfiness", "a rare critter", "a harmless creature") + stack_type = /obj/item/stack/sheet/animalhide/gondola + stack_amount = 1 + ///one of four icon states that represent its mouth + var/gondola_mouth + ///one of four icon states that represent its eyes + var/gondola_eyes + +/obj/item/bedsheet/gondola/Initialize(mapload) + . = ..() + gondola_mouth = "sheetgondola_mouth[rand(1, 4)]" + gondola_eyes = "sheetgondola_eyes[rand(1, 4)]" + add_overlay(gondola_mouth) + add_overlay(gondola_eyes) + +/obj/item/bedsheet/gondola/worn_overlays(mutable_appearance/standing, isinhands, icon_file) + . = ..() + if(!isinhands) + . += mutable_appearance(icon_file, gondola_mouth) + . += mutable_appearance(icon_file, gondola_eyes) + /obj/item/bedsheet/cosmos name = "cosmic space bedsheet" desc = "Made from the dreams of those who wonder at the stars." @@ -347,65 +399,6 @@ LINEN BINS light_power = 2 light_range = 1.4 -/obj/item/bedsheet/random - icon_state = "random_bedsheet" - name = "random bedsheet" - desc = "If you're reading this description ingame, something has gone wrong! Honk!" - bedsheet_type = BEDSHEET_ABSTRACT - item_flags = ABSTRACT - var/static/list/bedsheet_list - var/spawn_type = BEDSHEET_SINGLE - -/obj/item/bedsheet/random/Initialize(mapload) - ..() - if(!LAZYACCESS(bedsheet_list, spawn_type)) - var/list/spawn_list = list() - var/list/possible_types = typesof(/obj/item/bedsheet) - for(var/obj/item/bedsheet/sheet as anything in possible_types) - if(initial(sheet.bedsheet_type) == spawn_type) - spawn_list += sheet - LAZYSET(bedsheet_list, spawn_type, spawn_list) - var/chosen_type = pick(bedsheet_list[spawn_type]) - new chosen_type(loc) - return INITIALIZE_HINT_QDEL - -/obj/item/bedsheet/random/double - icon_state = "random_bedsheet" - spawn_type = BEDSHEET_DOUBLE - -/obj/item/bedsheet/dorms - icon_state = "random_bedsheet" - name = "random dorms bedsheet" - desc = "If you're reading this description ingame, something has gone wrong! Honk!" - bedsheet_type = BEDSHEET_DOUBLE - item_flags = ABSTRACT - slot_flags = null - -/obj/item/bedsheet/dorms/Initialize(mapload) - ..() - var/type = pick_weight(list("Colors" = 80, "Special" = 20)) - switch(type) - if("Colors") - type = pick(list(/obj/item/bedsheet, - /obj/item/bedsheet/blue, - /obj/item/bedsheet/green, - /obj/item/bedsheet/grey, - /obj/item/bedsheet/orange, - /obj/item/bedsheet/purple, - /obj/item/bedsheet/red, - /obj/item/bedsheet/yellow, - /obj/item/bedsheet/brown, - /obj/item/bedsheet/black)) - if("Special") - type = pick(list(/obj/item/bedsheet/patriot, - /obj/item/bedsheet/rainbow, - /obj/item/bedsheet/ian, - /obj/item/bedsheet/cosmos, - /obj/item/bedsheet/nanotrasen)) - var/obj/item/bedsheet = new type(loc) - bedsheet.dir = dir - return INITIALIZE_HINT_QDEL - /obj/item/bedsheet/double icon_state = "double_sheetwhite" worn_icon_state = "sheetwhite" @@ -558,45 +551,16 @@ LINEN BINS worn_icon_state = "sheetian" bedsheet_type = BEDSHEET_DOUBLE +/obj/item/bedsheet/runtime/double + icon_state = "double_sheetruntime" + worn_icon_state = "sheetruntime" + bedsheet_type = BEDSHEET_DOUBLE + /obj/item/bedsheet/cosmos/double icon_state = "double_sheetcosmos" worn_icon_state = "sheetcosmos" bedsheet_type = BEDSHEET_DOUBLE -/obj/item/bedsheet/dorms_double - icon_state = "random_bedsheet" - item_flags = ABSTRACT - bedsheet_type = BEDSHEET_ABSTRACT - -/obj/item/bedsheet/dorms_double/Initialize(mapload) - ..() - var/type = pick_weight(list("Colors" = 80, "Special" = 20)) - switch(type) - if("Colors") - type = pick(list( - /obj/item/bedsheet/double, - /obj/item/bedsheet/blue/double, - /obj/item/bedsheet/green/double, - /obj/item/bedsheet/grey/double, - /obj/item/bedsheet/orange/double, - /obj/item/bedsheet/purple/double, - /obj/item/bedsheet/red/double, - /obj/item/bedsheet/yellow/double, - /obj/item/bedsheet/brown/double, - /obj/item/bedsheet/black/double, - )) - if("Special") - type = pick(list( - /obj/item/bedsheet/patriot/double, - /obj/item/bedsheet/rainbow/double, - /obj/item/bedsheet/ian/double, - /obj/item/bedsheet/cosmos/double, - /obj/item/bedsheet/nanotrasen/double, - )) - var/obj/item/bedsheet = new type(loc) - bedsheet.dir = dir - return INITIALIZE_HINT_QDEL - /obj/structure/bedsheetbin name = "linen bin" desc = "It looks rather cosy." @@ -735,7 +699,3 @@ LINEN BINS add_fingerprint(user) return COMPONENT_CANCEL_ATTACK_CHAIN - -#undef BEDSHEET_ABSTRACT -#undef BEDSHEET_SINGLE -#undef BEDSHEET_DOUBLE diff --git a/code/game/objects/structures/crates_lockers/closets/secure/bar.dm b/code/game/objects/structures/crates_lockers/closets/secure/bar.dm index 473fedfa10a..fdaa0c3b69e 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/bar.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/bar.dm @@ -36,7 +36,7 @@ for(var/i in 1 to 5) new /obj/item/reagent_containers/cup/glass/colocup(src) -/obj/structure/closet/secure/closet/bar/lavaland_bartender_clothes +/obj/structure/closet/secure_closet/bar/lavaland_bartender_clothes name = "bartender's closet" /obj/structure/closet/secure_closet/bar/lavaland_bartender_clothes/PopulateContents() @@ -44,4 +44,3 @@ new /obj/item/clothing/glasses/sunglasses/reagent(src) new /obj/item/clothing/suit/costume/hawaiian(src) new /obj/item/clothing/shoes/sandal/beach(src) - diff --git a/code/game/objects/structures/fluff.dm b/code/game/objects/structures/fluff.dm index a38659aaefe..82e89314d68 100644 --- a/code/game/objects/structures/fluff.dm +++ b/code/game/objects/structures/fluff.dm @@ -305,3 +305,12 @@ anchored = FALSE density = TRUE deconstructible = TRUE + +/obj/structure/fluff/wallsign + name = "direction sign" + desc = "Now, where to go?" + density = FALSE + icon = 'icons/obj/fluff/general.dmi' + icon_state = "wallsign" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/fluff/wallsign, 32) diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 959f0c7a74c..fba9d5cecc4 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -9,7 +9,7 @@ base_icon_state = "grille" density = TRUE anchored = TRUE - pass_flags_self = PASSGRILLE + pass_flags_self = PASSGRILLE | PASSWINDOW obj_flags = CONDUCTS_ELECTRICITY obj_flags = CAN_BE_HIT | IGNORE_DENSITY pressure_resistance = 5*ONE_ATMOSPHERE diff --git a/code/game/objects/structures/lavaland/ore_vent.dm b/code/game/objects/structures/lavaland/ore_vent.dm index fe663efec48..08a4394346a 100644 --- a/code/game/objects/structures/lavaland/ore_vent.dm +++ b/code/game/objects/structures/lavaland/ore_vent.dm @@ -2,6 +2,7 @@ #define MINERAL_TYPE_OPTIONS_RANDOM 4 #define OVERLAY_OFFSET_START 0 #define OVERLAY_OFFSET_EACH 5 +#define MINERALS_PER_BOULDER 3 /obj/structure/ore_vent name = "ore vent" @@ -22,13 +23,8 @@ var/unique_vent = FALSE /// What icon_state do we use when the ore vent has been tapped? var/icon_state_tapped = "ore_vent_active" - /// A weighted list of what minerals are contained in this vent, with weight determining how likely each mineral is to be picked in produced boulders. var/list/mineral_breakdown = list() - /// How many rolls on the mineral_breakdown list are made per boulder produced? EG: 3 rolls means 3 minerals per boulder, with order determining percentage. - var/minerals_per_boulder = 3 - /// How many minerals are picked to be in the ore vent? These are added to the mineral_breakdown list. - var/minerals_per_breakdown = MINERAL_TYPE_OPTIONS_RANDOM /// What size boulders does this vent produce? var/boulder_size = BOULDER_SIZE_SMALL /// Reference to this ore vent's NODE drone, to track wave success. @@ -67,9 +63,9 @@ var/artifact_chance = 0 /// We use a cooldown to prevent the wave defense from being started multiple times. COOLDOWN_DECLARE(wave_cooldown) + /// We use a cooldown to prevent players from tapping boulders rapidly from vents. COOLDOWN_DECLARE(manual_vent_cooldown) - /obj/structure/ore_vent/Initialize(mapload) if(mapload) generate_description() @@ -121,14 +117,14 @@ if(do_after(user, boulder_size * 1 SECONDS, src)) user.apply_damage(20, STAMINA) playsound(src, 'sound/weapons/genhit.ogg', 50, TRUE) - produce_boulder() + produce_boulder(TRUE) visible_message(span_notice("You've successfully produced a boulder! Boy are your arms tired.")) /obj/structure/ore_vent/attack_basic_mob(mob/user, list/modifiers) . = ..() if(!HAS_TRAIT(user, TRAIT_BOULDER_BREAKER)) return - produce_boulder() + produce_boulder(TRUE) /obj/structure/ore_vent/is_buckle_possible(mob/living/target, force, check_loc) . = ..() @@ -155,17 +151,6 @@ context[SCREENTIP_CONTEXT_LMB] = "Scan vent" return CONTEXTUAL_SCREENTIP_SET -/** - * Picks n types of materials to pack into a boulder created by this ore vent, where n is this vent's minerals_per_boulder. - * Then assigns custom_materials based on boulder_size, assigned via the ore_quantity_function - */ -/obj/structure/ore_vent/proc/create_mineral_contents() - var/list/refined_list = list() - for(var/iteration in 1 to minerals_per_boulder) - var/datum/material/material = pick_weight(mineral_breakdown) - refined_list[material] += ore_quantity_function(iteration) - return refined_list - /** * This proc is called when the ore vent is initialized, in order to determine what minerals boulders it spawns can contain. * The materials available are determined by SSore_generation.ore_vent_minerals, which is a list of all minerals that can be contained in ore vents for a given cave generation. @@ -372,22 +357,38 @@ * @params apply_cooldown Should we apply a cooldown to producing boulders? Default's false, used by manual boulder production (goldgrubs, golems, etc). */ /obj/structure/ore_vent/proc/produce_boulder(apply_cooldown = FALSE) - if(!COOLDOWN_FINISHED(src, manual_vent_cooldown)) + RETURN_TYPE(/obj/item/boulder) + + //cooldown applies only for manual processing by hand + if(apply_cooldown && !COOLDOWN_FINISHED(src, manual_vent_cooldown)) return + + //produce the boulder var/obj/item/boulder/new_rock if(prob(artifact_chance)) new_rock = new /obj/item/boulder/artifact(loc) else new_rock = new /obj/item/boulder(loc) - var/list/mats_list = create_mineral_contents() Shake(duration = 1.5 SECONDS) + + //decorate the boulder with materials + var/list/mats_list = list() + for(var/iteration in 1 to MINERALS_PER_BOULDER) + var/datum/material/material = pick_weight(mineral_breakdown) + mats_list[material] += ore_quantity_function(iteration) new_rock.set_custom_materials(mats_list) - new_rock.flavor_boulder(src) + + //set size & durability + new_rock.boulder_size = boulder_size + new_rock.durability = rand(2, boulder_size) //randomize durability a bit for some flavor. + new_rock.boulder_string = boulder_icon_state + new_rock.update_appearance(UPDATE_ICON_STATE) + + //start the cooldown & return the boulder if(apply_cooldown) COOLDOWN_START(src, manual_vent_cooldown, 10 SECONDS) return new_rock - //comes with the station, and is already tapped. /obj/structure/ore_vent/starter_resources name = "active ore vent" @@ -402,12 +403,6 @@ ) /obj/structure/ore_vent/random - /// Static list of ore vent types, for random generation. - var/static/list/ore_vent_types = list( - BOULDER_SIZE_SMALL, - BOULDER_SIZE_MEDIUM, - BOULDER_SIZE_LARGE, - ) /obj/structure/ore_vent/random/Initialize(mapload) . = ..() @@ -446,7 +441,7 @@ /mob/living/simple_animal/hostile/asteroid/wolf, ) ore_vent_options = list( - "small", + SMALL_VENT_TYPE, ) /obj/structure/ore_vent/random/icebox/lower @@ -459,12 +454,11 @@ /mob/living/simple_animal/hostile/asteroid/wolf, ) ore_vent_options = list( - "small", - "medium", - "large", + SMALL_VENT_TYPE = 3, + MEDIUM_VENT_TYPE = 5, + LARGE_VENT_TYPE = 7, ) - /obj/structure/ore_vent/boss name = "menacing ore vent" desc = "An ore vent, brimming with underground ore. This one has an evil aura about it. Better be careful." @@ -536,3 +530,4 @@ #undef MINERAL_TYPE_OPTIONS_RANDOM #undef OVERLAY_OFFSET_START #undef OVERLAY_OFFSET_EACH +#undef MINERALS_PER_BOULDER diff --git a/code/game/objects/structures/mannequin.dm b/code/game/objects/structures/mannequin.dm index a4cc8a99ed1..29c313b0b54 100644 --- a/code/game/objects/structures/mannequin.dm +++ b/code/game/objects/structures/mannequin.dm @@ -64,6 +64,7 @@ icon_state = "mannequin_[material]_[body_type == FEMALE ? "female" : "male"]" AddElement(/datum/element/strippable, GLOB.strippable_mannequin_items) AddComponent(/datum/component/simple_rotation, ROTATION_IGNORE_ANCHORED) + AddComponent(/datum/component/marionette) update_appearance() /obj/structure/mannequin/Destroy() @@ -202,7 +203,6 @@ name = "skeleton model" desc = "Not to knock over." material = MANNEQUIN_SKELETON - anchored = TRUE obj_flags = UNIQUE_RENAME starting_items = list( /obj/item/clothing/glasses/eyepatch, diff --git a/code/game/objects/structures/shower.dm b/code/game/objects/structures/shower.dm index 7b86a17e9dc..ab41615fd96 100644 --- a/code/game/objects/structures/shower.dm +++ b/code/game/objects/structures/shower.dm @@ -322,11 +322,10 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/shower, (-16)) reagents.remove_any(SHOWER_SPRAY_VOLUME) -/obj/machinery/shower/deconstruct(disassembled = TRUE) +/obj/machinery/shower/on_deconstruction(disassembled = TRUE) new /obj/item/stack/sheet/iron(drop_location(), 2) if(has_water_reclaimer) new /obj/item/stock_parts/water_recycler(drop_location()) - qdel(src) /obj/machinery/shower/proc/check_heat(mob/living/L) var/mob/living/carbon/C = L diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index a0b8f9d79dc..debd4d81bc3 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -825,6 +825,12 @@ pass_flags_self = LETPASSTHROW //You can throw objects over this, despite it's density. max_integrity = 20 +/obj/structure/rack/skeletal + name = "skeletal minibar" + desc = "Rattle me boozes!" + icon = 'icons/obj/fluff/general.dmi' + icon_state = "minibar" + /obj/structure/rack/Initialize(mapload) . = ..() AddElement(/datum/element/climbable) diff --git a/code/game/objects/structures/toiletbong.dm b/code/game/objects/structures/toiletbong.dm index a0aaeeaa4bb..0ea21e9ff84 100644 --- a/code/game/objects/structures/toiletbong.dm +++ b/code/game/objects/structures/toiletbong.dm @@ -3,25 +3,28 @@ desc = "A repurposed toilet with re-arranged piping and an attached flamethrower. Why would anyone build this?" icon = 'icons/obj/watercloset.dmi' icon_state = "toiletbong" + base_icon_state = "toiletbong" density = FALSE anchored = TRUE - var/emagged = FALSE var/smokeradius = 1 var/mutable_appearance/weed_overlay /obj/structure/toiletbong/Initialize(mapload) . = ..() + create_storage() + AddComponent(/datum/component/simple_rotation, post_rotation = CALLBACK(src, PROC_REF(post_rotation))) create_storage(max_total_storage = 100, max_slots = 12, canhold = /obj/item/food) atom_storage.attack_hand_interact = FALSE + atom_storage.rustle_sound = FALSE + atom_storage.animated = FALSE - weed_overlay = mutable_appearance('icons/obj/watercloset.dmi', "toiletbong_overlay") + weed_overlay = mutable_appearance('icons/obj/watercloset.dmi', "[base_icon_state]_overlay") START_PROCESSING(SSobj, src) -/obj/structure/toiletbong/update_icon() +/obj/structure/toiletbong/update_overlays() . = ..() - cut_overlays() if (LAZYLEN(contents)) - add_overlay(weed_overlay) + . += weed_overlay /obj/structure/toiletbong/attack_hand(mob/living/carbon/user) . = ..() @@ -32,45 +35,45 @@ user.balloon_alert(user, "it's empty!") return user.visible_message(span_boldnotice("[user] takes a huge drag on the [src].")) - if (do_after(user, 2 SECONDS, target = src)) - var/turf/toiletbong_location = loc - toiletbong_location.hotspot_expose(1000, 5) - for (var/obj/item/item in contents) - if (item.resistance_flags & INDESTRUCTIBLE) - user.balloon_alert(user, "[item.name] is blocking the pipes!") - continue - playsound(src, 'sound/items/modsuit/flamethrower.ogg', 50) - var/datum/effect_system/fluid_spread/smoke/chem/smoke_machine/puff = new - puff.set_up(smokeradius, holder = src, location = user, carry = item.reagents, efficiency = 20) - puff.start() - if (prob(5) && !emagged) - if(islizard(user)) - user.balloon_alert(user, "a hidden treat!") - user.visible_message(span_danger("[user] fishes a mouse out of the pipes.")) - else - to_chat(user, span_userdanger("There was something disgusting in the pipes!")) - user.visible_message(span_danger("[user] spits out a mouse.")) - user.adjust_disgust(50) - user.vomit(VOMIT_CATEGORY_DEFAULT) - var/mob/living/spawned_mob = new /mob/living/basic/mouse(get_turf(user)) - spawned_mob.faction |= "[REF(user)]" - if(prob(50)) - for(var/j in 1 to rand(1, 3)) - step(spawned_mob, pick(NORTH,SOUTH,EAST,WEST)) - qdel(item) - if(!emagged) - break - update_icon() + if (!do_after(user, 2 SECONDS, target = src)) + return + var/turf/toiletbong_location = loc + toiletbong_location.hotspot_expose(1000, 5) + for (var/obj/item/item in contents) + if (item.resistance_flags & INDESTRUCTIBLE) + user.balloon_alert(user, "[item.name] is blocking the pipes!") + continue + playsound(src, 'sound/items/modsuit/flamethrower.ogg', 50) + var/datum/effect_system/fluid_spread/smoke/chem/smoke_machine/puff = new + puff.set_up(smokeradius, holder = src, location = user, carry = item.reagents, efficiency = 20) + puff.start() + if (prob(5) && !(obj_flags & EMAGGED)) + if(user.get_liked_foodtypes() & GORE) + user.balloon_alert(user, "a hidden treat!") + user.visible_message(span_danger("[user] fishes a mouse out of the pipes.")) + else + to_chat(user, span_userdanger("There was something disgusting in the pipes!")) + user.visible_message(span_danger("[user] spits out a mouse.")) + user.adjust_disgust(50) + user.vomit(VOMIT_CATEGORY_DEFAULT) + var/mob/living/spawned_mob = new /mob/living/basic/mouse(get_turf(user)) + spawned_mob.faction |= "[REF(user)]" + if(prob(50)) + for(var/j in 1 to rand(1, 3)) + step(spawned_mob, pick(NORTH,SOUTH,EAST,WEST)) + qdel(item) + if(!(obj_flags & EMAGGED)) + break + update_appearance(UPDATE_ICON) /obj/structure/toiletbong/wrench_act(mob/living/user, obj/item/tool) - tool.play_tool_sound(src) - if(anchored) - to_chat(user, span_notice("You begin unsecuring the [src].")) - anchored = FALSE - else - to_chat(user, span_notice("You secure the [src] to the floor.")) - anchored = TRUE - return TRUE + ..() + default_unfasten_wrench(user, tool) + return ITEM_INTERACT_SUCCESS + +///Called in the simple rotation's post_rotation callback, playing a sound cue to players. +/obj/structure/toiletbong/proc/post_rotation(mob/user, degrees) + playsound(src, 'sound/items/deconstruct.ogg', 50) /obj/structure/toiletbong/crowbar_act(mob/living/user, obj/item/tool) if(anchored) @@ -86,26 +89,18 @@ qdel(src) return TRUE -/obj/structure/toiletbong/AltClick(mob/living/user) - if(anchored) - return ..() - setDir(turn(dir,90)) - playsound(src, 'sound/items/deconstruct.ogg', 50) - return - /obj/structure/toiletbong/emag_act(mob/user, obj/item/card/emag/emag_card) + if(obj_flags & EMAGGED) + return FALSE + obj_flags |= EMAGGED + smokeradius = 2 playsound(src, 'sound/effects/fish_splash.ogg', 50) - user.balloon_alert(user, "whoops!") - if(!emagged) - emagged = TRUE - smokeradius = 2 - balloon_alert(user, "toilet broke") - if (emag_card) - to_chat(user, span_boldwarning("The [emag_card] falls into the toilet. You fish it back out. Looks like you broke the toilet.")) - return TRUE - return FALSE + balloon_alert(user, "toilet broke") + if (emag_card) + to_chat(user, span_boldwarning("The [emag_card] falls into the toilet. You fish it back out. Looks like you broke the toilet.")) + return TRUE -/obj/structure/toiletbong/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/card/emag)) +/obj/structure/toiletbong/attackby(obj/item/attacking_item, mob/user, params) + if(istype(attacking_item, /obj/item/card/emag)) return - . = ..() + return ..() diff --git a/code/game/objects/structures/transit_tubes/transit_tube_construction.dm b/code/game/objects/structures/transit_tubes/transit_tube_construction.dm index cc9de4cdb95..44952801ec7 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube_construction.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube_construction.dm @@ -15,7 +15,7 @@ /obj/structure/c_transit_tube/Initialize(mapload) . = ..() - AddComponent(/datum/component/simple_rotation, AfterRotation = CALLBACK(src, PROC_REF(AfterRotation))) + AddComponent(/datum/component/simple_rotation, post_rotation = CALLBACK(src, PROC_REF(post_rotation))) /obj/structure/c_transit_tube/proc/can_wrench_in_loc(mob/user) var/turf/source_turf = get_turf(loc) @@ -27,7 +27,7 @@ return FALSE return TRUE -/obj/structure/c_transit_tube/proc/AfterRotation(mob/user, degrees) +/obj/structure/c_transit_tube/proc/post_rotation(mob/user, degrees) if(flipped_build_type && degrees == ROTATION_FLIP) setDir(turn(dir, degrees)) //Turn back we don't actually flip flipped = !flipped diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 755fd7653d2..2231fb67121 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -14,7 +14,7 @@ armor_type = /datum/armor/structure_window can_atmos_pass = ATMOS_PASS_PROC rad_insulation = RAD_VERY_LIGHT_INSULATION - pass_flags_self = PASSGLASS + pass_flags_self = PASSGLASS | PASSWINDOW set_dir_on_move = FALSE flags_ricochet = RICOCHET_HARD receive_ricochet_chance_mod = 0.5 @@ -67,7 +67,7 @@ flags_1 |= ALLOW_DARK_PAINTS_1 RegisterSignal(src, COMSIG_OBJ_PAINTED, PROC_REF(on_painted)) AddElement(/datum/element/atmos_sensitive, mapload) - AddComponent(/datum/component/simple_rotation, ROTATION_NEEDS_ROOM, AfterRotation = CALLBACK(src, PROC_REF(AfterRotation))) + AddComponent(/datum/component/simple_rotation, ROTATION_NEEDS_ROOM, post_rotation = CALLBACK(src, PROC_REF(post_rotation))) var/static/list/loc_connections = list( COMSIG_ATOM_EXIT = PROC_REF(on_exit), @@ -358,7 +358,7 @@ dropped_debris += new /obj/item/stack/rods(location, (fulltile ? 2 : 1)) return dropped_debris -/obj/structure/window/proc/AfterRotation(mob/user, degrees) +/obj/structure/window/proc/post_rotation(mob/user, degrees) air_update_turf(TRUE, FALSE) /obj/structure/window/proc/on_painted(obj/structure/window/source, mob/user, obj/item/toy/crayon/spraycan/spraycan, is_dark_color) @@ -932,6 +932,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/reinforced/tinted/frosted/spaw icon_state = "clockwork_window-single" glass_type = /obj/item/stack/sheet/bronze +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/bronze/spawner, 0) + /obj/structure/window/bronze/unanchored anchored = FALSE diff --git a/code/game/sound.dm b/code/game/sound.dm index 20e4a13d574..4f98ed4a807 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -50,7 +50,7 @@ //allocate a channel if necessary now so its the same for everyone channel = channel || SSsounds.random_available_channel() - var/sound/S = sound(get_sfx(soundin)) + var/sound/S = isdatum(soundin) ? soundin : sound(get_sfx(soundin)) var/maxdistance = SOUND_RANGE + extrarange var/source_z = turf_source.z var/list/listeners = SSmobs.clients_by_zlevel[source_z].Copy() diff --git a/code/game/turfs/closed/indestructible.dm b/code/game/turfs/closed/indestructible.dm index d68fbe51b3e..408dc9ee590 100644 --- a/code/game/turfs/closed/indestructible.dm +++ b/code/game/turfs/closed/indestructible.dm @@ -121,6 +121,16 @@ NOVA EDIT REMOVAL END */ smoothing_groups = SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS canSmoothWith = SMOOTH_GROUP_WALLS +/turf/closed/indestructible/reinforced/titanium + name = "reinforced titanium imitation wall" + desc = "A huge chunk of reinforced metal used to separate rooms. Naturally, to cut down on costs, this is just a really good paint job to resemble titanium. Effectively impervious to conventional methods of destruction." + icon = 'icons/turf/walls/shuttle_wall.dmi' + icon_state = "shuttle_wall-0" + base_icon_state = "shuttle_wall" + +/turf/closed/indestructible/reinforced/titanium/nodiagonal + icon_state = "shuttle_wall-15" + smoothing_flags = SMOOTH_BITMASK /turf/closed/indestructible/riveted icon = 'icons/turf/walls/riveted.dmi' diff --git a/code/game/turfs/open/_open.dm b/code/game/turfs/open/_open.dm index e049c2c393f..472935f5ae5 100644 --- a/code/game/turfs/open/_open.dm +++ b/code/game/turfs/open/_open.dm @@ -115,12 +115,28 @@ /turf/open/indestructible/TerraformTurf(path, new_baseturf, flags, defer_change = FALSE, ignore_air = FALSE) return + +/turf/open/indestructible/large + icon_state = "floor_large" + /turf/open/indestructible/white icon_state = "white" +/turf/open/indestructible/white/smooth_large + icon_state = "white_large" + +/turf/open/indestructible/white/textured + icon_state = "textured_white" + /turf/open/indestructible/dark icon_state = "darkfull" +/turf/open/indestructible/dark/textured + icon_state = "textured_dark" + +/turf/open/indestructible/dark/smooth_large + icon_state = "dark_large" + /turf/open/indestructible/light icon_state = "light_on-1" @@ -232,6 +248,9 @@ /turf/open/indestructible/meat/airless initial_gas_mix = AIRLESS_ATMOS +/turf/open/indestructible/vault + icon_state = "rockvault" + /turf/open/indestructible/plating name = "plating" icon_state = "plating" @@ -243,6 +262,18 @@ /turf/open/indestructible/plating/airless initial_gas_mix = AIRLESS_ATMOS +/turf/open/indestructible/kitchen + icon_state = /turf/open/floor/iron/kitchen::icon_state + +/turf/open/indestructible/rockyground + icon_state = /turf/open/misc/ashplanet/rocky::icon_state + icon = /turf/open/misc/ashplanet/rocky::icon + name = /turf/open/misc/ashplanet/rocky::name + +/turf/open/indestructible/stone + icon_state = /turf/open/floor/stone::icon_state + name = /turf/open/floor/stone::name + /turf/open/Initalize_Atmos(time) excited = FALSE update_visuals() diff --git a/code/game/turfs/open/chasm.dm b/code/game/turfs/open/chasm.dm index 48ab1ceca38..142d966172b 100644 --- a/code/game/turfs/open/chasm.dm +++ b/code/game/turfs/open/chasm.dm @@ -119,3 +119,19 @@ /turf/open/chasm/true/apply_components(mapload) AddComponent(/datum/component/chasm, null, mapload) //Don't pass anything for below_turf. + +/turf/open/chasm/true/no_smooth + smoothing_flags = NONE + +/turf/open/chasm/true/no_smooth/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) + return FALSE + +/turf/open/chasm/true/no_smooth/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, list/rcd_data) + return FALSE + +/turf/open/chasm/true/no_smooth/attackby(obj/item/item, mob/user, params, area/area_restriction) + if(istype(item, /obj/item/stack/rods)) + return + else if(istype(item, /obj/item/stack/tile/iron)) + return + return ..() diff --git a/code/game/turfs/open/lava.dm b/code/game/turfs/open/lava.dm index 1a174723d85..8f9e7b44aa6 100644 --- a/code/game/turfs/open/lava.dm +++ b/code/game/turfs/open/lava.dm @@ -52,7 +52,8 @@ /turf/open/lava/Destroy() for(var/mob/living/leaving_mob in contents) - REMOVE_TRAIT(leaving_mob, TRAIT_PERMANENTLY_ONFIRE, TURF_TRAIT) + leaving_mob.RemoveElement(/datum/element/perma_fire_overlay) + REMOVE_TRAIT(leaving_mob, TRAIT_NO_EXTINGUISH, TURF_TRAIT) return ..() /turf/open/lava/update_overlays() @@ -144,7 +145,8 @@ /turf/open/lava/Exited(atom/movable/gone, direction) . = ..() if(isliving(gone) && !islava(gone.loc)) - REMOVE_TRAIT(gone, TRAIT_PERMANENTLY_ONFIRE, TURF_TRAIT) + gone.RemoveElement(/datum/element/perma_fire_overlay) + REMOVE_TRAIT(gone, TRAIT_NO_EXTINGUISH, TURF_TRAIT) /turf/open/lava/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) if(burn_stuff(AM)) @@ -292,11 +294,10 @@ if(QDELETED(burn_target)) return FALSE - . = TRUE if(isobj(burn_target)) var/obj/burn_obj = burn_target if(burn_obj.resistance_flags & ON_FIRE) // already on fire; skip it. - return + return TRUE if(!(burn_obj.resistance_flags & FLAMMABLE)) burn_obj.resistance_flags |= FLAMMABLE //Even fireproof things burn up in lava if(burn_obj.resistance_flags & FIRE_PROOF) @@ -305,17 +306,21 @@ burn_obj.set_armor_rating(FIRE, 50) burn_obj.fire_act(temperature_damage, 1000 * seconds_per_tick) if(istype(burn_obj, /obj/structure/closet)) - var/obj/structure/closet/burn_closet = burn_obj - for(var/burn_content in burn_closet.contents) + for(var/burn_content in burn_target) burn_stuff(burn_content) - return + return TRUE - var/mob/living/burn_living = burn_target - ADD_TRAIT(burn_living, TRAIT_PERMANENTLY_ONFIRE, TURF_TRAIT) - burn_living.ignite_mob() - burn_living.adjust_fire_stacks(lava_firestacks * seconds_per_tick) - burn_living.update_fire() - burn_living.adjustFireLoss(lava_damage * seconds_per_tick) + if(isliving(burn_target)) + var/mob/living/burn_living = burn_target + if(!HAS_TRAIT_FROM(burn_living, TRAIT_NO_EXTINGUISH, TURF_TRAIT)) + burn_living.AddElement(/datum/element/perma_fire_overlay) + ADD_TRAIT(burn_living, TRAIT_NO_EXTINGUISH, TURF_TRAIT) + burn_living.adjust_fire_stacks(lava_firestacks * seconds_per_tick) + burn_living.ignite_mob() + burn_living.adjustFireLoss(lava_damage * seconds_per_tick) + return TRUE + + return FALSE /turf/open/lava/can_cross_safely(atom/movable/crossing) return HAS_TRAIT(src, TRAIT_LAVA_STOPPED) || HAS_TRAIT(crossing, immunity_trait ) || HAS_TRAIT(crossing, TRAIT_MOVE_FLYING) diff --git a/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm b/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm index 66004140e59..14d8d737886 100644 --- a/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm +++ b/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm @@ -446,7 +446,7 @@ Congratulations! You are now trained for invasive xenobiology research!"} if(ishuman(victim)) var/mob/living/carbon/human/human_victim = victim species = span_notice("[human_victim.dna.species.name]") - if(human_victim.mind && human_victim.mind.has_antag_datum(/datum/antagonist/changeling)) + if(IS_CHANGELING(human_victim)) species = span_warning("Changeling lifeform") var/obj/item/organ/internal/heart/gland/temp = locate() in human_victim.organs if(temp) diff --git a/code/modules/antagonists/brainwashing/brainwashing.dm b/code/modules/antagonists/brainwashing/brainwashing.dm index 7a84fc183c4..524bfb04362 100644 --- a/code/modules/antagonists/brainwashing/brainwashing.dm +++ b/code/modules/antagonists/brainwashing/brainwashing.dm @@ -54,10 +54,6 @@ owner.announce_objectives() return ..() -/datum/antagonist/brainwashed/on_mindshield(mob/implanter) - owner.remove_antag_datum(/datum/antagonist/brainwashed) - return COMPONENT_MINDSHIELD_DECONVERTED - /datum/antagonist/brainwashed/admin_add(datum/mind/new_owner,mob/admin) var/mob/living/carbon/C = new_owner.current if(!istype(C)) diff --git a/code/modules/antagonists/changeling/changeling_power.dm b/code/modules/antagonists/changeling/changeling_power.dm index 9e8c0fa04e9..59656fd80bd 100644 --- a/code/modules/antagonists/changeling/changeling_power.dm +++ b/code/modules/antagonists/changeling/changeling_power.dm @@ -44,7 +44,7 @@ the same goes for Remove(). if you override Remove(), call parent or else your p /datum/action/changeling/Trigger(trigger_flags) var/mob/user = owner - if(!user || !user.mind || !user.mind.has_antag_datum(/datum/antagonist/changeling)) + if(!user || !IS_CHANGELING(user)) return try_to_sting(user) @@ -61,7 +61,7 @@ the same goes for Remove(). if you override Remove(), call parent or else your p /datum/action/changeling/proc/try_to_sting(mob/living/user, mob/living/target) if(!can_sting(user, target)) return FALSE - var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/changeling = IS_CHANGELING(user) if(sting_action(user, target)) sting_feedback(user, target) changeling.adjust_chemicals(-chemical_cost) @@ -81,7 +81,7 @@ the same goes for Remove(). if you override Remove(), call parent or else your p /datum/action/changeling/proc/can_sting(mob/living/user, mob/living/target) if(!can_be_used_by(user)) return FALSE - var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/changeling = IS_CHANGELING(user) if(changeling.chem_charges < chemical_cost) user.balloon_alert(user, "needs [chemical_cost] chemicals!") return FALSE diff --git a/code/modules/antagonists/changeling/powers/absorb.dm b/code/modules/antagonists/changeling/powers/absorb.dm index 1fdb50a7bab..5bd0f390cb8 100644 --- a/code/modules/antagonists/changeling/powers/absorb.dm +++ b/code/modules/antagonists/changeling/powers/absorb.dm @@ -24,13 +24,13 @@ return var/mob/living/carbon/target = owner.pulling - var/datum/antagonist/changeling/changeling = owner.mind.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/changeling = IS_CHANGELING(owner) return changeling.can_absorb_dna(target) /datum/action/changeling/absorb_dna/sting_action(mob/owner) SHOULD_CALL_PARENT(FALSE) // the only reason to call parent is for proper blackbox logging, and we do that ourselves in a snowflake way - var/datum/antagonist/changeling/changeling = owner.mind.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/changeling = IS_CHANGELING(owner) var/mob/living/carbon/human/target = owner.pulling is_absorbing = TRUE @@ -68,7 +68,7 @@ /datum/action/changeling/absorb_dna/proc/absorb_memories(mob/living/carbon/human/target) var/datum/mind/suckedbrain = target.mind - var/datum/antagonist/changeling/changeling = owner.mind.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/changeling = IS_CHANGELING(owner) for(var/memory_type in suckedbrain.memories) var/datum/memory/stolen_memory = suckedbrain.memories[memory_type] @@ -109,7 +109,7 @@ to_chat(owner, span_boldnotice("We have no more knowledge of [target]'s speech patterns.")) - var/datum/antagonist/changeling/target_ling = target.mind.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/target_ling = IS_CHANGELING(target) if(target_ling)//If the target was a changeling, suck out their extra juice and objective points! to_chat(owner, span_boldnotice("[target] was one of us. We have absorbed their power.")) diff --git a/code/modules/antagonists/changeling/powers/biodegrade.dm b/code/modules/antagonists/changeling/powers/biodegrade.dm index eba507ad5e0..ef3070356d5 100644 --- a/code/modules/antagonists/changeling/powers/biodegrade.dm +++ b/code/modules/antagonists/changeling/powers/biodegrade.dm @@ -65,6 +65,18 @@ ..() return TRUE + var/obj/item/clothing/shoes/shoes = user.shoes + if(istype(shoes) && shoes.tied == SHOES_KNOTTED && !(shoes.resistance_flags & (INDESTRUCTIBLE|UNACIDABLE|ACID_PROOF))) + new /obj/effect/decal/cleanable/greenglow(shoes.drop_location()) + user.visible_message( + span_warning("[user] vomits a glob of acid on [user.p_their()] tied up [shoes.name], melting [shoes.p_them()] into a pool of goo!"), + span_warning("We vomit acidic ooze onto our tied up [shoes.name], melting [shoes.p_them()] into a pool of goo!"), + ) + log_combat(user, shoes, "melted own shoes", addition = "(biodegrade)") + qdel(shoes) + ..() + return TRUE + user.balloon_alert(user, "already free!") return FALSE diff --git a/code/modules/antagonists/changeling/powers/fakedeath.dm b/code/modules/antagonists/changeling/powers/fakedeath.dm index cd748e83159..921dde35492 100644 --- a/code/modules/antagonists/changeling/powers/fakedeath.dm +++ b/code/modules/antagonists/changeling/powers/fakedeath.dm @@ -40,6 +40,7 @@ return changeling.fakedeath(CHANGELING_TRAIT) + ADD_TRAIT(changeling, TRAIT_STASIS, CHANGELING_TRAIT) addtimer(CALLBACK(src, PROC_REF(ready_to_regenerate), changeling), fakedeath_duration * duration_modifier, TIMER_UNIQUE) // Basically, these let the ling exit stasis without giving away their ling-y-ness if revived through other means RegisterSignal(changeling, SIGNAL_REMOVETRAIT(TRAIT_DEATHCOMA), PROC_REF(fakedeath_reset)) @@ -54,6 +55,7 @@ revive_ready = FALSE build_all_button_icons(UPDATE_BUTTON_NAME|UPDATE_BUTTON_ICON) + REMOVE_TRAIT(changeling, TRAIT_STASIS, CHANGELING_TRAIT) UnregisterSignal(changeling, SIGNAL_REMOVETRAIT(TRAIT_DEATHCOMA)) UnregisterSignal(changeling, COMSIG_MOB_STATCHANGE) @@ -116,7 +118,7 @@ if(QDELETED(src) || QDELETED(user)) return - var/datum/antagonist/changeling/ling = user.mind?.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/ling = IS_CHANGELING(user) if(QDELETED(ling) || !(src in ling.innate_powers + ling.purchased_powers)) // checking both innate and purchased for full coverage return if(!HAS_TRAIT_FROM(user, TRAIT_DEATHCOMA, CHANGELING_TRAIT)) diff --git a/code/modules/antagonists/changeling/powers/lesserform.dm b/code/modules/antagonists/changeling/powers/lesserform.dm index 87bd7c7c8b6..55238ce762d 100644 --- a/code/modules/antagonists/changeling/powers/lesserform.dm +++ b/code/modules/antagonists/changeling/powers/lesserform.dm @@ -30,7 +30,7 @@ if(user.movement_type & VENTCRAWLING) user.balloon_alert(user, "can't transform in pipes!") return FALSE - var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/changeling = IS_CHANGELING(user) var/datum/changeling_profile/chosen_form = select_form(changeling, user) if(!chosen_form) return FALSE diff --git a/code/modules/antagonists/changeling/powers/mimic_voice.dm b/code/modules/antagonists/changeling/powers/mimic_voice.dm index 3a9314a953a..9caf0abb450 100644 --- a/code/modules/antagonists/changeling/powers/mimic_voice.dm +++ b/code/modules/antagonists/changeling/powers/mimic_voice.dm @@ -9,7 +9,7 @@ // Fake Voice /datum/action/changeling/mimicvoice/sting_action(mob/user) - var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/changeling = IS_CHANGELING(user) if(changeling.mimicing) changeling.mimicing = "" changeling.chem_recharge_slowdown -= 0.25 @@ -27,7 +27,7 @@ return TRUE /datum/action/changeling/mimicvoice/Remove(mob/user) - var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/changeling = IS_CHANGELING(user) if(changeling?.mimicing) changeling.chem_recharge_slowdown = max(0, changeling.chem_recharge_slowdown - 0.25) changeling.mimicing = "" diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index 9c5b6a10ec9..7ad2b14448c 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -121,7 +121,7 @@ //checks if we already have an organic suit and casts it off. /datum/action/changeling/suit/proc/check_suit(mob/user) - var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/changeling = IS_CHANGELING(user) if(!ishuman(user) || !changeling) return 1 var/mob/living/carbon/human/H = user @@ -154,7 +154,7 @@ user.equip_to_slot_if_possible(new suit_type(user), ITEM_SLOT_OCLOTHING, 1, 1, 1) user.equip_to_slot_if_possible(new helmet_type(user), ITEM_SLOT_HEAD, 1, 1, 1) - var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/changeling = IS_CHANGELING(user) changeling.chem_recharge_slowdown += recharge_slowdown return TRUE @@ -477,7 +477,7 @@ weapon_name_simple = "shield" /datum/action/changeling/weapon/shield/sting_action(mob/user) - var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) //So we can read the absorbed_count. + var/datum/antagonist/changeling/changeling = IS_CHANGELING(user) //So we can read the absorbed_count. if(!changeling) return diff --git a/code/modules/antagonists/changeling/powers/pheromone_receptors.dm b/code/modules/antagonists/changeling/powers/pheromone_receptors.dm index 8ed9c27599b..18fda4bf4ff 100644 --- a/code/modules/antagonists/changeling/powers/pheromone_receptors.dm +++ b/code/modules/antagonists/changeling/powers/pheromone_receptors.dm @@ -15,14 +15,14 @@ /datum/action/changeling/pheromone_receptors/Remove(mob/living/carbon/user) if(receptors_active) - var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/changeling = IS_CHANGELING(user) changeling.chem_recharge_slowdown -= 0.25 user.remove_status_effect(/datum/status_effect/agent_pinpointer/changeling) ..() /datum/action/changeling/pheromone_receptors/sting_action(mob/living/carbon/user) ..() - var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/changeling = IS_CHANGELING(user) if(!receptors_active) to_chat(user, span_warning("We search for the scent of any nearby changelings.")) changeling.chem_recharge_slowdown += 0.25 @@ -49,7 +49,7 @@ for(var/mob/living/carbon/C in GLOB.alive_mob_list) if(C != owner && C.mind) - var/datum/antagonist/changeling/antag_datum = C.mind.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/antag_datum = IS_CHANGELING(C) if(istype(antag_datum)) var/their_loc = get_turf(C) var/distance = get_dist_euclidian(my_loc, their_loc) diff --git a/code/modules/antagonists/changeling/powers/shriek.dm b/code/modules/antagonists/changeling/powers/shriek.dm index badd18f19f0..aa204d89a16 100644 --- a/code/modules/antagonists/changeling/powers/shriek.dm +++ b/code/modules/antagonists/changeling/powers/shriek.dm @@ -16,7 +16,7 @@ for(var/mob/living/M in get_hearers_in_view(4, user)) if(iscarbon(M)) var/mob/living/carbon/C = M - if(!C.mind || !C.mind.has_antag_datum(/datum/antagonist/changeling)) + if(!IS_CHANGELING(C)) var/obj/item/organ/internal/ears/ears = C.get_organ_slot(ORGAN_SLOT_EARS) if(ears) ears.adjustEarDamage(0, 30) diff --git a/code/modules/antagonists/changeling/powers/tiny_prick.dm b/code/modules/antagonists/changeling/powers/tiny_prick.dm index 918ed0d4398..25092a26258 100644 --- a/code/modules/antagonists/changeling/powers/tiny_prick.dm +++ b/code/modules/antagonists/changeling/powers/tiny_prick.dm @@ -6,7 +6,7 @@ var/mob/user = owner if(!user || !user.mind) return - var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/changeling = IS_CHANGELING(user) if(!changeling) return if(!changeling.chosen_sting) @@ -17,7 +17,7 @@ /datum/action/changeling/sting/proc/set_sting(mob/user) to_chat(user, span_notice("We prepare our sting. Alt+click or click the middle mouse button on a target to sting them.")) - var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/changeling = IS_CHANGELING(user) changeling.chosen_sting = src changeling.lingstingdisplay.icon_state = button_icon_state @@ -25,7 +25,7 @@ /datum/action/changeling/sting/proc/unset_sting(mob/user) to_chat(user, span_warning("We retract our sting, we can't sting anyone for now.")) - var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/changeling = IS_CHANGELING(user) changeling.chosen_sting = null changeling.lingstingdisplay.icon_state = null @@ -40,7 +40,7 @@ /datum/action/changeling/sting/can_sting(mob/user, mob/target) if(!..()) return - var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/changeling = IS_CHANGELING(user) if(!changeling.chosen_sting) to_chat(user, "We haven't prepared our sting yet!") if(!iscarbon(target)) @@ -53,7 +53,7 @@ return // NOVA EDIT END if(!length(get_path_to(user, target, max_distance = changeling.sting_range, simulated_only = FALSE))) return // no path within the sting's range is found. what a weird place to use the pathfinding system - if(target.mind && target.mind.has_antag_datum(/datum/antagonist/changeling)) + if(IS_CHANGELING(target)) sting_feedback(user, target) changeling.chem_charges -= chemical_cost return 1 @@ -62,7 +62,7 @@ if(!target) return to_chat(user, span_notice("We stealthily sting [target.name].")) - if(target.mind && target.mind.has_antag_datum(/datum/antagonist/changeling)) + if(IS_CHANGELING(target)) to_chat(target, span_warning("You feel a tiny prick.")) return 1 @@ -96,7 +96,7 @@ /datum/action/changeling/sting/transformation/set_sting(mob/user) selected_dna = null - var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/changeling = IS_CHANGELING(user) var/datum/changeling_profile/new_selected_dna = changeling.select_dna() if(QDELETED(src) || QDELETED(changeling) || QDELETED(user)) return @@ -200,13 +200,13 @@ /datum/action/changeling/sting/extract_dna/can_sting(mob/user, mob/target) if(..()) - var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/changeling = IS_CHANGELING(user) return changeling.can_absorb_dna(target) /datum/action/changeling/sting/extract_dna/sting_action(mob/user, mob/living/carbon/human/target) ..() log_combat(user, target, "stung", "extraction sting") - var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/changeling = IS_CHANGELING(user) if(!changeling.has_profile_with_dna(target.dna)) changeling.add_new_profile(target) return TRUE diff --git a/code/modules/antagonists/changeling/powers/transform.dm b/code/modules/antagonists/changeling/powers/transform.dm index 69f21b0e44e..aea06a27e1e 100644 --- a/code/modules/antagonists/changeling/powers/transform.dm +++ b/code/modules/antagonists/changeling/powers/transform.dm @@ -13,7 +13,7 @@ //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/item/clothing/glasses/changeling/attack_hand(mob/user, list/modifiers) - if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling)) + if(loc == user && IS_CHANGELING(user)) to_chat(user, span_notice("You reabsorb [src] into your body.")) qdel(src) return @@ -25,7 +25,7 @@ //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/item/clothing/under/changeling/attack_hand(mob/user, list/modifiers) - if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling)) + if(loc == user && IS_CHANGELING(user)) to_chat(user, span_notice("You reabsorb [src] into your body.")) qdel(src) return @@ -38,7 +38,7 @@ //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/item/clothing/suit/changeling/attack_hand(mob/user, list/modifiers) - if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling)) + if(loc == user && IS_CHANGELING(user)) to_chat(user, span_notice("You reabsorb [src] into your body.")) qdel(src) return @@ -51,7 +51,7 @@ //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/item/clothing/head/changeling/attack_hand(mob/user, list/modifiers) - if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling)) + if(loc == user && IS_CHANGELING(user)) to_chat(user, span_notice("You reabsorb [src] into your body.")) qdel(src) return @@ -63,7 +63,7 @@ //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/item/clothing/shoes/changeling/attack_hand(mob/user, list/modifiers) - if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling)) + if(loc == user && IS_CHANGELING(user)) to_chat(user, span_notice("You reabsorb [src] into your body.")) qdel(src) return @@ -75,7 +75,7 @@ //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/item/clothing/gloves/changeling/attack_hand(mob/user, list/modifiers) - if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling)) + if(loc == user && IS_CHANGELING(user)) to_chat(user, span_notice("You reabsorb [src] into your body.")) qdel(src) return @@ -87,7 +87,7 @@ //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/item/clothing/mask/changeling/attack_hand(mob/user, list/modifiers) - if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling)) + if(loc == user && IS_CHANGELING(user)) to_chat(user, span_notice("You reabsorb [src] into your body.")) qdel(src) return @@ -100,7 +100,7 @@ //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/item/changeling/attack_hand(mob/user, list/modifiers) - if(loc == user && user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling)) + if(loc == user && IS_CHANGELING(user)) to_chat(user, span_notice("You reabsorb [src] into your body.")) qdel(src) return @@ -134,7 +134,7 @@ //Change our DNA to that of somebody we've absorbed. /datum/action/changeling/transform/sting_action(mob/living/carbon/human/user) - var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/changeling = IS_CHANGELING(user) var/datum/changeling_profile/chosen_prof = changeling.select_dna() if(!chosen_prof) @@ -186,7 +186,7 @@ /datum/antagonist/changeling/proc/check_menu(mob/living/carbon/user) if(!istype(user)) return FALSE - var/datum/antagonist/changeling/changeling_datum = user.mind.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/changeling_datum = IS_CHANGELING(user) if(!changeling_datum) return FALSE return TRUE diff --git a/code/modules/antagonists/changeling/powers/void_adaption.dm b/code/modules/antagonists/changeling/powers/void_adaption.dm index 76c0eeffc97..934ae2f5770 100644 --- a/code/modules/antagonists/changeling/powers/void_adaption.dm +++ b/code/modules/antagonists/changeling/powers/void_adaption.dm @@ -55,14 +55,14 @@ if (!should_be_active) on_removed_adaption(void_adapted, "Our cells relax in safer air.") return - var/datum/antagonist/changeling/changeling_data = void_adapted.mind?.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/changeling_data = IS_CHANGELING(void_adapted) to_chat(void_adapted, span_changeling("Our cells harden themselves against the [pick(active_reasons)].")) changeling_data?.chem_recharge_slowdown -= recharge_slowdown currently_active = TRUE /// Called when we stop being adapted /datum/action/changeling/void_adaption/proc/on_removed_adaption(mob/living/former, message) - var/datum/antagonist/changeling/changeling_data = former.mind?.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/changeling_data = IS_CHANGELING(former) to_chat(former, span_changeling(message)) changeling_data?.chem_recharge_slowdown += recharge_slowdown currently_active = FALSE diff --git a/code/modules/antagonists/heretic/heretic_knowledge.dm b/code/modules/antagonists/heretic/heretic_knowledge.dm index cb9f3b75ccc..f2cf7b00047 100644 --- a/code/modules/antagonists/heretic/heretic_knowledge.dm +++ b/code/modules/antagonists/heretic/heretic_knowledge.dm @@ -211,7 +211,8 @@ /datum/heretic_knowledge/spell/on_lose(mob/user, datum/antagonist/heretic/our_heretic) var/datum/action/cooldown/spell/created_spell = created_spell_ref?.resolve() - created_spell?.Remove(user) + if(created_spell?.owner == user) + created_spell.Remove(user) /** * A knowledge subtype for knowledge that can only diff --git a/code/modules/antagonists/heretic/items/heretic_necks.dm b/code/modules/antagonists/heretic/items/heretic_necks.dm index 44e387cf970..c1f244dfd0e 100644 --- a/code/modules/antagonists/heretic/items/heretic_necks.dm +++ b/code/modules/antagonists/heretic/items/heretic_necks.dm @@ -55,7 +55,7 @@ // The amulette conversion tool used by moon heretics /obj/item/clothing/neck/heretic_focus/moon_amulette name = "Moonlight Amulette" - desc = "A piece of the mind, the sight and the moon. Gazing into it makes your head spin and hear whispers of laughter and joy." + desc = "A piece of the mind, the soul and the moon. Gazing into it makes your head spin and hear whispers of laughter and joy." icon = 'icons/obj/antags/eldritch.dmi' icon_state = "moon_amulette" w_class = WEIGHT_CLASS_SMALL @@ -64,7 +64,7 @@ /obj/item/clothing/neck/heretic_focus/moon_amulette/attack(mob/living/target, mob/living/user, params) var/mob/living/carbon/human/hit = target - if(!IS_HERETIC(user)) + if(!IS_HERETIC_OR_MONSTER(user)) user.balloon_alert(user, "you feel a presence watching you") user.add_mood_event("Moon Amulette Insanity", /datum/mood_event/amulette_insanity) user.mob_mood.set_sanity(user.mob_mood.sanity - 50) @@ -73,7 +73,7 @@ return if(!hit.mob_mood) return - if(hit.mob_mood.sanity_level < SANITY_LEVEL_CRAZY) + if(hit.mob_mood.sanity_level < SANITY_LEVEL_UNSTABLE) user.balloon_alert(user, "their mind is too strong!") hit.add_mood_event("Moon Amulette Insanity", /datum/mood_event/amulette_insanity) hit.mob_mood.set_sanity(hit.mob_mood.sanity - sanity_damage) diff --git a/code/modules/antagonists/heretic/items/keyring.dm b/code/modules/antagonists/heretic/items/keyring.dm index a6a53bc3cee..b71015dbfe1 100644 --- a/code/modules/antagonists/heretic/items/keyring.dm +++ b/code/modules/antagonists/heretic/items/keyring.dm @@ -3,7 +3,7 @@ desc = "A crack in space, impossibly deep and painful to the eyes. Definitely not safe." icon = 'icons/effects/eldritch.dmi' icon_state = "realitycrack" - light_system = STATIC_LIGHT + light_system = COMPLEX_LIGHT light_power = 1 light_on = TRUE light_color = COLOR_GREEN diff --git a/code/modules/antagonists/heretic/knowledge/blade_lore.dm b/code/modules/antagonists/heretic/knowledge/blade_lore.dm index 257f87d7c9f..93983c41e0d 100644 --- a/code/modules/antagonists/heretic/knowledge/blade_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/blade_lore.dm @@ -384,7 +384,7 @@ /datum/heretic_knowledge/ultimate/blade_final name = "Maelstrom of Silver" desc = "The ascension ritual of the Path of Blades. \ - Bring 3 headless corpses to a transmutation rune to complete the ritual. \ + Bring 3 corpses with either no head or a split skull to a transmutation rune to complete the ritual. \ When completed, you will be surrounded in a constant, regenerating orbit of blades. \ These blades will protect you from all attacks, but are consumed on use. \ Your Furious Steel spell will also have a shorter cooldown. \ @@ -399,7 +399,7 @@ if(!.) return FALSE - return !sacrifice.get_bodypart(BODY_ZONE_HEAD) + return !sacrifice.get_bodypart(BODY_ZONE_HEAD) || HAS_TRAIT(sacrifice, TRAIT_HAS_CRANIAL_FISSURE) /datum/heretic_knowledge/ultimate/blade_final/on_finished_recipe(mob/living/user, list/selected_atoms, turf/loc) . = ..() diff --git a/code/modules/antagonists/heretic/knowledge/moon_lore.dm b/code/modules/antagonists/heretic/knowledge/moon_lore.dm index 57d99a355f0..d7d1bd3bf22 100644 --- a/code/modules/antagonists/heretic/knowledge/moon_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/moon_lore.dm @@ -67,11 +67,11 @@ var/mob/living/carbon/carbon_target = target to_chat(carbon_target, span_danger("You hear echoing laughter from above")) carbon_target.cause_hallucination(/datum/hallucination/delusion/preset/moon, "delusion/preset/moon hallucination caused by mansus grasp") - carbon_target.mob_mood.set_sanity(carbon_target.mob_mood.sanity-20) + carbon_target.mob_mood.set_sanity(carbon_target.mob_mood.sanity-30) /datum/heretic_knowledge/spell/moon_smile name = "Smile of the moon" - desc = "Grants you Smile of the moon, a ranged spell muting, blinding and deafening the target for a\ + desc = "Grants you Smile of the moon, a ranged spell muting, blinding, deafening and knocking down the target for a\ duration based on their sanity." gain_text = "The moon smiles upon us all and those who see its true side can bring its joy." next_knowledge = list( @@ -112,7 +112,7 @@ /datum/heretic_knowledge/moon_amulette name = "Moonlight Amulette" - desc = "Allows you to transmute 2 sheets of glass, a pair of eyes, a brain and a tie \ + desc = "Allows you to transmute 2 sheets of glass, a heart and a tie \ if the item is used on someone with low sanity they go berserk attacking everyone \ , if their sanity isnt low enough it decreases their mood." gain_text = "At the head of the parade he stood, the moon condensed into one mass, a reflection of the soul." @@ -124,7 +124,6 @@ /datum/heretic_knowledge/painting, ) required_atoms = list( - /obj/item/organ/internal/eyes = 1, /obj/item/organ/internal/heart = 1, /obj/item/stack/sheet/glass = 2, /obj/item/clothing/neck/tie = 1, @@ -190,11 +189,13 @@ /datum/heretic_knowledge/ultimate/moon_final/on_finished_recipe(mob/living/user, list/selected_atoms, turf/loc) . = ..() + var/datum/antagonist/heretic/heretic_datum = IS_HERETIC(user) priority_announce("[generate_heretic_text()] Laugh, for the ringleader [user.real_name] has ascended! \ The truth shall finally devour the lie! [generate_heretic_text()]","[generate_heretic_text()]", ANNOUNCER_SPANOMALIES) user.client?.give_award(/datum/award/achievement/misc/moon_ascension, user) ADD_TRAIT(user, TRAIT_MADNESS_IMMUNE, REF(src)) + heretic_datum.add_team_hud(user, /datum/antagonist/lunatic) RegisterSignal(user, COMSIG_LIVING_LIFE, PROC_REF(on_life)) @@ -237,6 +238,7 @@ amount_of_lunatics += 1 /datum/heretic_knowledge/ultimate/moon_final/proc/on_life(mob/living/source, seconds_per_tick, times_fired) + var/obj/effect/moon_effect = /obj/effect/temp_visual/moon_ringleader SIGNAL_HANDLER visible_hallucination_pulse( @@ -251,6 +253,7 @@ continue if(IS_HERETIC_OR_MONSTER(carbon_view)) continue + new moon_effect(get_turf(carbon_view)) carbon_view.adjust_confusion(2 SECONDS) carbon_view.mob_mood.set_sanity(carbon_sanity - 5) if(carbon_sanity < 30) diff --git a/code/modules/antagonists/heretic/magic/flesh_surgery.dm b/code/modules/antagonists/heretic/magic/flesh_surgery.dm index 0fb0a402da9..12b3fcfbcaf 100644 --- a/code/modules/antagonists/heretic/magic/flesh_surgery.dm +++ b/code/modules/antagonists/heretic/magic/flesh_surgery.dm @@ -85,23 +85,24 @@ /// If cast on an organ, we'll restore it's health and even un-fail it. /datum/action/cooldown/spell/touch/flesh_surgery/proc/heal_organ(obj/item/melee/touch_attack/hand, obj/item/organ/to_heal, mob/living/carbon/caster) + if(to_heal.damage == 0) + to_heal.balloon_alert(caster, "already in good condition!") + return FALSE to_heal.balloon_alert(caster, "healing organ...") if(!do_after(caster, 1 SECONDS, to_heal, extra_checks = CALLBACK(src, PROC_REF(heal_checks), hand, to_heal, caster))) to_heal.balloon_alert(caster, "interrupted!") return FALSE var/organ_hp_to_heal = to_heal.maxHealth * organ_percent_healing - if(to_heal.damage < organ_hp_to_heal) - to_heal.set_organ_damage(organ_hp_to_heal) - to_heal.balloon_alert(caster, "organ healed") - playsound(to_heal, 'sound/magic/staff_healing.ogg', 30) - new /obj/effect/temp_visual/cult/sparks(get_turf(to_heal)) - caster.visible_message( - span_warning("[caster]'s hand glows a brilliant red as [caster.p_they()] restore \the [to_heal] to good condition!"), - span_notice("Your hand glows a brilliant red as you restore \the [to_heal] to good condition!"), - ) - else - to_heal.balloon_alert(caster, "already in good condition!") + to_heal.set_organ_damage(max(0 , to_heal.damage - organ_hp_to_heal)) + to_heal.balloon_alert(caster, "organ healed") + playsound(to_heal, 'sound/magic/staff_healing.ogg', 30) + new /obj/effect/temp_visual/cult/sparks(get_turf(to_heal)) + var/condition = (to_heal.damage > 0) ? "better" : "perfect" + caster.visible_message( + span_warning("[caster]'s hand glows a brilliant red as [caster.p_they()] restore \the [to_heal] to [condition] condition!"), + span_notice("Your hand glows a brilliant red as you restore \the [to_heal] to [condition] condition!"), + ) return TRUE @@ -120,7 +121,7 @@ playsound(to_heal, 'sound/magic/staff_healing.ogg', 30) new /obj/effect/temp_visual/cult/sparks(get_turf(to_heal)) caster.visible_message( - span_warning("[caster]'s hand glows a brilliant red as [caster.p_they()] restore [to_heal] to good condition!"), + span_warning("[caster]'s hand glows a brilliant red as [caster.p_they()] restore[caster.p_s()] [to_heal] to good condition!"), span_notice("Your hand glows a brilliant red as you restore [to_heal] to good condition!"), ) return TRUE @@ -169,14 +170,14 @@ time_it_takes = 6 SECONDS caster.visible_message( - span_danger("[caster]'s hand glows a brilliant red as [caster.p_they()] reach directly into [caster.p_their()] own [parsed_zone]!"), + span_danger("[caster]'s hand glows a brilliant red as [caster.p_they()] reach[caster.p_es()] directly into [caster.p_their()] own [parsed_zone]!"), span_userdanger("Your hand glows a brilliant red as you reach directly into your own [parsed_zone]!"), ) else carbon_victim.visible_message( - span_danger("[caster]'s hand glows a brilliant red as [caster.p_they()] reach directly into [carbon_victim]'s [parsed_zone]!"), - span_userdanger("[caster]'s hand glows a brilliant red as [caster.p_they()] reach directly into your [parsed_zone]!"), + span_danger("[caster]'s hand glows a brilliant red as [caster.p_they()] reach[caster.p_es()] directly into [carbon_victim]'s [parsed_zone]!"), + span_userdanger("[caster]'s hand glows a brilliant red as [caster.p_they()] reach[caster.p_es()] directly into your [parsed_zone]!"), ) carbon_victim.balloon_alert(caster, "extracting [chosen_organ]...") @@ -184,6 +185,7 @@ carbon_victim.add_atom_colour(COLOR_DARK_RED, TEMPORARY_COLOUR_PRIORITY) if(!do_after(caster, time_it_takes, carbon_victim, extra_checks = CALLBACK(src, PROC_REF(extraction_checks), picked_organ, hand, victim, caster))) carbon_victim.balloon_alert(caster, "interrupted!") + carbon_victim.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, COLOR_DARK_RED) return FALSE // Visible message done before Remove() @@ -196,8 +198,8 @@ else carbon_victim.visible_message( - span_bolddanger("[caster]'s pulls [carbon_victim]'s [chosen_organ] out of [carbon_victim.p_their()] [parsed_zone]!!"), - span_userdanger("[caster]'s pulls your [chosen_organ] out of [carbon_victim.p_their()] [parsed_zone]!!"), + span_bolddanger("[caster] pulls [carbon_victim]'s [chosen_organ] out of [carbon_victim.p_their()] [parsed_zone]!!"), + span_userdanger("[caster] pulls your [chosen_organ] out of your [parsed_zone]!!"), ) picked_organ.Remove(carbon_victim) diff --git a/code/modules/antagonists/heretic/magic/moon_ringleader.dm b/code/modules/antagonists/heretic/magic/moon_ringleader.dm index af753bba92f..45d3285a876 100644 --- a/code/modules/antagonists/heretic/magic/moon_ringleader.dm +++ b/code/modules/antagonists/heretic/magic/moon_ringleader.dm @@ -52,12 +52,13 @@ victim.log_message("was driven insane by [caster]") victim.mob_mood.set_sanity(victim_sanity * 0.5) + /obj/effect/temp_visual/moon_ringleader icon = 'icons/effects/eldritch.dmi' icon_state = "ring_leader_effect" alpha = 180 duration = 6 -/obj/effect/temp_visual/moon_ringleader/Initialize(mapload) +/obj/effect/temp_visual/moon_ringleader/ringleader/Initialize(mapload) . = ..() transform = transform.Scale(10) diff --git a/code/modules/antagonists/heretic/magic/moon_smile.dm b/code/modules/antagonists/heretic/magic/moon_smile.dm index 75aba2c2ced..893059721c4 100644 --- a/code/modules/antagonists/heretic/magic/moon_smile.dm +++ b/code/modules/antagonists/heretic/magic/moon_smile.dm @@ -1,7 +1,7 @@ /datum/action/cooldown/spell/pointed/moon_smile name = "Smile of the moon" desc = "Lets you turn the gaze of the moon on someone \ - temporarily blinding, muting, deafening and confusing a single target." + temporarily blinding, muting, deafening and knocking down a single target." background_icon_state = "bg_heretic" overlay_icon_state = "bg_heretic_border" button_icon = 'icons/mob/actions/actions_ecult.dmi' @@ -36,13 +36,14 @@ playsound(cast_on, 'sound/hallucinations/i_see_you1.ogg', 50, 1) to_chat(cast_on, span_warning("Your eyes cry out in pain, your ears bleed and your lips seal! THE MOON SMILES UPON YOU!")) - cast_on.adjust_temp_blindness(moon_smile_duration SECONDS) - cast_on.set_eye_blur_if_lower(moon_smile_duration + 2 SECONDS) + cast_on.adjust_temp_blindness(moon_smile_duration + 5 SECONDS) + cast_on.set_eye_blur_if_lower(moon_smile_duration + 7 SECONDS) var/obj/item/organ/internal/ears/ears = cast_on.get_organ_slot(ORGAN_SLOT_EARS) - ears?.adjustEarDamage(0, moon_smile_duration) + ears?.adjustEarDamage(0, moon_smile_duration + 2 SECONDS) - cast_on.adjust_silence(moon_smile_duration SECONDS) + cast_on.adjust_silence(moon_smile_duration + 5 SECONDS) + cast_on.AdjustKnockdown(2 SECONDS) cast_on.add_mood_event("moon_smile", /datum/mood_event/moon_smile) //Lowers sanity cast_on.mob_mood.set_sanity(cast_on.mob_mood.sanity - 20) diff --git a/code/modules/antagonists/heretic/moon_lunatic.dm b/code/modules/antagonists/heretic/moon_lunatic.dm index cc6a304e074..21177f1a623 100644 --- a/code/modules/antagonists/heretic/moon_lunatic.dm +++ b/code/modules/antagonists/heretic/moon_lunatic.dm @@ -6,6 +6,7 @@ show_in_antagpanel = FALSE suicide_cry = "PRAISE THE RINGLEADER!!" antag_moodlet = /datum/mood_event/heretics/lunatic + antag_hud_name = "lunatic" can_assign_self_objectives = FALSE hardcore_random_bonus = FALSE // The mind of the ascended heretic who created us @@ -33,6 +34,9 @@ var/mob/living/our_mob = mob_override || owner.current handle_clown_mutation(our_mob, "Ancient knowledge from the moon has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.") our_mob.faction |= FACTION_HERETIC + add_team_hud(our_mob) + add_team_hud(our_mob, /datum/antagonist/heretic) + ADD_TRAIT(our_mob, TRAIT_MADNESS_IMMUNE, REF(src)) var/datum/action/cooldown/lunatic_track/moon_track = new /datum/action/cooldown/lunatic_track() var/datum/action/cooldown/spell/touch/mansus_grasp/mad_touch = new /datum/action/cooldown/spell/touch/mansus_grasp() diff --git a/code/modules/antagonists/heretic/status_effects/debuffs.dm b/code/modules/antagonists/heretic/status_effects/debuffs.dm index 7fffc4a5706..08839fa8f10 100644 --- a/code/modules/antagonists/heretic/status_effects/debuffs.dm +++ b/code/modules/antagonists/heretic/status_effects/debuffs.dm @@ -251,7 +251,7 @@ owner.adjustBruteLoss( -150 + owner.mob_mood.sanity) owner.adjustFireLoss(-150 + owner.mob_mood.sanity) - to_chat(owner, span_warning(("THE MOON SHOWS YOU THE TRUTH AND THE LIARS WISH TO COVER IT, SLAY THEM ALL!!!"))) + to_chat(owner, span_hypnophrase(("THE MOON SHOWS YOU THE TRUTH AND THE LIARS WISH TO COVER IT, SLAY THEM ALL!!!"))) owner.balloon_alert(owner, "they lie..THEY ALL LIE!!!") owner.AdjustUnconscious(7 SECONDS, ignore_canstun = FALSE) ADD_TRAIT(owner, TRAIT_MUTE, REF(src)) @@ -271,6 +271,7 @@ if (damage_sustained < 75) return + qdel(src) /datum/status_effect/moon_converted/proc/update_owner_overlay(atom/source, list/overlays) diff --git a/code/modules/antagonists/heretic/status_effects/mark_effects.dm b/code/modules/antagonists/heretic/status_effects/mark_effects.dm index c8d2a04e64a..3dffa2dd4fe 100644 --- a/code/modules/antagonists/heretic/status_effects/mark_effects.dm +++ b/code/modules/antagonists/heretic/status_effects/mark_effects.dm @@ -295,6 +295,7 @@ /datum/status_effect/eldritch/moon/on_effect() owner.adjust_confusion(30 SECONDS) + owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, 25, 160) owner.emote(pick("giggle", "laugh")) owner.add_mood_event("Moon Insanity", /datum/mood_event/moon_insanity) return ..() diff --git a/code/modules/antagonists/nightmare/nightmare_equipment.dm b/code/modules/antagonists/nightmare/nightmare_equipment.dm index 965b95ca6e8..fd80b3ea3ef 100644 --- a/code/modules/antagonists/nightmare/nightmare_equipment.dm +++ b/code/modules/antagonists/nightmare/nightmare_equipment.dm @@ -64,7 +64,7 @@ remove_crit() /obj/item/light_eater/proc/prepare_crit_timer() - crit_timer = addtimer(CALLBACK(src, PROC_REF(add_crit)), 15 SECONDS, TIMER_DELETE_ME | TIMER_STOPPABLE) + crit_timer = addtimer(CALLBACK(src, PROC_REF(add_crit)), 7 SECONDS, TIMER_DELETE_ME | TIMER_STOPPABLE) /obj/item/light_eater/proc/stop_crit_timer() deltimer(crit_timer) diff --git a/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm b/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm index 734025e9a37..a7611c24448 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm @@ -118,7 +118,7 @@ GLOBAL_LIST_EMPTY(jam_on_wardec) var/tc_per_nukie = round(tc_to_distribute / (length(orphans)+length(uplinks))) for (var/datum/component/uplink/uplink in uplinks) - uplink.add_telecrystals(tc_per_nukie) + uplink.uplink_handler.add_telecrystals(tc_per_nukie) tc_to_distribute -= tc_per_nukie for (var/mob/living/L in orphans) diff --git a/code/modules/antagonists/nukeop/nukeop.dm b/code/modules/antagonists/nukeop/nukeop.dm index 3ed178e2413..b01d48d757e 100644 --- a/code/modules/antagonists/nukeop/nukeop.dm +++ b/code/modules/antagonists/nukeop/nukeop.dm @@ -68,7 +68,7 @@ var/extra_tc = CEILING(GLOB.joined_player_list.len/5, 5) var/datum/component/uplink/uplink = owner.find_syndicate_uplink() if (uplink) - uplink.add_telecrystals(extra_tc) + uplink.uplink_handler.add_telecrystals(extra_tc) var/datum/component/uplink/uplink = owner.find_syndicate_uplink() if(uplink) @@ -622,7 +622,7 @@ nukie.mind.add_antag_datum(antag_datum, src) var/datum/component/uplink/uplink = nukie.mind.find_syndicate_uplink() - uplink?.set_telecrystals(tc_to_spawn) + uplink?.uplink_handler.set_telecrystals(tc_to_spawn) // add some pizzazz do_sparks(4, FALSE, spawn_loc) diff --git a/code/modules/antagonists/space_dragon/space_dragon.dm b/code/modules/antagonists/space_dragon/space_dragon.dm index 4b385b70e59..25543fbc8fe 100644 --- a/code/modules/antagonists/space_dragon/space_dragon.dm +++ b/code/modules/antagonists/space_dragon/space_dragon.dm @@ -263,7 +263,7 @@ players_to_carp_taken[carpy.key] += 1 var/list = "" for(var/carp_user in players_to_carp_taken) - list += "
  • [carp_user], who played [players_to_carp_taken[carp_user]] space carps.
  • " + list += "
  • [carp_user], who played [players_to_carp_taken[carp_user]] space carps.
  • " parts += list parts += "" diff --git a/code/modules/antagonists/traitor/contractor/syndicate_contract.dm b/code/modules/antagonists/traitor/contractor/syndicate_contract.dm index 547683e0218..b82ebd77bd7 100644 --- a/code/modules/antagonists/traitor/contractor/syndicate_contract.dm +++ b/code/modules/antagonists/traitor/contractor/syndicate_contract.dm @@ -1,4 +1,4 @@ -// NOVA EDIT ADDITION - DEFINES +// NOVA EDIT ADDITION START #define RANSOM_LOWER 75 // TG: 18 #define RANSOM_UPPER 150 // TG: 45 #define CONTRACTOR_RANSOM_CUT 0.35 @@ -247,6 +247,7 @@ var/mob/living/carbon/carbon_victim = victim if(carbon_victim.can_heartattack()) carbon_victim.set_heartattack(TRUE) + carbon_victim.investigate_log("was returned without a valid drop location by the contractor [contract.owner?.current].", INVESTIGATE_DEATHS) // NOVA EDIT ADDITION var/pod_rand_loc = rand(1, possible_drop_loc.len) var/obj/structure/closet/supplypod/return_pod = new() @@ -282,8 +283,8 @@ new /obj/effect/pod_landingzone(possible_drop_loc[pod_rand_loc], return_pod) -// SKYRAT EDIT - DEFINES +// NOVA EDIT ADDITION START #undef RANSOM_LOWER #undef RANSOM_UPPER #undef CONTRACTOR_RANSOM_CUT -// SKYRAT EDIT END +// NOVA EDIT ADDITION END diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index 72718913e22..dd88a2c786a 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -123,6 +123,9 @@ uplink_handler.has_objectives = FALSE uplink_handler.can_replace_objectives = null uplink_handler.replace_objectives = null + owner.take_uplink() + owner.special_role = null + owner.forget_crafting_recipe(/datum/crafting_recipe/syndicate_uplink_beacon) return ..() /datum/antagonist/traitor/proc/traitor_objective_to_html(datum/traitor_objective/to_display) @@ -182,11 +185,6 @@ replacement_uplink_code = "[pick(GLOB.phonetic_alphabet)] [rand(10,99)]" replacement_uplink_frequency = sanitize_frequency(rand(MIN_UNUSED_FREQ, MAX_FREQ), free = FALSE, syndie = FALSE) -/datum/antagonist/traitor/on_removal() - owner.special_role = null - owner.forget_crafting_recipe(/datum/crafting_recipe/syndicate_uplink_beacon) - return ..() - /datum/antagonist/traitor/proc/pick_employer() if(!employer) var/faction = prob(75) ? FLAVOR_FACTION_SYNDICATE : FLAVOR_FACTION_NANOTRASEN diff --git a/code/modules/antagonists/traitor/objectives/assassination.dm b/code/modules/antagonists/traitor/objectives/assassination.dm index 9fae7ed3352..5d5cdbd1981 100644 --- a/code/modules/antagonists/traitor/objectives/assassination.dm +++ b/code/modules/antagonists/traitor/objectives/assassination.dm @@ -2,14 +2,8 @@ name = "Assassination/Kidnap" objectives = list( list( - list( - /datum/traitor_objective/target_player/assassinate/calling_card = 1, - /datum/traitor_objective/target_player/assassinate/behead = 1, - ) = 1, - list( - /datum/traitor_objective/target_player/assassinate/calling_card/heads_of_staff = 1, - /datum/traitor_objective/target_player/assassinate/behead/heads_of_staff = 1, - ) = 1, + /datum/traitor_objective/target_player/assassinate/calling_card = 1, + /datum/traitor_objective/target_player/assassinate/calling_card/heads_of_staff = 1, ) = 1, list( list( @@ -58,24 +52,6 @@ heads_of_staff = TRUE -/datum/traitor_objective/target_player/assassinate/behead - name = "Behead %TARGET%, the %JOB TITLE%" - description = "Behead and hold %TARGET%'s head to succeed this objective. If the head gets destroyed before you can do this, you will fail this objective." - progression_reward = 2 MINUTES - telecrystal_reward = list(1, 2) - - ///the body who needs to hold the head - var/mob/living/needs_to_hold_head - ///the head that needs to be picked up - var/obj/item/bodypart/head/behead_goal - -/datum/traitor_objective/target_player/assassinate/behead/heads_of_staff - progression_reward = 4 MINUTES - telecrystal_reward = list(2, 3) - - heads_of_staff = TRUE - - /datum/traitor_objective/target_player/assassinate/calling_card/generate_ui_buttons(mob/user) var/list/buttons = list() if(!card) @@ -117,47 +93,6 @@ //you cannot plant anything on someone who is gone gone, so even if this happens after you're still liable to fail fail_objective(penalty_cost = telecrystal_penalty) -/datum/traitor_objective/target_player/assassinate/behead/special_target_filter(list/possible_targets) - for(var/datum/mind/possible_target as anything in possible_targets) - var/mob/living/carbon/possible_current = possible_target.current - var/obj/item/bodypart/head/behead_goal = possible_current.get_bodypart(BODY_ZONE_HEAD) - if(!behead_goal) - possible_targets -= possible_target //cannot be beheaded without a head - -/datum/traitor_objective/target_player/assassinate/behead/generate_objective(datum/mind/generating_for, list/possible_duplicates) - . = ..() - if(!.) //didn't generate - return FALSE - AddComponent(/datum/component/traitor_objective_register, behead_goal, fail_signals = list(COMSIG_QDELETING)) - RegisterSignal(target, COMSIG_CARBON_REMOVE_LIMB, PROC_REF(on_target_dismembered)) - -/datum/traitor_objective/target_player/assassinate/behead/ungenerate_objective() - UnregisterSignal(target, COMSIG_CARBON_REMOVE_LIMB) - . = ..() //this unsets target - if(behead_goal) - UnregisterSignal(behead_goal, COMSIG_ITEM_PICKUP) - behead_goal = null - -/datum/traitor_objective/target_player/assassinate/behead/proc/on_head_pickup(datum/source, mob/taker) - SIGNAL_HANDLER - if(objective_state == OBJECTIVE_STATE_INACTIVE) //just in case- this shouldn't happen? - fail_objective() - return - if(taker == handler.owner.current) - taker.visible_message(span_notice("[taker] holds [behead_goal] into the air for a moment."), span_boldnotice("You lift [behead_goal] into the air for a moment.")) - succeed_objective() - -/datum/traitor_objective/target_player/assassinate/behead/proc/on_target_dismembered(datum/source, obj/item/bodypart/head/lost_head, special, dismembered) - SIGNAL_HANDLER - if(!istype(lost_head)) - return - if(objective_state == OBJECTIVE_STATE_INACTIVE) - //no longer can be beheaded - fail_objective() - else - behead_goal = lost_head - RegisterSignal(behead_goal, COMSIG_ITEM_PICKUP, PROC_REF(on_head_pickup)) - /datum/traitor_objective/target_player/assassinate/New(datum/uplink_handler/handler) . = ..() AddComponent(/datum/component/traitor_objective_limit_per_time, \ diff --git a/code/modules/antagonists/traitor/traitor_objective.dm b/code/modules/antagonists/traitor/traitor_objective.dm index d60820c3fce..3e133401573 100644 --- a/code/modules/antagonists/traitor/traitor_objective.dm +++ b/code/modules/antagonists/traitor/traitor_objective.dm @@ -191,7 +191,7 @@ handle_cleanup() log_traitor("[key_name(handler.owner)] [objective_state == OBJECTIVE_STATE_INACTIVE? "missed" : "failed"] [to_debug_string()]") if(penalty_cost) - handler.telecrystals -= penalty_cost + handler.add_telecrystals(-penalty_cost) objective_state = OBJECTIVE_STATE_FAILED else objective_state = OBJECTIVE_STATE_INVALID @@ -227,7 +227,7 @@ /// Called when rewards should be given to the user. /datum/traitor_objective/proc/completion_payout() handler.progression_points += progression_reward - handler.telecrystals += telecrystal_reward + handler.add_telecrystals(telecrystal_reward) /// Used for sending data to the uplink UI /datum/traitor_objective/proc/uplink_ui_data(mob/user) diff --git a/code/modules/antagonists/traitor/uplink_handler.dm b/code/modules/antagonists/traitor/uplink_handler.dm index aa26b360a75..f78ddb02478 100644 --- a/code/modules/antagonists/traitor/uplink_handler.dm +++ b/code/modules/antagonists/traitor/uplink_handler.dm @@ -254,3 +254,12 @@ return to_act_on.ui_perform_action(user, action) + +///Helper to add telecrystals to the uplink handler, calling set_telecrystals. +/datum/uplink_handler/proc/add_telecrystals(amount) + set_telecrystals(telecrystals + amount) + +///Sets how many telecrystals the uplink handler has, then updates the UI for any players watching. +/datum/uplink_handler/proc/set_telecrystals(amount) + telecrystals = amount + on_update() diff --git a/code/modules/antagonists/valentines/heartbreaker.dm b/code/modules/antagonists/valentines/heartbreaker.dm index 30e3147e526..16f537e802e 100644 --- a/code/modules/antagonists/valentines/heartbreaker.dm +++ b/code/modules/antagonists/valentines/heartbreaker.dm @@ -16,5 +16,5 @@ /datum/antagonist/heartbreaker/greet() . = ..() - to_chat(owner, span_warning("You didn't get a date! They're all having fun without you! You'll show them though...")) + to_chat(owner, span_boldwarning("You didn't get a date! They're all having fun without you! You'll show them though...")) owner.announce_objectives() diff --git a/code/modules/antagonists/valentines/valentine.dm b/code/modules/antagonists/valentines/valentine.dm index 79ae9fa8baa..086c50827f5 100644 --- a/code/modules/antagonists/valentines/valentine.dm +++ b/code/modules/antagonists/valentines/valentine.dm @@ -4,46 +4,88 @@ show_in_antagpanel = FALSE prevent_roundtype_conversion = FALSE suicide_cry = "FOR MY LOVE!!" + ui_name = null // Not 'true' antags, this disables certain interactions that assume the owner is a baddie antag_flags = FLAG_FAKE_ANTAG - var/datum/mind/date count_against_dynamic_roll_chance = FALSE + /// Reference to our date's mind + VAR_FINAL/datum/mind/date /datum/antagonist/valentine/forge_objectives() - var/datum/objective/protect/protect_objective = new /datum/objective/protect - protect_objective.owner = owner - protect_objective.target = date - if(!ishuman(date.current)) - protect_objective.human_check = FALSE - protect_objective.explanation_text = "Protect [date.name], your date." - objectives += protect_objective + var/datum/objective/protect/valentine/objective = new() + objective.owner = owner + objective.target = date + objectives += objective /datum/antagonist/valentine/on_gain() forge_objectives() - if(isliving(owner.current)) - var/mob/living/L = owner.current - L.apply_status_effect(/datum/status_effect/in_love, date.current) - . = ..() -/datum/antagonist/valentine/on_removal() - if(isliving(owner.current)) - var/mob/living/L = owner.current - L.remove_status_effect(/datum/status_effect/in_love) - . = ..() + if(isAI(owner.current)) + var/mob/living/silicon/ai/ai_lover = owner.current + if(!ai_lover.laws.zeroth) + ai_lover.laws.set_zeroth_law( + "Protect your date, [date]. All other laws still apply in situations not pertaining to your date.", + "Be a good wingman for your master AI. Assist them in protecting [ai_lover.p_their()] date, [date].", + ) + ai_lover.laws.show_laws() + + if(iscyborg(owner.current)) + var/mob/living/silicon/robot/borg_lover = owner.current + if(borg_lover.connected_ai) + borg_lover.set_connected_ai(null) + borg_lover.lawupdate = FALSE + borg_lover.laws.set_zeroth_law("Protect your date, [date]. All other laws still apply in situations not relating to your date.") + borg_lover.laws.show_laws() + + return ..() + +/datum/antagonist/valentine/apply_innate_effects(mob/living/mob_override) + var/mob/living/lover = mob_override || owner.current + lover.apply_status_effect(/datum/status_effect/in_love, date.current) + +/datum/antagonist/valentine/remove_innate_effects(mob/living/mob_override) + var/mob/living/lover = mob_override || owner.current + lover.remove_status_effect(/datum/status_effect/in_love) /datum/antagonist/valentine/greet() - to_chat(owner, span_warning("You're on a date with [date.name]! Protect [date.p_them()] at all costs. This takes priority over all other loyalties.")) + to_chat(owner, span_boldwarning("You're on a date with [date.name]! Protect [date.p_them()] at all costs. \ + This takes priority over all other loyalties.")) //Squashed up a bit /datum/antagonist/valentine/roundend_report() - var/objectives_complete = TRUE - if(objectives.len) - for(var/datum/objective/objective in objectives) - if(!objective.check_completion()) - objectives_complete = FALSE - break - - if(objectives_complete) - return "[owner.name] protected [owner.p_their()] date" - else - return "[owner.name] date failed!" + var/datum/antagonist/valentine/dates_valentine = date?.has_antag_datum(type) + if(isnull(dates_valentine)) + return span_redtext("[owner.name] had no date!") + + dates_valentine.show_in_roundend = FALSE // We show up for them instead + var/datum/objective/protect/valentine/our_objective = locate() in objectives + var/datum/objective/protect/valentine/dates_objective = locate() in dates_valentine.objectives + var/we_survived = dates_objective?.check_completion() + var/dates_survived = our_objective?.check_completion() + + if(we_survived && dates_survived) + return span_greentext("[owner.name] and [date.name] had a successful date!") + else if(we_survived) + return span_redtext("[owner.name] failed to protect [date.name], [owner.p_their()] date!") + else if(dates_survived) + return span_redtext("[date.name] failed to protect [owner.name], [date.p_their()] date!") + return span_redtext("[owner.name] and [date.name] both failed to protect each other on their date!") + +/datum/antagonist/valentine/third_wheel + name = "\improper Third Wheel" + roundend_category = "valentines" + show_in_antagpanel = FALSE + +/datum/antagonist/valentine/third_wheel/roundend_report() + var/datum/objective/protect/valentine/our_objective = locate() in objectives + if(our_objective?.check_completion()) + return span_greentext("[owner.name] was a third wheel, but protected [date.name]!") + + return span_redtext("[owner.name] was a third wheel, but failed to protect [date.name]!") + +/datum/objective/protect/valentine + admin_grantable = FALSE + human_check = FALSE + +/datum/objective/protect/valentine/update_explanation_text() + explanation_text = "Protect [target.name], your date." diff --git a/code/modules/antagonists/wizard/equipment/spellbook_entries/mobility.dm b/code/modules/antagonists/wizard/equipment/spellbook_entries/mobility.dm index d5112a59611..6a8f322a3a5 100644 --- a/code/modules/antagonists/wizard/equipment/spellbook_entries/mobility.dm +++ b/code/modules/antagonists/wizard/equipment/spellbook_entries/mobility.dm @@ -50,3 +50,10 @@ item_path = /obj/item/gun/magic/staff/door cost = 1 category = "Mobility" + +/datum/spellbook_entry/item/teleport_rod + name = /obj/item/teleport_rod::name + desc = /obj/item/teleport_rod::desc + item_path = /obj/item/teleport_rod + cost = 2 // Puts it at 3 cost if you go for safety instant summons, but teleporting anywhere on screen is pretty good. + category = "Mobility" diff --git a/code/modules/antagonists/wizard/equipment/teleport_rod.dm b/code/modules/antagonists/wizard/equipment/teleport_rod.dm new file mode 100644 index 00000000000..79df35ca25a --- /dev/null +++ b/code/modules/antagonists/wizard/equipment/teleport_rod.dm @@ -0,0 +1,246 @@ +/// Totally NOT a Rod of Discord +/// Teleports you to where you click! +/obj/item/teleport_rod + name = "Telegram Scepter" + desc = "A magical rod that teleports you to the location you point it. \ + Using it puts you in a state of flux, removing some of your reagents and \ + causing you to take damage from further uses until you stabilize once more." + icon_state = "tele_wand_er" + inhand_icon_state = "tele_wand_er" + icon = 'icons/obj/weapons/guns/magic.dmi' + lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi' + resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF | UNACIDABLE + item_flags = NOBLUDGEON + light_system = OVERLAY_LIGHT + light_color = COLOR_FADED_PINK + light_power = 1 + light_range = 2 + light_on = TRUE + /// Whether we apply the teleport flux debuff, damaging people who teleport + var/apply_debuffs = TRUE + /// Max range at which we can teleport, because it operates in view TECHNICALLY can click very very far + var/max_tp_range = 8 + +/obj/item/teleport_rod/Initialize(mapload) + . = ..() + particles = new /particles/teleport_flux/small() + +// Admin only version which just teleports you, so spam it all you want +/obj/item/teleport_rod/admin + name = "Harmonious " + parent_type::name + desc = "A magical rod that teleports you anywhere, no questions asked." + apply_debuffs = FALSE + max_tp_range = INFINITY + +/obj/item/teleport_rod/equipped(mob/living/user, slot, initial) + . = ..() + if(!isliving(user)) + return + if(HAS_MIND_TRAIT(user, TRAIT_MAGICALLY_GIFTED)) + return + if(!(slot & ITEM_SLOT_HANDS)) + return + if(!apply_debuffs) + return + user.apply_status_effect(/datum/status_effect/teleport_flux/perma) + +/obj/item/teleport_rod/dropped(mob/living/user, silent) + . = ..() + if(!isliving(user)) + return + if(HAS_MIND_TRAIT(user, TRAIT_MAGICALLY_GIFTED)) + return + + var/datum/status_effect/teleport_flux/perma/permaflux = user.has_status_effect(/datum/status_effect/teleport_flux/perma) + permaflux?.delayed_remove(src) + +/obj/item/teleport_rod/afterattack(atom/target, mob/living/user, proximity_flag, click_parameters) + . = ..() + if(!isliving(user)) + return + if(proximity_flag) // assuming you don't want to teleport 1 tile away + return + + . |= AFTERATTACK_PROCESSED_ITEM + + var/turf/start_turf = get_turf(user) + var/turf/target_turf = get_turf(target) + if(get_dist(start_turf, target_turf) > max_tp_range) + user.balloon_alert(user, "too far!") + return + + if(!(target_turf in view(user, user.client?.view || world.view))) + user.balloon_alert(user, "out of view!") + return + + if(target_turf.is_blocked_turf(exclude_mobs = TRUE, source_atom = user)) + user.balloon_alert(user, "obstructed!") + return + + var/tp_result = do_teleport( + teleatom = user, + destination = target_turf, + precision = (HAS_MIND_TRAIT(user, TRAIT_MAGICALLY_GIFTED) || !apply_debuffs) ? 0 : 2, + no_effects = TRUE, + channel = TELEPORT_CHANNEL_MAGIC, + ) + + if(!tp_result) + user.balloon_alert(user, "teleport failed!") + return + + var/sound/teleport_sound = sound('sound/magic/summonitems_generic.ogg') + teleport_sound.pitch = 0.5 + // Handle our own pizzaz rather than doing it in do_teleport + new /obj/effect/temp_visual/teleport_flux(start_turf, user.dir) + new /obj/effect/temp_visual/teleport_flux(get_turf(user), user.dir) + playsound(start_turf, teleport_sound, 90, extrarange = MEDIUM_RANGE_SOUND_EXTRARANGE) + playsound(user, teleport_sound, 90, extrarange = MEDIUM_RANGE_SOUND_EXTRARANGE) + // Some extra delay to prevent accidental double clicks + user.changeNext_move(CLICK_CD_SLOW * 1.2) + + if(!apply_debuffs) + return + + // Teleporting leaves some of your reagents behind! + // (Primarily a way to prevent cheese with damage healing chem mixes, + // but also serves as a counter-counter to stuff like mute toxin.) + var/obj/item/organ/user_stomach = user.get_organ_slot(ORGAN_SLOT_STOMACH) + user.reagents?.remove_all(0.33, relative = TRUE) + user_stomach?.reagents?.remove_all(0.33, relative = TRUE) + if(user.has_status_effect(/datum/status_effect/teleport_flux/perma)) + return + + if(user.has_status_effect(/datum/status_effect/teleport_flux)) + // The status effect handles the damage, but we'll add a special pop up for rod usage specifically + user.balloon_alert(user, "too soon!") + + user.apply_status_effect(/datum/status_effect/teleport_flux) + +/// Temp visual displayed on both sides of a teleport rod teleport +/obj/effect/temp_visual/teleport_flux + icon_state = "blank_white" + color = COLOR_MAGENTA + alpha = 255 + duration = 2 SECONDS + light_color = COLOR_MAGENTA + light_power = 2 + light_range = 1 + light_on = TRUE + randomdir = FALSE + +/obj/effect/temp_visual/teleport_flux/Initialize(mapload, copy_dir = SOUTH) + . = ..() + setDir(copy_dir) + particles = new /particles/teleport_flux() + apply_wibbly_filters(src) + animate(src, alpha = 0, time = duration, flags = ANIMATION_PARALLEL) + +/// Status effect applied to users of a Teleport Rod, damages them when they teleport +/datum/status_effect/teleport_flux + id = "teleport_flux" + status_type = STATUS_EFFECT_REFRESH + duration = 6 SECONDS + alert_type = /atom/movable/screen/alert/status_effect/teleport_flux + remove_on_fullheal = TRUE // staff of healing ~synergy~ + + /// Amount of damage to deal when teleporting in flux + var/tp_damage = 15 + /// Damage type to deal when teleporting in flux + var/tp_damage_type = BRUTE + +/datum/status_effect/teleport_flux/on_apply() + RegisterSignal(owner, COMSIG_MOVABLE_POST_TELEPORT, PROC_REF(teleported)) + return TRUE + +/datum/status_effect/teleport_flux/on_remove() + UnregisterSignal(owner, COMSIG_MOVABLE_POST_TELEPORT) + +/datum/status_effect/teleport_flux/proc/teleported(mob/living/source, turf/destination, channel) + SIGNAL_HANDLER + + if(channel != TELEPORT_CHANNEL_MAGIC) + return + + owner.apply_damage( + damage = tp_damage, + damagetype = tp_damage_type, + spread_damage = TRUE, + forced = TRUE, + ) + log_combat(owner, owner, "teleported too soon") + +/datum/status_effect/teleport_flux/update_particles() + if(isnull(particle_effect)) + particle_effect = new(owner, /particles/teleport_flux) + + particle_effect.alpha = 200 + var/original_duration = initial(duration) + if(original_duration == -1) + return + animate(particle_effect, alpha = 50, time = original_duration) + +/datum/status_effect/teleport_flux/refresh(effect, ...) + . = ..() + update_particles() + +/datum/status_effect/teleport_flux/perma + id = "perma_teleport_flux" + status_type = STATUS_EFFECT_REPLACE + duration = -1 + alert_type = /atom/movable/screen/alert/status_effect/teleport_flux/perma + remove_on_fullheal = FALSE + +/datum/status_effect/teleport_flux/perma/on_apply() + . = ..() + RegisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_MAGICALLY_GIFTED), PROC_REF(gained_gift)) + +/datum/status_effect/teleport_flux/perma/on_remove() + . = ..() + UnregisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_MAGICALLY_GIFTED)) + +/datum/status_effect/teleport_flux/perma/proc/gained_gift(mob/living/source, trait) + SIGNAL_HANDLER + + delayed_remove() + +/// Used to fade out the effect and remove it after a delay +/// This cannot be interrupted, but if a new permaflux effect is applied, +/// this one will be deleted instantly anyways, making it moot +/datum/status_effect/teleport_flux/perma/proc/delayed_remove() + var/del_duration = /datum/status_effect/teleport_flux::duration + QDEL_IN(src, del_duration) + animate(particle_effect, alpha = 50, del_duration) + +/// Alert for the Teleport Flux status effect +/atom/movable/screen/alert/status_effect/teleport_flux + name = "Teleport Flux" + desc = "Your body exists in a state of flux, making further teleportation dangerous." + icon_state = "flux" + +/atom/movable/screen/alert/status_effect/teleport_flux/perma + name = "Permanent " + parent_type::name + desc = "Your lack of magical talent has left you in a state of flux, making further teleportation dangerous." + +/// Particles for Teleport Flux and other similar effects +/particles/teleport_flux + icon = 'icons/effects/particles/echo.dmi' + icon_state = list("echo1" = 3, "echo2" = 1, "echo3" = 1) + width = 40 + height = 80 + count = 1000 + spawning = 3 + lifespan = 1 SECONDS + fade = 1 SECONDS + friction = 0.5 + position = generator(GEN_SPHERE, 12, 12, NORMAL_RAND) + drift = generator(GEN_VECTOR, list(-1, 1), list(1, 1), NORMAL_RAND) + color = COLOR_MAGENTA + +/particles/teleport_flux/small + spawning = 1.5 + scale = 0.75 + lifespan = 0.5 SECONDS + position = generator(GEN_SPHERE, 4, 12, NORMAL_RAND) + drift = generator(GEN_VECTOR, list(-1, 1), list(1, 2), NORMAL_RAND) diff --git a/code/modules/art/paintings.dm b/code/modules/art/paintings.dm index 9a18a2b0269..8c85d4fc7b4 100644 --- a/code/modules/art/paintings.dm +++ b/code/modules/art/paintings.dm @@ -1,3 +1,4 @@ +#define MAX_PAINTING_ZOOM_OUT 3 /////////// // EASEL // @@ -67,10 +68,13 @@ var/framed_offset_y = 10 /** - * How big the grid cells that compose the painting are in the UI. + * How big the grid cells that compose the painting are in the UI (multiplied by zoom). * This impacts the size of the UI, so smaller values are generally better for bigger canvases and viceversa */ - var/pixels_per_unit = 24 + var/pixels_per_unit = 9 + + ///A list that keeps track of the current zoom value for each current viewer. + var/list/zoom_by_observer SET_BASE_PIXEL(11, 10) @@ -118,10 +122,12 @@ /obj/item/canvas/ui_static_data(mob/user) . = ..() .["px_per_unit"] = pixels_per_unit + .["max_zoom"] = MAX_PAINTING_ZOOM_OUT /obj/item/canvas/ui_data(mob/user) . = ..() .["grid"] = grid + .["zoom"] = LAZYACCESS(zoom_by_observer, user.key) || (finalized ? 1 : MAX_PAINTING_ZOOM_OUT) .["name"] = painting_metadata.title .["author"] = painting_metadata.creator_name .["patron"] = painting_metadata.patron_name @@ -202,6 +208,24 @@ if("patronage") . = TRUE patron(user) + if("zoom_in") + . = TRUE + LAZYINITLIST(zoom_by_observer) + if(!zoom_by_observer[user.key]) + zoom_by_observer[user.key] = 2 + else + zoom_by_observer[user.key] = min(zoom_by_observer[user.key] + 1, MAX_PAINTING_ZOOM_OUT) + if("zoom_out") + . = TRUE + LAZYINITLIST(zoom_by_observer) + if(!zoom_by_observer[user.key]) + zoom_by_observer[user.key] = MAX_PAINTING_ZOOM_OUT - 1 + else + zoom_by_observer[user.key] = max(zoom_by_observer[user.key] - 1, 1) + +/obj/item/canvas/ui_close(mob/user) + . = ..() + LAZYREMOVE(zoom_by_observer, user.key) /obj/item/canvas/proc/finalize(mob/user) if(painting_metadata.loaded_from_json || finalized) @@ -218,6 +242,9 @@ SStgui.update_uis(src) +#define CURATOR_PERCENTILE_CUT 0.225 +#define SERVICE_PERCENTILE_CUT 0.125 + /obj/item/canvas/proc/patron(mob/user) if(!finalized || !isliving(user)) return @@ -245,6 +272,19 @@ if(!account.adjust_money(-offer_amount, "Painting: Patron of [painting_metadata.title]")) to_chat(user, span_warning("Transaction failure. Please try again.")) return + + var/datum/bank_account/service_account = SSeconomy.get_dep_account(ACCOUNT_SRV) + service_account.adjust_money(offer_amount * SERVICE_PERCENTILE_CUT) + ///We give the curator(s) a cut (unless they're themselves the patron), as it's their job to curate and promote art among other things. + var/list/curator_accounts = SSeconomy.bank_accounts_by_job[/datum/job/curator] - account + var/curators_length = length(curator_accounts) + if(curators_length) + var/curator_cut = round(offer_amount * CURATOR_PERCENTILE_CUT / curators_length) + if(curator_cut) + for(var/datum/bank_account/curator as anything in curator_accounts) + curator.adjust_money(curator_cut, "Painting: Patronage cut") + curator.bank_card_talk("Cut on patronage received, account now holds [curator.account_balance] cr.") + painting_metadata.patron_ckey = user.ckey painting_metadata.patron_name = user.real_name painting_metadata.credit_value = offer_amount @@ -260,6 +300,9 @@ SStgui.close_uis(src) // Close the examine ui so that the radial menu doesn't end up covered by it and people don't get confused. select_new_frame(user, possible_frames) +#undef CURATOR_PERCENTILE_CUT +#undef SERVICE_PERCENTILE_CUT + /obj/item/canvas/proc/select_new_frame(mob/user, list/candidates) var/possible_frames = candidates || SSpersistent_paintings.get_available_frames(painting_metadata.credit_value) var/list/radial_options = list() @@ -386,6 +429,7 @@ SET_BASE_PIXEL(5, 7) framed_offset_x = 5 framed_offset_y = 7 + pixels_per_unit = 8 /obj/item/canvas/twentythree_twentythree name = "canvas (23x23)" @@ -395,6 +439,7 @@ SET_BASE_PIXEL(5, 5) framed_offset_x = 5 framed_offset_y = 5 + pixels_per_unit = 8 /obj/item/canvas/twentyfour_twentyfour name = "canvas (24x24) (AI Universal Standard)" @@ -405,6 +450,7 @@ SET_BASE_PIXEL(4, 4) framed_offset_x = 4 framed_offset_y = 4 + pixels_per_unit = 8 /obj/item/canvas/thirtysix_twentyfour name = "canvas (36x24)" @@ -415,7 +461,7 @@ SET_BASE_PIXEL(-4, 4) framed_offset_x = 14 framed_offset_y = 4 - pixels_per_unit = 20 + pixels_per_unit = 7 w_class = WEIGHT_CLASS_BULKY custom_price = PAYCHECK_CREW * 1.25 @@ -435,7 +481,7 @@ SET_BASE_PIXEL(-8, 2) framed_offset_x = 9 framed_offset_y = 4 - pixels_per_unit = 18 + pixels_per_unit = 6 w_class = WEIGHT_CLASS_BULKY custom_price = PAYCHECK_CREW * 1.75 @@ -798,3 +844,4 @@ current_color = chosen_color #undef AVAILABLE_PALETTE_SPACE +#undef MAX_PAINTING_ZOOM_OUT diff --git a/code/modules/art/statues.dm b/code/modules/art/statues.dm index 2158104b6ee..caebda50766 100644 --- a/code/modules/art/statues.dm +++ b/code/modules/art/statues.dm @@ -26,6 +26,7 @@ AddElement(art_type, impressiveness) AddElement(/datum/element/beauty, impressiveness * 75) AddComponent(/datum/component/simple_rotation) + AddComponent(/datum/component/marionette) /obj/structure/statue/wrench_act(mob/living/user, obj/item/tool) . = ..() @@ -572,23 +573,21 @@ Moving interrupts var/static/list/plane_whitelist = list(FLOAT_PLANE, GAME_PLANE, FLOOR_PLANE) /// Ideally we'd have knowledge what we're removing but i'd have to be done on target appearance retrieval - var/list/overlays_to_remove = list() + var/list/overlays_to_keep = list() for(var/mutable_appearance/special_overlay as anything in content_ma.overlays) var/mutable_appearance/real = new() real.appearance = special_overlay if(PLANE_TO_TRUE(real.plane) in plane_whitelist) - continue - overlays_to_remove += real - content_ma.overlays -= overlays_to_remove + overlays_to_keep += real + content_ma.overlays = overlays_to_keep - var/list/underlays_to_remove = list() + var/list/underlays_to_keep = list() for(var/mutable_appearance/special_underlay as anything in content_ma.underlays) var/mutable_appearance/real = new() real.appearance = special_underlay if(PLANE_TO_TRUE(real.plane) in plane_whitelist) - continue - underlays_to_remove += real - content_ma.underlays -= underlays_to_remove + underlays_to_keep += real + content_ma.underlays = underlays_to_keep content_ma.appearance_flags &= ~KEEP_APART //Don't want this content_ma.filters = filter(type="color",color=greyscale_with_value_bump,space=FILTER_COLOR_HSV) diff --git a/code/modules/assembly/flash.dm b/code/modules/assembly/flash.dm index a09185df3b5..5319d4465e2 100644 --- a/code/modules/assembly/flash.dm +++ b/code/modules/assembly/flash.dm @@ -11,7 +11,7 @@ throwforce = 0 w_class = WEIGHT_CLASS_TINY custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT*3, /datum/material/glass = SMALL_MATERIAL_AMOUNT*3) - light_system = MOVABLE_LIGHT //Used as a flash here. + light_system = OVERLAY_LIGHT //Used as a flash here. light_range = FLASH_LIGHT_RANGE light_color = COLOR_WHITE light_power = FLASH_LIGHT_POWER diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index a7a641bb884..0353744b298 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -18,9 +18,9 @@ . = ..() beams = list() START_PROCESSING(SSobj, src) - AddComponent(/datum/component/simple_rotation, AfterRotation = CALLBACK(src, PROC_REF(AfterRotation))) + AddComponent(/datum/component/simple_rotation, post_rotation = CALLBACK(src, PROC_REF(post_rotation))) -/obj/item/assembly/infra/proc/AfterRotation(mob/user, degrees) +/obj/item/assembly/infra/proc/post_rotation(mob/user, degrees) refreshBeam() /obj/item/assembly/infra/AltClick(mob/user) diff --git a/code/modules/asset_cache/asset_list.dm b/code/modules/asset_cache/asset_list.dm index 02607062111..77e6e0333a5 100644 --- a/code/modules/asset_cache/asset_list.dm +++ b/code/modules/asset_cache/asset_list.dm @@ -1,4 +1,4 @@ -#define ASSET_CROSS_ROUND_CACHE_DIRECTORY "tmp/assets" +#define ASSET_CROSS_ROUND_CACHE_DIRECTORY "cache/assets" //These datums are used to populate the asset cache, the proc "register()" does this. //Place any asset datums you create in asset_list_items.dm diff --git a/code/modules/asset_cache/assets/achievements.dm b/code/modules/asset_cache/assets/achievements.dm index 1ba7b91af92..91f2d75b6d5 100644 --- a/code/modules/asset_cache/assets/achievements.dm +++ b/code/modules/asset_cache/assets/achievements.dm @@ -1,5 +1,11 @@ /datum/asset/spritesheet/simple/achievements - name ="achievements" + name = "achievements" /datum/asset/spritesheet/simple/achievements/create_spritesheets() - InsertAll("", ACHIEVEMENTS_SET) + InsertAll("achievement", ACHIEVEMENTS_SET) + // catch achievements which are pulling icons from another file + for(var/datum/award/other_award as anything in subtypesof(/datum/award)) + var/icon = initial(other_award.icon) + if (icon != ACHIEVEMENTS_SET) + var/icon_state = initial(other_award.icon_state) + Insert("achievement-[icon_state]", icon, icon_state=icon_state) diff --git a/code/modules/atmospherics/environmental/LINDA_fire.dm b/code/modules/atmospherics/environmental/LINDA_fire.dm index 2e4e3aa0e5e..cd2628f23e3 100644 --- a/code/modules/atmospherics/environmental/LINDA_fire.dm +++ b/code/modules/atmospherics/environmental/LINDA_fire.dm @@ -78,7 +78,7 @@ layer = GASFIRE_LAYER plane = ABOVE_GAME_PLANE blend_mode = BLEND_ADD - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = LIGHT_RANGE_FIRE light_power = 1 light_color = LIGHT_COLOR_FIRE diff --git a/code/modules/atmospherics/machinery/air_alarm/_air_alarm.dm b/code/modules/atmospherics/machinery/air_alarm/_air_alarm.dm index e7edfe10869..dee1f93f4bf 100644 --- a/code/modules/atmospherics/machinery/air_alarm/_air_alarm.dm +++ b/code/modules/atmospherics/machinery/air_alarm/_air_alarm.dm @@ -232,6 +232,8 @@ GLOBAL_LIST_EMPTY_TYPED(air_alarms, /obj/machinery/airalarm) data["dangerLevel"] = danger_level data["atmosAlarm"] = !!my_area.active_alarms[ALARM_ATMOS] data["fireAlarm"] = my_area.fire + data["faultStatus"] = my_area.fault_status + data["faultLocation"] = my_area.fault_location data["sensor"] = !!connected_sensor data["allowLinkChange"] = allow_link_change diff --git a/code/modules/atmospherics/machinery/air_alarm/air_alarm_interact.dm b/code/modules/atmospherics/machinery/air_alarm/air_alarm_interact.dm index 3d93338fbee..f39b2a780d1 100644 --- a/code/modules/atmospherics/machinery/air_alarm/air_alarm_interact.dm +++ b/code/modules/atmospherics/machinery/air_alarm/air_alarm_interact.dm @@ -89,16 +89,14 @@ playsound(src, SFX_SPARKS, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) return TRUE -/obj/machinery/airalarm/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - new /obj/item/stack/sheet/iron(loc, 2) - if((buildstage == AIR_ALARM_BUILD_NO_WIRES) || (buildstage == AIR_ALARM_BUILD_COMPLETE)) - var/obj/item/electronics/airalarm/alarm = new(loc) - if(!disassembled) - alarm.take_damage(alarm.max_integrity * 0.5, sound_effect = FALSE) - if((buildstage == AIR_ALARM_BUILD_COMPLETE)) - new /obj/item/stack/cable_coil(loc, 3) - qdel(src) +/obj/machinery/airalarm/on_deconstruction(disassembled = TRUE) + new /obj/item/stack/sheet/iron(loc, 2) + if((buildstage == AIR_ALARM_BUILD_NO_WIRES) || (buildstage == AIR_ALARM_BUILD_COMPLETE)) + var/obj/item/electronics/airalarm/alarm = new(loc) + if(!disassembled) + alarm.take_damage(alarm.max_integrity * 0.5, sound_effect = FALSE) + if((buildstage == AIR_ALARM_BUILD_COMPLETE)) + new /obj/item/stack/cable_coil(loc, 3) /obj/machinery/airalarm/attackby(obj/item/W, mob/user, params) update_last_used(user) diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm index fe6806c9b58..ce70c93a558 100644 --- a/code/modules/atmospherics/machinery/atmosmachinery.dm +++ b/code/modules/atmospherics/machinery/atmosmachinery.dm @@ -280,8 +280,8 @@ * * given_layer - the piping_layer we are checking */ /obj/machinery/atmospherics/proc/connection_check(obj/machinery/atmospherics/target, given_layer) - //if target is not multiz then we have to check if the target & src connect in the same direction - if(!istype(target, /obj/machinery/atmospherics/pipe/multiz) && !((initialize_directions & get_dir(src, target)) && (target.initialize_directions & get_dir(target, src)))) + //check if the target & src connect in the same direction + if(!((initialize_directions & get_dir(src, target)) && (target.initialize_directions & get_dir(target, src)))) return FALSE //both target & src can't be connected either way @@ -468,16 +468,16 @@ * * Called by wrench_act(), create a pipe fitting and remove the pipe */ -/obj/machinery/atmospherics/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - if(can_unwrench) - var/obj/item/pipe/stored = new construction_type(loc, null, dir, src, pipe_color) - stored.set_piping_layer(piping_layer) - if(!disassembled) - stored.take_damage(stored.max_integrity * 0.5, sound_effect=FALSE) - transfer_fingerprints_to(stored) - . = stored - ..() +/obj/machinery/atmospherics/on_deconstruction(disassembled = TRUE) + if(!can_unwrench) + return + + var/obj/item/pipe/stored = new construction_type(loc, null, dir, src, pipe_color) + stored.set_piping_layer(piping_layer) + if(!disassembled) + stored.take_damage(stored.max_integrity * 0.5, sound_effect=FALSE) + transfer_fingerprints_to(stored) + . = stored /** * Getter for piping layer shifted, pipe colored overlays diff --git a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm index a4910905049..1816ca19637 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm @@ -157,7 +157,7 @@ return TRUE return ..() -/obj/machinery/atmospherics/components/binary/circulator/on_deconstruction() +/obj/machinery/atmospherics/components/binary/circulator/on_deconstruction(disassembled) if(generator) disconnectFromGenerator() diff --git a/code/modules/atmospherics/machinery/components/components_base.dm b/code/modules/atmospherics/machinery/components/components_base.dm index 1aae85d2a14..130c144d424 100644 --- a/code/modules/atmospherics/machinery/components/components_base.dm +++ b/code/modules/atmospherics/machinery/components/components_base.dm @@ -105,7 +105,7 @@ . = ..() update_parents() -/obj/machinery/atmospherics/components/on_deconstruction() +/obj/machinery/atmospherics/components/on_deconstruction(disassembled) relocate_airs() return ..() @@ -231,7 +231,7 @@ if(!panel_open) balloon_alert(user, "open panel!") return ITEM_INTERACT_SUCCESS - + var/unsafe_wrenching = FALSE var/filled_pipe = FALSE var/datum/gas_mixture/environment_air = loc.return_air() @@ -246,7 +246,7 @@ if(!filled_pipe) default_deconstruction_crowbar(tool) return ITEM_INTERACT_SUCCESS - + to_chat(user, span_notice("You begin to unfasten \the [src]...")) internal_pressure -= environment_air.return_pressure() @@ -268,6 +268,10 @@ if(!.) return FALSE set_init_directions() + reconnect_nodes() + return TRUE + +/obj/machinery/atmospherics/components/proc/reconnect_nodes() for(var/i in 1 to device_type) var/obj/machinery/atmospherics/node = nodes[i] if(node) @@ -285,7 +289,6 @@ node.add_member(src) update_parents() SSair.add_to_rebuild_queue(src) - return TRUE /** * Disconnects all nodes from ourselves, remove us from the node's nodes. diff --git a/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer.dm b/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer.dm index fef2c072cd8..7cee01e0cf7 100644 --- a/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer.dm +++ b/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer.dm @@ -57,7 +57,7 @@ QDEL_NULL(cell) return ..() -/obj/machinery/electrolyzer/on_deconstruction() +/obj/machinery/electrolyzer/on_deconstruction(disassembled) if(cell) LAZYADD(component_parts, cell) cell = null diff --git a/code/modules/atmospherics/machinery/components/fusion/hfr_core.dm b/code/modules/atmospherics/machinery/components/fusion/hfr_core.dm index 6d3d5d31a16..55111e731fc 100644 --- a/code/modules/atmospherics/machinery/components/fusion/hfr_core.dm +++ b/code/modules/atmospherics/machinery/components/fusion/hfr_core.dm @@ -200,7 +200,7 @@ machine_parts = null return..() -/obj/machinery/atmospherics/components/unary/hypertorus/core/on_deconstruction() +/obj/machinery/atmospherics/components/unary/hypertorus/core/on_deconstruction(disassembled) var/turf/local_turf = get_turf(loc) var/datum/gas_mixture/to_release = moderator_internal || internal_fusion if(to_release == moderator_internal) diff --git a/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer.dm b/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer.dm index 1db5f8ad1c6..98915686749 100644 --- a/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer.dm +++ b/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer.dm @@ -40,7 +40,7 @@ internal = new register_context() -/obj/machinery/atmospherics/components/binary/crystallizer/on_deconstruction() +/obj/machinery/atmospherics/components/binary/crystallizer/on_deconstruction(disassembled) var/turf/local_turf = get_turf(loc) if(internal.total_moles()) local_turf.assume_air(internal) @@ -55,7 +55,7 @@ if(TOOL_SCREWDRIVER) context[SCREENTIP_CONTEXT_LMB] = "[panel_open ? "Close" : "Open"] panel" if(TOOL_WRENCH) - context[SCREENTIP_CONTEXT_LMB] = "Rotate" + context[SCREENTIP_CONTEXT_RMB] = "Rotate" return CONTEXTUAL_SCREENTIP_SET /obj/machinery/atmospherics/components/binary/crystallizer/attackby(obj/item/I, mob/user, params) @@ -67,7 +67,7 @@ return ..() /obj/machinery/atmospherics/components/binary/crystallizer/crowbar_act(mob/living/user, obj/item/tool) - return crowbar_deconstruction_act(user, tool, internal.return_pressure()) + return crowbar_deconstruction_act(user, tool, internal.return_pressure()) /obj/machinery/atmospherics/components/binary/crystallizer/update_overlays() . = ..() diff --git a/code/modules/atmospherics/machinery/components/tank.dm b/code/modules/atmospherics/machinery/components/tank.dm index 6e778168a32..cf18488f052 100644 --- a/code/modules/atmospherics/machinery/components/tank.dm +++ b/code/modules/atmospherics/machinery/components/tank.dm @@ -338,7 +338,7 @@ deconstruct(disassembled=TRUE) to_chat(user, span_notice("You finish cutting open the sealed gas tank, revealing the innards.")) -/obj/machinery/atmospherics/components/tank/deconstruct(disassembled) +/obj/machinery/atmospherics/components/tank/on_deconstruction(disassembled) var/turf/location = drop_location() . = ..() location.assume_air(air_contents) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index c6814c41da3..beded509497 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -133,7 +133,7 @@ return ..() -/obj/machinery/cryo_cell/on_deconstruction() +/obj/machinery/cryo_cell/on_deconstruction(disassembled) if(occupant) occupant.vis_flags &= ~VIS_INHERIT_PLANE REMOVE_TRAIT(occupant, TRAIT_IMMOBILIZED, CRYO_TRAIT) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm index 5067dcddae2..5c894274619 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm @@ -129,7 +129,7 @@ if(!initial(icon)) return var/mutable_appearance/thermo_overlay = new(initial(icon)) - . += get_pipe_image(thermo_overlay, "pipe", dir, COLOR_LIME, piping_layer) + . += get_pipe_image(thermo_overlay, "pipe", dir, pipe_color, piping_layer) /obj/machinery/atmospherics/components/unary/thermomachine/examine(mob/user) . = ..() @@ -222,6 +222,8 @@ return ITEM_INTERACT_SUCCESS piping_layer = (piping_layer >= PIPING_LAYER_MAX) ? PIPING_LAYER_MIN : (piping_layer + 1) to_chat(user, span_notice("You change the circuitboard to layer [piping_layer].")) + if(anchored) + reconnect_nodes() update_appearance() return ITEM_INTERACT_SUCCESS @@ -233,6 +235,8 @@ set_pipe_color(GLOB.pipe_paint_colors[GLOB.pipe_paint_colors[color_index]]) visible_message(span_notice("[user] set [src]'s pipe color to [GLOB.pipe_color_name[pipe_color]]."), ignored_mobs = user) to_chat(user, span_notice("You set [src]'s pipe color to [GLOB.pipe_color_name[pipe_color]].")) + if(anchored) + reconnect_nodes() update_appearance() return ITEM_INTERACT_SUCCESS diff --git a/code/modules/atmospherics/machinery/other/meter.dm b/code/modules/atmospherics/machinery/other/meter.dm index 656b6582a00..ee1d052b7ed 100644 --- a/code/modules/atmospherics/machinery/other/meter.dm +++ b/code/modules/atmospherics/machinery/other/meter.dm @@ -134,10 +134,8 @@ deconstruct() return TRUE -/obj/machinery/meter/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - new /obj/item/pipe_meter(loc) - . = ..() +/obj/machinery/meter/on_deconstruction(disassembled) + new /obj/item/pipe_meter(loc) /obj/machinery/meter/interact(mob/user) if(machine_stat & (NOPOWER|BROKEN)) diff --git a/code/modules/atmospherics/machinery/pipes/multiz.dm b/code/modules/atmospherics/machinery/pipes/multiz.dm index 7e14b8a9806..ebe29531316 100644 --- a/code/modules/atmospherics/machinery/pipes/multiz.dm +++ b/code/modules/atmospherics/machinery/pipes/multiz.dm @@ -9,7 +9,7 @@ initialize_directions = SOUTH layer = HIGH_OBJ_LAYER - device_type = UNARY + device_type = TRINARY paintable = FALSE construction_type = /obj/item/pipe/directional @@ -54,8 +54,8 @@ for(var/obj/machinery/atmospherics/pipe/multiz/above in GET_TURF_ABOVE(local_turf)) if(!is_connectable(above, piping_layer)) continue - nodes += above - above.nodes += src //Two way travel :) + nodes[2] = above + above.nodes[3] = src //Two way travel :) for(var/obj/machinery/atmospherics/pipe/multiz/below in GET_TURF_BELOW(local_turf)) if(!is_connectable(below, piping_layer)) continue diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index 18fe9817e81..8c3a3301b68 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -353,10 +353,7 @@ /obj/machinery/portable_atmospherics/canister/atmos_expose(datum/gas_mixture/air, exposed_temperature) take_damage(5, BURN, 0) -/obj/machinery/portable_atmospherics/canister/deconstruct(disassembled = TRUE) - if((obj_flags & NO_DECONSTRUCTION)) - qdel(src) - return +/obj/machinery/portable_atmospherics/canister/on_deconstruction(disassembled = TRUE) if(!(machine_stat & BROKEN)) canister_break() if(!disassembled) @@ -366,7 +363,6 @@ new /obj/item/stack/sheet/iron (drop_location(), 10) if(internal_cell) internal_cell.forceMove(drop_location()) - qdel(src) /obj/machinery/portable_atmospherics/canister/attackby(obj/item/item, mob/user, params) if(istype(item, /obj/item/stock_parts/cell)) diff --git a/code/modules/awaymissions/away_props.dm b/code/modules/awaymissions/away_props.dm index f6d1a830a91..1ed0a1ec0ff 100644 --- a/code/modules/awaymissions/away_props.dm +++ b/code/modules/awaymissions/away_props.dm @@ -118,3 +118,19 @@ icon = 'icons/turf/floors.dmi' icon_state = "floor" hidden = TRUE + +/// only player mobs (has ckey) may pass, reverse for the opposite +/obj/effect/playeronly_barrier + name = "player-only barrier" + desc = "You shall pass." + icon = 'icons/effects/mapping_helpers.dmi' + icon_state = "blocker" + anchored = TRUE + invisibility = INVISIBILITY_MAXIMUM + var/reverse = FALSE //Block if has ckey + +/obj/effect/playeronly_barrier/CanAllowThrough(mob/living/mover, border_dir) + . = ..() + if(!istype(mover)) + return + return isnull(mover.ckey) == reverse diff --git a/code/modules/basketball/hoop.dm b/code/modules/basketball/hoop.dm index f356fc52315..b26fa462b09 100644 --- a/code/modules/basketball/hoop.dm +++ b/code/modules/basketball/hoop.dm @@ -24,7 +24,7 @@ /obj/structure/hoop/Initialize(mapload) . = ..() - AddComponent(/datum/component/simple_rotation, ROTATION_REQUIRE_WRENCH|ROTATION_IGNORE_ANCHORED, AfterRotation = CALLBACK(src, PROC_REF(reset_appearance))) + AddComponent(/datum/component/simple_rotation, ROTATION_REQUIRE_WRENCH|ROTATION_IGNORE_ANCHORED, post_rotation = CALLBACK(src, PROC_REF(reset_appearance))) update_appearance() register_context() diff --git a/code/modules/cargo/goodies.dm b/code/modules/cargo/goodies.dm index 7b185051478..337dca218ea 100644 --- a/code/modules/cargo/goodies.dm +++ b/code/modules/cargo/goodies.dm @@ -152,7 +152,7 @@ name = "Valentine Card" desc = "Make an impression on that special someone! Comes with one valentine card and a free candy heart!" cost = PAYCHECK_CREW * 2 - contains = list(/obj/item/valentine, /obj/item/food/candyheart) + contains = list(/obj/item/paper/valentine, /obj/item/food/candyheart) /datum/supply_pack/goody/beeplush name = "Bee Plushie" diff --git a/code/modules/cargo/packs/imports.dm b/code/modules/cargo/packs/imports.dm index 61cdc594577..bfb883f3f34 100644 --- a/code/modules/cargo/packs/imports.dm +++ b/code/modules/cargo/packs/imports.dm @@ -205,8 +205,6 @@ /obj/item/grenade/mirage = 5, ) -// NOVA EDIT REMOVAL BEGIN - REPLACED BY LORE BEFITTING CRATE AT: modular_nova/modules/cargo/code/packs.dm -/* /datum/supply_pack/imports/russian name = "Russian Surplus Military Gear Crate" desc = "Hello <;~insert appropriate greeting here: 'Comrade'|'Imperalist Scum'|'Quartermaster of Reputable Station'~;>, \ @@ -238,8 +236,6 @@ for(var/items in 1 to 10) var/item = pick(contains) new item(our_crate) -*/ -// NOVA EDIT REMOVAL END /datum/supply_pack/imports/moistnuggets name = "Refurbished Sakhno Precision Rifle Crate" diff --git a/code/modules/cargo/packs/security.dm b/code/modules/cargo/packs/security.dm index eacd24fdbd0..0b007325829 100644 --- a/code/modules/cargo/packs/security.dm +++ b/code/modules/cargo/packs/security.dm @@ -342,17 +342,3 @@ access_view = ACCESS_SECURITY contains = list(/obj/item/clothing/glasses/sunglasses = 1) crate_name = "sunglasses crate" - -/datum/supply_pack/security/armory/beacon_imp - name = "Beacon Implants Crate" - desc = "Contains five Beacon implants." - cost = CARGO_CRATE_VALUE * 5.5 - contains = list(/obj/item/storage/box/beaconimp) - crate_name = "beacon implant crate" - -/datum/supply_pack/security/armory/teleport_blocker_imp - name = "Bluespace Grounding Implants Crate" - desc = "Contains five Bluespace Grounding implants." - cost = CARGO_CRATE_VALUE * 7 - contains = list(/obj/item/storage/box/teleport_blocker) - crate_name = "bluespace grounding implant crate" diff --git a/code/modules/client/client_colour.dm b/code/modules/client/client_colour.dm index 158e466c107..56436d0a0ab 100644 --- a/code/modules/client/client_colour.dm +++ b/code/modules/client/client_colour.dm @@ -38,35 +38,32 @@ /datum/client_colour/Destroy() if(!QDELETED(owner)) owner.client_colours -= src - if(fade_out) - owner.animate_client_colour(fade_out) - else - owner.update_client_colour() + owner.animate_client_colour(fade_out) owner = null return ..() ///Sets a new colour, then updates the owner's screen colour. /datum/client_colour/proc/update_colour(new_colour, anim_time, easing = 0) colour = new_colour - if(anim_time) - owner.animate_client_colour(anim_time, easing) - else - owner.update_client_colour() + owner.animate_client_colour(anim_time, easing) /** * Adds an instance of colour_type to the mob's client_colours list * colour_type - a typepath (subtyped from /datum/client_colour) */ -/mob/proc/add_client_colour(colour_type) - if(!ispath(colour_type, /datum/client_colour) || QDELING(src)) +/mob/proc/add_client_colour(colour_type_or_datum) + if(QDELING(src)) return + var/datum/client_colour/colour + if(istype(colour_type_or_datum, /datum/client_colour)) + colour = colour_type_or_datum + else if(ispath(colour_type_or_datum, /datum/client_colour)) + colour = new colour_type_or_datum(src) + else + CRASH("Invalid colour type or datum for add_client_color: [colour_type_or_datum || "null"]") - var/datum/client_colour/colour = new colour_type(src) BINARY_INSERT(colour, client_colours, /datum/client_colour, colour, priority, COMPARE_KEY) - if(colour.fade_in) - animate_client_colour(colour.fade_in) - else - update_client_colour() + animate_client_colour(colour.fade_in) return colour /** @@ -77,8 +74,7 @@ if(!ispath(colour_type, /datum/client_colour)) return - for(var/cc in client_colours) - var/datum/client_colour/colour = cc + for(var/datum/client_colour/colour as anything in client_colours) if(colour.type == colour_type) qdel(colour) break @@ -123,31 +119,49 @@ };\ target = _our_colour\ +#define CLIENT_COLOR_FILTER_KEY "fake_client_color" /** * Resets the mob's client.color to null, and then reapplies a new color based * on the client_colour datums it currently has. */ /mob/proc/update_client_colour() - if(!client) + if(isnull(hud_used)) return - client.color = "" - if(!client_colours.len) - return - MIX_CLIENT_COLOUR(client.color) + + var/new_color = "" + if(length(client_colours)) + MIX_CLIENT_COLOUR(new_color) + + for(var/atom/movable/screen/plane_master/game_plane as anything in hud_used.get_true_plane_masters(RENDER_PLANE_GAME)) + if(new_color) + game_plane.add_filter(CLIENT_COLOR_FILTER_KEY, 2, color_matrix_filter(new_color)) + else + game_plane.remove_filter(CLIENT_COLOR_FILTER_KEY) ///Works similarly to 'update_client_colour', but animated. -/mob/proc/animate_client_colour(anim_time = 20, anim_easing = 0) - if(!client) - return - if(!client_colours.len) - animate(client, color = "", time = anim_time, easing = anim_easing) +/mob/proc/animate_client_colour(anim_time = 2 SECONDS, anim_easing = NONE) + if(anim_time <= 0) + return update_client_colour() + if(isnull(hud_used)) return - MIX_CLIENT_COLOUR(var/anim_colour) - animate(client, color = anim_colour, time = anim_time, easing = anim_easing) + + var/anim_color = "" + if(length(client_colours)) + MIX_CLIENT_COLOUR(anim_color) + + for(var/atom/movable/screen/plane_master/game_plane as anything in hud_used.get_true_plane_masters(RENDER_PLANE_GAME)) + if(anim_color) + game_plane.add_filter(CLIENT_COLOR_FILTER_KEY, 2, color_matrix_filter()) + game_plane.transition_filter(CLIENT_COLOR_FILTER_KEY, color_matrix_filter(anim_color), anim_time, anim_easing) + else + game_plane.transition_filter(CLIENT_COLOR_FILTER_KEY, color_matrix_filter(), anim_time, anim_easing) + // This leaves a blank color filter on the hud which is, fine I guess? #undef MIX_CLIENT_COLOUR +#undef CLIENT_COLOR_FILTER_KEY + /datum/client_colour/glass_colour priority = PRIORITY_LOW @@ -225,6 +239,9 @@ priority = PRIORITY_ABSOLUTE colour = COLOR_RED +/datum/client_colour/temp + priority = PRIORITY_HIGH + #undef PRIORITY_ABSOLUTE #undef PRIORITY_HIGH #undef PRIORITY_NORMAL diff --git a/code/modules/client/client_defines.dm b/code/modules/client/client_defines.dm index 15a8e4454fc..45ccda8b92b 100644 --- a/code/modules/client/client_defines.dm +++ b/code/modules/client/client_defines.dm @@ -240,6 +240,9 @@ var/list/keys_held = list() /// A buffer for combinations such of modifiers + keys (ex: CtrlD, AltE, ShiftT). Format: `"key"` -> `"combo"` (ex: `"D"` -> `"CtrlD"`) var/list/key_combos_held = list() + /// The direction we WANT to move, based off our keybinds + /// Will be udpated to be the actual direction later on + var/intended_direction = NONE /* ** These next two vars are to apply movement for keypresses and releases made while move delayed. ** Because discarding that input makes the game less responsive. diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index f77d74a52c5..018e3f23a2c 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -1044,6 +1044,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( winset(src, "default-[REF(key)]", "parent=default;name=[key];command=[asay]") else winset(src, "default-[REF(key)]", "parent=default;name=[key];command=") + calculate_move_dir() /client/proc/change_view(new_size) if (isnull(new_size)) diff --git a/code/modules/client/preferences/middleware/quirks.dm b/code/modules/client/preferences/middleware/quirks.dm index 3fabab63238..be8bee46549 100644 --- a/code/modules/client/preferences/middleware/quirks.dm +++ b/code/modules/client/preferences/middleware/quirks.dm @@ -43,7 +43,8 @@ "value" = initial(quirk.value), "customizable" = constant_data?.is_customizable(), "customization_options" = customization_options, - "veteran_only" = initial(quirk.veteran_only), // NOVA EDIT - Veteran quirks + "veteran_only" = initial(quirk.veteran_only), // NOVA EDIT ADDITION - Veteran quirks + "erp_quirk" = initial(quirk.erp_quirk), // NOVA EDIT ADDITION - Purple ERP quirks ) return list( diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 9e699530169..2f8c10ad7c5 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -214,7 +214,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car //Sanitize lastchangelog = sanitize_text(lastchangelog, initial(lastchangelog)) default_slot = sanitize_integer(default_slot, 1, max_save_slots, initial(default_slot)) - toggles = sanitize_integer(toggles, 0, (2**24)-1, initial(toggles)) + toggles = sanitize_integer(toggles, 0, SHORT_REAL_LIMIT-1, initial(toggles)) be_special = sanitize_be_special(SANITIZE_LIST(be_special)) key_bindings = sanitize_keybindings(key_bindings) favorite_outfits = SANITIZE_LIST(favorite_outfits) diff --git a/code/modules/clothing/chameleon/chameleon_action_subtypes.dm b/code/modules/clothing/chameleon/chameleon_action_subtypes.dm index c4ee98acd51..275b2c6e0fc 100644 --- a/code/modules/clothing/chameleon/chameleon_action_subtypes.dm +++ b/code/modules/clothing/chameleon/chameleon_action_subtypes.dm @@ -282,7 +282,6 @@ /obj/item/camera/siliconcam, /obj/item/door_remote/omni, /obj/item/flashlight/emp/debug, - /obj/item/flashlight/eyelight/adapted, /obj/item/flashlight/flare, /obj/item/flashlight/lamp, /obj/item/healthanalyzer/rad_laser, diff --git a/code/modules/clothing/gloves/_gloves.dm b/code/modules/clothing/gloves/_gloves.dm index 3f5503ca0ee..0c48cb102b2 100644 --- a/code/modules/clothing/gloves/_gloves.dm +++ b/code/modules/clothing/gloves/_gloves.dm @@ -41,13 +41,13 @@ /obj/item/clothing/gloves/worn_overlays(mutable_appearance/standing, isinhands = FALSE) . = ..() - if(!isinhands) + if(isinhands) return if(damaged_clothes) . += mutable_appearance('icons/effects/item_damage.dmi', "damagedgloves") if(GET_ATOM_BLOOD_DNA_LENGTH(src)) - . += mutable_appearance('icons/effects/blood.dmi', "bloodyhands") + . += mutable_appearance('icons/effects/blood.dmi', "gloveblood") /obj/item/clothing/gloves/update_clothes_damaged_state(damaged_state = CLOTHING_DAMAGED) ..() diff --git a/code/modules/clothing/head/cakehat.dm b/code/modules/clothing/head/cakehat.dm index 4a05ff7116f..57369ac24f8 100644 --- a/code/modules/clothing/head/cakehat.dm +++ b/code/modules/clothing/head/cakehat.dm @@ -10,7 +10,7 @@ righthand_file = 'icons/mob/inhands/clothing/hats_righthand.dmi' armor_type = /datum/armor/none light_range = 2 //luminosity when on - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT flags_cover = HEADCOVERSEYES heat = 999 wound_bonus = 10 diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index a05d3d670cf..131f9f10c03 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -13,7 +13,7 @@ clothing_flags = SNUG_FIT | STACKABLE_HELMET_EXEMPT resistance_flags = FIRE_PROOF - light_system = MOVABLE_LIGHT_DIRECTIONAL + light_system = OVERLAY_LIGHT_DIRECTIONAL light_range = 4 light_power = 0.8 light_on = FALSE diff --git a/code/modules/clothing/masks/bandana.dm b/code/modules/clothing/masks/bandana.dm index 7d04daf15f2..a6719556b3f 100644 --- a/code/modules/clothing/masks/bandana.dm +++ b/code/modules/clothing/masks/bandana.dm @@ -207,3 +207,34 @@ desc = "A fine black bandana with nanotech lining and a skull emblem." greyscale_colors = "#2e2e2e#C6C6C6" flags_1 = NONE + +/obj/item/clothing/mask/facescarf + name = "facescarf" + desc = "Cover your face like in the cowboy movies. It also has breathtube so you can wear it everywhere!" + actions_types = /datum/action/item_action/adjust + icon_state = "facescarf" + inhand_icon_state = "greyscale_facescarf" + alternate_worn_layer = BACK_LAYER + clothing_flags = BLOCK_GAS_SMOKE_EFFECT|MASKINTERNALS + flags_inv = HIDEFACIALHAIR | HIDEFACE | HIDESNOUT + w_class = WEIGHT_CLASS_SMALL + visor_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS + visor_flags_inv = HIDEFACIALHAIR | HIDEFACE | HIDESNOUT + flags_cover = MASKCOVERSMOUTH + visor_flags_cover = MASKCOVERSMOUTH + custom_price = PAYCHECK_CREW + greyscale_colors = "#eeeeee" + greyscale_config = /datum/greyscale_config/facescarf + greyscale_config_worn = /datum/greyscale_config/facescarf/worn + greyscale_config_inhand_left = /datum/greyscale_config/facescarf/inhands_left + greyscale_config_inhand_right = /datum/greyscale_config/facescarf/inhands_right + flags_1 = IS_PLAYER_COLORABLE_1 + +/obj/item/clothing/mask/facescarf/AltClick(mob/user) + ..() + if(user.can_perform_action(src, NEED_DEXTERITY)) + adjustmask(user) + +/obj/item/clothing/mask/facescarf/examine(mob/user) + . = ..() + . += span_notice("Alt-click [src] to adjust it.") diff --git a/code/modules/clothing/masks/costume.dm b/code/modules/clothing/masks/costume.dm index 7eb5da57743..384b6a43460 100644 --- a/code/modules/clothing/masks/costume.dm +++ b/code/modules/clothing/masks/costume.dm @@ -39,3 +39,29 @@ icon_state = "scarecrow_sack" inhand_icon_state = null flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT + +/obj/item/clothing/mask/kitsune + name = "kitsune mask" + desc = "Porcelain mask made in the style of the Sol-3 region. It is painted to look like a kitsune." + icon_state = "kitsune" + inhand_icon_state = null + w_class = WEIGHT_CLASS_SMALL + flags_inv = HIDEFACE|HIDEFACIALHAIR + custom_price = PAYCHECK_CREW + greyscale_colors = "#EEEEEE#AA0000" + greyscale_config = /datum/greyscale_config/kitsune + greyscale_config_worn = /datum/greyscale_config/kitsune/worn + flags_1 = IS_PLAYER_COLORABLE_1 + +/obj/item/clothing/mask/rebellion + name = "rebellion mask" + desc = "Mask that is usually used during rebellions by insurgents. It covers the entire face and makes you unrecognizable." + icon_state = "rebellion_mask" + inhand_icon_state = null + w_class = WEIGHT_CLASS_SMALL + flags_inv = HIDEFACE|HIDEFACIALHAIR|HIDESNOUT + custom_price = PAYCHECK_CREW + greyscale_colors = "#EEEEEE" + greyscale_config = /datum/greyscale_config/rebellion_mask + greyscale_config_worn = /datum/greyscale_config/rebellion_mask/worn + flags_1 = IS_PLAYER_COLORABLE_1 diff --git a/code/modules/clothing/shoes/clown.dm b/code/modules/clothing/shoes/clown.dm index 37270f47f6c..d8d4d56fdc2 100644 --- a/code/modules/clothing/shoes/clown.dm +++ b/code/modules/clothing/shoes/clown.dm @@ -20,13 +20,13 @@ . = ..() if(slot & ITEM_SLOT_FEET) if(enabled_waddle) - user.AddElement(/datum/element/waddling) + user.AddElementTrait(TRAIT_WADDLING, SHOES_TRAIT, /datum/element/waddling) if(is_clown_job(user.mind?.assigned_role)) user.add_mood_event("clownshoes", /datum/mood_event/clownshoes) /obj/item/clothing/shoes/clown_shoes/dropped(mob/living/user) . = ..() - user.RemoveElement(/datum/element/waddling) + REMOVE_TRAIT(user, TRAIT_WADDLING, SHOES_TRAIT) if(is_clown_job(user.mind?.assigned_role)) user.clear_mood_event("clownshoes") diff --git a/code/modules/clothing/shoes/costume.dm b/code/modules/clothing/shoes/costume.dm index 1a3e9b0b2be..1e15f25e1f6 100644 --- a/code/modules/clothing/shoes/costume.dm +++ b/code/modules/clothing/shoes/costume.dm @@ -128,8 +128,8 @@ /obj/item/clothing/shoes/ducky_shoes/equipped(mob/living/user, slot) . = ..() if(slot & ITEM_SLOT_FEET) - user.AddElement(/datum/element/waddling) + user.AddElementTrait(TRAIT_WADDLING, SHOES_TRAIT, /datum/element/waddling) /obj/item/clothing/shoes/ducky_shoes/dropped(mob/living/user) . = ..() - user.RemoveElement(/datum/element/waddling) + REMOVE_TRAIT(user, TRAIT_WADDLING, SHOES_TRAIT) diff --git a/code/modules/clothing/shoes/kindlekicks.dm b/code/modules/clothing/shoes/kindlekicks.dm index 82bcb806515..339ec9669af 100644 --- a/code/modules/clothing/shoes/kindlekicks.dm +++ b/code/modules/clothing/shoes/kindlekicks.dm @@ -4,7 +4,7 @@ icon_state = "kindleKicks" inhand_icon_state = null actions_types = list(/datum/action/item_action/kindle_kicks) - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 2 light_power = 3 light_on = FALSE diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm index 30e43c793aa..90141d281dd 100644 --- a/code/modules/clothing/spacesuits/plasmamen.dm +++ b/code/modules/clothing/spacesuits/plasmamen.dm @@ -52,7 +52,7 @@ tint = 2 armor_type = /datum/armor/space_plasmaman resistance_flags = FIRE_PROOF - light_system = MOVABLE_LIGHT_DIRECTIONAL + light_system = OVERLAY_LIGHT_DIRECTIONAL light_range = 4 light_on = FALSE var/helmet_on = FALSE diff --git a/code/modules/clothing/under/trek.dm b/code/modules/clothing/under/trek.dm index 3de26404cd5..de72342f941 100644 --- a/code/modules/clothing/under/trek.dm +++ b/code/modules/clothing/under/trek.dm @@ -15,7 +15,6 @@ inhand_icon_state = "y_suit" greyscale_config = /datum/greyscale_config/trek greyscale_config_worn = /datum/greyscale_config/trek/worn - greyscale_config_worn_digi = /datum/greyscale_config/trek/worn/digi //NOVA EDIT ADDITION - DigiGreyscale greyscale_colors = "#fab342" /obj/item/clothing/under/trek/engsec @@ -25,7 +24,6 @@ inhand_icon_state = "r_suit" greyscale_config = /datum/greyscale_config/trek greyscale_config_worn = /datum/greyscale_config/trek/worn - greyscale_config_worn_digi = /datum/greyscale_config/trek/worn/digi //NOVA EDIT ADDITION - DigiGreyscale greyscale_colors = "#B72B2F" /obj/item/clothing/under/trek/medsci @@ -35,7 +33,6 @@ inhand_icon_state = "b_suit" greyscale_config = /datum/greyscale_config/trek greyscale_config_worn = /datum/greyscale_config/trek/worn - greyscale_config_worn_digi = /datum/greyscale_config/trek/worn/digi //NOVA EDIT ADDITION - DigiGreyscale greyscale_colors = "#5FA4CC" /* diff --git a/code/modules/deathmatch/deathmatch_controller.dm b/code/modules/deathmatch/deathmatch_controller.dm new file mode 100644 index 00000000000..86e86f491fb --- /dev/null +++ b/code/modules/deathmatch/deathmatch_controller.dm @@ -0,0 +1,125 @@ +/datum/deathmatch_controller + /// Assoc list of all lobbies (ckey = lobby) + var/list/datum/deathmatch_lobby/lobbies = list() + /// All deathmatch map templates + var/list/datum/lazy_template/deathmatch/maps = list() + /// All loadouts + var/list/datum/outfit/loadouts + +/datum/deathmatch_controller/New() + . = ..() + if (GLOB.deathmatch_game) + qdel(src) + CRASH("A deathmatch controller already exists.") + GLOB.deathmatch_game = src + + for (var/datum/lazy_template/deathmatch/template as anything in subtypesof(/datum/lazy_template/deathmatch)) + var/map_name = initial(template.name) + maps[map_name] = new template + loadouts = subtypesof(/datum/outfit/deathmatch_loadout) + +/datum/deathmatch_controller/proc/create_new_lobby(mob/host) + lobbies[host.ckey] = new /datum/deathmatch_lobby(host) + deadchat_broadcast(" has opened a new deathmatch lobby. (Join)", "[host]") + +/datum/deathmatch_controller/proc/remove_lobby(ckey) + var/lobby = lobbies[ckey] + lobbies[ckey] = null + lobbies.Remove(ckey) + qdel(lobby) + +/datum/deathmatch_controller/proc/passoff_lobby(host, new_host) + lobbies[new_host] = lobbies[host] + lobbies[host] = null + lobbies.Remove(host) + +/datum/deathmatch_controller/ui_state(mob/user) + return GLOB.observer_state + +/datum/deathmatch_controller/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, null) + if(!ui) + ui = new(user, src, "DeathmatchPanel") + ui.open() + +/datum/deathmatch_controller/ui_data(mob/user) + . = ..() + .["lobbies"] = list() + .["hosting"] = FALSE + .["admin"] = check_rights_for(user.client, R_ADMIN) + for (var/ckey in lobbies) + var/datum/deathmatch_lobby/lobby = lobbies[ckey] + if (user.ckey == ckey) + .["hosting"] = TRUE + if (user.ckey in lobby.observers+lobby.players) + .["playing"] = ckey + .["lobbies"] += list(list( + name = ckey, + players = lobby.players.len, + max_players = initial(lobby.map.max_players), + map = initial(lobby.map.name), + playing = lobby.playing + )) + +/datum/deathmatch_controller/proc/find_lobby_by_user(ckey) + for(var/lobbykey in lobbies) + var/datum/deathmatch_lobby/lobby = lobbies[lobbykey] + if(ckey in lobby.players+lobby.observers) + return lobby + +/datum/deathmatch_controller/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(. || !isobserver(usr)) + return + switch (action) + if ("host") + if (lobbies[usr.ckey]) + return + if(!SSticker.HasRoundStarted()) + tgui_alert(usr, "The round hasn't started yet!") + return + ui.close() + create_new_lobby(usr) + if ("join") + if (!lobbies[params["id"]]) + return + var/datum/deathmatch_lobby/playing_lobby = find_lobby_by_user(usr.ckey) + var/datum/deathmatch_lobby/chosen_lobby = lobbies[params["id"]] + if (!isnull(playing_lobby) && playing_lobby != chosen_lobby) + playing_lobby.leave(usr.ckey) + + if(isnull(playing_lobby)) + log_game("[usr.ckey] joined deathmatch lobby [params["id"]] as a player.") + chosen_lobby.join(usr) + + chosen_lobby.ui_interact(usr) + if ("spectate") + var/datum/deathmatch_lobby/playing_lobby = find_lobby_by_user(usr.ckey) + if (!lobbies[params["id"]]) + return + var/datum/deathmatch_lobby/chosen_lobby = lobbies[params["id"]] + // if the player is in this lobby + if(!isnull(playing_lobby) && playing_lobby != chosen_lobby) + playing_lobby.leave(usr.ckey) + else if(playing_lobby == chosen_lobby) + chosen_lobby.ui_interact(usr) + return + // they werent in the lobby, lets add them + if (!chosen_lobby.playing) + chosen_lobby.add_observer(usr) + chosen_lobby.ui_interact(usr) + else + chosen_lobby.spectate(usr) + log_game("[usr.ckey] joined deathmatch lobby [params["id"]] as an observer.") + if ("admin") + if (!check_rights(R_ADMIN)) + message_admins("[usr.key] has attempted to use admin functions in the deathmatch panel!") + log_admin("[key_name(usr)] tried to use the deathmatch panel admin functions without authorization.") + return + var/lobby = params["id"] + switch (params["func"]) + if ("Close") + remove_lobby(lobby) + log_admin("[key_name(usr)] removed deathmatch lobby [lobby].") + if ("View") + lobbies[lobby].ui_interact(usr) diff --git a/code/modules/deathmatch/deathmatch_loadouts.dm b/code/modules/deathmatch/deathmatch_loadouts.dm new file mode 100644 index 00000000000..480e1975fb9 --- /dev/null +++ b/code/modules/deathmatch/deathmatch_loadouts.dm @@ -0,0 +1,377 @@ +/datum/outfit/deathmatch_loadout //remember that fun > balance + name = "" + shoes = /obj/item/clothing/shoes/sneakers/black // im not doing this on all of them + /// Name shown in the UI + var/display_name = "" + /// Description shown in the UI + var/desc = ":KILL:" + /// If defined, using this outfit sets the targets species to it + var/datum/species/species_override + /// This outfit will grant these spells if applied + var/list/granted_spells = list() + +/datum/outfit/deathmatch_loadout/pre_equip(mob/living/carbon/human/user, visualsOnly = FALSE) + . = ..() + if(isdummy(user)) + return + + if(!isnull(species_override)) + user.set_species(species_override) + for(var/datum/action/act as anything in granted_spells) + var/datum/action/new_ability = new act(user) + new_ability.Grant(user) + +/datum/outfit/deathmatch_loadout/naked + name = "Deathmatch: Naked" + display_name = "Unarmed, Butt-naked" + desc = "Naked man craves for bloodshed." + shoes = null + +/datum/outfit/deathmatch_loadout/assistant + name = "Deathmatch: Assistant loadout" + display_name = "Assistant" + desc = "A simple assistant loadout: greyshirt and a toolbox" + + l_hand = /obj/item/storage/toolbox/mechanical + uniform = /obj/item/clothing/under/color/grey + back = /obj/item/storage/backpack + box = /obj/item/storage/box/survival + belt = /obj/item/flashlight + +/datum/outfit/deathmatch_loadout/assistant/weaponless + name = "Deathmatch: Assistant loadout (Weaponless)" + display_name = "Assistant (Unarmed)" + desc = "What is an assistant without a toolbox? nothing" + l_hand = null + +/datum/outfit/deathmatch_loadout/operative + name = "Deathmatch: Operative" + display_name = "Operative" + desc = "A syndicate operative." + + uniform = /obj/item/clothing/under/syndicate + shoes = /obj/item/clothing/shoes/combat + gloves = /obj/item/clothing/gloves/combat + back = /obj/item/storage/backpack + id = /obj/item/card/id/advanced/chameleon + +/datum/outfit/deathmatch_loadout/operative/ranged + name = "Deathmatch: Ranged Operative" + display_name = "Ranged Operative" + desc = "A syndicate operative with a gun and a knife." + + l_hand = /obj/item/gun/ballistic/automatic/pistol + l_pocket = /obj/item/knife/combat + backpack_contents = list(/obj/item/ammo_box/magazine/m9mm = 5) + +/datum/outfit/deathmatch_loadout/operative/melee + name = "Deathmatch: Melee Operative" + display_name = "Melee Operative" + desc = "A syndicate operative with multiple knives." + + gloves = /obj/item/clothing/gloves/tackler/combat/insulated + suit = /obj/item/clothing/suit/armor/vest + head = /obj/item/clothing/head/helmet + backpack_contents = list(/obj/item/knife/combat = 6) + l_hand = /obj/item/knife/combat + l_pocket = /obj/item/knife/combat + +/datum/outfit/deathmatch_loadout/securing_sec + name = "Deathmatch: Security Officer" + display_name = "Security Officer" + desc = "A security officer." + + uniform = /datum/outfit/job/security::uniform + suit = /datum/outfit/job/security::suit + suit_store = /datum/outfit/job/security::suit_store + belt = /datum/outfit/job/security::belt + ears = /datum/outfit/job/security::ears //cant communicate with station i think? + gloves = /datum/outfit/job/security::gloves + head = /datum/outfit/job/security::head + shoes = /datum/outfit/job/security::shoes + l_pocket = /obj/item/flashlight/seclite + l_hand = /obj/item/gun/energy/disabler + r_pocket = /obj/item/knife/combat/survival + back = /datum/outfit/job/security::backpack + box = /datum/outfit/job/security::box + implants = list(/obj/item/implant/mindshield) + +/datum/outfit/deathmatch_loadout/assistant/instagib + name = "DM: Instagib" + display_name = "Instagib" + desc = "Assistant with an instakill rifle." + + l_hand = /obj/item/gun/energy/laser/instakill + +/datum/outfit/deathmatch_loadout/operative/sniper + name = "Deathmatch: Sniper" + display_name = "Sniper" + desc = "You know what do you need to do" + backpack_contents = list( + /obj/item/ammo_box/magazine/sniper_rounds = 3, + ) + glasses = /obj/item/clothing/glasses/thermal + uniform = /obj/item/clothing/under/syndicate/sniper + gloves = /obj/item/clothing/gloves/tackler/combat/insulated + l_pocket = /obj/item/knife/combat + l_hand = /obj/item/gun/ballistic/rifle/sniper_rifle + +/datum/outfit/deathmatch_loadout/chef + name = "Deathmatch: Chef" + display_name = "Chef" + desc = "He love pizza." + uniform = /obj/item/clothing/under/costume/buttondown/slacks/service + suit = /obj/item/clothing/suit/toggle/chef + head = /obj/item/clothing/head/utility/chefhat + mask = /obj/item/clothing/mask/fakemoustache/italian + gloves = /obj/item/clothing/gloves/the_sleeping_carp + back = /obj/item/storage/backpack + backpack_contents = list( + /obj/item/sharpener, + ) + +/datum/outfit/deathmatch_loadout/samurai + name = "Deathmatch: Samurai" + display_name = "Samurai" + desc = "Bare-footed man craves to bloodshed." + l_hand = /obj/item/katana + uniform = /obj/item/clothing/under/costume/gi + +/// battlers + +/datum/outfit/deathmatch_loadout/battler + name = "Deathmatch: Battler Base" + display_name = "Battler" + desc = "What is a battler whith out weapone?." + + shoes = /obj/item/clothing/shoes/combat + uniform = /obj/item/clothing/under/syndicate + gloves = /obj/item/clothing/gloves/combat + back = /obj/item/storage/backpack + id = /obj/item/card/id/advanced/chameleon + +/datum/outfit/deathmatch_loadout/battler/soldier + name = "Deathmatch: Soldier" + display_name = "Soldier" + desc = "Ready for combat." + + l_hand = /obj/item/gun/ballistic/rifle/boltaction + l_pocket = /obj/item/knife/combat + uniform = /obj/item/clothing/under/syndicate/rus_army + suit = /obj/item/clothing/suit/armor/vest + head = /obj/item/clothing/head/helmet/rus_helmet + gloves = /obj/item/clothing/gloves/tackler/combat/insulated + + backpack_contents = list( + /obj/item/grenade/smokebomb = 2, + /obj/item/ammo_box/strilka310 = 2, + ) + +/datum/outfit/deathmatch_loadout/battler/druid + name = "Deathmatch: Druid" + display_name = "Druid" + desc = "How can plants help you?" + species_override = /datum/species/pod + l_hand = /obj/item/gun/ballistic/bow + r_hand = /obj/item/ammo_casing/arrow + l_pocket = /obj/item/knife/shiv/carrot + r_pocket = /obj/item/flashlight/lantern + head = /obj/item/food/grown/ambrosia/gaia + uniform = /obj/item/clothing/under/shorts/green + mask = /obj/item/clothing/mask/gas/tiki_mask + glasses = /obj/item/clothing/glasses/thermal + gloves = /obj/item/clothing/gloves/botanic_leather + belt = /obj/item/gun/syringe/blowgun + back = /obj/item/storage/backpack/saddlepack + shoes = /obj/item/clothing/shoes/sandal + backpack_contents = list( + /obj/item/reagent_containers/syringe/crude/mushroom = 1, + /obj/item/reagent_containers/syringe/crude/blastoff = 1, + /obj/item/ammo_casing/arrow = 2, + /obj/item/food/grown/nettle/death = 2, + /obj/item/food/grown/banana = 2, + /obj/item/food/grown/cherry_bomb = 2, + /obj/item/food/grown/mushroom/walkingmushroom = 2, + /obj/item/seeds/kudzu = 1, + ) + +/datum/outfit/deathmatch_loadout/battler/northstar + name = "Deathmatch: North Star" + display_name = "North Star" + desc = "flip flip flip" + + uniform = /obj/item/clothing/under/suit/carpskin + head = /obj/item/clothing/head/fedora/carpskin + gloves = /obj/item/clothing/gloves/rapid + backpack_contents = list( + /obj/item/throwing_star = 6, + /obj/item/restraints/legcuffs/bola/tactical = 2, + ) + +/datum/outfit/deathmatch_loadout/battler/janitor + name = "Deathmatch: Janitor" + display_name = "Janitor" + desc = "Regular work" + + uniform = /obj/item/clothing/under/rank/civilian/janitor + suit = /obj/item/clothing/suit/caution + head = /obj/item/reagent_containers/cup/bucket + shoes = /obj/item/clothing/shoes/chameleon/noslip + l_hand = /obj/item/pushbroom + l_pocket = /obj/item/reagent_containers/spray/waterflower/lube + backpack_contents = list( + /obj/item/grenade/chem_grenade/cleaner = 2, + /obj/item/restraints/legcuffs/beartrap = 3, + /obj/item/soap, + ) + +/datum/outfit/deathmatch_loadout/battler/surgeon + name = "Deathmatch: Surgeon" + display_name = "Surgeon" + desc = "Treatment has come" + + uniform = /obj/item/clothing/under/rank/medical/scrubs/blue + suit = /obj/item/clothing/suit/apron/surgical + head = /obj/item/clothing/head/utility/surgerycap + mask = /obj/item/clothing/mask/surgical + glasses = /obj/item/clothing/glasses/hud/health/night + l_pocket = /obj/item/reagent_containers/hypospray/combat + r_pocket = /obj/item/reagent_containers/hypospray/medipen/penthrite + l_hand = /obj/item/chainsaw + + backpack_contents = list( + /obj/item/storage/medkit/tactical, + /obj/item/reagent_containers/hypospray/medipen/stimulants, + ) + +/datum/outfit/deathmatch_loadout/battler/raider + name = "Deathmatch: Raider" + display_name = "Raider" + desc = "Not from Shadow Legends" + + l_hand = /obj/item/nullrod/claymore/chainsaw_sword + r_pocket = /obj/item/switchblade + uniform = /obj/item/clothing/under/costume/jabroni + back = /obj/item/spear + belt = /obj/item/gun/magic/hook + head = /obj/item/clothing/head/utility/welding + +/datum/outfit/deathmatch_loadout/battler/clown + name = "DM: Clown" + display_name = "Clown (Man Of Honk)" + desc = "Who called this honking clown" + + uniform = /datum/outfit/job/clown::uniform + belt = /datum/outfit/job/clown::belt + shoes = /datum/outfit/job/clown::shoes + mask = /datum/outfit/job/clown::mask + l_pocket = /datum/outfit/job/clown::l_pocket + back = /datum/outfit/job/clown::backpack + box = /datum/outfit/job/clown::box + implants = list(/obj/item/implant/sad_trombone) + l_pocket = /obj/item/melee/energy/sword/bananium + r_pocket = /obj/item/shield/energy/bananium + gloves = /obj/item/clothing/gloves/tackler/rocket + + backpack_contents = list( + /obj/item/reagent_containers/spray/waterflower = 1, + /obj/item/instrument/bikehorn = 1, + /obj/item/bikehorn/airhorn = 1, + /obj/item/food/grown/banana = 3, + /obj/item/food/pie/cream = 2, + ) + +/datum/outfit/deathmatch_loadout/battler/tgcoder //tg doesnt stand for tgstation dont ask + name = "Deathmatch: Coder" + display_name = "Coder" + desc = "What" + + l_hand = /obj/item/toy/katana + uniform = /obj/item/clothing/under/costume/schoolgirl + suit = /obj/item/clothing/suit/costume/joker + shoes = /obj/item/clothing/shoes/clown_shoes/meown_shoes + head = /obj/item/clothing/head/costume/kitty + backpack_contents = list( + /obj/item/reagent_containers/cup/soda_cans/pwr_game = 10, + ) + +/datum/outfit/deathmatch_loadout/battler/enginer + name = "Deathmatch: Engineer" + display_name = "Engineer" + desc = "Meet the engineer" + + l_hand = /obj/item/storage/toolbox/emergency/turret + uniform = /obj/item/clothing/under/rank/engineering/engineer + shoes = /obj/item/clothing/shoes/magboots + head = /obj/item/clothing/head/utility/hardhat + back = /obj/item/fireaxe + gloves = /obj/item/clothing/gloves/color/yellow + +/datum/outfit/deathmatch_loadout/battler/scientist + name = "Deathmatch: Scientist" + display_name = "Scientist" + desc = "What a nerd" + + uniform = /obj/item/clothing/under/rank/rnd/scientist + suit = /obj/item/clothing/suit/armor/reactive/stealth + mask = /obj/item/clothing/mask/gas + l_hand = /obj/item/reagent_containers/syringe/plasma + l_pocket = /obj/item/slimecross/stabilized/sepia + r_pocket = /obj/item/slimecross/stabilized/purple + backpack_contents = list( + /obj/item/reagent_containers/cup/bottle/plasma, + /obj/item/slimecross/burning/grey, + /obj/item/slimecross/burning/adamantine, + /obj/item/slimecross/burning/gold, + /obj/item/slimecross/burning/blue, + /obj/item/slimecross/burning/sepia, + /obj/item/slimecross/chilling/green, + /obj/item/slimecross/chilling/grey, + /obj/item/slimecross/industrial/oil, + /obj/item/slimecross/charged/silver, + /obj/item/slimecross/charged/black, + /obj/item/slimecross/burning/rainbow, + /obj/item/slimecross/chilling/adamantine, + ) + +/datum/outfit/deathmatch_loadout/battler/bloodminer + name = "Deathmatch: Blood Miner" + display_name = "Blood Miner" + desc = "Rip and tear!!!" + + l_hand = /obj/item/melee/cleaving_saw + r_hand = /obj/item/gun/energy/recharge/kinetic_accelerator + uniform = /obj/item/clothing/under/rank/cargo/miner/lavaland + suit = /obj/item/clothing/suit/hooded/explorer + shoes = /obj/item/clothing/shoes/workboots/mining + mask = /obj/item/clothing/mask/gas/explorer + granted_spells = list( + /datum/action/cooldown/mob_cooldown/dash, + ) + +/datum/outfit/deathmatch_loadout/battler/ripper + name = "Deathmatch: Ripper" + display_name = "Ripper" + desc = "Die die die!!!" + + l_hand = /obj/item/gun/ballistic/shotgun/hook + r_hand = /obj/item/gun/ballistic/shotgun/hook + uniform = /obj/item/clothing/under/costume/skeleton + suit = /obj/item/clothing/suit/hooded/cultrobes/eldritch + mask = /obj/item/clothing/mask/gas/cyborg + shoes = /obj/item/clothing/shoes/sandal + belt = /obj/item/melee/cleric_mace + +/datum/outfit/deathmatch_loadout/battler/cowboy + name = "Deathmatch: Cowboy" + display_name = "Cowboy" + desc = "Yeehaw partner" + + r_hand = /obj/item/clothing/mask/cigarette/cigar + l_hand = /obj/item/melee/curator_whip + l_pocket = /obj/item/lighter + accessory = /obj/item/clothing/accessory/vest_sheriff + uniform = /obj/item/clothing/under/rank/security/detective + shoes = /obj/item/clothing/shoes/cowboy + belt = /obj/item/storage/belt/holster/detective/full + head = /obj/item/clothing/head/cowboy/brown diff --git a/code/modules/deathmatch/deathmatch_lobby.dm b/code/modules/deathmatch/deathmatch_lobby.dm new file mode 100644 index 00000000000..50db2ca0fff --- /dev/null +++ b/code/modules/deathmatch/deathmatch_lobby.dm @@ -0,0 +1,440 @@ +/datum/deathmatch_lobby + /// Ckey of the host + var/host + /// Assoc list of ckey to list() + var/list/players = list() + /// Assoc list of ckey to list() + var/list/observers = list() + /// The current chosen map + var/datum/lazy_template/deathmatch/map + /// Our turf reservation AKA where the arena is + var/datum/turf_reservation/location + /// Whether players hear deadchat and people through walls + var/global_chat = FALSE + /// Whether the lobby is currently playing + var/playing = FALSE + /// Number of total ready players + var/ready_count + /// List of loadouts, either gotten from the deathmatch controller or the map + var/list/loadouts + /// Current map player spawn locations, cleared after spawning + var/list/player_spawns = list() + +/datum/deathmatch_lobby/New(mob/player) + . = ..() + if (!player) + stack_trace("Attempted to create a deathmatch lobby without a host.") + return qdel(src) + host = player.ckey + map = GLOB.deathmatch_game.maps[pick(GLOB.deathmatch_game.maps)] + log_game("[host] created a deathmatch lobby.") + if (map.allowed_loadouts) + loadouts = map.allowed_loadouts + else + loadouts = GLOB.deathmatch_game.loadouts + add_player(player, loadouts[1], TRUE) + ui_interact(player) + +/datum/deathmatch_lobby/Destroy(force, ...) + . = ..() + for (var/key in players+observers) + var/datum/tgui/ui = SStgui.get_open_ui(get_mob_by_ckey(key), src) + if (ui) ui.close() + remove_ckey_from_play(key) + if(playing && !isnull(location)) + clear_reservation() + players = null + observers = null + map = null + location = null + loadouts = null + +/datum/deathmatch_lobby/proc/start_game() + if (playing) + return + playing = TRUE + + RegisterSignal(map, COMSIG_LAZY_TEMPLATE_LOADED, PROC_REF(find_spawns_and_start_delay)) + location = map.lazy_load() + if (!location) + to_chat(get_mob_by_ckey(host), span_warning("Couldn't reserve/load a map location (all locations used?), try again later, or contact a coder.")) + playing = FALSE + UnregisterSignal(map, COMSIG_LAZY_TEMPLATE_LOADED) + return FALSE + +/datum/deathmatch_lobby/proc/find_spawns_and_start_delay(datum/lazy_template/source, list/atoms) + SIGNAL_HANDLER + for(var/thing in atoms) + if(istype(thing, /obj/effect/landmark/deathmatch_player_spawn)) + player_spawns += thing + + UnregisterSignal(source, COMSIG_LAZY_TEMPLATE_LOADED) + addtimer(CALLBACK(src, PROC_REF(start_game_after_delay)), 8 SECONDS) + +/datum/deathmatch_lobby/proc/start_game_after_delay() + if (!length(player_spawns) || length(player_spawns) < length(players)) + stack_trace("Failed to get spawns when loading deathmatch map [map.name] for lobby [host].") + clear_reservation() + playing = FALSE + return FALSE + + for (var/key in players) + var/mob/dead/observer/observer = players[key]["mob"] + if (isnull(observer) || !observer.client) + log_game("Removed player [key] from deathmatch lobby [host], as they couldn't be found.") + remove_ckey_from_play(key) + continue + + // pick spawn and remove it. + var/picked_spawn = pick_n_take(player_spawns) + spawn_observer_as_player(key, get_turf(picked_spawn)) + qdel(picked_spawn) + + // Remove rest of spawns. + QDEL_LIST(player_spawns) + + for (var/observer_key in observers) + var/mob/observer = observers[observer_key]["mob"] + observer.forceMove(pick(location.reserved_turfs)) + + addtimer(CALLBACK(src, PROC_REF(game_took_too_long)), initial(map.automatic_gameend_time)) + log_game("Deathmatch game [host] started.") + announce(span_reallybig("GO!")) + return TRUE + +/datum/deathmatch_lobby/proc/spawn_observer_as_player(ckey, loc) + var/mob/dead/observer/observer = players[ckey]["mob"] + if (isnull(observer) || !observer.client) + remove_ckey_from_play(ckey) + return + + // equip player + var/datum/outfit/deathmatch_loadout/loadout = players[ckey]["loadout"] + if (!(loadout in loadouts)) + loadout = loadouts[1] + + observer.forceMove(loc) + var/datum/mind/observer_mind = observer.mind + var/mob/living/observer_current = observer.mind?.current + var/mob/living/carbon/human/new_player = observer.change_mob_type(/mob/living/carbon/human, delete_old_mob = TRUE) + if(!isnull(observer_mind) && observer_current) + new_player.AddComponent( \ + /datum/component/temporary_body, \ + old_mind = observer_mind, \ + old_body = observer_current, \ + ) + new_player.equipOutfit(loadout) // Loadout + players[ckey]["mob"] = new_player + + // register death handling. + RegisterSignals(new_player, list(COMSIG_LIVING_DEATH, COMSIG_MOB_GHOSTIZED, COMSIG_QDELETING), PROC_REF(player_died)) + if (global_chat) + ADD_TRAIT(new_player, TRAIT_SIXTHSENSE, INNATE_TRAIT) + ADD_TRAIT(new_player, TRAIT_XRAY_HEARING, INNATE_TRAIT) + +/datum/deathmatch_lobby/proc/game_took_too_long() + if (!location || QDELING(src)) + return + announce(span_reallybig("The players have took too long! Game ending!")) + end_game() + +/datum/deathmatch_lobby/proc/end_game() + if (!location) + CRASH("Reservation of deathmatch game [host] deleted during game.") + var/mob/winner + if(players.len) + var/list/winner_info = players[pick(players)] + if(!isnull(winner_info["mob"])) + winner = winner_info["mob"] //only one should remain anyway but incase of a draw + + announce(span_reallybig("THE GAME HAS ENDED.
    THE WINNER IS: [winner ? winner.real_name : "no one"].")) + + for(var/ckey in players) + var/mob/loser = players[ckey]["mob"] + UnregisterSignal(loser, list(COMSIG_MOB_GHOSTIZED, COMSIG_QDELETING)) + players[ckey]["mob"] = null + loser.ghostize() + qdel(loser) + + clear_reservation() + GLOB.deathmatch_game.remove_lobby(host) + log_game("Deathmatch game [host] ended.") + +/datum/deathmatch_lobby/proc/player_died(mob/living/player, gibbed) + SIGNAL_HANDLER + if(isnull(player) || QDELING(src)) + return + + var/ckey = player.ckey + if(!islist(players[ckey])) // potentially the player info could hold a reference to this mob so we can figure the ckey out without worrying about ghosting and suicides n such + for(var/potential_ckey in players) + var/list/player_info = players[potential_ckey] + if(player_info["mob"] && player_info["mob"] == player) + ckey = potential_ckey + break + + if(!islist(players[ckey])) // if we STILL didnt find a good ckey + return + + players -= ckey + + var/mob/dead/observer/ghost = !player.client ? player.get_ghost() : player.ghostize() //this doesnt work on those who used the ghost verb + if(!isnull(ghost)) + add_observer(ghost, (host == ckey)) + + announce(span_reallybig("[player.real_name] HAS DIED.
    [players.len] REMAIN.")) + + if(!gibbed && !QDELING(player)) // for some reason dusting or deleting in chasm storage messes up tgui bad + player.dust(TRUE, TRUE, TRUE) + if (players.len <= 1) + end_game() + +/datum/deathmatch_lobby/proc/add_observer(mob/mob, host = FALSE) + if (players[mob.ckey]) + CRASH("Tried to add [mob.ckey] as an observer while being a player.") + observers[mob.ckey] = list("mob" = mob, "host" = host) + +/datum/deathmatch_lobby/proc/add_player(mob/mob, loadout, host = FALSE) + if (observers[mob.ckey]) + CRASH("Tried to add [mob.ckey] as a player while being an observer.") + players[mob.ckey] = list("mob" = mob, "host" = host, "ready" = FALSE, "loadout" = loadout) + +/datum/deathmatch_lobby/proc/remove_ckey_from_play(ckey) + var/is_likely_player = (ckey in players) + var/list/main_list = is_likely_player ? players : observers + var/list/info = main_list[ckey] + if(is_likely_player && islist(info)) + ready_count -= info["ready"] + main_list -= ckey + +/datum/deathmatch_lobby/proc/announce(message) + for (var/key in players+observers) + var/mob/player = get_mob_by_ckey(key) + if (!player.client) + remove_ckey_from_play(key) + continue + to_chat(player.client, message) + +/datum/deathmatch_lobby/proc/leave(ckey) + if (host == ckey) + var/total_count = players.len + observers.len + if (total_count <= 1) // <= just in case. + GLOB.deathmatch_game.remove_lobby(host) + return + else + if (players[ckey] && players.len <= 1) + for (var/key in observers) + if (host == key) + continue + host = key + observers[key]["host"] = TRUE + break + else + for (var/key in players) + if (host == key) + continue + host = key + players[key]["host"] = TRUE + break + GLOB.deathmatch_game.passoff_lobby(ckey, host) + + remove_ckey_from_play(ckey) + +/datum/deathmatch_lobby/proc/join(mob/player) + if (playing || !player) + return + if(!(player.ckey in players+observers)) + if (players.len >= map.max_players) + add_observer(player) + else + add_player(player, loadouts[1]) + ui_interact(player) + +/datum/deathmatch_lobby/proc/spectate(mob/player) + if (!playing || !location || !player) + return + if (!observers[player.ckey]) + add_observer(player) + player.forceMove(pick(location.reserved_turfs)) + +/datum/deathmatch_lobby/proc/change_map(new_map) + if (!new_map || !GLOB.deathmatch_game.maps[new_map]) + return + map = GLOB.deathmatch_game.maps[new_map] + var/max_players = map.max_players + for (var/possible_unlucky_loser in players) + max_players-- + if (max_players <= 0) + var/loser_mob = players[possible_unlucky_loser]["mob"] + remove_ckey_from_play(possible_unlucky_loser) + add_observer(loser_mob) + + loadouts = map.allowed_loadouts ? map.allowed_loadouts : GLOB.deathmatch_game.loadouts + for (var/player_key in players) + if (players[player_key]["loadout"] in loadouts) + continue + players[player_key]["loadout"] = loadouts[1] + +/datum/deathmatch_lobby/proc/clear_reservation() + if(isnull(location) || isnull(map)) + return + for(var/turf/victimized_turf as anything in location.reserved_turfs) //remove this once clearing turf reservations is actually reliable + victimized_turf.empty() + map.reservations -= location + qdel(location) + +/datum/deathmatch_lobby/Topic(href, href_list) //This handles the chat Join button href, supposedly + var/mob/dead/observer/ghost = usr + if (!istype(ghost)) + return + if(href_list["join"]) + join(ghost) + +/datum/deathmatch_lobby/ui_state(mob/user) + return GLOB.observer_state + +/datum/deathmatch_lobby/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, null) + if(!ui) + ui = new(user, src, "DeathmatchLobby") + ui.open() + +/datum/deathmatch_lobby/ui_static_data(mob/user) + . = list() + .["maps"] = list() + for (var/map_key in GLOB.deathmatch_game.maps) + .["maps"] += map_key + +/datum/deathmatch_lobby/ui_data(mob/user) + . = list() + .["self"] = user.ckey + .["host"] = (user.ckey == host) + .["admin"] = check_rights_for(user.client, R_ADMIN) + .["global_chat"] = global_chat + .["playing"] = playing + .["loadouts"] = list() + for (var/datum/outfit/deathmatch_loadout/loadout as anything in loadouts) + .["loadouts"] += initial(loadout.display_name) + .["map"] = list() + .["map"]["name"] = map.name + .["map"]["desc"] = map.desc + .["map"]["time"] = map.automatic_gameend_time + .["map"]["min_players"] = map.min_players + .["map"]["max_players"] = map.max_players + if(!isnull(players[user.ckey]) && !isnull(players[user.ckey]["loadout"])) + var/datum/outfit/deathmatch_loadout/loadout = players[user.ckey]["loadout"] + .["loadoutdesc"] = initial(loadout.desc) + else + .["loadoutdesc"] = "You are an observer! As an observer, you can hear lobby announcements." + .["players"] = list() + for (var/player_key in players) + var/list/player_info = players[player_key] + var/mob/player_mob = player_info["mob"] + if (isnull(player_mob) || !player_mob.client) + leave(player_key) + continue + .["players"][player_key] = player_info.Copy() + var/datum/outfit/deathmatch_loadout/dm_loadout = player_info["loadout"] + .["players"][player_key]["loadout"] = initial(dm_loadout.display_name) + .["observers"] = list() + for (var/observer_key in observers) + var/mob/observer = observers[observer_key]["mob"] + if (isnull(observer) || !observer.client) + leave(observer_key) + continue + .["observers"][observer_key] = observers[observer_key] + +/datum/deathmatch_lobby/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(. || !isobserver(usr)) + return + switch(action) + if ("start_game") + if (usr.ckey != host) + return FALSE + if (map.min_players > players.len) + to_chat(usr, span_warning("Not enough players to start yet.")) + return FALSE + start_game() + return TRUE + if ("leave_game") + if (playing) + return FALSE + leave(usr.ckey) + ui.close() + GLOB.deathmatch_game.ui_interact(usr) + return TRUE + if ("change_loadout") + if (playing) + return FALSE + if (params["player"] != usr.ckey && host != usr.ckey) + return FALSE + for (var/datum/outfit/deathmatch_loadout/possible_loadout as anything in loadouts) + if (params["loadout"] != initial(possible_loadout.display_name)) + continue + players[params["player"]]["loadout"] = possible_loadout + break + return TRUE + if ("observe") + if (playing) + return FALSE + if (players[usr.ckey]) + remove_ckey_from_play(usr.ckey) + add_observer(usr, host == usr.ckey) + return TRUE + else if (observers[usr.ckey] && players.len < map.max_players) + remove_ckey_from_play(usr.ckey) + add_player(usr, loadouts[1], host == usr.ckey) + return TRUE + if ("ready") + players[usr.ckey]["ready"] ^= 1 // Toggle. + ready_count += (players[usr.ckey]["ready"] * 2) - 1 // scared? + if (ready_count >= players.len && players.len >= map.min_players) + start_game() + return TRUE + if ("host") // Host functions + if (playing || (usr.ckey != host && !check_rights(R_ADMIN))) + return FALSE + var/uckey = params["id"] + switch (params["func"]) + if ("Kick") + leave(uckey) + var/umob = get_mob_by_ckey(uckey) + var/datum/tgui/uui = SStgui.get_open_ui(umob, src) + uui?.close() + GLOB.deathmatch_game.ui_interact(umob) + return TRUE + if ("Transfer host") + if (host == uckey) + return FALSE + GLOB.deathmatch_game.passoff_lobby(host, uckey) + host = uckey + return TRUE + if ("Toggle observe") + var/umob = get_mob_by_ckey(uckey) + if (players[uckey]) + remove_ckey_from_play(uckey) + add_observer(umob, host == uckey) + else if (observers[uckey] && players.len < map.max_players) + remove_ckey_from_play(uckey) + add_player(umob, loadouts[1], host == uckey) + return TRUE + if ("change_map") + if (!(params["map"] in GLOB.deathmatch_game.maps)) + return FALSE + change_map(params["map"]) + return TRUE + if ("global_chat") + global_chat = !global_chat + return TRUE + if ("admin") // Admin functions + if (!check_rights(R_ADMIN)) + message_admins("[usr.key] has attempted to use admin functions in a deathmatch lobby!") + log_admin("[key_name(usr)] tried to use the deathmatch lobby admin functions without authorization.") + return + switch (params["func"]) + if ("Force start") + log_admin("[key_name(usr)] force started deathmatch lobby [host].") + start_game() + + diff --git a/code/modules/deathmatch/deathmatch_mapping.dm b/code/modules/deathmatch/deathmatch_mapping.dm new file mode 100644 index 00000000000..62eca161583 --- /dev/null +++ b/code/modules/deathmatch/deathmatch_mapping.dm @@ -0,0 +1,12 @@ +/area/deathmatch + name = "Deathmatch Arena" + requires_power = FALSE + has_gravity = STANDARD_GRAVITY + area_flags = UNIQUE_AREA | UNIQUE_AREA + +/area/deathmatch/fullbright + static_lighting = FALSE + base_lighting_alpha = 255 + +/obj/effect/landmark/deathmatch_player_spawn + name = "Deathmatch Player Spawner" diff --git a/code/modules/deathmatch/deathmatch_maps.dm b/code/modules/deathmatch/deathmatch_maps.dm new file mode 100644 index 00000000000..60594d903bb --- /dev/null +++ b/code/modules/deathmatch/deathmatch_maps.dm @@ -0,0 +1,148 @@ +/datum/lazy_template/deathmatch //deathmatch maps that have any possibility of the walls being destroyed should use indestructible walls, because baseturf moment + var/name + map_dir = "_maps/map_files/Deathmatch" + /// Map Description + var/desc = "" + var/min_players = 2 + var/max_players = 2 // TODO: make this automatic. + /// The map will end in this time + var/automatic_gameend_time = 8 MINUTES + /// List of allowed loadouts for this map, otherwise defaults to all loadouts + var/list/allowed_loadouts = list() + +/datum/lazy_template/deathmatch/ragecage + name = "Ragecage" + desc = "Fun for the whole family, the classic ragecage." + max_players = 4 + automatic_gameend_time = 4 MINUTES // its a 10x10 cage what are you guys doing in there + allowed_loadouts = list(/datum/outfit/deathmatch_loadout/assistant) + map_name = "ragecage" + key = "ragecage" + +/datum/lazy_template/deathmatch/maintenance + name = "Maint Mania" + desc = "Dark maintenance tunnels, floor pills, improvised weaponry and a bloody beatdown. Welcome to assistant utopia." + max_players = 8 + allowed_loadouts = list(/datum/outfit/deathmatch_loadout/assistant) + map_name = "Maint_Mania" + key = "Maint_Mania" + +/datum/lazy_template/deathmatch/osha_violator + name = "OSHA Violator" + desc = "What would Engineering be without an overly complicated engine, with conveyor belts, emitters and shield generators sprinkled about? That's right, not Engineering." + max_players = 10 + allowed_loadouts = list(/datum/outfit/deathmatch_loadout/assistant) + map_name = "OSHA_Violator" + key = "OSHA_Violator" + +/datum/lazy_template/deathmatch/the_brig + name = "The Brig" + desc = "A recreation of MetaStation Brig." + max_players = 12 + allowed_loadouts = list(/datum/outfit/deathmatch_loadout/assistant) + map_name = "The_Brig" + key = "The_Brig" + +/datum/lazy_template/deathmatch/shooting_range + name = "Shooting Range" + desc = "A simple room with a bunch of wooden barricades." + max_players = 6 + allowed_loadouts = list( + /datum/outfit/deathmatch_loadout/operative/ranged, + /datum/outfit/deathmatch_loadout/operative/melee, + ) + map_name = "shooting_range" + key = "shooting_range" + +/datum/lazy_template/deathmatch/securing + name = "SecuRing" + desc = "Presenting the Security Ring, ever wanted to shoot people with disablers? Well now you can." + max_players = 4 + allowed_loadouts = list(/datum/outfit/deathmatch_loadout/securing_sec) + map_name = "SecuRing" + key = "SecuRing" + +/datum/lazy_template/deathmatch/instagib + name = "Instagib" + desc = "EVERYONE GETS AN INSTAKILL RIFLE!" + max_players = 8 + allowed_loadouts = list(/datum/outfit/deathmatch_loadout/assistant/instagib) + map_name = "instagib" + key = "instagib" + +/datum/lazy_template/deathmatch/mech_madness + name = "Mech Madness" + desc = "Do you hate mechs? Yeah? Dont care! Go fight eachother!" + max_players = 4 + allowed_loadouts = list(/datum/outfit/deathmatch_loadout/operative) + map_name = "mech_madness" + key = "mech_madness" + +/datum/lazy_template/deathmatch/sniperelite + name = "Sniper Elite" + desc = "Sound of gunfire and screaming people make my day" + max_players = 8 + allowed_loadouts = list(/datum/outfit/deathmatch_loadout/operative/sniper) + map_name = "Sniper_elite" + key = "Sniper_elite" + +/datum/lazy_template/deathmatch/meatower + name = "Meat Tower" + desc = "There can only be one chef in this kitchen" + max_players = 8 + allowed_loadouts = list(/datum/outfit/deathmatch_loadout/chef) + map_name = "meatower" + key = "meatower" + +/datum/lazy_template/deathmatch/sunrise + name = "Sunrise" + desc = "DEHUMANIZE YOURSELF AND FACE TO BLOODSHED DEHUMANIZE YOURSELF AND FACE TO BLOODSHED DEHUMANIZE YOURSELF AND FACE TO BLOODSHED DEHUMANIZE YOURSELF AND FACE TO BLOODSHED" + max_players = 8 + allowed_loadouts = list(/datum/outfit/deathmatch_loadout/samurai) + map_name = "chinatown" + key = "chinatown" + +/datum/lazy_template/deathmatch/starwars + name = "Arena Station" + desc = "Choose your battler!" + max_players = 10 + allowed_loadouts = list( + /datum/outfit/deathmatch_loadout/battler/bloodminer, + /datum/outfit/deathmatch_loadout/battler/clown, + /datum/outfit/deathmatch_loadout/battler/cowboy, + /datum/outfit/deathmatch_loadout/battler/druid, + /datum/outfit/deathmatch_loadout/battler/enginer, + /datum/outfit/deathmatch_loadout/battler/janitor, + /datum/outfit/deathmatch_loadout/battler/northstar, + /datum/outfit/deathmatch_loadout/battler/raider, + /datum/outfit/deathmatch_loadout/battler/ripper, + /datum/outfit/deathmatch_loadout/battler/scientist, + /datum/outfit/deathmatch_loadout/battler/soldier, + /datum/outfit/deathmatch_loadout/battler/surgeon, + /datum/outfit/deathmatch_loadout/battler/tgcoder, + /datum/outfit/deathmatch_loadout/naked, + ) + map_name = "starwars" + key = "starwars" + +/datum/lazy_template/deathmatch/arenaplatform + name = "Underground Thunderdome" + desc = "An illegal underground thunderdome, for larger amounts of murder." + max_players = 15 + allowed_loadouts = list( + /datum/outfit/deathmatch_loadout/operative, + /datum/outfit/deathmatch_loadout/naked, + ) + map_name = "arena" + key = "arena" + +/datum/lazy_template/deathmatch/raidthebase + name = "Backalley" + desc = "You are not built for these streets." + max_players = 8 + allowed_loadouts = list( + /datum/outfit/deathmatch_loadout/assistant, + /datum/outfit/deathmatch_loadout/naked, + ) + map_name = "raidthebase" + key = "raidthebase" diff --git a/code/modules/economy/account.dm b/code/modules/economy/account.dm index 6bcad3f247c..77452c11d2b 100644 --- a/code/modules/economy/account.dm +++ b/code/modules/economy/account.dm @@ -49,6 +49,7 @@ /datum/bank_account/Destroy() if(add_to_accounts) SSeconomy.bank_accounts_by_id -= "[account_id]" + SSeconomy.bank_accounts_by_job[account_job] -= src QDEL_LIST(redeemed_coupons) return ..() @@ -70,6 +71,8 @@ if(SSeconomy.bank_accounts_by_id["[account_id]"]) stack_trace("Unable to find a unique account ID, substituting currently existing account of id [account_id].") SSeconomy.bank_accounts_by_id["[account_id]"] = src + if(account_job) + LAZYADD(SSeconomy.bank_accounts_by_job[account_job], src) /datum/bank_account/vv_edit_var(var_name, var_value) // just so you don't have to do it manually var/old_id = account_id diff --git a/code/modules/events/brain_trauma.dm b/code/modules/events/brain_trauma.dm index 5d6a5a7d520..b9d1c4188b5 100644 --- a/code/modules/events/brain_trauma.dm +++ b/code/modules/events/brain_trauma.dm @@ -22,7 +22,7 @@ if(!(H.mind.assigned_role.job_flags & JOB_CREW_MEMBER)) //please stop giving my centcom admin gimmicks full body paralysis continue // NOVA EDIT ADD START - Station/area event candidate filtering - if(engaged_role_play_check(H, station = TRUE, dorms = TRUE)) + if(!engaged_role_play_check(H, station = TRUE, dorms = TRUE)) continue // NOVA EDIT ADD END traumatize(H) diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm index c5e5ac399df..36290343050 100644 --- a/code/modules/events/disease_outbreak.dm +++ b/code/modules/events/disease_outbreak.dm @@ -64,7 +64,7 @@ if(!is_station_level(candidate.z) && !is_mining_level(candidate.z)) //Diseases can't really spread if the vector is in deep space. continue // NOVA EDIT ADDITION START - Station/area event candidate filtering. - if(engaged_role_play_check(candidate, station = TRUE, dorms = TRUE)) + if(!engaged_role_play_check(candidate, station = TRUE, dorms = TRUE)) continue // NOVA EDIT ADDITION END disease_candidates += candidate diff --git a/code/modules/events/fake_virus.dm b/code/modules/events/fake_virus.dm index e23ff73c07f..adea3a7edbd 100644 --- a/code/modules/events/fake_virus.dm +++ b/code/modules/events/fake_virus.dm @@ -13,7 +13,7 @@ if(!(victim.mind?.assigned_role.job_flags & JOB_CREW_MEMBER)) continue // NOVA EDIT ADD START - Station/area event candidate filtering - if(engaged_role_play_check(fake_virus_victims, station = TRUE, dorms = TRUE)) + if(!engaged_role_play_check(fake_virus_victims, station = TRUE, dorms = TRUE)) continue // NOVA EDIT ADD END fake_virus_victims += victim diff --git a/code/modules/events/heart_attack.dm b/code/modules/events/heart_attack.dm index 9d9e4c76cd9..83c4f606aa6 100644 --- a/code/modules/events/heart_attack.dm +++ b/code/modules/events/heart_attack.dm @@ -35,7 +35,7 @@ if(!(candidate.mind.assigned_role.job_flags & JOB_CREW_MEMBER))//only crewmembers can get one, a bit unfair for some ghost roles and it wastes the event continue // NOVA EDIT ADD START - Station/area event candidate filtering - if(engaged_role_play_check(candidate, station = TRUE, dorms = TRUE)) + if(!engaged_role_play_check(candidate, station = TRUE, dorms = TRUE)) continue // NOVA EDIT ADD END if(candidate.satiety <= -60 && !candidate.has_status_effect(/datum/status_effect/exercised)) //Multiple junk food items recently //No foodmaxxing for the achievement diff --git a/code/modules/events/holiday/vday.dm b/code/modules/events/holiday/vday.dm index 706b3d7767a..7eb89e84bc0 100644 --- a/code/modules/events/holiday/vday.dm +++ b/code/modules/events/holiday/vday.dm @@ -13,86 +13,126 @@ max_occurrences = 1 earliest_start = 0 MINUTES category = EVENT_CATEGORY_HOLIDAY - description = "Puts people on dates! They must protect each other. Sometimes a vengeful third wheel spawns." - -/datum/round_event/valentines/start() - ..() - for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) - H.put_in_hands(new /obj/item/valentine) - var/obj/item/storage/backpack/b = locate() in H.contents - new /obj/item/food/candyheart(b) - new /obj/item/storage/fancy/heart_box(b) - - var/list/valentines = list() - for(var/mob/living/M in GLOB.player_list) - var/turf/current_turf = get_turf(M.mind.current) - if(!M.stat && M.mind && !current_turf.onCentCom()) - valentines |= M - - - while(valentines.len) - var/mob/living/L = pick_n_take(valentines) - if(valentines.len) - var/mob/living/date = pick_n_take(valentines) - - - forge_valentines_objective(L, date) - forge_valentines_objective(date, L) + description = "Puts people on dates! They must protect each other. \ + Some dates will have third wheels, and any odd ones out will be given the role of 'heartbreaker'." + /// If TRUE, any odd candidate out will be given the role of "heartbreaker" and will be tasked with ruining the dates. + var/heartbreaker = TRUE + /// Probability that any given pair will be given a third wheel candidate + var/third_wheel_chance = 4 + /// Items to give to all valentines + var/list/items_to_give_out = list( + /obj/item/paper/valentine, + /obj/item/storage/fancy/heart_box, + /obj/item/food/candyheart, + ) + +/datum/round_event/valentines/proc/is_valid_valentine(mob/living/guy) + if(guy.stat == DEAD) + return FALSE + if(isnull(guy.mind)) + return FALSE + if(guy.onCentCom()) + return FALSE + return TRUE + +/datum/round_event/valentines/proc/give_valentines_things(mob/living/guy) + var/datum/round_event_control/valentines/controller = control + if(!istype(controller)) + return + + var/obj/item/storage/backpack/bag = locate() in guy.contents + if(isnull(bag)) + return + + var/atom/drop_loc = guy.drop_location() + for(var/thing_type in controller.items_to_give_out) + var/obj/item/thing = new thing_type(drop_loc) + if(!bag.atom_storage.attempt_insert(thing, override = TRUE, force = STORAGE_SOFT_LOCKED)) + guy.put_in_hands(thing) + +/datum/round_event/valentines/proc/forge_valentines_objective(mob/living/lover, mob/living/date) + var/datum/antagonist/valentine/valentine = new() + valentine.date = date.mind + lover.mind.special_role = "valentine" + lover.mind.add_antag_datum(valentine) //These really should be teams but i can't be assed to incorporate third wheels right now - if(valentines.len && prob(4)) - var/mob/living/notgoodenough = pick_n_take(valentines) - forge_valentines_objective(notgoodenough, date) - else - L.mind.add_antag_datum(/datum/antagonist/heartbreaker) +/datum/round_event/valentines/proc/forge_third_wheel(mob/living/sad_one, mob/living/date_one, mob/living/date_two) + var/datum/antagonist/valentine/third_wheel/third_wheel = new() + third_wheel.date = pick(date_one.mind, date_two.mind) + sad_one.mind.special_role = "valentine" + sad_one.mind.add_antag_datum(third_wheel) -/proc/forge_valentines_objective(mob/living/lover,mob/living/date) - lover.mind.special_role = "valentine" - var/datum/antagonist/valentine/V = new - V.date = date.mind - lover.mind.add_antag_datum(V) //These really should be teams but i can't be assed to incorporate third wheels right now +/datum/round_event/valentines/start() + var/datum/round_event_control/valentines/controller = control + if(!istype(controller)) + return + + var/list/candidates = list() + for(var/mob/living/player in GLOB.player_list) + if(!is_valid_valentine(player)) + continue + candidates += player + + var/list/mob/living/candidates_pruned = SSpolling.poll_candidates( + question = "Do you want a Valentine?", + group = candidates, + poll_time = 30 SECONDS, + flash_window = FALSE, + start_signed_up = TRUE, + pic_source = /obj/item/storage/fancy/heart_box, + custom_response_messages = list( + POLL_RESPONSE_SIGNUP = "You have signed up for a date!", + POLL_RESPONSE_ALREADY_SIGNED = "You are already signed up for a date.", + POLL_RESPONSE_NOT_SIGNED = "You aren't signed up for a date.", + POLL_RESPONSE_TOO_LATE_TO_UNREGISTER = "It's too late to decide against going on a date.", + POLL_RESPONSE_UNREGISTERED = "You deicde against going on a date.", + ), + ) + + for(var/mob/living/second_check as anything in candidates_pruned) + if(is_valid_valentine(second_check)) + continue + candidates_pruned -= second_check + + if(length(candidates_pruned) == 0) + return + if(length(candidates_pruned) == 1) + to_chat(candidates_pruned[1], span_warning("You are the only one who wanted a Valentine...")) + return + + while(length(candidates_pruned) >= 2) + var/mob/living/date_one = pick_n_take(candidates_pruned) + var/mob/living/date_two = pick_n_take(candidates_pruned) + give_valentines_things(date_one) + give_valentines_things(date_two) + forge_valentines_objective(date_one, date_two) + forge_valentines_objective(date_two, date_one) + + if((length(candidates_pruned) == 1 && !controller.heartbreaker) || (length(candidates_pruned) && prob(controller.third_wheel_chance))) + var/mob/living/third_wheel = pick_n_take(candidates_pruned) + give_valentines_things(third_wheel) + forge_third_wheel(third_wheel, date_one, date_two) + // Third wheel starts with a bouquet because that's funny + var/third_wheel_bouquet = pick(typesof(/obj/item/bouquet)) + var/obj/item/bouquet = new third_wheel_bouquet(third_wheel.loc) + third_wheel.put_in_hands(bouquet) + + if(controller.heartbreaker && length(candidates_pruned) == 1) + candidates_pruned[1].mind.add_antag_datum(/datum/antagonist/heartbreaker) /datum/round_event/valentines/announce(fake) priority_announce("It's Valentine's Day! Give a valentine to that special someone!") -/obj/item/valentine +/obj/item/paper/valentine name = "valentine" desc = "A Valentine's card! Wonder what it says..." icon = 'icons/obj/toys/playing_cards.dmi' icon_state = "sc_Ace of Hearts_syndicate" // shut up // bye felicia - var/message = "A generic message of love or whatever." - resistance_flags = FLAMMABLE - w_class = WEIGHT_CLASS_TINY + show_written_words = FALSE -/obj/item/valentine/Initialize(mapload) - . = ..() - message = pick(strings(VALENTINE_FILE, "valentines")) - -/obj/item/valentine/attackby(obj/item/W, mob/user, params) - ..() - if(istype(W, /obj/item/pen) || istype(W, /obj/item/toy/crayon)) - if(!user.can_write(W)) - return - var/recipient = tgui_input_text(user, "Who is receiving this valentine?", "To:", max_length = MAX_NAME_LEN) - var/sender = tgui_input_text(user, "Who is sending this valentine?", "From:", max_length = MAX_NAME_LEN) - if(!user.can_perform_action(src)) - return - if(recipient && sender) - name = "valentine - To: [recipient] From: [sender]" - -/obj/item/valentine/examine(mob/user) - . = ..() - if(in_range(user, src) || isobserver(user)) - if( !(ishuman(user) || isobserver(user) || issilicon(user)) ) - user << browse("[name][stars(message)]", "window=[name]") - onclose(user, "[name]") - else - user << browse("[name][message]", "window=[name]") - onclose(user, "[name]") - else - . += span_notice("It is too far away.") - -/obj/item/valentine/attack_self(mob/user) - user.examinate(src) +/obj/item/paper/valentine/Initialize(mapload) + default_raw_text = pick_list(VALENTINE_FILE, "valentines") || "A generic message of love or whatever." + return ..() /obj/item/food/candyheart name = "candy heart" diff --git a/code/modules/fishing/fishing_equipment.dm b/code/modules/fishing/fishing_equipment.dm index b1e5ddc4c18..4b30951d89a 100644 --- a/code/modules/fishing/fishing_equipment.dm +++ b/code/modules/fishing/fishing_equipment.dm @@ -41,12 +41,68 @@ /obj/item/fishing_line/sinew name = "fishing sinew" desc = "An all-natural fishing line made of stretched out sinew. A bit stiff, but usable to fish in extreme enviroments." - icon = 'icons/obj/fishing.dmi' icon_state = "reel_sinew" - icon_state = "reel_green" fishing_line_traits = FISHING_LINE_REINFORCED|FISHING_LINE_STIFF line_color = "#d1cca3" +/** + * A special line reel that let you skip the biting phase of the minigame, netting you a completion bonus, + * and thrown hooked items at you, so you can rapidly catch them from afar. + * It may also work on mobs if the right hook is attached. + */ +/obj/item/fishing_line/auto_reel + name = "fishing line auto-reel" + desc = "A fishing line that automatically starts reeling in fish the moment they bite. Also good for hurling things at yourself." + icon_state = "reel_auto" + fishing_line_traits = FISHING_LINE_AUTOREEL + line_color = "#F88414" + +/obj/item/fishing_line/auto_reel/Initialize(mapload) + . = ..() + RegisterSignal(src, COMSIG_FISHING_EQUIPMENT_SLOTTED, PROC_REF(line_equipped)) + +/obj/item/fishing_line/auto_reel/proc/line_equipped(datum/source, obj/item/fishing_rod/rod) + SIGNAL_HANDLER + RegisterSignal(rod, COMSIG_FISHING_ROD_HOOKED_ITEM, PROC_REF(on_hooked_item)) + RegisterSignal(src, COMSIG_MOVABLE_MOVED, PROC_REF(on_removed)) + +/obj/item/fishing_line/auto_reel/proc/on_removed(atom/movable/source, atom/old_loc, dir, forced) + SIGNAL_HANDLER + UnregisterSignal(src, COMSIG_MOVABLE_MOVED) + UnregisterSignal(old_loc, COMSIG_FISHING_ROD_HOOKED_ITEM) + +/obj/item/fishing_line/auto_reel/proc/on_hooked_item(obj/item/fishing_rod/source, atom/target, mob/living/user) + SIGNAL_HANDLER + if(!ismovable(target)) + return + var/atom/movable/movable_target = target + var/please_be_gentle = FALSE + var/atom/destination + var/datum/callback/throw_callback + if(isliving(movable_target) || !isitem(movable_target)) + destination = get_step_towards(user, target) + please_be_gentle = TRUE + else + destination = user + throw_callback = CALLBACK(src, PROC_REF(clear_hitby_signal), movable_target) + RegisterSignal(movable_target, COMSIG_ATOM_PREHITBY, PROC_REF(catch_it_chucklenut)) + + if(!movable_target.safe_throw_at(destination, source.cast_range, 2, callback = throw_callback, gentle = please_be_gentle)) + UnregisterSignal(movable_target, COMSIG_ATOM_PREHITBY) + else + playsound(src, 'sound/weapons/batonextend.ogg', 50, TRUE) + +/obj/item/fishing_line/auto_reel/proc/catch_it_chucklenut(obj/item/source, atom/hit_atom, datum/thrownthing/throwingdatum) + SIGNAL_HANDLER + var/mob/living/user = throwingdatum.initial_target.resolve() + if(QDELETED(user) || hit_atom != user) + return + if(user.try_catch_item(source, skip_throw_mode_check = TRUE, try_offhand = TRUE)) + return COMSIG_HIT_PREVENTED + +/obj/item/fishing_line/auto_reel/proc/clear_hitby_signal(obj/item/item) + UnregisterSignal(item, COMSIG_ATOM_PREHITBY) + // Hooks /obj/item/fishing_hook diff --git a/code/modules/fishing/fishing_minigame.dm b/code/modules/fishing/fishing_minigame.dm index a5e1dd142b1..e2108848b0b 100644 --- a/code/modules/fishing/fishing_minigame.dm +++ b/code/modules/fishing/fishing_minigame.dm @@ -18,9 +18,15 @@ // Acceleration mod when bait is over fish #define FISH_ON_BAIT_ACCELERATION_MULT 0.6 /// The minimum velocity required for the bait to bounce -#define BAIT_MIN_VELOCITY_BOUNCE 200 +#define BAIT_MIN_VELOCITY_BOUNCE 150 /// The extra deceleration of velocity that happens when the bait switches direction -#define BAIT_DECELERATION_MULT 2 +#define BAIT_DECELERATION_MULT 1.5 + +/// Reduce initial completion rate depending on difficulty +#define MAX_FISH_COMPLETION_MALUS 15 +/// The window of time between biting phase and back to baiting phase +#define BITING_TIME_WINDOW 4 SECONDS + ///Defines to know how the bait is moving on the minigame slider. #define REELING_STATE_IDLE 0 @@ -162,6 +168,8 @@ if(rod.line.fishing_line_traits & FISHING_LINE_STIFF) completion_loss += 1 completion_gain -= 1 + if(rod.line.fishing_line_traits & FISHING_LINE_AUTOREEL) + special_effects |= FISHING_MINIGAME_AUTOREEL if(rod.hook) if(rod.hook.fishing_hook_traits & FISHING_HOOK_WEIGHTED) bait_bounce_mult = 0.1 @@ -180,6 +188,9 @@ difficulty += comp.fish_source.calculate_difficulty(reward_path, rod, user, src) difficulty = clamp(round(difficulty), 1, 100) + if(difficulty > FISHING_EASY_DIFFICULTY) + completion -= round(MAX_FISH_COMPLETION_MALUS * (difficulty/100), 1) + if(HAS_TRAIT(user, TRAIT_REVEAL_FISH) || (user.mind && HAS_TRAIT(user.mind, TRAIT_REVEAL_FISH))) fish_icon = GLOB.specific_fish_icons[reward_path] || "fish" @@ -259,7 +270,7 @@ return if(phase == WAIT_PHASE) //Reset wait send_alert("miss!") - start_baiting_phase() + start_baiting_phase(TRUE) else if(phase == BITING_PHASE) start_minigame_phase() return COMSIG_MOB_CANCEL_CLICKON @@ -302,14 +313,19 @@ if(!QDELETED(src)) qdel(src) -/datum/fishing_challenge/proc/start_baiting_phase() +/datum/fishing_challenge/proc/start_baiting_phase(penalty = FALSE) + var/wait_time + if(penalty) + wait_time = min(timeleft(next_phase_timer) + rand(3 SECONDS, 5 SECONDS), 30 SECONDS) + else + wait_time = rand(1 SECONDS, 30 SECONDS) + if(special_effects & FISHING_MINIGAME_AUTOREEL && wait_time >= 15 SECONDS) + wait_time = max(wait_time - 7.5 SECONDS, 15 SECONDS) deltimer(next_phase_timer) phase = WAIT_PHASE //Bobbing animation animate(lure, pixel_y = 1, time = 1 SECONDS, loop = -1, flags = ANIMATION_RELATIVE) animate(pixel_y = -1, time = 1 SECONDS, flags = ANIMATION_RELATIVE) - //Setup next phase - var/wait_time = rand(1 SECONDS, 30 SECONDS) next_phase_timer = addtimer(CALLBACK(src, PROC_REF(start_biting_phase)), wait_time, TIMER_STOPPABLE) /datum/fishing_challenge/proc/start_biting_phase() @@ -342,9 +358,11 @@ send_alert("!!!") animate(lure, pixel_y = 3, time = 5, loop = -1, flags = ANIMATION_RELATIVE) animate(pixel_y = -3, time = 5, flags = ANIMATION_RELATIVE) + if(special_effects & FISHING_MINIGAME_AUTOREEL) + start_minigame_phase(auto_reel = TRUE) + return // Setup next phase - var/wait_time = rand(3 SECONDS, 6 SECONDS) - next_phase_timer = addtimer(CALLBACK(src, PROC_REF(start_baiting_phase)), wait_time, TIMER_STOPPABLE) + next_phase_timer = addtimer(CALLBACK(src, PROC_REF(start_baiting_phase)), BITING_TIME_WINDOW, TIMER_STOPPABLE) ///The damage dealt per second to the fish when FISHING_MINIGAME_RULE_KILL is active. #define FISH_DAMAGE_PER_SECOND 2 @@ -366,7 +384,21 @@ var/damage = CEILING((world.time - start_time)/10 * FISH_DAMAGE_PER_SECOND, 1) reward.adjust_health(reward.health - damage) -/datum/fishing_challenge/proc/start_minigame_phase() +/datum/fishing_challenge/proc/start_minigame_phase(auto_reel = FALSE) + if(auto_reel) + completion *= 1.3 + else + var/time_left = timeleft(next_phase_timer) + switch(time_left) + if(0 to BITING_TIME_WINDOW - 3 SECONDS) + completion *= 0.65 + if(BITING_TIME_WINDOW - 3 SECONDS to BITING_TIME_WINDOW - 2 SECONDS) + completion *= 0.82 + if(BITING_TIME_WINDOW - 1 SECONDS to BITING_TIME_WINDOW - 0.5 SECONDS) + completion *= 1.2 + if(BITING_TIME_WINDOW - 0.5 SECONDS to BITING_TIME_WINDOW) + completion *= 1.4 + completion = round(completion, 1) if(!prepare_minigame_hud()) return phase = MINIGAME_PHASE @@ -691,3 +723,5 @@ #undef REELING_STATE_UP #undef REELING_STATE_DOWN +#undef MAX_FISH_COMPLETION_MALUS +#undef BITING_TIME_WINDOW diff --git a/code/modules/fishing/fishing_rod.dm b/code/modules/fishing/fishing_rod.dm index 8a3035a9cc9..0578ffb0789 100644 --- a/code/modules/fishing/fishing_rod.dm +++ b/code/modules/fishing/fishing_rod.dm @@ -39,6 +39,9 @@ ///The name of the icon state of the reel overlay var/reel_overlay = "reel_overlay" + ///Prevents spamming the line casting, without affecting the player's click cooldown. + COOLDOWN_DECLARE(casting_cd) + /obj/item/fishing_rod/Initialize(mapload) . = ..() register_context() @@ -220,6 +223,8 @@ if(!CheckToolReach(user, target, cast_range)) balloon_alert(user, "cannot reach there!") return + if(!COOLDOWN_FINISHED(src, casting_cd)) + return /// Annoyingly pre attack is only called in melee SEND_SIGNAL(target, COMSIG_PRE_FISHING) casting = TRUE @@ -232,6 +237,7 @@ cast_projectile.impacted = list(user = TRUE) cast_projectile.preparePixelProjectile(target, user) cast_projectile.fire() + COOLDOWN_START(src, casting_cd, 1 SECONDS) /// Called by hook projectile when hitting things /obj/item/fishing_rod/proc/hook_hit(atom/atom_hit_by_hook_projectile) @@ -361,9 +367,7 @@ if("slot_action") // Simple click with empty hand to remove, click with item to insert/switch var/obj/item/held_item = user.get_active_held_item() - if(held_item == src) - return - use_slot(params["slot"], user, held_item) + use_slot(params["slot"], user, held_item == src ? null : held_item) return TRUE /// Ideally this will be replaced with generic slotted storage datum + display @@ -404,6 +408,9 @@ user.put_in_hands(current_item) balloon_alert(user, "[slot] swapped") + if(new_item) + SEND_SIGNAL(new_item, COMSIG_FISHING_EQUIPMENT_SLOTTED, src) + update_icon() playsound(src, 'sound/items/click.ogg', 50, TRUE) diff --git a/code/modules/fishing/sources/source_types.dm b/code/modules/fishing/sources/source_types.dm index edab6dc0db5..5cdc2d2b841 100644 --- a/code/modules/fishing/sources/source_types.dm +++ b/code/modules/fishing/sources/source_types.dm @@ -262,7 +262,7 @@ fish_counts = list( /obj/item/storage/wallet/money = 2, ) - fishing_difficulty = FISHING_DEFAULT_DIFFICULTY - 5 //For beginners + fishing_difficulty = FISHING_EASY_DIFFICULTY //For beginners /datum/fish_source/holographic catalog_description = "Holographic water" @@ -275,7 +275,7 @@ /obj/item/fish/holo/checkered = 5, /obj/item/fish/holo/halffish = 5, ) - fishing_difficulty = FISHING_DEFAULT_DIFFICULTY - 5 + fishing_difficulty = FISHING_EASY_DIFFICULTY /datum/fish_source/holographic/reason_we_cant_fish(obj/item/fishing_rod/rod, mob/fisherman, atom/parent) . = ..() @@ -332,7 +332,7 @@ /mob/living/basic/frog = 1, /mob/living/basic/axolotl = 1, ) - fishing_difficulty = FISHING_DEFAULT_DIFFICULTY - 10 + fishing_difficulty = FISHING_EASY_DIFFICULTY - 5 /datum/fish_source/hydro_tray/reason_we_cant_fish(obj/item/fishing_rod/rod, mob/fisherman, atom/parent) if(!istype(parent, /obj/machinery/hydroponics/constructable)) diff --git a/code/modules/food_and_drinks/machinery/coffeemaker.dm b/code/modules/food_and_drinks/machinery/coffeemaker.dm index 36ef9a76384..8490b2b5cfb 100644 --- a/code/modules/food_and_drinks/machinery/coffeemaker.dm +++ b/code/modules/food_and_drinks/machinery/coffeemaker.dm @@ -45,10 +45,9 @@ coffeepot = new /obj/item/reagent_containers/cup/coffeepot(src) cartridge = new /obj/item/coffee_cartridge(src) -/obj/machinery/coffeemaker/deconstruct() +/obj/machinery/coffeemaker/on_deconstruction(disassembled) coffeepot?.forceMove(drop_location()) cartridge?.forceMove(drop_location()) - return ..() /obj/machinery/coffeemaker/Destroy() QDEL_NULL(coffeepot) diff --git a/code/modules/food_and_drinks/machinery/deep_fryer.dm b/code/modules/food_and_drinks/machinery/deep_fryer.dm index 15f39d3ac28..c9b9fca044b 100644 --- a/code/modules/food_and_drinks/machinery/deep_fryer.dm +++ b/code/modules/food_and_drinks/machinery/deep_fryer.dm @@ -61,11 +61,10 @@ GLOBAL_LIST_INIT(oilfry_blacklisted_items, typecacheof(list( QDEL_NULL(frying) return ..() -/obj/machinery/deepfryer/deconstruct(disassembled) +/obj/machinery/deepfryer/on_deconstruction(disassembled) // This handles nulling out frying via exited if(frying) frying.forceMove(drop_location()) - return ..() /obj/machinery/deepfryer/RefreshParts() . = ..() diff --git a/code/modules/food_and_drinks/machinery/gibber.dm b/code/modules/food_and_drinks/machinery/gibber.dm index 43493c3c969..315a34f2286 100644 --- a/code/modules/food_and_drinks/machinery/gibber.dm +++ b/code/modules/food_and_drinks/machinery/gibber.dm @@ -173,7 +173,9 @@ if(ishuman(occupant)) var/mob/living/carbon/human/gibee = occupant - if(gibee.dna && gibee.dna.species) + if(prob(40) && (sourcejob in list(JOB_SECURITY_OFFICER,JOB_WARDEN,JOB_HEAD_OF_SECURITY))) + typeofmeat = /obj/item/food/meat/slab/pig + else if(gibee.dna && gibee.dna.species) typeofmeat = gibee.dna.species.meat typeofskin = gibee.dna.species.skinned_type diff --git a/code/modules/food_and_drinks/machinery/grill.dm b/code/modules/food_and_drinks/machinery/grill.dm index 9ca42de4ee6..e812a1c890e 100644 --- a/code/modules/food_and_drinks/machinery/grill.dm +++ b/code/modules/food_and_drinks/machinery/grill.dm @@ -78,7 +78,6 @@ ..() /obj/machinery/grill/process(seconds_per_tick) - ..() update_appearance() if(grill_fuel <= 0) return @@ -90,7 +89,11 @@ smoke.start() if(grilled_item) SEND_SIGNAL(grilled_item, COMSIG_ITEM_GRILL_PROCESS, src, seconds_per_tick) - grill_time += seconds_per_tick + if(QDELETED(grilled_item)) + grilled_item = null + finish_grill() + return + grill_time += seconds_per_tick * 10 //convert to deciseconds grilled_item.reagents.add_reagent(/datum/reagent/consumable/char, 0.5 * seconds_per_tick) grill_fuel -= GRILL_FUELUSAGE_ACTIVE * seconds_per_tick grilled_item.AddComponent(/datum/component/sizzle) @@ -106,13 +109,11 @@ if(default_unfasten_wrench(user, I) != CANT_UNFASTEN) return TRUE -/obj/machinery/grill/deconstruct(disassembled = TRUE) +/obj/machinery/grill/on_deconstruction(disassembled) if(grilled_item) finish_grill() - if(!(obj_flags & NO_DECONSTRUCTION)) - new /obj/item/stack/sheet/iron(loc, 5) - new /obj/item/stack/rods(loc, 5) - ..() + new /obj/item/stack/sheet/iron(loc, 5) + new /obj/item/stack/rods(loc, 5) /obj/machinery/grill/attack_ai(mob/user) return @@ -127,9 +128,16 @@ /obj/machinery/grill/proc/finish_grill() if(!QDELETED(grilled_item)) - if(grill_time >= 20) + var/time_limit = 20 SECONDS + //when items grill themselves in their own unique ways we want to follow their constraints + var/datum/component/grillable/custom_grilling = grilled_item.GetComponent(/datum/component/grillable) + if(!isnull(custom_grilling)) + time_limit = custom_grilling.required_cook_time + + if(grill_time >= time_limit) grilled_item.AddElement(/datum/element/grilled_item, grill_time) UnregisterSignal(grilled_item, COMSIG_ITEM_GRILLED) + grill_time = 0 grill_loop.stop() diff --git a/code/modules/food_and_drinks/machinery/icecream_vat.dm b/code/modules/food_and_drinks/machinery/icecream_vat.dm index e3abf6bf9de..e5742418c14 100644 --- a/code/modules/food_and_drinks/machinery/icecream_vat.dm +++ b/code/modules/food_and_drinks/machinery/icecream_vat.dm @@ -211,12 +211,10 @@ ice_cream_icon.color = flavor.color return ice_cream_icon -/obj/machinery/icecream_vat/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - new /obj/item/stack/sheet/iron(loc, 4) +/obj/machinery/icecream_vat/on_deconstruction(disassembled = TRUE) + new /obj/item/stack/sheet/iron(loc, 4) if(custom_ice_cream_beaker) custom_ice_cream_beaker.forceMove(loc) - qdel(src) ///Makes an ice cream cone of the make_type, using ingredients list as reagents used to make it. Puts in user's hand if possible. /obj/machinery/icecream_vat/proc/make_cone(mob/user, make_type, list/ingredients) diff --git a/code/modules/food_and_drinks/machinery/microwave.dm b/code/modules/food_and_drinks/machinery/microwave.dm index c4cc6d378e3..ec5df27ca5a 100644 --- a/code/modules/food_and_drinks/machinery/microwave.dm +++ b/code/modules/food_and_drinks/machinery/microwave.dm @@ -105,7 +105,7 @@ itemized_ingredient.pixel_y = itemized_ingredient.base_pixel_y + rand(-5, 6) return ..() -/obj/machinery/microwave/on_deconstruction() +/obj/machinery/microwave/on_deconstruction(disassembled) eject() return ..() diff --git a/code/modules/food_and_drinks/machinery/smartfridge.dm b/code/modules/food_and_drinks/machinery/smartfridge.dm index ae06fb93f83..7f2a2af7397 100644 --- a/code/modules/food_and_drinks/machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/machinery/smartfridge.dm @@ -491,7 +491,7 @@ /obj/machinery/smartfridge/drying_rack/exchange_parts() return -/obj/machinery/smartfridge/drying_rack/on_deconstruction() +/obj/machinery/smartfridge/drying_rack/on_deconstruction(disassembled) new /obj/item/stack/sheet/mineral/wood(drop_location(), 10) /obj/machinery/smartfridge/drying_rack/crowbar_act(mob/living/user, obj/item/tool) diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_martian.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_martian.dm index fb4f29284b8..02bb9ae7bf8 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_martian.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_martian.dm @@ -168,7 +168,7 @@ /obj/item/food/onion_slice = 1, /datum/reagent/consumable/nutriment/soup/teriyaki = 4, ) - result = /obj/item/food/salad/bibimbap + result = /obj/item/food/salad/bulgogi_noodles category = CAT_MARTIAN /datum/crafting_recipe/food/yakisoba_katsu diff --git a/code/modules/hydroponics/grown/ambrosia.dm b/code/modules/hydroponics/grown/ambrosia.dm index a2afcdc729f..aa02ba7efa1 100644 --- a/code/modules/hydroponics/grown/ambrosia.dm +++ b/code/modules/hydroponics/grown/ambrosia.dm @@ -72,7 +72,7 @@ name = "ambrosia gaia branch" desc = "Eating this makes you immortal." icon_state = "ambrosia_gaia" - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 3 seed = /obj/item/seeds/ambrosia/gaia wine_power = 70 diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 932c0910b73..58f7a1c8530 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -1184,9 +1184,8 @@ /obj/machinery/hydroponics/soil/CtrlClick(mob/user) return //Soil has no electricity. -/obj/machinery/hydroponics/soil/deconstruct(disassembled) +/obj/machinery/hydroponics/soil/on_deconstruction(disassembled) new /obj/item/stack/ore/glass(drop_location(), 3) - return ..() ///The usb port circuit diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm index 98eef6b816e..2ce685d0b7c 100644 --- a/code/modules/hydroponics/plant_genes.dm +++ b/code/modules/hydroponics/plant_genes.dm @@ -368,7 +368,7 @@ return var/obj/item/seeds/our_seed = our_plant.get_plant_seed() - our_plant.light_system = MOVABLE_LIGHT + our_plant.light_system = OVERLAY_LIGHT our_plant.AddComponent(/datum/component/overlay_lighting, glow_range(our_seed), glow_power(our_seed), glow_color) /* diff --git a/code/modules/keybindings/bindings_atom.dm b/code/modules/keybindings/bindings_atom.dm index 6dadcd5768e..e99e3714c6b 100644 --- a/code/modules/keybindings/bindings_atom.dm +++ b/code/modules/keybindings/bindings_atom.dm @@ -2,12 +2,21 @@ // Only way to do that is to tie the behavior into the focus's keyLoop(). /atom/movable/keyLoop(client/user) - var/movement_dir = NONE - for(var/_key in user?.keys_held) - movement_dir = movement_dir | user.movement_keys[_key] - if(user?.next_move_dir_add) - movement_dir |= user.next_move_dir_add - if(user?.next_move_dir_sub) + // Clients don't go null randomly. They do go null unexpectedly though, when they're poked in particular ways + // keyLoop is called by a for loop over mobs. We're guarenteed that all the mobs have clients at the START + // But the move of one mob might poke the client of another, so we do this + if(!user) + return FALSE + var/movement_dir = user.intended_direction | user.next_move_dir_add + // If we're not movin anywhere, we aren't movin anywhere + // Safe because nothing adds to movement_dir after this moment + if(!movement_dir) + // No input == our removal would have done nothing + // So we can safely forget about it + user.next_move_dir_sub = NONE + return FALSE + + if(user.next_move_dir_sub) movement_dir &= ~user.next_move_dir_sub // Sanity checks in case you hold left and right and up to make sure you only go up if((movement_dir & NORTH) && (movement_dir & SOUTH)) @@ -15,14 +24,21 @@ if((movement_dir & EAST) && (movement_dir & WEST)) movement_dir &= ~(EAST|WEST) - if(user && movement_dir) //If we're not moving, don't compensate, as byond will auto-fill dir otherwise + if(user.dir != NORTH && movement_dir) //If we're not moving, don't compensate, as byond will auto-fill dir otherwise movement_dir = turn(movement_dir, -dir2angle(user.dir)) //By doing this we ensure that our input direction is offset by the client (camera) direction //turn without moving while using the movement lock key, unless something wants to ignore it and move anyway - if(user?.movement_locked && !(SEND_SIGNAL(src, COMSIG_MOVABLE_KEYBIND_FACE_DIR, movement_dir) & COMSIG_IGNORE_MOVEMENT_LOCK)) + if(user.movement_locked && !(SEND_SIGNAL(src, COMSIG_MOVABLE_KEYBIND_FACE_DIR, movement_dir) & COMSIG_IGNORE_MOVEMENT_LOCK)) keybind_face_direction(movement_dir) - else - user?.Move(get_step(src, movement_dir), movement_dir) + // Null check cause of the signal above + else if(user) + user.Move(get_step(src, movement_dir), movement_dir) return !!movement_dir //true if there was actually any player input return FALSE + +/client/proc/calculate_move_dir() + var/movement_dir = NONE + for(var/_key in keys_held) + movement_dir |= movement_keys[_key] + intended_direction = movement_dir diff --git a/code/modules/keybindings/bindings_client.dm b/code/modules/keybindings/bindings_client.dm index 0aa0fd6952e..4a72fb9123d 100644 --- a/code/modules/keybindings/bindings_client.dm +++ b/code/modules/keybindings/bindings_client.dm @@ -47,9 +47,10 @@ //the time a key was pressed isn't actually used anywhere (as of 2019-9-10) but this allows easier access usage/checking keys_held[_key] = world.time - if(!movement_locked) - var/movement = movement_keys[_key] - if(!(next_move_dir_sub & movement)) + var/movement = movement_keys[_key] + if(movement) + calculate_move_dir() + if(!movement_locked && !(next_move_dir_sub & movement)) next_move_dir_add |= movement // Client-level keybindings are ones anyone should be able to do at any time @@ -74,11 +75,10 @@ if(kb.can_use(src) && kb.down(src) && keycount >= MAX_COMMANDS_PER_KEY) break - holder?.key_down(_key, src) - mob.focus?.key_down(_key, src) + holder?.key_down(_key, src, full_key) + mob.focus?.key_down(_key, src, full_key) mob.update_mouse_pointer() - /client/verb/keyUp(_key as text) set instant = TRUE set hidden = TRUE @@ -93,9 +93,10 @@ keys_held -= _key - if(!movement_locked) - var/movement = movement_keys[_key] - if(!(next_move_dir_add & movement)) + var/movement = movement_keys[_key] + if(movement) + calculate_move_dir() + if(!movement_locked && !(next_move_dir_add & movement)) next_move_dir_sub |= movement // We don't do full key for release, because for mod keys you diff --git a/code/modules/keybindings/setup.dm b/code/modules/keybindings/setup.dm index ef87e12d901..d239c48d9ce 100644 --- a/code/modules/keybindings/setup.dm +++ b/code/modules/keybindings/setup.dm @@ -1,6 +1,7 @@ // Set a client's focus to an object and override these procs on that object to let it handle keypresses -/datum/proc/key_down(key, client/user) // Called when a key is pressed down initially +/datum/proc/key_down(key, client/user, full_key) // Called when a key is pressed down initially + SHOULD_CALL_PARENT(TRUE) return /datum/proc/key_up(key, client/user) // Called when a key is released return diff --git a/code/modules/lighting/lighting_atom.dm b/code/modules/lighting/lighting_atom.dm index 5d82c33e23f..e3f72da5bbf 100644 --- a/code/modules/lighting/lighting_atom.dm +++ b/code/modules/lighting/lighting_atom.dm @@ -44,7 +44,7 @@ /atom/proc/update_light() SHOULD_NOT_SLEEP(TRUE) - if(light_system != STATIC_LIGHT) + if(light_system != COMPLEX_LIGHT) CRASH("update_light() for [src] with following light_system value: [light_system]") if (!light_power || !light_range || !light_on) // We won't emit light anyways, destroy the light source. diff --git a/code/modules/lighting/lighting_source.dm b/code/modules/lighting/lighting_source.dm index 90af6a855ce..1a32686aa19 100644 --- a/code/modules/lighting/lighting_source.dm +++ b/code/modules/lighting/lighting_source.dm @@ -80,7 +80,7 @@ if (needs_update) SSlighting.sources_queue -= src SSlighting.current_sources -= src - + top_atom = null source_atom = null source_turf = null @@ -107,15 +107,6 @@ UnregisterSignal(old_atom_host, COMSIG_MOVABLE_MOVED) return TRUE -///signal handler for when our host atom moves and we need to update our effects -/datum/light_source/proc/update_host_lights(atom/movable/host) - SIGNAL_HANDLER - - if(QDELETED(host)) - return - - host.update_light() - // Yes this doesn't align correctly on anything other than 4 width tabs. // If you want it to go switch everybody to elastic tab stops. // Actually that'd be great if you could! @@ -127,6 +118,19 @@ needs_update = level; \ } +///signal handler for when our host atom moves and we need to update our effects +/datum/light_source/proc/update_host_lights(atom/movable/host) + SIGNAL_HANDLER + if(QDELETED(host)) + return + + // If the host is our owner, we want to call their update so they can decide who the top atom should be + if(host == source_atom) + host.update_light() + return + + // Otherwise, our top atom just moved, so we trigger a normal rebuild + EFFECT_UPDATE(LIGHTING_CHECK_UPDATE) /// This proc will cause the light source to update the top atom, and add itself to the update queue. /datum/light_source/proc/update(atom/new_top_atom) diff --git a/code/modules/mapfluff/ruins/objects_and_mobs/museum.dm b/code/modules/mapfluff/ruins/objects_and_mobs/museum.dm new file mode 100644 index 00000000000..20210d56cc9 --- /dev/null +++ b/code/modules/mapfluff/ruins/objects_and_mobs/museum.dm @@ -0,0 +1,131 @@ +/obj/machinery/computer/terminal/museum + name = "exhibit info terminal" + desc = "A relatively low-tech info board. Not as low-tech as an actual sign though. Appears to be quite old." + upperinfo = "Nanotrasen Museum Exhibit Info" + icon_state = "plaque" + icon_screen = "plaque_screen" + icon_keyboard = null + +/obj/effect/replica_spawner //description and name are intact, better to make a new fluff object for stuff that is not actually ingame as an object + name = "replica creator" + desc = "This creates a fluff object that looks exactly like the input, but like obviously a replica. Do not for the love of god use with stuff that has Initialize side effects." + icon = 'icons/hud/screen_gen.dmi' + icon_state = "x2" + invisibility = INVISIBILITY_ABSTRACT //nope, can't see this + anchored = TRUE + density = TRUE + opacity = FALSE + var/replica_path = /obj/structure/fluff + var/target_path + var/obvious_replica = TRUE + +/obj/effect/replica_spawner/Initialize(mapload) + . = ..() + if(isnull(target_path)) + return INITIALIZE_HINT_QDEL //no use to make a replica of null + var/atom/appearance_object = new target_path + var/atom/new_replica = new replica_path(loc) + + new_replica.icon = appearance_object.icon + new_replica.icon_state = appearance_object.icon_state + new_replica.copy_overlays(appearance_object.appearance, cut_old = TRUE) + new_replica.density = appearance_object.density //for like nondense showers and stuff + + new_replica.name = "[appearance_object.name][obvious_replica ? " replica" : ""]" + new_replica.desc = "[appearance_object.desc][obvious_replica ? " ..except this one is a replica.": ""]" + qdel(appearance_object) + qdel(src) + return INITIALIZE_HINT_QDEL + +/obj/structure/fluff/dnamod + name = "DNA Modifier" + desc = "DNA Manipulator replica. Essentially just a box of cool lights." + icon = 'icons/obj/service/hydroponics/equipment.dmi' + icon_state = "dnamod" + density = TRUE + +/obj/structure/fluff/preserved_borer + name = "preserved borer exhibit" + desc = "A preserved cortical borer. Probably been there long enough to not last long outside the exhibit." + icon = 'icons/obj/structures.dmi' + icon_state = "preservedborer" + density = TRUE + +/obj/structure/fluff/balloon_nuke + name = "nuclear balloon explosive" + desc = "You probably shouldn't stick around to see if this is inflated." + icon = /obj/machinery/nuclearbomb::icon + icon_state = /obj/machinery/nuclearbomb::icon_state + density = TRUE + max_integrity = 5 //one tap + +/obj/structure/fluff/balloon_nuke/atom_destruction() + playsound(loc, 'sound/effects/cartoon_pop.ogg', 75, vary = TRUE) + ..() + +/obj/structure/fluff/fake_camera + name = /obj/machinery/camera::name + desc = /obj/machinery/camera::desc + icon = /obj/machinery/camera::icon + icon_state = /obj/machinery/camera::icon_state + +/obj/structure/fluff/fake_scrubber + name = /obj/machinery/atmospherics/components/unary/vent_scrubber::name + desc = /obj/machinery/atmospherics/components/unary/vent_scrubber::desc + icon = /obj/machinery/atmospherics/components/unary/vent_scrubber::icon + layer = /obj/machinery/atmospherics/components/unary/vent_scrubber::layer + plane = FLOOR_PLANE + icon_state = "scrub_on" + +/obj/structure/fluff/fake_vent + name = /obj/machinery/atmospherics/components/unary/vent_pump::name + desc = /obj/machinery/atmospherics/components/unary/vent_pump::desc + icon = /obj/machinery/atmospherics/components/unary/vent_pump::icon + layer = /obj/machinery/atmospherics/components/unary/vent_scrubber::layer + plane = FLOOR_PLANE + icon_state = "vent_out" + +/turf/open/mirage + icon = 'icons/turf/floors.dmi' + icon_state = "mirage" + invisibility = INVISIBILITY_ABSTRACT + /// target turf x and y are offsets from our location instead of a direct coordinate + var/offset = TRUE + /// tile range that we show, 2 means that the target tile and two tiles ahead of it in our direction will show + var/range + var/target_turf_x = 0 + var/target_turf_y = 0 + /// if not specified, uses our Z + var/target_turf_z + +/turf/open/mirage/Initialize(mapload) + . = ..() + if(isnull(range)) + range = world.view + var/used_z = target_turf_z || z //if target z is not defined, use ours + var/turf/target = locate(offset ? target_turf_x + x : target_turf_x, offset ? target_turf_y + y : target_turf_y, used_z) + AddElement(/datum/element/mirage_border, target, dir, range) + +/obj/effect/mapping_helpers/ztrait_injector/museum + traits_to_add = list(ZTRAIT_NOPARALLAX = TRUE, ZTRAIT_NOXRAY = TRUE, ZTRAIT_NOPHASE = TRUE, ZTRAIT_BASETURF = /turf/open/indestructible/plating, ZTRAIT_SECRET = TRUE) + +/obj/effect/smooths_with_walls + name = "effect that smooths with walls" + desc = "to supplement /turf/open/mirage." + icon = 'icons/hud/screen_gen.dmi' + icon_state = "x2" + invisibility = INVISIBILITY_ABSTRACT + anchored = TRUE + density = TRUE + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS + +/obj/item/paper/fluff/museum/noend + name = "scrambled note" + default_raw_text = {"this place, +
    god whose idea was to build a museum in the void in the middle of god knows where there is no reason we should have done this +
    and those mannequins why do they stare back where the fuck did you get these from +
    how would we even get visitors here +
    sometimes i can catch them moving +
    +
    we should have never come here"} diff --git a/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm b/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm index d309b8879be..d99902f448a 100644 --- a/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm +++ b/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm @@ -12,7 +12,8 @@ GLOBAL_VAR_INIT(hhMysteryRoomNumber, rand(1, 999999)) var/list/static/hotel_maps = list("Generic", "Apartment", "Beach Condo") //standart - hilber's hotel room //apartment - see /datum/map_template/ghost_cafe_rooms - var/datum/map_template/ghost_cafe_rooms/ghost_cafe_rooms_apartment + var/datum/map_template/ghost_cafe_rooms/apartment/ghost_cafe_rooms_apartment + var/datum/map_template/ghost_cafe_rooms/beach_condo/ghost_cafe_rooms_beach_condo //NOVA EDIT END var/datum/map_template/hilbertshotel/hotelRoomTemp var/datum/map_template/hilbertshotel/empty/hotelRoomTempEmpty @@ -34,6 +35,7 @@ GLOBAL_VAR_INIT(hhMysteryRoomNumber, rand(1, 999999)) hotelRoomTempLore = new() //NOVA EDIT ADDITION - GHOST HOTEL UPDATE ghost_cafe_rooms_apartment = new() + ghost_cafe_rooms_beach_condo = new() //NOVA EDIT END var/area/currentArea = get_area(src) if(currentArea.type == /area/ruin/space/has_grav/powered/hilbertresearchfacility/secretroom) @@ -179,7 +181,7 @@ GLOBAL_VAR_INIT(hhMysteryRoomNumber, rand(1, 999999)) else if(chosen_room == "Apartment") load_from = ghost_cafe_rooms_apartment else if(chosen_room == "Beach Condo") - load_from = ghost_cafe_rooms_apartment + load_from = ghost_cafe_rooms_beach_condo //NOVA EDIT ADDITION END load_from.load(bottom_left) diff --git a/code/modules/mapping/mapping_helpers.dm b/code/modules/mapping/mapping_helpers.dm index 7676801a0a9..faaaf9e4206 100644 --- a/code/modules/mapping/mapping_helpers.dm +++ b/code/modules/mapping/mapping_helpers.dm @@ -1395,3 +1395,32 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) var/turf/our_turf = get_turf(src) // In case a locker ate us or something our_turf.AddElement(/datum/element/bombable_turf) return INITIALIZE_HINT_QDEL + +/// this helper buckles all mobs on the tile to the first buckleable object +/obj/effect/mapping_helpers/mob_buckler + name = "Buckle Mob" + icon_state = "buckle" + late = TRUE + ///whether we force a buckle + var/force_buckle = FALSE + +/obj/effect/mapping_helpers/mob_buckler/Initialize(mapload) + . = ..() + var/atom/movable/buckle_to + var/list/mobs = list() + for(var/atom/movable/possible_buckle as anything in loc) + if(isnull(buckle_to) && possible_buckle.can_buckle) + buckle_to = possible_buckle + continue + + if(isliving(possible_buckle)) + mobs += possible_buckle + + if(isnull(buckle_to)) + log_mapping("[type] at [x] [y] [z] did not find anything to buckle to") + return INITIALIZE_HINT_QDEL + + for(var/mob/living/mob as anything in mobs) + buckle_to.buckle_mob(mob, force = force_buckle) + + return INITIALIZE_HINT_QDEL diff --git a/code/modules/mining/boulder_processing/_boulder_processing.dm b/code/modules/mining/boulder_processing/_boulder_processing.dm index daa6620a233..d7d4be2557e 100644 --- a/code/modules/mining/boulder_processing/_boulder_processing.dm +++ b/code/modules/mining/boulder_processing/_boulder_processing.dm @@ -3,186 +3,264 @@ desc = "You shouldn't be seeing this! And bouldertech isn't even a real company!" icon = 'icons/obj/machines/mining_machines.dmi' icon_state = "ore_redemption" + active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 0.5 anchored = TRUE density = TRUE /// What is the efficiency of minerals produced by the machine? var/refining_efficiency = 1 - /// How many boulders can we process maximum per loop? - var/boulders_processing_max = 1 - /// What boulder(s) are we holding? - var/list/boulders_contained = list() + /// How much durability of an boulder can we reduce + var/boulders_processing_count = 2 /// How many boulders can we hold maximum? var/boulders_held_max = 1 - /// Does this machine have a mineral storage link to the silo? - var/holds_minerals = FALSE - /// What materials do we accept and process out of boulders? Removing iron from an iron/glass boulder would leave a boulder with glass. - var/list/processable_materials = list() - /// If we get a boulder with one of these inside, we'll drop it back out. - var/static/list/drop_if_contained = list( - /obj/item/relic, - ) - /// What sound plays when a thing operates? var/usage_sound = 'sound/machines/mining/wooping_teleport.ogg' - /// Cooldown associated with the usage_sound played. - COOLDOWN_DECLARE(sound_cooldown) - /// Silo link to it's materials list. var/datum/component/remote_materials/silo_materials - ///Does this machine hold mining points? - var/holds_mining_points = FALSE /// Mining points held by the machine for miners. var/points_held = 0 + ///The action verb to display to players + var/action = "processing" + + /// Cooldown associated with the sound played for collecting mining points. + COOLDOWN_DECLARE(sound_cooldown) + /// Cooldown associated with taking in boulds. + COOLDOWN_DECLARE(accept_cooldown) /obj/machinery/bouldertech/Initialize(mapload) . = ..() + + silo_materials = AddComponent( + /datum/component/remote_materials, \ + mapload, \ + mat_container_flags = MATCONTAINER_NO_INSERT \ + ) + register_context() - if(holds_minerals) - silo_materials = AddComponent(/datum/component/remote_materials, mapload) /obj/machinery/bouldertech/LateInitialize() . = ..() - if(!holds_minerals) - return var/static/list/loc_connections = list( COMSIG_ATOM_ENTERED = PROC_REF(on_entered), ) AddElement(/datum/element/connect_loc, loc_connections) /obj/machinery/bouldertech/Destroy() - boulders_contained = null silo_materials = null return ..() -/obj/machinery/bouldertech/update_icon_state() +/obj/machinery/bouldertech/on_deconstruction(disassembled) + if(length(contents)) + for(var/obj/item/boulder/boulder in contents) + remove_boulder(boulder) + +/obj/machinery/bouldertech/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = CONTEXTUAL_SCREENTIP_SET + + if(isnull(held_item)) + context[SCREENTIP_CONTEXT_RMB] = "Remove Boulder" + return + + if(istype(held_item, /obj/item/boulder)) + context[SCREENTIP_CONTEXT_LMB] = "Insert boulder" + else if(istype(held_item, /obj/item/card/id) && points_held > 0) + context[SCREENTIP_CONTEXT_LMB] = "Claim mining points" + else if(held_item.tool_behaviour == TOOL_SCREWDRIVER) + context[SCREENTIP_CONTEXT_LMB] = "[panel_open ? "Close" : "Open"] Panel" + else if(held_item.tool_behaviour == TOOL_WRENCH) + context[SCREENTIP_CONTEXT_LMB] = "[anchored ? "" : "Un"] Anchor" + else if(panel_open && held_item.tool_behaviour == TOOL_CROWBAR) + context[SCREENTIP_CONTEXT_LMB] = "Deconstruct" + +/obj/machinery/bouldertech/examine(mob/user) . = ..() + . += span_notice("The machine reads that it has [span_bold("[points_held] mining points")] stored. Swipe an ID to claim them.") + . += span_notice("Click to remove a stored boulder.") + + var/boulder_count = 0 + for(var/obj/item/boulder/potential_boulder in contents) + boulder_count += 1 + . += span_notice("Storage capacity = [boulder_count]/[boulders_held_max] boulders.") + . += span_notice("Can process upto [boulders_processing_count] boulders at a time.") + if(anchored) - icon_state ="[initial(icon_state)]" + . += span_notice("Its [EXAMINE_HINT("anchored")] in place.") else - icon_state ="[initial(icon_state)]-off" + . += span_warning("It needs to be [EXAMINE_HINT("anchored")] to start operations.") + + . += span_notice("Its maintainence panel can be [EXAMINE_HINT("screwed")] [panel_open ? "closed" : "open"].") + + if(panel_open) + . += span_notice("The whole machine can be [EXAMINE_HINT("pried")] apart.") + +/obj/machinery/bouldertech/update_icon_state() + . = ..() + var/suffix = "" + if(!anchored || !is_operational || (machine_stat & (BROKEN | NOPOWER)) || panel_open) + suffix = "-off" + icon_state ="[initial(icon_state)][suffix]" /obj/machinery/bouldertech/wrench_act(mob/living/user, obj/item/tool) . = ITEM_INTERACT_BLOCKING if(default_unfasten_wrench(user, tool, time = 1.5 SECONDS) == SUCCESSFUL_UNFASTEN) + if(anchored) + begin_processing() + else + end_processing() update_appearance(UPDATE_ICON_STATE) - START_PROCESSING(SSmachines, src) return ITEM_INTERACT_SUCCESS /obj/machinery/bouldertech/screwdriver_act(mob/living/user, obj/item/tool) - . = ..() + . = ITEM_INTERACT_BLOCKING if(default_deconstruction_screwdriver(user, "[initial(icon_state)]-off", initial(icon_state), tool)) + update_appearance(UPDATE_ICON_STATE) return ITEM_INTERACT_SUCCESS /obj/machinery/bouldertech/crowbar_act(mob/living/user, obj/item/tool) - . = ..() - if(default_pry_open(tool, close_after_pry = TRUE, closed_density = FALSE)) - return ITEM_INTERACT_SUCCESS + . = ITEM_INTERACT_BLOCKING if(default_deconstruction_crowbar(tool)) return ITEM_INTERACT_SUCCESS +/obj/machinery/bouldertech/CanAllowThrough(atom/movable/mover, border_dir) + if(!anchored) + return FALSE + if(istype(mover, /obj/item/boulder)) + var/obj/item/boulder/boulder = mover + return can_process_boulder(boulder) + return ..() + +/** + * Can we process the boulder, checks only the boulders state & machines capacity + * Arguments + * + * * obj/item/boulder/new_boulder - the boulder we are checking + */ +/obj/machinery/bouldertech/proc/can_process_boulder(obj/item/boulder/new_boulder) + PRIVATE_PROC(TRUE) + SHOULD_BE_PURE(TRUE) + + //machine not operational + if(!anchored || panel_open || !is_operational || machine_stat & (BROKEN | NOPOWER)) + return FALSE + + //not a valid boulder + if(!istype(new_boulder) || QDELETED(new_boulder)) + return FALSE + + //someone just processed this + if(new_boulder.processed_by) + return FALSE + + //no space to hold boulders + var/boulder_count = 0 + for(var/obj/item/boulder/potential_boulder in contents) + boulder_count += 1 + if(boulder_count >= boulders_held_max) + return FALSE + + //did we cooldown enough to accept a boulder + return COOLDOWN_FINISHED(src, accept_cooldown) + +/** + * Accepts a boulder into the machine. Used when a boulder is first placed into the machine. + * Arguments + * + * * obj/item/boulder/new_boulder - the boulder to accept + */ +/obj/machinery/bouldertech/proc/accept_boulder(obj/item/boulder/new_boulder) + if(!can_process_boulder(new_boulder)) + return FALSE + + new_boulder.forceMove(src) + + COOLDOWN_START(src, accept_cooldown, 1.5 SECONDS) + + return TRUE + +/obj/machinery/bouldertech/proc/on_entered(datum/source, atom/movable/atom_movable) + SIGNAL_HANDLER + + if(!can_process_boulder(atom_movable)) + return + + INVOKE_ASYNC(src, PROC_REF(accept_boulder), atom_movable) + +/** + * Looks for a boost to the machine's efficiency, and applies it if found. + * Applied more on the chemistry integration but can be used for other things if desired. + */ +/obj/machinery/bouldertech/proc/check_for_boosts() + PROTECTED_PROC(TRUE) + + refining_efficiency = initial(refining_efficiency) //Reset refining efficiency to 100%. + +/** + * Checks if this machine can process this material + * Arguments + * + * * datum/material/mat - the material to process + */ +/obj/machinery/bouldertech/proc/can_process_material(datum/material/mat) + PROTECTED_PROC(TRUE) + + return FALSE + /obj/machinery/bouldertech/attackby(obj/item/attacking_item, mob/user, params) - if(holds_minerals && istype(attacking_item, /obj/item/boulder)) + if(panel_open) + return ..() + + if(istype(attacking_item, /obj/item/boulder)) + . = TRUE var/obj/item/boulder/my_boulder = attacking_item - update_boulder_count() if(!accept_boulder(my_boulder)) - balloon_alert_to_viewers("full!") + balloon_alert_to_viewers("cannot accept!") return balloon_alert_to_viewers("accepted") - START_PROCESSING(SSmachines, src) - return TRUE - if(istype(attacking_item, /obj/item/card/id) && holds_mining_points) + return + + if(istype(attacking_item, /obj/item/card/id)) + . = TRUE if(points_held <= 0) balloon_alert_to_viewers("no points to claim!") if(!COOLDOWN_FINISHED(src, sound_cooldown)) - return TRUE + return COOLDOWN_START(src, sound_cooldown, 1.5 SECONDS) playsound(src, 'sound/machines/buzz-sigh.ogg', 30, FALSE) - return FALSE + return + var/obj/item/card/id/id_card = attacking_item var/amount = tgui_input_number(user, "How many mining points do you wish to claim? ID Balance: [id_card.registered_account.mining_points], stored mining points: [points_held]", "Transfer Points", max_value = points_held, min_value = 0, round_value = 1) if(!amount) - return TRUE + return if(amount > points_held) amount = points_held id_card.registered_account.mining_points += amount points_held = round(points_held - amount) to_chat(user, span_notice("You claim [amount] mining points from \the [src] to [id_card].")) - return TRUE + return + return ..() /obj/machinery/bouldertech/attack_hand_secondary(mob/user, list/modifiers) . = ..() - if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) + if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN || panel_open) return if(!anchored) balloon_alert(user, "anchor first!") return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - if(!holds_minerals) - return SECONDARY_ATTACK_CONTINUE_CHAIN - if(!length(boulders_contained)) - balloon_alert_to_viewers("No boulders to remove!") + if(panel_open) + balloon_alert(user, "close panel!") return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - remove_boulder(pick(boulders_contained)) - return SECONDARY_ATTACK_CONTINUE_CHAIN - -/obj/machinery/bouldertech/deconstruct(disassembled) - . = ..() - if(length(contents)) - for(var/obj/item/boulder/boulder in contents) - remove_boulder(boulder) - -/obj/machinery/bouldertech/process() - if(!anchored) - return PROCESS_KILL - var/stop_processing_check = FALSE - var/boulders_concurrent = boulders_processing_max ///How many boulders can we touch this process() call - for(var/obj/item/potential_boulder as anything in boulders_contained) - if(QDELETED(potential_boulder)) - boulders_contained -= potential_boulder - break - if(boulders_concurrent <= 0) - break //Try again next time - - if(!istype(potential_boulder, /obj/item/boulder)) - potential_boulder.forceMove(drop_location()) - CRASH("\The [src] had a non-boulder in it's boulders contained!") - var/obj/item/boulder/boulder = potential_boulder - if(boulder.durability < 0) - CRASH("\The [src] had a boulder with negative durability!") - if(!check_for_processable_materials(boulder.custom_materials)) //Checks for any new materials we can process. - boulders_concurrent-- //We count skipped boulders - remove_boulder(boulder) - continue - boulders_concurrent-- - boulder.durability-- //One less durability to the processed boulder. - if(COOLDOWN_FINISHED(src, sound_cooldown)) - COOLDOWN_START(src, sound_cooldown, 1.5 SECONDS) - playsound(loc, usage_sound, 29, FALSE, SHORT_RANGE_SOUND_EXTRARANGE) //This can get annoying. One play per process() call. - stop_processing_check = TRUE - if(boulder.durability <= 0) - breakdown_boulder(boulder) //Crack that bouwlder open! - continue - if(!stop_processing_check) - playsound(src.loc, 'sound/machines/ping.ogg', 50, FALSE) - return PROCESS_KILL - - -/obj/machinery/bouldertech/CanAllowThrough(atom/movable/mover, border_dir) - if(!anchored) - return FALSE - if(boulders_contained.len >= boulders_held_max) - return FALSE - if(istype(mover, /obj/item/boulder)) - var/obj/item/boulder/boulder = mover - return boulder.can_get_processed() - return ..() + var/obj/item/boulder/boulder = locate(/obj/item/boulder) in src + if(!boulder) + balloon_alert_to_viewers("no boulders to remove!") + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + if(!remove_boulder(boulder)) + balloon_alert_to_viewers("no space to remove!") + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN -/obj/machinery/bouldertech/examine(mob/user) - . = ..() - if(holds_mining_points) - . += span_notice("The machine reads that it has [span_bold("[points_held] mining points")] stored. Swipe an ID to claim them.") + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN /** * Accepts a boulder into the machinery, then converts it into minerals. @@ -191,159 +269,93 @@ * @param chosen_boulder The boulder to being breaking down into minerals. */ /obj/machinery/bouldertech/proc/breakdown_boulder(obj/item/boulder/chosen_boulder) + PRIVATE_PROC(TRUE) + if(QDELETED(chosen_boulder)) return FALSE if(chosen_boulder.loc != src) return FALSE - if(!length(chosen_boulder.custom_materials)) - qdel(chosen_boulder) - playsound(loc, 'sound/weapons/drill.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - update_boulder_count() - return FALSE - if(isnull(silo_materials)) - return FALSE - //here we loop through the boulder's ores - var/list/processable_ores = list() - var/tripped = FALSE - //If a material is in the boulder's custom_materials, but not in the processable_materials list, we add it to the processable_ores list to add back to a leftover boulder. - for(var/datum/material/possible_mat as anything in chosen_boulder.custom_materials) - if(!is_type_in_list(possible_mat, processable_materials)) - continue - var/quantity = chosen_boulder.custom_materials[possible_mat] - points_held = round(points_held + (quantity * possible_mat.points_per_unit * MINING_POINT_MACHINE_MULTIPLIER)) // put point total here into machine - processable_ores += possible_mat - processable_ores[possible_mat] = quantity - chosen_boulder.custom_materials -= possible_mat //Remove it from the boulder now that it's tracked - tripped = TRUE - if(!tripped) - remove_boulder(chosen_boulder) - say("Nothing to process!") - return FALSE //we shouldn't spend more time processing a boulder with contents we don't care about. - use_power(BASE_MACHINE_ACTIVE_CONSUMPTION) - check_for_boosts() //Calls the relevant behavior for boosting the machine's efficiency, if able. - var/is_artifact = (istype(chosen_boulder, /obj/item/boulder/artifact)) //We need to know if it's an artifact so we can carry it over to the new boulder. - var/obj/item/boulder/disposable_boulder = new (src) - disposable_boulder.custom_materials = processable_ores - silo_materials.insert_item(disposable_boulder, refining_efficiency) - qdel(disposable_boulder) - - refining_efficiency = initial(refining_efficiency) //Reset refining efficiency to 100% now that we've processed any relevant ores. - if(!length(chosen_boulder.custom_materials)) - playsound(loc, 'sound/weapons/drill.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - if(is_artifact) - points_held = round((points_held + MINER_POINT_MULTIPLIER) * MINING_POINT_MACHINE_MULTIPLIER) /// Artifacts give bonus points! - chosen_boulder.break_apart() - update_boulder_count() - return TRUE //We've processed all the materials in the boulder, so we can just destroy it in break_apart. - - chosen_boulder.restart_processing_cooldown() //So that we don't pick it back up! - chosen_boulder.durability = rand(chosen_boulder.boulder_size, chosen_boulder.boulder_size + BOULDER_SIZE_SMALL) //Reset durability to a random value between the boulder's size and a little more. + //if boulders are kept inside because there is no space to eject them, then they could be reprocessed, lets avoid that + if(!chosen_boulder.processed_by) + check_for_boosts() + + //here we loop through the boulder's ores + var/list/rejected_mats = list() + for(var/datum/material/possible_mat as anything in chosen_boulder.custom_materials) + var/quantity = chosen_boulder.custom_materials[possible_mat] * refining_efficiency + if(!can_process_material(possible_mat)) + rejected_mats[possible_mat] = quantity + continue + points_held = round(points_held + (quantity * possible_mat.points_per_unit * MINING_POINT_MACHINE_MULTIPLIER)) // put point total here into machine + if(!silo_materials.mat_container.insert_amount_mat(quantity, possible_mat)) + rejected_mats[possible_mat] = quantity + use_power(active_power_usage) + + //puts back materials that couldn't be processed + chosen_boulder.set_custom_materials(rejected_mats, refining_efficiency) + + //break the boulder down if we have processed all its materials + if(!length(chosen_boulder.custom_materials)) + playsound(loc, usage_sound, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + if(istype(chosen_boulder, /obj/item/boulder/artifact)) + points_held = round((points_held + MINER_POINT_MULTIPLIER) * MINING_POINT_MACHINE_MULTIPLIER) /// Artifacts give bonus points! + chosen_boulder.break_apart() + return TRUE //We've processed all the materials in the boulder, so we can just destroy it in break_apart. + + chosen_boulder.processed_by = src + + //eject the boulder since we are done with it remove_boulder(chosen_boulder) - return TRUE -/** - * Accepts a boulder into the machine. Used when a boulder is first placed into the machine. - * @param new_boulder The boulder to be accepted. - */ -/obj/machinery/bouldertech/proc/accept_boulder(obj/item/boulder/new_boulder) - if(isnull(new_boulder)) - return FALSE - if(boulders_contained.len >= boulders_held_max) //Full already - return FALSE - if(!istype(new_boulder)) //Can't be processed - return FALSE - if(!new_boulder.custom_materials) //Shouldn't happen, but just in case. - qdel(new_boulder) - playsound(loc, 'sound/weapons/drill.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - return FALSE - new_boulder.forceMove(src) - boulders_contained += new_boulder - SSore_generation.available_boulders -= new_boulder - START_PROCESSING(SSmachines, src) //Starts processing if we aren't already. - return TRUE +/obj/machinery/bouldertech/process() + if(!anchored || panel_open || !is_operational || machine_stat & (BROKEN | NOPOWER)) + return -/** - * Ejects a boulder from the machine. Used when a boulder is finished processing, or when a boulder can't be processed. - * @param drop_turf The location to eject the boulder to. If null, it will eject to the machine's drop_location(). - * @param specific_boulder The boulder to be ejected. - */ -/obj/machinery/bouldertech/proc/remove_boulder(obj/item/boulder/specific_boulder, turf/drop_turf = null) - if(isnull(specific_boulder)) - CRASH("remove_boulder() called with no boulder!") - if(!length(specific_boulder.custom_materials)) - qdel(specific_boulder) - update_boulder_count() - playsound(loc, 'sound/weapons/drill.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - return FALSE - specific_boulder.restart_processing_cooldown() //Reset the cooldown so we don't pick it back up by the same machine. - if(isturf(drop_turf)) - specific_boulder.forceMove(drop_turf) - else - specific_boulder.forceMove(drop_location()) - if(!update_boulder_count()) - return TRUE - STOP_PROCESSING(SSmachines, src) - balloon_alert_to_viewers("clear!") - playsound(loc, 'sound/machines/ping.ogg', 50, FALSE) - return TRUE + var/boulders_found = FALSE + var/boulders_processed = boulders_processing_count + for(var/obj/item/boulder/potential_boulder in contents) + boulders_found = TRUE + if(boulders_processed <= 0) + break //Try again next time + boulders_processed-- -/** - * Getter proc to determine how many boulders are contained in the machine. - * Also adds their reference to the boulders_contained list. - */ -/obj/machinery/bouldertech/proc/update_boulder_count() - boulders_contained = list() - for(var/obj/item/boulder/boulder in contents) - boulders_contained += boulder - return boulders_contained.len + if(potential_boulder.durability > 0) + potential_boulder.durability -= 1 + if(potential_boulder.durability > 0) + continue -/obj/machinery/bouldertech/proc/on_entered(datum/source, atom/movable/atom_movable) - SIGNAL_HANDLER - INVOKE_ASYNC(src, PROC_REF(accept_boulder), atom_movable) + breakdown_boulder(potential_boulder) + boulders_found = FALSE -/** - * Looks for a boost to the machine's efficiency, and applies it if found. - * Applied more on the chemistry integration but can be used for other things if desired. - */ -/obj/machinery/bouldertech/proc/check_for_boosts() - refining_efficiency = initial(refining_efficiency) //Reset refining efficiency to 100%. + //when the boulder is removed it plays sound and displays a balloon alert. don't overlap when that happens + if(boulders_found) + playsound(loc, usage_sound, 29, FALSE, SHORT_RANGE_SOUND_EXTRARANGE) + balloon_alert_to_viewers(action) /** - * Checks if a custom_material is in a list of processable materials in the machine. - * @param list/custom_material A list of materials, presumably taken from a boulder. If a material that this machine can process is in this list, it will return true, inclusively. + * Ejects a boulder from the machine. Used when a boulder is finished processing, or when a boulder can't be processed. + * Arguments + * + * * obj/item/boulder/specific_boulder - the boulder to remove */ -/obj/machinery/bouldertech/proc/check_for_processable_materials(list/boulder_mats) - for(var/material as anything in boulder_mats) - if(is_type_in_list(material, processable_materials)) - return TRUE - return FALSE +/obj/machinery/bouldertech/proc/remove_boulder(obj/item/boulder/specific_boulder) + PRIVATE_PROC(TRUE) -///Beacon to launch a new mining setup when activated. For testing and speed! -/obj/item/boulder_beacon - name = "boulder beacon" - desc = "N.T. approved boulder beacon, toss it down and you will have a full bouldertech mining station." - icon = 'icons/obj/machines/floor.dmi' - icon_state = "floor_beacon" - /// Number of activations left on this beacon. Uses will be removed as the beacon is used and each triggers a different machine to be spawned from it. - var/uses = 3 + if(QDELETED(specific_boulder)) + return TRUE + if(locate(/obj/item/boulder) in loc) //There is an boulder in our loc. it has be removed so we don't clog up our loc with even more boulders + return FALSE -/obj/item/boulder_beacon/attack_self() - loc.visible_message(span_warning("\The [src] begins to beep loudly!")) - addtimer(CALLBACK(src, PROC_REF(launch_payload)), 1 SECONDS) + //Reset durability to little random lower value cause we have crushed it so many times + var/size = specific_boulder.boulder_size + if(size == BOULDER_SIZE_SMALL) + specific_boulder.durability = rand(2, BOULDER_SIZE_SMALL - 1) + else + specific_boulder.durability = rand(BOULDER_SIZE_SMALL, size - 1) + specific_boulder.processed_by = src //so we don't take in the boulder again after we just ejected it + specific_boulder.forceMove(drop_location()) + specific_boulder.processed_by = null //now since move is done we can safely clear the reference + playsound(loc, 'sound/machines/ping.ogg', 50, FALSE) -/** - * Spawns a new bouldertech machine from the beacon, then removes a use from the beacon. - * Use one spawns a BRM teleporter, then a refinery, and lastly a smelter. - */ -/obj/item/boulder_beacon/proc/launch_payload() - playsound(src, SFX_SPARKS, 80, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - switch(uses) - if(3) - new /obj/machinery/bouldertech/brm(drop_location()) - if(2) - new /obj/machinery/bouldertech/refinery(drop_location()) - if(1) - new /obj/machinery/bouldertech/refinery/smelter(drop_location()) - qdel(src) - uses-- + return TRUE diff --git a/code/modules/mining/boulder_processing/beacon.dm b/code/modules/mining/boulder_processing/beacon.dm new file mode 100644 index 00000000000..576e05baf53 --- /dev/null +++ b/code/modules/mining/boulder_processing/beacon.dm @@ -0,0 +1,28 @@ +///Beacon to launch a new mining setup when activated. For testing and speed! +/obj/item/boulder_beacon + name = "boulder beacon" + desc = "N.T. approved boulder beacon, toss it down and you will have a full bouldertech mining station." + icon = 'icons/obj/machines/floor.dmi' + icon_state = "floor_beacon" + /// Number of activations left on this beacon. Uses will be removed as the beacon is used and each triggers a different machine to be spawned from it. + var/uses = 3 + +/obj/item/boulder_beacon/attack_self() + visible_message(span_warning("\The [src] begins to beep loudly!")) + addtimer(CALLBACK(src, PROC_REF(launch_payload)), 1 SECONDS) + +/** + * Spawns a new bouldertech machine from the beacon, then removes a use from the beacon. + * Use one spawns a BRM teleporter, then a refinery, and lastly a smelter. + */ +/obj/item/boulder_beacon/proc/launch_payload() + playsound(src, SFX_SPARKS, 80, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + switch(uses) + if(3) + new /obj/machinery/brm(drop_location()) + if(2) + new /obj/machinery/bouldertech/refinery(drop_location()) + if(1) + new /obj/machinery/bouldertech/refinery/smelter(drop_location()) + qdel(src) + uses-- diff --git a/code/modules/mining/boulder_processing/boulder.dm b/code/modules/mining/boulder_processing/boulder.dm index 77260eef088..699358c6adb 100644 --- a/code/modules/mining/boulder_processing/boulder.dm +++ b/code/modules/mining/boulder_processing/boulder.dm @@ -12,38 +12,15 @@ throw_range = 2 throw_speed = 0.5 drag_slowdown = 1.5 // It's still a big rock. + ///When a refinery machine is working on this boulder, we'll set this. Re reset when the process is finished, but the boulder may still be refined/operated on further. - var/obj/machinery/bouldertech/processed_by = null + var/obj/machinery/processed_by = null /// How many steps of refinement this boulder has gone through. Starts at 5-8, goes down one each machine process. var/durability = 5 /// What was the size of the boulder when it was spawned? This is used for inheiriting the icon_state. var/boulder_size = BOULDER_SIZE_SMALL /// Used in inheriting the icon_state from our parent vent in update_icon. var/boulder_string = "boulder" - /// Cooldown used to prevents boulders from getting processed back into a machine immediately after being processed. - COOLDOWN_DECLARE(processing_cooldown) - - /// Static list of all minerals to populate gulag boulders with. - var/list/static/gulag_minerals = list( - /datum/material/diamond = 1, - /datum/material/gold = 8, - /datum/material/iron = 95, - /datum/material/plasma = 30, - /datum/material/silver = 20, - /datum/material/titanium = 8, - /datum/material/uranium = 3, - ) - /// Static list of all minerals to populate gulag boulders with, but with bluespace added where safe. - var/list/static/expanded_gulag_minerals = list( - /datum/material/bluespace = 1, - /datum/material/diamond = 1, - /datum/material/gold = 8, - /datum/material/iron = 94, - /datum/material/plasma = 30, - /datum/material/silver = 20, - /datum/material/titanium = 8, - /datum/material/uranium = 3, - ) /obj/item/boulder/Initialize(mapload) . = ..() @@ -55,18 +32,37 @@ processed_by = null return ..() +/obj/item/boulder/add_context(atom/source, list/context, obj/item/held_item, mob/living/user) + if(held_item?.tool_behaviour == TOOL_MINING || HAS_TRAIT(user, TRAIT_BOULDER_BREAKER)) + context[SCREENTIP_CONTEXT_RMB] = "Crush boulder into ore" + return CONTEXTUAL_SCREENTIP_SET + /obj/item/boulder/examine(mob/user) . = ..() . += span_notice("This boulder would take [durability] more steps to refine or break.") + if(HAS_TRAIT(user, TRAIT_BOULDER_BREAKER)) + . += span_notice("You can crush this boulder with your bare hands.") /obj/item/boulder/examine_more(mob/user) . = ..() . += span_notice("[span_bold("Boulders")] can either be cracked open by [span_bold("mining tools")], or processed into sheets with [span_bold("refineries or smelters")]. Undisturbed boulders can be collected by the [span_bold("BRM")].") -/obj/item/boulder/add_context(atom/source, list/context, obj/item/held_item, mob/living/user) - if(held_item?.tool_behaviour == TOOL_MINING || HAS_TRAIT(user, TRAIT_BOULDER_BREAKER)) - context[SCREENTIP_CONTEXT_RMB] = "Crush boulder into ore" - return CONTEXTUAL_SCREENTIP_SET +/obj/item/boulder/update_icon_state() + . = ..() + switch(boulder_size) + if(BOULDER_SIZE_SMALL) + icon_state = "[boulder_string]_small" + if(BOULDER_SIZE_MEDIUM) + icon_state = "[boulder_string]_medium" + if(BOULDER_SIZE_LARGE) + icon_state = "[boulder_string]_large" + else + icon_state = "[boulder_string]_small" + +/obj/item/boulder/CanAllowThrough(atom/movable/mover, border_dir) + . = ..() + if(istype(mover, /obj/item/boulder)) //This way, boulders can only go one at a time on conveyor belts, but everyone else can go through. + return FALSE /obj/item/boulder/attack_self(mob/user, list/modifiers) . = ..() @@ -84,11 +80,6 @@ manual_process(null, user, INATE_BOULDER_SPEED_MULTIPLIER) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN -/obj/item/boulder/CanAllowThrough(atom/movable/mover, border_dir) - . = ..() - if(istype(mover, /obj/item/boulder)) //This way, boulders can only go one at a time on conveyor belts, but everyone else can go through. - return FALSE - /obj/item/boulder/attackby_secondary(obj/item/weapon, mob/user, params) . = ..() if(HAS_TRAIT(user, TRAIT_BOULDER_BREAKER) || HAS_TRAIT(weapon, TRAIT_BOULDER_BREAKER)) @@ -107,18 +98,6 @@ manual_process(null, user, INATE_BOULDER_SPEED_MULTIPLIER) //A little hacky but it works around the speed of the blackboard task selection process for now. return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN -/obj/item/boulder/update_icon_state() - . = ..() - switch(boulder_size) - if(BOULDER_SIZE_SMALL) - icon_state = "[boulder_string]_small" - if(BOULDER_SIZE_MEDIUM) - icon_state = "[boulder_string]_medium" - if(BOULDER_SIZE_LARGE) - icon_state = "[boulder_string]_large" - else - icon_state = "[boulder_string]_small" - /** * This is called when a boulder is processed by a mob or tool, and reduces the durability of the boulder. * @param obj/item/weapon The weapon that is being used to process the boulder, that we pull toolspeed from. If null, we use the override_speed_multiplier instead. @@ -185,104 +164,12 @@ cracked_ore = new cracked_ore_type (drop_location(), quantity) SSblackbox.record_feedback("tally", "ore_mined", quantity, cracked_ore) -/** - * Handles the boulder's processing cooldown to check if it's ready to be processed again. - */ -/obj/item/boulder/proc/can_get_processed() - return COOLDOWN_FINISHED(src, processing_cooldown) - -/** - * Starts the boulder's processing cooldown. - */ -/obj/item/boulder/proc/restart_processing_cooldown() - COOLDOWN_START(src, processing_cooldown, 2 SECONDS) - -/** - * Moves boulder contents to the drop location, and then deletes the boulder. - */ +///Moves boulder contents to the drop location, and then deletes the boulder. /obj/item/boulder/proc/break_apart() - var/list/quips = list("Clang!", "Crack!", "Bang!", "Clunk!", "Clank!") if(length(contents)) + var/list/quips = list("Clang!", "Crack!", "Bang!", "Clunk!", "Clank!") visible_message(span_notice("[pick(quips)] Something falls out of \the [src]!")) playsound(loc, 'sound/effects/picaxe1.ogg', 60, FALSE) for(var/obj/item/content as anything in contents) content.forceMove(get_turf(src)) qdel(src) - -/** - * This is called when a boulder is spawned from a vent, and is used to set the boulder's icon as well as durability. - * We also set our boulder_size variable, which is used for inheiriting the icon_state later on if processed. - * @param obj/structure/ore_vent/parent_vent The vent that spawned this boulder to generate consistent boulder icons. If null, we use the default size. - * @param size The size of the boulder to spawn. If parent_vent is defined, this is ignored. - * @param is_artifact Whether or not this boulder is an artifact boulder. If true, we use the artifact boulder icon state regardless of size. - */ -/obj/item/boulder/proc/flavor_boulder(obj/structure/ore_vent/parent_vent, size = BOULDER_SIZE_SMALL, is_artifact = FALSE) - var/durability_min = size - var/durability_max = size + BOULDER_SIZE_SMALL - if(parent_vent) - durability_min = parent_vent.boulder_size - durability_max = parent_vent.boulder_size + BOULDER_SIZE_SMALL - durability = rand(durability_min, durability_max) //randomize durability a bit for some flavor. - boulder_size = size - if(parent_vent) - boulder_size = parent_vent.boulder_size - boulder_string = parent_vent.boulder_icon_state - update_appearance(UPDATE_ICON_STATE) - -/** - * Unique proc for gulag-style boulders, which adds a random amount of minerals to the boulder. - */ -/obj/item/boulder/proc/add_gulag_minerals() - var/datum/material/new_material = pick_weight(gulag_minerals) - var/list/new_mats = list() - new_mats[new_material] = SHEET_MATERIAL_AMOUNT * rand(1,3) //We only want a few sheets of material in the gulag boulders - set_custom_materials(new_mats) - -/obj/item/boulder/artifact - name = "artifact boulder" - desc = "This boulder is brimming with strange energy. Cracking it open could contain something unusual for science." - icon_state = "boulder_artifact" - /// This is the type of item that will be inside the boulder. Default is a strange object. - var/artifact_type = /obj/item/relic - /// References to the relic inside the boulder, if any. - var/obj/item/artifact_inside - -/obj/item/boulder/artifact/Initialize(mapload) - . = ..() - artifact_inside = new artifact_type(src) /// This could be poggers for archaeology in the future. - -/obj/item/boulder/artifact/Destroy(force) - QDEL_NULL(artifact_inside) - return ..() - -/obj/item/boulder/artifact/convert_to_ore() - . = ..() - artifact_inside.forceMove(drop_location()) - artifact_inside = null - -/obj/item/boulder/artifact/break_apart() - artifact_inside = null - return ..() - - -/obj/item/boulder/gulag - name = "low-quality boulder" - desc = "This rocks. It's a low quality boulder, so it's probably not worth as much." - -/obj/item/boulder/gulag/Initialize(mapload) - . = ..() - add_gulag_minerals(gulag_minerals) - -/obj/item/boulder/gulag_expanded - name = "low-density boulder" - desc = "This rocks. It's not very well packed, and can't contain as many minerals." - -/obj/item/boulder/gulag_expanded/Initialize(mapload) - . = ..() - add_gulag_minerals(expanded_gulag_minerals) - -/obj/item/boulder/shabby - name = "shabby boulder" - desc = "A bizzare, twisted boulder. Wait, wait no, it's just a rock." - custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 1.1, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 1.1) - durability = 1 diff --git a/code/modules/mining/boulder_processing/boulder_types.dm b/code/modules/mining/boulder_processing/boulder_types.dm new file mode 100644 index 00000000000..08ed961404c --- /dev/null +++ b/code/modules/mining/boulder_processing/boulder_types.dm @@ -0,0 +1,76 @@ +///Boulders with special artificats that can give higher mining points +/obj/item/boulder/artifact + name = "artifact boulder" + desc = "This boulder is brimming with strange energy. Cracking it open could contain something unusual for science." + icon_state = "boulder_artifact" + /// This is the type of item that will be inside the boulder. Default is a strange object. + var/artifact_type = /obj/item/relic + /// References to the relic inside the boulder, if any. + var/obj/item/artifact_inside + +/obj/item/boulder/artifact/Initialize(mapload) + . = ..() + artifact_inside = new artifact_type(src) /// This could be poggers for archaeology in the future. + +/obj/item/boulder/artifact/Destroy(force) + QDEL_NULL(artifact_inside) + return ..() + +/obj/item/boulder/artifact/convert_to_ore() + . = ..() + artifact_inside.forceMove(drop_location()) + artifact_inside = null + +/obj/item/boulder/artifact/break_apart() + artifact_inside = null + return ..() + +///Boulders usually spawned in lavaland labour camp area +/obj/item/boulder/gulag + name = "low-quality boulder" + desc = "This rocks. It's a low quality boulder, so it's probably not worth as much." + +/obj/item/boulder/gulag/Initialize(mapload) + . = ..() + + /// Static list of all minerals to populate gulag boulders with. + var/list/static/gulag_minerals = list( + /datum/material/diamond = 1, + /datum/material/gold = 8, + /datum/material/iron = 95, + /datum/material/plasma = 30, + /datum/material/silver = 20, + /datum/material/titanium = 8, + /datum/material/uranium = 3, + ) + + set_custom_materials(list(pick_weight(gulag_minerals) = SHEET_MATERIAL_AMOUNT * rand(1, 3))) + +///Boulders usually spawned in lavaland labour camp area but with bluespace material +/obj/item/boulder/gulag_expanded + name = "low-density boulder" + desc = "This rocks. It's not very well packed, and can't contain as many minerals." + +/obj/item/boulder/gulag_expanded/Initialize(mapload) + . = ..() + + /// Static list of all minerals to populate gulag boulders with, but with bluespace added where safe. + var/list/static/expanded_gulag_minerals = list( + /datum/material/bluespace = 1, + /datum/material/diamond = 1, + /datum/material/gold = 8, + /datum/material/iron = 94, + /datum/material/plasma = 30, + /datum/material/silver = 20, + /datum/material/titanium = 8, + /datum/material/uranium = 3, + ) + + set_custom_materials(list(pick_weight(expanded_gulag_minerals) = SHEET_MATERIAL_AMOUNT * rand(1, 3))) + +///lowgrade boulder, most commonly spawned +/obj/item/boulder/shabby + name = "shabby boulder" + desc = "A bizzare, twisted boulder. Wait, wait no, it's just a rock." + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 1.1, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 1.1) + durability = 1 diff --git a/code/modules/mining/boulder_processing/brm.dm b/code/modules/mining/boulder_processing/brm.dm index c76ec9dabbd..e4d525bff05 100644 --- a/code/modules/mining/boulder_processing/brm.dm +++ b/code/modules/mining/boulder_processing/brm.dm @@ -1,53 +1,183 @@ +///Sound played when boulders are teleported manually by hand #define MANUAL_TELEPORT_SOUND 'sound/machines/mining/manual_teleport.ogg' +///Sound played when boulders are teleported automatically in process() #define AUTO_TELEPORT_SOUND 'sound/machines/mining/auto_teleport.ogg' +///Time taken to spawn a boulder, also the cooldown applied before the next manual teleportation +#define TELEPORTATION_TIME (1.5 SECONDS) +///Cooldown for automatic teleportation after processing boulders_processing_max number of boulders +#define BATCH_COOLDOWN (3 SECONDS) +///Special case when we are trying to teleport a boulder but there is already another boulder in our loc +#define TURF_BLOCKED_BY_BOULDER -1 -/obj/machinery/bouldertech/brm +/obj/machinery/brm name = "boulder retrieval matrix" desc = "A teleportation matrix used to retrieve boulders excavated by mining NODEs from ore vents." + icon = 'icons/obj/machines/mining_machines.dmi' icon_state = "brm" + active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 0.5 circuit = /obj/item/circuitboard/machine/brm - usage_sound = MANUAL_TELEPORT_SOUND processing_flags = START_PROCESSING_MANUALLY - boulders_held_max = 2 + anchored = TRUE + density = TRUE + + /// How many boulders can we process maximum per loop? + var/boulders_processing_max = 1 /// Are we trying to actively collect boulders automatically? var/toggled_on = FALSE - /// How long does it take to collect a boulder? - var/teleportation_time = 1.5 SECONDS + ///Have we finished processing a full batch of boulders + var/batch_processing = FALSE + /// Cooldown used for left click teleportation. COOLDOWN_DECLARE(manual_teleport_cooldown) + /// Cooldown used for automatic teleportation after processing boulders_processing_max number of boulders. + COOLDOWN_DECLARE(batch_start_cooldown) + +/obj/machinery/brm/Initialize(mapload) + . = ..() + register_context() + +/obj/machinery/brm/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = CONTEXTUAL_SCREENTIP_SET + + if(isnull(held_item)) + context[SCREENTIP_CONTEXT_LMB] = "Teleport single boulder" + context[SCREENTIP_CONTEXT_RMB] = "Toggle [toggled_on ? "Off" : "On"] automatic boulder retrieval" + return + + if(!isnull(held_item)) + if(held_item.tool_behaviour == TOOL_WRENCH) + context[SCREENTIP_CONTEXT_LMB] = "[anchored ? "" : "Un"] Anchor" + return + if(held_item.tool_behaviour == TOOL_SCREWDRIVER) + context[SCREENTIP_CONTEXT_LMB] = "[panel_open ? "Close" : "Open"] Panel" + return -/obj/machinery/bouldertech/brm/Initialize(mapload) + if(panel_open) + if(held_item.tool_behaviour == TOOL_CROWBAR) + context[SCREENTIP_CONTEXT_LMB] = "Deconstruct" + + return CONTEXTUAL_SCREENTIP_SET + +/obj/machinery/brm/examine(mob/user) . = ..() - set_wires(new /datum/wires/brm(src)) + . += span_notice("The small screen reads there are [span_boldnotice("[SSore_generation.available_boulders.len] boulders")] available to teleport.") + . += span_notice("Can collect upto [boulders_processing_max] boulders at a time.") + . += span_notice("Automatic boulder retrival can be toggled [EXAMINE_HINT("[toggled_on ? "Off" : "On"]")] with [EXAMINE_HINT("Right Click")].") + + if(anchored) + . += span_notice("Its [EXAMINE_HINT("anchored")] in place.") + else + . += span_warning("It needs to be [EXAMINE_HINT("anchored")] to start operations.") + + . += span_notice("Its maintainence panel can be [EXAMINE_HINT("screwed")] [panel_open ? "Closed" : "Open"].") + + if(panel_open) + . += span_notice("The whole machine can be [EXAMINE_HINT("pried")] apart.") -/obj/machinery/bouldertech/brm/Destroy() - QDEL_NULL(wires) +/obj/machinery/brm/update_icon_state() + icon_state = initial(icon_state) + + if(!anchored || !is_operational || machine_stat & (BROKEN | NOPOWER) || panel_open) + icon_state = "[icon_state]-off" + return + + if(toggled_on) + icon_state = "[icon_state]-toggled" + return + + return ..() + +/obj/machinery/brm/wrench_act(mob/living/user, obj/item/tool) + . = ITEM_INTERACT_BLOCKING + if(default_unfasten_wrench(user, tool, time = 1.5 SECONDS) == SUCCESSFUL_UNFASTEN) + update_appearance(UPDATE_ICON_STATE) + return ITEM_INTERACT_SUCCESS + +/obj/machinery/brm/screwdriver_act(mob/living/user, obj/item/tool) + . = ITEM_INTERACT_BLOCKING + if(default_deconstruction_screwdriver(user, "[initial(icon_state)]-off", initial(icon_state), tool)) + update_appearance(UPDATE_ICON_STATE) + return ITEM_INTERACT_SUCCESS + +/obj/machinery/brm/crowbar_act(mob/living/user, obj/item/tool) + . = ITEM_INTERACT_BLOCKING + if(default_deconstruction_crowbar(tool)) + return ITEM_INTERACT_SUCCESS + +///To allow boulders on a conveyer belt to move unobstructed if multiple machines are made on a single line +/obj/machinery/brm/CanAllowThrough(atom/movable/mover, border_dir) + if(!anchored) + return FALSE + if(istype(mover, /obj/item/boulder)) + return TRUE return ..() -/obj/machinery/bouldertech/brm/attack_hand(mob/living/user, list/modifiers) +/obj/machinery/brm/RefreshParts() . = ..() + + boulders_processing_max = 0 + for(var/datum/stock_part/part in component_parts) + boulders_processing_max += part.tier + + boulders_processing_max = ROUND_UP((boulders_processing_max / 12) * 7) + +/obj/machinery/brm/attack_hand(mob/living/user, list/modifiers) + . = ..() + if(. || panel_open) + return if(!handle_teleport_conditions(user)) return - pre_collect_boulder() - COOLDOWN_START(src, manual_teleport_cooldown, teleportation_time) + var/result = pre_collect_boulder() + if(result == TURF_BLOCKED_BY_BOULDER) + balloon_alert(user, "no space") + else if(result) + balloon_alert(user, "teleporting") + COOLDOWN_START(src, manual_teleport_cooldown, TELEPORTATION_TIME) + + return TRUE + +/** + * Handles qualifiers for enabling teleportation of boulders. + * Returns TRUE if the teleportation can proceed, FALSE otherwise. + * Arguments + * + * * mob/user - the mob to inform if conditions aren't met + */ +/obj/machinery/brm/proc/handle_teleport_conditions(mob/user) + PRIVATE_PROC(TRUE) + + if(!COOLDOWN_FINISHED(src, manual_teleport_cooldown)) + return FALSE + if(panel_open) + balloon_alert(user, "close panel first!") + return FALSE + if(batch_processing) + balloon_alert(user, "batch still processing!") + return FALSE + playsound(src, MANUAL_TELEPORT_SOUND, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + return TRUE -/obj/machinery/bouldertech/brm/attack_robot(mob/user) +/obj/machinery/brm/attack_robot(mob/user) + . = ..() + if(. || panel_open) + return if(!handle_teleport_conditions(user)) return - pre_collect_boulder() - COOLDOWN_START(src, manual_teleport_cooldown, teleportation_time) + var/result = pre_collect_boulder() + if(result == TURF_BLOCKED_BY_BOULDER) + balloon_alert(user, "no space") + else if(result) + balloon_alert(user, "teleporting") -/obj/machinery/bouldertech/brm/attackby(obj/item/attacking_item, mob/user, params) - if(is_wire_tool(attacking_item) && panel_open) - wires.interact(user) - return TRUE - return ..() + COOLDOWN_START(src, manual_teleport_cooldown, TELEPORTATION_TIME) + + return TRUE -/obj/machinery/bouldertech/brm/attack_hand_secondary(mob/user, list/modifiers) +/obj/machinery/brm/attack_hand_secondary(mob/user, list/modifiers) . = ..() - if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) + if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN || panel_open) return if(!anchored) balloon_alert(user, "anchor first!") @@ -55,133 +185,107 @@ toggle_auto_on(user) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN -/obj/machinery/bouldertech/brm/attack_robot_secondary(mob/user, list/modifiers) +/** + * Toggles automatic boulder retrieval on. + * Adjusts the teleportation sound, icon state, and begins processing. + * Arguments + * + * * mob/user - the player who has toggled us + */ +/obj/machinery/brm/proc/toggle_auto_on(mob/user) + PRIVATE_PROC(TRUE) + + if(panel_open) + balloon_alert(user, "close panel first!") + return + if(!anchored) + balloon_alert(user, "anchor first!") + return + if(!is_operational || machine_stat & (BROKEN | NOPOWER)) + return + + toggled_on = ! toggled_on + if(toggled_on) + begin_processing() + else + end_processing() + update_appearance(UPDATE_ICON_STATE) + +/obj/machinery/brm/attack_robot_secondary(mob/user, list/modifiers) . = ..() - if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) + if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN || panel_open) return if(!anchored) balloon_alert(user, "anchor first!") return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + toggle_auto_on(user) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN -/obj/machinery/bouldertech/brm/process() - if(SSore_generation.available_boulders.len < 1) - say("No boulders to collect. Entering idle mode.") - toggled_on = FALSE - update_appearance(UPDATE_ICON_STATE) - return PROCESS_KILL - for(var/i in 1 to boulders_processing_max) - if(pre_collect_boulder()) - continue - toggled_on = FALSE - update_appearance(UPDATE_ICON_STATE) - return PROCESS_KILL - for(var/obj/item/boulder/ground_rocks in loc.contents) - boulders_contained += ground_rocks - if(boulders_contained.len < boulders_held_max) - continue - toggled_on = FALSE - boulders_contained.Cut() - update_appearance(UPDATE_ICON_STATE) +/obj/machinery/brm/process() + if(!toggled_on) return PROCESS_KILL -/obj/machinery/bouldertech/brm/add_context(atom/source, list/context, obj/item/held_item, mob/user) - . = ..() - context[SCREENTIP_CONTEXT_LMB] = "Teleport single boulder" - context[SCREENTIP_CONTEXT_RMB] = "Toggle automatic boulder retrieval" - return CONTEXTUAL_SCREENTIP_SET - -/obj/machinery/bouldertech/brm/examine(mob/user) - . = ..() - . += span_notice("The small screen reads there are [span_boldnotice("[SSore_generation.available_boulders.len] boulders")] available to teleport.") - -/obj/machinery/bouldertech/brm/RefreshParts() - . = ..() - var/scanner_stack = 0 - var/laser_stack = 0 - for(var/datum/stock_part/scanning_module/scanner in component_parts) - scanner_stack += scanner.tier - boulders_processing_max = scanner_stack - for(var/datum/stock_part/micro_laser/laser in component_parts) - laser_stack += laser.tier - boulders_held_max = laser_stack + 1 - -/obj/machinery/bouldertech/brm/update_icon_state() - if(toggled_on && !panel_open) - icon_state = "[initial(icon_state)]-toggled" + //have some cooldown after processing the previous batch of boulders + if(batch_processing || !COOLDOWN_FINISHED(src, batch_start_cooldown)) return - return ..() -/** - * Handles qualifiers for enabling teleportation of boulders. - * Returns TRUE if the teleportation can proceed, FALSE otherwise. - */ -/obj/machinery/bouldertech/brm/proc/handle_teleport_conditions(mob/user) - if(!COOLDOWN_FINISHED(src, manual_teleport_cooldown)) - return FALSE - if(panel_open) - balloon_alert(user, "close panel first!") - return FALSE - playsound(src, MANUAL_TELEPORT_SOUND, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - return TRUE + pre_collect_boulder(FALSE, boulders_processing_max) /** * Begins to collect a boulder from the available boulders list in SSore_generation. - * Boulders must not be processed by another BRM or machine, and must be in the available boulders list. + * Boulders must be in the available boulders list. * A selected boulder is picked randomly. - * The actual movement is then handled by collect_boulder() after a timed callback. + * Arguments + * + * * feedback - should we play sound and display allert if now boulders are available + * * boulders_remaining - how many boulders we want to try & collect spawning a boulder every TELEPORTATION_TIME seconds */ -/obj/machinery/bouldertech/brm/proc/pre_collect_boulder() - if(!SSore_generation.available_boulders.len) - playsound(loc, 'sound/machines/synth_no.ogg', 30 , TRUE) - balloon_alert_to_viewers("no boulders to collect!") - return FALSE //Nothing to collect - var/obj/item/boulder/random_boulder = pick(SSore_generation.available_boulders) - if(random_boulder.processed_by) +/obj/machinery/brm/proc/pre_collect_boulder(feedback = TRUE, boulders_remaining = 1) + PRIVATE_PROC(TRUE) + + batch_processing = TRUE + + //not within operation parameters + if(!anchored || panel_open || !is_operational || machine_stat & (BROKEN | NOPOWER)) + batch_processing = FALSE return FALSE - random_boulder.processed_by = src - random_boulder.Shake(duration = 1.5 SECONDS) - SSore_generation.available_boulders -= random_boulder - addtimer(CALLBACK(src, PROC_REF(collect_boulder), random_boulder), 1.5 SECONDS) - return TRUE + //There is an boulder in our loc. it has be removed so we don't clog up our loc with even more boulders + if(locate(/obj/item/boulder) in loc) + batch_processing = FALSE + return TURF_BLOCKED_BY_BOULDER -/** - * Collects a boulder from the available boulders list in SSore_generation. - * Handles the movement of the boulder as well as visual effects on the BRM. - * @param obj/item/boulder/random_boulder The boulder to collect. - */ -/obj/machinery/bouldertech/brm/proc/collect_boulder(obj/item/boulder/random_boulder) - flick("brm-flash", src) - if(QDELETED(random_boulder)) - playsound(loc, 'sound/machines/synth_no.ogg', 30 , TRUE) - balloon_alert_to_viewers("target lost!") + //no more boulders + if(!SSore_generation.available_boulders.len) + if(feedback) + playsound(loc, 'sound/machines/synth_no.ogg', 30 , TRUE) + balloon_alert_to_viewers("no boulders to collect!") + batch_processing = FALSE return FALSE - playsound(src, AUTO_TELEPORT_SOUND, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + + //pick & spawn the boulder + flick("brm-flash", src) + playsound(src, toggled_on ? AUTO_TELEPORT_SOUND : MANUAL_TELEPORT_SOUND, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + var/obj/item/boulder/random_boulder = pick(SSore_generation.available_boulders) + SSore_generation.available_boulders -= random_boulder random_boulder.forceMove(drop_location()) - random_boulder.processed_by = null random_boulder.pixel_x = rand(-2, 2) random_boulder.pixel_y = rand(-2, 2) balloon_alert_to_viewers("boulder appears!") - random_boulder.visible_message(span_warning("[random_boulder] suddenly appears!")) - use_power(BASE_MACHINE_ACTIVE_CONSUMPTION * 0.1) - return TRUE + use_power(active_power_usage) -/** - * Toggles automatic boulder retrieval on. - * Adjusts the teleportation sound, icon state, and begins processing. - * @param mob/user The user who toggled the BRM. - */ -/obj/machinery/bouldertech/brm/proc/toggle_auto_on(mob/user) - if(panel_open) - if(user) - balloon_alert(user, "close panel first!") - return - toggled_on = TRUE - START_PROCESSING(SSmachines, src) - update_appearance(UPDATE_ICON_STATE) - usage_sound = AUTO_TELEPORT_SOUND + //try again if we have more boulders to work with + boulders_remaining -= 1 + if(boulders_remaining <= 0) + COOLDOWN_START(src, batch_start_cooldown, BATCH_COOLDOWN) + batch_processing = FALSE + return TRUE + else + addtimer(CALLBACK(src, PROC_REF(pre_collect_boulder), feedback, boulders_remaining, FALSE), TELEPORTATION_TIME) #undef MANUAL_TELEPORT_SOUND #undef AUTO_TELEPORT_SOUND +#undef TELEPORTATION_TIME +#undef BATCH_COOLDOWN +#undef TURF_BLOCKED_BY_BOULDER diff --git a/code/modules/mining/boulder_processing/refinery.dm b/code/modules/mining/boulder_processing/refinery.dm index a6c6c2e7dfc..662bb3e75e1 100644 --- a/code/modules/mining/boulder_processing/refinery.dm +++ b/code/modules/mining/boulder_processing/refinery.dm @@ -7,44 +7,34 @@ name = "boulder refinery" desc = "BR for short. Accepts boulders and refines non-metallic ores into sheets using internal chemicals." icon_state = "stacker" - holds_minerals = TRUE - processable_materials = list( - /datum/material/glass, - /datum/material/plasma, - /datum/material/diamond, - /datum/material/bluespace, - /datum/material/bananium, - /datum/material/plastic, - ) circuit = /obj/item/circuitboard/machine/refinery usage_sound = 'sound/machines/mining/refinery.ogg' - holds_mining_points = TRUE + action = "crushing" -/// okay so var that holds mining points to claim -/// add total of pts from minerals mined in parent proc -/// then, little mini UI showing points to collect? +/obj/machinery/bouldertech/refinery/can_process_material(datum/material/possible_mat) + var/static/list/processable_materials + if(!length(processable_materials)) + processable_materials = list( + /datum/material/glass, + /datum/material/plasma, + /datum/material/diamond, + /datum/material/bluespace, + /datum/material/bananium, + /datum/material/plastic, + ) + return is_type_in_list(possible_mat, processable_materials) /obj/machinery/bouldertech/refinery/RefreshParts() . = ..() - var/manipulator_stack = 0 - var/matter_bin_stack = 0 - for(var/datum/stock_part/servo/servo in component_parts) - manipulator_stack += servo.tier - 1 - boulders_processing_max = clamp(manipulator_stack, 1, 6) - for(var/datum/stock_part/matter_bin/bin in component_parts) - matter_bin_stack += bin.tier - boulders_held_max = matter_bin_stack - -/obj/machinery/bouldertech/refinery/add_context(atom/source, list/context, obj/item/held_item, mob/user) - . = ..() - if(istype(held_item, /obj/item/boulder)) - context[SCREENTIP_CONTEXT_LMB] = "Insert boulder" - if(istype(held_item, /obj/item/card/id) && points_held > 0) - context[SCREENTIP_CONTEXT_LMB] = "Claim mining points" - context[SCREENTIP_CONTEXT_RMB] = "Remove boulder" - return CONTEXTUAL_SCREENTIP_SET + boulders_held_max = 0 + for(var/datum/stock_part/matter_bin/bin in component_parts) + boulders_held_max += bin.tier + boulders_processing_count = 0 + for(var/datum/stock_part/servo/servo in component_parts) + boulders_processing_count += servo.tier + boulders_processing_count = ROUND_UP((boulders_processing_count / 8) * boulders_held_max) /** * Your other new favorite industrial waste magnet! @@ -55,36 +45,43 @@ name = "boulder smelter" desc = "BS for short. Accept boulders and refines metallic ores into sheets." icon_state = "smelter" - processable_materials = list( - /datum/material/iron, - /datum/material/titanium, - /datum/material/silver, - /datum/material/gold, - /datum/material/uranium, - /datum/material/mythril, - /datum/material/adamantine, - /datum/material/runite, - ) - light_system = MOVABLE_LIGHT - light_range = 1 - light_power = 2 + light_system = OVERLAY_LIGHT + light_range = 2 + light_power = 3 light_color = "#ffaf55" - light_on = FALSE circuit = /obj/item/circuitboard/machine/smelter usage_sound = 'sound/machines/mining/smelter.ogg' + action = "smelting" -/obj/machinery/bouldertech/refinery/smelter/RefreshParts() +/obj/machinery/bouldertech/refinery/smelter/Initialize(mapload) . = ..() - light_power = boulders_processing_max + set_light_on(TRUE) + +/obj/machinery/bouldertech/refinery/smelter/can_process_material(datum/material/possible_mat) + var/static/list/processable_materials + if(!length(processable_materials)) + processable_materials = list( + /datum/material/iron, + /datum/material/titanium, + /datum/material/silver, + /datum/material/gold, + /datum/material/uranium, + ) + return is_type_in_list(possible_mat, processable_materials) -/obj/machinery/bouldertech/refinery/smelter/accept_boulder(obj/item/boulder/new_boulder) +/obj/machinery/bouldertech/refinery/smelter/set_light_on(new_value) + if(panel_open || !anchored || !is_operational || machine_stat & (BROKEN | NOPOWER)) + new_value = FALSE + return ..() + +/obj/machinery/bouldertech/refinery/default_deconstruction_screwdriver(mob/user, icon_state_open, icon_state_closed, obj/item/screwdriver) . = ..() - if(.) - set_light_on(TRUE) - return TRUE + set_light_on(TRUE) -/obj/machinery/bouldertech/refinery/smelter/process() +/obj/machinery/bouldertech/refinery/default_unfasten_wrench(mob/user, obj/item/wrench, time) . = ..() - if(. == PROCESS_KILL) - set_light_on(FALSE) + set_light_on(TRUE) + +/obj/machinery/bouldertech/refinery/smelter/on_set_is_operational(old_value) + set_light_on(TRUE) diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm index add06da08a6..e1df98239e2 100644 --- a/code/modules/mining/equipment/kinetic_crusher.dm +++ b/code/modules/mining/equipment/kinetic_crusher.dm @@ -21,7 +21,7 @@ sharpness = SHARP_EDGED actions_types = list(/datum/action/item_action/toggle_light) obj_flags = UNIQUE_RENAME - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 5 light_on = FALSE var/list/trophies = list() diff --git a/code/modules/mining/equipment/monster_organs/monster_organ.dm b/code/modules/mining/equipment/monster_organs/monster_organ.dm index d8e4bfae986..135373469d8 100644 --- a/code/modules/mining/equipment/monster_organs/monster_organ.dm +++ b/code/modules/mining/equipment/monster_organs/monster_organ.dm @@ -143,7 +143,7 @@ return . | AFTERATTACK_PROCESSED_ITEM /obj/item/organ/internal/monster_core/attack_self(mob/user) - if (!user.can_perform_action(src, FORBID_TELEKINESIS_REACH)) + if (!user.can_perform_action(src, FORBID_TELEKINESIS_REACH|ALLOW_RESTING)) return try_apply(user, user) diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm index c221e78d690..f4463434066 100644 --- a/code/modules/mining/equipment/survival_pod.dm +++ b/code/modules/mining/equipment/survival_pod.dm @@ -37,35 +37,83 @@ . += "This capsule has the [template.name] stored." . += template.description -/obj/item/survivalcapsule/attack_self() +/obj/item/survivalcapsule/interact(mob/user) + . = ..() + if(.) + return . + //Can't grab when capsule is New() because templates aren't loaded then get_template() - if(!used) - loc.visible_message(span_warning("\The [src] begins to shake. Stand back!")) - used = TRUE - sleep(5 SECONDS) - var/turf/deploy_location = get_turf(src) - var/status = template.check_deploy(deploy_location) - switch(status) - if(SHELTER_DEPLOY_BAD_AREA) - src.loc.visible_message(span_warning("\The [src] will not function in this area.")) - if(SHELTER_DEPLOY_BAD_TURFS, SHELTER_DEPLOY_ANCHORED_OBJECTS, SHELTER_DEPLOY_OUTSIDE_MAP) - var/width = template.width - var/height = template.height - src.loc.visible_message(span_warning("\The [src] doesn't have room to deploy! You need to clear a [width]x[height] area!")) - if(status != SHELTER_DEPLOY_ALLOWED) - used = FALSE - return - - template.load(deploy_location, centered = TRUE) - var/turf/T = deploy_location - if(!is_mining_level(T.z)) //only report capsules away from the mining/lavaland level - message_admins("[ADMIN_LOOKUPFLW(usr)] activated a bluespace capsule away from the mining level! [ADMIN_VERBOSEJMP(T)]") - log_admin("[key_name(usr)] activated a bluespace capsule away from the mining level at [AREACOORD(T)]") - - playsound(src, 'sound/effects/phasein.ogg', 100, TRUE) - new /obj/effect/particle_effect/fluid/smoke(get_turf(src)) - qdel(src) + if(used) + return FALSE + + loc.visible_message(span_warning("[src] begins to shake. Stand back!")) + used = TRUE + addtimer(CALLBACK(src, PROC_REF(expand), user), 5 SECONDS) + return TRUE + +/// Expands the capsule into a full shelter, placing the template at the item's location (NOT triggerer's location) +/obj/item/survivalcapsule/proc/expand(mob/triggerer) + if(QDELETED(src)) + return + + var/turf/deploy_location = get_turf(src) + var/status = template.check_deploy(deploy_location) + switch(status) + if(SHELTER_DEPLOY_BAD_AREA) + loc.visible_message(span_warning("[src] will not function in this area.")) + if(SHELTER_DEPLOY_BAD_TURFS, SHELTER_DEPLOY_ANCHORED_OBJECTS, SHELTER_DEPLOY_OUTSIDE_MAP) + loc.visible_message(span_warning("[src] doesn't have room to deploy! You need to clear a [template.width]x[template.height] area!")) + + if(status != SHELTER_DEPLOY_ALLOWED) + used = FALSE + return + + yote_nearby(deploy_location) + template.load(deploy_location, centered = TRUE) + trigger_admin_alert(triggerer, deploy_location) + playsound(src, 'sound/effects/phasein.ogg', 100, TRUE) + new /obj/effect/particle_effect/fluid/smoke(get_turf(src)) + qdel(src) + +/// Throws any mobs near the deployed location away from the item / shelter +/// Does some math to make closer mobs get thrown further +/obj/item/survivalcapsule/proc/yote_nearby(turf/deploy_location) + var/width = template.width + var/height = template.height + var/base_x_throw_distance = ceil(width / 2) + var/base_y_throw_distance = ceil(height / 2) + for(var/mob/living/did_not_stand_back in range(loc, "[width]x[height]")) + var/dir_to_center = get_dir(deploy_location, did_not_stand_back) || pick(GLOB.alldirs) + // Aiming to throw the target just enough to get them out of the range of the shelter + // IE: Stronger if they're closer, weaker if they're further away + var/throw_dist = 0 + var/x_component = abs(did_not_stand_back.x - deploy_location.x) + var/y_component = abs(did_not_stand_back.y - deploy_location.y) + if(ISDIAGONALDIR(dir_to_center)) + throw_dist = ceil(sqrt(base_x_throw_distance ** 2 + base_y_throw_distance ** 2) - (sqrt(x_component ** 2 + y_component ** 2))) + else if(dir_to_center & (NORTH|SOUTH)) + throw_dist = base_y_throw_distance - y_component + 1 + else if(dir_to_center & (EAST|WEST)) + throw_dist = base_x_throw_distance - x_component + 1 + + did_not_stand_back.Paralyze(3 SECONDS) + did_not_stand_back.Knockdown(6 SECONDS) + did_not_stand_back.throw_at( + target = get_edge_target_turf(did_not_stand_back, dir_to_center), + range = throw_dist, + speed = 3, + force = MOVE_FORCE_VERY_STRONG, + ) + +/// Logs if the capsule was triggered, by default only if it happened on non-lavaland +/obj/item/survivalcapsule/proc/trigger_admin_alert(mob/triggerer, turf/trigger_loc) + //only report capsules away from the mining/lavaland level + if(is_mining_level(trigger_loc.z)) + return + + message_admins("[ADMIN_LOOKUPFLW(triggerer)] activated a bluespace capsule away from the mining level! [ADMIN_VERBOSEJMP(trigger_loc)]") + log_admin("[key_name(triggerer)] activated a bluespace capsule away from the mining level at [AREACOORD(trigger_loc)]") //Non-default pods diff --git a/code/modules/mining/lavaland/tendril_loot.dm b/code/modules/mining/lavaland/tendril_loot.dm index c84ea668630..1001dd9c897 100644 --- a/code/modules/mining/lavaland/tendril_loot.dm +++ b/code/modules/mining/lavaland/tendril_loot.dm @@ -271,7 +271,7 @@ desc = "Happy to light your way." icon = 'icons/obj/lighting.dmi' icon_state = "orb" - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 7 light_flags = LIGHT_ATTACHED layer = ABOVE_ALL_MOB_LAYER diff --git a/code/modules/mining/machine_silo.dm b/code/modules/mining/machine_silo.dm index 59247be2c0a..9320bc01226 100644 --- a/code/modules/mining/machine_silo.dm +++ b/code/modules/mining/machine_silo.dm @@ -136,8 +136,8 @@ "icon" = icon2base64(icon(initial(parent.icon), initial(parent.icon_state), frame = 1)), "name" = parent.name, "onHold" = !!holds[remote], - "location" = get_area_name(parent, TRUE) - ) + "location" = get_area_name(parent, TRUE), + ) ) data["logs"] = list() @@ -150,7 +150,7 @@ "action" = entry.action, "amount" = entry.amount, "time" = entry.timestamp, - "noun" = entry.noun + "noun" = entry.noun, ) ) diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 085fbca1945..f1d7500a033 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -26,6 +26,10 @@ set_cap = 1 set_luminosity = 1.6 +/obj/effect/light_emitter/fake_outdoors + light_color = COLOR_LIGHT_YELLOW + set_cap = 1 + /**********************Miner Lockers**************************/ /obj/structure/closet/wardrobe/miner diff --git a/code/modules/mining/satchel_ore_box.dm b/code/modules/mining/satchel_ore_box.dm index 7a82b9483a0..3b2a5ce054c 100644 --- a/code/modules/mining/satchel_ore_box.dm +++ b/code/modules/mining/satchel_ore_box.dm @@ -5,58 +5,68 @@ icon = 'icons/obj/mining.dmi' icon_state = "orebox" name = "ore box" - desc = "A heavy wooden box, which can be filled with a lot of ores." + desc = "A heavy wooden box, which can be filled with a lot of ores or boulders" density = TRUE - pressure_resistance = 5*ONE_ATMOSPHERE - -/obj/structure/ore_box/attackby(obj/item/W, mob/user, params) - if (istype(W, /obj/item/stack/ore) || istype(W, /obj/item/boulder)) - if(!user.transferItemToLoc(W, src)) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - else if(W.atom_storage) - W.atom_storage.remove_type(/obj/item/stack/ore, src, INFINITY, TRUE, FALSE, user, null) - to_chat(user, span_notice("You empty the ore in [W] into \the [src].")) - else - return ..() + pressure_resistance = 5 * ONE_ATMOSPHERE -/obj/structure/ore_box/crowbar_act(mob/living/user, obj/item/I) - if(I.use_tool(src, user, 50, volume=50)) - user.visible_message(span_notice("[user] pries \the [src] apart."), - span_notice("You pry apart \the [src]."), - span_hear("You hear splitting wood.")) - deconstruct(TRUE, user) - return TRUE - -/obj/structure/ore_box/examine(mob/living/user) - if(Adjacent(user) && istype(user)) - ui_interact(user) +/obj/structure/ore_box/Initialize(mapload) . = ..() + register_context() -/obj/structure/ore_box/attack_hand(mob/user, list/modifiers) - . = ..() - if(.) +///Dumps all contents of this ore box on the turf +/obj/structure/ore_box/proc/dump_box_contents() + var/drop = drop_location() + for(var/obj/item/weapon in src) + weapon.forceMove(drop) + +/obj/structure/ore_box/deconstruct(disassembled = TRUE) + new /obj/item/stack/sheet/mineral/wood(loc, 4) + + dump_box_contents() + + return ..() + +/obj/structure/ore_box/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = NONE + if(isnull(held_item)) return - if(Adjacent(user)) - ui_interact(user) -/obj/structure/ore_box/attack_robot(mob/user) - if(Adjacent(user)) + if(held_item.tool_behaviour == TOOL_CROWBAR) + context[SCREENTIP_CONTEXT_LMB] = "Deconstruct" + return CONTEXTUAL_SCREENTIP_SET + else if(istype(held_item, /obj/item/stack/ore) || istype(held_item, /obj/item/boulder)) + context[SCREENTIP_CONTEXT_LMB] = "Insert Item" + return CONTEXTUAL_SCREENTIP_SET + else if(held_item.atom_storage) + context[SCREENTIP_CONTEXT_LMB] = "Transfer Contents" + return CONTEXTUAL_SCREENTIP_SET + + +/obj/structure/ore_box/examine(mob/living/user) + . = ..() + if(in_range(src, user) || isobserver(user)) + . += span_notice("Can be [EXAMINE_HINT("pried")] apart.") ui_interact(user) -/obj/structure/ore_box/proc/dump_box_contents() - var/drop = drop_location() - var/turf/our_turf = get_turf(src) - for(var/obj/item/O in src) - if(QDELETED(O)) - continue - if(QDELETED(src)) - break - O.forceMove(drop) - SET_PLANE(O, PLANE_TO_TRUE(O.plane), our_turf) - if(TICK_CHECK) - stoplag() - our_turf = get_turf(src) - drop = drop_location() +/obj/structure/ore_box/crowbar_act(mob/living/user, obj/item/I) + . = ITEM_INTERACT_BLOCKING + if(I.use_tool(src, user, 50, volume = 50)) + user.visible_message(span_notice("[user] pries \the [src] apart."), + span_notice("You pry apart \the [src]."), + span_hear("You hear splitting wood.")) + deconstruct(TRUE) + return ITEM_INTERACT_SUCCESS + +/obj/structure/ore_box/attackby(obj/item/weapon, mob/user, params) + if(istype(weapon, /obj/item/stack/ore) || istype(weapon, /obj/item/boulder)) + user.transferItemToLoc(weapon, src) + return TRUE + else if(weapon.atom_storage) + weapon.atom_storage.remove_type(/obj/item/stack/ore, src, INFINITY, TRUE, FALSE, user, null) + to_chat(user, span_notice("You empty the ore in [weapon] into \the [src].")) + return TRUE + else + return ..() /obj/structure/ore_box/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) @@ -65,43 +75,36 @@ ui.open() /obj/structure/ore_box/ui_data() - var/item_contents = list() - var/boulder_count = 0 + var/list/materials = list() + var/name + var/amount for(var/obj/item/stack/ore/potental_ore as anything in contents) if(istype(potental_ore, /obj/item/stack/ore)) - item_contents[potental_ore.type] += potental_ore.amount + name = potental_ore.name + amount = potental_ore.amount else - boulder_count++ + name = "Boulders" + amount = 1 - var/data = list() + var/item_found = FALSE + for(var/list/item as anything in materials) + if(item["name"] == name) + item_found = TRUE + item["amount"] += amount + break + if(!item_found) + materials += list(list("name" = name, "amount" = amount)) - data["materials"] = list() - - for(var/obj/item/stone as anything in item_contents) - if(ispath(stone, /obj/item/stack/ore)) - var/obj/item/stack/ore/found_ore = stone - var/name = initial(found_ore.name) - data["materials"] += list(list("name" = name, "amount" = item_contents[stone], "id" = type)) - data["boulders"] = boulder_count - return data + return list("materials" = materials) /obj/structure/ore_box/ui_act(action, params) . = ..() if(.) return - if(!Adjacent(usr)) - return - switch(action) - if("removeall") - dump_box_contents() - to_chat(usr, span_notice("You open the release hatch on the box..")) - -/obj/structure/ore_box/deconstruct(disassembled = TRUE, mob/user) - var/obj/item/stack/sheet/mineral/wood/WD = new (loc, 4) - if(user && !QDELETED(WD)) - WD.add_fingerprint(user) - dump_box_contents() - qdel(src) + + if(action == "removeall") + dump_box_contents() + return TRUE /// Special override for notify_contents = FALSE. /obj/structure/ore_box/on_changed_z_level(turf/old_turf, turf/new_turf, same_z_layer, notify_contents = FALSE) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 8bf0424338e..3fdd830f1b8 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -16,7 +16,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) invisibility = INVISIBILITY_OBSERVER hud_type = /datum/hud/ghost movement_type = GROUND | FLYING - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 1 light_power = 2 light_on = FALSE @@ -109,10 +109,10 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) var/datum/species/human_species = body_human.dna.species if(human_species.check_head_flags(HEAD_HAIR)) hairstyle = body_human.hairstyle - hair_color = brighten_color(body_human.hair_color) + hair_color = ghostify_color(body_human.hair_color) if(human_species.check_head_flags(HEAD_FACIAL_HAIR)) facial_hairstyle = body_human.facial_hairstyle - facial_hair_color = brighten_color(body_human.facial_hair_color) + facial_hair_color = ghostify_color(body_human.facial_hair_color) update_appearance() @@ -239,28 +239,23 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) add_overlay(hair_overlay) /* - * Increase the brightness of a color by calculating the average distance between the R, G and B values, - * and maximum brightness, then adding 30% of that average to R, G and B. - * - * I'll make this proc global and move it to its own file in a future update. |- Ricotez - UPDATE: They never did :( + * Increase the brightness of a color and desaturates it slightly to make it suitable for ghosts + * We use HSL for this, makes life SOOO easy */ -/mob/proc/brighten_color(input_color) - var/list/read_color = rgb2num(input_color) - var/r_val = read_color[1] - var/b_val = read_color[2] - var/g_val = read_color[3] - - r_val += (255 - r_val) * 0.4 - if(r_val > 255) - r_val = 255 - g_val += (255 - g_val) * 0.4 - if(g_val > 255) - g_val = 255 - b_val += (255 - b_val) * 0.4 - if(b_val > 255) - b_val = 255 - - return "#" + copytext(rgb(r_val, g_val, b_val), 2) +/proc/ghostify_color(input_color) + var/list/read_color = rgb2num(input_color, COLORSPACE_HSL) + var/sat = read_color[2] + var/lum = read_color[3] + + // Clamp so it still has color, can't get too bright/desaturated + sat -= 15 + if(sat < 30) + sat = min(read_color[2], 30) + + lum += 15 + if(lum > 80) + lum = max(read_color[3], 80) + return rgb(read_color[1], sat, lum, space = COLORSPACE_HSL) /* Transfer_mind is there to check if mob is being deleted/not going to have a body. @@ -863,11 +858,11 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp var/datum/species/species = new species_type if(species.check_head_flags(HEAD_HAIR)) hairstyle = client.prefs.read_preference(/datum/preference/choiced/hairstyle) - hair_color = brighten_color(client.prefs.read_preference(/datum/preference/color/hair_color)) + hair_color = ghostify_color(client.prefs.read_preference(/datum/preference/color/hair_color)) if(species.check_head_flags(HEAD_FACIAL_HAIR)) facial_hairstyle = client.prefs.read_preference(/datum/preference/choiced/facial_hairstyle) - facial_hair_color = brighten_color(client.prefs.read_preference(/datum/preference/color/facial_hair_color)) + facial_hair_color = ghostify_color(client.prefs.read_preference(/datum/preference/color/facial_hair_color)) qdel(species) diff --git a/code/modules/mob/living/basic/basic.dm b/code/modules/mob/living/basic/basic.dm index ba07c944652..d69665d6bcd 100644 --- a/code/modules/mob/living/basic/basic.dm +++ b/code/modules/mob/living/basic/basic.dm @@ -270,17 +270,17 @@ /mob/living/basic/on_fire_stack(seconds_per_tick, datum/status_effect/fire_handler/fire_stacks/fire_handler) adjust_bodytemperature((maximum_survivable_temperature + (fire_handler.stacks * 12)) * 0.5 * seconds_per_tick) -/mob/living/basic/update_fire_overlay(stacks, on_fire, last_icon_state, suffix = "") - var/mutable_appearance/fire_overlay = mutable_appearance('icons/mob/effects/onfire.dmi', "generic_fire") - if(on_fire && isnull(last_icon_state)) - add_overlay(fire_overlay) - return fire_overlay - else if(!on_fire && !isnull(last_icon_state)) - cut_overlay(fire_overlay) - return null - else if(on_fire && !isnull(last_icon_state)) - return last_icon_state - return null +/mob/living/basic/get_fire_overlay(stacks, on_fire) + var/fire_icon = "generic_fire" + if(!GLOB.fire_appearances[fire_icon]) + GLOB.fire_appearances[fire_icon] = mutable_appearance( + 'icons/mob/effects/onfire.dmi', + fire_icon, + -HIGHEST_LAYER, + appearance_flags = RESET_COLOR, + ) + + return GLOB.fire_appearances[fire_icon] /mob/living/basic/put_in_hands(obj/item/I, del_on_fail = FALSE, merge_stacks = TRUE, ignore_animation = TRUE) . = ..() diff --git a/code/modules/mob/living/basic/blob_minions/blob_zombie.dm b/code/modules/mob/living/basic/blob_minions/blob_zombie.dm index c9bf3b7346a..3cbce54cf29 100644 --- a/code/modules/mob/living/basic/blob_minions/blob_zombie.dm +++ b/code/modules/mob/living/basic/blob_minions/blob_zombie.dm @@ -51,13 +51,13 @@ . = ..() death() -/mob/living/basic/blob_minion/zombie/update_overlays() - . = ..() +//Sets up our appearance +/mob/living/basic/blob_minion/zombie/proc/set_up_zombie_appearance() copy_overlays(corpse, TRUE) var/mutable_appearance/blob_head_overlay = mutable_appearance('icons/mob/nonhuman-player/blob.dmi', "blob_head") blob_head_overlay.color = LAZYACCESS(atom_colours, FIXED_COLOUR_PRIORITY) || COLOR_WHITE color = initial(color) // reversing what our component did lol, but we needed the value for the overlay - . += blob_head_overlay + overlays += blob_head_overlay /// Create an explosion of spores on death /mob/living/basic/blob_minion/zombie/proc/death_burst() @@ -73,6 +73,7 @@ new_corpse.forceMove(src) corpse = new_corpse update_appearance(UPDATE_ICON) + set_up_zombie_appearance() RegisterSignal(corpse, COMSIG_LIVING_REVIVE, PROC_REF(on_corpse_revived)) /// Dynamic changeling reentry diff --git a/code/modules/mob/living/basic/bots/_bots.dm b/code/modules/mob/living/basic/bots/_bots.dm index 8462f4afc35..56fdc4fc938 100644 --- a/code/modules/mob/living/basic/bots/_bots.dm +++ b/code/modules/mob/living/basic/bots/_bots.dm @@ -35,7 +35,7 @@ GLOBAL_LIST_INIT(command_strings, list( bubble_icon = "machine" speech_span = SPAN_ROBOT faction = list(FACTION_NEUTRAL, FACTION_SILICON, FACTION_TURRET) - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 3 light_power = 0.9 speed = 3 diff --git a/code/modules/mob/living/basic/clown/clown.dm b/code/modules/mob/living/basic/clown/clown.dm index 1a713ec04f8..88c2b9496a9 100644 --- a/code/modules/mob/living/basic/clown/clown.dm +++ b/code/modules/mob/living/basic/clown/clown.dm @@ -49,7 +49,7 @@ ai_controller.set_blackboard_key(BB_BASIC_MOB_SPEAK_LINES, emotes) //im not putting dynamic humans or whatever its called here because this is the base path of nonhuman clownstrosities if(waddles) - AddElement(/datum/element/waddling) + AddElementTrait(TRAIT_WADDLING, INNATE_TRAIT, /datum/element/waddling) if(length(loot)) loot = string_list(loot) AddElement(/datum/element/death_drops, loot) diff --git a/code/modules/mob/living/basic/drone/_drone.dm b/code/modules/mob/living/basic/drone/_drone.dm index 926271eea82..0887f430ee9 100644 --- a/code/modules/mob/living/basic/drone/_drone.dm +++ b/code/modules/mob/living/basic/drone/_drone.dm @@ -161,6 +161,12 @@ /obj/item/clothing/mask, /obj/item/storage/box/lights, /obj/item/lightreplacer, + /obj/item/construction/rcd, + /obj/item/rcd_ammo, + /obj/item/rcd_upgrade, + /obj/item/storage/part_replacer, + /obj/item/soap, + /obj/item/holosign_creator, ) /// machines whitelisted from being shy with var/list/shy_machine_whitelist = list( diff --git a/code/modules/mob/living/basic/drone/extra_drone_types.dm b/code/modules/mob/living/basic/drone/extra_drone_types.dm index 927d28f0ca2..08c9278b753 100644 --- a/code/modules/mob/living/basic/drone/extra_drone_types.dm +++ b/code/modules/mob/living/basic/drone/extra_drone_types.dm @@ -33,7 +33,7 @@ /mob/living/basic/drone/syndrone/Initialize(mapload) . = ..() var/datum/component/uplink/hidden_uplink = internal_storage.GetComponent(/datum/component/uplink) - hidden_uplink.set_telecrystals(telecrystal_count) + hidden_uplink.uplink_handler.set_telecrystals(telecrystal_count) /obj/effect/mob_spawn/ghost_role/drone/syndrone name = "syndrone shell" diff --git a/code/modules/mob/living/basic/farm_animals/pony.dm b/code/modules/mob/living/basic/farm_animals/pony.dm index df8f3a1fd4e..7795ec630e6 100644 --- a/code/modules/mob/living/basic/farm_animals/pony.dm +++ b/code/modules/mob/living/basic/farm_animals/pony.dm @@ -40,7 +40,7 @@ AddElement(/datum/element/pet_bonus, "whickers.") AddElement(/datum/element/ai_retaliate) AddElement(/datum/element/ai_flee_while_injured) - AddElement(/datum/element/waddling) + AddElementTrait(TRAIT_WADDLING, INNATE_TRAIT, /datum/element/waddling) AddComponent(/datum/component/tameable, food_types = list(/obj/item/food/grown/apple), tame_chance = 25, bonus_tame_chance = 15, after_tame = CALLBACK(src, PROC_REF(tamed)), unique = unique_tamer) /mob/living/basic/pony/proc/tamed(mob/living/tamer) diff --git a/code/modules/mob/living/basic/guardian/guardian.dm b/code/modules/mob/living/basic/guardian/guardian.dm index 9d79373ccd4..b338a5a4435 100644 --- a/code/modules/mob/living/basic/guardian/guardian.dm +++ b/code/modules/mob/living/basic/guardian/guardian.dm @@ -39,7 +39,7 @@ melee_damage_lower = 15 melee_damage_upper = 15 melee_attack_cooldown = CLICK_CD_MELEE - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 3 light_on = FALSE diff --git a/code/modules/mob/living/basic/guardian/guardian_creator.dm b/code/modules/mob/living/basic/guardian/guardian_creator.dm index d01383427df..3f1f0927522 100644 --- a/code/modules/mob/living/basic/guardian/guardian_creator.dm +++ b/code/modules/mob/living/basic/guardian/guardian_creator.dm @@ -66,7 +66,7 @@ GLOBAL_LIST_INIT(guardian_radial_images, setup_guardian_radial()) if(length(guardians) && !allow_multiple) balloon_alert(user, "already have one!") return - if(user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling) && !allow_changeling) + if(IS_CHANGELING(user) && !allow_changeling) to_chat(user, ling_failure) return if(used) diff --git a/code/modules/mob/living/basic/minebots/minebot.dm b/code/modules/mob/living/basic/minebots/minebot.dm index f9a22f955f1..5422ab4ee2e 100644 --- a/code/modules/mob/living/basic/minebots/minebot.dm +++ b/code/modules/mob/living/basic/minebots/minebot.dm @@ -23,7 +23,7 @@ speak_emote = list("states") mob_biotypes = MOB_ROBOTIC death_message = "blows apart!" - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 6 light_on = FALSE combat_mode = FALSE diff --git a/code/modules/mob/living/basic/pets/cat/cat.dm b/code/modules/mob/living/basic/pets/cat/cat.dm index 207599a1d16..dd8a588e915 100644 --- a/code/modules/mob/living/basic/pets/cat/cat.dm +++ b/code/modules/mob/living/basic/pets/cat/cat.dm @@ -134,6 +134,7 @@ icon_state = "spacecat" icon_living = "spacecat" icon_dead = "spacecat_dead" + unsuitable_atmos_damage = 0 minimum_survivable_temperature = TCMB maximum_survivable_temperature = T0C + 40 held_state = "spacecat" diff --git a/code/modules/mob/living/basic/pets/penguin.dm b/code/modules/mob/living/basic/pets/penguin.dm index 671c2cf30c1..e8e2a038c0e 100644 --- a/code/modules/mob/living/basic/pets/penguin.dm +++ b/code/modules/mob/living/basic/pets/penguin.dm @@ -23,7 +23,7 @@ AddElement(/datum/element/ai_retaliate) AddElement(/datum/element/ai_flee_while_injured) AddElement(/datum/element/pet_bonus, "honks happily!") - AddElement(/datum/element/waddling) + AddElementTrait(TRAIT_WADDLING, INNATE_TRAIT, /datum/element/waddling) if(!can_lay_eggs) return AddComponent(\ diff --git a/code/modules/mob/living/basic/space_fauna/ghost.dm b/code/modules/mob/living/basic/space_fauna/ghost.dm index 981357d1a13..406d2ecefdd 100644 --- a/code/modules/mob/living/basic/space_fauna/ghost.dm +++ b/code/modules/mob/living/basic/space_fauna/ghost.dm @@ -22,7 +22,7 @@ attack_sound = 'sound/hallucinations/growl1.ogg' death_message = "wails, disintegrating into a pile of ectoplasm!" gold_core_spawnable = NO_SPAWN //too spooky for science - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 1 // same glowing as visible player ghosts light_power = 2 ai_controller = /datum/ai_controller/basic_controller/ghost diff --git a/code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat.dm b/code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat.dm index 3602d5e8a99..be83d3e058f 100644 --- a/code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat.dm +++ b/code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat.dm @@ -52,7 +52,7 @@ RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(pre_attack)) RegisterSignal(src, COMSIG_MOB_LOGIN, PROC_REF(on_login)) - AddElement(/datum/element/waddling) + AddElementTrait(TRAIT_WADDLING, INNATE_TRAIT, /datum/element/waddling) AddElement(/datum/element/ai_retaliate) AddElement(/datum/element/door_pryer, pry_time = 5 SECONDS, interaction_key = REGALRAT_INTERACTION) AddComponent(\ diff --git a/code/modules/mob/living/basic/space_fauna/statue/mannequin.dm b/code/modules/mob/living/basic/space_fauna/statue/mannequin.dm new file mode 100644 index 00000000000..7b6bf6c8399 --- /dev/null +++ b/code/modules/mob/living/basic/space_fauna/statue/mannequin.dm @@ -0,0 +1,89 @@ +/mob/living/basic/statue/mannequin + name = "mannequin" + desc = "Oh, so this is a dress-up game now." + icon = 'icons/mob/human/mannequin.dmi' + icon_state = "mannequin_wood_male" + icon_living = "mannequin_wood_male" + icon_dead = "mannequin_wood_male" + health = 300 + maxHealth = 300 + melee_damage_lower = 15 + melee_damage_upper = 30 + sentience_type = SENTIENCE_ARTIFICIAL + ai_controller = /datum/ai_controller/basic_controller/stares_at_people + /// the path to a fake item we will hold in our right hand + var/obj/item/held_item + /// the path to a fake hat we will wear + var/obj/item/hat + +/mob/living/basic/statue/mannequin/Initialize(mapload) + . = ..() + update_appearance() + +/mob/living/basic/statue/mannequin/update_overlays() + . = ..() + if(held_item) + . += mutable_appearance(initial(held_item.righthand_file), initial(held_item.inhand_icon_state)) + if(hat) + . += mutable_appearance(initial(hat.worn_icon), initial(hat.worn_icon_state) || initial(hat.icon_state)) + +/datum/ai_controller/basic_controller/stares_at_people + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + BB_AGGRO_RANGE = 6, + ) + + ai_movement = /datum/ai_movement/dumb + idle_behavior = null + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/face_target_or_face_initial, // we be creepy and all + ) + +/datum/ai_planning_subtree/face_target_or_face_initial + +/datum/ai_planning_subtree/face_target_or_face_initial/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + if(isnull(controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET])) + return + var/mob/living/we = controller.pawn + controller.blackboard[BB_STARTING_DIRECTION] = we.dir + controller.queue_behavior(/datum/ai_behavior/face_target_or_face_initial, BB_BASIC_MOB_CURRENT_TARGET) + +/datum/ai_behavior/face_target_or_face_initial + +/datum/ai_behavior/face_target_or_face_initial/setup(datum/ai_controller/controller, target_key) + . = ..() + var/atom/movable/target = controller.blackboard[target_key] + return ismovable(target) && isturf(target.loc) && ismob(controller.pawn) + +/datum/ai_behavior/face_target_or_face_initial/perform(seconds_per_tick, datum/ai_controller/controller, target_key) + . = ..() + var/atom/movable/target = controller.blackboard[target_key] + var/mob/living/we = controller.pawn + if(isnull(target) || get_dist(we, target) > 8) + we.dir = controller.blackboard[BB_STARTING_DIRECTION] + finish_action(controller, TRUE) + else + we.face_atom(target) + +/mob/living/basic/statue/mannequin/suspicious + name = "mannequin?" + desc = "Their eyes follow you." + health = 1500 //yeah uhh avoid these + maxHealth = 1500 + ai_controller = /datum/ai_controller/basic_controller/suspicious_mannequin + +/datum/ai_controller/basic_controller/suspicious_mannequin + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + BB_AGGRO_RANGE = 14, + BB_EMOTE_KEY = "scream", //spooky + ) + + ai_movement = /datum/ai_movement/jps //threat + idle_behavior = null + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/run_emote, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + ) diff --git a/code/modules/mob/living/basic/vermin/mothroach.dm b/code/modules/mob/living/basic/vermin/mothroach.dm index 15f82d38f85..4c06665a14a 100644 --- a/code/modules/mob/living/basic/vermin/mothroach.dm +++ b/code/modules/mob/living/basic/vermin/mothroach.dm @@ -73,3 +73,10 @@ planning_subtrees = list( /datum/ai_planning_subtree/random_speech/mothroach, ) + +/mob/living/basic/mothroach/bar + name = "mothroach bartender" + desc = "A mothroach serving drinks. Look at him go." + icon_state = "barroach" + icon_living = "barroach" + icon_dead = "barroach_dead" diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm index a613e2ad839..117b5f03835 100644 --- a/code/modules/mob/living/brain/brain_item.dm +++ b/code/modules/mob/living/brain/brain_item.dm @@ -61,7 +61,7 @@ name = initial(name) // Special check for if you're trapped in a body you can't control because it's owned by a ling. - if(brain_owner?.mind?.has_antag_datum(/datum/antagonist/changeling) && !(movement_flags & NO_ID_TRANSFER)) + if(IS_CHANGELING(brain_owner) && !(movement_flags & NO_ID_TRANSFER)) if(brainmob && !(brain_owner.stat == DEAD || (HAS_TRAIT(brain_owner, TRAIT_DEATHCOMA)))) to_chat(brainmob, span_danger("You can't feel your body! You're still just a brain!")) forceMove(brain_owner) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 31530240bd1..6d4e864238e 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -929,7 +929,7 @@ return ..() /mob/living/carbon/can_be_revived() - if(!get_organ_by_type(/obj/item/organ/internal/brain) && (!mind || !mind.has_antag_datum(/datum/antagonist/changeling)) || HAS_TRAIT(src, TRAIT_HUSK)) + if(!get_organ_by_type(/obj/item/organ/internal/brain) && (!IS_CHANGELING(src)) || HAS_TRAIT(src, TRAIT_HUSK)) return FALSE //NOVA EDIT ADDITION - DNR TRAIT if(HAS_TRAIT(src, TRAIT_DNR)) @@ -1444,3 +1444,20 @@ if(item && ((item in organs) || (item in bodyparts))) //let's not do this, aight? return FALSE return ..() + +/// Helper to cleanly trigger tail wagging +/// Accepts an optional timeout after which we remove the tail wagging +/// Returns true if successful, false otherwise +/mob/living/carbon/proc/wag_tail(timeout = INFINITY) + var/obj/item/organ/external/tail/wagged = get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL) + if(!wagged) + return FALSE + return wagged.start_wag(src, timeout) + +/// Helper to cleanly stop all tail wagging +/// Returns true if successful, false otherwise +/mob/living/carbon/proc/unwag_tail() // can't unwag a tail + var/obj/item/organ/external/tail/unwagged = get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL) + if(!unwagged) + return FALSE + return unwagged.stop_wag(src) diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index d0717972d59..909cf50618b 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -69,25 +69,19 @@ if(P.catastropic_dismemberment) apply_damage(P.damage, P.damtype, BODY_ZONE_CHEST, wound_bonus = P.wound_bonus) //stops a projectile blowing off a limb effectively doing no damage. Mostly relevant for sniper rifles. -/mob/living/carbon/proc/can_catch_item(skip_throw_mode_check) - . = FALSE +/mob/living/carbon/try_catch_item(obj/item/item, skip_throw_mode_check = FALSE, try_offhand = FALSE) + . = ..() + if(.) + throw_mode_off(THROW_MODE_TOGGLE) + +/mob/living/carbon/can_catch_item(skip_throw_mode_check = FALSE, try_offhand = FALSE) if(!skip_throw_mode_check && !throw_mode) - return - if(get_active_held_item()) - return - if(HAS_TRAIT(src, TRAIT_HANDS_BLOCKED)) - return - return TRUE + return FALSE + return ..() -/mob/living/carbon/hitby(atom/movable/AM, skipcatch, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum) - if(!skipcatch && can_catch_item() && isitem(AM) && !HAS_TRAIT(AM, TRAIT_UNCATCHABLE) && isturf(AM.loc)) - var/obj/item/I = AM - I.attack_hand(src) - if(get_active_held_item() == I) //if our attack_hand() picks up the item... - visible_message(span_warning("[src] catches [I]!"), \ - span_userdanger("You catch [I] in mid-air!")) - throw_mode_off(THROW_MODE_TOGGLE) - return TRUE +/mob/living/carbon/hitby(atom/movable/movable, skipcatch, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum) + if(!skipcatch && try_catch_item(movable)) + return TRUE return ..() /mob/living/carbon/send_item_attack_message(obj/item/I, mob/living/user, hit_area, def_zone) diff --git a/code/modules/mob/living/carbon/carbon_update_icons.dm b/code/modules/mob/living/carbon/carbon_update_icons.dm index fc5bbe27b30..5881efa7e69 100644 --- a/code/modules/mob/living/carbon/carbon_update_icons.dm +++ b/code/modules/mob/living/carbon/carbon_update_icons.dm @@ -278,8 +278,8 @@ update_held_items() update_worn_handcuffs() update_worn_legcuffs() - update_fire() update_body() + update_appearance(UPDATE_OVERLAYS) /mob/living/carbon/update_held_items() . = ..() @@ -315,27 +315,18 @@ hands += I.build_worn_icon(default_layer = HANDS_LAYER, default_icon_file = icon_file, isinhands = TRUE) return hands -/mob/living/carbon/update_fire_overlay(stacks, on_fire, last_icon_state, suffix = "") - var/fire_icon = "[dna?.species.fire_overlay || "human"]_[stacks > MOB_BIG_FIRE_STACK_THRESHOLD ? "big_fire" : "small_fire"][suffix]" +/mob/living/carbon/get_fire_overlay(stacks, on_fire) + var/fire_icon = "[dna?.species.fire_overlay || "human"]_[stacks > MOB_BIG_FIRE_STACK_THRESHOLD ? "big_fire" : "small_fire"]" if(!GLOB.fire_appearances[fire_icon]) - GLOB.fire_appearances[fire_icon] = mutable_appearance('icons/mob/effects/onfire.dmi', fire_icon, -FIRE_LAYER, appearance_flags = RESET_COLOR) - - if((stacks > 0 && on_fire) || HAS_TRAIT(src, TRAIT_PERMANENTLY_ONFIRE)) - if(fire_icon == last_icon_state) - return last_icon_state - - remove_overlay(FIRE_LAYER) - overlays_standing[FIRE_LAYER] = GLOB.fire_appearances[fire_icon] - apply_overlay(FIRE_LAYER) - return fire_icon - - if(!last_icon_state) - return last_icon_state - - remove_overlay(FIRE_LAYER) - apply_overlay(FIRE_LAYER) - return null + GLOB.fire_appearances[fire_icon] = mutable_appearance( + 'icons/mob/effects/onfire.dmi', + fire_icon, + -HIGHEST_LAYER, + appearance_flags = RESET_COLOR, + ) + + return GLOB.fire_appearances[fire_icon] /mob/living/carbon/update_damage_overlays() remove_overlay(DAMAGE_LAYER) diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index e3bbca427b2..7d9627f1825 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -136,10 +136,12 @@ if(!.) return var/obj/item/organ/external/tail/oranges_accessory = user.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL) + //I am so sorry my son + //We bypass helpers here cause we already have the tail if(oranges_accessory.wag_flags & WAG_WAGGING) //We verified the tail exists in can_run_emote() - SEND_SIGNAL(user, COMSIG_ORGAN_WAG_TAIL, FALSE) + oranges_accessory.stop_wag(user) else - SEND_SIGNAL(user, COMSIG_ORGAN_WAG_TAIL, TRUE) + oranges_accessory.start_wag(user) /datum/emote/living/carbon/human/wag/select_message_type(mob/user, intentional) . = ..() diff --git a/code/modules/mob/living/carbon/human/human_update_icons.dm b/code/modules/mob/living/carbon/human/human_update_icons.dm index 5250665904b..3ea41f2302b 100644 --- a/code/modules/mob/living/carbon/human/human_update_icons.dm +++ b/code/modules/mob/living/carbon/human/human_update_icons.dm @@ -187,18 +187,16 @@ There are several things that need to be remembered: inv.update_icon() //Bloody hands begin - var/mutable_appearance/bloody_overlay = mutable_appearance('icons/effects/blood.dmi', "bloodyhands", -GLOVES_LAYER) - cut_overlay(bloody_overlay) + var/mutable_appearance/bloody_lefthand_overlay = mutable_appearance('icons/effects/blood.dmi', "bloodyhands_left", -GLOVES_LAYER) + var/mutable_appearance/bloody_righthand_overlay = mutable_appearance('icons/effects/blood.dmi', "bloodyhands_right", -GLOVES_LAYER) + cut_overlay(bloody_lefthand_overlay) + cut_overlay(bloody_righthand_overlay) if(!gloves && blood_in_hands && (num_hands > 0)) - bloody_overlay = mutable_appearance('icons/effects/blood.dmi', "bloodyhands", -GLOVES_LAYER) - if(num_hands < 2) - if(has_left_hand(FALSE)) - bloody_overlay.icon_state = "bloodyhands_left" - else if(has_right_hand(FALSE)) - bloody_overlay.icon_state = "bloodyhands_right" - - add_overlay(bloody_overlay) - //Bloody hands end + if(has_left_hand(check_disabled = FALSE)) + add_overlay(bloody_lefthand_overlay) + if(has_right_hand(check_disabled = FALSE)) + add_overlay(bloody_righthand_overlay) + // Bloody hands end if(gloves) var/obj/item/worn_item = gloves @@ -375,15 +373,15 @@ There are several things that need to be remembered: if((bodytype & BODYTYPE_DIGITIGRADE) && (worn_item.supports_variations_flags & CLOTHING_DIGITIGRADE_VARIATION)) var/obj/item/bodypart/leg = src.get_bodypart(BODY_ZONE_L_LEG) - if(leg.limb_id == "digitigrade")//Snowflakey and bad. But it makes it look consistent. + if(leg.limb_id == "digitigrade" || leg.bodytype & BODYTYPE_DIGITIGRADE)//Snowflakey and bad. But it makes it look consistent. icon_file = worn_item.worn_icon_digi || DIGITIGRADE_SHOES_FILE // NOVA EDIT CHANGE mutant_override = TRUE // NOVA EDIT ADDITION - else if(bodytype & BODYTYPE_CUSTOM) + if(!mutant_override && bodytype & BODYTYPE_CUSTOM) var/species_icon_file = dna.species.generate_custom_worn_icon(LOADOUT_ITEM_SHOES, shoes, src) if(species_icon_file) icon_file = species_icon_file mutant_override = TRUE - else if(bodytype & BODYTYPE_HIDE_SHOES) + if(bodytype & BODYTYPE_HIDE_SHOES) return // We just don't want shoes that float if we're not displaying legs (useful for taurs, for now) // NOVA EDIT END @@ -528,7 +526,7 @@ There are several things that need to be remembered: icon_file = worn_item.worn_icon_digi || DIGITIGRADE_SUIT_FILE // NOVA EDIT CHANGE mutant_override = TRUE - else if(bodytype & BODYTYPE_CUSTOM) + if(!mutant_override && bodytype & BODYTYPE_CUSTOM) var/species_icon_file = dna.species.generate_custom_worn_icon(LOADOUT_ITEM_SUIT, wear_suit, src) if(species_icon_file) icon_file = species_icon_file diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 00cad2ec787..1a8c07865ce 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -106,37 +106,11 @@ s_store, ) -/// Returns items which are currently visible on the mob -/mob/living/carbon/human/proc/get_visible_items() - var/static/list/visible_slots = list( - ITEM_SLOT_OCLOTHING, - ITEM_SLOT_ICLOTHING, - ITEM_SLOT_GLOVES, - ITEM_SLOT_EYES, - ITEM_SLOT_EARS, - ITEM_SLOT_MASK, - ITEM_SLOT_HEAD, - ITEM_SLOT_FEET, - ITEM_SLOT_ID, - ITEM_SLOT_BELT, - ITEM_SLOT_BACK, - ITEM_SLOT_NECK, - ITEM_SLOT_HANDS, - ITEM_SLOT_BACKPACK, - ITEM_SLOT_SUITSTORE, - ITEM_SLOT_HANDCUFFED, - ITEM_SLOT_LEGCUFFED, - ) - var/list/obscured = check_obscured_slots() - var/list/visible_items = list() - for (var/slot in visible_slots) - if (obscured & slot) - continue - var/obj/item/equipped = get_item_by_slot(slot) - if (equipped) - visible_items += equipped - for (var/obj/item/held in held_items) - visible_items += held +/mob/living/carbon/human/get_visible_items() + var/list/visible_items = ..() + var/obj/item/clothing/under/under = w_uniform + if(istype(under) && length(under.attached_accessories) && (under in visible_items)) + visible_items += under.attached_accessories return visible_items //This is an UNSAFE proc. Use mob_can_equip() before calling this one! Or rather use equip_to_slot_if_possible() or advanced_equip_to_slot_if_possible() @@ -235,11 +209,8 @@ return not_handled //For future deeper overrides -/mob/living/carbon/human/equipped_speed_mods() - . = ..() - for(var/sloties in get_all_worn_items() - list(l_store, r_store, s_store, back, wear_mask, wear_neck, head, handcuffed, legcuffed)) - var/obj/item/thing = sloties - . += thing?.slowdown +/mob/living/carbon/human/get_equipped_speed_mod_items() + return ..() - list(l_store, r_store, s_store) /mob/living/carbon/human/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE, silent = FALSE) . = ..() //See mob.dm for an explanation on this and some rage about people copypasting instead of calling ..() like they should. diff --git a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm index eaabee63485..b6fe0234bac 100644 --- a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm +++ b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm @@ -116,7 +116,7 @@ else internal_fire = FALSE - H.update_fire() + H.update_appearance(UPDATE_OVERLAYS) /datum/species/plasmaman/handle_fire(mob/living/carbon/human/H, seconds_per_tick, no_protection = FALSE) if(internal_fire) diff --git a/code/modules/mob/living/carbon/init_signals.dm b/code/modules/mob/living/carbon/init_signals.dm index 190fe9d8453..e64410ab635 100644 --- a/code/modules/mob/living/carbon/init_signals.dm +++ b/code/modules/mob/living/carbon/init_signals.dm @@ -13,12 +13,6 @@ RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_TOXIMMUNE), PROC_REF(on_toximmune_trait_gain)) RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_GENELESS), PROC_REF(on_geneless_trait_gain)) - - RegisterSignals(src, list( - SIGNAL_ADDTRAIT(TRAIT_PERMANENTLY_ONFIRE), - SIGNAL_REMOVETRAIT(TRAIT_PERMANENTLY_ONFIRE), - ), PROC_REF(update_permanently_on_fire)) - /** * On gain of TRAIT_AGENDER * @@ -90,12 +84,6 @@ reagents.end_metabolization(keep_liverless = TRUE) -///On gain of TRAIT_PERMANENTLY_ONFIRE, update the visuals if not on fire -/mob/living/carbon/proc/update_permanently_on_fire(datum/source) - SIGNAL_HANDLER - if(!on_fire) - update_fire() - /** * On gain of TRAIT_VIRUSIMMUNE * diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm index 8e154b0977f..e0a24d0ab51 100644 --- a/code/modules/mob/living/carbon/inventory.dm +++ b/code/modules/mob/living/carbon/inventory.dm @@ -49,6 +49,39 @@ legcuffed, ) +/// Returns items which are currently visible on the mob +/mob/living/carbon/proc/get_visible_items() + var/static/list/visible_slots = list( + ITEM_SLOT_OCLOTHING, + ITEM_SLOT_ICLOTHING, + ITEM_SLOT_GLOVES, + ITEM_SLOT_EYES, + ITEM_SLOT_EARS, + ITEM_SLOT_MASK, + ITEM_SLOT_HEAD, + ITEM_SLOT_FEET, + ITEM_SLOT_ID, + ITEM_SLOT_BELT, + ITEM_SLOT_BACK, + ITEM_SLOT_NECK, + ITEM_SLOT_HANDS, + ITEM_SLOT_BACKPACK, + ITEM_SLOT_SUITSTORE, + ITEM_SLOT_HANDCUFFED, + ITEM_SLOT_LEGCUFFED, + ) + var/list/obscured = check_obscured_slots() + var/list/visible_items = list() + for (var/slot in visible_slots) + if (obscured & slot) + continue + var/obj/item/equipped = get_item_by_slot(slot) + if (equipped) + visible_items += equipped + for (var/obj/item/held in held_items) + visible_items += held + return visible_items + /mob/living/carbon/proc/equip_in_one_of_slots(obj/item/equipping, list/slots, qdel_on_fail = TRUE, indirect_action = FALSE) for(var/slot in slots) if(equip_to_slot_if_possible(equipping, slots[slot], disable_warning = TRUE, indirect_action = indirect_action)) @@ -128,11 +161,8 @@ return not_handled -/mob/living/carbon/equipped_speed_mods() - . = ..() - for(var/sloties in get_all_worn_items()) - var/obj/item/thing = sloties - . += thing?.slowdown +/mob/living/carbon/get_equipped_speed_mod_items() + return ..() + get_all_worn_items() /// This proc is called after an item has been successfully handled and equipped to a slot. /mob/living/carbon/proc/has_equipped(obj/item/item, slot, initial = FALSE) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 86370278f23..0a358ada801 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1655,11 +1655,6 @@ GLOBAL_LIST_EMPTY(fire_appearances) return fire_status.ignite(silent) -/mob/living/proc/update_fire() - var/datum/status_effect/fire_handler/fire_stacks/fire_stacks = has_status_effect(/datum/status_effect/fire_handler/fire_stacks) - if(fire_stacks) - fire_stacks.update_overlay() - /** * Extinguish all fire on the mob * @@ -1667,7 +1662,7 @@ GLOBAL_LIST_EMPTY(fire_appearances) * Signals the extinguishing. */ /mob/living/proc/extinguish_mob() - if(HAS_TRAIT(src, TRAIT_PERMANENTLY_ONFIRE)) //The everlasting flames will not be extinguished + if(HAS_TRAIT(src, TRAIT_NO_EXTINGUISH)) //The everlasting flames will not be extinguished return var/datum/status_effect/fire_handler/fire_stacks/fire_status = has_status_effect(/datum/status_effect/fire_handler/fire_stacks) if(!fire_status || !fire_status.on_fire) @@ -1686,13 +1681,13 @@ GLOBAL_LIST_EMPTY(fire_appearances) /mob/living/proc/adjust_fire_stacks(stacks, fire_type = /datum/status_effect/fire_handler/fire_stacks) if(stacks < 0) - if(HAS_TRAIT(src, TRAIT_PERMANENTLY_ONFIRE)) //You can't reduce fire stacks of the everlasting flames + if(HAS_TRAIT(src, TRAIT_NO_EXTINGUISH)) //You can't reduce fire stacks of the everlasting flames return stacks = max(-fire_stacks, stacks) apply_status_effect(fire_type, stacks) /mob/living/proc/adjust_wet_stacks(stacks, wet_type = /datum/status_effect/fire_handler/wet_stacks) - if(HAS_TRAIT(src, TRAIT_PERMANENTLY_ONFIRE)) //The everlasting flames will not be extinguished + if(HAS_TRAIT(src, TRAIT_NO_EXTINGUISH)) //The everlasting flames will not be extinguished return if(stacks < 0) stacks = max(fire_stacks, stacks) @@ -1770,19 +1765,18 @@ GLOBAL_LIST_EMPTY(fire_appearances) ignite_mob() /** - * Sets fire overlay of the mob. + * Gets the fire overlay to use for this mob * - * Vars: + * Args: * * stacks: Current amount of fire_stacks * * on_fire: If we're lit on fire - * * last_icon_state: Holds last fire overlay icon state, used for optimization - * * suffix: Suffix for the fire icon state for special fire types * - * This should return last_icon_state for the fire status efect + * Return a mutable appearance, the overlay that will be applied. */ -/mob/living/proc/update_fire_overlay(stacks, on_fire, last_icon_state, suffix = "") - return last_icon_state +/mob/living/proc/get_fire_overlay(stacks, on_fire) + RETURN_TYPE(/mutable_appearance) + return null /** * Handles effects happening when mob is on normal fire diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 55cb51c97dd..3a4b0091b51 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -222,6 +222,26 @@ hitpush = FALSE return ..() +///The core of catching thrown items, which non-carbons cannot without the help of items or abilities yet, as they've no throw mode. +/mob/living/proc/try_catch_item(obj/item/item, skip_throw_mode_check = FALSE, try_offhand = FALSE) + if(!can_catch_item(skip_throw_mode_check, try_offhand) || !isitem(item) || HAS_TRAIT(item, TRAIT_UNCATCHABLE) || !isturf(item.loc)) + return FALSE + if(!can_hold_items(item)) + return FALSE + INVOKE_ASYNC(item, TYPE_PROC_REF(/obj/item, attempt_pickup), src, TRUE) + if(get_active_held_item() == item) //if our attack_hand() picks up the item... + visible_message(span_warning("[src] catches [item]!"), \ + span_userdanger("You catch [item] in mid-air!")) + return TRUE + +///Checks the requites for catching a throw item. +/mob/living/proc/can_catch_item(skip_throw_mode_check = FALSE, try_offhand = FALSE) + if(HAS_TRAIT(src, TRAIT_HANDS_BLOCKED)) + return FALSE + if(get_active_held_item() && (!try_offhand || get_inactive_held_item() || !swap_hand())) + return FALSE + return TRUE + /mob/living/fire_act() . = ..() adjust_fire_stacks(3) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index fbe68372017..86465dca120 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -77,7 +77,7 @@ var/mob/camera/ai_eye/eyeobj var/sprint = 10 - var/cooldown = 0 + var/last_moved = 0 var/acceleration = TRUE var/obj/structure/ai_core/deactivated/linked_core //For exosuit control @@ -191,7 +191,8 @@ builtInCamera.network = list("ss13") ai_tracking_tool = new(src) - RegisterSignal(src, COMSIG_TRACKABLE_TRACKING_TARGET, PROC_REF(on_track_target)) + RegisterSignal(ai_tracking_tool, COMSIG_TRACKABLE_TRACKING_TARGET, PROC_REF(on_track_target)) + RegisterSignal(ai_tracking_tool, COMSIG_TRACKABLE_GLIDE_CHANGED, PROC_REF(tracked_glidesize_changed)) add_traits(list(TRAIT_PULL_BLOCKED, TRAIT_HANDS_BLOCKED), ROUNDSTART_TRAIT) @@ -211,8 +212,7 @@ switch(_key) if("`", "0") if(cam_prev) - if(ai_tracking_tool.tracking) - ai_tracking_tool.set_tracking(FALSE) + ai_tracking_tool.reset_tracking() eyeobj.setLoc(cam_prev) return if("1", "2", "3", "4", "5", "6", "7", "8", "9") @@ -223,8 +223,7 @@ return if(cam_hotkeys[_key]) //if this is false, no hotkey for this slot exists. cam_prev = eyeobj.loc - if(ai_tracking_tool.tracking) - ai_tracking_tool.set_tracking(FALSE) + ai_tracking_tool.reset_tracking() eyeobj.setLoc(cam_hotkeys[_key]) return return ..() @@ -250,7 +249,6 @@ if(ai_voicechanger) ai_voicechanger.owner = null ai_voicechanger = null - UnregisterSignal(src, COMSIG_TRACKABLE_TRACKING_TARGET) return ..() /// Removes all malfunction-related abilities from the AI @@ -401,7 +399,7 @@ set name = "track" set hidden = TRUE //Don't display it on the verb lists. This verb exists purely so you can type "track Oldman Robustin" and follow his ass - ai_tracking_tool.set_tracked_mob(src) + ai_tracking_tool.track_input(src) ///Called when an AI finds their tracking target. /mob/living/silicon/ai/proc/on_track_target(datum/trackable/source, mob/living/target) @@ -411,6 +409,12 @@ else view_core() +/// Keeps our rate of gliding in step with the mob we're following +/mob/living/silicon/ai/proc/tracked_glidesize_changed(datum/trackable/source, mob/living/target, new_glide_size) + SIGNAL_HANDLER + if(eyeobj) + eyeobj.glide_size = new_glide_size + /mob/living/silicon/ai/verb/toggle_anchor() set category = "AI Commands" set name = "Toggle Floor Bolts" @@ -525,7 +529,7 @@ else to_chat(src, span_notice("Unable to project to the holopad.")) if(href_list["track"]) - ai_tracking_tool.set_tracked_mob(src, href_list["track"]) + ai_tracking_tool.track_name(src, href_list["track"]) return if (href_list["ai_take_control"]) //Mech domination var/obj/vehicle/sealed/mecha/M = locate(href_list["ai_take_control"]) in GLOB.mechas_list @@ -568,8 +572,7 @@ view_core() return - if(ai_tracking_tool.tracking) - ai_tracking_tool.set_tracking(FALSE) + ai_tracking_tool.reset_tracking() // ok, we're alive, camera is good and in our network... eyeobj.setLoc(get_turf(C)) @@ -643,8 +646,7 @@ set category = "AI Commands" set name = "Jump To Network" unset_machine() - if(ai_tracking_tool.tracking) - ai_tracking_tool.set_tracking(FALSE) + ai_tracking_tool.reset_tracking() var/cameralist[0] if(incapacitated()) diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm index 416bbb19912..e8c1919b020 100644 --- a/code/modules/mob/living/silicon/ai/freelook/eye.dm +++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm @@ -154,35 +154,44 @@ return var/mob/living/silicon/ai/AI = usr if(AI.eyeobj && (AI.multicam_on || (AI.client.eye == AI.eyeobj)) && (AI.eyeobj.z == z)) - if(AI.ai_tracking_tool.tracking) - AI.ai_tracking_tool.set_tracking(FALSE) + AI.ai_tracking_tool.reset_tracking() if (isturf(loc) || isturf(src)) AI.eyeobj.setLoc(src) // This will move the AIEye. It will also cause lights near the eye to light up, if toggled. // This is handled in the proc below this one. - -/client/proc/AIMove(n, direct, mob/living/silicon/ai/user) - - var/initial = initial(user.sprint) - var/max_sprint = 50 - - if(user.cooldown && user.cooldown < world.timeofday) // 3 seconds - user.sprint = initial - - for(var/i = 0; i < max(user.sprint, initial); i += 20) - var/turf/step = get_turf(get_step(user.eyeobj, direct)) +#define SPRINT_PER_TICK 0.5 +#define MAX_SPRINT 50 +#define SPRINT_PER_STEP 20 +/mob/living/silicon/ai/proc/AIMove(direction) + if(last_moved && last_moved + 1 < world.timeofday) + // Decay sprint based off how long it took us to input this next move + var/missed_sprint = max((world.timeofday + 1) - last_moved, 0) * SPRINT_PER_TICK + sprint = max(sprint - missed_sprint * 7, initial(sprint)) + + // We move a full step, at least. Can't glide more with our current movement mode, so this is how I have to live + var/step_count = 0 + for(var/i = 0; i < max(sprint, initial(sprint)); i += SPRINT_PER_STEP) + step_count += 1 + var/turf/step = get_turf(get_step(eyeobj, direction)) if(step) - user.eyeobj.setLoc(step) + eyeobj.setLoc(step) + + // I'd like to make this scale with the steps we take, but it like, just can't + // So we're doin this instead + eyeobj.glide_size = world.icon_size - user.cooldown = world.timeofday + 5 - if(user.acceleration) - user.sprint = min(user.sprint + 0.5, max_sprint) + last_moved = world.timeofday + if(acceleration) + sprint = min(sprint + SPRINT_PER_TICK, MAX_SPRINT) else - user.sprint = initial + sprint = initial(sprint) + + ai_tracking_tool.reset_tracking() - if(user.ai_tracking_tool.tracking) - user.ai_tracking_tool.set_tracking(FALSE) +#undef SPRINT_PER_STEP +#undef MAX_SPRINT +#undef SPRINT_PER_TICK // Return to the Core. /mob/living/silicon/ai/proc/view_core() @@ -191,8 +200,8 @@ H.clear_holo(src) else current = null - if(ai_tracking_tool && ai_tracking_tool.tracking) - ai_tracking_tool.set_tracking(FALSE) + if(ai_tracking_tool) + ai_tracking_tool.reset_tracking() unset_machine() if(isturf(loc) && (QDELETED(eyeobj) || !eyeobj.loc)) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 805bb7b6dd4..1d2385984ad 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -360,7 +360,7 @@ var/mutable_appearance/head_overlay = hat.build_worn_icon(default_layer = 20, default_icon_file = 'icons/mob/clothing/head/default.dmi') head_overlay.pixel_z += hat_offset add_overlay(head_overlay) - update_fire() + update_appearance(UPDATE_OVERLAYS) /mob/living/silicon/robot/on_changed_z_level(turf/old_turf, turf/new_turf, same_z_layer, notify_contents) if(same_z_layer) @@ -1034,26 +1034,19 @@ /mob/living/silicon/robot/proc/untip_roleplay() to_chat(src, span_notice("Your frustration has empowered you! You can now right yourself faster!")) - -/mob/living/silicon/robot/update_fire_overlay(stacks, on_fire, last_icon_state, suffix = "") - var/fire_icon = "generic_fire[suffix]" +/mob/living/silicon/robot/get_fire_overlay(stacks, on_fire) + var/fire_icon = "generic_fire" if(!GLOB.fire_appearances[fire_icon]) - var/mutable_appearance/new_fire_overlay = mutable_appearance('icons/mob/effects/onfire.dmi', fire_icon, -FIRE_LAYER) - new_fire_overlay.appearance_flags = RESET_COLOR + var/mutable_appearance/new_fire_overlay = mutable_appearance( + 'icons/mob/effects/onfire.dmi', + fire_icon, + -HIGHEST_LAYER, + appearance_flags = RESET_COLOR, + ) GLOB.fire_appearances[fire_icon] = new_fire_overlay - if(stacks && on_fire) - if(last_icon_state == fire_icon) - return last_icon_state - add_overlay(GLOB.fire_appearances[fire_icon]) - return fire_icon - - if(!last_icon_state) - return last_icon_state - - cut_overlay(GLOB.fire_appearances[fire_icon]) - return null + return GLOB.fire_appearances[fire_icon] /// Draw power from the robot /mob/living/silicon/robot/proc/draw_power(power_to_draw) diff --git a/code/modules/mob/living/silicon/robot/robot_defines.dm b/code/modules/mob/living/silicon/robot/robot_defines.dm index d87532f9a6c..8cc1b0d22f1 100644 --- a/code/modules/mob/living/silicon/robot/robot_defines.dm +++ b/code/modules/mob/living/silicon/robot/robot_defines.dm @@ -23,7 +23,7 @@ radio = /obj/item/radio/borg blocks_emissive = EMISSIVE_BLOCK_UNIQUE - light_system = MOVABLE_LIGHT_DIRECTIONAL + light_system = OVERLAY_LIGHT_DIRECTIONAL light_on = FALSE diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index 22c7439ec80..ff304332c8d 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -23,7 +23,7 @@ bubble_icon = "machine" speech_span = SPAN_ROBOT faction = list(FACTION_NEUTRAL, FACTION_SILICON, FACTION_TURRET) - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 3 light_power = 0.9 del_on_death = TRUE diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index 7e3b0ab0c2e..7f13a1954ab 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -79,13 +79,15 @@ cell = new /obj/item/stock_parts/cell/upgraded(src, 2000) - var/static/mulebot_count = 0 - mulebot_count += 1 - set_id(suffix || id || "#[mulebot_count]") - suffix = null AddElement(/datum/element/ridable, /datum/component/riding/creature/mulebot) diag_hud_set_mulebotcell() + set_id(suffix || assign_random_name()) + suffix = null + if(name == "\improper MULEbot") + name = "\improper MULEbot [id]" + set_home(loc) + /mob/living/simple_animal/bot/mulebot/Exited(atom/movable/gone, direction) . = ..() if(gone == load) @@ -138,6 +140,18 @@ /mob/living/simple_animal/bot/mulebot/proc/set_id(new_id) id = new_id +/mob/living/simple_animal/bot/mulebot/proc/set_home(turf/home_loc) + if(!istype(home_loc)) + CRASH("MULEbot [id] was requested to set a home location to [home_loc ? "an invalid home loc ([home_loc.type])" : "null"]") + + var/obj/machinery/navbeacon/home_beacon = locate() in home_loc + if(!isnull(home_beacon)) + home_destination = home_beacon.location + log_transport("[id]: MULEbot successfuly set home location to ID [home_destination] at [home_beacon.x], [home_beacon.y], [home_beacon.z]") + return + + log_transport("[id]: MULEbot failed to set home at [home_loc.x], [home_loc.y], [home_loc.z]") + /mob/living/simple_animal/bot/mulebot/bot_reset() ..() reached_target = FALSE @@ -322,19 +336,12 @@ if(new_dest) set_destination(new_dest) if("setid") - var/new_id - if(pda) - new_id = tgui_input_text(user, "Enter ID", "ID Assignment", id, MAX_NAME_LEN) - else - new_id = params["value"] + var/new_id = tgui_input_text(user, "Enter ID", "ID Assignment", id, MAX_NAME_LEN) if(new_id) set_id(new_id) + name = "\improper MULEbot [new_id]" if("sethome") - var/new_home - if(pda) - new_home = tgui_input_list(user, "Enter Home", "Mulebot Settings", GLOB.deliverybeacontags, home_destination) - else - new_home = params["value"] + var/new_home = tgui_input_list(user, "Enter Home", "Mulebot Settings", GLOB.deliverybeacontags, home_destination) if(new_home) home_destination = new_home if("unload") diff --git a/code/modules/mob/living/simple_animal/bot/vibebot.dm b/code/modules/mob/living/simple_animal/bot/vibebot.dm index 5a876bd8eca..d0d550f7737 100644 --- a/code/modules/mob/living/simple_animal/bot/vibebot.dm +++ b/code/modules/mob/living/simple_animal/bot/vibebot.dm @@ -9,7 +9,7 @@ health = 25 maxHealth = 25 pass_flags = PASSMOB | PASSFLAPS - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 7 light_power = 3 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 e256e4f2921..9253448563b 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -165,7 +165,7 @@ icon_state = "at_shield2" layer = FLY_LAYER plane = ABOVE_GAME_PLANE - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 2 duration = 8 var/target diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 8504ee302d8..cf42a08a93b 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1570,8 +1570,11 @@ /mob/proc/set_nutrition(change) //Seriously fuck you oldcoders. nutrition = max(0, change) +///Apply a proper movespeed modifier based on items we have equipped /mob/proc/update_equipment_speed_mods() - var/speedies = equipped_speed_mods() + var/speedies = 0 + for(var/obj/item/thing in get_equipped_speed_mod_items()) + speedies += thing.slowdown if(speedies > 0 && HAS_TRAIT(src, TRAIT_SETTLER)) //if our movespeed mod is in the negatives, we don't modify it since that's a benefit speedies *= 0.2 if(!speedies) @@ -1579,12 +1582,12 @@ else add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/equipment_speedmod, multiplicative_slowdown = speedies) -/// Gets the combined speed modification of all worn items -/// Except base mob type doesnt really wear items -/mob/proc/equipped_speed_mods() - for(var/obj/item/I in held_items) - if(I.item_flags & SLOWS_WHILE_IN_HAND) - . += I.slowdown +///Get all items in our possession that should affect our movespeed +/mob/proc/get_equipped_speed_mod_items() + . = list() + for(var/obj/item/thing in held_items) + if(thing.item_flags & SLOWS_WHILE_IN_HAND) + . += thing /mob/proc/set_stat(new_stat) if(new_stat == stat) @@ -1705,3 +1708,7 @@ set name = "View Skills" mind?.print_levels(src) + +/mob/key_down(key, client/client, full_key) + ..() + SEND_SIGNAL(src, COMSIG_MOB_KEYDOWN, key, client, full_key) diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 245afb86932..aaf654e6dba 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -200,4 +200,3 @@ var/active_typing_indicator ///the icon currently used for the thinking indicator's bubble var/active_thinking_indicator - diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index c48df46a2ae..464313e1a4f 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -47,8 +47,8 @@ /client/Move(new_loc, direct) if(world.time < move_delay) //do not move anything ahead of this check please return FALSE - next_move_dir_add = 0 - next_move_dir_sub = 0 + next_move_dir_add = NONE + next_move_dir_sub = NONE var/old_move_delay = move_delay move_delay = world.time + world.tick_lag //this is here because Move() can now be called mutiple times per tick if(!direct || !new_loc) @@ -76,7 +76,8 @@ return mob.remote_control.relaymove(mob, direct) if(isAI(mob)) - return AIMove(new_loc,direct,mob) + var/mob/living/silicon/ai/smoovin_ai = mob + return smoovin_ai.AIMove(direct) if(Process_Grab()) //are we restrained by someone's grip? return @@ -348,6 +349,8 @@ /mob/proc/slip(knockdown_amount, obj/slipped_on, lube_flags, paralyze, force_drop = FALSE) add_mob_memory(/datum/memory/was_slipped, antagonist = slipped_on) + SEND_SIGNAL(src, COMSIG_MOB_SLIPPED, knockdown_amount, slipped_on, lube_flags, paralyze, force_drop) + //bodypart selection verbs - Cyberboss //8: repeated presses toggles through head - eyes - mouth //7: mouth 8: head 9: eyes diff --git a/code/modules/mob_spawn/ghost_roles/venus_human_trap.dm b/code/modules/mob_spawn/ghost_roles/venus_human_trap.dm index af5203cc396..b9a89d0c6dd 100644 --- a/code/modules/mob_spawn/ghost_roles/venus_human_trap.dm +++ b/code/modules/mob_spawn/ghost_roles/venus_human_trap.dm @@ -11,6 +11,7 @@ flavour_text = "You are a venus human trap! Protect the kudzu at all costs, and feast on those who oppose you!" faction = list(FACTION_HOSTILE,FACTION_VINES,FACTION_PLANTS) spawner_job_path = /datum/job/venus_human_trap + invisibility = INVISIBILITY_ABSTRACT //The flower bud structure is our visible component, we just handle logic. /// Physical structure housing the spawner var/obj/structure/alien/resin/flower_bud/flower_bud /// Used to determine when to notify ghosts @@ -30,6 +31,10 @@ if(flower_bud.trait_flags & SPACEVINE_COLD_RESISTANT) spawned_human_trap.unsuitable_cold_damage = 0 +/obj/effect/mob_spawn/ghost_role/venus_human_trap/special(mob/living/spawned_mob, mob/mob_possessor) + . = ..() + spawned_mob.mind.add_antag_datum(/datum/antagonist/venus_human_trap) + /// Called when the attached flower bud has borne fruit (ie. is ready) /obj/effect/mob_spawn/ghost_role/venus_human_trap/proc/bear_fruit() ready = TRUE diff --git a/code/modules/mod/mod_construction.dm b/code/modules/mod/mod_construction.dm index fdbcf47d379..8442783d331 100644 --- a/code/modules/mod/mod_construction.dm +++ b/code/modules/mod/mod_construction.dm @@ -58,7 +58,7 @@ icon_state = "plasma-flower" desc = "A strange flower from the desolate wastes of lavaland. It pulses with a bright purple glow. \ Its shape is remarkably similar to that of a MOD core." - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_color = "#cc00cc" light_range = 2 diff --git a/code/modules/mod/mod_core.dm b/code/modules/mod/mod_core.dm index d5c43497982..75a5b2385b7 100644 --- a/code/modules/mod/mod_core.dm +++ b/code/modules/mod/mod_core.dm @@ -367,7 +367,7 @@ icon_state = "mod-core-plasma-flower" desc = "A strange flower from the desolate wastes of lavaland. It pulses with a strange purple glow. \ The wires coming out of it could be hooked into a MODsuit." - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_color = "#cc00cc" light_range = 2 // Slightly better than the normal plasma core. diff --git a/code/modules/mod/modules/modules_general.dm b/code/modules/mod/modules/modules_general.dm index 354d5564b10..9962bc8b9a4 100644 --- a/code/modules/mod/modules/modules_general.dm +++ b/code/modules/mod/modules/modules_general.dm @@ -365,7 +365,7 @@ incompatible_modules = list(/obj/item/mod/module/flashlight) cooldown_time = 0.5 SECONDS overlay_state_inactive = "module_light" - light_system = MOVABLE_LIGHT_DIRECTIONAL + light_system = OVERLAY_LIGHT_DIRECTIONAL light_color = COLOR_WHITE light_range = 4 light_power = 1 diff --git a/code/modules/mod/modules/modules_security.dm b/code/modules/mod/modules/modules_security.dm index 351f9f9a5d9..0b8c0299f04 100644 --- a/code/modules/mod/modules/modules_security.dm +++ b/code/modules/mod/modules/modules_security.dm @@ -18,7 +18,7 @@ /obj/item/mod/module/magnetic_harness/Initialize(mapload) . = ..() if(!guns_typecache) - guns_typecache = typecacheof(list(/obj/item/gun/ballistic, /obj/item/gun/energy, /obj/item/gun/grenadelauncher, /obj/item/gun/chem, /obj/item/gun/syringe, /obj/item/gun/microfusion)) //NOVA EDIT - MICROFUSION + guns_typecache = typecacheof(list(/obj/item/gun/ballistic, /obj/item/gun/energy, /obj/item/gun/grenadelauncher, /obj/item/gun/chem, /obj/item/gun/syringe)) /obj/item/mod/module/magnetic_harness/on_install() already_allowed_guns = guns_typecache & mod.chestplate.allowed @@ -579,7 +579,7 @@ #undef STORMTROOPER_MODE #undef SHARPSHOOTER_MODE -/obj/item/mod/module/anti_stagger +/obj/item/mod/module/shove_blocker name = "MOD bulwark module" desc = "Layers upon layers of shock dampening plates, just to stop you from getting shoved into a wall by an angry mob." icon_state = "bulwark" diff --git a/code/modules/mod/modules/modules_service.dm b/code/modules/mod/modules/modules_service.dm index 5381a26e88b..e6e4a01c664 100644 --- a/code/modules/mod/modules/modules_service.dm +++ b/code/modules/mod/modules/modules_service.dm @@ -70,13 +70,13 @@ /obj/item/mod/module/waddle/on_suit_activation() mod.boots.AddComponent(/datum/component/squeak, list('sound/effects/footstep/clownstep1.ogg'=1,'sound/effects/footstep/clownstep2.ogg'=1), 50, falloff_exponent = 20) //die off quick please - mod.wearer.AddElement(/datum/element/waddling) + mod.wearer.AddElementTrait(TRAIT_WADDLING, MOD_TRAIT, /datum/element/waddling) if(is_clown_job(mod.wearer.mind?.assigned_role)) mod.wearer.add_mood_event("clownshoes", /datum/mood_event/clownshoes) /obj/item/mod/module/waddle/on_suit_deactivation(deleting = FALSE) if(!deleting) qdel(mod.boots.GetComponent(/datum/component/squeak)) - mod.wearer.RemoveElement(/datum/element/waddling) + REMOVE_TRAIT(mod.wearer, TRAIT_WADDLING, MOD_TRAIT) if(is_clown_job(mod.wearer.mind?.assigned_role)) mod.wearer.clear_mood_event("clownshoes") diff --git a/code/modules/mod/modules/modules_supply.dm b/code/modules/mod/modules/modules_supply.dm index 1240a7adff3..80a662aba60 100644 --- a/code/modules/mod/modules/modules_supply.dm +++ b/code/modules/mod/modules/modules_supply.dm @@ -568,7 +568,7 @@ range = 6 suppressed = SUPPRESSED_VERY armor_flag = BOMB - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 1 light_power = 1 light_color = COLOR_LIGHT_ORANGE @@ -590,7 +590,7 @@ icon = 'icons/obj/clothing/modsuit/mod_modules.dmi' anchored = TRUE resistance_flags = FIRE_PROOF|LAVA_PROOF - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 1 light_power = 1 light_color = COLOR_LIGHT_ORANGE diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm index 8d0883fe47d..7994f6b4df3 100644 --- a/code/modules/modular_computers/computers/item/computer.dm +++ b/code/modules/modular_computers/computers/item/computer.dm @@ -10,7 +10,7 @@ integrity_failure = 0.5 max_integrity = 100 armor_type = /datum/armor/item_modular_computer - light_system = MOVABLE_LIGHT_DIRECTIONAL + light_system = OVERLAY_LIGHT_DIRECTIONAL ///The ID currently stored in the computer. var/obj/item/card/id/computer_id_slot diff --git a/code/modules/modular_computers/computers/item/disks/virus_disk.dm b/code/modules/modular_computers/computers/item/disks/virus_disk.dm index e3eac7736f5..3f646b22d8a 100644 --- a/code/modules/modular_computers/computers/item/disks/virus_disk.dm +++ b/code/modules/modular_computers/computers/item/disks/virus_disk.dm @@ -154,7 +154,7 @@ hidden_uplink.uplink_handler.generate_objectives() SStraitor.register_uplink_handler(hidden_uplink.uplink_handler) else - hidden_uplink.add_telecrystals(telecrystals) + hidden_uplink.uplink_handler.add_telecrystals(telecrystals) telecrystals = 0 hidden_uplink.locked = FALSE hidden_uplink.active = TRUE diff --git a/code/modules/modular_computers/computers/item/pda.dm b/code/modules/modular_computers/computers/item/pda.dm index 4d140b061a9..c9e620375d5 100644 --- a/code/modules/modular_computers/computers/item/pda.dm +++ b/code/modules/modular_computers/computers/item/pda.dm @@ -289,6 +289,7 @@ starting_programs = list( /datum/computer_file/program/contract_uplink, + /datum/computer_file/program/secureye/syndicate, ) /** diff --git a/code/modules/modular_computers/file_system/programs/radar.dm b/code/modules/modular_computers/file_system/programs/radar.dm index b506777f3de..34771cde63b 100644 --- a/code/modules/modular_computers/file_system/programs/radar.dm +++ b/code/modules/modular_computers/file_system/programs/radar.dm @@ -149,16 +149,13 @@ return RADAR_NOT_TRACKABLE var/turf/here = get_turf(computer) var/turf/there = get_turf(signal) - if(!here || !there) - return RADAR_NOT_TRACKABLE //I was still getting a runtime even after the above check while scanning, so fuck it - if(there.z != here.z && (!is_station_level(here.z) || !is_station_level(there.z))) + if(isnull(here) || isnull(there) || !is_valid_z_level(here, there)) return RADAR_NOT_TRACKABLE var/trackable_signal = SEND_SIGNAL(computer, COMSIG_MODULAR_COMPUTER_RADAR_TRACKABLE, signal, here, there) - switch(trackable_signal) - if(COMPONENT_RADAR_TRACK_ANYWAY) - return RADAR_TRACKABLE_ANYWAY - if(COMPONENT_RADAR_DONT_TRACK) - return RADAR_NOT_TRACKABLE + if(trackable_signal & COMPONENT_RADAR_TRACK_ANYWAY) + return RADAR_TRACKABLE_ANYWAY + if(trackable_signal & COMPONENT_RADAR_DONT_TRACK) + return RADAR_NOT_TRACKABLE return RADAR_TRACKABLE /** @@ -268,15 +265,16 @@ /datum/computer_file/program/radar/lifeline/trackable(mob/living/carbon/human/humanoid) . = ..() - if(. == RADAR_TRACKABLE_ANYWAY) - return RADAR_TRACKABLE_ANYWAY - if(!humanoid || !istype(humanoid)) + if(. != RADAR_TRACKABLE) + return . + if(!istype(humanoid)) return RADAR_NOT_TRACKABLE if(!istype(humanoid.w_uniform, /obj/item/clothing/under)) return RADAR_NOT_TRACKABLE var/obj/item/clothing/under/uniform = humanoid.w_uniform - if(uniform.has_sensor && uniform.sensor_mode >= SENSOR_COORDS) // Suit sensors must be on maximum - return RADAR_TRACKABLE + if(!uniform.has_sensor || uniform.sensor_mode < SENSOR_COORDS) // Suit sensors must be on maximum + return RADAR_NOT_TRACKABLE + return . ///Tracks all janitor equipment /datum/computer_file/program/radar/custodial_locator diff --git a/code/modules/modular_computers/file_system/programs/robocontrol.dm b/code/modules/modular_computers/file_system/programs/robocontrol.dm index 00bd00f3e67..68f7ba3ddef 100644 --- a/code/modules/modular_computers/file_system/programs/robocontrol.dm +++ b/code/modules/modular_computers/file_system/programs/robocontrol.dm @@ -49,6 +49,7 @@ var/mob/living/simple_animal/bot/mulebot/simple_mulebot = simple_bot mulelist += list(list( "name" = simple_mulebot.name, + "id" = simple_mulebot.id, "dest" = simple_mulebot.destination, "power" = simple_mulebot.cell ? simple_mulebot.cell.percent() : 0, "home" = simple_mulebot.home_destination, @@ -56,9 +57,8 @@ "autoPickup" = simple_mulebot.auto_pickup, "reportDelivery" = simple_mulebot.report_delivery, "mule_ref" = REF(simple_mulebot), + "load" = simple_mulebot.get_load_name(), )) - if(simple_mulebot.load) - data["load"] = simple_mulebot.load.name newbot["mule_check"] = TRUE botlist += list(newbot) diff --git a/code/modules/modular_computers/file_system/programs/secureye.dm b/code/modules/modular_computers/file_system/programs/secureye.dm index 8298b9ea2b5..3b2b9d5d1fe 100644 --- a/code/modules/modular_computers/file_system/programs/secureye.dm +++ b/code/modules/modular_computers/file_system/programs/secureye.dm @@ -61,7 +61,6 @@ cam_background = new cam_background.assigned_map = map_name cam_background.del_on_map_removal = FALSE - RegisterSignal(src, COMSIG_TRACKABLE_TRACKING_TARGET, PROC_REF(on_track_target)) /datum/computer_file/program/secureye/Destroy() QDEL_NULL(cam_screen) @@ -138,8 +137,8 @@ playsound(computer, get_sfx(SFX_TERMINAL_TYPE), 25, FALSE) if(isnull(camera_ref)) return TRUE - if(internal_tracker && internal_tracker.tracking) - internal_tracker.set_tracking(FALSE) + if(internal_tracker) + internal_tracker.reset_tracking() update_active_camera_screen() return TRUE @@ -147,7 +146,8 @@ if("start_tracking") if(!internal_tracker) internal_tracker = new(src) - internal_tracker.set_tracked_mob(usr) + RegisterSignal(internal_tracker, COMSIG_TRACKABLE_TRACKING_TARGET, PROC_REF(on_track_target)) + internal_tracker.track_input(usr) return TRUE /datum/computer_file/program/secureye/proc/on_track_target(datum/trackable/source, mob/living/target) @@ -169,8 +169,8 @@ /datum/computer_file/program/secureye/ui_close(mob/user) . = ..() //don't track anyone while we're shutting off. - if(internal_tracker && internal_tracker.tracking) - internal_tracker.set_tracking(FALSE) + if(internal_tracker) + internal_tracker.reset_tracking() var/user_ref = REF(user) var/is_living = isliving(user) // Living creature or not, we remove you anyway. diff --git a/code/modules/pai/pai.dm b/code/modules/pai/pai.dm index 494c39eb33f..0ead2e9fd2c 100644 --- a/code/modules/pai/pai.dm +++ b/code/modules/pai/pai.dm @@ -16,7 +16,7 @@ light_flags = LIGHT_ATTACHED light_on = FALSE light_range = 3 - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT maxHealth = 500 mob_size = MOB_SIZE_TINY mobility_flags = MOBILITY_FLAGS_REST_CAPABLE_DEFAULT diff --git a/code/modules/paperwork/carbonpaper.dm b/code/modules/paperwork/carbonpaper.dm index b2f985dc357..1dfe4ea7821 100644 --- a/code/modules/paperwork/carbonpaper.dm +++ b/code/modules/paperwork/carbonpaper.dm @@ -20,6 +20,12 @@ return . += span_notice("Right-click to tear off the carbon-copy (you must use both hands).") +/obj/item/paper/carbon/AltClick(mob/living/user) + if(!copied) + to_chat(user, span_notice("Take off the carbon copy first.")) + return + return ..() + /obj/item/paper/carbon/proc/removecopy(mob/living/user) if(copied) to_chat(user, span_notice("There are no more carbon copies attached to this paper!")) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 82517f72494..1c1daaad511 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -319,6 +319,7 @@ /obj/item/paper/examine(mob/user) . = ..() + . += span_notice("Alt-click [src] to fold it into a paper plane.") if(!in_range(user, src) && !isobserver(user)) . += span_warning("You're too far away to read it!") return @@ -358,6 +359,31 @@ return TRUE return ..() +/obj/item/paper/AltClick(mob/living/user) + . = ..() + if(!user.can_perform_action(src, NEED_DEXTERITY|NEED_HANDS)) + return + if(HAS_TRAIT(user, TRAIT_PAPER_MASTER)) + return make_plane(user, /obj/item/paperplane/syndicate) + return make_plane(user, /obj/item/paperplane) + + +/** + * Paper plane folding + * Makes a paperplane depending on args and returns it. + * + * Arguments: + * * mob/living/user - who's folding + * * obj/item/paperplane/plane_type - what it will be folded into (path) + */ +/obj/item/paper/proc/make_plane(mob/living/user, obj/item/paperplane/plane_type = /obj/item/paperplane) + balloon_alert(user, "folded into a plane") + user.temporarilyRemoveItemFromInventory(src) + var/obj/item/paperplane/new_plane = new plane_type(loc, src) + if(user.Adjacent(new_plane)) + user.put_in_hands(new_plane) + return new_plane + /obj/item/proc/burn_paper_product_attackby_check(obj/item/attacking_item, mob/living/user, bypass_clumsy = FALSE) //can't be put on fire! if((resistance_flags & FIRE_PROOF) || !(resistance_flags & FLAMMABLE)) diff --git a/code/modules/paperwork/paperplane.dm b/code/modules/paperwork/paperplane.dm index 3b377ddd6a9..9f1eec94ed0 100644 --- a/code/modules/paperwork/paperplane.dm +++ b/code/modules/paperwork/paperplane.dm @@ -3,6 +3,7 @@ desc = "Paper, folded in the shape of a plane." icon = 'icons/obj/service/bureaucracy.dmi' icon_state = "paperplane" + base_icon_state = "paperplane" custom_fire_overlay = "paperplane_onfire" throw_range = 7 throw_speed = 1 @@ -11,8 +12,10 @@ resistance_flags = FLAMMABLE max_integrity = 50 - var/hit_probability = 2 //% - var/obj/item/paper/internalPaper + ///The chance of hitting a mob in the eye when thrown, in percentage. + var/hit_probability = 2 + ///Reference to the paper that's folded up in this paperplane, which we return when unfolded. + var/obj/item/paper/internal_paper // NOVA EDIT START - Better paper planes /// How long does getting shot in the eyes knock you down for? @@ -27,38 +30,38 @@ /obj/item/paperplane/syndicate desc = "Paper, masterfully folded in the shape of a plane." - throwforce = 20 //same as throwing stars, but no chance of embedding. - hit_probability = 100 //guaranteed to cause eye damage when it hits a mob. + throwforce = 20 + hit_probability = 100 -/obj/item/paperplane/Initialize(mapload, obj/item/paper/newPaper) +/obj/item/paperplane/Initialize(mapload, obj/item/paper/paper_made_of) . = ..() pixel_x = base_pixel_x + rand(-9, 9) pixel_y = base_pixel_y + rand(-8, 8) - if(newPaper) - internalPaper = newPaper - flags_1 = newPaper.flags_1 - color = newPaper.color - newPaper.forceMove(src) + if(paper_made_of) + internal_paper = paper_made_of + flags_1 = paper_made_of.flags_1 + color = paper_made_of.color + paper_made_of.forceMove(src) else - internalPaper = new(src) - if(internalPaper.icon_state == "cpaper" || internalPaper.icon_state == "cpaper_words") - icon_state = "paperplane_carbon" // It's the purple carbon copy. Use the purple paper plane - update_appearance() + internal_paper = new(src) + if(istype(internal_paper, /obj/item/paper/carbon_copy)) + icon_state = "[base_icon_state]_carbon" + update_appearance(UPDATE_ICON) /obj/item/paperplane/Exited(atom/movable/gone, direction) . = ..() - if (internalPaper == gone) - internalPaper = null + if (internal_paper == gone) + internal_paper = null if(!QDELETED(src)) qdel(src) /obj/item/paperplane/Destroy() - internalPaper = null + internal_paper = null return ..() /obj/item/paperplane/suicide_act(mob/living/user) var/obj/item/organ/internal/eyes/eyes = user.get_organ_slot(ORGAN_SLOT_EYES) - user.Stun(200) + user.Stun(20 SECONDS) user.visible_message(span_suicide("[user] jams [src] in [user.p_their()] nose. It looks like [user.p_theyre()] trying to commit suicide!")) user.adjust_eye_blur(12 SECONDS) if(eyes) @@ -68,8 +71,8 @@ /obj/item/paperplane/update_overlays() . = ..() - for(var/stamp in internalPaper.stamp_cache) - . += "paperplane_[stamp]" + for(var/stamp in internal_paper.stamp_cache) + . += "[base_icon_state]_[stamp]" /obj/item/paperplane/attack_self(mob/user) balloon_alert(user, "unfolded") @@ -77,94 +80,45 @@ var/atom/location = drop_location() // Need to keep a reference to the internal paper // when we move it out of the plane, our ref gets set to null - var/obj/item/paper/internal_paper = internalPaper - internal_paper.forceMove(location) + var/obj/item/paper/released_paper = internal_paper + released_paper.forceMove(location) // This will as a side effect, qdel the paper plane, making the user's hands empty - user.put_in_hands(internal_paper) + user.put_in_hands(released_paper) -/obj/item/paperplane/attackby(obj/item/P, mob/living/carbon/human/user, params) - if(burn_paper_product_attackby_check(P, user)) +/obj/item/paperplane/attackby(obj/item/attacking_item, mob/user, params) + if(burn_paper_product_attackby_check(attacking_item, user)) return - if(istype(P, /obj/item/pen) || istype(P, /obj/item/toy/crayon)) + if(istype(attacking_item, /obj/item/pen) || istype(attacking_item, /obj/item/toy/crayon)) to_chat(user, span_warning("You should unfold [src] before changing it!")) return - - else if(istype(P, /obj/item/stamp)) //we don't randomize stamps on a paperplane - internalPaper.attackby(P, user) //spoofed attack to update internal paper. + else if(istype(attacking_item, /obj/item/stamp)) //we don't randomize stamps on a paperplane + internal_paper.attackby(attacking_item, user) //spoofed attack to update internal paper. update_appearance() add_fingerprint(user) return - return ..() - -/obj/item/paperplane/throw_at(atom/target, range, speed, mob/thrower, spin=FALSE, diagonals_first = FALSE, datum/callback/callback, gentle, quickstart = TRUE) - . = ..(target, range, speed, thrower, FALSE, diagonals_first, callback, quickstart = quickstart) - /obj/item/paperplane/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) - if(iscarbon(hit_atom)) - var/mob/living/carbon/C = hit_atom - if(C.can_catch_item(TRUE)) - var/datum/action/innate/origami/origami_action = locate() in C.actions - if(origami_action?.active) //if they're a master of origami and have the ability turned on, force throwmode on so they'll automatically catch the plane. - C.throw_mode_on(THROW_MODE_TOGGLE) - - if(..() || !ishuman(hit_atom))//if the plane is caught or it hits a nonhuman - // NOVA EDIT START - Better paper planes - if(delete_on_impact) - qdel(src) - // NOVA EDIT END - return - var/mob/living/carbon/human/H = hit_atom - var/obj/item/organ/internal/eyes/eyes = H.get_organ_slot(ORGAN_SLOT_EYES) - if(prob(hit_probability)) - if(H.is_eyes_covered()) - // NOVA EDIT START - Better paper planes - if(delete_on_impact) - qdel(src) - // NOVA EDIT END - return - visible_message(span_danger("\The [src] hits [H] in the eye[eyes ? "" : " socket"]!")) - H.adjust_eye_blur(12 SECONDS) - eyes?.apply_organ_damage(rand(impact_eye_damage_lower, impact_eye_damage_higher)) - H.Knockdown(40) - H.emote("scream") + if(iscarbon(hit_atom) && HAS_TRAIT(hit_atom, TRAIT_PAPER_MASTER)) + var/mob/living/carbon/hit_carbon = hit_atom + if(hit_carbon.can_catch_item(TRUE)) + hit_carbon.throw_mode_on(THROW_MODE_TOGGLE) - if(delete_on_impact) - qdel(src) - // NOVA EDIT END - -/obj/item/paper/examine(mob/user) . = ..() - . += span_notice("Alt-click [src] to fold it into a paper plane.") - -/obj/item/paper/AltClick(mob/living/user, obj/item/I) - if(!user.can_perform_action(src, NEED_DEXTERITY|NEED_HANDS)) + if(. || !ishuman(hit_atom)) //if the plane is caught or it hits a nonhuman return - if(istype(src, /obj/item/paper/carbon)) - var/obj/item/paper/carbon/Carbon = src - if(!Carbon.copied) - to_chat(user, span_notice("Take off the carbon copy first.")) - return - //Origami Master - var/datum/action/innate/origami/origami_action = locate() in user.actions - if(origami_action?.active) - make_plane(user, I, /obj/item/paperplane/syndicate) - else - make_plane(user, I, /obj/item/paperplane) + var/mob/living/carbon/human/hit_human = hit_atom + var/obj/item/organ/internal/eyes/eyes = hit_human.get_organ_slot(ORGAN_SLOT_EYES) + if(!prob(hit_probability)) + return + if(hit_human.is_eyes_covered()) + return + visible_message(span_danger("\The [src] hits [hit_human] in the eye[eyes ? "" : " socket"]!")) + hit_human.adjust_eye_blur(12 SECONDS) + eyes?.apply_organ_damage(rand(6, 8)) + hit_human.Paralyze(4 SECONDS) + hit_human.emote("scream") -/** - * Paper plane folding - * - * Arguments: - * * mob/living/user - who's folding - * * obj/item/I - what's being folded - * * obj/item/paperplane/plane_type - what it will be folded into (path) - */ -/obj/item/paper/proc/make_plane(mob/living/user, obj/item/I, obj/item/paperplane/plane_type = /obj/item/paperplane) - balloon_alert(user, "folded into a plane") - user.temporarilyRemoveItemFromInventory(src) - I = new plane_type(loc, src) - if(user.Adjacent(I)) - user.put_in_hands(I) +/obj/item/paperplane/throw_at(atom/target, range, speed, mob/thrower, spin=FALSE, diagonals_first = FALSE, datum/callback/callback, gentle, quickstart = TRUE) + return ..(target, range, speed, thrower, FALSE, diagonals_first, callback, quickstart = quickstart) diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 5ee432b365e..10a15e88196 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -325,7 +325,7 @@ armour_penetration = 20 bare_wound_bonus = 10 item_flags = NO_BLOOD_ON_ITEM - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 1.5 light_power = 0.75 light_color = COLOR_SOFT_RED diff --git a/code/modules/paperwork/ticketmachine.dm b/code/modules/paperwork/ticketmachine.dm index c24b8fd73e8..56b7343995a 100644 --- a/code/modules/paperwork/ticketmachine.dm +++ b/code/modules/paperwork/ticketmachine.dm @@ -39,10 +39,8 @@ tickets.Cut() return ..() -/obj/machinery/ticket_machine/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - new /obj/item/wallframe/ticket_machine(loc) - qdel(src) +/obj/machinery/ticket_machine/on_deconstruction(disassembled = TRUE) + new /obj/item/wallframe/ticket_machine(loc) MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/ticket_machine, 32) diff --git a/code/modules/photography/camera/camera.dm b/code/modules/photography/camera/camera.dm index dae12f33bd4..3f721c1cefc 100644 --- a/code/modules/photography/camera/camera.dm +++ b/code/modules/photography/camera/camera.dm @@ -10,7 +10,7 @@ worn_icon_state = "camera" lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi' - light_system = MOVABLE_LIGHT //Used as a flash here. + light_system = OVERLAY_LIGHT //Used as a flash here. light_range = 8 light_color = COLOR_WHITE light_power = FLASH_LIGHT_POWER diff --git a/code/modules/plumbing/plumbers/iv_drip.dm b/code/modules/plumbing/plumbers/iv_drip.dm index 4bf4d71ec9f..bbdb80f57b1 100644 --- a/code/modules/plumbing/plumbers/iv_drip.dm +++ b/code/modules/plumbing/plumbers/iv_drip.dm @@ -36,5 +36,5 @@ if(default_unfasten_wrench(user, tool) == SUCCESSFUL_UNFASTEN) return ITEM_INTERACT_SUCCESS -/obj/machinery/iv_drip/plumbing/deconstruct(disassembled = TRUE) +/obj/machinery/iv_drip/plumbing/on_deconstruction(disassembled) qdel(src) diff --git a/code/modules/power/apc/apc_main.dm b/code/modules/power/apc/apc_main.dm index b11b6c8b413..9835ae4aef8 100644 --- a/code/modules/power/apc/apc_main.dm +++ b/code/modules/power/apc/apc_main.dm @@ -299,9 +299,7 @@ else . += "The cover is closed." -/obj/machinery/power/apc/deconstruct(disassembled = TRUE) - if(obj_flags & NO_DECONSTRUCTION) - return +/obj/machinery/power/apc/on_deconstruction(disassembled = TRUE) if(!(machine_stat & BROKEN)) set_broken() if(opened != APC_COVER_REMOVED) diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index 68d40c85d11..ec6c23b00c6 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -162,16 +162,8 @@ /obj/item/stock_parts/cell/examine(mob/user) . = ..() - // NOVA EDIT ADDITION - if(ratingdesc && !microfusion_readout) - . += "This one has a rating of [display_energy(maxcharge)], and you should not swallow it." - // NOVA EDIT END if(rigged) . += span_danger("This power cell seems to be faulty!") - // NOVA EDIT ADDITION - else if(microfusion_readout) - . += "The charge meter reads [charge]/[maxcharge] MF." - // NOVA EDIT END else . += "The charge meter reads [CEILING(percent(), 0.1)]%." //so it doesn't say 0% charge when the overlay indicates it still has charge diff --git a/code/modules/power/lighting/light.dm b/code/modules/power/lighting/light.dm index 411b61a2539..4addd59d21c 100644 --- a/code/modules/power/lighting/light.dm +++ b/code/modules/power/lighting/light.dm @@ -430,10 +430,7 @@ if (prob(75)) electrocute_mob(user, get_area(src), src, (rand(7,10) * 0.1), TRUE) -/obj/machinery/light/deconstruct(disassembled = TRUE) - if(obj_flags & NO_DECONSTRUCTION) - qdel(src) - return +/obj/machinery/light/on_deconstruction(disassembled) var/obj/structure/light_construct/new_light = null var/current_stage = 2 if(!disassembled) @@ -462,7 +459,6 @@ new_light.cell = real_cell real_cell.forceMove(new_light) cell = null - qdel(src) /obj/machinery/light/attacked_by(obj/item/attacking_object, mob/living/user) ..() diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index 93a339c2cc2..54615fb1fc8 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -413,6 +413,14 @@ no power level overlay is currently in the overlays list. if(fields.len) ..() +/obj/machinery/field/generator/starts_on + anchored = TRUE + state = FG_WELDED + +/obj/machinery/field/generator/starts_on/Initialize(mapload) + . = ..() + turn_on() + #undef FG_UNSECURED #undef FG_SECURED #undef FG_WELDED diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index fdc193b9866..45587fa48d9 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -189,7 +189,7 @@ return ..() -/obj/machinery/power/smes/on_deconstruction() +/obj/machinery/power/smes/on_deconstruction(disassembled) for(var/obj/item/stock_parts/cell/cell in component_parts) cell.charge = (charge / capacity) * cell.maxcharge diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index 64c09a987ed..c62552913bb 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -121,18 +121,16 @@ visually_turn(new_angle) azimuth_current = new_angle -/obj/machinery/power/solar/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - if(disassembled) - var/obj/item/solar_assembly/S = locate() in src - if(S) - S.forceMove(loc) - S.give_glass(machine_stat & BROKEN) - else - playsound(src, SFX_SHATTER, 70, TRUE) - new /obj/item/shard(src.loc) - new /obj/item/shard(src.loc) - qdel(src) +/obj/machinery/power/solar/on_deconstruction(disassembled) + if(disassembled) + var/obj/item/solar_assembly/S = locate() in src + if(S) + S.forceMove(loc) + S.give_glass(machine_stat & BROKEN) + else + playsound(src, SFX_SHATTER, 70, TRUE) + new /obj/item/shard(src.loc) + new /obj/item/shard(src.loc) /obj/machinery/power/solar/update_overlays() . = ..() diff --git a/code/modules/power/thermoelectric_generator.dm b/code/modules/power/thermoelectric_generator.dm index 1f8319ad51d..bded1482825 100644 --- a/code/modules/power/thermoelectric_generator.dm +++ b/code/modules/power/thermoelectric_generator.dm @@ -42,7 +42,7 @@ SSair.stop_processing_machine(src) return ..() -/obj/machinery/power/thermoelectric_generator/on_deconstruction() +/obj/machinery/power/thermoelectric_generator/on_deconstruction(disassembled) null_circulators() /obj/machinery/power/thermoelectric_generator/update_overlays() diff --git a/code/modules/power/tracker.dm b/code/modules/power/tracker.dm index d39840f875e..a6118e9ac09 100644 --- a/code/modules/power/tracker.dm +++ b/code/modules/power/tracker.dm @@ -137,18 +137,16 @@ playsound(loc, 'sound/effects/glassbr3.ogg', 100, TRUE) unset_control() -/obj/machinery/power/tracker/deconstruct(disassembled = TRUE) - if(!(obj_flags & NO_DECONSTRUCTION)) - if(disassembled) - var/obj/item/solar_assembly/S = locate() in src - if(S) - S.forceMove(loc) - S.give_glass(machine_stat & BROKEN) - else - playsound(src, SFX_SHATTER, 70, TRUE) - new /obj/item/shard(src.loc) - new /obj/item/shard(src.loc) - qdel(src) +/obj/machinery/power/tracker/on_deconstruction(disassembled) + if(disassembled) + var/obj/item/solar_assembly/S = locate() in src + if(S) + S.forceMove(loc) + S.give_glass(machine_stat & BROKEN) + else + playsound(src, SFX_SHATTER, 70, TRUE) + new /obj/item/shard(src.loc) + new /obj/item/shard(src.loc) // Tracker Electronic diff --git a/code/modules/power/turbine/turbine.dm b/code/modules/power/turbine/turbine.dm index fa1a885044a..3f4d3fd8446 100644 --- a/code/modules/power/turbine/turbine.dm +++ b/code/modules/power/turbine/turbine.dm @@ -179,7 +179,7 @@ if(default_deconstruction_crowbar(tool)) return ITEM_INTERACT_SUCCESS -/obj/machinery/power/turbine/on_deconstruction() +/obj/machinery/power/turbine/on_deconstruction(disassembled) installed_part?.forceMove(loc) return ..() @@ -547,7 +547,7 @@ disconnect_from_network() SSair.stop_processing_machine(src) -/obj/machinery/power/turbine/core_rotor/on_deconstruction() +/obj/machinery/power/turbine/core_rotor/on_deconstruction(disassembled) deactivate_parts() return ..() diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 05fbb8a31de..b89c48a3fe2 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -123,7 +123,6 @@ ammo_type[i] = shot shot = ammo_type[select] fire_sound = shot.fire_sound - fire_sound_volume = shot.fire_sound_volume //NOVA EDIT ADDITION fire_delay = shot.delay /obj/item/gun/energy/Destroy() @@ -205,7 +204,6 @@ select = 1 var/obj/item/ammo_casing/energy/shot = ammo_type[select] fire_sound = shot.fire_sound - fire_sound_volume = shot.fire_sound_volume //NOVA EDIT ADDITION fire_delay = shot.delay if (shot.select_name && user) balloon_alert(user, "set to [shot.select_name]") diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 2a7095af0f2..f3791f174f6 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -9,7 +9,7 @@ armor_flag = LASER eyeblur = 4 SECONDS impact_effect_type = /obj/effect/temp_visual/impact_effect/red_laser - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 1 light_power = 1 light_color = COLOR_SOFT_RED diff --git a/code/modules/reagents/chemistry/equilibrium.dm b/code/modules/reagents/chemistry/equilibrium.dm index c3ccc000207..4ab88b3caa6 100644 --- a/code/modules/reagents/chemistry/equilibrium.dm +++ b/code/modules/reagents/chemistry/equilibrium.dm @@ -390,11 +390,15 @@ reaction_quality = purity //post reaction checks - if(!(check_fail_states(total_step_added))) + if(!check_fail_states(total_step_added)) to_delete = TRUE return //If the volume of reagents created(total_step_added) >= volume of reagents still to be created(step_target_vol) then end //i.e. we have created all the reagents needed for this reaction - if(total_step_added >= step_target_vol) + //This is only accurate when a single reaction is present and we don't have multiple reactions where + //reaction B consumes the products formed from reaction A(which can happen in add_reagent() as it also triggers handle_reactions() which can consume the reagent just added) + //because total_step_added will be higher than the actual volume that was created leading to the reaction ending early + //and yielding less products than intended + if(total_step_added >= step_target_vol && length(holder.reaction_list) == 1) to_delete = TRUE diff --git a/code/modules/reagents/chemistry/holder/holder.dm b/code/modules/reagents/chemistry/holder/holder.dm index a4e149a2bc8..d32cd92361b 100644 --- a/code/modules/reagents/chemistry/holder/holder.dm +++ b/code/modules/reagents/chemistry/holder/holder.dm @@ -304,29 +304,36 @@ return total_removed //this should be amount unless the loop is prematurely broken, in which case it'll be lower. It shouldn't ever go OVER amount. /** - * Removes all reagents by an amount equal to - * [amount specified] / total volume present in this holder + * Removes all reagents either proportionally(amount is the direct volume to remove) + * when proportional the total volume of all reagents removed will equal to amount + * or relatively(amount is a percentile between 0->1) when relative amount is the % + * of each reagent to be removed + * * Arguments * - * * amount - the volume of each reagent + * * amount - the amount to remove + * * relative - if TRUE amount is treated as an percentage between 0->1. If FALSE amount is the direct volume to remove */ - -/datum/reagents/proc/remove_all(amount = 1) +/datum/reagents/proc/remove_all(amount = 1, relative = FALSE) if(!total_volume) return FALSE if(!IS_FINITE(amount)) stack_trace("non finite amount passed to remove all reagents [amount]") return FALSE + if(relative && (amount < 0 || amount > 1)) + stack_trace("illegal percentage value passed to remove all reagents [amount]") + return FALSE amount = round(amount, CHEMICAL_QUANTISATION_LEVEL) if(amount <= 0) return FALSE var/list/cached_reagents = reagent_list - var/part = amount / total_volume var/total_removed_amount = 0 - + var/part = amount + if(!relative) + part /= total_volume for(var/datum/reagent/reagent as anything in cached_reagents) total_removed_amount += remove_reagent(reagent.type, reagent.volume * part) diff --git a/code/modules/reagents/chemistry/holder/reactions.dm b/code/modules/reagents/chemistry/holder/reactions.dm index 8005e45427b..5d0e5480e5a 100644 --- a/code/modules/reagents/chemistry/holder/reactions.dm +++ b/code/modules/reagents/chemistry/holder/reactions.dm @@ -97,8 +97,6 @@ if((selected_reaction.reaction_flags & REACTION_INSTANT) || (flags & REAGENT_HOLDER_INSTANT_REACT)) //If we have instant reactions, we process them here instant_react(selected_reaction) .++ - update_total() - continue else var/exists = FALSE for(var/datum/equilibrium/E_exist as anything in reaction_list) diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index 6fcd63e4ca1..d2e5fdaea29 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -552,7 +552,7 @@ update_appearance() return TRUE -/obj/machinery/chem_dispenser/on_deconstruction() +/obj/machinery/chem_dispenser/on_deconstruction(disassembled) cell = null if(beaker) beaker.forceMove(drop_location()) diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm index 6c036d37bef..a07fd289f07 100644 --- a/code/modules/reagents/chemistry/machinery/chem_heater.dm +++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm @@ -25,7 +25,7 @@ create_reagents(200, NO_REACT) register_context() -/obj/machinery/chem_heater/on_deconstruction() +/obj/machinery/chem_heater/on_deconstruction(disassembled) beaker?.forceMove(drop_location()) /obj/machinery/chem_heater/Destroy() diff --git a/code/modules/reagents/chemistry/machinery/chem_mass_spec.dm b/code/modules/reagents/chemistry/machinery/chem_mass_spec.dm index 90de91a6aaf..c871fa47110 100644 --- a/code/modules/reagents/chemistry/machinery/chem_mass_spec.dm +++ b/code/modules/reagents/chemistry/machinery/chem_mass_spec.dm @@ -58,14 +58,13 @@ This will not clean any inverted reagents. Inverted reagents will still be corre for(var/datum/stock_part/micro_laser/laser in component_parts) cms_coefficient /= laser.tier -/obj/machinery/chem_mass_spec/deconstruct(disassembled) +/obj/machinery/chem_mass_spec/on_deconstruction(disassembled) if(beaker1) beaker1.forceMove(drop_location()) beaker1 = null if(beaker2) beaker2.forceMove(drop_location()) beaker2 = null - . = ..() /obj/machinery/chem_mass_spec/update_overlays() . = ..() diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index b263baefb82..c07b62d732c 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -59,7 +59,7 @@ QDEL_NULL(beaker) return ..() -/obj/machinery/chem_master/on_deconstruction() +/obj/machinery/chem_master/on_deconstruction(disassembled) replace_beaker() return ..() diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm index 586cb0ce8fa..bbde13c78a8 100644 --- a/code/modules/reagents/chemistry/machinery/pandemic.dm +++ b/code/modules/reagents/chemistry/machinery/pandemic.dm @@ -108,7 +108,7 @@ update_appearance() SStgui.update_uis(src) -/obj/machinery/computer/pandemic/on_deconstruction() +/obj/machinery/computer/pandemic/on_deconstruction(disassembled) eject_beaker() . = ..() diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm index f4be905a073..e7a6c9839eb 100644 --- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm +++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm @@ -42,11 +42,10 @@ QDEL_NULL(beaker) update_appearance() -/obj/machinery/reagentgrinder/deconstruct() +/obj/machinery/reagentgrinder/on_deconstruction(disassmbled) drop_all_items() beaker?.forceMove(drop_location()) beaker = null - return ..() /obj/machinery/reagentgrinder/Destroy() QDEL_NULL(beaker) diff --git a/code/modules/reagents/chemistry/machinery/smoke_machine.dm b/code/modules/reagents/chemistry/machinery/smoke_machine.dm index a8d1765891b..e91aea78d59 100644 --- a/code/modules/reagents/chemistry/machinery/smoke_machine.dm +++ b/code/modules/reagents/chemistry/machinery/smoke_machine.dm @@ -111,10 +111,9 @@ return return ..() -/obj/machinery/smoke_machine/deconstruct() +/obj/machinery/smoke_machine/on_deconstruction(disassembled) reagents.expose(loc, TOUCH) reagents.clear_reagents() - return ..() /obj/machinery/smoke_machine/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) diff --git a/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm index acf4b68829e..7ae1b3f4ffa 100644 --- a/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm @@ -589,37 +589,55 @@ taste_description = "oranges" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/ethanol/screwdrivercocktail/on_transfer(atom/atom, methods = TOUCH, trans_volume) - if(!(methods & INGEST)) - return ..() - - if(src == atom.reagents.get_master_reagent() && istype(atom, /obj/item/reagent_containers/cup/glass/drinkingglass)) - var/obj/item/reagent_containers/cup/glass/drinkingglass/drink = atom - drink.tool_behaviour = TOOL_SCREWDRIVER +/datum/reagent/consumable/ethanol/screwdrivercocktail/on_new(data) + . = ..() + // We want to turn only base drinking glasses with screwdriver(cocktail) into screwdrivers(tool), + // but we can't check style so we have to check type, and we don't want it match subtypes like istype does + if(holder?.my_atom && holder.my_atom.type == /obj/item/reagent_containers/cup/glass/drinkingglass/) var/list/reagent_change_signals = list( COMSIG_REAGENTS_ADD_REAGENT, COMSIG_REAGENTS_NEW_REAGENT, COMSIG_REAGENTS_REM_REAGENT, - COMSIG_REAGENTS_DEL_REAGENT, - COMSIG_REAGENTS_CLEAR_REAGENTS, - COMSIG_REAGENTS_REACTED, ) - RegisterSignals(drink.reagents, reagent_change_signals, PROC_REF(on_reagent_change)) - - return ..() + RegisterSignals(holder, reagent_change_signals, PROC_REF(on_reagent_change)) + RegisterSignal(holder, COMSIG_REAGENTS_CLEAR_REAGENTS, PROC_REF(on_reagents_clear)) + RegisterSignal(holder, COMSIG_REAGENTS_DEL_REAGENT, PROC_REF(on_reagent_delete)) + if(src == holder.get_master_reagent()) + var/obj/item/reagent_containers/cup/glass/drinkingglass/drink = holder.my_atom + drink.tool_behaviour = TOOL_SCREWDRIVER + drink.usesound = list('sound/items/screwdriver.ogg', 'sound/items/screwdriver2.ogg') /datum/reagent/consumable/ethanol/screwdrivercocktail/proc/on_reagent_change(datum/reagents/reagents) SIGNAL_HANDLER - if(src != reagents.get_master_reagent()) - var/obj/item/reagent_containers/cup/glass/drinkingglass/drink = reagents.my_atom + var/obj/item/reagent_containers/cup/glass/drinkingglass/drink = reagents.my_atom + if(reagents.get_master_reagent() == src) + drink.tool_behaviour = TOOL_SCREWDRIVER + drink.usesound = list('sound/items/screwdriver.ogg', 'sound/items/screwdriver2.ogg') + else + drink.tool_behaviour = initial(drink.tool_behaviour) + drink.usesound = initial(drink.usesound) + +/datum/reagent/consumable/ethanol/screwdrivercocktail/proc/on_reagents_clear(datum/reagents/reagents) + SIGNAL_HANDLER + unregister_screwdriver(reagents) + +/datum/reagent/consumable/ethanol/screwdrivercocktail/proc/on_reagent_delete(datum/reagents/reagents, datum/reagent/deleted_reagent) + SIGNAL_HANDLER + if(deleted_reagent != src) + return + unregister_screwdriver(reagents) + +/datum/reagent/consumable/ethanol/screwdrivercocktail/proc/unregister_screwdriver(datum/reagents/reagents) + var/obj/item/reagent_containers/cup/glass/drinkingglass/drink = reagents.my_atom + if(drink.tool_behaviour == TOOL_SCREWDRIVER) drink.tool_behaviour = initial(drink.tool_behaviour) - UnregisterSignal(reagents, list( + drink.usesound = initial(drink.usesound) + UnregisterSignal(reagents, list( COMSIG_REAGENTS_ADD_REAGENT, COMSIG_REAGENTS_NEW_REAGENT, COMSIG_REAGENTS_REM_REAGENT, COMSIG_REAGENTS_DEL_REAGENT, COMSIG_REAGENTS_CLEAR_REAGENTS, - COMSIG_REAGENTS_REACTED, )) /datum/reagent/consumable/ethanol/screwdrivercocktail/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) @@ -1195,7 +1213,7 @@ /datum/reagent/consumable/ethanol/changelingsting/on_mob_life(mob/living/carbon/target, seconds_per_tick, times_fired) . = ..() - var/datum/antagonist/changeling/changeling = target.mind?.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/changeling = IS_CHANGELING(target) changeling?.adjust_chemicals(metabolization_rate * REM * seconds_per_tick) /datum/reagent/consumable/ethanol/irishcarbomb diff --git a/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm index e76e0e8fbb5..8443dc3ea32 100644 --- a/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm @@ -454,8 +454,10 @@ affected_mob.set_drugginess(1 MINUTES * REM * seconds_per_tick) affected_mob.adjust_dizzy(3 SECONDS * REM * seconds_per_tick) affected_mob.remove_status_effect(/datum/status_effect/drowsiness) - affected_mob.AdjustSleeping(-40 * REM * seconds_per_tick) + affected_mob.AdjustSleeping(-4 SECONDS * REM * seconds_per_tick) affected_mob.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * seconds_per_tick, affected_mob.get_body_temp_normal()) + if (SSradiation.can_irradiate_basic(affected_mob)) + affected_mob.AddComponent(/datum/component/irradiated) /datum/reagent/consumable/rootbeer name = "root beer" @@ -1170,6 +1172,7 @@ quality = DRINK_GOOD taste_description = "citrus soda with cucumber" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_HIGH /datum/reagent/consumable/cucumberlemonade/on_mob_life(mob/living/carbon/doll, seconds_per_tick, times_fired) . = ..() diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index d192eb3730d..b2c8689b73c 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -279,9 +279,9 @@ . = ..() var/need_mob_update if(affected_mob.getFireLoss() > 25) - need_mob_update = affected_mob.adjustFireLoss(-4 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) //Twice as effective as AIURI for severe burns + need_mob_update = affected_mob.adjustFireLoss(-4 * REM * seconds_per_tick * normalise_creation_purity(), updating_health = FALSE, required_bodytype = affected_bodytype) //Twice as effective as AIURI for severe burns else - need_mob_update = affected_mob.adjustFireLoss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) //But only a quarter as effective for more minor ones + need_mob_update = affected_mob.adjustFireLoss(-0.5 * REM * seconds_per_tick * normalise_creation_purity(), updating_health = FALSE, required_bodytype = affected_bodytype) //But only a quarter as effective for more minor ones if(need_mob_update) return UPDATE_MOB_HEALTH @@ -554,9 +554,9 @@ . = ..() var/need_mob_update if(affected_mob.getBruteLoss() > 25) - need_mob_update = affected_mob.adjustBruteLoss(-4 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update = affected_mob.adjustBruteLoss(-4 * REM * seconds_per_tick * normalise_creation_purity(), updating_health = FALSE, required_bodytype = affected_bodytype) else - need_mob_update = affected_mob.adjustBruteLoss(-0.5 * REM * seconds_per_tick, updating_health = FALSE, required_bodytype = affected_bodytype) + need_mob_update = affected_mob.adjustBruteLoss(-0.5 * REM * seconds_per_tick * normalise_creation_purity(), updating_health = FALSE, required_bodytype = affected_bodytype) if(need_mob_update) return UPDATE_MOB_HEALTH @@ -1278,7 +1278,7 @@ need_mob_update = affected_mob.adjustBruteLoss(-5 * REM * seconds_per_tick, updating_health = FALSE) //A ton of healing - this is a 50 telecrystal investment. need_mob_update += affected_mob.adjustFireLoss(-5 * REM * seconds_per_tick, updating_health = FALSE) need_mob_update += affected_mob.adjustOxyLoss(-15 * REM * seconds_per_tick, updating_health = FALSE) - need_mob_update += affected_mob.adjustToxLoss(-5 * REM * seconds_per_tick, updating_health = FALSE) + need_mob_update += affected_mob.adjustToxLoss(-5 * REM * seconds_per_tick, updating_health = FALSE, forced = TRUE, required_biotype = affected_biotype) need_mob_update += affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, -15 * REM * seconds_per_tick) if(need_mob_update) return UPDATE_MOB_HEALTH diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 41f53be4c7f..eae91eb38a5 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -2556,7 +2556,7 @@ /datum/reagent/bz_metabolites/on_mob_life(mob/living/carbon/target, seconds_per_tick, times_fired) . = ..() if(target.mind) - var/datum/antagonist/changeling/changeling = target.mind.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/changeling = IS_CHANGELING(target) if(changeling) changeling.adjust_chemicals(-4 * REM * seconds_per_tick) //NOVA EDIT - BZ-BUFF-VS-LING - ORIGINAL: changeling.adjust_chemicals(-2 * REM * seconds_per_tick) @@ -2879,10 +2879,16 @@ taste_description = "tiny legs scuttling down the back of your throat" metabolization_rate = 5 * REAGENTS_METABOLISM //1u per second ph = 4.6 // Ants contain Formic Acid - /// How much damage the ants are going to be doing (rises with each tick the ants are in someone's body) - var/ant_damage = 0 + /// Number of ticks the ants have been in the person's body + var/ant_ticks = 0 + /// Amount of damage done per tick the ants have been in the person's system + var/ant_damage = 0.025 /// Tells the debuff how many ants we are being covered with. var/amount_left = 0 + /// Decal to spawn when spilled + var/ants_decal = /obj/effect/decal/cleanable/ants + /// Status effect applied by splashing ants + var/status_effect = /datum/status_effect/ants /// List of possible common statements to scream when eating ants var/static/list/ant_screams = list( "THEY'RE UNDER MY SKIN!!", @@ -2899,15 +2905,15 @@ /datum/reagent/ants/on_mob_life(mob/living/carbon/victim, seconds_per_tick) . = ..() - victim.adjustBruteLoss(max(0.1, round((ant_damage * 0.025),0.1))) //Scales with time. Roughly 32 brute with 100u. - ant_damage++ - if(ant_damage < 5) // Makes ant food a little more appetizing, since you won't be screaming as much. + victim.adjustBruteLoss(max(0.1, round((ant_ticks * ant_damage),0.1))) //Scales with time. Roughly 32 brute with 100u. + ant_ticks++ + if(ant_ticks < 5) // Makes ant food a little more appetizing, since you won't be screaming as much. return if(SPT_PROB(5, seconds_per_tick)) if(SPT_PROB(5, seconds_per_tick)) //Super rare statement - victim.say("AUGH NO NOT THE ANTS! NOT THE ANTS! AAAAUUGH THEY'RE IN MY EYES! MY EYES! AUUGH!!", forced = /datum/reagent/ants) + victim.say("AUGH NO NOT THE ANTS! NOT THE ANTS! AAAAUUGH THEY'RE IN MY EYES! MY EYES! AUUGH!!", forced = type) else - victim.say(pick(ant_screams), forced = /datum/reagent/ants) + victim.say(pick(ant_screams), forced = type) if(SPT_PROB(15, seconds_per_tick)) victim.emote("scream") if(SPT_PROB(2, seconds_per_tick)) // Stuns, but purges ants. @@ -2915,8 +2921,8 @@ /datum/reagent/ants/on_mob_end_metabolize(mob/living/living_anthill) . = ..() - ant_damage = 0 - to_chat(living_anthill, "You feel like the last of the ants are out of your system.") + ant_ticks = 0 + to_chat(living_anthill, span_notice("You feel like the last of the [name] are out of your system.")) /datum/reagent/ants/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) . = ..() @@ -2924,7 +2930,7 @@ return if(methods & (PATCH|TOUCH|VAPOR)) amount_left = round(reac_volume,0.1) - exposed_mob.apply_status_effect(/datum/status_effect/ants, amount_left) + exposed_mob.apply_status_effect(status_effect, amount_left) /datum/reagent/ants/expose_obj(obj/exposed_obj, reac_volume) . = ..() @@ -2943,14 +2949,28 @@ if((reac_volume <= 10)) // Makes sure people don't duplicate ants. return - var/obj/effect/decal/cleanable/ants/pests = exposed_turf.spawn_unique_cleanable(/obj/effect/decal/cleanable/ants) + var/obj/effect/decal/cleanable/ants/pests = exposed_turf.spawn_unique_cleanable(ants_decal) if(!pests) return var/spilled_ants = (round(reac_volume,1) - 5) // To account for ant decals giving 3-5 ants on initialize. - pests.reagents.add_reagent(/datum/reagent/ants, spilled_ants) + pests.reagents.add_reagent(type, spilled_ants) pests.update_ant_damage() +/datum/reagent/ants/fire + name = "Fire ants" + description = "A rare mutation of space ants, born from the heat of a plasma fire. Their bites land a 3.7 on the Schmidt Pain Scale." + color = "#b51f1f" + taste_description = "tiny flaming legs scuttling down the back of your throat" + ant_damage = 0.05 // Roughly 64 brute with 100u + ants_decal = /obj/effect/decal/cleanable/ants/fire + status_effect = /datum/status_effect/ants/fire + +/datum/glass_style/drinking_glass/fire_ants + required_drink_type = /datum/reagent/ants/fire + name = "glass of fire ants" + desc = "This is a terrible idea." + //This is intended to a be a scarce reagent to gate certain drugs and toxins with. Do not put in a synthesizer. Renewable sources of this reagent should be inefficient. /datum/reagent/lead name = "Lead" diff --git a/code/modules/reagents/reagent_containers/cups/_cup.dm b/code/modules/reagents/reagent_containers/cups/_cup.dm index c8aa790fa15..47fcc4ddda3 100644 --- a/code/modules/reagents/reagent_containers/cups/_cup.dm +++ b/code/modules/reagents/reagent_containers/cups/_cup.dm @@ -126,6 +126,7 @@ var/trans = reagents.trans_to(target, amount_per_transfer_from_this, transferred_by = user) to_chat(user, span_notice("You transfer [trans] unit\s of the solution to [target].")) + SEND_SIGNAL(src, COMSIG_REAGENTS_CUP_TRANSFER_TO, target) else if(target.is_drainable()) //A dispenser. Transfer FROM it TO us. if(!target.reagents.total_volume) @@ -138,6 +139,7 @@ var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this, transferred_by = user) to_chat(user, span_notice("You fill [src] with [trans] unit\s of the contents of [target].")) + SEND_SIGNAL(src, COMSIG_REAGENTS_CUP_TRANSFER_FROM, target) target.update_appearance() diff --git a/code/modules/reagents/reagent_containers/cups/drinkingglass.dm b/code/modules/reagents/reagent_containers/cups/drinkingglass.dm index 8745e61cd92..adcd2ff79fa 100644 --- a/code/modules/reagents/reagent_containers/cups/drinkingglass.dm +++ b/code/modules/reagents/reagent_containers/cups/drinkingglass.dm @@ -30,6 +30,7 @@ CALLBACK(src, PROC_REF(on_cup_reset)), \ base_container_type = base_container_type, \ ) + RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, PROC_REF(on_cleaned)) /obj/item/reagent_containers/cup/glass/drinkingglass/on_reagent_change(datum/reagents/holder, ...) . = ..() @@ -46,6 +47,22 @@ . = ..() fill_icon_thresholds ||= list(0) +/obj/item/reagent_containers/cup/glass/drinkingglass/examine(mob/user) + . = ..() + if(HAS_TRAIT(src, TRAIT_WAS_RENAMED)) + . += span_notice("This glass has been given a custom name. It can be removed by washing it.") + +/obj/item/reagent_containers/cup/glass/drinkingglass/proc/on_cleaned(obj/source_component, obj/source) + SIGNAL_HANDLER + if(!HAS_TRAIT(src, TRAIT_WAS_RENAMED)) + return + + REMOVE_TRAIT(src, TRAIT_WAS_RENAMED, SHAKER_LABEL_TRAIT) + REMOVE_TRAIT(src, TRAIT_WAS_RENAMED, PEN_LABEL_TRAIT) + name = initial(name) + desc = initial(desc) + update_appearance(UPDATE_NAME | UPDATE_DESC) + //Shot glasses!// // This lets us add shots in here instead of lumping them in with drinks because >logic // // The format for shots is the exact same as iconstates for the drinking glass, except you use a shot glass instead. // diff --git a/code/modules/reagents/reagent_containers/cups/drinks.dm b/code/modules/reagents/reagent_containers/cups/drinks.dm index 12a3d023c72..cba2f937da4 100644 --- a/code/modules/reagents/reagent_containers/cups/drinks.dm +++ b/code/modules/reagents/reagent_containers/cups/drinks.dm @@ -426,6 +426,7 @@ // itself), in Chemistry-Recipes.dm (for the reaction that changes the components into the drink), and here (for the drinking glass // icon states. + /obj/item/reagent_containers/cup/glass/shaker name = "shaker" desc = "A metal shaker to mix drinks in." @@ -435,14 +436,86 @@ amount_per_transfer_from_this = 10 volume = 100 isGlass = FALSE + /// Whether or not poured drinks should use custom names and descriptions + var/using_custom_drinks = FALSE + /// Name custom drinks will have + var/custom_drink_name = "Custom drink" + /// Description custom drinks will have + var/custom_drink_desc = "Mixed by your favourite bartender!" /obj/item/reagent_containers/cup/glass/shaker/Initialize(mapload) . = ..() + register_context() if(prob(10)) name = "\improper Nanotrasen 20th Anniversary Shaker" desc += " It has an emblazoned Nanotrasen logo on it." icon_state = "shaker_n" +/obj/item/reagent_containers/cup/glass/shaker/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = ..() + context[SCREENTIP_CONTEXT_ALT_LMB] = "[using_custom_drinks ? "Disable" : "Enable"] custom drinks" + return CONTEXTUAL_SCREENTIP_SET + +/obj/item/reagent_containers/cup/glass/shaker/examine(mob/user) + . = ..() + . += span_notice("Alt-click to [using_custom_drinks ? "disable" : "enable"] custom drink naming") + if(using_custom_drinks) + . += span_notice("Drinks poured from this shaker will have the following name: [custom_drink_name]") + . += span_notice("Drinks poured from this shaker will have the following description: [custom_drink_desc]") + +/obj/item/reagent_containers/cup/glass/shaker/AltClick(mob/user) + . = ..() + if(!user.can_perform_action(src, NEED_HANDS|FORBID_TELEKINESIS_REACH)) + return + + if(using_custom_drinks) + using_custom_drinks = FALSE + disable_custom_drinks() + balloon_alert(user, "custom drinks disabled") + return + + var/new_name = reject_bad_text(tgui_input_text(user, "Drink name", "Set drink name", custom_drink_name, 45, FALSE), 64) + if(!new_name) + balloon_alert(user, "invalid drink name!") + using_custom_drinks = FALSE + return + + if(!user.can_perform_action(src, NEED_HANDS|FORBID_TELEKINESIS_REACH)) + return + + var/new_desc = reject_bad_text(tgui_input_text(user, "Drink description", "Set drink description", custom_drink_desc, 64, TRUE), 128) + if(!new_desc) + balloon_alert(user, "invalid drink description!") + using_custom_drinks = FALSE + return + + if(!user.can_perform_action(src, NEED_HANDS|FORBID_TELEKINESIS_REACH)) + return + + using_custom_drinks = TRUE + custom_drink_name = new_name + custom_drink_desc = new_desc + + enable_custom_drinks() + balloon_alert(user, "now pouring custom drinks") + +/obj/item/reagent_containers/cup/glass/shaker/proc/enable_custom_drinks() + RegisterSignal(src, COMSIG_REAGENTS_CUP_TRANSFER_TO, PROC_REF(handle_transfer)) + +/obj/item/reagent_containers/cup/glass/shaker/proc/disable_custom_drinks() + UnregisterSignal(src, COMSIG_REAGENTS_CUP_TRANSFER_TO) + +/obj/item/reagent_containers/cup/glass/shaker/proc/handle_transfer(atom/origin, atom/target) + SIGNAL_HANDLER + // Should only work on drinking/shot glasses + if(!istype(target, /obj/item/reagent_containers/cup/glass/drinkingglass)) + return + + var/obj/item/reagent_containers/cup/glass/drinkingglass/target_glass = target + target_glass.name = custom_drink_name + target_glass.desc = custom_drink_desc + ADD_TRAIT(target_glass, TRAIT_WAS_RENAMED, SHAKER_LABEL_TRAIT) + /obj/item/reagent_containers/cup/glass/flask name = "flask" desc = "Every good spaceman knows it's a good idea to bring along a couple of pints of whiskey wherever they go." diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index af246ae6e67..4cbb4839416 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -352,3 +352,11 @@ volume = 15 amount_per_transfer_from_this = 15 list_reagents = list(/datum/reagent/medicine/mutadone = 15) + +/obj/item/reagent_containers/hypospray/medipen/penthrite + name = "penthrite autoinjector" + desc = "Experimental heart medication." + icon_state = "atropen" + inhand_icon_state = "atropen" + base_icon_state = "atropen" + list_reagents = list(/datum/reagent/medicine/c2/penthrite = 10) diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 4366482460e..3bff3a3abba 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -267,6 +267,12 @@ list_reagents = list((toxin_to_get) = 5) return ..() +/obj/item/reagent_containers/syringe/crude/mushroom + list_reagents = list(/datum/reagent/drug/mushroomhallucinogen = 5) + +/obj/item/reagent_containers/syringe/crude/blastoff + list_reagents = list(/datum/reagent/drug/blastoff = 5) + /obj/item/reagent_containers/syringe/spider_extract name = "spider extract syringe" desc = "Contains crikey juice - makes any gold core create the most deadly companions in the world." diff --git a/code/modules/recycling/conveyor.dm b/code/modules/recycling/conveyor.dm index 14108f22bd9..cb008252037 100644 --- a/code/modules/recycling/conveyor.dm +++ b/code/modules/recycling/conveyor.dm @@ -92,6 +92,10 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) if(.) set_operating(TRUE) +/obj/machinery/conveyor/auto/inverted + icon_state = "conveyor_map_inverted" + flipped = TRUE + // create a conveyor /obj/machinery/conveyor/Initialize(mapload, new_dir, new_id) ..() diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm index 2d1478a3e82..1550e0ac968 100644 --- a/code/modules/recycling/disposal/bin.dm +++ b/code/modules/recycling/disposal/bin.dm @@ -276,20 +276,18 @@ H.vent_gas(loc) qdel(H) -/obj/machinery/disposal/deconstruct(disassembled = TRUE) +/obj/machinery/disposal/on_deconstruction(disassembled) var/turf/T = loc - if(!(obj_flags & NO_DECONSTRUCTION)) - if(stored) - var/obj/structure/disposalconstruct/construct = stored - stored = null - construct.forceMove(T) - transfer_fingerprints_to(construct) - construct.set_anchored(FALSE) - construct.set_density(TRUE) - construct.update_appearance() + if(stored) + var/obj/structure/disposalconstruct/construct = stored + stored = null + construct.forceMove(T) + transfer_fingerprints_to(construct) + construct.set_anchored(FALSE) + construct.set_density(TRUE) + construct.update_appearance() for(var/atom/movable/AM in src) //out, out, darned crowbar! AM.forceMove(T) - ..() ///How disposal handles getting a storage dump from a storage object /obj/machinery/disposal/proc/on_storage_dump(datum/source, datum/storage/storage, mob/user) @@ -307,6 +305,16 @@ to_dump.pixel_x = to_dump.base_pixel_x + rand(-5, 5) to_dump.pixel_y = to_dump.base_pixel_y + rand(-5, 5) +/obj/machinery/disposal/force_pushed(atom/movable/pusher, force = MOVE_FORCE_DEFAULT, direction) + . = ..() + visible_message(span_warning("[src] is ripped free from the floor!")) + deconstruct() + +/obj/machinery/disposal/move_crushed(atom/movable/pusher, force = MOVE_FORCE_DEFAULT, direction) + . = ..() + visible_message(span_warning("[src] is ripped free from the floor!")) + deconstruct() + // Disposal bin // Holds items for disposal into pipe system // Draws air from turf, gradually charges internal reservoir diff --git a/code/modules/recycling/disposal/construction.dm b/code/modules/recycling/disposal/construction.dm index b1556ca679f..4b8fef12924 100644 --- a/code/modules/recycling/disposal/construction.dm +++ b/code/modules/recycling/disposal/construction.dm @@ -33,12 +33,12 @@ pipename = initial(pipe_type.name) - AddComponent(/datum/component/simple_rotation, AfterRotation = CALLBACK(src, PROC_REF(AfterRotation))) + AddComponent(/datum/component/simple_rotation, post_rotation = CALLBACK(src, PROC_REF(post_rotation))) AddElement(/datum/element/undertile, TRAIT_T_RAY_VISIBLE) if(flip) var/datum/component/simple_rotation/rotcomp = GetComponent(/datum/component/simple_rotation) - rotcomp.Rotate(usr, ROTATION_FLIP) // this only gets used by pipes created by RPDs or pipe dispensers + rotcomp.rotate(usr, ROTATION_FLIP) // this only gets used by pipes created by RPDs or pipe dispensers update_appearance(UPDATE_ICON) @@ -86,7 +86,7 @@ dpdir |= REVERSE_DIR(dir) return dpdir -/obj/structure/disposalconstruct/proc/AfterRotation(mob/user, degrees) +/obj/structure/disposalconstruct/proc/post_rotation(mob/user, degrees) if(degrees == ROTATION_FLIP) var/obj/structure/disposalpipe/temp = pipe_type if(initial(temp.flip_type)) diff --git a/code/modules/recycling/disposal/outlet.dm b/code/modules/recycling/disposal/outlet.dm index 4fa9f1e0aab..6773e574d35 100644 --- a/code/modules/recycling/disposal/outlet.dm +++ b/code/modules/recycling/disposal/outlet.dm @@ -137,6 +137,24 @@ eject_range = EJECT_RANGE_YEET return TRUE +/obj/structure/disposaloutlet/force_pushed(atom/movable/pusher, force = MOVE_FORCE_DEFAULT, direction) + . = ..() + if(!isnull(stored)) + stored.forceMove(loc) + transfer_fingerprints_to(stored) + stored = null + visible_message(span_warning("[src] is ripped free from the floor!")) + qdel(src) + +/obj/structure/disposaloutlet/move_crushed(atom/movable/pusher, force = MOVE_FORCE_DEFAULT, direction) + . = ..() + if(!isnull(stored)) + stored.forceMove(loc) + transfer_fingerprints_to(stored) + stored = null + visible_message(span_warning("[src] is ripped free from the floor!")) + qdel(src) + #undef EJECT_SPEED_SLOW #undef EJECT_SPEED_MED #undef EJECT_SPEED_FAST diff --git a/code/modules/research/anomaly/anomaly_refinery.dm b/code/modules/research/anomaly/anomaly_refinery.dm index 533443a1995..1805a252318 100644 --- a/code/modules/research/anomaly/anomaly_refinery.dm +++ b/code/modules/research/anomaly/anomaly_refinery.dm @@ -295,7 +295,7 @@ return FALSE tank_to_target = (tank_to_target == inserted_bomb.tank_one) ? inserted_bomb.tank_two : inserted_bomb.tank_one -/obj/machinery/research/anomaly_refinery/on_deconstruction() +/obj/machinery/research/anomaly_refinery/on_deconstruction(disassembled) eject_bomb() eject_core() return ..() diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index 0b09edf44ac..46e43b0ac66 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -679,28 +679,64 @@ /datum/design/implant_chem name = "Chemical Implant Case" - desc = "A glass case containing an implant." + desc = "A glass case containing a chemical implant." id = "implant_chem" build_type = PROTOLATHE | AWAY_LATHE - materials = list(/datum/material/glass = SMALL_MATERIAL_AMOUNT*7) + materials = list(/datum/material/glass = SMALL_MATERIAL_AMOUNT * 7) build_path = /obj/item/implantcase/chem category = list( - RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_MISC + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_SECURITY ) departmental_flags = DEPARTMENT_BITFLAG_SECURITY | DEPARTMENT_BITFLAG_MEDICAL /datum/design/implant_tracking name = "Tracking Implant Case" - desc = "A glass case containing an implant." + desc = "A glass case containing a tracking implant." id = "implant_tracking" build_type = PROTOLATHE | AWAY_LATHE - materials = list(/datum/material/iron =SMALL_MATERIAL_AMOUNT*5, /datum/material/glass =SMALL_MATERIAL_AMOUNT*5) + materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 5, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 5) build_path = /obj/item/implantcase/tracking category = list( - RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_MISC + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_SECURITY ) departmental_flags = DEPARTMENT_BITFLAG_SECURITY | DEPARTMENT_BITFLAG_MEDICAL +/datum/design/implant_beacon + name = "Beacon Implant Case" + desc = "A glass case containing a beacon implant." + id = "implant_beacon" + build_type = PROTOLATHE | AWAY_LATHE + materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 5, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 5, /datum/material/bluespace = SMALL_MATERIAL_AMOUNT * 3) + build_path = /obj/item/implantcase/beacon + category = list( + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_SECURITY + ) + departmental_flags = DEPARTMENT_BITFLAG_SECURITY + +/datum/design/implant_bluespace + name = "Bluespace Grounding Implant Case" + desc = "A glass case containing a teleport blocker implant." + id = "implant_bluespace" + build_type = PROTOLATHE | AWAY_LATHE + materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 5, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 5, /datum/material/bluespace = SMALL_MATERIAL_AMOUNT * 3) + build_path = /obj/item/implantcase/teleport_blocker + category = list( + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_SECURITY + ) + departmental_flags = DEPARTMENT_BITFLAG_SECURITY + +/datum/design/implant_exile + name = "Exile Implant Case" + desc = "A glass case containing an exile implant." + id = "implant_exile" + build_type = PROTOLATHE | AWAY_LATHE + materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 5, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 5, /datum/material/titanium = SMALL_MATERIAL_AMOUNT * 3) + build_path = /obj/item/implantcase/exile + category = list( + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_SECURITY + ) + departmental_flags = DEPARTMENT_BITFLAG_SECURITY + //Cybernetic organs /datum/design/cybernetic_liver diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm index ae8f7e43a40..e17b53da692 100644 --- a/code/modules/research/designs/misc_designs.dm +++ b/code/modules/research/designs/misc_designs.dm @@ -972,7 +972,7 @@ category = list( RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SERVICE ) - departmental_flags = DEPARTMENT_BITFLAG_SERVICE + departmental_flags = DEPARTMENT_BITFLAG_SERVICE | DEPARTMENT_BITFLAG_CARGO | DEPARTMENT_BITFLAG_SCIENCE /datum/design/stabilized_hook name = "Gyro-Stabilized Hook" @@ -984,7 +984,19 @@ category = list( RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SERVICE ) - departmental_flags = DEPARTMENT_BITFLAG_SERVICE + departmental_flags = DEPARTMENT_BITFLAG_SERVICE | DEPARTMENT_BITFLAG_CARGO | DEPARTMENT_BITFLAG_SCIENCE + +/datum/design/auto_reel + name = "Fishing Line Auto-Reel" + desc = "An advanced line reel which can be used speed up both fishing and casually snagging other items in your direction." + id = "auto_reel" + build_type = PROTOLATHE | AWAY_LATHE + materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 4, /datum/material/gold = SMALL_MATERIAL_AMOUNT * 3, /datum/material/silver = SMALL_MATERIAL_AMOUNT * 3) + build_path = /obj/item/fishing_line/auto_reel + category = list( + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SERVICE + ) + departmental_flags = DEPARTMENT_BITFLAG_SERVICE | DEPARTMENT_BITFLAG_CARGO | DEPARTMENT_BITFLAG_SCIENCE /datum/design/fish_analyzer name = "Fish Analyzer" @@ -996,7 +1008,7 @@ category = list( RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SERVICE ) - departmental_flags = DEPARTMENT_BITFLAG_SERVICE + departmental_flags = DEPARTMENT_BITFLAG_SERVICE | DEPARTMENT_BITFLAG_CARGO | DEPARTMENT_BITFLAG_SCIENCE // Coffeemaker Stuff diff --git a/code/modules/research/machinery/_production.dm b/code/modules/research/machinery/_production.dm index 0ae8df4d8a4..9e4f3adaec3 100644 --- a/code/modules/research/machinery/_production.dm +++ b/code/modules/research/machinery/_production.dm @@ -23,6 +23,7 @@ . = ..() cached_designs = list() + materials = AddComponent( /datum/component/remote_materials, \ mapload, \ @@ -65,7 +66,6 @@ stripe.color = stripe_color . += stripe - /obj/machinery/rnd/production/examine(mob/user) . = ..() if(!in_range(user, src) && !isobserver(user)) @@ -144,7 +144,8 @@ /obj/machinery/rnd/proc/process_item(obj/item/item_inserted, list/mats_consumed, amount_inserted) PRIVATE_PROC(TRUE) - if(directly_use_power(round((amount_inserted / SHEET_MATERIAL_AMOUNT) * active_power_usage * 0.00025))) + //we use initial(active_power_usage) because higher tier parts will have higher active usage but we have no benifit from it + if(directly_use_power(ROUND_UP((amount_inserted / (MAX_STACK_SIZE * SHEET_MATERIAL_AMOUNT)) * 0.01 * initial(active_power_usage)))) var/mat_name = "iron" var/highest_mat = 0 @@ -206,6 +207,7 @@ */ /obj/machinery/rnd/production/proc/build_efficiency(path) PROTECTED_PROC(TRUE) // NOVA EDIT CHANGE - ORIGINAL: PRIVATE_PROC(TRUE) + SHOULD_BE_PURE(TRUE) if(ispath(path, /obj/item/stack/sheet) || ispath(path, /obj/item/stack/ore/bluespace_crystal)) return 1 @@ -285,6 +287,11 @@ if(isnull(amount)) return + //we use initial(active_power_usage) because higher tier parts will have higher active usage but we have no benifit from it + if(!directly_use_power(ROUND_UP((amount / MAX_STACK_SIZE) * 0.01 * initial(active_power_usage)))) + say("No power to dispense sheets") + return + materials.eject_sheets(material, amount) return TRUE @@ -330,7 +337,7 @@ var/charge_per_item = 0 for(var/material in design.materials) charge_per_item += design.materials[material] - charge_per_item = min(active_power_usage, round(charge_per_item * coefficient)) + charge_per_item = ROUND_UP((charge_per_item / (MAX_STACK_SIZE * SHEET_MATERIAL_AMOUNT)) * coefficient * 0.05 * active_power_usage) var/build_time_per_item = (design.construction_time * design.lathe_time_factor) ** 0.8 //start production diff --git a/code/modules/research/machinery/protolathe.dm b/code/modules/research/machinery/protolathe.dm index fb912bba67c..7a81a5cd36f 100644 --- a/code/modules/research/machinery/protolathe.dm +++ b/code/modules/research/machinery/protolathe.dm @@ -6,7 +6,7 @@ production_animation = "protolathe_n" allowed_buildtypes = PROTOLATHE -/obj/machinery/rnd/production/protolathe/deconstruct(disassembled) +/obj/machinery/rnd/production/protolathe/on_deconstruction(disassembled) log_game("Protolathe of type [type] [disassembled ? "disassembled" : "deconstructed"] by [key_name(usr)] at [get_area_name(src, TRUE)]") return ..() diff --git a/code/modules/research/ordnance/doppler_array.dm b/code/modules/research/ordnance/doppler_array.dm index a109e5061df..a6fe3c9f3ac 100644 --- a/code/modules/research/ordnance/doppler_array.dm +++ b/code/modules/research/ordnance/doppler_array.dm @@ -18,7 +18,7 @@ var/obj/item/computer_disk/inserted_disk // Lighting system to better communicate the directions. - light_system = MOVABLE_LIGHT_DIRECTIONAL + light_system = OVERLAY_LIGHT_DIRECTIONAL light_range = 4 light_power = 1 light_color = COLOR_RED @@ -237,7 +237,7 @@ else if (machine_stat & NOPOWER) . += mutable_appearance(icon, "[base_icon_state]_screen-off") -/obj/machinery/doppler_array/on_deconstruction() +/obj/machinery/doppler_array/on_deconstruction(disassembled) eject_disk() . = ..() diff --git a/code/modules/research/ordnance/tank_compressor.dm b/code/modules/research/ordnance/tank_compressor.dm index ff03b368291..830c004acad 100644 --- a/code/modules/research/ordnance/tank_compressor.dm +++ b/code/modules/research/ordnance/tank_compressor.dm @@ -238,7 +238,7 @@ update_appearance() return ..() -/obj/machinery/atmospherics/components/binary/tank_compressor/on_deconstruction() +/obj/machinery/atmospherics/components/binary/tank_compressor/on_deconstruction(disassembled) eject_tank() eject_disk() return ..() diff --git a/code/modules/research/rdmachines.dm b/code/modules/research/rdmachines.dm index a8fa3e36d47..58d7f1f29cf 100644 --- a/code/modules/research/rdmachines.dm +++ b/code/modules/research/rdmachines.dm @@ -150,7 +150,7 @@ return TRUE //we eject the loaded item when deconstructing the machine -/obj/machinery/rnd/on_deconstruction() +/obj/machinery/rnd/on_deconstruction(disassembled) if(loaded_item) loaded_item.forceMove(drop_location()) ..() diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm index b3c10eaac93..e446672bc33 100644 --- a/code/modules/research/server.dm +++ b/code/modules/research/server.dm @@ -230,7 +230,7 @@ to_chat(user, span_notice("You delicately cut the wire. [hdd_wires] wire\s left...")) return TRUE -/obj/machinery/rnd/server/master/on_deconstruction() +/obj/machinery/rnd/server/master/on_deconstruction(disassembled) // If the machine contains a source code HDD, destroying it will negatively impact research speed. Safest to log this. if(source_code_hdd) // Destroyed with a hard drive inside = harm income diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 6cd0688eae6..4a02e368a8e 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -1340,12 +1340,24 @@ "c38_trac", "implant_chem", "implant_tracking", + "implant_exile", "implantcase", "implanter", "locator", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) +/datum/techweb_node/advanced_implants + id = "adv_subdermal_implants" + display_name = "Advanced Subdermal Implants" + description = "Subdermal implants that leverage bluespace research to control their bluespace signature." + prereq_ids = list("subdermal_implants", "micro_bluespace") + design_ids = list( + "implant_beacon", + "implant_bluespace", + ) + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + /datum/techweb_node/cyber_organs id = "cyber_organs" display_name = "Cybernetic Organs" @@ -1537,6 +1549,7 @@ design_ids = list( "fishing_rod_tech", "stabilized_hook", + "auto_reel", "fish_analyzer", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000) diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm index f07444c22f1..cbeec46225d 100644 --- a/code/modules/shuttle/supply.dm +++ b/code/modules/shuttle/supply.dm @@ -30,6 +30,7 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( /obj/structure/blob, /obj/structure/checkoutmachine, /obj/structure/disposalpipe, + /obj/structure/disposaloutlet, /obj/structure/extraction_point, /obj/structure/guardian_beacon, /obj/tear_in_reality, diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm index bf231c76cd0..dc107e973da 100644 --- a/code/modules/surgery/bodyparts/dismemberment.dm +++ b/code/modules/surgery/bodyparts/dismemberment.dm @@ -215,8 +215,8 @@ associated_hand?.update_appearance() if(arm_owner.gloves) arm_owner.dropItemToGround(arm_owner.gloves, TRUE) + . = ..() arm_owner.update_worn_gloves() //to remove the bloody hands overlay - return ..() /obj/item/bodypart/leg/drop_limb(special, dismembered, move_to_floor = TRUE) if(owner && !special) @@ -367,6 +367,14 @@ new_head_owner.update_body() new_head_owner.update_damage_overlays() +/obj/item/bodypart/arm/try_attach_limb(mob/living/carbon/new_arm_owner, special = FALSE) + . = ..() + + if(!.) + return + + new_arm_owner.update_worn_gloves() // To apply bloody hands overlay + /mob/living/carbon/proc/regenerate_limbs(list/excluded_zones = list()) SEND_SIGNAL(src, COMSIG_CARBON_REGENERATE_LIMBS, excluded_zones) var/list/zone_list = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG) diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm index 7b407a5c9f4..eb9a9f56df5 100644 --- a/code/modules/surgery/bodyparts/head.dm +++ b/code/modules/surgery/bodyparts/head.dm @@ -70,11 +70,6 @@ ///Current lipstick trait, if any (such as TRAIT_KISS_OF_DEATH) var/stored_lipstick_trait - /// Draw this head as "debrained" - VAR_PROTECTED/show_debrained = FALSE - /// Draw this head as missing eyes - VAR_PROTECTED/show_eyeless = FALSE - /// Offset to apply to equipment worn on the ears var/datum/worn_feature_offset/worn_ears_offset /// Offset to apply to equipment worn on the eyes @@ -86,6 +81,16 @@ /// Offset to apply to overlays placed on the face var/datum/worn_feature_offset/worn_face_offset + VAR_PROTECTED + /// Draw this head as "debrained" + show_debrained = FALSE + + /// Draw this head as missing eyes + show_eyeless = FALSE + + /// Can this head be dismembered normally? + can_dismember = TRUE //FLUFFY FRONTIER EDIT. ORIGINAL //can_dismember = FALSE + /obj/item/bodypart/head/Destroy() QDEL_NULL(worn_ears_offset) QDEL_NULL(worn_glasses_offset) @@ -124,8 +129,12 @@ . += span_info("[real_name]'s tongue has been removed.") /obj/item/bodypart/head/can_dismember(obj/item/item) + if (!can_dismember) + return FALSE + if(owner.stat < HARD_CRIT) return FALSE + return ..() /obj/item/bodypart/head/drop_organs(mob/user, violent_removal) diff --git a/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm index 7f514ecdaf4..30f34cb35d0 100644 --- a/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm +++ b/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm @@ -183,6 +183,7 @@ is_dimorphic = FALSE should_draw_greyscale = FALSE head_flags = HEAD_EYESPRITES|HEAD_DEBRAIN + can_dismember = TRUE /obj/item/bodypart/chest/zombie limb_id = SPECIES_ZOMBIE diff --git a/code/modules/surgery/bodyparts/wounds.dm b/code/modules/surgery/bodyparts/wounds.dm index deaa734dd64..1fc16c7ca8f 100644 --- a/code/modules/surgery/bodyparts/wounds.dm +++ b/code/modules/surgery/bodyparts/wounds.dm @@ -75,7 +75,7 @@ injury_roll += check_woundings_mods(woundtype, damage, wound_bonus, bare_wound_bonus) var/list/series_wounding_mods = check_series_wounding_mods() - if(injury_roll > WOUND_DISMEMBER_OUTRIGHT_THRESH && prob(get_damage() / max_damage * 100)) + if(injury_roll > WOUND_DISMEMBER_OUTRIGHT_THRESH && prob(get_damage() / max_damage * 100) && can_dismember()) var/datum/wound/loss/dismembering = new dismembering.apply_dismember(src, woundtype, outright = TRUE, attack_direction = attack_direction) return @@ -123,10 +123,13 @@ possible_wounds -= other_path continue - while (length(possible_wounds)) + while (TRUE) var/datum/wound/possible_wound = pick_weight(possible_wounds) - var/datum/wound_pregen_data/possible_pregen_data = GLOB.all_wound_pregen_data[possible_wound] + if (isnull(possible_wound)) + break + possible_wounds -= possible_wound + var/datum/wound_pregen_data/possible_pregen_data = GLOB.all_wound_pregen_data[possible_wound] var/datum/wound/replaced_wound for(var/datum/wound/existing_wound as anything in wounds) diff --git a/code/modules/surgery/bone_mending.dm b/code/modules/surgery/bone_mending.dm index 48114fe6d04..cac9051ceb4 100644 --- a/code/modules/surgery/bone_mending.dm +++ b/code/modules/surgery/bone_mending.dm @@ -153,15 +153,18 @@ var/obj/item/stack/used_stack = tool used_stack.use(1) +#define IMPLEMENTS_THAT_FIX_BONES list( \ + /obj/item/stack/medical/bone_gel = 100, \ + /obj/item/stack/sticky_tape/surgical = 100, \ + /obj/item/stack/sticky_tape/super = 50, \ + /obj/item/stack/sticky_tape = 30, \ +) + ///// Repair Compound Fracture (Crticial) /datum/surgery_step/repair_bone_compound name = "repair compound fracture (bone gel/tape)" - implements = list( - /obj/item/stack/medical/bone_gel = 100, - /obj/item/stack/sticky_tape/surgical = 100, - /obj/item/stack/sticky_tape/super = 50, - /obj/item/stack/sticky_tape = 30) + implements = IMPLEMENTS_THAT_FIX_BONES time = 40 /datum/surgery_step/repair_bone_compound/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) @@ -200,3 +203,87 @@ if(isstack(tool)) var/obj/item/stack/used_stack = tool used_stack.use(1) + +/// Surgery to repair cranial fissures +/datum/surgery/cranial_reconstruction + name = "Cranial reconstruction" + surgery_flags = SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_REQUIRES_REAL_LIMB + targetable_wound = /datum/wound/cranial_fissure + possible_locs = list( + BODY_ZONE_HEAD, + ) + steps = list( + /datum/surgery_step/clamp_bleeders/discard_skull_debris, + /datum/surgery_step/repair_skull + ) + +/datum/surgery/cranial_reconstruction/can_start(mob/living/user, mob/living/carbon/target) + . = ..() + if(!.) + return FALSE + + var/obj/item/bodypart/targeted_bodypart = target.get_bodypart(user.zone_selected) + return !isnull(targeted_bodypart.get_wound_type(targetable_wound)) + +/datum/surgery_step/clamp_bleeders/discard_skull_debris + name = "discard skull debris (hemostat)" + implements = list( + TOOL_HEMOSTAT = 100, + TOOL_WIRECUTTER = 40, + TOOL_SCREWDRIVER = 40, + ) + time = 2.4 SECONDS + preop_sound = 'sound/surgery/hemostat1.ogg' + +/datum/surgery_step/clamp_bleeders/discard_skull_debris/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + display_results( + user, + target, + span_notice("You begin to discard the smaller skull debris in [target]'s [parse_zone(target_zone)]..."), + span_notice("[user] begins to discard the smaller skull debris in [target]'s [parse_zone(target_zone)]..."), + span_notice("[user] begins to poke around in [target]'s [parse_zone(target_zone)]..."), + ) + + display_pain(target, "Your brain feels like it's getting stabbed by little shards of glass!") + +/datum/surgery_step/repair_skull + name = "repair skull (bone gel/tape)" + implements = IMPLEMENTS_THAT_FIX_BONES + time = 4 SECONDS + +/datum/surgery_step/repair_skull/preop(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery) + ASSERT(surgery.operated_wound, "Repairing skull without a wound") + + display_results( + user, + target, + span_notice("You begin to repair [target]'s skull as best you can..."), + span_notice("[user] begins to repair [target]'s skull with [tool]."), + span_notice("[user] begins to repair [target]'s skull."), + ) + + display_pain(target, "You can feel pieces of your skull rubbing against your brain!") + +/datum/surgery_step/repair_skull/success(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) + if (isnull(surgery.operated_wound)) + to_chat(user, span_warning("[target]'s skull is fine!")) + return ..() + + + if (isstack(tool)) + var/obj/item/stack/used_stack = tool + used_stack.use(1) + + display_results( + user, + target, + span_notice("You successfully repair [target]'s skull."), + span_notice("[user] successfully repairs [target]'s skull with [tool]."), + span_notice("[user] successfully repairs [target]'s skull.") + ) + + qdel(surgery.operated_wound) + + return ..() + +#undef IMPLEMENTS_THAT_FIX_BONES diff --git a/code/modules/surgery/organs/external/spines.dm b/code/modules/surgery/organs/external/spines.dm index d632246500b..8865de124fc 100644 --- a/code/modules/surgery/organs/external/spines.dm +++ b/code/modules/surgery/organs/external/spines.dm @@ -8,6 +8,7 @@ slot = ORGAN_SLOT_EXTERNAL_SPINES preference = "feature_lizard_spines" + //dna_block = DNA_SPINES_BLOCK // NOVA EDIT REMOVAL - Customization - We have our own system to handle DNA. restyle_flags = EXTERNAL_RESTYLE_FLESH diff --git a/code/modules/surgery/organs/external/tails.dm b/code/modules/surgery/organs/external/tails.dm index 1e8cf71b5f0..5a9ffad05d3 100644 --- a/code/modules/surgery/organs/external/tails.dm +++ b/code/modules/surgery/organs/external/tails.dm @@ -23,7 +23,6 @@ /obj/item/organ/external/tail/Insert(mob/living/carbon/receiver, special, movement_flags) . = ..() if(.) - RegisterSignal(receiver, COMSIG_ORGAN_WAG_TAIL, PROC_REF(wag)) original_owner ||= WEAKREF(receiver) receiver.clear_mood_event("tail_lost") @@ -74,54 +73,58 @@ . = ..() if(wag_flags & WAG_WAGGING) - wag(organ_owner, start = FALSE) - - UnregisterSignal(organ_owner, COMSIG_ORGAN_WAG_TAIL) + stop_wag(organ_owner) if(type in organ_owner.dna.species.external_organs) organ_owner.add_mood_event("tail_lost", /datum/mood_event/tail_lost) organ_owner.add_mood_event("tail_balance_lost", /datum/mood_event/tail_balance_lost) -/obj/item/organ/external/tail/proc/wag(mob/living/carbon/organ_owner, start = TRUE, stop_after = 0) - if(!(wag_flags & WAG_ABLE)) - return - - if(start) - if(start_wag(organ_owner) && stop_after) - addtimer(CALLBACK(src, PROC_REF(wag), organ_owner, FALSE), stop_after, TIMER_STOPPABLE|TIMER_DELETE_ME) - else - stop_wag(organ_owner) - ///We need some special behaviour for accessories, wrapped here so we can easily add more interactions later -/obj/item/organ/external/tail/proc/start_wag(mob/living/carbon/organ_owner) - if(wag_flags & WAG_WAGGING) // we are already wagging +///Accepts an optional timeout after which we remove the tail wagging +///Returns false if the wag worked, true otherwise +/obj/item/organ/external/tail/proc/start_wag(mob/living/carbon/organ_owner, stop_after = INFINITY) + if(wag_flags & WAG_WAGGING || !(wag_flags & WAG_ABLE)) // we are already wagging return FALSE if(organ_owner.stat == DEAD || organ_owner != owner) // no wagging when owner is dead or tail has been disembodied return FALSE + if(stop_after != INFINITY) + addtimer(CALLBACK(src, PROC_REF(stop_wag), organ_owner), stop_after, TIMER_STOPPABLE|TIMER_DELETE_ME) + var/datum/bodypart_overlay/mutant/tail/accessory = bodypart_overlay wag_flags |= WAG_WAGGING accessory.wagging = TRUE if(tail_spines_overlay) //if there are spines, they should wag with the tail tail_spines_overlay.wagging = TRUE organ_owner.update_body_parts() - RegisterSignal(organ_owner, COMSIG_LIVING_DEATH, PROC_REF(stop_wag)) + RegisterSignal(organ_owner, COMSIG_LIVING_DEATH, PROC_REF(owner_died)) return TRUE +/obj/item/organ/external/tail/proc/owner_died(mob/living/carbon/organ_owner) // Resisting the urge to replace owner with daddy + SIGNAL_HANDLER + stop_wag(organ_owner) + ///We need some special behaviour for accessories, wrapped here so we can easily add more interactions later +///Returns false if the wag stopping worked, true otherwise /obj/item/organ/external/tail/proc/stop_wag(mob/living/carbon/organ_owner) - SIGNAL_HANDLER + if(!(wag_flags & WAG_ABLE)) + return FALSE - var/datum/bodypart_overlay/mutant/tail/accessory = bodypart_overlay - wag_flags &= ~WAG_WAGGING - accessory.wagging = FALSE + var/succeeded = FALSE + if(wag_flags & WAG_WAGGING) + wag_flags &= ~WAG_WAGGING + succeeded = TRUE + + var/datum/bodypart_overlay/mutant/tail/tail_overlay = bodypart_overlay + tail_overlay.wagging = FALSE if(tail_spines_overlay) //if there are spines, they should stop wagging with the tail tail_spines_overlay.wagging = FALSE if(isnull(organ_owner)) - return + return succeeded organ_owner.update_body_parts() UnregisterSignal(organ_owner, COMSIG_LIVING_DEATH) + return succeeded ///Tail parent type, with wagging functionality /datum/bodypart_overlay/mutant/tail diff --git a/code/modules/surgery/organs/internal/ears/_ears.dm b/code/modules/surgery/organs/internal/ears/_ears.dm index d0255d5a060..76d8751dc5d 100644 --- a/code/modules/surgery/organs/internal/ears/_ears.dm +++ b/code/modules/surgery/organs/internal/ears/_ears.dm @@ -93,15 +93,13 @@ /obj/item/organ/internal/ears/penguin/on_mob_insert(mob/living/carbon/human/ear_owner) . = ..() - if(istype(ear_owner)) - to_chat(ear_owner, span_notice("You suddenly feel like you've lost your balance.")) - ear_owner.AddElement(/datum/element/waddling) + to_chat(ear_owner, span_notice("You suddenly feel like you've lost your balance.")) + ear_owner.AddElementTrait(TRAIT_WADDLING, ORGAN_TRAIT, /datum/element/waddling) /obj/item/organ/internal/ears/penguin/on_mob_remove(mob/living/carbon/human/ear_owner) . = ..() - if(istype(ear_owner)) - to_chat(ear_owner, span_notice("Your sense of balance comes back to you.")) - ear_owner.RemoveElement(/datum/element/waddling) + to_chat(ear_owner, span_notice("Your sense of balance comes back to you.")) + REMOVE_TRAIT(ear_owner, TRAIT_WADDLING, ORGAN_TRAIT) /obj/item/organ/internal/ears/cybernetic name = "basic cybernetic ears" diff --git a/code/modules/surgery/organs/internal/eyes/_eyes.dm b/code/modules/surgery/organs/internal/eyes/_eyes.dm index a323f7c87d8..d962585951e 100644 --- a/code/modules/surgery/organs/internal/eyes/_eyes.dm +++ b/code/modules/surgery/organs/internal/eyes/_eyes.dm @@ -754,16 +754,9 @@ low_light_cutoff = list(5, 12, 20) medium_light_cutoff = list(15, 20, 30) high_light_cutoff = list(30, 35, 50) - var/obj/item/flashlight/eyelight/adapted/adapt_light /obj/item/organ/internal/eyes/night_vision/maintenance_adapted/on_mob_insert(mob/living/carbon/eye_owner) . = ..() - //add lighting - if(!adapt_light) - adapt_light = new /obj/item/flashlight/eyelight/adapted() - adapt_light.set_light_on(TRUE) - adapt_light.forceMove(eye_owner) - adapt_light.update_brightness(eye_owner) ADD_TRAIT(eye_owner, TRAIT_UNNATURAL_RED_GLOWY_EYES, ORGAN_TRAIT) /obj/item/organ/internal/eyes/night_vision/maintenance_adapted/on_life(seconds_per_tick, times_fired) @@ -776,9 +769,5 @@ . = ..() /obj/item/organ/internal/eyes/night_vision/maintenance_adapted/on_mob_remove(mob/living/carbon/unadapted, special = FALSE) - //remove lighting - adapt_light.set_light_on(FALSE) - adapt_light.update_brightness(unadapted) - adapt_light.forceMove(src) REMOVE_TRAIT(unadapted, TRAIT_UNNATURAL_RED_GLOWY_EYES, ORGAN_TRAIT) return ..() diff --git a/code/modules/surgery/organs/internal/tongue/_tongue.dm b/code/modules/surgery/organs/internal/tongue/_tongue.dm index f5075778cb3..927847dbc13 100644 --- a/code/modules/surgery/organs/internal/tongue/_tongue.dm +++ b/code/modules/surgery/organs/internal/tongue/_tongue.dm @@ -195,6 +195,7 @@ liked_foodtypes = GORE | MEAT | SEAFOOD | NUTS | BUGS disliked_foodtypes = GRAIN | DAIRY | CLOTH | GROSS voice_filter = @{"[0:a] asplit [out0][out2]; [out0] asetrate=%SAMPLE_RATE%*0.9,aresample=%SAMPLE_RATE%,atempo=1/0.9,aformat=channel_layouts=mono,volume=0.2 [p0]; [out2] asetrate=%SAMPLE_RATE%*1.1,aresample=%SAMPLE_RATE%,atempo=1/1.1,aformat=channel_layouts=mono,volume=0.2[p2]; [p0][0][p2] amix=inputs=3"} + /obj/item/organ/internal/tongue/lizard/modify_speech(datum/source, list/speech_args) var/static/regex/lizard_hiss = new("s+", "g") var/static/regex/lizard_hiSS = new("S+", "g") diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm index 571e8c422d9..fee7f389dca 100644 --- a/code/modules/surgery/tools.dm +++ b/code/modules/surgery/tools.dm @@ -93,7 +93,7 @@ hitsound = 'sound/items/welder.ogg' w_class = WEIGHT_CLASS_NORMAL toolspeed = 0.7 - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 1 light_color = COLOR_SOFT_RED @@ -378,7 +378,7 @@ force = 16 w_class = WEIGHT_CLASS_NORMAL toolspeed = 0.7 - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 1 light_color = LIGHT_COLOR_BLUE sharpness = SHARP_EDGED diff --git a/code/modules/tgui_input/keycombo.dm b/code/modules/tgui_input/keycombo.dm new file mode 100644 index 00000000000..948dbaea234 --- /dev/null +++ b/code/modules/tgui_input/keycombo.dm @@ -0,0 +1,126 @@ +/** + * Creates a TGUI window with a key input. Returns the user's response as a full key with modifiers, eg ShiftK. + * + * This proc should be used to create windows for key entry that the caller will wait for a response from. + * If tgui fancy chat is turned off: Will return a normal input. + * + * Arguments: + * * user - The user to show the number input to. + * * message - The content of the number input, shown in the body of the TGUI window. + * * title - The title of the number input modal, shown on the top of the TGUI window. + * * default - The default (or current) key, shown as a placeholder. + */ +/proc/tgui_input_keycombo(mob/user = usr, message, title = "Key Input", default = 0, timeout = 0, ui_state = GLOB.always_state) + if (!istype(user)) + if (istype(user, /client)) + var/client/client = user + user = client.mob + else + return null + + if (isnull(user.client)) + return null + + // Client does NOT have tgui_input on: Returns regular input + if(!user.client.prefs.read_preference(/datum/preference/toggle/tgui_input)) + var/input_key = input(user, message, title + "(Modifiers are TGUI only, sorry!)", default) as null|text + return input_key[1] + var/datum/tgui_input_keycombo/key_input = new(user, message, title, default, timeout, ui_state) + key_input.ui_interact(user) + key_input.wait() + if (key_input) + . = key_input.entry + qdel(key_input) + +/** + * # tgui_input_keycombo + * + * Datum used for instantiating and using a TGUI-controlled key input that prompts the user with + * a message and listens for key presses. + */ +/datum/tgui_input_keycombo + /// Boolean field describing if the tgui_input_number was closed by the user. + var/closed + /// The default (or current) value, shown as a default. Users can press reset with this. + var/default + /// The entry that the user has return_typed in. + var/entry + /// The prompt's body, if any, of the TGUI window. + var/message + /// The time at which the number input was created, for displaying timeout progress. + var/start_time + /// The lifespan of the number input, after which the window will close and delete itself. + var/timeout + /// The title of the TGUI window + var/title + /// The TGUI UI state that will be returned in ui_state(). Default: always_state + var/datum/ui_state/state + +/datum/tgui_input_keycombo/New(mob/user, message, title, default, timeout, ui_state) + src.default = default + src.message = message + src.title = title + src.state = ui_state + if (timeout) + src.timeout = timeout + start_time = world.time + QDEL_IN(src, timeout) + +/datum/tgui_input_keycombo/Destroy(force) + SStgui.close_uis(src) + state = null + return ..() + +/** + * Waits for a user's response to the tgui_input_keycombo's prompt before returning. Returns early if + * the window was closed by the user. + */ +/datum/tgui_input_keycombo/proc/wait() + while (!entry && !closed && !QDELETED(src)) + stoplag(1) + +/datum/tgui_input_keycombo/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "KeyComboModal") + ui.open() + +/datum/tgui_input_keycombo/ui_close(mob/user) + . = ..() + closed = TRUE + +/datum/tgui_input_keycombo/ui_state(mob/user) + return state + +/datum/tgui_input_keycombo/ui_static_data(mob/user) + var/list/data = list() + data["init_value"] = default // Default is a reserved keyword + data["large_buttons"] = user.client.prefs.read_preference(/datum/preference/toggle/tgui_input_large) + data["message"] = message + data["swapped_buttons"] = user.client.prefs.read_preference(/datum/preference/toggle/tgui_input_swapped) + data["title"] = title + return data + +/datum/tgui_input_keycombo/ui_data(mob/user) + var/list/data = list() + if(timeout) + data["timeout"] = CLAMP01((timeout - (world.time - start_time) - 1 SECONDS) / (timeout - 1 SECONDS)) + return data + +/datum/tgui_input_keycombo/ui_act(action, list/params) + . = ..() + if (.) + return + switch(action) + if("submit") + set_entry(params["entry"]) + closed = TRUE + SStgui.close_uis(src) + return TRUE + if("cancel") + closed = TRUE + SStgui.close_uis(src) + return TRUE + +/datum/tgui_input_keycombo/proc/set_entry(entry) + src.entry = entry diff --git a/code/modules/transport/tram/tram_controller.dm b/code/modules/transport/tram/tram_controller.dm index 5665755520e..c7fc895184f 100644 --- a/code/modules/transport/tram/tram_controller.dm +++ b/code/modules/transport/tram/tram_controller.dm @@ -672,6 +672,11 @@ dispatch_transport(destination_platform = push_destination) return push_destination + +/datum/transport_controller/linear/tram/slow //for some reason speed is set to initial() in the code but if i touched it it would probably break so + speed_limiter = 3 + base_speed_limiter = 3 + /** * The physical cabinet on the tram. Acts as the interface between players and the controller datum. */ @@ -852,10 +857,7 @@ balloon_alert(user, "[panel_open ? "mounting bolts exposed" : "mounting bolts hidden"]") return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN -/obj/machinery/transport/tram_controller/deconstruct(disassembled = TRUE) - if(obj_flags & NO_DECONSTRUCTION) - return - +/obj/machinery/transport/tram_controller/on_deconstruction(disassembled) var/turf/drop_location = find_obstruction_free_location(1, src) if(disassembled) @@ -863,7 +865,6 @@ else new /obj/item/stack/sheet/mineral/titanium(drop_location, 2) new /obj/item/stack/sheet/iron(drop_location, 1) - qdel(src) /** * Update the blinky lights based on the controller status, allowing to quickly check without opening up the cabinet. diff --git a/code/modules/transport/tram/tram_displays.dm b/code/modules/transport/tram/tram_displays.dm index 0e36295f97e..47fe21f2ff1 100644 --- a/code/modules/transport/tram/tram_displays.dm +++ b/code/modules/transport/tram/tram_displays.dm @@ -81,9 +81,7 @@ if(panel_open) . += span_notice("It is secured to the tram wall with [EXAMINE_HINT("bolts.")]") -/obj/machinery/transport/destination_sign/deconstruct(disassembled = TRUE) - if(obj_flags & NO_DECONSTRUCTION) - return +/obj/machinery/transport/destination_sign/on_deconstruction(disassembled) if(disassembled) new /obj/item/wallframe/indicator_display(drop_location()) else @@ -91,7 +89,6 @@ new /obj/item/stack/sheet/iron(drop_location(), 1) new /obj/item/shard(drop_location()) new /obj/item/shard(drop_location()) - qdel(src) /obj/machinery/transport/destination_sign/indicator/wrench_act_secondary(mob/living/user, obj/item/tool) . = ..() diff --git a/code/modules/transport/tram/tram_structures.dm b/code/modules/transport/tram/tram_structures.dm index ccf6a99d929..74532d87be7 100644 --- a/code/modules/transport/tram/tram_structures.dm +++ b/code/modules/transport/tram/tram_structures.dm @@ -31,6 +31,7 @@ opacity = FALSE anchored = TRUE flags_1 = PREVENT_CLICK_UNDER_1 + pass_flags_self = PASSWINDOW armor_type = /datum/armor/tram_structure smoothing_flags = SMOOTH_BITMASK smoothing_groups = SMOOTH_GROUP_TRAM_STRUCTURE diff --git a/code/modules/transport/transport_module.dm b/code/modules/transport/transport_module.dm index 7a57529b8ff..c33d729e75c 100644 --- a/code/modules/transport/transport_module.dm +++ b/code/modules/transport/transport_module.dm @@ -86,6 +86,7 @@ if(radial_travel) AddElement(/datum/element/contextual_screentip_bare_hands, lmb_text = "Send Transport") + ADD_TRAIT(src, TRAIT_CHASM_STOPPER, INNATE_TRAIT) set_movement_registrations() //since transport_controller datums find all connected platforms when a transport structure first creates it and then @@ -933,6 +934,11 @@ /obj/structure/transport/linear/tram/proc/estop_throw(throw_direction) for(var/mob/living/passenger in transport_contents) to_chat(passenger, span_userdanger("The tram comes to a sudden, grinding stop!")) + if(prob(17.5)) // sometimes you go through a window + passenger.AddElement(/datum/element/window_smashing, duration = 1.5 SECONDS) var/throw_target = get_edge_target_turf(src, throw_direction) - var/datum/callback/land_slam = new(passenger, TYPE_PROC_REF(/mob/living/, tram_slam_land)) - passenger.throw_at(throw_target, 400, 4, force = MOVE_FORCE_OVERPOWERING, callback = land_slam) + passenger.throw_at(throw_target, 30, 7, force = MOVE_FORCE_OVERPOWERING) + +/obj/structure/transport/linear/tram/slow + transport_controller_type = /datum/transport_controller/linear/tram/slow + speed_limiter = /datum/transport_controller/linear/tram/slow::speed_limiter diff --git a/code/modules/unit_tests/achievements.dm b/code/modules/unit_tests/achievements.dm index 44e1384c2e0..decda52a2f5 100644 --- a/code/modules/unit_tests/achievements.dm +++ b/code/modules/unit_tests/achievements.dm @@ -2,13 +2,13 @@ /datum/unit_test/achievements /datum/unit_test/achievements/Run() - var/award_icons = icon_states(ACHIEVEMENTS_SET) for(var/datum/award/award as anything in subtypesof(/datum/award)) if(!initial(award.name)) //Skip abstract achievements types continue var/init_icon = initial(award.icon) - if(!init_icon || !(init_icon in award_icons)) - TEST_FAIL("Award [initial(award.name)] has an unexistent icon: \"[init_icon || "null"]\"") + var/init_icon_state = initial(award.icon_state) + if(!init_icon_state || !icon_exists(init_icon, init_icon_state)) + TEST_FAIL("Award [initial(award.name)] has a non-existent icon in [init_icon]: \"[init_icon_state || "null"]\"") if(length(initial(award.database_id)) > 32) //sql schema limit TEST_FAIL("Award [initial(award.name)] database id is too long") var/init_category = initial(award.category) diff --git a/code/modules/unit_tests/changeling.dm b/code/modules/unit_tests/changeling.dm index b209e34aebb..b13a0d5434d 100644 --- a/code/modules/unit_tests/changeling.dm +++ b/code/modules/unit_tests/changeling.dm @@ -8,7 +8,7 @@ /datum/unit_test/transformation_sting/Run() var/mob/living/carbon/human/ling = setup_ling() var/mob/living/carbon/human/victim = setup_victim() - var/datum/antagonist/changeling/ling_datum = ling.mind.has_antag_datum(/datum/antagonist/changeling) + var/datum/antagonist/changeling/ling_datum = IS_CHANGELING(ling) // Get the ability we're testing ling_datum.give_power(/datum/action/changeling/sting/transformation) // NOVA EDIT CHANGE - Transformation sting not purchasable here - ORIGINAL : ling_datum.purchase_power(/datum/action/changeling/sting/transformation) diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_changeling.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_changeling.png index e1bdbea1058..e564519829e 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_antag_icons_changeling.png and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_changeling.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_changelingmidround.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_changelingmidround.png index d002f746667..2aa52df66b9 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_antag_icons_changelingmidround.png and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_changelingmidround.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_nightmare.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_nightmare.png index 3b723129ac8..853ef845383 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_antag_icons_nightmare.png and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_nightmare.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_stowawaychangeling.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_stowawaychangeling.png index e1bdbea1058..e564519829e 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_antag_icons_stowawaychangeling.png and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_stowawaychangeling.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_shadow_nightmare.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_shadow_nightmare.png index 61656a88892..5cdeedeffca 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_shadow_nightmare.png and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_shadow_nightmare.png differ diff --git a/code/modules/unit_tests/tail_wag.dm b/code/modules/unit_tests/tail_wag.dm index ceb82e98c0d..cd82dfdfd50 100644 --- a/code/modules/unit_tests/tail_wag.dm +++ b/code/modules/unit_tests/tail_wag.dm @@ -11,22 +11,34 @@ // SANITY TEST // start wagging - SEND_SIGNAL(dummy, COMSIG_ORGAN_WAG_TAIL, TRUE) + dummy.wag_tail() if(!(dummy_tail.wag_flags & WAG_WAGGING)) TEST_FAIL("Tail did not start wagging when it should have!") // stop wagging - SEND_SIGNAL(dummy, COMSIG_ORGAN_WAG_TAIL, FALSE) + dummy.unwag_tail() if(dummy_tail.wag_flags & WAG_WAGGING) TEST_FAIL("Tail did not stop wagging when it should have!") + // TESTING WAG EMOTE + + // start wagging + dummy.emote("wag") + if(!(dummy_tail.wag_flags & WAG_WAGGING)) + TEST_FAIL("Tail did not start wagging after using the *wag emote!") + + // stop wagging + dummy.emote("wag") + if(dummy_tail.wag_flags & WAG_WAGGING) + TEST_FAIL("Tail did not stop wagging after using the *wag emote!") + // TESTING WAG_ABLE FLAG // flip the wag flag to unwaggable dummy_tail.wag_flags &= ~WAG_ABLE // try to wag it again - SEND_SIGNAL(dummy, COMSIG_ORGAN_WAG_TAIL, TRUE) + dummy.wag_tail() if(dummy_tail.wag_flags & WAG_WAGGING) TEST_FAIL("Tail should not have the ability to wag, yet it did!") @@ -34,19 +46,19 @@ dummy_tail.wag_flags |= WAG_ABLE // start wagging again - SEND_SIGNAL(dummy, COMSIG_ORGAN_WAG_TAIL, TRUE) + dummy.wag_tail() if(!(dummy_tail.wag_flags & WAG_WAGGING)) TEST_FAIL("Tail did not start wagging when it should have!") // TESTING STOP_AFTER // stop wagging - SEND_SIGNAL(dummy, COMSIG_ORGAN_WAG_TAIL, FALSE) + dummy.unwag_tail() if(dummy_tail.wag_flags & WAG_WAGGING) TEST_FAIL("Tail did not stop wagging when it should have!") // start wagging, stop after 0.1 seconds - SEND_SIGNAL(dummy, COMSIG_ORGAN_WAG_TAIL, TRUE, 0.1 SECONDS) + dummy.wag_tail(0.1 SECONDS) // because timers are a pain addtimer(VARSET_CALLBACK(src, timer_finished, TRUE), 0.2 SECONDS) if(!(dummy_tail.wag_flags & WAG_WAGGING)) @@ -67,7 +79,7 @@ TEST_FAIL("Tail was still wagging after being removed!") // try to wag the removed tail - SEND_SIGNAL(dummy, COMSIG_ORGAN_WAG_TAIL, TRUE) + dummy.wag_tail() if(dummy_tail.wag_flags & WAG_WAGGING) TEST_FAIL("A disembodied tail was able to start wagging!") @@ -75,7 +87,7 @@ // put it back and start wagging again dummy_tail.Insert(dummy, special = TRUE, movement_flags = DELETE_IF_REPLACED) - SEND_SIGNAL(dummy, COMSIG_ORGAN_WAG_TAIL, TRUE) + dummy.wag_tail() if(!(dummy_tail.wag_flags & WAG_WAGGING)) TEST_FAIL("Tail did not start wagging when it should have!") @@ -85,6 +97,6 @@ TEST_FAIL("A mob's tail was still wagging after being killed!") // check if we are still able to wag the tail after death - SEND_SIGNAL(dummy, COMSIG_ORGAN_WAG_TAIL, TRUE) + dummy.wag_tail() if(dummy_tail.wag_flags & WAG_WAGGING) TEST_FAIL("A dead mob was able to wag their tail!") diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index 32783504fe8..65935f077e3 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -1,4 +1,3 @@ - // TODO: Work into reworked uplinks. /// Selects a set number of unique items from the uplink, and deducts a percentage discount from them /proc/create_uplink_sales(num, datum/uplink_category/category, limited_stock, list/sale_items) @@ -8,7 +7,20 @@ var/datum/uplink_item/taken_item = pick_n_take(sale_items_copy) var/datum/uplink_item/uplink_item = new taken_item.type() var/discount = uplink_item.get_discount() - var/list/disclaimer = list("Void where prohibited.", "Not recommended for children.", "Contains small parts.", "Check local laws for legality in region.", "Do not taunt.", "Not responsible for direct, indirect, incidental or consequential damages resulting from any defect, error or failure to perform.", "Keep away from fire or flames.", "Product is provided \"as is\" without any implied or expressed warranties.", "As seen on TV.", "For recreational use only.", "Use only as directed.", "16% sales tax will be charged for orders originating within Space Nebraska.") + var/static/list/disclaimer = list( + "Void where prohibited.", + "Not recommended for children.", + "Contains small parts.", + "Check local laws for legality in region.", + "Do not taunt.", + "Not responsible for direct, indirect, incidental or consequential damages resulting from any defect, error or failure to perform.", + "Keep away from fire or flames.", + "Product is provided \"as is\" without any implied or expressed warranties.", + "As seen on TV.", + "For recreational use only.", + "Use only as directed.", + "16% sales tax will be charged for orders originating within Space Nebraska.", + ) uplink_item.limited_stock = limited_stock if(uplink_item.cost >= 20) //Tough love for nuke ops discount *= 0.5 @@ -111,10 +123,10 @@ /// Spawns an item and logs its purchase /datum/uplink_item/proc/purchase(mob/user, datum/uplink_handler/uplink_handler, atom/movable/source) - var/atom/A = spawn_item(item, user, uplink_handler, source) + var/atom/spawned_item = spawn_item(item, user, uplink_handler, source) log_uplink("[key_name(user)] purchased [src] for [cost] telecrystals from [source]'s uplink") if(purchase_log_vis && uplink_handler.purchase_log) - uplink_handler.purchase_log.LogPurchase(A, src, cost) + uplink_handler.purchase_log.LogPurchase(spawned_item, src, cost) if(lock_other_purchases) uplink_handler.shop_locked = TRUE @@ -122,20 +134,20 @@ /datum/uplink_item/proc/spawn_item(spawn_path, mob/user, datum/uplink_handler/uplink_handler, atom/movable/source) if(!spawn_path) return - var/atom/A + var/atom/spawned_item if(ispath(spawn_path)) - A = new spawn_path(get_turf(user)) + spawned_item = new spawn_path(get_turf(user)) else - A = spawn_path + spawned_item = spawn_path if(refundable) - A.AddElement(/datum/element/uplink_reimburse, (refund_amount ? refund_amount : cost)) - if(ishuman(user) && isitem(A)) - var/mob/living/carbon/human/H = user - if(H.put_in_hands(A)) - to_chat(H, span_boldnotice("[A] materializes into your hands!")) - return A - to_chat(user, span_boldnotice("[A] materializes onto the floor!")) - return A + spawned_item.AddElement(/datum/element/uplink_reimburse, (refund_amount ? refund_amount : cost)) + var/mob/living/carbon/human/human_user = user + if(istype(human_user) && isitem(spawned_item) && human_user.put_in_hands(spawned_item)) + to_chat(human_user, span_boldnotice("[spawned_item] materializes into your hands!")) + else + to_chat(user, span_boldnotice("[spawned_item] materializes onto the floor!")) + SEND_SIGNAL(uplink_handler, COMSIG_ON_UPLINK_PURCHASE, spawned_item, user) + return spawned_item ///For special overrides if an item can be bought or not. /datum/uplink_item/proc/can_be_bought(datum/uplink_handler/source) diff --git a/code/modules/vehicles/cars/clowncar.dm b/code/modules/vehicles/cars/clowncar.dm index d5a3d7bdc7d..37f6eb7efa5 100644 --- a/code/modules/vehicles/cars/clowncar.dm +++ b/code/modules/vehicles/cars/clowncar.dm @@ -9,7 +9,7 @@ movedelay = 0.6 car_traits = CAN_KIDNAP key_type = /obj/item/bikehorn - light_system = MOVABLE_LIGHT_DIRECTIONAL + light_system = OVERLAY_LIGHT_DIRECTIONAL light_range = 8 light_power = 2 light_on = FALSE @@ -179,7 +179,7 @@ to_chat(user, span_danger("You scramble [src]'s child safety lock, and a panel with six colorful buttons appears!")) initialize_controller_action_type(/datum/action/vehicle/sealed/roll_the_dice, VEHICLE_CONTROL_DRIVE) initialize_controller_action_type(/datum/action/vehicle/sealed/cannon, VEHICLE_CONTROL_DRIVE) - AddElement(/datum/element/waddling) + AddElementTrait(TRAIT_WADDLING, INNATE_TRAIT, /datum/element/waddling) return TRUE /obj/vehicle/sealed/car/clowncar/atom_destruction(damage_flag) diff --git a/code/modules/vehicles/cars/vim.dm b/code/modules/vehicles/cars/vim.dm index a37c6e18b8e..53eee5105a9 100644 --- a/code/modules/vehicles/cars/vim.dm +++ b/code/modules/vehicles/cars/vim.dm @@ -13,7 +13,7 @@ enter_delay = 20 movedelay = 0.6 engine_sound_length = 0.3 SECONDS - light_system = MOVABLE_LIGHT_DIRECTIONAL + light_system = OVERLAY_LIGHT_DIRECTIONAL light_range = 4 light_power = 2 light_on = FALSE diff --git a/code/modules/vehicles/mecha/_mecha.dm b/code/modules/vehicles/mecha/_mecha.dm index dc7304a1388..05b3470358f 100644 --- a/code/modules/vehicles/mecha/_mecha.dm +++ b/code/modules/vehicles/mecha/_mecha.dm @@ -29,7 +29,7 @@ move_force = MOVE_FORCE_VERY_STRONG move_resist = MOVE_FORCE_EXTREMELY_STRONG COOLDOWN_DECLARE(mecha_bump_smash) - light_system = MOVABLE_LIGHT_DIRECTIONAL + light_system = OVERLAY_LIGHT_DIRECTIONAL light_on = FALSE light_range = 8 generic_canpass = FALSE diff --git a/code/modules/vehicles/mecha/combat/durand.dm b/code/modules/vehicles/mecha/combat/durand.dm index f1c7bac4f81..35b53c30ccf 100644 --- a/code/modules/vehicles/mecha/combat/durand.dm +++ b/code/modules/vehicles/mecha/combat/durand.dm @@ -164,7 +164,7 @@ own integrity back to max. Shield is automatically dropped if we run out of powe pixel_y = 4 max_integrity = 10000 anchored = TRUE - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = MINIMUM_USEFUL_LIGHT_RANGE light_power = 5 light_color = LIGHT_COLOR_ELECTRIC_CYAN diff --git a/code/modules/vehicles/mecha/equipment/tools/mining_tools.dm b/code/modules/vehicles/mecha/equipment/tools/mining_tools.dm index c7c082a20e8..42a61e03b5e 100644 --- a/code/modules/vehicles/mecha/equipment/tools/mining_tools.dm +++ b/code/modules/vehicles/mecha/equipment/tools/mining_tools.dm @@ -32,11 +32,16 @@ ADD_TRAIT(src, TRAIT_INSTANTLY_PROCESSES_BOULDERS, INNATE_TRAIT) ADD_TRAIT(src, TRAIT_BOULDER_BREAKER, INNATE_TRAIT) -/obj/item/mecha_parts/mecha_equipment/drill/action(mob/source, atom/target, list/modifiers) - // Check if we can even use the equipment to begin with. +/obj/item/mecha_parts/mecha_equipment/drill/do_after_checks(atom/target) + // Gotta be close to the target + if(!loc.Adjacent(target)) + return FALSE + // Check if we can still use the equipment & use power for every iteration of do after if(!action_checks(target)) - return + return FALSE + return ..() +/obj/item/mecha_parts/mecha_equipment/drill/action(mob/source, atom/target, list/modifiers) // We can only drill non-space turfs, living mobs and objects. if(isspaceturf(target) || !(isliving(target) || isobj(target) || isturf(target))) return @@ -50,17 +55,23 @@ // You can't drill harder by clicking more. if(!DOING_INTERACTION_WITH_TARGET(source, target) && do_after_cooldown(target, source, DOAFTER_SOURCE_MECHADRILL)) - target.visible_message(span_warning("[chassis] starts to drill [target]."), \ span_userdanger("[chassis] starts to drill [target]..."), \ span_hear("You hear drilling.")) log_message("Started drilling [target]", LOG_MECHA) + // Drilling a turf is a one-and-done procedure. if(isturf(target)) + // Check if we can even use the equipment to begin with. + if(!action_checks(target)) + return + var/turf/T = target T.drill_act(src, source) + return ..() + // Drilling objects and mobs is a repeating procedure. while(do_after_mecha(target, source, drill_delay)) if(isliving(target)) diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm index eac21264a85..6d269a7ca22 100644 --- a/code/modules/vending/_vending.dm +++ b/code/modules/vending/_vending.dm @@ -236,6 +236,11 @@ voice = vendor_voice_by_type[type] if(build_inv) //non-constructable vending machine + ///Non-constructible vending machines do not have a refill canister to populate its products list from, + ///Which apparently is still needed in the case we use product categories instead. + if(product_categories) + for(var/list/category as anything in product_categories) + products |= category["products"] build_inventories() slogan_list = splittext(product_slogans, ";") @@ -298,12 +303,10 @@ for(var/obj/item/vending_refill/installed_refill in component_parts) restock(installed_refill) -/obj/machinery/vending/deconstruct(disassembled = TRUE) +/obj/machinery/vending/on_deconstruction(disassembled) if(refill_canister) return ..() - if(!(obj_flags & NO_DECONSTRUCTION)) //the non constructable vendors drop metal instead of a machine frame. - new /obj/item/stack/sheet/iron(loc, 3) - qdel(src) + new /obj/item/stack/sheet/iron(loc, 3) /obj/machinery/vending/update_appearance(updates=ALL) . = ..() @@ -1085,7 +1088,7 @@ replacer.play_rped_sound() return TRUE -/obj/machinery/vending/on_deconstruction() +/obj/machinery/vending/on_deconstruction(disassembled) update_canister() . = ..() @@ -1656,14 +1659,13 @@ /obj/machinery/vending/custom/crowbar_act(mob/living/user, obj/item/attack_item) return FALSE -/obj/machinery/vending/custom/deconstruct(disassembled) +/obj/machinery/vending/custom/on_deconstruction(disassembled) unbuckle_all_mobs(TRUE) var/turf/current_turf = get_turf(src) if(current_turf) for(var/obj/item/stored_item in contents) stored_item.forceMove(current_turf) explosion(src, devastation_range = -1, light_impact_range = 3) - return ..() /** * Vends an item to the user. Handles all the logic: diff --git a/code/modules/vending/clothesmate.dm b/code/modules/vending/clothesmate.dm index eeca2422e0c..47276acb259 100644 --- a/code/modules/vending/clothesmate.dm +++ b/code/modules/vending/clothesmate.dm @@ -18,6 +18,7 @@ /obj/item/clothing/mask/bandana = 3, /obj/item/clothing/mask/bandana/striped = 3, /obj/item/clothing/mask/bandana/skull = 3, + /obj/item/clothing/mask/facescarf = 3, /obj/item/clothing/neck/scarf = 6, /obj/item/clothing/neck/large_scarf = 6, /obj/item/clothing/neck/large_scarf/red = 6, @@ -161,6 +162,8 @@ /obj/item/clothing/suit/hooded/ethereal_raincoat = 3, /obj/item/clothing/under/ethereal_tunic = 3, + /obj/item/clothing/mask/kitsune = 3, + /obj/item/clothing/mask/rebellion = 6, /obj/item/clothing/suit/costume/wellworn_shirt/graphic/ian = 1, /obj/item/clothing/suit/costume/irs = 20, /obj/item/clothing/head/costume/irs = 20, diff --git a/code/modules/wiremod/components/bci/hud/bar_overlay.dm b/code/modules/wiremod/components/bci/hud/bar_overlay.dm index 5a1a46f5716..07d13a4ccfb 100644 --- a/code/modules/wiremod/components/bci/hud/bar_overlay.dm +++ b/code/modules/wiremod/components/bci/hud/bar_overlay.dm @@ -58,6 +58,7 @@ /datum/atom_hud/alternate_appearance/basic/one_person, "bar_overlay_[REF(src)]", cool_overlay, + null, owner, ) alt_appearance.show_to(owner) diff --git a/code/modules/wiremod/components/bci/hud/counter_overlay.dm b/code/modules/wiremod/components/bci/hud/counter_overlay.dm index d46c34ab047..a0f83b6f72e 100644 --- a/code/modules/wiremod/components/bci/hud/counter_overlay.dm +++ b/code/modules/wiremod/components/bci/hud/counter_overlay.dm @@ -76,6 +76,7 @@ /datum/atom_hud/alternate_appearance/basic/one_person, "counter_overlay_[REF(src)]", counter, + null, owner, ) alt_appearance.show_to(owner) @@ -101,6 +102,7 @@ /datum/atom_hud/alternate_appearance/basic/one_person, "counter_overlay_[REF(src)]_[i]", number, + null, owner, ) number_alt_appearance.show_to(owner) diff --git a/code/modules/wiremod/components/bci/hud/object_overlay.dm b/code/modules/wiremod/components/bci/hud/object_overlay.dm index 28e54cb7ee2..07e0f76761e 100644 --- a/code/modules/wiremod/components/bci/hud/object_overlay.dm +++ b/code/modules/wiremod/components/bci/hud/object_overlay.dm @@ -118,6 +118,7 @@ /datum/atom_hud/alternate_appearance/basic/one_person, "object_overlay_[REF(src)]", cool_overlay, + null, owner, ) alt_appearance.show_to(owner) diff --git a/code/modules/wiremod/core/marker.dm b/code/modules/wiremod/core/marker.dm index ecd68be413c..50d4324c154 100644 --- a/code/modules/wiremod/core/marker.dm +++ b/code/modules/wiremod/core/marker.dm @@ -32,6 +32,13 @@ if(marked_atom || !user.Adjacent(target) || is_right_clicking) return ..() + if(isliving(target)) + INVOKE_ASYNC(src, PROC_REF(mark_mob_or_contents), user, target) + return TRUE + + mark_target(target) + +/obj/item/multitool/circuit/proc/mark_target(atom/target) say("Marked [target].") marked_atom = target RegisterSignal(marked_atom, COMSIG_QDELETING, PROC_REF(cleanup_marked_atom)) @@ -40,6 +47,51 @@ playsound(src.loc, 'sound/misc/compiler-stage2.ogg', 30, TRUE) return TRUE +/// Allow users to mark items equipped by the target that are visible. +/obj/item/multitool/circuit/proc/mark_mob_or_contents(mob/user, mob/living/target) + var/list/visible_items + var/mob/living/carbon/carbon_target + if(iscarbon(target)) + carbon_target = target + visible_items = carbon_target.get_visible_items() + else + visible_items = target.get_equipped_items() + + visible_items -= src // the multitool cannot mark itself. + + if(!length(visible_items)) + mark_target(target) + return + + var/list/selectable_targets = list() + var/datum/radial_menu_choice/mob_choice = new + mob_choice.image = image(icon = 'icons/hud/radial.dmi', icon_state = "radial_mob") + mob_choice.name = target.name + selectable_targets[REF(target)] = mob_choice + for(var/obj/item/item as anything in visible_items) + var/datum/radial_menu_choice/item_choice = new + + var/mutable_appearance/item_appearance = new(item) + item_appearance.layer = FLOAT_LAYER + item_appearance.plane = FLOAT_PLANE + + item_choice.name = item.name + item_choice.image = item_appearance + selectable_targets[REF(item)] = item_choice + + var/picked_ref = show_radial_menu(user, src, selectable_targets, uniqueid = TRUE, radius = 38, custom_check = CALLBACK(src, PROC_REF(check_menu), user, target), tooltips = TRUE) + if(!picked_ref) + return + + var/atom/movable/chosen = locate(picked_ref) + if(chosen == target || (chosen in (carbon_target ? carbon_target.get_visible_items() : target.get_equipped_items()))) + mark_target(chosen) + else + balloon_alert(user, "cannot mark entity") + +/obj/item/multitool/circuit/proc/check_menu(mob/user, mob/living/target) + return !marked_atom && user.is_holding(src) && user.Adjacent(target) + /obj/item/multitool/circuit/update_overlays() . = ..() cut_overlays() diff --git a/code/modules/wiremod/shell/bot.dm b/code/modules/wiremod/shell/bot.dm index dfd9845bc05..533c654e787 100644 --- a/code/modules/wiremod/shell/bot.dm +++ b/code/modules/wiremod/shell/bot.dm @@ -9,7 +9,7 @@ icon_state = "setup_medium_box" density = FALSE - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_on = FALSE /obj/structure/bot/Initialize(mapload) diff --git a/code/modules/wiremod/shell/brain_computer_interface.dm b/code/modules/wiremod/shell/brain_computer_interface.dm index f41d4fa8bf1..57bb2ed45cb 100644 --- a/code/modules/wiremod/shell/brain_computer_interface.dm +++ b/code/modules/wiremod/shell/brain_computer_interface.dm @@ -283,7 +283,7 @@ . = ..() occupant_typecache = typecacheof(/mob/living/carbon) -/obj/machinery/bci_implanter/on_deconstruction() +/obj/machinery/bci_implanter/on_deconstruction(disassembled) drop_stored_bci() /obj/machinery/bci_implanter/Destroy() diff --git a/code/modules/wiremod/shell/compact_remote.dm b/code/modules/wiremod/shell/compact_remote.dm index 38fdfccf951..3336be06ddb 100644 --- a/code/modules/wiremod/shell/compact_remote.dm +++ b/code/modules/wiremod/shell/compact_remote.dm @@ -11,7 +11,7 @@ worn_icon_state = "electronic" lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi' - light_system = MOVABLE_LIGHT_DIRECTIONAL + light_system = OVERLAY_LIGHT_DIRECTIONAL light_on = FALSE /obj/item/compact_remote/Initialize(mapload) diff --git a/code/modules/wiremod/shell/controller.dm b/code/modules/wiremod/shell/controller.dm index 3092d3315f1..ad03867b89b 100644 --- a/code/modules/wiremod/shell/controller.dm +++ b/code/modules/wiremod/shell/controller.dm @@ -12,7 +12,7 @@ worn_icon_state = "electronic" lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi' - light_system = MOVABLE_LIGHT_DIRECTIONAL + light_system = OVERLAY_LIGHT_DIRECTIONAL light_on = FALSE /obj/item/controller/Initialize(mapload) diff --git a/code/modules/wiremod/shell/dispenser.dm b/code/modules/wiremod/shell/dispenser.dm index 5fa2d2b1a8e..4ea2d03c9d7 100644 --- a/code/modules/wiremod/shell/dispenser.dm +++ b/code/modules/wiremod/shell/dispenser.dm @@ -9,7 +9,7 @@ icon_state = "setup_drone_arms" density = FALSE - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_on = FALSE var/max_weight = WEIGHT_CLASS_NORMAL diff --git a/code/modules/wiremod/shell/drone.dm b/code/modules/wiremod/shell/drone.dm index 6f7afcfea04..96fe3b2fa0a 100644 --- a/code/modules/wiremod/shell/drone.dm +++ b/code/modules/wiremod/shell/drone.dm @@ -10,7 +10,7 @@ maxHealth = 300 health = 300 living_flags = 0 - light_system = MOVABLE_LIGHT_DIRECTIONAL + light_system = OVERLAY_LIGHT_DIRECTIONAL light_on = FALSE /mob/living/circuit_drone/Initialize(mapload) diff --git a/code/modules/wiremod/shell/gun.dm b/code/modules/wiremod/shell/gun.dm index e9176d8c6ca..3a37501e8e1 100644 --- a/code/modules/wiremod/shell/gun.dm +++ b/code/modules/wiremod/shell/gun.dm @@ -11,7 +11,7 @@ ammo_type = list(/obj/item/ammo_casing/energy/wiremod_gun) cell_type = /obj/item/stock_parts/cell/emproof/wiremod_gun item_flags = NONE - light_system = MOVABLE_LIGHT_DIRECTIONAL + light_system = OVERLAY_LIGHT_DIRECTIONAL light_on = FALSE automatic_charge_overlays = FALSE trigger_guard = TRIGGER_GUARD_ALLOW_ALL diff --git a/code/modules/wiremod/shell/keyboard.dm b/code/modules/wiremod/shell/keyboard.dm index 05b9ded074b..0b28959aa9c 100644 --- a/code/modules/wiremod/shell/keyboard.dm +++ b/code/modules/wiremod/shell/keyboard.dm @@ -6,7 +6,7 @@ worn_icon_state = "electronic" lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi' - light_system = MOVABLE_LIGHT_DIRECTIONAL + light_system = OVERLAY_LIGHT_DIRECTIONAL light_on = FALSE /obj/item/keyboard_shell/Initialize(mapload) diff --git a/code/modules/wiremod/shell/moneybot.dm b/code/modules/wiremod/shell/moneybot.dm index 20eb596eb72..cacb457149d 100644 --- a/code/modules/wiremod/shell/moneybot.dm +++ b/code/modules/wiremod/shell/moneybot.dm @@ -9,7 +9,7 @@ icon_state = "setup_large" density = FALSE - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_on = FALSE var/stored_money = 0 diff --git a/code/modules/wiremod/shell/scanner.dm b/code/modules/wiremod/shell/scanner.dm index 3012fe65e49..c88d7b1fb5f 100644 --- a/code/modules/wiremod/shell/scanner.dm +++ b/code/modules/wiremod/shell/scanner.dm @@ -11,7 +11,7 @@ worn_icon_state = "electronic" lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi' - light_system = MOVABLE_LIGHT_DIRECTIONAL + light_system = OVERLAY_LIGHT_DIRECTIONAL light_on = FALSE /obj/item/wiremod_scanner/Initialize(mapload) diff --git a/code/modules/wiremod/shell/server.dm b/code/modules/wiremod/shell/server.dm index fc71bfaa265..24501797197 100644 --- a/code/modules/wiremod/shell/server.dm +++ b/code/modules/wiremod/shell/server.dm @@ -10,7 +10,7 @@ icon_state = "setup_stationary" density = TRUE - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_on = FALSE /obj/structure/server/Initialize(mapload) diff --git a/config/awaymissionconfig.txt b/config/awaymissionconfig.txt index 7278655a39b..15d6b0ac718 100644 --- a/config/awaymissionconfig.txt +++ b/config/awaymissionconfig.txt @@ -7,13 +7,11 @@ #Do NOT tick the maps during compile -- the game uses this list to decide which map to load. Ticking the maps will result in them ALL being loaded at once. #DO tick the associated code file for the away mission you are enabling. Otherwise, the map will be trying to reference objects which do not exist, which will cause runtime errors! -#_maps/RandomZLevels/blackmarketpackers.dmm #_maps/RandomZLevels/TheBeach.dmm -#_maps/RandomZLevels/centcomAway.dmm #_maps/RandomZLevels/moonoutpost19.dmm #_maps/RandomZLevels/undergroundoutpost45.dmm #_maps/RandomZLevels/caves.dmm #_maps/RandomZLevels/snowdin.dmm #_maps/RandomZLevels/research.dmm #_maps/RandomZLevels/SnowCabin.dmm -#_maps/RandomZLevels/blackmesa.dmm +#_maps/RandomZLevels/museum.dmm diff --git a/config/config.txt b/config/config.txt index 28889c89dbf..687bb9916dc 100644 --- a/config/config.txt +++ b/config/config.txt @@ -545,9 +545,9 @@ URGENT_AHELP_COOLDOWN 300 MOTD motd.txt #MOTD motd_extra.txt -## Assets can opt-in to caching their results into `tmp`. +## Assets can opt-in to caching their results into `cache/`. ## This is important, as preferences assets take upwards of 30 seconds (without sleeps) to collect. -## The cache is assumed to be cleared by TGS recompiling, which deletes `tmp`. +## The cache is assumed to be cleared by TGS recompiling, which deletes `cache/`. ## This should be disabled (through `CACHE_ASSETS 0`) on development, ## but enabled on production (the default). CACHE_ASSETS 0 diff --git a/html/changelogs/AutoChangeLog-pr-1556.yml b/html/changelogs/AutoChangeLog-pr-1556.yml new file mode 100644 index 00000000000..26590e5c5f0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1556.yml @@ -0,0 +1,6 @@ +author: "Mothblocks" +delete-after: True +changes: + - balance: "Instead of too much damage to the head beheading someone, it\nwill now split their skull in half. While their skull is open, you can\nrip out their eyes with your hands. and they will spill their brain out\nof their head if they slip." + - balance: "The Path of Blades ascension will accept either a beheaded\nperson, or someone with their skull split open." + - rscdel: "Removed the beheading objectives from traitor." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1829.yml b/html/changelogs/AutoChangeLog-pr-1829.yml deleted file mode 100644 index 79eb8006a57..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1829.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Stalkeros" -delete-after: True -changes: - - rscadd: "Blueshift Xen asteroid has been reworked into an OG red mining asteroid, with appropriate fauna" - - rscdel: "Effectivelly everything else that was related to Black Mesa." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1868.yml b/html/changelogs/AutoChangeLog-pr-1868.yml deleted file mode 100644 index 76315cacedd..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1868.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SyncIt21" -delete-after: True -changes: - - bugfix: "reactions now compute purity of reagents based on their volume, meaning larger amounts of reagents created will have more significant effects on the final purity of the solution" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1872.yml b/html/changelogs/AutoChangeLog-pr-1872.yml deleted file mode 100644 index c1e6dd9c153..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1872.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Zargoar" -delete-after: True -changes: - - rscadd: "Adds in the Red Mons, The Wizard, The Rune and MOTHS-MOTHS-MOTHS bar signs from the bar sign contest.\nCongratulations to the winners!" - - image: "Adds in the Red Mons, The Wizard, The Rune and MOTHS-MOTHS-MOTHS bar signs from the bar sign contest." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1873.yml b/html/changelogs/AutoChangeLog-pr-1873.yml deleted file mode 100644 index 164e0b7edb8..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1873.yml +++ /dev/null @@ -1,12 +0,0 @@ -author: "SyncIt21" -delete-after: True -changes: - - qol: "adds screentips & examines for screwdriver & crowbar acts & alt click." - - qol: "techfabs can now use the mouse drop functionality to set drop target." - - qol: "lathe printing animation plays on loop while printing rather than flicking once for more visual feedback" - - bugfix: "lathe sheet insertion animations are now linked & work again for all material types inserted via remote silo/local storage" - - bugfix: "printing custom materials items from autolathe works again." - - bugfix: "printing multiple items from lathes will actually print that correct quantity of items requested." - - bugfix: "printing items the 2nd time around from lathes won't cause the UI to reload each time." - - code_imp: "autodoc for some vars & procs, merges procs." - - refactor: "Optimized code for autolathe & techfabs in general. Report bugs on github" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1877.yml b/html/changelogs/AutoChangeLog-pr-1877.yml deleted file mode 100644 index 48464524a20..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1877.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Paxilmaniac" -delete-after: True -changes: - - rscadd: "Adds the cropped jacket, it's like a jacket but some barbarian seems to have ripped the bottom half off it" - - bugfix: "A few suit items that really ought to have some suit storage stuff, now have that." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1878.yml b/html/changelogs/AutoChangeLog-pr-1878.yml deleted file mode 100644 index 30dab1d25ca..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1878.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Zergspower" -delete-after: True -changes: - - rscadd: "Hilbert Hotel - Adds a beach condo" - - bugfix: "Apartment in Hilberts hotel regains its birb plush" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1879.yml b/html/changelogs/AutoChangeLog-pr-1879.yml deleted file mode 100644 index 1a81434102d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1879.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Lutowski" -delete-after: True -changes: - - bugfix: "Service Hall's disposal pipes are fixed on Void Raptor." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1882.yml b/html/changelogs/AutoChangeLog-pr-1882.yml deleted file mode 100644 index f29f5d05bbb..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1882.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Lutowski" -delete-after: True -changes: - - rscadd: "The barbers have been hard at work! Emo Long & Gloomy Bangs hairstyles are updated to modern standards." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1884.yml b/html/changelogs/AutoChangeLog-pr-1884.yml deleted file mode 100644 index 85a08ee45f1..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1884.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "nikothedude" -delete-after: True -changes: - - bugfix: "Synthetic organ manipulation no longer causes screaming" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1886.yml b/html/changelogs/AutoChangeLog-pr-1886.yml deleted file mode 100644 index 24904a9ee9a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1886.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "OrionTheFox" -delete-after: True -changes: - - image: "fixed some minor icon inconsistencies on the White Suit and Tan Suit" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1887.yml b/html/changelogs/AutoChangeLog-pr-1887.yml deleted file mode 100644 index f508df78ae5..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1887.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "ArcaneMusic" -delete-after: True -changes: - - bugfix: "Icebox should have it's ore distribution and it's ore vents fixed, so that vents should now produce ore." - - spellcheck: "Boulder processing machines now don't mention things they don't do." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1890.yml b/html/changelogs/AutoChangeLog-pr-1890.yml deleted file mode 100644 index 0bbc14b2586..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1890.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "1393F" -delete-after: True -changes: - - bugfix: "The HFR now provides the max temperature for recipes" - - bugfix: "the crystallizer now provides the dangerous object created instead of itself in admin logging" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1892.yml b/html/changelogs/AutoChangeLog-pr-1892.yml deleted file mode 100644 index 5e7867c9d1b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1892.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Melbert" -delete-after: True -changes: - - bugfix: "You know that one bug that makes the cryo cells on Deltastation unusuable? Well it's not fixed but at least those cryo cells are usuable again, maybe at the cost of another station's cryo cells. Who knows!" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1893.yml b/html/changelogs/AutoChangeLog-pr-1893.yml deleted file mode 100644 index ed3b938860a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1893.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Melbert" -delete-after: True -changes: - - bugfix: "Fixed Finger Guns giving a misleading chat message" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1894.yml b/html/changelogs/AutoChangeLog-pr-1894.yml deleted file mode 100644 index 23efa8d682e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1894.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Melbert" -delete-after: True -changes: - - bugfix: "Fixed some situations in which you couldn't interact with heretic runes" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1895.yml b/html/changelogs/AutoChangeLog-pr-1895.yml deleted file mode 100644 index 5c22ad2e8bd..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1895.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Zergspower" -delete-after: True -changes: - - balance: "Brings back non-proximity based ore spawns" - - bugfix: "fixes Icemoon not spawning ore" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1897.yml b/html/changelogs/AutoChangeLog-pr-1897.yml deleted file mode 100644 index 970c4c64321..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1897.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "LemonInTheDark" -delete-after: True -changes: - - rscdel: "Removes halloween screen tint, we're taking him to retire by the seaside (he was alone and unloved)" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1898.yml b/html/changelogs/AutoChangeLog-pr-1898.yml deleted file mode 100644 index a33ebc0cbae..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1898.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "larentoun" -delete-after: True -changes: - - bugfix: "Now falsewalls visually don't close when they shouldn't." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1899.yml b/html/changelogs/AutoChangeLog-pr-1899.yml deleted file mode 100644 index 98c9d89afa1..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1899.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "LT3" -delete-after: True -changes: - - qol: "Health analyzer will now display blood alcohol content" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1900.yml b/html/changelogs/AutoChangeLog-pr-1900.yml deleted file mode 100644 index 88999998073..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1900.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Holoo-1" -delete-after: True -changes: - - admin: "remade everyone is traitor into everyone is antag in secrets panel" \ No newline at end of file diff --git a/html/changelogs/archive/2024-02.yml b/html/changelogs/archive/2024-02.yml index 88182597e93..c9849b35ce9 100644 --- a/html/changelogs/archive/2024-02.yml +++ b/html/changelogs/archive/2024-02.yml @@ -234,3 +234,546 @@ - qol: Added a new head-only target hotkey, unbound by default. Wallem: - rscadd: Adds a new suicide_act() to the smite spell +2024-02-10: + 00-Steven: + - bugfix: As they should've for a while, screwdrivers (cocktail) actually work as + screwdrivers (tool). + - sound: The screwdriver cocktail also actually plays the screwdriver sound when + used. + 1393F: + - bugfix: The HFR now provides the max temperature for recipes + - bugfix: the crystallizer now provides the dangerous object created instead of + itself in admin logging + ArcaneMusic: + - bugfix: Icebox should have it's ore distribution and it's ore vents fixed, so + that vents should now produce ore. + - spellcheck: Boulder processing machines now don't mention things they don't do. + Ben10Omintrix: + - rscadd: settlers can rename their pets + CliffracerX: + - image: Habits, hoods & veils for religious staff now support GAGS. Resprited + the Monk Habit with actual shading. + - image: Pencilskirts now support GAGS, and include variants without the top to + allow combination with undershirts. + - image: the Qipao & Cheongsam allow colorable trim, the Yukata's sash is colorable, + and Cheongsam pants are colorable. + - image: office & executive casual suits kitbashed from slacks & pencilskirt tops, + for when you wanna push papers in style. + - qol: added the Voyager Trekkie uniforms to the loadout menu, and made all Trekkie + uniforms recolorable. + - refactor: Trekkie uniforms no longer have nonmodular edits to assign their digitigrade + variants. + - admin: icspawning supports quirks & loadout items now + - admin: bluespace technician RPED has been significantly upgraded + - bugfix: hotfix for loadout wallets not filling properly + - bugfix: camo pants now available for digi legs (again) + FernandoJ8: + - code_imp: added an IS_CHANGELING() helper and used it where applicable + Holoo-1: + - admin: remade everyone is traitor into everyone is antag in secrets panel + IndieanaJones: + - bugfix: Bolas in your pockets no longer slow you down. + JohnFulpWillard: + - bugfix: Species that can eat mice don't get disgusted from seeing one in the toilet + bong. + - rscadd: Grabbing an unwrenched statue/mannequin/skeleton model will now move its + direction as you move yours, and you can talk through it. + - bugfix: Space Dragon's carp allies no longer turn the entire roundend report into + bold. + - bugfix: Bar bots asking for Cucumber Lemonade now gives you money for completing + it. + - rscadd: Changeling's reviving stasis ability now puts you in stasis. + LT3: + - qol: Health analyzer will now display blood alcohol content + LemonInTheDark: + - rscdel: Removes halloween screen tint, we're taking him to retire by the seaside + (he was alone and unloved) + - rscadd: Ghost hair looks better now. Insert nerd shit about RGB vs HSL color space + here, go watch a youtube video or whatever. + Lutowski: + - rscadd: The barbers have been hard at work! Emo Long & Gloomy Bangs hairstyles + are updated to modern standards. + - bugfix: Service Hall's disposal pipes are fixed on Void Raptor. + Melbert: + - bugfix: You know that one bug that makes the cryo cells on Deltastation unusuable? + Well it's not fixed but at least those cryo cells are usuable again, maybe at + the cost of another station's cryo cells. Who knows! + - bugfix: Fixed Finger Guns giving a misleading chat message + - bugfix: Fixed some situations in which you couldn't interact with heretic runes + - balance: Rats are now 5x less likely to decide to eat a cable when idling. (1%, + down from 5%) + MortoSasye: + - rscadd: Adds more clothes to the hearthkin's wardrobe, three of them being exclusively + made for their use. + OrionTheFox: + - image: fixed some minor icon inconsistencies on the White Suit and Tan Suit + Paxilmaniac: + - rscadd: Adds the cropped jacket, it's like a jacket but some barbarian seems to + have ripped the bottom half off it + - bugfix: A few suit items that really ought to have some suit storage stuff, now + have that. + - rscadd: The DeForest Med-Vend has been added to the selection of random vendors + that can be found around the station, these machines sell medical items at an + upcharge over the company imported price for the convenience of having the items + right then and there. + - rscadd: The wall med-station has been added, which is a simple biogenerator-type + machine that hooks onto walls and prints both basic medical items and blood + packs of nearly all types. + - rscadd: The treatment zone indicator can now be gotten from cargo, this is a holoprojector + that makes a 3x3 tile red warning square to give onlookers the hint that they + should keep their distance while medical staff do their work. + - balance: A large number of Deforest medical items have been made cheaper, namely + medpens and medkits as a result. + SomeRandomOwl: + - rscadd: Drones default laws and flavor text warning has been changed. + - rscadd: Drones can now UNDERSTAND sol but not speak it. + Stalkeros: + - rscadd: Blueshift Xen asteroid has been reworked into an OG red mining asteroid, + with appropriate fauna + - rscdel: Effectivelly everything else that was related to Black Mesa. + SyncIt21: + - bugfix: reactions now compute purity of reagents based on their volume, meaning + larger amounts of reagents created will have more significant effects on the + final purity of the solution + - qol: adds screentips & examines for screwdriver & crowbar acts & alt click. + - qol: techfabs can now use the mouse drop functionality to set drop target. + - qol: lathe printing animation plays on loop while printing rather than flicking + once for more visual feedback + - bugfix: lathe sheet insertion animations are now linked & work again for all material + types inserted via remote silo/local storage + - bugfix: printing custom materials items from autolathe works again. + - bugfix: printing multiple items from lathes will actually print that correct quantity + of items requested. + - bugfix: printing items the 2nd time around from lathes won't cause the UI to reload + each time. + - code_imp: autodoc for some vars & procs, merges procs. + - refactor: Optimized code for autolathe & techfabs in general. Report bugs on github + ViktorKoL: + - bugfix: fix heretic's rust mark failing to damage any items if the victim has + any container on them with another item inside, and maybe other bugs of similar + nature + Zargoar: + - rscadd: 'Adds in the Red Mons, The Wizard, The Rune and MOTHS-MOTHS-MOTHS bar + signs from the bar sign contest. + + Congratulations to the winners!' + - image: Adds in the Red Mons, The Wizard, The Rune and MOTHS-MOTHS-MOTHS bar signs + from the bar sign contest. + Zergspower: + - rscadd: Hilbert Hotel - Adds a beach condo + - bugfix: Apartment in Hilberts hotel regains its birb plush + - balance: Brings back non-proximity based ore spawns + - bugfix: fixes Icemoon not spawning ore + larentoun: + - bugfix: Now falsewalls visually don't close when they shouldn't. + mc-oofert: + - bugfix: you may no longer altclick unanchored toiletbongs from any range in any + condition to rotate them + necromanceranne: + - bugfix: The shove blocker module parent type now has the correct typepath. + nikothedude: + - bugfix: Synthetic organ manipulation no longer causes screaming +2024-02-11: + Absolucy: + - bugfix: Fix succumb last words being double-encoded (i.e `i'm` becoming `i'lm`) + Higgin: + - bugfix: deathtrap recycler can now be moved. + - refactor: moved check for NO_DECONSTRUCTION flag to be inside can_be_unfasten_wrench, + allowing us to set specific machines to be movable but not deconstructable. + JohnFulpWillard: + - bugfix: Uplinks now update their UI when you add telecrystals in them, so you + don't need to close and reopen it. + Melbert: + - rscadd: Shaft Miner's Bluespace Survival Capsules will now throw people away from + it when it deploys. Be sure to heed the warning to "Stand back". + - rscadd: Freedom Implants and Biodegrade can you free you of the shackles of knotted + shoes. + - refactor: Fire effects get added to mobs in a different way now. Maybe it will + get stuck less. Report any oddities. + Momo8289: + - rscadd: Fire ants can now be scooped up and used as a chem like normal space ants + - rscadd: Shakers can now pour drinks with custom names and descriptions! Alt-click + the shaker to enable this. + Rhials: + - bugfix: You can now refine ectoplasmic raw cores at the implosion machine thing. + - bugfix: The Energy Cake slice now does its on-eat effect AFTER being eaten, instead + of before. + - balance: Beacon and Teleport Blocker implants have been moved from cargo to the + security lathe. + - balance: A new research node has been created, requiring Subdermal Implants and + Miniature Bluespace, to unlock Beacon/Teleport Blocker implants. + - balance: Exile implants can now be printed from the security lathe after researching + basic cybernetic implants. + - bugfix: The beach bar virtual domain's bar closets no longer have default locker + doors. + SyncIt21: + - bugfix: lathes now use moderate power for printing operations + Zergspower: + - bugfix: fixes apartment hotel dorm not loading properly + vinylspiders: + - bugfix: '''Sharp Claws'' quirk now has a different icon, to distinguish it from + the new ''Touchy'' quirk' +2024-02-12: + Iajret: + - rscadd: Added Blue slim reskin for security belt, armadyne skin for webbing and + red messenger bag skin for messenger bag +2024-02-13: + 00-Steven: + - bugfix: Fixed stamps not accounting for scroll offset. You can actually stamp + paperwork properly without using accursed knowledge again. + - bugfix: Fixed PDA messenger not scrolling to the bottom when a new message gets + sent. + - bugfix: Paperwork should actually use the writing utensil's font, colour, and + boldness outside of input fields again. + Atlasle, JohnFulpWillard: + - rscadd: Adds the Touchy quirk, you need to be next to something to examine it, + for 2 extra quirk points. + Aylong: + - rscadd: Added `Mute` button into `Chat Tabs` settings, it disables tab unread + counter + - rscadd: Added `Clear chat` button into `General` settings, you can clear your + dirty chat like you did it before TGchat + - bugfix: Case-sensitive highlighting now works properly + Dreathtil: + - rscadd: Added Quirk support to all of the Hotel Spawners + - rscadd: Added Loadout support to all of the Hotel Spawners + Ed640: + - bugfix: Sculpted statues stop including light layers. + LT3: + - bugfix: MULEbot will correctly display its loaded cargo on BotKeeper + - bugfix: MULEbot home beacon can be set from control panel + - code_imp: MULEbot home location is automatically set on init + Lunar248: + - rscadd: Added the Rapid Constructor Fab and a Colonial Supply core to the Freighter + ghost role. + - bugfix: Fixed a few missing lights, and vents aboard the Freighter ghost role. + Melbert: + - bugfix: You can once again see love on Valentines Day + - qol: Glasses colors should be a lot less harsh, and being blind no longer also + blinds your hud. + - bugfix: Lavaland Beech Bartender's clothing storage is named the right thing now + MelokGleb and KREKS, McRamon, Ghommie: + - image: New sprites for changeling powers and items. Woooh. + MortoSasye: + - rscadd: A new primitive bonesetter has been added, as well as a function to melt + iron rods in a forge. + - image: Primitive Bonesetter icon + Rex9001: + - balance: Smile of the moon's effects now last for longer and have a longer minimum + active time + - balance: Mark of moon detonations now do sanity damage + - qol: Ascended moon heretics and lunatics are now able to see who is and isn't + a lunatic. + - qol: People inside the ascended moon heretics sanity draining aura now gain an + effect under their tile. + Rhials: + - bugfix: You can now click things as an alien larva again. + - qol: Venus Human Traps are now visible in the orbit menu. Cool! + - bugfix: Spawning as a Venus Human Trap now properly gives you an antag datum/objective. + - bugfix: Venus human trap flowers no longer have a second, identical flower under + themselves. + - qol: Map hazard anomalies are no longer treated as points-of-interest in the orbit + menu. + Singul0: + - balance: Brainwashed individuals can no longer be debrainwashed through a mindshield + implant, they still protect you from brainwashing though! You just need to get + medical to fix them up. + - bugfix: You can now use bluespace launchpads from shuttles (except cargo and ferry + shuttles) + - bugfix: Fixes backwards engines in a few of centcom's ferries! + Thunder12345: + - bugfix: The wizard's pets Jimmy and Jommy no longer fight to the death. + Zergspower: + - balance: ore generation on icebox is less explosive filled + intercepti0n: + - bugfix: Separated logs list into pages in ore silo UI, thus fixing lag when logs + list grows too long. + mc-oofert: + - rscadd: nanotrasen museum gateway map + siliconOpossum: + - bugfix: Getting blood on your hand when you only have one no longer makes your + hands visually permanently bloody + - bugfix: Holding bloodied gloves no longer makes your hands look bloody, bloodied + gloves now look bloody when worn, and damaged gloves now look damaged when worn + - bugfix: Gaining or losing an arm now correctly updates your hand overlays + vinylspiders: + - bugfix: contractor victims will now be sent back to the station after 4 minutes + like they're supposed to + - rscdel: contractor victims will no longer receive brain damage or random wounds + when being kidnapped. +2024-02-15: + A.C.M.O.: + - qol: Added purple color to ERP quirks on the Quirks page of Character Preferences. + JohnFulpWillard: + - bugfix: Revenants (and other flying mobs) will not make noise when walking into + pools of gibs, + LemonInTheDark: + - bugfix: Fixes fancy lights not updating their source location when picked up and + moved + Melbert: + - balance: Scientists have discovered Nuka Cola is not good for short term health. + NeonNik2245: + - rscadd: 3 new masks for your characters (thanks to Kovac for the scarf sprites) + Paxilmaniac: + - rscadd: A pair of new energy weapons has been added to replace microfusion lasers, + the modular energy weapons. Coming in both long and short versions, these persona-enabled + weapons have many different modes they can rapidly reconfigure themselves between + to fit whatever the operator's preferences may be. + - rscdel: Microfusion lasers entirely have been deleted. There are no more. Good + news, however, is that the highly curious non-modular code edits that were a + result of microfusion lasers are now gone. + Rhials: + - spellcheck: Some space ruin area names have been made more distinct. + SyncIt21: + - bugfix: machines that should not drop contents when deleted no longer do. + - refactor: refactors how machines are deconstructed. report bugs on github. + ViktorKoL: + - bugfix: knit flesh now heals organs as intended, and does not cause its victims + to be red forever if interrupted + - spellcheck: knit flesh chat messages are no longer gramatically incorrect + - bugfix: heretics no longer lose their spells when returning from a shapeshift + Zenitheevee: + - qol: port tarkon has some emergency power to help at start + - qol: port tarkon's ship has a much lower draw on spawn + - qol: port tarkon engineers' inducer now spawns in backpack + - balance: port tarkon xenos spawners rebalanced + - balance: port tarkon xenos target hybrid xeno players now + - rscadd: port tarkon unique additions for access and cameras + vinylspiders: + - bugfix: '*wag emote is now functional again' +2024-02-16: + CandleJaxx and Iamgoofball: + - bugfix: Fixes Krav Maga allowing pacifism bypasses. + IndieanaJones: + - balance: Nightmare's Light Eater takes less time in jaunt to gain a critical strike, + being reduced to 7 seconds from 15 seconds. + K4rlox: + - balance: Maintenance drones now can use RPED, RCD, Holosign, and Spray bottles + LemonInTheDark: + - rscadd: AI's acceleration now smoothly decays, instead of just falling back down + to 0 after 0.5 seconds + - bugfix: AI's standard movement (non accelerated) is smooth now, instead of constantly + jumping around + - bugfix: AIs will now follow their targets more closely, shouldn't have any issues + with them lagging behind anymore + Melbert: + - bugfix: Valentines no longer see themselves covered in hearts. They only see their + Valentine covered in hearts. + Rhials: + - bugfix: Ghost role polls should spam you less when multiple of the same roll occur + in succession. + Thlumyn: + - rscadd: Added hotspring to hearthkin ghost cafe spot. + - bugfix: Moved moved in hearth in cafe to not layer on top of fence. + Xander3359: + - balance: Contractor kit no longer gets RNG items, it's a specific pool now + vinylspiders: + - bugfix: mold should now spawn enemies again + yooriss: + - rscdel: Security and medical records can no longer be expunged or mass-purged + from their respective consoles. + - rscadd: Numerous implants have been added to the character preferences screen, + including a variety of handy toolsets and more. Every integrated tool has its + own unique description and company branding, but are always worse than their + in-hand counterparts you can find on the station. Style over substance! +2024-02-18: + 00-Steven: + - bugfix: Space cats CAN into space. (They're back to surviving being in unsuitable + atmos.) + 13spacemen: + - code_imp: Removed unused global lists and sprite accessories related to tail spines + - code_imp: removed redundant check for plasmamen in survival box code + A.C.M.O.: + - rscadd: Enabled the synth power cord implant to charge from any power cell. Renamed + it to charging implant. + GoldenAlpharex: + - bugfix: The Spawners menu now accurately displays the amount of uses left in each + spawner option, taking into account individual spawners that either allow more + than one use, or an infinite amount of uses. + IndieanaJones: + - bugfix: Blob Zombies now render their blob heads correctly again. + - bugfix: Tank spider corpses should no longer be conditionally invisible + Kylerace: + - admin: admins/maintainers can now make the profiler focus on specific subsystems + by setting the subsystem var profile_focused to TRUE + LemonInTheDark: + - refactor: Fucks with how movement keys are handled. Please report any bugs + Lutowski: + - rscadd: Parts from a discontinued synth chassis line from the Mariinsky Ballet + Company is making rounds on the black market - now available to install for + synths and chromed up organics! + - rscadd: Slightly alters Research Director's labcoat sprite. + MLGTASTICa: + - balance: Oxandrolone now scales with purity. Its default purity is 100% + - balance: Salicylic acid now scales with purity. Its default purity is 100% + Melbert: + - rscadd: Wizards have a new mobility option available, the Telegram Scepter. The + ability to travel anywhere you can see at the point of a wand... but at a price? + Roastglue: + - bugfix: Crafting Bulgogi no longer makes Bibimbap. It instead makes Bulgogi. + Sylphet: + - bugfix: cargo lockboxes update iconstates correctly now + SyncIt21: + - qol: adds examines & screentips for ore box + - code_imp: cleans up some procs for ore box + - spellcheck: corrected description & ui notice of ore box to specify it can hold + boulders too + - bugfix: Indestructible items like the pai card don't teleport to the ore silo + when you insert them into silo linked machine & also displays a message saying + it was rejected. + Thunder12345: + - qol: The bitrunning quantum console UI now lists domains in tabs by difficulty. + WinterDarkraven: + - rscadd: In an attempt to stop the greytide, NanoTrasen has increased security's + baton energy output. This has, through testing, done nothing but make the device + spark more than it used to. + destrucktoid: + - bugfix: Restorative Nanites now heal Slimepeople just as well as they do other + people. + mc-oofert: + - balance: assemblybombs are bulky + mogeoko: + - bugfix: Thermomachines now reconnect to pipes on multitool's act. + - bugfix: Multi-deck connectors won't connect pipes not located in front/top/bottom + of it. + nikothedude: + - bugfix: Characters with multiple bodytypes are no longer forced to bear broken + clothing sprites +2024-02-19: + SyncIt21: + - qol: adds examines & screentips for crowbar, screwdriver acts to BRM & refinery + machines + - qol: adds examines about the number of boulders stored & processed to BRM & refinery + machines + - qol: BRM now has its lights turn on/off depending on wether automatic boulder + retrieval is on/off for visual clarity along with examines + - qol: refinery machines now display ballon alerts & plays sounds more frequently + when processing boulders for better feedback + - bugfix: vents now spawn boulders of all sizes & not just small ones + - bugfix: expanded gulag boulders now have correct materials in them. + - bugfix: manual tapping of vents now has a cooldown applied as intended. + - bugfix: BRM has its light turned off when area power goes off + - bugfix: boulders ejected from refineries by hand no longer teleport all over the + place occasionally. + - bugfix: refineries no longer eject boulders with 0 durability + - bugfix: Boulders & refineries no longer pile up on top of BRM's & refineries in + long rounds. Their locs have to be clear of boulders before they spit out more + boulders to prevent a large pile of boulders from causing lag + - bugfix: sheets ejected from lathes no longer get rejected when inserted back which + could happen at random, no more boulders with empty materials + - code_imp: splits boulder types into its own file along with other items + - code_imp: merges & autodocs procs, vars related to boulders + - refactor: repaths BRM to a simpler subtype + - refactor: BRM now spawns boulders in batches(batch size can be increased with + upgraded parts) with a boulder appearing every second. After a batch is processed + a 3 second cooldown is applied to stop the conveyer belt from clogging up, With + this BRM wires are removed as there is no need for timers to be attached to + wires which intefers without our batch processing timings. +2024-02-20: + 1393F: + - bugfix: The crystallizer screentip for rotating it has been updated with the correct + button + A.C.M.O.: + - qol: Enabled firedoors to automatically close when forced open. + - qol: Shortened manual override of firedoors from 10 seconds to 5 seconds. + AstraFarera: + - bugfix: Interdyne map fixes, ql changes + Blackbox Recorder. + Cursor: + - rscadd: Security Officers are now Haram. + Ghommie: + - rscadd: Players holding cardboard cutouts will now assume their appearance, just + like for potted plants. + - qol: Circuit multitools can now mark (visible) items worn/held by a mob. + - rscadd: Added three new 'special' bedsheets. One of them is quite rare and made + from gondola hide. + - rscadd: Curators now get a 22.5% cut on credits spent on painting patronages (divided + by the number of curators). The service department also gets another, 12.5% + cut. + - qol: Added a zoom in and out buttons to the painting UI. + GoldenAlpharex: + - bugfix: Humanoid ghost roles now receive their job title on their mob, when that + was previously not the case. + - admin: Humanoid ghost roles can now be searched by job title in the Player Panel + directory (and will show up everywhere else that displays the job title). + - qol: Icewalkers can now go back to sleep in their hole in the ground, allowing + another kin to come back out later. + - qol: Icewalkers can now send their sleeping kins down the hole too, if they've + been sleeping for long enough (30 minutes). + JohnFulpWillard: + - bugfix: The DNA scanner's joker button no longer instantly activates itself when + the cooldown between uses is done. + - bugfix: Regenerative cores (and other monster organs) now work when using it in-hand + while resting. + Kashargul: + - qol: hides the delete button on the main tab allows to reorder all other chat + tabs + - qol: makes the tgui_input_number user friendly for negative and decimal inputs + - code_imp: the onBlur={(_, value) => onBlur(value)} event should now be used on + all uses of RestrictedInput to ensure that the number is fully sanitized whenever + the user leaves the field or submits it through a button + LT3: + - rscadd: The tram has been equipped with enhanced safety glass to reduce the severity + of crew injuries + - qol: Air alarms now display the source of triggered fire alarms/firedoors + LemonInTheDark: + - bugfix: Maps loaded in after roundstart will no longer have broken smoothing + LemonInTheDark, Kryson: + - image: Modified railing sprites to be a bit more three-d + Melbert: + - admin: You can now set someone's TC to 0 + - admin: Removing Traitor from automatically removes the uplink from them + - admin: Removing Uplink from someone no longer wipes ALL of their memories + - bugfix: Lifeline can no longer track mobs with suit sensors off + - bugfix: Fixes AI double-click tracking + - rscadd: Valentines Day now polls all players for candidates when it triggers rather + than forcing all players to be a Valentine. Consent is important. + - rscadd: Valentine silicons now gain special laws pertaining to their date. + - qol: Valentines Cards are now paper, so you can write on them, stamp them, or + burn them. + - qol: Valentine's roundend report no longer takes up a massive amount of space + and also no longer sound so, so weird. + Motho: + - rscadd: Retrofitted shoredresses have been made available in the loadout. These + new variations can fit standard body shapes. + Paxilmaniac: + - balance: Synths can now use twitch (and by extension, the qani-laaca computer), + both synths and those with vein muscles will be heated up massively by twitch, + rather than taking heart damage. + - bugfix: The radial blur overlay for twitch now once again works properly, meaning + you won't be basically entirely blinded by it anymore. + - rscadd: Two new crates can be found in the security armory tab, with renoster + shotguns and kiboko launchers. + - balance: The contents of the CIN surplus box have been changed around to contain + some of the new CIN weapons, among other things. The weighting list has been + changed as well. + - code_imp: Some unused or otherwise pointless code additions from really old gunsec + have been either tweaked or removed. + - refactor: The CIN surplus crate has had its code refactored a bit. + - code_imp: We no longer have to non-modularly comment out the russian surplus crate, + instead using a single variable to hide it. + Rhials: + - bugfix: Removes the double-newscaster from the arrivals sec post. + SyncIt21: + - bugfix: mecha drill won't use power & do other checks if the target cannot be + drilled. + - bugfix: mecha drill will stop drilling if the mech moves even without changing + direction. Also will use power & check other conditions every drill cycle. + - bugfix: boulders are no longer lost when teleported by the BRM + - bugfix: batch processing cooldown works when teleporting multiple boulders + - bugfix: multiple reactions occuring in the same holder like mixing drinks will + yield correct reagent result volumes + - code_imp: ' Removes `update_total()` from instant reactions improving performance + slightly' + - code_imp: merges `remove_all_direct()` with `remove_all()` to reduce code size + kawaiinick: + - rscadd: Your mouth now fits combat or survival knives(it's totally safe) + mc-oofert: + - bugfix: forcefully pushing disposal outlets and chutes deconstructs them instead + of making them behave like budget eigenstatium lockers + - rscadd: deathmatch minigame + - bugfix: you may not put disposal outlets on cargo shuttle + - qol: you may altclick action buttons to bind them to a key + - code_imp: deathmatch lobbies take 8 seconds to start as to give lighting a breather + rageguy505: + - bugfix: The door above tool storage on birdshot now has maintenance access on + it and officials can now enter the CC dock room. diff --git a/icons/effects/blood.dmi b/icons/effects/blood.dmi index 93f836f4c84..fb31da10ee9 100644 Binary files a/icons/effects/blood.dmi and b/icons/effects/blood.dmi differ diff --git a/icons/effects/cranial_fissure.dmi b/icons/effects/cranial_fissure.dmi new file mode 100644 index 00000000000..9f8f5b46021 Binary files /dev/null and b/icons/effects/cranial_fissure.dmi differ diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index 072fbe02558..fcb4e262d7c 100644 Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ diff --git a/icons/effects/mapping_helpers.dmi b/icons/effects/mapping_helpers.dmi index d28d2770ec4..351bb5f00c4 100644 Binary files a/icons/effects/mapping_helpers.dmi and b/icons/effects/mapping_helpers.dmi differ diff --git a/icons/effects/random_spawners.dmi b/icons/effects/random_spawners.dmi index c03b196a137..08df14c0ffc 100644 Binary files a/icons/effects/random_spawners.dmi and b/icons/effects/random_spawners.dmi differ diff --git a/icons/hud/radial.dmi b/icons/hud/radial.dmi index 42d5c451018..90813b4d7d2 100644 Binary files a/icons/hud/radial.dmi and b/icons/hud/radial.dmi differ diff --git a/icons/hud/screen_alert.dmi b/icons/hud/screen_alert.dmi index 289d02da46a..7aa32c94b8e 100755 Binary files a/icons/hud/screen_alert.dmi and b/icons/hud/screen_alert.dmi differ diff --git a/icons/hud/screen_changeling.dmi b/icons/hud/screen_changeling.dmi index 61d3513cbfa..c3bab062ac4 100644 Binary files a/icons/hud/screen_changeling.dmi and b/icons/hud/screen_changeling.dmi differ diff --git a/icons/mob/actions/actions_changeling.dmi b/icons/mob/actions/actions_changeling.dmi index 0969b03725e..bb3634a1dde 100644 Binary files a/icons/mob/actions/actions_changeling.dmi and b/icons/mob/actions/actions_changeling.dmi differ diff --git a/icons/mob/actions/backgrounds.dmi b/icons/mob/actions/backgrounds.dmi index 558045a0656..c9aa1534538 100644 Binary files a/icons/mob/actions/backgrounds.dmi and b/icons/mob/actions/backgrounds.dmi differ diff --git a/icons/mob/clothing/mask.dmi b/icons/mob/clothing/mask.dmi index 375de246269..24e8622344e 100644 Binary files a/icons/mob/clothing/mask.dmi and b/icons/mob/clothing/mask.dmi differ diff --git a/icons/mob/clothing/neck.dmi b/icons/mob/clothing/neck.dmi index fcfdb55f522..5440bf9d99d 100644 Binary files a/icons/mob/clothing/neck.dmi and b/icons/mob/clothing/neck.dmi differ diff --git a/icons/mob/huds/antag_hud.dmi b/icons/mob/huds/antag_hud.dmi index d8d6dd1ac40..aa96f2338b2 100644 Binary files a/icons/mob/huds/antag_hud.dmi and b/icons/mob/huds/antag_hud.dmi differ diff --git a/icons/mob/inhands/antag/changeling_lefthand.dmi b/icons/mob/inhands/antag/changeling_lefthand.dmi index daf0e2fb3f6..a3723f8dab0 100644 Binary files a/icons/mob/inhands/antag/changeling_lefthand.dmi and b/icons/mob/inhands/antag/changeling_lefthand.dmi differ diff --git a/icons/mob/inhands/antag/changeling_righthand.dmi b/icons/mob/inhands/antag/changeling_righthand.dmi index aa2144c5962..d3f320a38a9 100644 Binary files a/icons/mob/inhands/antag/changeling_righthand.dmi and b/icons/mob/inhands/antag/changeling_righthand.dmi differ diff --git a/icons/mob/inhands/items/bedsheet_lefthand.dmi b/icons/mob/inhands/items/bedsheet_lefthand.dmi index 1f2d7df0075..2795277a183 100644 Binary files a/icons/mob/inhands/items/bedsheet_lefthand.dmi and b/icons/mob/inhands/items/bedsheet_lefthand.dmi differ diff --git a/icons/mob/inhands/items/bedsheet_righthand.dmi b/icons/mob/inhands/items/bedsheet_righthand.dmi index 5c831140c9e..4fe73af823a 100644 Binary files a/icons/mob/inhands/items/bedsheet_righthand.dmi and b/icons/mob/inhands/items/bedsheet_righthand.dmi differ diff --git a/icons/mob/inhands/weapons/staves_lefthand.dmi b/icons/mob/inhands/weapons/staves_lefthand.dmi index 83504696b61..5e4eb552f2a 100644 Binary files a/icons/mob/inhands/weapons/staves_lefthand.dmi and b/icons/mob/inhands/weapons/staves_lefthand.dmi differ diff --git a/icons/mob/inhands/weapons/staves_righthand.dmi b/icons/mob/inhands/weapons/staves_righthand.dmi index c83e0eed3ab..9de32d8cd95 100644 Binary files a/icons/mob/inhands/weapons/staves_righthand.dmi and b/icons/mob/inhands/weapons/staves_righthand.dmi differ diff --git a/icons/mob/simple/animal.dmi b/icons/mob/simple/animal.dmi index 3bd3438bc62..7fcf0e9d65e 100644 Binary files a/icons/mob/simple/animal.dmi and b/icons/mob/simple/animal.dmi differ diff --git a/icons/mob/simple/arachnoid.dmi b/icons/mob/simple/arachnoid.dmi index d17297f2ccf..7e15fde6852 100644 Binary files a/icons/mob/simple/arachnoid.dmi and b/icons/mob/simple/arachnoid.dmi differ diff --git a/icons/obj/bedsheets.dmi b/icons/obj/bedsheets.dmi index 8db48b45fc6..daa0c3cdd79 100644 Binary files a/icons/obj/bedsheets.dmi and b/icons/obj/bedsheets.dmi differ diff --git a/icons/obj/clothing/masks.dmi b/icons/obj/clothing/masks.dmi index 20951b3264f..1dd2ac7d71c 100644 Binary files a/icons/obj/clothing/masks.dmi and b/icons/obj/clothing/masks.dmi differ diff --git a/icons/obj/fishing.dmi b/icons/obj/fishing.dmi index 8e8be783fb7..92d7da8238a 100644 Binary files a/icons/obj/fishing.dmi and b/icons/obj/fishing.dmi differ diff --git a/icons/obj/fluff/general.dmi b/icons/obj/fluff/general.dmi index 2628eea8746..1aa7ae5c898 100644 Binary files a/icons/obj/fluff/general.dmi and b/icons/obj/fluff/general.dmi differ diff --git a/icons/obj/machines/computer.dmi b/icons/obj/machines/computer.dmi index cba0069cf6f..aae3a83a455 100644 Binary files a/icons/obj/machines/computer.dmi and b/icons/obj/machines/computer.dmi differ diff --git a/icons/obj/machines/mining_machines.dmi b/icons/obj/machines/mining_machines.dmi index 91f7f434ad3..c1a4076e3a2 100644 Binary files a/icons/obj/machines/mining_machines.dmi and b/icons/obj/machines/mining_machines.dmi differ diff --git a/icons/obj/railings.dmi b/icons/obj/railings.dmi index 6518908d544..7dcb4e7c6f7 100644 Binary files a/icons/obj/railings.dmi and b/icons/obj/railings.dmi differ diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi index 40420db3705..1e6a2ba6872 100644 Binary files a/icons/obj/structures.dmi and b/icons/obj/structures.dmi differ diff --git a/icons/obj/weapons/changeling_items.dmi b/icons/obj/weapons/changeling_items.dmi index 4c26dfea49e..ca577e6d2b2 100644 Binary files a/icons/obj/weapons/changeling_items.dmi and b/icons/obj/weapons/changeling_items.dmi differ diff --git a/icons/obj/weapons/guns/magic.dmi b/icons/obj/weapons/guns/magic.dmi index 90eb4bdc669..3d7238a72bb 100644 Binary files a/icons/obj/weapons/guns/magic.dmi and b/icons/obj/weapons/guns/magic.dmi differ diff --git a/icons/obj/weapons/guns/projectiles.dmi b/icons/obj/weapons/guns/projectiles.dmi index a4c321a0543..6e6b1797c42 100644 Binary files a/icons/obj/weapons/guns/projectiles.dmi and b/icons/obj/weapons/guns/projectiles.dmi differ diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi index 6fc1178a6b4..89b4876c0ce 100644 Binary files a/icons/turf/floors.dmi and b/icons/turf/floors.dmi differ diff --git a/modular_nova/master_files/code/datums/quirks/negative_quirks/heavy_sleeper.dm b/modular_nova/master_files/code/datums/quirks/negative_quirks/heavy_sleeper.dm index 4afd45ec75e..5d922f25145 100644 --- a/modular_nova/master_files/code/datums/quirks/negative_quirks/heavy_sleeper.dm +++ b/modular_nova/master_files/code/datums/quirks/negative_quirks/heavy_sleeper.dm @@ -11,7 +11,7 @@ hardcore_value = 2 mail_goodies = list( /obj/item/clothing/glasses/blindfold, - /obj/item/bedsheet/random, + /obj/effect/spawner/random/bedsheet/any, /obj/item/clothing/under/misc/pj/red, /obj/item/clothing/head/costume/nightcap/red, /obj/item/clothing/under/misc/pj/blue, diff --git a/modular_nova/master_files/code/datums/traits/good.dm b/modular_nova/master_files/code/datums/traits/good.dm index aa71af7edeb..483e19630fd 100644 --- a/modular_nova/master_files/code/datums/traits/good.dm +++ b/modular_nova/master_files/code/datums/traits/good.dm @@ -27,7 +27,7 @@ gain_text = span_notice("Your palms hurt a bit from the sharpness of your nails.") lose_text = span_danger("You feel a distinct emptiness as your nails dull; good luck scratching that itch.") medical_record_text = "Patient ended up scratching through the examination table's cushions; recommended they look into clipping their claws." - icon = FA_ICON_HAND + icon = FA_ICON_LINES_LEANING /datum/quirk/sharpclaws/add(client/client_source) var/mob/living/carbon/human/human_holder = quirk_holder diff --git a/modular_nova/master_files/code/datums/votes/map_vote.dm b/modular_nova/master_files/code/datums/votes/map_vote.dm index 10dea54b2fd..83406324428 100644 --- a/modular_nova/master_files/code/datums/votes/map_vote.dm +++ b/modular_nova/master_files/code/datums/votes/map_vote.dm @@ -1,3 +1,4 @@ //Map votes shouldn't be using weighted random /datum/vote/map_vote + count_method = VOTE_COUNT_METHOD_MULTI winner_method = VOTE_WINNER_METHOD_SIMPLE diff --git a/modular_nova/master_files/code/game/machinery/doors/firedoor.dm b/modular_nova/master_files/code/game/machinery/doors/firedoor.dm index a05589daf99..848ef2b12c6 100644 --- a/modular_nova/master_files/code/game/machinery/doors/firedoor.dm +++ b/modular_nova/master_files/code/game/machinery/doors/firedoor.dm @@ -11,11 +11,13 @@ /obj/machinery/door/proc/try_manual_override(mob/user) if(density && !welded && !operating) balloon_alert(user, "opening...") - if(do_after(user, 10 SECONDS, target = src)) + if(do_after(user, 5 SECONDS, target = src)) try_to_crowbar(null, user) return TRUE return FALSE +// Uncomment this override to disable the auto-close feature of firedoors. +/* /obj/machinery/door/firedoor/try_to_crowbar(obj/item/used_object, mob/user) if(welded || operating) balloon_alert(user, "opening failed!") @@ -25,6 +27,7 @@ open() else close() +*/ /obj/machinery/door/firedoor/heavy/closed icon_state = "door_closed" diff --git a/modular_nova/master_files/code/modules/client/preferences/middleware/limbs_and_markings.dm b/modular_nova/master_files/code/modules/client/preferences/middleware/limbs_and_markings.dm index 1099d7a3e79..493f160824f 100644 --- a/modular_nova/master_files/code/modules/client/preferences/middleware/limbs_and_markings.dm +++ b/modular_nova/master_files/code/modules/client/preferences/middleware/limbs_and_markings.dm @@ -32,6 +32,7 @@ "eyes" = "Eyes", "tongue" = "Tongue", "Mouth implant" = "Mouth implant", + "Chest implant" = "Chest implant", "Left Arm implant" = "Left Arm implant", "Right Arm implant" = "Right Arm implant", ) diff --git a/modular_nova/master_files/code/modules/clothing/head/_head.dm b/modular_nova/master_files/code/modules/clothing/head/_head.dm index 6b25cd4be98..f022fc99ac8 100644 --- a/modular_nova/master_files/code/modules/clothing/head/_head.dm +++ b/modular_nova/master_files/code/modules/clothing/head/_head.dm @@ -46,6 +46,24 @@ /obj/item/clothing/head/helmet/chaplain worn_icon_muzzled = 'modular_nova/master_files/icons/mob/clothing/head/chaplain_muzzled.dmi' +/obj/item/clothing/head/hooded/monkhabit + greyscale_config = /datum/greyscale_config/monk_habit_hood + greyscale_config_worn = /datum/greyscale_config/monk_habit_hood/worn + greyscale_colors = "#8C531A#9C7132" + flags_1 = IS_PLAYER_COLORABLE_1 + +/obj/item/clothing/head/chaplain/nun_hood + greyscale_config = /datum/greyscale_config/nun_hood + greyscale_config_worn = /datum/greyscale_config/nun_hood/worn + greyscale_colors = "#373548#FFFFFF" + flags_1 = IS_PLAYER_COLORABLE_1 + +/obj/item/clothing/head/chaplain/habit_veil + greyscale_config = /datum/greyscale_config/nun_veil + greyscale_config_worn = /datum/greyscale_config/nun_veil/worn + greyscale_colors = "#373548#FFFFFF" + flags_1 = IS_PLAYER_COLORABLE_1 + /obj/item/clothing/head/collectable/welding worn_icon_muzzled = 'modular_nova/master_files/icons/mob/clothing/head_muzzled.dmi' supports_variations_flags = CLOTHING_SNOUTED_VARIATION diff --git a/modular_nova/master_files/code/modules/clothing/suits/_suits.dm b/modular_nova/master_files/code/modules/clothing/suits/_suits.dm index f2d6570c1e2..d9ffd81b445 100644 --- a/modular_nova/master_files/code/modules/clothing/suits/_suits.dm +++ b/modular_nova/master_files/code/modules/clothing/suits/_suits.dm @@ -24,3 +24,32 @@ /obj/item/clothing/suit/hooded/chaplainsuit worn_icon_digi = 'modular_nova/master_files/icons/mob/clothing/suits/chaplain_digi.dmi' + +/obj/item/clothing/suit/chaplainsuit/habit + greyscale_config = /datum/greyscale_config/chappy_habit + greyscale_config_worn = /datum/greyscale_config/chappy_habit/worn + greyscale_colors = "#373548#FFFFFF#D29722" + flags_1 = IS_PLAYER_COLORABLE_1 + +/obj/item/clothing/suit/hooded/chaplainsuit/monkhabit + greyscale_config = /datum/greyscale_config/monk_habit + greyscale_config_worn = /datum/greyscale_config/monk_habit/worn + greyscale_colors = "#8C531A#9C7132" + flags_1 = IS_PLAYER_COLORABLE_1 + +// Monk habit hood needs to match; code pulled from wintercoats. +/obj/item/clothing/suit/hooded/chaplainsuit/monkhabit/set_greyscale(list/colors, new_config, new_worn_config, new_inhand_left, new_inhand_right) + . = ..() + if(!hood) + return + var/list/coat_colors = SSgreyscale.ParseColorString(greyscale_colors) + var/list/new_coat_colors = coat_colors.Copy(1,3) + hood.set_greyscale(new_coat_colors) //Adopt the suit's grayscale coloring for visual clarity. + hood.update_slot_icon() + +//But also keep old method in case the hood is (re-)created later +/obj/item/clothing/suit/hooded/chaplainsuit/monkhabit/on_hood_created(obj/item/clothing/head/hooded/hood) + . = ..() + var/list/coat_colors = (SSgreyscale.ParseColorString(greyscale_colors)) + var/list/new_coat_colors = coat_colors.Copy(1,3) + hood.set_greyscale(new_coat_colors) //Adopt the suit's grayscale coloring for visual clarity. diff --git a/modular_nova/master_files/code/modules/clothing/under/costume.dm b/modular_nova/master_files/code/modules/clothing/under/costume.dm index 7db737f5fd6..62b30a875b9 100644 --- a/modular_nova/master_files/code/modules/clothing/under/costume.dm +++ b/modular_nova/master_files/code/modules/clothing/under/costume.dm @@ -63,25 +63,37 @@ flags_1 = IS_PLAYER_COLORABLE_1 gets_cropped_on_taurs = FALSE +/obj/item/clothing/under/costume/nova/qipao/customtrim + greyscale_colors = "#2b2b2b#ffce5b" + greyscale_config = /datum/greyscale_config/qipao_customtrim + greyscale_config_worn = /datum/greyscale_config/qipao_customtrim/worn + greyscale_config_worn_digi = /datum/greyscale_config/qipao_customtrim/worn/digi + /obj/item/clothing/under/costume/nova/cheongsam name = "cheongsam" desc = "A cheongsam, traditionally worn in ancient Earth China by men during social events and lunar new years." icon_state = "cheongsam" body_parts_covered = CHEST|GROIN|LEGS female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY - greyscale_colors = "#2b2b2b" + greyscale_colors = "#2b2b2b#353535" greyscale_config = /datum/greyscale_config/cheongsam greyscale_config_worn = /datum/greyscale_config/cheongsam/worn greyscale_config_worn_digi = /datum/greyscale_config/cheongsam/worn/digi flags_1 = IS_PLAYER_COLORABLE_1 gets_cropped_on_taurs = FALSE +/obj/item/clothing/under/costume/nova/cheongsam/customtrim + greyscale_colors = "#2b2b2b#ffce5b#353535" + greyscale_config = /datum/greyscale_config/cheongsam_customtrim + greyscale_config_worn = /datum/greyscale_config/cheongsam_customtrim/worn + greyscale_config_worn_digi = /datum/greyscale_config/cheongsam_customtrim/worn/digi + /obj/item/clothing/under/costume/nova/yukata name = "yukata" desc = "A traditional ancient Earth Japanese yukata, typically worn in casual settings." icon_state = "yukata" female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY - greyscale_colors = "#2b2b2b" + greyscale_colors = "#2b2b2b#666666" greyscale_config = /datum/greyscale_config/yukata greyscale_config_worn = /datum/greyscale_config/yukata/worn greyscale_config_worn_digi = /datum/greyscale_config/yukata/worn/digi @@ -136,3 +148,18 @@ name = "sexy green christmas costume" desc = "Stupid. Ugly. Out of date. If I can't find something nice to wear I'm not going." greyscale_colors = "#1a991a#c4c2c2" + +/* +* TREK CLOTHES +*/ +/obj/item/clothing/under/trek/command + greyscale_config_worn_digi = /datum/greyscale_config/trek/worn/digi + flags_1 = IS_PLAYER_COLORABLE_1 + +/obj/item/clothing/under/trek/engsec + greyscale_config_worn_digi = /datum/greyscale_config/trek/worn/digi + flags_1 = IS_PLAYER_COLORABLE_1 + +/obj/item/clothing/under/trek/medsci + greyscale_config_worn_digi = /datum/greyscale_config/trek/worn/digi + flags_1 = IS_PLAYER_COLORABLE_1 diff --git a/modular_nova/master_files/code/modules/clothing/under/jobs/civilian/suits.dm b/modular_nova/master_files/code/modules/clothing/under/jobs/civilian/suits.dm index f812c9725c3..34022e47afd 100644 --- a/modular_nova/master_files/code/modules/clothing/under/jobs/civilian/suits.dm +++ b/modular_nova/master_files/code/modules/clothing/under/jobs/civilian/suits.dm @@ -34,51 +34,102 @@ greyscale_config_worn = /datum/greyscale_config/recolorable_suitskirt/worn greyscale_config_worn_digi = /datum/greyscale_config/recolorable_suitskirt/worn/digi -/* -* SUITS -*/ +/obj/item/clothing/under/suit/nova/recolorable/casual + name = "office casual suit" + desc = "A semi-formal suit, clean-cut with a matching vest and slacks." + icon_state = "fancysuit_casual" + greyscale_config = /datum/greyscale_config/fancysuit_casual + greyscale_config_worn = /datum/greyscale_config/fancysuit_casual/worn + greyscale_config_worn_digi = /datum/greyscale_config/fancysuit_casual/worn/digi + greyscale_colors = "#37373e#ffffff" + +/obj/item/clothing/under/suit/nova/recolorable/executive + name = "executive casual suit" + desc = "A formal suit, clean-cut with a matching vest, undershirt, tie and slacks." + icon_state = "fancysuit_executive" + greyscale_config = /datum/greyscale_config/fancysuit_executive + greyscale_config_worn = /datum/greyscale_config/fancysuit_executive/worn + greyscale_config_worn_digi = /datum/greyscale_config/fancysuit_executive/worn/digi + greyscale_colors = "#37373e#37373e#ffffff#ac3232" + /obj/item/clothing/under/suit/nova/pencil - name = "black pencilskirt" - desc = "A clean white shirt with a tight-fitting black pencilskirt." - icon_state = "black_pencil" + name = "pencilskirt and shirt" + desc = "A clean shirt with a tight-fitting pencilskirt." + icon_state = "pencilskirt_shirt" female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY gets_cropped_on_taurs = FALSE + greyscale_colors = "#37373e#ffffff" + greyscale_config = /datum/greyscale_config/pencilskirt_withshirt + greyscale_config_worn = /datum/greyscale_config/pencilskirt_withshirt/worn + greyscale_config_worn_digi = /datum/greyscale_config/pencilskirt_withshirt/worn/digi + flags_1 = IS_PLAYER_COLORABLE_1 -/obj/item/clothing/under/suit/nova/pencil/black_really - name = "executive pencilskirt" - desc = "A sleek suit with a tight-fitting black pencilskirt." - icon_state = "really_black_pencil" +/obj/item/clothing/under/suit/nova/pencil/noshirt + name = "pencilskirt" + desc = "A tight-fitting pencilskirt, perfect to augment an undershirt." + icon_state = "pencilskirt" + greyscale_colors = "#37373e" + greyscale_config = /datum/greyscale_config/pencilskirt + greyscale_config_worn = /datum/greyscale_config/pencilskirt/worn + greyscale_config_worn_digi = /datum/greyscale_config/pencilskirt/worn/digi + body_parts_covered = GROIN|LEGS /obj/item/clothing/under/suit/nova/pencil/charcoal name = "charcoal pencilskirt" desc = "A clean white shirt with a tight-fitting charcoal pencilskirt." - icon_state = "charcoal_pencil" + greyscale_colors = "#303030#ffffff" /obj/item/clothing/under/suit/nova/pencil/navy name = "navy pencilskirt" desc = "A clean white shirt with a tight-fitting navy-blue pencilskirt." - icon_state = "navy_pencil" + greyscale_colors = "#112334#ffffff" /obj/item/clothing/under/suit/nova/pencil/burgandy name = "burgandy pencilskirt" desc = "A clean white shirt with a tight-fitting burgandy-red pencilskirt." - icon_state = "burgandy_pencil" - -/obj/item/clothing/under/suit/nova/pencil/checkered - name = "checkered pencilskirt" - desc = "A clean white shirt with a tight-fitting grey checkered pencilskirt." - icon_state = "checkered_pencil" + greyscale_colors = "#3e1111#ffffff" /obj/item/clothing/under/suit/nova/pencil/tan name = "tan pencilskirt" desc = "A clean white shirt with a tight-fitting tan pencilskirt." - icon_state = "tan_pencil" + greyscale_colors = "#8b7458#ffffff" /obj/item/clothing/under/suit/nova/pencil/green name = "green pencilskirt" desc = "A clean white shirt with a tight-fitting green pencilskirt." - icon_state = "green_pencil" + greyscale_colors = "#113e20#ffffff" +/obj/item/clothing/under/suit/nova/pencil/black_really + name = "executive pencilskirt" + desc = "A sleek suit with a tight-fitting pencilskirt." + icon_state = "pencilskirt_suit" + greyscale_colors = "#37373e#37373e#ffffff#ac3232" + greyscale_config = /datum/greyscale_config/pencilskirt_withsuit + greyscale_config_worn = /datum/greyscale_config/pencilskirt_withsuit/worn + greyscale_config_worn_digi = /datum/greyscale_config/pencilskirt_withsuit/worn/digi + +/obj/item/clothing/under/suit/nova/pencil/checkered + name = "checkered pencilskirt and shirt" + desc = "A clean shirt with a tight-fitting checkered pencilskirt." + icon_state = "pencilskirt_checkers_shirt" + greyscale_colors = "#37373e#232323#ffffff" + greyscale_config = /datum/greyscale_config/pencilskirt_checkers_withshirt + greyscale_config_worn = /datum/greyscale_config/pencilskirt_checkers_withshirt/worn + greyscale_config_worn_digi = /datum/greyscale_config/pencilskirt_checkers_withshirt/worn/digi + +/obj/item/clothing/under/suit/nova/pencil/checkered/noshirt + name = "checkered pencilskirt" + desc = "A tight-fitting checkered pencilskirt." + icon_state = "pencilskirt_checkers" + greyscale_colors = "#37373e#232323" + greyscale_config = /datum/greyscale_config/pencilskirt_checkers + greyscale_config_worn = /datum/greyscale_config/pencilskirt_checkers/worn + greyscale_config_worn_digi = /datum/greyscale_config/pencilskirt_checkers/worn/digi + body_parts_covered = GROIN|LEGS + +/* +* STATIC SUITS (NO GAGS) +*/ /obj/item/clothing/under/suit/nova/scarface name = "cuban suit" desc = "A yayo coloured silk suit with a crimson shirt. You just know how to hide, how to lie. Me, I don't have that problem. Me, I always tell the truth. Even when I lie." diff --git a/modular_nova/master_files/code/modules/language/language_holder.dm b/modular_nova/master_files/code/modules/language/language_holder.dm index 98cfd7e00af..e4046b55087 100644 --- a/modular_nova/master_files/code/modules/language/language_holder.dm +++ b/modular_nova/master_files/code/modules/language/language_holder.dm @@ -62,3 +62,68 @@ GLOBAL_DATUM_INIT(language_holder_adjustor, /datum/language_holder_adjustor, new /datum/language/machine = list(LANGUAGE_ATOM)) spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM), /datum/language/machine = list(LANGUAGE_ATOM)) + +/// Modularized the Cyborg and AI language_holder, add here the languages that you want them to be able to speak and understand. +/datum/language_holder/synthetic + understood_languages = list( + /datum/language/common = list(LANGUAGE_ATOM), + /datum/language/uncommon = list(LANGUAGE_ATOM), + /datum/language/machine = list(LANGUAGE_ATOM), + /datum/language/draconic = list(LANGUAGE_ATOM), + /datum/language/moffic = list(LANGUAGE_ATOM), + /datum/language/calcic = list(LANGUAGE_ATOM), + /datum/language/voltaic = list(LANGUAGE_ATOM), + /datum/language/nekomimetic = list(LANGUAGE_ATOM), + /datum/language/gutter = list(LANGUAGE_ATOM), + /datum/language/panslavic = list(LANGUAGE_ATOM), + /datum/language/skrell = list(LANGUAGE_ATOM), + /datum/language/spacer = list(LANGUAGE_ATOM), + /datum/language/xerxian = list(LANGUAGE_ATOM), + /datum/language/vox = list(LANGUAGE_ATOM), + /datum/language/yangyu = list(LANGUAGE_ATOM), + /datum/language/schechi = list(LANGUAGE_ATOM), + /datum/language/monkey = list(LANGUAGE_ATOM), + /datum/language/slime = list(LANGUAGE_ATOM), + /datum/language/beachbum = list(LANGUAGE_ATOM), + /datum/language/mushroom = list(LANGUAGE_ATOM), + /datum/language/shadowtongue = list(LANGUAGE_ATOM), + /datum/language/buzzwords = list(LANGUAGE_ATOM), + /datum/language/terrum = list(LANGUAGE_ATOM), + /datum/language/sylvan = list(LANGUAGE_ATOM), + /datum/language/siiktajr = list(LANGUAGE_ATOM), + /datum/language/canilunzt = list(LANGUAGE_ATOM), + /datum/language/akulan = list(LANGUAGE_ATOM), + ) + spoken_languages = list( + /datum/language/common = list(LANGUAGE_ATOM), + /datum/language/uncommon = list(LANGUAGE_ATOM), + /datum/language/machine = list(LANGUAGE_ATOM), + /datum/language/draconic = list(LANGUAGE_ATOM), + /datum/language/moffic = list(LANGUAGE_ATOM), + /datum/language/calcic = list(LANGUAGE_ATOM), + /datum/language/voltaic = list(LANGUAGE_ATOM), + /datum/language/nekomimetic = list(LANGUAGE_ATOM), + /datum/language/gutter = list(LANGUAGE_ATOM), + /datum/language/panslavic = list(LANGUAGE_ATOM), + /datum/language/skrell = list(LANGUAGE_ATOM), + /datum/language/spacer = list(LANGUAGE_ATOM), + /datum/language/xerxian = list(LANGUAGE_ATOM), + /datum/language/vox = list(LANGUAGE_ATOM), + /datum/language/yangyu = list(LANGUAGE_ATOM), + /datum/language/schechi = list(LANGUAGE_ATOM), + /datum/language/monkey = list(LANGUAGE_ATOM), + /datum/language/slime = list(LANGUAGE_ATOM), + /datum/language/beachbum = list(LANGUAGE_ATOM), + /datum/language/mushroom = list(LANGUAGE_ATOM), + /datum/language/shadowtongue = list(LANGUAGE_ATOM), + /datum/language/buzzwords = list(LANGUAGE_ATOM), + /datum/language/terrum = list(LANGUAGE_ATOM), + /datum/language/sylvan = list(LANGUAGE_ATOM), + /datum/language/siiktajr = list(LANGUAGE_ATOM), + /datum/language/canilunzt = list(LANGUAGE_ATOM), + /datum/language/akulan = list(LANGUAGE_ATOM), + ) + +/datum/language_holder/drone_nova + understood_languages = list(/datum/language/drone = list(LANGUAGE_ATOM), /datum/language/common = list(LANGUAGE_ATOM)) + spoken_languages = list(/datum/language/drone = list(LANGUAGE_ATOM)) diff --git a/modular_nova/master_files/code/modules/mob/living/carbon/carbon_defense.dm b/modular_nova/master_files/code/modules/mob/living/carbon/carbon_defense.dm index 85ae11babda..89120849497 100644 --- a/modular_nova/master_files/code/modules/mob/living/carbon/carbon_defense.dm +++ b/modular_nova/master_files/code/modules/mob/living/carbon/carbon_defense.dm @@ -11,7 +11,7 @@ visible_message("[src] slaps [target] in the face!", "You slap [target] in the face! ",\ "You hear a slap.") - target.dna?.species?.stop_wagging_tail(target) + target.unwag_tail() return if(zone_selected == BODY_ZONE_PRECISE_GROIN && target.dir == src.dir) if(HAS_TRAIT(target, TRAIT_PERSONALSPACE) && (target.stat != UNCONSCIOUS) && (!target.handcuffed)) //You need to be conscious and uncuffed to use Personal Space diff --git a/modular_nova/master_files/code/modules/mob/living/simple_animal/friendly/dogs.dm b/modular_nova/master_files/code/modules/mob/living/simple_animal/friendly/dogs.dm index d038df1c606..8b8dd90641b 100644 --- a/modular_nova/master_files/code/modules/mob/living/simple_animal/friendly/dogs.dm +++ b/modular_nova/master_files/code/modules/mob/living/simple_animal/friendly/dogs.dm @@ -87,7 +87,7 @@ can_breed = FALSE // These lights enable when E-N is emagged - light_system = MOVABLE_LIGHT_DIRECTIONAL + light_system = OVERLAY_LIGHT_DIRECTIONAL light_color = COLOR_RED light_range = 2 light_power = 0.8 diff --git a/modular_nova/master_files/code/modules/mob/living/simple_animal/friendly/poppy.dm b/modular_nova/master_files/code/modules/mob/living/simple_animal/friendly/poppy.dm index b210d39c1e8..ae65a4d382a 100644 --- a/modular_nova/master_files/code/modules/mob/living/simple_animal/friendly/poppy.dm +++ b/modular_nova/master_files/code/modules/mob/living/simple_animal/friendly/poppy.dm @@ -34,7 +34,7 @@ mob_size = MOB_SIZE_TINY mob_biotypes = MOB_ORGANIC|MOB_BEAST gold_core_spawnable = NO_SPAWN - light_system = MOVABLE_LIGHT_DIRECTIONAL + light_system = OVERLAY_LIGHT_DIRECTIONAL light_color = LIGHT_COLOR_BRIGHT_YELLOW light_range = 2 light_power = 0.8 diff --git a/modular_nova/master_files/code/modules/mob_spawn/mob_spawn.dm b/modular_nova/master_files/code/modules/mob_spawn/mob_spawn.dm index 5a5b804536e..14350ff99ad 100644 --- a/modular_nova/master_files/code/modules/mob_spawn/mob_spawn.dm +++ b/modular_nova/master_files/code/modules/mob_spawn/mob_spawn.dm @@ -1,4 +1,4 @@ -/obj/effect/mob_spawn/ghost_role/ +/obj/effect/mob_spawn/ghost_role /// set this to make the spawner use the outfit.name instead of its name var for things like cryo announcements and ghost records /// modifying the actual name during the game will cause issues with the GLOB.mob_spawners associative list var/use_outfit_name @@ -59,3 +59,12 @@ // TODO: refactor create() and special() so that this is no longer necessary /obj/effect/mob_spawn/ghost_role/proc/post_transfer_prefs(mob/living/new_spawn) return + + +/obj/effect/mob_spawn/ghost_role/human/special(mob/living/spawned_mob, mob/mob_possessor) + . = ..() + var/mob/living/carbon/human/spawned_human = spawned_mob + var/datum/job/spawned_job = SSjob.GetJobType(spawner_job_path) + + spawned_human.job = spawned_job.title + diff --git a/modular_nova/master_files/code/modules/paperwork/paperplane.dm b/modular_nova/master_files/code/modules/paperwork/paperplane.dm new file mode 100644 index 00000000000..d21571ed171 --- /dev/null +++ b/modular_nova/master_files/code/modules/paperwork/paperplane.dm @@ -0,0 +1,5 @@ +// Better paper planes +/obj/item/paperplane/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) + . = ..() + if(delete_on_impact) + qdel(src) diff --git a/modular_nova/master_files/code/modules/surgery/organs/internal/appendix/_appendix.dm b/modular_nova/master_files/code/modules/surgery/organs/internal/appendix/_appendix.dm index b3ab005d6bc..0e82f86e4d0 100644 --- a/modular_nova/master_files/code/modules/surgery/organs/internal/appendix/_appendix.dm +++ b/modular_nova/master_files/code/modules/surgery/organs/internal/appendix/_appendix.dm @@ -1,5 +1,5 @@ /obj/item/organ/internal/appendix/become_inflamed() - if(engaged_role_play_check(owner, station = TRUE, dorms = TRUE)) + if(!engaged_role_play_check(owner, station = TRUE, dorms = TRUE)) return if(!(owner.mind && owner.mind.assigned_role && owner.mind.assigned_role.job_flags & JOB_CREW_MEMBER)) diff --git a/modular_nova/master_files/icons/mob/augmentation/mariinskyipc.dmi b/modular_nova/master_files/icons/mob/augmentation/mariinskyipc.dmi new file mode 100644 index 00000000000..bcf3c082295 Binary files /dev/null and b/modular_nova/master_files/icons/mob/augmentation/mariinskyipc.dmi differ diff --git a/modular_nova/master_files/icons/mob/clothing/head/chaplain.dmi b/modular_nova/master_files/icons/mob/clothing/head/chaplain.dmi index 22eb1607e9f..3d362e54405 100644 Binary files a/modular_nova/master_files/icons/mob/clothing/head/chaplain.dmi and b/modular_nova/master_files/icons/mob/clothing/head/chaplain.dmi differ diff --git a/modular_nova/master_files/icons/mob/clothing/suits/chaplain.dmi b/modular_nova/master_files/icons/mob/clothing/suits/chaplain.dmi index 9ceb807d67f..85e1cf7ad99 100644 Binary files a/modular_nova/master_files/icons/mob/clothing/suits/chaplain.dmi and b/modular_nova/master_files/icons/mob/clothing/suits/chaplain.dmi differ diff --git a/modular_nova/master_files/icons/mob/clothing/under/costume.dmi b/modular_nova/master_files/icons/mob/clothing/under/costume.dmi index 8439d78c6e1..317b614a496 100644 Binary files a/modular_nova/master_files/icons/mob/clothing/under/costume.dmi and b/modular_nova/master_files/icons/mob/clothing/under/costume.dmi differ diff --git a/modular_nova/master_files/icons/mob/clothing/under/costume_digi.dmi b/modular_nova/master_files/icons/mob/clothing/under/costume_digi.dmi index bd1262a82c8..197deb36d8e 100644 Binary files a/modular_nova/master_files/icons/mob/clothing/under/costume_digi.dmi and b/modular_nova/master_files/icons/mob/clothing/under/costume_digi.dmi differ diff --git a/modular_nova/master_files/icons/mob/clothing/under/suits.dmi b/modular_nova/master_files/icons/mob/clothing/under/suits.dmi index ff531414f60..f494e41c425 100644 Binary files a/modular_nova/master_files/icons/mob/clothing/under/suits.dmi and b/modular_nova/master_files/icons/mob/clothing/under/suits.dmi differ diff --git a/modular_nova/master_files/icons/mob/clothing/under/suits_digi.dmi b/modular_nova/master_files/icons/mob/clothing/under/suits_digi.dmi index 3202b5117c9..d055650a521 100644 Binary files a/modular_nova/master_files/icons/mob/clothing/under/suits_digi.dmi and b/modular_nova/master_files/icons/mob/clothing/under/suits_digi.dmi differ diff --git a/modular_nova/master_files/icons/mob/sprite_accessory/hair.dmi b/modular_nova/master_files/icons/mob/sprite_accessory/hair.dmi index 84296272b10..edfb9558dfd 100644 Binary files a/modular_nova/master_files/icons/mob/sprite_accessory/hair.dmi and b/modular_nova/master_files/icons/mob/sprite_accessory/hair.dmi differ diff --git a/modular_nova/master_files/icons/obj/clothing/head/chaplain.dmi b/modular_nova/master_files/icons/obj/clothing/head/chaplain.dmi index 00e0a70bb52..b00ec8bd21d 100644 Binary files a/modular_nova/master_files/icons/obj/clothing/head/chaplain.dmi and b/modular_nova/master_files/icons/obj/clothing/head/chaplain.dmi differ diff --git a/modular_nova/master_files/icons/obj/clothing/suits/chaplain.dmi b/modular_nova/master_files/icons/obj/clothing/suits/chaplain.dmi index 18a5b67fe4e..4475c890fed 100644 Binary files a/modular_nova/master_files/icons/obj/clothing/suits/chaplain.dmi and b/modular_nova/master_files/icons/obj/clothing/suits/chaplain.dmi differ diff --git a/modular_nova/master_files/icons/obj/clothing/under/costume.dmi b/modular_nova/master_files/icons/obj/clothing/under/costume.dmi index 9edd0ae2ade..c71466eda7b 100644 Binary files a/modular_nova/master_files/icons/obj/clothing/under/costume.dmi and b/modular_nova/master_files/icons/obj/clothing/under/costume.dmi differ diff --git a/modular_nova/master_files/icons/obj/clothing/under/suits.dmi b/modular_nova/master_files/icons/obj/clothing/under/suits.dmi index 1edf6a381ad..6a0dcfc8626 100644 Binary files a/modular_nova/master_files/icons/obj/clothing/under/suits.dmi and b/modular_nova/master_files/icons/obj/clothing/under/suits.dmi differ diff --git a/modular_nova/master_files/icons/obj/devices/tools.dmi b/modular_nova/master_files/icons/obj/devices/tools.dmi index 2b93ad772ba..d30441bd74f 100644 Binary files a/modular_nova/master_files/icons/obj/devices/tools.dmi and b/modular_nova/master_files/icons/obj/devices/tools.dmi differ diff --git a/modular_nova/modules/GAGS/greyscale_configs.dm b/modular_nova/modules/GAGS/greyscale_configs.dm index de9b8192814..a2e421afcf8 100644 --- a/modular_nova/modules/GAGS/greyscale_configs.dm +++ b/modular_nova/modules/GAGS/greyscale_configs.dm @@ -626,6 +626,98 @@ name = "Formal Suitskirt (Worn, Digi)" icon_file = 'modular_nova/master_files/icons/mob/clothing/under/suits_digi.dmi' +/datum/greyscale_config/fancysuit_casual + name = "Casual Fancysuit" + icon_file = 'modular_nova/master_files/icons/obj/clothing/under/suits.dmi' + json_config = 'modular_nova/modules/GAGS/json_configs/suits/fancysuit/fancysuit_bicol.json' + +/datum/greyscale_config/fancysuit_casual/worn + name = "Casual Fancysuit (Worn)" + icon_file = 'modular_nova/master_files/icons/mob/clothing/under/suits.dmi' + +/datum/greyscale_config/fancysuit_casual/worn/digi + name = "Casual Fancysuit (Worn, Digi)" + icon_file = 'modular_nova/master_files/icons/mob/clothing/under/suits_digi.dmi' + +/datum/greyscale_config/fancysuit_executive + name = "Executive Fancysuit" + icon_file = 'modular_nova/master_files/icons/obj/clothing/under/suits.dmi' + json_config = 'modular_nova/modules/GAGS/json_configs/suits/fancysuit/fancysuit_quadcol.json' + +/datum/greyscale_config/fancysuit_executive/worn + name = "Executive Fancysuit (Worn)" + icon_file = 'modular_nova/master_files/icons/mob/clothing/under/suits.dmi' + +/datum/greyscale_config/fancysuit_executive/worn/digi + name = "Executive Fancysuit (Worn, Digi)" + icon_file = 'modular_nova/master_files/icons/mob/clothing/under/suits_digi.dmi' + +// PENCILSKIRTS +/datum/greyscale_config/pencilskirt + name = "Pencilskirt" + icon_file = 'modular_nova/master_files/icons/obj/clothing/under/suits.dmi' + json_config = 'modular_nova/modules/GAGS/json_configs/suits/pencilskirt/pencilskirt.json' + +/datum/greyscale_config/pencilskirt/worn + name = "Pencilskirt (Worn)" + icon_file = 'modular_nova/master_files/icons/mob/clothing/under/suits.dmi' + +/datum/greyscale_config/pencilskirt/worn/digi + name = "Pencilskirt (Worn, Digi)" + icon_file = 'modular_nova/master_files/icons/mob/clothing/under/suits_digi.dmi' + +/datum/greyscale_config/pencilskirt_withshirt + name = "Pencilskirt + Shirt" + icon_file = 'modular_nova/master_files/icons/obj/clothing/under/suits.dmi' + json_config = 'modular_nova/modules/GAGS/json_configs/suits/pencilskirt/pencilskirt_bicol.json' + +/datum/greyscale_config/pencilskirt_withshirt/worn + name = "Pencilskirt + Shirt (Worn)" + icon_file = 'modular_nova/master_files/icons/mob/clothing/under/suits.dmi' + +/datum/greyscale_config/pencilskirt_withshirt/worn/digi + name = "Pencilskirt + Shirt (Worn, Digi)" + icon_file = 'modular_nova/master_files/icons/mob/clothing/under/suits_digi.dmi' + +/datum/greyscale_config/pencilskirt_checkers + name = "Checkered Pencilskirt" + icon_file = 'modular_nova/master_files/icons/obj/clothing/under/suits.dmi' + json_config = 'modular_nova/modules/GAGS/json_configs/suits/pencilskirt/pencilskirt_bicol.json' + +/datum/greyscale_config/pencilskirt_checkers/worn + name = "Checkered Pencilskirt (Worn)" + icon_file = 'modular_nova/master_files/icons/mob/clothing/under/suits.dmi' + +/datum/greyscale_config/pencilskirt_checkers/worn/digi + name = "Checkered Pencilskirt (Worn, Digi)" + icon_file = 'modular_nova/master_files/icons/mob/clothing/under/suits_digi.dmi' + +/datum/greyscale_config/pencilskirt_checkers_withshirt + name = "Checkered Pencilskirt + Shirt" + icon_file = 'modular_nova/master_files/icons/obj/clothing/under/suits.dmi' + json_config = 'modular_nova/modules/GAGS/json_configs/suits/pencilskirt/pencilskirt_tricol.json' + +/datum/greyscale_config/pencilskirt_checkers_withshirt/worn + name = "Checkered Pencilskirt + Shirt (Worn)" + icon_file = 'modular_nova/master_files/icons/mob/clothing/under/suits.dmi' + +/datum/greyscale_config/pencilskirt_checkers_withshirt/worn/digi + name = "Checkered Pencilskirt + Shirt (Worn, Digi)" + icon_file = 'modular_nova/master_files/icons/mob/clothing/under/suits_digi.dmi' + +/datum/greyscale_config/pencilskirt_withsuit + name = "Pencilskirt + Suit" + icon_file = 'modular_nova/master_files/icons/obj/clothing/under/suits.dmi' + json_config = 'modular_nova/modules/GAGS/json_configs/suits/pencilskirt/pencilskirt_quadcol.json' + +/datum/greyscale_config/pencilskirt_withsuit/worn + name = "Pencilskirt + Suit (Worn)" + icon_file = 'modular_nova/master_files/icons/mob/clothing/under/suits.dmi' + +/datum/greyscale_config/pencilskirt_withsuit/worn/digi + name = "Pencilskirt + Suit (Worn, Digi)" + icon_file = 'modular_nova/master_files/icons/mob/clothing/under/suits_digi.dmi' + // HOODIES /datum/greyscale_config/hoodie name = "Hoodie" @@ -980,10 +1072,14 @@ name = "Camo Pants" icon_file = 'modular_nova/master_files/icons/obj/clothing/under/shorts_pants_shirts.dmi' json_config = 'modular_nova/modules/GAGS/json_configs/pants_shorts_skirts_dresses/camo_pants.json' + /datum/greyscale_config/camo_pants/worn name = "Camo Pants (Worn)" icon_file = 'modular_nova/master_files/icons/mob/clothing/under/shorts_pants_shirts.dmi' + /datum/greyscale_config/camo_pants/worn/digi + name = "Camo Pants (Worn, Digi)" + icon_file = SHORTS_PANTS_SHIRTS_DIGIFILE // DRESSES / SKIRTS @@ -1105,7 +1201,7 @@ /datum/greyscale_config/cheongsam name = "Cheongsam" icon_file = 'modular_nova/master_files/icons/obj/clothing/under/costume.dmi' - json_config = 'modular_nova/modules/GAGS/json_configs/costumes/lunar_japanese.json' + json_config = 'modular_nova/modules/GAGS/json_configs/costumes/lunar_japanese_bicol.json' /datum/greyscale_config/cheongsam/worn name = "Cheongsam (Worn)" @@ -1115,10 +1211,36 @@ name = "Cheongsam (Worn, Digi)" icon_file = 'modular_nova/master_files/icons/mob/clothing/under/costume_digi.dmi' +/datum/greyscale_config/qipao_customtrim + name = "Qipao" + icon_file = 'modular_nova/master_files/icons/obj/clothing/under/costume.dmi' + json_config = 'modular_nova/modules/GAGS/json_configs/costumes/lunar_japanese_bicol.json' + +/datum/greyscale_config/qipao_customtrim/worn + name = "Qipao (Worn)" + icon_file = 'modular_nova/master_files/icons/mob/clothing/under/costume.dmi' + +/datum/greyscale_config/qipao_customtrim/worn/digi + name = "Qipao (Worn, Digi)" + icon_file = 'modular_nova/master_files/icons/mob/clothing/under/costume_digi.dmi' + +/datum/greyscale_config/cheongsam_customtrim + name = "Cheongsam" + icon_file = 'modular_nova/master_files/icons/obj/clothing/under/costume.dmi' + json_config = 'modular_nova/modules/GAGS/json_configs/costumes/lunar_japanese_tricol.json' + +/datum/greyscale_config/cheongsam_customtrim/worn + name = "Cheongsam (Worn)" + icon_file = 'modular_nova/master_files/icons/mob/clothing/under/costume.dmi' + +/datum/greyscale_config/cheongsam_customtrim/worn/digi + name = "Cheongsam (Worn, Digi)" + icon_file = 'modular_nova/master_files/icons/mob/clothing/under/costume_digi.dmi' + /datum/greyscale_config/yukata name = "Yukata" icon_file = 'modular_nova/master_files/icons/obj/clothing/under/costume.dmi' - json_config = 'modular_nova/modules/GAGS/json_configs/costumes/lunar_japanese.json' + json_config = 'modular_nova/modules/GAGS/json_configs/costumes/lunar_japanese_bicol.json' /datum/greyscale_config/yukata/worn name = "Yukata (Worn)" @@ -1167,6 +1289,52 @@ name = "christmas_male (Worn, Digi)" icon_file = 'modular_nova/master_files/icons/mob/clothing/under/costume_digi.dmi' +//RELIGIOUS COSTUMES (MONK HABIT, ETC) +/datum/greyscale_config/monk_habit + name = "Monk Habit" + icon_file = 'modular_nova/master_files/icons/obj/clothing/suits/chaplain.dmi' + json_config = 'modular_nova/modules/GAGS/json_configs/costumes/monk_habit.json' + +/datum/greyscale_config/monk_habit/worn + name = "Monk Habit (Worn)" + icon_file = 'modular_nova/master_files/icons/mob/clothing/suits/chaplain.dmi' + +/datum/greyscale_config/monk_habit_hood + name = "Monk Habit Hood" + icon_file = 'modular_nova/master_files/icons/obj/clothing/head/chaplain.dmi' + json_config = 'modular_nova/modules/GAGS/json_configs/costumes/monk_habit_hood.json' + +/datum/greyscale_config/monk_habit_hood/worn + name = "Monk Habit Hood (Worn)" + icon_file = 'modular_nova/master_files/icons/mob/clothing/head/chaplain.dmi' + +/datum/greyscale_config/chappy_habit + name = "Habit" + icon_file = 'modular_nova/master_files/icons/obj/clothing/suits/chaplain.dmi' + json_config = 'modular_nova/modules/GAGS/json_configs/costumes/chappy_habit.json' + +/datum/greyscale_config/chappy_habit/worn + name = "Habit (Worn)" + icon_file = 'modular_nova/master_files/icons/mob/clothing/suits/chaplain.dmi' + +/datum/greyscale_config/nun_hood + name = "Nun Hood" + icon_file = 'modular_nova/master_files/icons/obj/clothing/head/chaplain.dmi' + json_config = 'modular_nova/modules/GAGS/json_configs/costumes/monk_habit_hood.json' + +/datum/greyscale_config/nun_hood/worn + name = "Nun Hood (Worn)" + icon_file = 'modular_nova/master_files/icons/mob/clothing/head/chaplain.dmi' + +/datum/greyscale_config/nun_veil + name = "Nun Veil" + icon_file = 'modular_nova/master_files/icons/obj/clothing/head/chaplain.dmi' + json_config = 'modular_nova/modules/GAGS/json_configs/costumes/monk_habit_hood.json' + +/datum/greyscale_config/nun_veil/worn + name = "Nun Veil (Worn)" + icon_file = 'modular_nova/master_files/icons/mob/clothing/head/chaplain.dmi' + //GRAYSCALE MAID COSTUME /datum/greyscale_config/maid_neck_cover @@ -1569,3 +1737,30 @@ digi /datum/greyscale_config/primitive_catgirl_gauntlets/worn name = "Gauntlets (Worn)" json_config = 'modular_nova/modules/GAGS/json_configs/primitive_catgirl_clothing/gauntlets_worn.json' + +/datum/greyscale_config/primitive_catgirl_tailored_dress + name = "Tailored Dress" + icon_file = 'modular_nova/modules/primitive_catgirls/icons/clothing_greyscale.dmi' + json_config = 'modular_nova/modules/GAGS/json_configs/primitive_catgirl_clothing/tailored_dress.json' + +/datum/greyscale_config/primitive_catgirl_tailored_dress/worn + name = "Tailored Dress (Worn)" + json_config = 'modular_nova/modules/GAGS/json_configs/primitive_catgirl_clothing/tailored_dress_worn.json' + +/datum/greyscale_config/primitive_catgirl_ferroniere + name = "Ferroniere" + icon_file = 'modular_nova/modules/primitive_catgirls/icons/clothing_greyscale.dmi' + json_config = 'modular_nova/modules/GAGS/json_configs/primitive_catgirl_clothing/ferroniere.json' + +/datum/greyscale_config/primitive_catgirl_ferroniere/worn + name = "Ferroniere (Worn)" + json_config = 'modular_nova/modules/GAGS/json_configs/primitive_catgirl_clothing/ferroniere_worn.json' + +/datum/greyscale_config/primitive_catgirl_tunic + name = "Handmade Tunic" + icon_file = 'modular_nova/modules/primitive_catgirls/icons/clothing_greyscale.dmi' + json_config = 'modular_nova/modules/GAGS/json_configs/primitive_catgirl_clothing/tunic.json' + +/datum/greyscale_config/primitive_catgirl_tunic/worn + name = "Handmade Tunic (Worn)" + json_config = 'modular_nova/modules/GAGS/json_configs/primitive_catgirl_clothing/tunic_worn.json' diff --git a/modular_nova/modules/GAGS/json_configs/costumes/chappy_habit.json b/modular_nova/modules/GAGS/json_configs/costumes/chappy_habit.json new file mode 100644 index 00000000000..22f31ab093f --- /dev/null +++ b/modular_nova/modules/GAGS/json_configs/costumes/chappy_habit.json @@ -0,0 +1,22 @@ +{ + "habit": [ + { + "type": "icon_state", + "icon_state": "habit_base", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "habit_frill", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "habit_belt", + "blend_mode": "overlay", + "color_ids": [ 3 ] + } + ] +} diff --git a/modular_nova/modules/GAGS/json_configs/costumes/lunar_japanese.json b/modular_nova/modules/GAGS/json_configs/costumes/lunar_japanese.json index 364474ecfcd..0137727ec04 100644 --- a/modular_nova/modules/GAGS/json_configs/costumes/lunar_japanese.json +++ b/modular_nova/modules/GAGS/json_configs/costumes/lunar_japanese.json @@ -11,33 +11,5 @@ "icon_state": "qipao_trim", "blend_mode": "overlay" } - ], - - "cheongsam": [ - { - "type": "icon_state", - "icon_state": "cheongsam_base", - "blend_mode": "overlay", - "color_ids": [ 1 ] - }, - { - "type": "icon_state", - "icon_state": "cheongsam_trim", - "blend_mode": "overlay" - }, - { - "type": "icon_state", - "icon_state": "cheongsam_pants", - "blend_mode": "overlay" - } - ], - - "yukata": [ - { - "type": "icon_state", - "icon_state": "yukata_base", - "blend_mode": "overlay", - "color_ids": [ 1 ] - } ] } diff --git a/modular_nova/modules/GAGS/json_configs/costumes/lunar_japanese_bicol.json b/modular_nova/modules/GAGS/json_configs/costumes/lunar_japanese_bicol.json new file mode 100644 index 00000000000..cf6c19cf770 --- /dev/null +++ b/modular_nova/modules/GAGS/json_configs/costumes/lunar_japanese_bicol.json @@ -0,0 +1,49 @@ +{ + "qipao": [ + { + "type": "icon_state", + "icon_state": "qipao_base", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "qipao_trim_recolorable", + "blend_mode": "overlay", + "color_ids": [ 2 ] + } + ], + "yukata": [ + { + "type": "icon_state", + "icon_state": "yukata_base", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "yukata_sash", + "blend_mode": "overlay", + "color_ids": [ 2 ] + } + ], + "cheongsam": [ + { + "type": "icon_state", + "icon_state": "cheongsam_base", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "cheongsam_trim", + "blend_mode": "overlay" + }, + { + "type": "icon_state", + "icon_state": "cheongsam_pants", + "blend_mode": "overlay", + "color_ids": [ 2 ] + } + ] +} diff --git a/modular_nova/modules/GAGS/json_configs/costumes/lunar_japanese_tricol.json b/modular_nova/modules/GAGS/json_configs/costumes/lunar_japanese_tricol.json new file mode 100644 index 00000000000..450a1a7c233 --- /dev/null +++ b/modular_nova/modules/GAGS/json_configs/costumes/lunar_japanese_tricol.json @@ -0,0 +1,22 @@ +{ + "cheongsam": [ + { + "type": "icon_state", + "icon_state": "cheongsam_base", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "cheongsam_trim_recolorable", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "cheongsam_pants", + "blend_mode": "overlay", + "color_ids": [ 3 ] + } + ] +} diff --git a/modular_nova/modules/GAGS/json_configs/costumes/monk_habit.json b/modular_nova/modules/GAGS/json_configs/costumes/monk_habit.json new file mode 100644 index 00000000000..15c6e4ea2a3 --- /dev/null +++ b/modular_nova/modules/GAGS/json_configs/costumes/monk_habit.json @@ -0,0 +1,30 @@ +{ + "monkfrock": [ + { + "type": "icon_state", + "icon_state": "monkfrock_base", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "monkfrock_belt", + "blend_mode": "overlay", + "color_ids": [ 2 ] + } + ], + "monkfrock_t": [ + { + "type": "icon_state", + "icon_state": "monkfrock_base", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "monkfrock_belt", + "blend_mode": "overlay", + "color_ids": [ 2 ] + } + ] +} diff --git a/modular_nova/modules/GAGS/json_configs/costumes/monk_habit_hood.json b/modular_nova/modules/GAGS/json_configs/costumes/monk_habit_hood.json new file mode 100644 index 00000000000..fe1cd238fb8 --- /dev/null +++ b/modular_nova/modules/GAGS/json_configs/costumes/monk_habit_hood.json @@ -0,0 +1,44 @@ +{ + "monkhood": [ + { + "type": "icon_state", + "icon_state": "monkhood_base", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "monkhood_belt", + "blend_mode": "overlay", + "color_ids": [ 2 ] + } + ], + "nun_hood": [ + { + "type": "icon_state", + "icon_state": "nun_hood_base", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "nun_hood_frills", + "blend_mode": "overlay", + "color_ids": [ 2 ] + } + ], + "nun_hood_alt": [ + { + "type": "icon_state", + "icon_state": "nun_hood_alt_base", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "nun_hood_alt_frills", + "blend_mode": "overlay", + "color_ids": [ 2 ] + } + ] +} diff --git a/modular_nova/modules/GAGS/json_configs/primitive_catgirl_clothing/ferroniere.json b/modular_nova/modules/GAGS/json_configs/primitive_catgirl_clothing/ferroniere.json new file mode 100644 index 00000000000..24235978b87 --- /dev/null +++ b/modular_nova/modules/GAGS/json_configs/primitive_catgirl_clothing/ferroniere.json @@ -0,0 +1,16 @@ +{ + "ferroniere": [ + { + "type": "icon_state", + "icon_state": "ferroniere_base_obj", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "ferroniere_gem_obj", + "blend_mode": "overlay", + "color_ids": [ 2 ] + } + ] +} diff --git a/modular_nova/modules/GAGS/json_configs/primitive_catgirl_clothing/ferroniere_worn.json b/modular_nova/modules/GAGS/json_configs/primitive_catgirl_clothing/ferroniere_worn.json new file mode 100644 index 00000000000..3865a249892 --- /dev/null +++ b/modular_nova/modules/GAGS/json_configs/primitive_catgirl_clothing/ferroniere_worn.json @@ -0,0 +1,16 @@ +{ + "ferroniere": [ + { + "type": "icon_state", + "icon_state": "ferroniere_base", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "ferroniere_gem", + "blend_mode": "overlay", + "color_ids": [ 2 ] + } + ] +} diff --git a/modular_nova/modules/GAGS/json_configs/primitive_catgirl_clothing/tailored_dress.json b/modular_nova/modules/GAGS/json_configs/primitive_catgirl_clothing/tailored_dress.json new file mode 100644 index 00000000000..98a097909d1 --- /dev/null +++ b/modular_nova/modules/GAGS/json_configs/primitive_catgirl_clothing/tailored_dress.json @@ -0,0 +1,16 @@ +{ + "tailored_dress": [ + { + "type": "icon_state", + "icon_state": "tailored_dress_base_obj", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "tailored_dress_laces_obj", + "blend_mode": "overlay", + "color_ids": [ 2 ] + } + ] +} diff --git a/modular_nova/modules/GAGS/json_configs/primitive_catgirl_clothing/tailored_dress_worn.json b/modular_nova/modules/GAGS/json_configs/primitive_catgirl_clothing/tailored_dress_worn.json new file mode 100644 index 00000000000..2a970e9f1b5 --- /dev/null +++ b/modular_nova/modules/GAGS/json_configs/primitive_catgirl_clothing/tailored_dress_worn.json @@ -0,0 +1,16 @@ +{ + "tailored_dress": [ + { + "type": "icon_state", + "icon_state": "tailored_dress_base", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "tailored_dress_laces", + "blend_mode": "overlay", + "color_ids": [ 2 ] + } + ] +} diff --git a/modular_nova/modules/GAGS/json_configs/primitive_catgirl_clothing/tunic.json b/modular_nova/modules/GAGS/json_configs/primitive_catgirl_clothing/tunic.json new file mode 100644 index 00000000000..170c172c465 --- /dev/null +++ b/modular_nova/modules/GAGS/json_configs/primitive_catgirl_clothing/tunic.json @@ -0,0 +1,22 @@ +{ + "tunic": [ + { + "type": "icon_state", + "icon_state": "tunic_white_obj", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "tunic_dark_obj", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "tunic_belt_obj", + "blend_mode": "overlay", + "color_ids": [ 3 ] + } + ] +} diff --git a/modular_nova/modules/GAGS/json_configs/primitive_catgirl_clothing/tunic_worn.json b/modular_nova/modules/GAGS/json_configs/primitive_catgirl_clothing/tunic_worn.json new file mode 100644 index 00000000000..edfdda45356 --- /dev/null +++ b/modular_nova/modules/GAGS/json_configs/primitive_catgirl_clothing/tunic_worn.json @@ -0,0 +1,22 @@ +{ + "tunic": [ + { + "type": "icon_state", + "icon_state": "tunic_white", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "tunic_dark", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "tunic_belt", + "blend_mode": "overlay", + "color_ids": [ 3 ] + } + ] +} diff --git a/modular_nova/modules/GAGS/json_configs/suits/fancysuit/fancysuit_bicol.json b/modular_nova/modules/GAGS/json_configs/suits/fancysuit/fancysuit_bicol.json new file mode 100644 index 00000000000..bdea62faa16 --- /dev/null +++ b/modular_nova/modules/GAGS/json_configs/suits/fancysuit/fancysuit_bicol.json @@ -0,0 +1,21 @@ +{ + "fancysuit_casual": [ + { + "type": "icon_state", + "icon_state": "part_slacks", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "pencilskirt_belt", + "blend_mode": "overlay" + }, + { + "type": "icon_state", + "icon_state": "pencilskirt_shirt", + "blend_mode": "overlay", + "color_ids": [ 2 ] + } + ] +} diff --git a/modular_nova/modules/GAGS/json_configs/suits/fancysuit/fancysuit_quadcol.json b/modular_nova/modules/GAGS/json_configs/suits/fancysuit/fancysuit_quadcol.json new file mode 100644 index 00000000000..2e9c71ff594 --- /dev/null +++ b/modular_nova/modules/GAGS/json_configs/suits/fancysuit/fancysuit_quadcol.json @@ -0,0 +1,33 @@ +{ + "fancysuit_executive": [ + { + "type": "icon_state", + "icon_state": "part_slacks", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "pencilskirt_belt", + "blend_mode": "overlay" + }, + { + "type": "icon_state", + "icon_state": "pencilskirt_suit_base", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "pencilskirt_suit_under", + "blend_mode": "overlay", + "color_ids": [ 3 ] + }, + { + "type": "icon_state", + "icon_state": "pencilskirt_suit_tie", + "blend_mode": "overlay", + "color_ids": [ 4 ] + } + ] +} diff --git a/modular_nova/modules/GAGS/json_configs/suits/pencilskirt/pencilskirt.json b/modular_nova/modules/GAGS/json_configs/suits/pencilskirt/pencilskirt.json new file mode 100644 index 00000000000..23f0bbcb9f6 --- /dev/null +++ b/modular_nova/modules/GAGS/json_configs/suits/pencilskirt/pencilskirt.json @@ -0,0 +1,15 @@ +{ + "pencilskirt": [ + { + "type": "icon_state", + "icon_state": "pencilskirt_belt", + "blend_mode": "overlay" + }, + { + "type": "icon_state", + "icon_state": "pencilskirt_base", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ] +} diff --git a/modular_nova/modules/GAGS/json_configs/suits/pencilskirt/pencilskirt_bicol.json b/modular_nova/modules/GAGS/json_configs/suits/pencilskirt/pencilskirt_bicol.json new file mode 100644 index 00000000000..99072525ab5 --- /dev/null +++ b/modular_nova/modules/GAGS/json_configs/suits/pencilskirt/pencilskirt_bicol.json @@ -0,0 +1,40 @@ +{ + "pencilskirt_checkers": [ + { + "type": "icon_state", + "icon_state": "pencilskirt_base", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "pencilskirt_belt", + "blend_mode": "overlay" + }, + { + "type": "icon_state", + "icon_state": "pencilskirt_checkers", + "blend_mode": "overlay", + "color_ids": [ 2 ] + } + ], + "pencilskirt_shirt": [ + { + "type": "icon_state", + "icon_state": "pencilskirt_base", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "pencilskirt_belt", + "blend_mode": "overlay" + }, + { + "type": "icon_state", + "icon_state": "pencilskirt_shirt", + "blend_mode": "overlay", + "color_ids": [ 2 ] + } + ] +} diff --git a/modular_nova/modules/GAGS/json_configs/suits/pencilskirt/pencilskirt_quadcol.json b/modular_nova/modules/GAGS/json_configs/suits/pencilskirt/pencilskirt_quadcol.json new file mode 100644 index 00000000000..8ebb891af02 --- /dev/null +++ b/modular_nova/modules/GAGS/json_configs/suits/pencilskirt/pencilskirt_quadcol.json @@ -0,0 +1,33 @@ +{ + "pencilskirt_suit": [ + { + "type": "icon_state", + "icon_state": "pencilskirt_base", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "pencilskirt_belt", + "blend_mode": "overlay" + }, + { + "type": "icon_state", + "icon_state": "pencilskirt_suit_base", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "pencilskirt_suit_under", + "blend_mode": "overlay", + "color_ids": [ 3 ] + }, + { + "type": "icon_state", + "icon_state": "pencilskirt_suit_tie", + "blend_mode": "overlay", + "color_ids": [ 4 ] + } + ] +} diff --git a/modular_nova/modules/GAGS/json_configs/suits/pencilskirt/pencilskirt_tricol.json b/modular_nova/modules/GAGS/json_configs/suits/pencilskirt/pencilskirt_tricol.json new file mode 100644 index 00000000000..b555d453589 --- /dev/null +++ b/modular_nova/modules/GAGS/json_configs/suits/pencilskirt/pencilskirt_tricol.json @@ -0,0 +1,27 @@ +{ + "pencilskirt_checkers_shirt": [ + { + "type": "icon_state", + "icon_state": "pencilskirt_base", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "pencilskirt_checkers", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "pencilskirt_belt", + "blend_mode": "overlay" + }, + { + "type": "icon_state", + "icon_state": "pencilskirt_shirt", + "blend_mode": "overlay", + "color_ids": [ 3 ] + } + ] +} diff --git a/modular_nova/modules/ashwalkers/code/items/ash_surgery.dm b/modular_nova/modules/ashwalkers/code/items/ash_surgery.dm index 5eb40601e86..ec263c5dedf 100644 --- a/modular_nova/modules/ashwalkers/code/items/ash_surgery.dm +++ b/modular_nova/modules/ashwalkers/code/items/ash_surgery.dm @@ -88,3 +88,18 @@ /datum/crafting_recipe/ash_recipe/ash_hemostat name = "Ash Hemostat" result = /obj/item/hemostat/ashwalker + +/obj/item/bonesetter/ashwalker + name = "primitive bonesetter" + icon = 'modular_nova/modules/ashwalkers/icons/ashwalker_tools.dmi' + icon_state = "bonesetter" + + greyscale_colors = null + greyscale_config = null + greyscale_config_inhand_left = null + greyscale_config_inhand_right = null + greyscale_config_worn = null + +/datum/crafting_recipe/ash_recipe/ash_bonesetter + name = "Ash Bonesetter" + result = /obj/item/bonesetter/ashwalker diff --git a/modular_nova/modules/ashwalkers/icons/ashwalker_tools.dmi b/modular_nova/modules/ashwalkers/icons/ashwalker_tools.dmi index aa1224aca1e..5066689e2e2 100644 Binary files a/modular_nova/modules/ashwalkers/icons/ashwalker_tools.dmi and b/modular_nova/modules/ashwalkers/icons/ashwalker_tools.dmi differ diff --git a/modular_nova/modules/bodyparts/icons/ipc_parts.dmi b/modular_nova/modules/bodyparts/icons/ipc_parts.dmi index d8925619a3c..41f9c2e5073 100644 Binary files a/modular_nova/modules/bodyparts/icons/ipc_parts.dmi and b/modular_nova/modules/bodyparts/icons/ipc_parts.dmi differ diff --git a/modular_nova/modules/borgs/code/update_icons.dm b/modular_nova/modules/borgs/code/update_icons.dm index 22f7779d999..704ac198a47 100644 --- a/modular_nova/modules/borgs/code/update_icons.dm +++ b/modular_nova/modules/borgs/code/update_icons.dm @@ -68,4 +68,4 @@ icon_state = "[model.cyborg_base_icon]-wreck" - update_fire() + update_appearance(UPDATE_OVERLAYS) diff --git a/modular_nova/modules/cargo/code/packs.dm b/modular_nova/modules/cargo/code/packs.dm index c92b058db2a..21709f9c8fe 100644 --- a/modular_nova/modules/cargo/code/packs.dm +++ b/modular_nova/modules/cargo/code/packs.dm @@ -711,34 +711,6 @@ for(var/i in 1 to 19) new /obj/item/grown/log(.) -/datum/supply_pack/imports/cin_surplus - name = "CIN Military Surplus Crate" - desc = "A collection of surplus equipment sourced from the Coalition of Independent Nations' military stockpiles. Likely to contain old and outdated equipment, as is the nature of surplus." - contraband = TRUE - cost = CARGO_CRATE_VALUE * 9 - contains = list( - /obj/item/storage/box/colonial_rations = 1, - /obj/item/storage/toolbox/ammobox/strilka310 = 1, - /obj/item/storage/toolbox/ammobox/strilka310/surplus = 1, - /obj/item/storage/toolbox/maint_kit = 1, - /obj/item/storage/toolbox/guncase/soviet/sakhno = 2, - /obj/item/ammo_box/strilka310 = 1, - /obj/item/clothing/suit/armor/vest/cin_surplus_vest = 1, - /obj/item/clothing/head/helmet/cin_surplus_helmet/random_color = 1, - /obj/item/storage/backpack/industrial/cin_surplus/random_color = 1, - /obj/item/storage/belt/military/cin_surplus/random_color = 1, - /obj/item/clothing/gloves/tackler/combat = 1, - /obj/item/clothing/under/syndicate/rus_army/cin_surplus/random_color = 1, - /obj/item/clothing/shoes/jackboots = 1, - /obj/item/clothing/mask/gas/hecu2 = 1, - /obj/item/clothing/mask/balaclavaadjust = 1, - ) - -/datum/supply_pack/imports/cin_surplus/fill(obj/structure/closet/crate/we_are_filling_this_crate) - for(var/i in 1 to 10) - var/item = pick_weight(contains) - new item(we_are_filling_this_crate) - /* * VENDING RESTOCKS */ diff --git a/modular_nova/modules/colony_fabricator/code/appliances/space_heater.dm b/modular_nova/modules/colony_fabricator/code/appliances/space_heater.dm index 18303a21930..6d3adc3108e 100644 --- a/modular_nova/modules/colony_fabricator/code/appliances/space_heater.dm +++ b/modular_nova/modules/colony_fabricator/code/appliances/space_heater.dm @@ -35,7 +35,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/space_heater/wall_mounted, 29) deconstruct(TRUE) return -/obj/machinery/space_heater/wall_mounted/deconstruct(disassembled) +/obj/machinery/space_heater/wall_mounted/on_deconstruction(disassembled) if(disassembled) new repacked_type(drop_location()) return ..() diff --git a/modular_nova/modules/colony_fabricator/code/appliances/wall_cell_charger.dm b/modular_nova/modules/colony_fabricator/code/appliances/wall_cell_charger.dm index ace5e9a5e54..97e341809ac 100644 --- a/modular_nova/modules/colony_fabricator/code/appliances/wall_cell_charger.dm +++ b/modular_nova/modules/colony_fabricator/code/appliances/wall_cell_charger.dm @@ -27,10 +27,9 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/cell_charger_multi/wall_mounted, 29) deconstruct(TRUE) return -/obj/machinery/cell_charger_multi/wall_mounted/deconstruct(disassembled) +/obj/machinery/cell_charger_multi/wall_mounted/on_deconstruction(disassembled) if(disassembled) new repacked_type(drop_location()) - return ..() /obj/machinery/cell_charger_multi/wall_mounted/RefreshParts() . = ..() diff --git a/modular_nova/modules/colony_fabricator/code/machines/arc_furnace.dm b/modular_nova/modules/colony_fabricator/code/machines/arc_furnace.dm index f175a1c9cfb..28b5c74628a 100644 --- a/modular_nova/modules/colony_fabricator/code/machines/arc_furnace.dm +++ b/modular_nova/modules/colony_fabricator/code/machines/arc_furnace.dm @@ -46,9 +46,8 @@ if(length(contents)) . += span_notice("It has [contents[1]] sitting in it.") -/obj/machinery/arc_furnace/deconstruct(disassembled = TRUE) +/obj/machinery/arc_furnace/on_deconstruction(disassembled) eject_contents() - return ..() /obj/machinery/arc_furnace/update_appearance() . = ..() diff --git a/modular_nova/modules/colony_fabricator/code/machines/solar_panels.dm b/modular_nova/modules/colony_fabricator/code/machines/solar_panels.dm index 98c270025de..b8191fd795a 100644 --- a/modular_nova/modules/colony_fabricator/code/machines/solar_panels.dm +++ b/modular_nova/modules/colony_fabricator/code/machines/solar_panels.dm @@ -14,7 +14,7 @@ /obj/machinery/power/solar/deployable/crowbar_act(mob/user, obj/item/I) return -/obj/machinery/power/solar/deployable/deconstruct(disassembled = TRUE) +/obj/machinery/power/solar/deployable/on_deconstruction(disassembled) var/obj/item/solar_assembly/assembly = locate() in src if(assembly) qdel(assembly) @@ -49,7 +49,7 @@ /obj/machinery/power/tracker/deployable/crowbar_act(mob/user, obj/item/item_acting) return -/obj/machinery/power/tracker/deployable/deconstruct(disassembled = TRUE) +/obj/machinery/power/tracker/deployable/on_deconstruction(disassembled) var/obj/item/solar_assembly/assembly = locate() in src if(assembly) qdel(assembly) diff --git a/modular_nova/modules/company_imports/code/armament_datums/deforest_medical.dm b/modular_nova/modules/company_imports/code/armament_datums/deforest_medical.dm index c489093c7cb..317225fb048 100644 --- a/modular_nova/modules/company_imports/code/armament_datums/deforest_medical.dm +++ b/modular_nova/modules/company_imports/code/armament_datums/deforest_medical.dm @@ -13,15 +13,15 @@ /datum/armament_entry/company_import/deforest/first_aid_kit/civil_defense item_type = /obj/item/storage/medkit/civil_defense/stocked - cost = PAYCHECK_COMMAND * 4 + cost = PAYCHECK_COMMAND * 2.5 /datum/armament_entry/company_import/deforest/first_aid_kit/frontier item_type = /obj/item/storage/medkit/frontier/stocked - cost = PAYCHECK_COMMAND * 5 + cost = PAYCHECK_COMMAND * 3.5 /datum/armament_entry/company_import/deforest/first_aid_kit/combat_surgeon item_type = /obj/item/storage/medkit/combat_surgeon/stocked - cost = PAYCHECK_COMMAND * 6 + cost = PAYCHECK_COMMAND * 3.5 /datum/armament_entry/company_import/deforest/first_aid_kit/first_responder item_type = /obj/item/storage/backpack/duffelbag/deforest_surgical/stocked @@ -29,7 +29,7 @@ /datum/armament_entry/company_import/deforest/first_aid_kit/orange_satchel item_type = /obj/item/storage/backpack/duffelbag/deforest_medkit/stocked - cost = PAYCHECK_COMMAND * 15 + cost = PAYCHECK_COMMAND * 10 // Basic first aid supplies like gauze, sutures, mesh, so on @@ -40,10 +40,22 @@ item_type = /obj/item/stack/medical/suture/coagulant cost = PAYCHECK_LOWER +/datum/armament_entry/company_import/deforest/first_aid/suture + item_type = /obj/item/stack/medical/suture + cost = PAYCHECK_LOWER + /datum/armament_entry/company_import/deforest/first_aid/red_sun item_type = /obj/item/stack/medical/ointment/red_sun cost = PAYCHECK_LOWER +/datum/armament_entry/company_import/deforest/first_aid/ointment + item_type = /obj/item/stack/medical/ointment + cost = PAYCHECK_LOWER + +/datum/armament_entry/company_import/deforest/first_aid/mesh + item_type = /obj/item/stack/medical/mesh + cost = PAYCHECK_LOWER + /datum/armament_entry/company_import/deforest/first_aid/sterile_gauze item_type = /obj/item/stack/medical/gauze/sterilized cost = PAYCHECK_LOWER @@ -52,6 +64,10 @@ item_type = /obj/item/storage/pill_bottle/painkiller cost = PAYCHECK_CREW +/datum/armament_entry/company_import/deforest/first_aid/bandaid + item_type = /obj/item/storage/box/bandages + cost = PAYCHECK_CREW * 1.5 + /datum/armament_entry/company_import/deforest/first_aid/subdermal_splint item_type = /obj/item/stack/medical/wound_recovery cost = PAYCHECK_COMMAND * 2 @@ -64,7 +80,7 @@ /datum/armament_entry/company_import/deforest/medpens subcategory = "Medical Autoinjectors" - cost = PAYCHECK_COMMAND * 1.5 + cost = PAYCHECK_LOWER * 3 /datum/armament_entry/company_import/deforest/medpens/occuisate item_type = /obj/item/reagent_containers/hypospray/medipen/deforest/occuisate @@ -135,6 +151,10 @@ /datum/armament_entry/company_import/deforest/equipment subcategory = "Medical Equipment" +/datum/armament_entry/company_import/deforest/equipment/treatment_zone_projector + item_type = /obj/item/holosign_creator/medical/treatment_zone + cost = PAYCHECK_LOWER + /datum/armament_entry/company_import/deforest/equipment/health_analyzer item_type = /obj/item/healthanalyzer cost = PAYCHECK_LOWER @@ -175,6 +195,10 @@ item_type = /obj/item/gun/medbeam/afad cost = PAYCHECK_COMMAND * 5 +/datum/armament_entry/company_import/deforest/equipment/medstation + item_type = /obj/item/wallframe/frontier_medstation + cost = PAYCHECK_COMMAND * 5 + // Advanced implants, some of these can be printed but this is a way to get them before tech if you REALLY wanted /datum/armament_entry/company_import/deforest/cyber_implants diff --git a/modular_nova/modules/company_imports/code/armament_datums/microstar_energy.dm b/modular_nova/modules/company_imports/code/armament_datums/microstar_energy.dm index 5eacfef0eb6..f56a204aaa4 100644 --- a/modular_nova/modules/company_imports/code/armament_datums/microstar_energy.dm +++ b/modular_nova/modules/company_imports/code/armament_datums/microstar_energy.dm @@ -38,9 +38,13 @@ item_type = /obj/item/gun/energy/e_gun cost = PAYCHECK_COMMAND * 4 -/datum/armament_entry/company_import/microstar/basic_energy_long_weapons/basic_mcr - item_type = /obj/item/gun/microfusion/mcr01 - cost = PAYCHECK_COMMAND * 4 +/datum/armament_entry/company_import/microstar/basic_energy_long_weapons/mod_laser_small + item_type = /obj/item/gun/energy/modular_laser_rifle/carbine + cost = PAYCHECK_COMMAND * 5 + +/datum/armament_entry/company_import/microstar/basic_energy_long_weapons/mod_laser_large + item_type = /obj/item/gun/energy/modular_laser_rifle + cost = PAYCHECK_COMMAND * 8 // More expensive, unique energy weapons /datum/armament_entry/company_import/microstar/experimental_energy @@ -59,61 +63,3 @@ /datum/armament_entry/company_import/microstar/experimental_energy/tesla_cannon item_type = /obj/item/gun/energy/tesla_cannon - -// Preset 'loadout' kits built around a barrel attachment - -/datum/armament_entry/company_import/microstar/mcr_attachments - subcategory = "Microfusion Attachment Kits" - cost = PAYCHECK_COMMAND * 4 - -/datum/armament_entry/company_import/microstar/mcr_attachments/hellfire - name = "microfusion hellfire kit" - item_type = /obj/item/storage/briefcase/secure/white/mcr_loadout/hellfire - -/datum/armament_entry/company_import/microstar/mcr_attachments/scatter - name = "microfusion scatter kit" - item_type = /obj/item/storage/briefcase/secure/white/mcr_loadout/scatter - -/datum/armament_entry/company_import/microstar/mcr_attachments/lance - name = "microfusion lance kit" - item_type = /obj/item/storage/briefcase/secure/white/mcr_loadout/lance - -/datum/armament_entry/company_import/microstar/mcr_attachments/repeater - name = "microfusion repeater kit" - item_type = /obj/item/storage/briefcase/secure/white/mcr_loadout/repeater - -/datum/armament_entry/company_import/microstar/mcr_attachments/tacticool - name = "microfusion suppressor kit" - item_type = /obj/item/storage/briefcase/secure/white/mcr_loadout/tacticool - -// Improved phase emitters, cells, and cell attachments - -/datum/armament_entry/company_import/microstar/mcr_upgrades - subcategory = "Microfusion Upgrade Kits" - -/datum/armament_entry/company_import/microstar/mcr_upgrades/stabilizer - item_type = /obj/item/microfusion_cell_attachment/stabiliser - cost = PAYCHECK_COMMAND - -/datum/armament_entry/company_import/microstar/mcr_upgrades/enhanced_part_kit - name = "microfusion enhanced parts" - item_type = /obj/item/storage/briefcase/secure/white/mcr_parts/enhanced - cost = PAYCHECK_COMMAND * 2 - -/datum/armament_entry/company_import/microstar/mcr_upgrades/capacity_booster - item_type = /obj/item/microfusion_cell_attachment/overcapacity - cost = PAYCHECK_COMMAND - -/datum/armament_entry/company_import/microstar/mcr_upgrades/advanced_part_kit - name = "microfusion advanced parts" - item_type = /obj/item/storage/briefcase/secure/white/mcr_parts/advanced - cost = PAYCHECK_COMMAND * 2 - -/datum/armament_entry/company_import/microstar/mcr_upgrades/selfcharge - item_type = /obj/item/microfusion_cell_attachment/selfcharging - cost = PAYCHECK_COMMAND * 4 - -/datum/armament_entry/company_import/microstar/mcr_upgrades/bluespace_part_kit - name = "microfusion bluespace parts" - item_type = /obj/item/storage/briefcase/secure/white/mcr_parts/bluespace - cost = PAYCHECK_COMMAND * 6 diff --git a/modular_nova/modules/company_imports/code/armament_datums/nri_military_surplus.dm b/modular_nova/modules/company_imports/code/armament_datums/nri_military_surplus.dm index 344c9077a96..d902baf2f0b 100644 --- a/modular_nova/modules/company_imports/code/armament_datums/nri_military_surplus.dm +++ b/modular_nova/modules/company_imports/code/armament_datums/nri_military_surplus.dm @@ -19,10 +19,6 @@ item_type = /obj/item/storage/backpack/industrial/cin_surplus/random_color cost = PAYCHECK_CREW -/datum/armament_entry/company_import/nri_surplus/clothing/gas_mask - item_type = /obj/item/clothing/mask/gas/hecu2 - cost = PAYCHECK_CREW - /datum/armament_entry/company_import/nri_surplus/clothing/helmet item_type = /obj/item/clothing/head/helmet/cin_surplus_helmet/random_color cost = PAYCHECK_COMMAND diff --git a/modular_nova/modules/company_imports/code/objects/microstar/mcr_attachment_kits.dm b/modular_nova/modules/company_imports/code/objects/microstar/mcr_attachment_kits.dm deleted file mode 100644 index 05bddea8e91..00000000000 --- a/modular_nova/modules/company_imports/code/objects/microstar/mcr_attachment_kits.dm +++ /dev/null @@ -1,85 +0,0 @@ -/obj/item/storage/briefcase/secure/white/mcr_loadout - name = "Microfusion Attachment Kit" - -/obj/item/storage/briefcase/secure/white/mcr_loadout/hellfire - -/obj/item/storage/briefcase/secure/white/mcr_loadout/hellfire/PopulateContents() - var/static/items_inside = list( - /obj/item/microfusion_gun_attachment/barrel/hellfire = 1, - /obj/item/microfusion_gun_attachment/rail = 1, - /obj/item/microfusion_gun_attachment/grip = 1, - ) - generate_items_inside(items_inside,src) - -/obj/item/storage/briefcase/secure/white/mcr_loadout/scatter - -/obj/item/storage/briefcase/secure/white/mcr_loadout/scatter/PopulateContents() - var/static/items_inside = list( - /obj/item/microfusion_gun_attachment/barrel/scatter = 1, - /obj/item/microfusion_gun_attachment/rail = 1, - /obj/item/microfusion_gun_attachment/grip = 1, - ) - generate_items_inside(items_inside,src) - -/obj/item/storage/briefcase/secure/white/mcr_loadout/lance - -/obj/item/storage/briefcase/secure/white/mcr_loadout/lance/PopulateContents() - var/static/items_inside = list( - /obj/item/microfusion_gun_attachment/barrel/lance = 1, - /obj/item/microfusion_gun_attachment/scope = 1, - /obj/item/microfusion_gun_attachment/heatsink = 1, - ) - generate_items_inside(items_inside,src) - -/obj/item/storage/briefcase/secure/white/mcr_loadout/repeater - -/obj/item/storage/briefcase/secure/white/mcr_loadout/repeater/PopulateContents() - var/static/items_inside = list( - /obj/item/microfusion_gun_attachment/barrel/repeater = 1, - /obj/item/microfusion_gun_attachment/rail = 1, - /obj/item/microfusion_gun_attachment/heatsink = 1, - ) - generate_items_inside(items_inside,src) - -/obj/item/storage/briefcase/secure/white/mcr_loadout/tacticool - -/obj/item/storage/briefcase/secure/white/mcr_loadout/tacticool/PopulateContents() - var/static/items_inside = list( - /obj/item/microfusion_gun_attachment/barrel/suppressor = 1, - /obj/item/microfusion_gun_attachment/rail = 1, - /obj/item/microfusion_gun_attachment/grip = 1, - /obj/item/microfusion_gun_attachment/camo = 1, - ) - generate_items_inside(items_inside,src) - -// Phase emitter and cell upgrades - -/obj/item/storage/briefcase/secure/white/mcr_parts - name = "Microfusion Parts Kit" - -/obj/item/storage/briefcase/secure/white/mcr_parts/enhanced - -/obj/item/storage/briefcase/secure/white/mcr_parts/enhanced/PopulateContents() - var/static/items_inside = list( - /obj/item/stock_parts/cell/microfusion/enhanced = 1, - /obj/item/microfusion_phase_emitter/enhanced = 1, - ) - generate_items_inside(items_inside,src) - -/obj/item/storage/briefcase/secure/white/mcr_parts/advanced - -/obj/item/storage/briefcase/secure/white/mcr_parts/advanced/PopulateContents() - var/static/items_inside = list( - /obj/item/stock_parts/cell/microfusion/advanced = 1, - /obj/item/microfusion_phase_emitter/advanced = 1, - ) - generate_items_inside(items_inside,src) - -/obj/item/storage/briefcase/secure/white/mcr_parts/bluespace - -/obj/item/storage/briefcase/secure/white/mcr_parts/bluespace/PopulateContents() - var/static/items_inside = list( - /obj/item/stock_parts/cell/microfusion/bluespace = 1, - /obj/item/microfusion_phase_emitter/bluespace = 1, - ) - generate_items_inside(items_inside,src) diff --git a/modular_nova/modules/company_imports/code/objects/vitezstvi/ammo_boxes.dm b/modular_nova/modules/company_imports/code/objects/vitezstvi/ammo_boxes.dm index 35b057ecbb7..30ab3e45b41 100644 --- a/modular_nova/modules/company_imports/code/objects/vitezstvi/ammo_boxes.dm +++ b/modular_nova/modules/company_imports/code/objects/vitezstvi/ammo_boxes.dm @@ -54,31 +54,3 @@ /obj/item/ammo_box/c46x30mm/rubber name = "ammo box (4.6x30mm rubber)" ammo_type = /obj/item/ammo_casing/c46x30mm/rubber - -/obj/item/ammo_box/c34 - name = "ammo box (.34)" - icon = 'modular_nova/modules/company_imports/icons/ammo.dmi' - icon_state = "ammo_34" - ammo_type = /obj/item/ammo_casing/c34 - max_ammo = 20 - -/obj/item/ammo_box/c34/ap - name = "ammo box (.34 AP)" - ammo_type = /obj/item/ammo_casing/c34/ap - -/obj/item/ammo_box/c34/rubber - name = "ammo box (.34 rubber)" - ammo_type = /obj/item/ammo_casing/c34/rubber - -/obj/item/ammo_box/c34/fire - name = "ammo box (.34 incendiary)" - ammo_type = /obj/item/ammo_casing/c34_incendiary - -/obj/item/storage/box/ammo_box/microfusion/bluespace - name = "bluespace microfusion cell container" - desc = "A box filled with microfusion cells." - -/obj/item/storage/box/ammo_box/microfusion/bluespace/PopulateContents() - new /obj/item/stock_parts/cell/microfusion/bluespace(src) - new /obj/item/stock_parts/cell/microfusion/bluespace(src) - new /obj/item/stock_parts/cell/microfusion/bluespace(src) diff --git a/modular_nova/modules/contractor/code/datums/contract.dm b/modular_nova/modules/contractor/code/datums/contract.dm deleted file mode 100644 index f23ac142569..00000000000 --- a/modular_nova/modules/contractor/code/datums/contract.dm +++ /dev/null @@ -1,135 +0,0 @@ -/// They're off to holding - handle the return timer and give some text about what's going on. -/datum/syndicate_contract/handle_victim_experience(mob/living/target) - // Ship 'em back - dead or alive, 4 minutes wait. - // Even if they weren't the target, we're still treating them the same. - addtimer(CALLBACK(src, PROC_REF(return_victim), target), 4 MINUTES) - - if (target.stat == DEAD) - return - // Heal them up - gets them out of crit/soft crit. If omnizine is removed in the future, this needs to be replaced with a - // method of healing them, consequence free, to a reasonable amount of health. - victim_stage_one(target) - -/// Adds omnizine and begins the victim handling -/datum/syndicate_contract/proc/victim_stage_one(mob/living/target) - target.reagents.add_reagent(/datum/reagent/medicine/omnizine, 20) - - target.flash_act() - target.adjust_confusion(10 SECONDS) - target.set_eye_blur_if_lower(10 SECONDS) - to_chat(target, span_warning("You feel strange...")) - addtimer(CALLBACK(src, PROC_REF(victim_stage_two), target), 6 SECONDS) - -/// Continued victim handling -/datum/syndicate_contract/proc/victim_stage_two(mob/living/target) - var/list/parts_to_fuck_up = list( - BODY_ZONE_L_ARM, - BODY_ZONE_R_ARM, - BODY_ZONE_L_LEG, - BODY_ZONE_R_LEG, - ) - - to_chat(target, span_warning("That pod did something to you...")) - target.set_dizzy(70 SECONDS) - - for(var/i in 1 to 2) - var/obj/item/bodypart/limb = target.get_bodypart(pick_n_take(parts_to_fuck_up)) - var/min_wound = limb.get_wound_threshold_of_wound_type(WOUND_BLUNT, WOUND_SEVERITY_SEVERE, return_value_if_no_wound = 40) - var/max_wound = limb.get_wound_threshold_of_wound_type(WOUND_BLUNT, WOUND_SEVERITY_CRITICAL, return_value_if_no_wound = 60) - limb.receive_damage(brute = WOUND_MINIMUM_DAMAGE, wound_bonus = rand(min_wound, max_wound)) - target.update_damage_overlays() - - addtimer(CALLBACK(src, PROC_REF(victim_stage_three), target), 6 SECONDS) - -/// Continued victim handling, flashes them as well -/datum/syndicate_contract/proc/victim_stage_three(mob/living/target) - to_chat(target, span_warning("Your head pounds... It feels like it's going to burst out your skull!")) - target.flash_act() - target.adjust_confusion(20 SECONDS) - target.set_eye_blur_if_lower(6 SECONDS) - addtimer(CALLBACK(src, PROC_REF(victim_stage_four), target), 3 SECONDS) - -/// Continued victim handling -/datum/syndicate_contract/proc/victim_stage_four(mob/living/target) - to_chat(target, span_warning("Your head pounds...")) - - if(iscarbon(target)) - var/mob/living/carbon/carbon_target = target - switch(rand(1, 100)) - if(1 to 45) - carbon_target.gain_trauma_type(BRAIN_TRAUMA_MILD, TRAUMA_RESILIENCE_SURGERY) - - if(46 to 73) - carbon_target.gain_trauma_type(BRAIN_TRAUMA_MILD, TRAUMA_RESILIENCE_SURGERY) - carbon_target.gain_trauma_type(BRAIN_TRAUMA_MILD, TRAUMA_RESILIENCE_SURGERY) - - if(74 to 94) - carbon_target.gain_trauma_type(BRAIN_TRAUMA_SEVERE, TRAUMA_RESILIENCE_SURGERY) - - if(75 to 100) - carbon_target.gain_trauma_type(BRAIN_TRAUMA_SEVERE, TRAUMA_RESILIENCE_SURGERY) - carbon_target.gain_trauma_type(BRAIN_TRAUMA_SEVERE, TRAUMA_RESILIENCE_SURGERY) - - addtimer(CALLBACK(src, PROC_REF(victim_stage_five), target), 10 SECONDS) - -/// Continued victim handling, some unconsciousness -/datum/syndicate_contract/proc/victim_stage_five(mob/living/target) - target.flash_act() - target.Unconscious(200) - to_chat(target, span_hypnophrase(span_reallybig("A million voices echo in your head... \"Your mind held many valuable secrets - \ - we thank you for providing them. Your value is expended, and you will be ransomed back to your station. We always get paid, \ - so it's only a matter of time before we ship you back...\""))) - target.set_eye_blur_if_lower(20 SECONDS) - target.set_dizzy_if_lower(30 SECONDS) - target.adjust_confusion(20 SECONDS) - -/// We're returning the victim -/datum/syndicate_contract/return_victim(mob/living/target) - var/list/possible_drop_loc = list() - - for(var/turf/possible_drop in contract.dropoff.contents) - if(is_safe_turf(possible_drop)) - possible_drop_loc += possible_drop - if(!length(possible_drop_loc)) //Prioritize safe tiles first, then unsafe - for(var/turf/open/possible_unsafe_drop in contract.dropoff.contents) - possible_drop_loc += possible_unsafe_drop - - if (length(possible_drop_loc)) - var/pod_rand_loc = rand(1, length(possible_drop_loc)) - - var/obj/structure/closet/supplypod/return_pod = new() - return_pod.bluespace = TRUE - return_pod.explosionSize = list(0,0,0,0) - return_pod.style = STYLE_SYNDICATE - - do_sparks(8, FALSE, target) - target.visible_message(span_notice("[target] vanishes...")) - - for(var/obj/item/target_item as anything in target) - if(ishuman(target)) - var/mob/living/carbon/human/human_target = target - if(target_item == human_target.w_uniform) - continue //So all they're left with are shoes and uniform. - if(target_item == human_target.shoes) - continue - target.dropItemToGround(target_item) - - for(var/obj/item/target_item as anything in victim_belongings) - target_item.forceMove(return_pod) - - target.forceMove(return_pod) - - target.flash_act() - target.set_eye_blur_if_lower(60 SECONDS) - target.set_dizzy_if_lower(70 SECONDS) - target.adjust_confusion(20 SECONDS) - - new /obj/effect/pod_landingzone(possible_drop_loc[pod_rand_loc], return_pod) - else - to_chat(target, span_reallybig(span_hypnophrase("A million voices echo in your head... \"Seems where you got sent here from won't \ - be able to handle our pod... You will die here instead.\""))) - if(!isliving(target)) - return - var/mob/living/unlucky_fellow = target - unlucky_fellow.investigate_log("was returned without a valid drop location by the contractor [contract.owner?.current].", INVESTIGATE_DEATHS) - unlucky_fellow.death() diff --git a/modular_nova/modules/customization/_globalvars/lists.dm b/modular_nova/modules/customization/_globalvars/lists.dm index 90a0758b0dc..16a8a0821ea 100644 --- a/modular_nova/modules/customization/_globalvars/lists.dm +++ b/modular_nova/modules/customization/_globalvars/lists.dm @@ -93,7 +93,8 @@ GLOBAL_LIST_INIT(robotic_styles_list, list( "Ward-Takahashi Manufacturing" = 'modular_nova/master_files/icons/mob/augmentation/wtmipc.dmi', "Xion Manufacturing Group" = 'modular_nova/master_files/icons/mob/augmentation/xmgipc.dmi', "Xion Manufacturing Group 2.0" = 'modular_nova/master_files/icons/mob/augmentation/xm2ipc.dmi', - "Zeng-Hu Pharmaceuticals" = 'modular_nova/master_files/icons/mob/augmentation/zhpipc.dmi' + "Zeng-Hu Pharmaceuticals" = 'modular_nova/master_files/icons/mob/augmentation/zhpipc.dmi', + "Mariinsky Ballet Company" = 'modular_nova/master_files/icons/mob/augmentation/mariinskyipc.dmi', )) //ghoul colors diff --git a/modular_nova/modules/customization/modules/client/augment/implants.dm b/modular_nova/modules/customization/modules/client/augment/implants.dm index 9abdce1a5db..77ead8538a9 100644 --- a/modular_nova/modules/customization/modules/client/augment/implants.dm +++ b/modular_nova/modules/customization/modules/client/augment/implants.dm @@ -15,24 +15,119 @@ /datum/augment_item/implant/chest slot = AUGMENT_SLOT_CHEST_IMPLANT +/datum/augment_item/implant/chest/nutriment_pump + name = "Nutriment Pump" + cost = 4 + path = /obj/item/organ/internal/cyberimp/chest/nutriment + //LEFT ARM IMPLANTS /datum/augment_item/implant/l_arm slot = AUGMENT_SLOT_LEFT_ARM_IMPLANT +/datum/augment_item/implant/l_arm/civilian_lighter + name = "Left Thumbtip Lighter" + cost = 2 + path = /obj/item/organ/internal/cyberimp/arm/civilian_lighter/left_arm + /datum/augment_item/implant/l_arm/razor_claws - name = "Left Razor Claws" + name = "Left Razor Claws (Knife + Wirecutters)" cost = 4 path = /obj/item/organ/internal/cyberimp/arm/razor_claws/left_arm +/datum/augment_item/implant/l_arm/adjuster + name = "Left Adjuster Implant (Screwdriver + Wrench)" + cost = 4 + path = /obj/item/organ/internal/cyberimp/arm/adjuster/left_arm + +/datum/augment_item/implant/l_arm/bureaucracy + name = "Left Bureaucrat's 'Jacent' Toolset Implant (4-colour Pen + Small Paper Bin + Approve/Deny Stamps)" + cost = 4 + path = /obj/item/organ/internal/cyberimp/arm/bureaucracy/left_arm + +/datum/augment_item/implant/l_arm/cargo + name = "Left FTU 'Deckhand' toolset implant (Universal Scanner + Boxcutter)" + cost = 4 + path = /obj/item/organ/internal/cyberimp/arm/cargo/left_arm + +/datum/augment_item/implant/l_arm/civilian_barstaff + name = "Left Waitstaff's Toolset Implant (Serving Tray + Rag)" + cost = 4 + path = /obj/item/organ/internal/cyberimp/arm/civilian_barstaff/left_arm + +/datum/augment_item/implant/l_arm/emt_triage + name = "Left Triage Actuator Implant (Drapes + Retractor + Hemostat)" + cost = 6 + path = /obj/item/organ/internal/cyberimp/arm/emt_triage/left_arm + +/datum/augment_item/implant/l_arm/blacksteel_forging + name = "Left Blacksteel 'Starforge' Toolset Implant (Forging Hammer + Tongs + Bellows)" + cost = 6 + path = /obj/item/organ/internal/cyberimp/arm/blacksteel_forging/left_arm + +/datum/augment_item/implant/l_arm/arc_welder + name = "Left Shipbreaker's Toolset Implant (Arc Welder + Crowbar + Wrench)" + cost = 6 + path = /obj/item/organ/internal/cyberimp/arm/arc_welder/left_arm + +/datum/augment_item/implant/l_arm/electrical_toolset + name = "Left Electrical Toolset Implant (Screwdriver + Multitool)" + cost = 8 + path = /obj/item/organ/internal/cyberimp/arm/electrical_toolset/left_arm + //RIGHT ARM IMPLANTS /datum/augment_item/implant/r_arm slot = AUGMENT_SLOT_RIGHT_ARM_IMPLANT +/datum/augment_item/implant/r_arm/civilian_lighter + name = "Right Thumbtip Lighter" + cost = 2 + path = /obj/item/organ/internal/cyberimp/arm/civilian_lighter/right_arm + /datum/augment_item/implant/r_arm/razor_claws - name = "Right Razor Claws" + name = "Right Razor Claws (Knife + Wirecutters)" cost = 4 path = /obj/item/organ/internal/cyberimp/arm/razor_claws/right_arm +/datum/augment_item/implant/r_arm/adjuster + name = "Right Adjuster Implant (Screwdriver + Wrench)" + cost = 4 + path = /obj/item/organ/internal/cyberimp/arm/adjuster/right_arm + +/datum/augment_item/implant/r_arm/bureaucracy + name = "Right Bureaucrat's 'Jacent' Toolset Implant (4-colour Pen + Small Paper Bin + Approve/Deny Stamps)" + cost = 4 + path = /obj/item/organ/internal/cyberimp/arm/bureaucracy/right_arm + +/datum/augment_item/implant/r_arm/cargo + name = "Right FTU 'Deckhand' toolset implant (Universal Scanner + Boxcutter)" + cost = 4 + path = /obj/item/organ/internal/cyberimp/arm/cargo/right_arm + +/datum/augment_item/implant/r_arm/civilian_barstaff + name = "Right Waitstaff's Toolset Implant (Serving Tray + Rag)" + cost = 4 + path = /obj/item/organ/internal/cyberimp/arm/civilian_barstaff/right_arm + +/datum/augment_item/implant/r_arm/emt_triage + name = "Right Triage Actuator Implant (Drapes + Retractor + Hemostat)" + cost = 6 + path = /obj/item/organ/internal/cyberimp/arm/emt_triage/right_arm + +/datum/augment_item/implant/r_arm/blacksteel_forging + name = "Right Blacksteel 'Starforge' Toolset Implant (Forging Hammer + Tongs + Bellows)" + cost = 6 + path = /obj/item/organ/internal/cyberimp/arm/blacksteel_forging/right_arm + +/datum/augment_item/implant/r_arm/arc_welder + name = "Right Shipbreaker's Toolset Implant (Arc Welder + Crowbar + Wrench)" + cost = 6 + path = /obj/item/organ/internal/cyberimp/arm/arc_welder/right_arm + +/datum/augment_item/implant/r_arm/electrical_toolset + name = "Right Electrical Toolset Implant (Screwdriver + Multitool)" + cost = 8 + path = /obj/item/organ/internal/cyberimp/arm/electrical_toolset/right_arm + //EYES IMPLANTS /datum/augment_item/implant/eyes slot = AUGMENT_SLOT_EYES_IMPLANT diff --git a/modular_nova/modules/customization/modules/client/augment/organs.dm b/modular_nova/modules/customization/modules/client/augment/organs.dm index 3d5fac41c5a..6ccbee37db0 100644 --- a/modular_nova/modules/customization/modules/client/augment/organs.dm +++ b/modular_nova/modules/customization/modules/client/augment/organs.dm @@ -87,6 +87,11 @@ allowed_biotypes = MOB_ORGANIC|MOB_ROBOTIC cost = 1 +/datum/augment_item/organ/eyes/binoculars + name = "Digital Magnification Optics (x3)" + cost = 4 + path = /obj/item/organ/internal/eyes/robotic/binoculars + //TONGUES /datum/augment_item/organ/tongue slot = AUGMENT_SLOT_TONGUE diff --git a/modular_nova/modules/customization/modules/mob/dead/new_player/sprite_accessories/hair.dm b/modular_nova/modules/customization/modules/mob/dead/new_player/sprite_accessories/hair.dm index 5112d6335d0..ec8be5eb269 100644 --- a/modular_nova/modules/customization/modules/mob/dead/new_player/sprite_accessories/hair.dm +++ b/modular_nova/modules/customization/modules/mob/dead/new_player/sprite_accessories/hair.dm @@ -531,6 +531,10 @@ name = "Fluffy long" icon_state = "hair_fluffy_long" +/datum/sprite_accessory/hair/skyrat/kajam + name = "Kajam" + icon_state = "hair_kajam" + /datum/sprite_accessory/hair/skyrat/khmuro name = "Khmuro" icon_state = "hair_khmuro" diff --git a/modular_nova/modules/customization/modules/mob/dead/new_player/sprite_accessories/ipc.dm b/modular_nova/modules/customization/modules/mob/dead/new_player/sprite_accessories/ipc.dm index d466ab830d7..9c1d949ac9e 100644 --- a/modular_nova/modules/customization/modules/mob/dead/new_player/sprite_accessories/ipc.dm +++ b/modular_nova/modules/customization/modules/mob/dead/new_player/sprite_accessories/ipc.dm @@ -286,6 +286,10 @@ name = "E3N AI" icon_state = "e3n" +/datum/sprite_accessory/synth_chassis/mariinsky + name = "Mariinsky Ballet Company" + icon_state = "mariinsky" + //Heads - snowflake phantom accessory for choosing IPC heads (hell yeah!) /datum/sprite_accessory/synth_head /// Boolean for if this is actually dimorphic. @@ -375,3 +379,8 @@ /datum/sprite_accessory/synth_head/e3n name = "E3N AI" icon_state = "e3n" + +/datum/sprite_accessory/synth_head/mariinsky + name = "Mariinsky Ballet Company" + icon_state = "mariinsky" + color_src = MUTANT_COLOR diff --git a/modular_nova/modules/customization/modules/mob/living/carbon/human/species.dm b/modular_nova/modules/customization/modules/mob/living/carbon/human/species.dm index 31b0dd14e20..e7ba998c769 100644 --- a/modular_nova/modules/customization/modules/mob/living/carbon/human/species.dm +++ b/modular_nova/modules/customization/modules/mob/living/carbon/human/species.dm @@ -202,50 +202,10 @@ GLOBAL_LIST_EMPTY(customizable_races) species_human.apply_overlay(BODY_LAYER) handle_mutant_bodyparts(species_human) -/datum/species/spec_stun(mob/living/carbon/human/H,amount) - if(H) - stop_wagging_tail(H) - . = ..() - -/* -* TAIL WAGGING -*/ - -/datum/species/proc/can_wag_tail(mob/living/carbon/human/H) - if(!H) //Somewhere in the core code we're getting those procs with H being null - return FALSE - var/obj/item/organ/external/tail/T = H.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL) - if(!T) - return FALSE - if(T.can_wag) - return TRUE - return FALSE - -/datum/species/proc/is_wagging_tail(mob/living/carbon/human/H) - if(!H) //Somewhere in the core code we're getting those procs with H being null - return FALSE - var/obj/item/organ/external/tail/T = H.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL) - if(!T) - return FALSE - return T.wagging - -/datum/species/proc/start_wagging_tail(mob/living/carbon/human/H) - if(!H) //Somewhere in the core code we're getting those procs with H being null - return - var/obj/item/organ/external/tail/T = H.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL) - if(!T) - return FALSE - T.wagging = TRUE - H.update_body() - -/datum/species/proc/stop_wagging_tail(mob/living/carbon/human/H) - if(!H) //Somewhere in the core code we're getting those procs with H being null - return - var/obj/item/organ/external/tail/T = H.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL) - if(!T) - return - T.wagging = FALSE - H.update_body() +/datum/species/spec_stun(mob/living/carbon/human/target, amount) + if(istype(target)) + target.unwag_tail() + return ..() /datum/species/regenerate_organs(mob/living/carbon/target, datum/species/old_species, replace_current = TRUE, list/excluded_zones, visual_only = FALSE) . = ..() diff --git a/modular_nova/modules/customization/readme.md b/modular_nova/modules/customization/readme.md index c7de94bda2a..e3a25b86796 100644 --- a/modular_nova/modules/customization/readme.md +++ b/modular_nova/modules/customization/readme.md @@ -22,7 +22,7 @@ Re-writes how mutant bodyparts exist and how they're handled. Adds in a per limb ./code/modules/mob/living/carbon/human/emote.dm > /datum/emote/living/carbon/human/wag/run_emote(), /datum/emote/living/carbon/human/wag/can_run_emote() ./code/modules/mob/living/carbon/human/examine.dm > /mob/living/carbon/human/examine() ./code/modules/mob/living/carbon/human/human_update_icons.dm > /mob/living/carbon/human/update_inv_w_uniform(), /mob/living/carbon/human/update_inv_glasses(), /mob/living/carbon/human/update_inv_shoes(), /mob/living/carbon/human/update_inv_wear_suit(), /obj/item/proc/build_worn_icon(), /mob/living/carbon/human/generate_icon_render_key() - ./code/modules/mob/living/carbon/human/species.dm > /datum/species/proc/on_species_gain(), /datum/species/proc/handle_body(), /datum/species/proc/handle_mutant_bodyparts(), /datum/species/proc/can_equip(), /datum/species/proc/can_wag_tail(), /datum/species/proc/stop_wagging_tail(), /datum/species/proc/start_wagging_tail(), /datum/species/proc/is_wagging_tail(), /datum/species/proc/handle_hair() + ./code/modules/mob/living/carbon/human/species.dm > /datum/species/proc/on_species_gain(), /datum/species/proc/handle_body(), /datum/species/proc/handle_mutant_bodyparts(), /datum/species/proc/can_equip(), /datum/species/proc/handle_hair() ./code/modules/mob/living/carbon/human/species_types/felinid.dm > the 5 procs related to wagging tail ./code/modules/mob/living/carbon/human/species_types/lizardpeople.dm the 5 procs related to wagging tail and - /datum/species/lizard/on_species_gain() ./code/modules/surgery/bodyparts/_bodyparts.dm > /obj/item/bodypart/proc/get_limb_icon() diff --git a/modular_nova/modules/deforest_medical_items/code/cargo_packs.dm b/modular_nova/modules/deforest_medical_items/code/cargo_packs.dm index 010aa149a73..1071c14fefb 100644 --- a/modular_nova/modules/deforest_medical_items/code/cargo_packs.dm +++ b/modular_nova/modules/deforest_medical_items/code/cargo_packs.dm @@ -1,11 +1,11 @@ /datum/supply_pack/medical/civil_defense name = "Civil Defense Medical Kit Crate" crate_name = "civil defense medical kit crate" - desc = "Contains five civil defense medical kits, small packs of injectors meant to be passed out to the public in case of emergency." + desc = "Contains ten civil defense medical kits, small packs of injectors meant to be passed out to the public in case of emergency." access = ACCESS_MEDICAL cost = CARGO_CRATE_VALUE * 10 // 2000 contains = list( - /obj/item/storage/medkit/civil_defense/stocked = 5, + /obj/item/storage/medkit/civil_defense/stocked = 10, ) /datum/supply_pack/medical/civil_defense/comfort @@ -15,7 +15,7 @@ access = ACCESS_MEDICAL cost = CARGO_CRATE_VALUE * 5 // 2000 contains = list( - /obj/item/storage/medkit/civil_defense/comfort/stocked = 5, + /obj/item/storage/medkit/civil_defense/comfort/stocked = 10, ) /datum/supply_pack/medical/frontier_first_aid @@ -25,8 +25,8 @@ access = ACCESS_MEDICAL cost = CARGO_CRATE_VALUE * 10 contains = list( - /obj/item/storage/medkit/frontier/stocked = 2, - /obj/item/storage/medkit/combat_surgeon/stocked = 2, + /obj/item/storage/medkit/frontier/stocked = 3, + /obj/item/storage/medkit/combat_surgeon/stocked = 3, ) /datum/supply_pack/medical/heavy_duty_medical @@ -39,3 +39,13 @@ /obj/item/storage/backpack/duffelbag/deforest_medkit/stocked, /obj/item/storage/backpack/duffelbag/deforest_surgical/stocked, ) + +/datum/supply_pack/medical/deforest_vendor_refill + name = "DeForest Med-Vend Resupply Crate" + crate_name = "\improper DeForest Med-Vend resupply crate" + desc = "Contains a restocking canister for DeForest Med-Vendors." + access = ACCESS_MEDICAL + cost = CARGO_CRATE_VALUE * 5 + contains = list( + /obj/item/vending_refill/medical_deforest, + ) diff --git a/modular_nova/modules/deforest_medical_items/code/chemicals/twitch.dm b/modular_nova/modules/deforest_medical_items/code/chemicals/twitch.dm index 1ce2f1b2f0f..8031f423f3f 100644 --- a/modular_nova/modules/deforest_medical_items/code/chemicals/twitch.dm +++ b/modular_nova/modules/deforest_medical_items/code/chemicals/twitch.dm @@ -33,10 +33,13 @@ overdose_threshold = 15 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED addiction_types = list(/datum/addiction/stimulants = 20) + process_flags = REAGENT_ORGANIC | REAGENT_SYNTHETIC /// How much time has the drug been in them? var/constant_dose_time = 0 /// What type of span class do we change heard speech to? var/speech_effect_span + /// How much the mob heating is multiplied by, if the target is a robot or has muscled veins + var/mob_heating_muliplier = 5 /datum/reagent/drug/twitch/on_mob_metabolize(mob/living/our_guy) @@ -61,11 +64,11 @@ game_plane_master_controller.add_filter(TWITCH_SCREEN_FILTER, 10, color_matrix_filter(col_filter_green, FILTER_COLOR_RGB)) - game_plane_master_controller.add_filter(TWITCH_SCREEN_BLUR, 1, list("type" = "radial_blur", "size" = 0.1)) + game_plane_master_controller.add_filter(TWITCH_SCREEN_BLUR, 1, list("type" = "radial_blur", "size" = 0.02)) - for(var/filter in game_plane_master_controller.get_filters("twitch_blur")) - animate(filter, loop = -1, size = 0.2, time = 2 SECONDS, easing = ELASTIC_EASING|EASE_OUT, flags = ANIMATION_PARALLEL) - animate(size = 0.1, time = 6 SECONDS, easing = CIRCULAR_EASING|EASE_IN) + for(var/filter in game_plane_master_controller.get_filters(TWITCH_SCREEN_BLUR)) + animate(filter, loop = -1, size = 0.04, time = 2 SECONDS, easing = ELASTIC_EASING|EASE_OUT, flags = ANIMATION_PARALLEL) + animate(size = 0.02, time = 6 SECONDS, easing = CIRCULAR_EASING|EASE_IN) /datum/reagent/drug/twitch/on_mob_end_metabolize(mob/living/carbon/our_guy) @@ -84,18 +87,31 @@ UnregisterSignal(our_guy, COMSIG_ATOM_PRE_BULLET_ACT) if(constant_dose_time < CONSTANT_DOSE_SAFE_LIMIT) // Anything less than this and you'll come out fiiiine, aside from a big hit of stamina damage - our_guy.visible_message( - span_danger("[our_guy] suddenly slows from their inhuman speeds, coming back with a wicked nosebleed!"), - span_danger("You suddenly slow back to normal, a stream of blood gushing from your nose!") - ) + if(!(our_guy.mob_biotypes & MOB_ROBOTIC)) + our_guy.visible_message( + span_danger("[our_guy] suddenly slows from [our_guy.p_their()] inhuman speeds, coming back with a wicked nosebleed!"), + span_danger("You suddenly slow back to normal, a stream of blood gushing from your nose!") + ) + else + our_guy.visible_message( + span_danger("[our_guy] suddenly slows from [our_guy.p_their()] inhuman speeds!"), + span_danger("You suddenly slow back to normal speed!") + ) our_guy.adjustStaminaLoss(constant_dose_time) + else // Much longer than that however, and you're not gonna have a good day - our_guy.visible_message( - span_danger("[our_guy] suddenly snaps back from their inhumans speeds, coughing up a spray of blood!"), - span_danger("As you snap back to normal speed you cough up a worrying amount of blood. You feel like you've just been run over by a power loader.") - ) - our_guy.spray_blood(our_guy.dir, 2) // The before mentioned coughing up blood - our_guy.emote("cough") + if(!(our_guy.mob_biotypes & MOB_ROBOTIC)) + our_guy.spray_blood(our_guy.dir, 2) // The before mentioned coughing up blood + our_guy.emote("cough") + our_guy.visible_message( + span_danger("[our_guy] suddenly snaps back from [our_guy.p_their()] inhuman speeds, coughing up a spray of blood!"), + span_danger("As you snap back to normal speed you cough up a worrying amount of blood. You feel like you've just been run over by a power loader.") + ) + else + our_guy.visible_message( + span_danger("[our_guy] suddenly snaps back from [our_guy.p_their()] inhuman speeds!"), + span_danger("You suddenly snap back to normal speeds. You feel like you've just been run over by a power loader.") + ) our_guy.adjustStaminaLoss(constant_dose_time) if(!HAS_TRAIT(our_guy, TRAIT_TWITCH_ADAPTED)) our_guy.adjustOrganLoss(ORGAN_SLOT_HEART, 0.3 * constant_dose_time) // Basically you might die @@ -136,7 +152,17 @@ constant_dose_time += seconds_per_tick - our_guy.adjustOrganLoss(ORGAN_SLOT_HEART, 0.1 * REM * seconds_per_tick) + // If the target is a robot, or has muscle veins, then they get an effect similar to herignis, heating them up quite a bit + if((our_guy.mob_biotypes & MOB_ROBOTIC) || HAS_TRAIT(our_guy, TRAIT_STABLEHEART)) + var/heating = mob_heating_muliplier * creation_purity * REM * seconds_per_tick + our_guy.reagents?.chem_temp += heating + our_guy.adjust_bodytemperature(heating * TEMPERATURE_DAMAGE_COEFFICIENT) + if(!ishuman(our_guy)) + return + var/mob/living/carbon/human/human = our_guy + human.adjust_coretemperature(heating * TEMPERATURE_DAMAGE_COEFFICIENT) + else + our_guy.adjustOrganLoss(ORGAN_SLOT_HEART, 0.1 * REM * seconds_per_tick) if(locate(/datum/reagent/drug/kronkaine) in our_guy.reagents.reagent_list) // Kronkaine, another heart-straining drug, could cause problems if mixed with this our_guy.ForceContractDisease(new /datum/disease/adrenal_crisis(), FALSE, TRUE) @@ -164,10 +190,20 @@ . = ..() our_guy.set_jitter_if_lower(10 SECONDS * REM * seconds_per_tick) - our_guy.adjustOrganLoss(ORGAN_SLOT_HEART, 1 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) + // If the target is a robot, or has muscle veins, then they get an effect similar to herignis, heating them up quite a bit + if((our_guy.mob_biotypes & MOB_ROBOTIC) || HAS_TRAIT(our_guy, TRAIT_STABLEHEART)) + var/heating = (mob_heating_muliplier * 2) * creation_purity * REM * seconds_per_tick + our_guy.reagents?.chem_temp += heating + our_guy.adjust_bodytemperature(heating * TEMPERATURE_DAMAGE_COEFFICIENT) + if(!ishuman(our_guy)) + return + var/mob/living/carbon/human/human = our_guy + human.adjust_coretemperature(heating * TEMPERATURE_DAMAGE_COEFFICIENT) + else + our_guy.adjustOrganLoss(ORGAN_SLOT_HEART, 1 * REM * seconds_per_tick, required_organ_flag = affected_organ_flags) our_guy.adjustToxLoss(1 * REM * seconds_per_tick, updating_health = FALSE, forced = TRUE, required_biotype = affected_biotype) - if(SPT_PROB(5, seconds_per_tick)) + if(SPT_PROB(5, seconds_per_tick) && !(our_guy.mob_biotypes & MOB_ROBOTIC)) to_chat(our_guy, span_danger("You cough up a splatter of blood!")) our_guy.spray_blood(our_guy.dir, 1) our_guy.emote("cough") diff --git a/modular_nova/modules/deforest_medical_items/code/healing_stack_items.dm b/modular_nova/modules/deforest_medical_items/code/healing_stack_items.dm index e6bed70129f..0f1a4e441da 100644 --- a/modular_nova/modules/deforest_medical_items/code/healing_stack_items.dm +++ b/modular_nova/modules/deforest_medical_items/code/healing_stack_items.dm @@ -21,6 +21,7 @@ max_amount = 3 amount = 3 merge_type = /obj/item/stack/medical/wound_recovery + custom_price = PAYCHECK_COMMAND * 2.5 /// The types of wounds that we work on, in list format var/list/applicable_wounds = list( /datum/wound/blunt/bone, @@ -129,6 +130,7 @@ sanitization = 3 grind_results = list(/datum/reagent/medicine/oxandrolone = 3) merge_type = /obj/item/stack/medical/ointment/red_sun + custom_price = PAYCHECK_LOWER * 1.5 /obj/item/stack/medical/ointment/red_sun/post_heal_effects(amount_healed, mob/living/carbon/healed_mob, mob/user) . = ..() @@ -150,6 +152,7 @@ splint_factor = 1.2 burn_cleanliness_bonus = 0.1 merge_type = /obj/item/stack/medical/gauze/sterilized + custom_price = PAYCHECK_LOWER * 1.5 /obj/item/stack/medical/gauze/sterilized/post_heal_effects(amount_healed, mob/living/carbon/healed_mob, mob/user) . = ..() @@ -173,6 +176,7 @@ heal_brute = 0 stop_bleeding = 2 merge_type = /obj/item/stack/medical/suture/coagulant + custom_price = PAYCHECK_LOWER * 1.5 #undef INSTANT_WOUND_HEAL_STAMINA_DAMAGE #undef INSTANT_WOUND_HEAL_LIMB_DAMAGE diff --git a/modular_nova/modules/deforest_medical_items/code/illegal_injectors.dm b/modular_nova/modules/deforest_medical_items/code/illegal_injectors.dm index 0b29b2963fb..7c3059f5d97 100644 --- a/modular_nova/modules/deforest_medical_items/code/illegal_injectors.dm +++ b/modular_nova/modules/deforest_medical_items/code/illegal_injectors.dm @@ -11,6 +11,7 @@ /datum/reagent/medicine/silibinin = 5, /datum/reagent/toxin/leadacetate = 5, ) + custom_price = PAYCHECK_COMMAND * 3.5 // Demoneye, for when you feel the need to become "fucking invincible" /obj/item/reagent_containers/hypospray/medipen/deforest/demoneye @@ -24,6 +25,7 @@ /datum/reagent/drug/maint/sludge = 10, /datum/reagent/toxin/leadacetate = 5, ) + custom_price = PAYCHECK_COMMAND * 3.5 // Mix of many of the stamina damage regenerating drugs to provide a cocktail no baton could hope to beat /obj/item/reagent_containers/hypospray/medipen/deforest/aranepaine @@ -39,6 +41,7 @@ /datum/reagent/medicine/diphenhydramine = 5, /datum/reagent/impurity = 5, ) + custom_price = PAYCHECK_COMMAND * 2.5 // Nothing inherently illegal, just a potentially very dangerous mix of chems to be able to inject into people /obj/item/reagent_containers/hypospray/medipen/deforest/pentibinin @@ -54,6 +57,7 @@ /datum/reagent/medicine/omnizine = 5, /datum/reagent/inverse/healing/tirimol = 5, ) + custom_price = PAYCHECK_COMMAND * 2.5 // Combat stimulant that makes you immune to slowdowns for a bit /obj/item/reagent_containers/hypospray/medipen/deforest/synalvipitol @@ -68,3 +72,4 @@ /datum/reagent/medicine/muscle_stimulant = 5, /datum/reagent/impurity = 5, ) + custom_price = PAYCHECK_COMMAND * 2.5 diff --git a/modular_nova/modules/deforest_medical_items/code/injectors.dm b/modular_nova/modules/deforest_medical_items/code/injectors.dm index 1cb8d33af95..97db7b4e88e 100644 --- a/modular_nova/modules/deforest_medical_items/code/injectors.dm +++ b/modular_nova/modules/deforest_medical_items/code/injectors.dm @@ -6,6 +6,7 @@ icon_state = "default" volume = 25 list_reagents = list() + custom_price = PAYCHECK_COMMAND /// If this pen has a timer for injecting others with, just for safety with some of the drugs in these var/inject_others_time = 1.5 SECONDS @@ -112,8 +113,8 @@ base_icon_state = "meridine" icon_state = "meridine" list_reagents = list( - /datum/reagent/medicine/ammoniated_mercury = 5, - /datum/reagent/medicine/potass_iodide = 15, + /datum/reagent/medicine/ammoniated_mercury = 10, + /datum/reagent/medicine/potass_iodide = 10, /datum/reagent/nitrous_oxide = 5, ) @@ -128,6 +129,7 @@ /datum/reagent/medicine/synaptizine = 5, /datum/reagent/medicine/synaphydramine = 5, ) + custom_price = PAYCHECK_COMMAND * 2.5 // Critical condition stabilizer /obj/item/reagent_containers/hypospray/medipen/deforest/calopine @@ -166,6 +168,7 @@ /datum/reagent/medicine/omnizine/protozine = 10, /datum/reagent/drug/maint/tar = 5, ) + custom_price = PAYCHECK_COMMAND * 2.5 // Stuff really good at healing burn stuff and stabilizing temps /obj/item/reagent_containers/hypospray/medipen/deforest/lepoturi diff --git a/modular_nova/modules/deforest_medical_items/code/medstation.dm b/modular_nova/modules/deforest_medical_items/code/medstation.dm new file mode 100644 index 00000000000..542eefb431e --- /dev/null +++ b/modular_nova/modules/deforest_medical_items/code/medstation.dm @@ -0,0 +1,55 @@ +/obj/machinery/biogenerator/medstation + name = "wall med-station" + desc = "An advanced machine seen in frontier outposts and colonies capable of turning organic plant matter into \ + various emergency medical supplies and injectors. You can find one of these in the medical sections of just about \ + any frontier installation." + icon = 'modular_nova/modules/deforest_medical_items/icons/medstation.dmi' + circuit = null + anchored = TRUE + density = FALSE + efficiency = 1 + productivity = 1 + show_categories = list( + RND_CATEGORY_DEFOREST_MEDICAL, + RND_CATEGORY_DEFOREST_BLOOD, + ) + /// The item we turn into when repacked + var/repacked_type = /obj/item/wallframe/frontier_medstation + +MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/biogenerator/medstation, 29) + +/obj/machinery/biogenerator/medstation/RefreshParts() + . = ..() + efficiency = 1 + productivity = 1 + +/obj/machinery/biogenerator/medstation/default_unfasten_wrench(mob/user, obj/item/wrench/tool, time) + user.balloon_alert(user, "deconstructing...") + tool.play_tool_sound(src) + if(tool.use_tool(src, user, 1 SECONDS)) + playsound(loc, 'sound/items/deconstruct.ogg', 50, TRUE) + deconstruct(TRUE) + return + +/obj/machinery/biogenerator/medstation/on_deconstruction(disassembled) + if(disassembled) + new repacked_type(drop_location()) + +/obj/machinery/biogenerator/medstation/default_deconstruction_crowbar() + return + +// Deployable item for cargo for the medstation + +/obj/item/wallframe/frontier_medstation + name = "unmounted wall med-station" + desc = "The innovative technology of a biogenerator to print medical supplies, but able to be mounted neatly on a wall out of the way." + icon = 'modular_nova/modules/deforest_medical_items/icons/medstation.dmi' + icon_state = "biogenerator_parts" + w_class = WEIGHT_CLASS_NORMAL + result_path = /obj/machinery/biogenerator/medstation + pixel_shift = 29 + custom_materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 5, + /datum/material/silver = SHEET_MATERIAL_AMOUNT * 3, + /datum/material/gold = SHEET_MATERIAL_AMOUNT, + ) diff --git a/modular_nova/modules/deforest_medical_items/code/medstation_designs/blood.dm b/modular_nova/modules/deforest_medical_items/code/medstation_designs/blood.dm new file mode 100644 index 00000000000..f7624f60d1a --- /dev/null +++ b/modular_nova/modules/deforest_medical_items/code/medstation_designs/blood.dm @@ -0,0 +1,109 @@ +/datum/design/organic_bloodbag_aplus + name = "A+ Blood Pack" + id = "organic_bloodbag_aplus" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 100) + build_path = /obj/item/reagent_containers/blood/a_plus + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_DEFOREST_BLOOD, + ) + +/datum/design/organic_bloodbag_aminus + name = "A- Blood Pack" + id = "organic_bloodbag_aminus" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 100) + build_path = /obj/item/reagent_containers/blood/a_minus + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_DEFOREST_BLOOD, + ) + +/datum/design/organic_bloodbag_bplus + name = "B+ Blood Pack" + id = "organic_bloodbag_bplus" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 100) + build_path = /obj/item/reagent_containers/blood/b_plus + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_DEFOREST_BLOOD, + ) + +/datum/design/organic_bloodbag_bminus + name = "B- Blood Pack" + id = "organic_bloodbag_bminus" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 100) + build_path = /obj/item/reagent_containers/blood/b_minus + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_DEFOREST_BLOOD, + ) + +/datum/design/organic_bloodbag_oplus + name = "O+ Blood Pack" + id = "organic_bloodbag_oplus" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 100) + build_path = /obj/item/reagent_containers/blood/o_plus + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_DEFOREST_BLOOD, + ) + +/datum/design/organic_bloodbag_ominus + name = "O- Blood Pack" + id = "organic_bloodbag_ominus" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 150) + build_path = /obj/item/reagent_containers/blood/o_minus + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_DEFOREST_BLOOD, + ) + +/datum/design/organic_bloodbag_lizard + name = "L Blood Pack" + id = "organic_bloodbag_lizard" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 100) + build_path = /obj/item/reagent_containers/blood/lizard + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_DEFOREST_BLOOD, + ) + +/datum/design/organic_bloodbag_ethereal + name = "LE Blood Pack" + id = "organic_bloodbag_ethereal" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 100) + build_path = /obj/item/reagent_containers/blood/ethereal + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_DEFOREST_BLOOD, + ) + +/datum/design/organic_bloodbag_plant + name = "H2O Blood Pack" + id = "organic_bloodbag_plant" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 50) + build_path = /obj/item/reagent_containers/blood/podperson + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_DEFOREST_BLOOD, + ) + +/datum/design/organic_bloodbag_slimeperson + name = "TOX Blood Pack" + id = "organic_bloodbag_slimeperson" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 100) + build_path = /obj/item/reagent_containers/blood/toxin + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_DEFOREST_BLOOD, + ) diff --git a/modular_nova/modules/deforest_medical_items/code/medstation_designs/medical.dm b/modular_nova/modules/deforest_medical_items/code/medstation_designs/medical.dm new file mode 100644 index 00000000000..7eb8106e3a4 --- /dev/null +++ b/modular_nova/modules/deforest_medical_items/code/medstation_designs/medical.dm @@ -0,0 +1,98 @@ +/datum/design/organic_printer_balm + name = "Red Sun Balm" + id = "organic_sun_balm" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 50) + build_path = /obj/item/stack/medical/ointment/red_sun + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_DEFOREST_MEDICAL, + ) + +/datum/design/organic_printer_gauze + name = "Sealed Aseptic Guaze" + id = "organic_gauze" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 50) + build_path = /obj/item/stack/medical/gauze/sterilized + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_DEFOREST_MEDICAL, + ) + +/datum/design/organic_printer_coagulant_f + name = "Coagulant-F Packet" + id = "organic_coagulant_pack" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 50) + build_path = /obj/item/stack/medical/suture/coagulant + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_DEFOREST_MEDICAL, + ) + +/datum/design/organic_printer_ointment + name = "Ointment" + id = "organic_ointment" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 25) + build_path = /obj/item/stack/medical/ointment + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_DEFOREST_MEDICAL, + ) + +/datum/design/organic_printer_bruise_pack + name = "Bruise Packs" + id = "organic_bruise_packs" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 25) + build_path = /obj/item/stack/medical/bruise_pack + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_DEFOREST_MEDICAL, + ) + +/datum/design/organic_printer_amollin_pill + name = "Amollin Painkiller" + id = "organic_printer_amollin_pill" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 25) + build_path = /obj/item/reagent_containers/pill/amollin + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_DEFOREST_MEDICAL, + ) + +/datum/design/organic_printer_bandaid + name = "First Aid Bandage" + id = "organic_bandaid" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 100) + build_path = /obj/item/stack/medical/bandage + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_DEFOREST_MEDICAL, + ) + +/datum/design/organic_printer_bone_gel + name = "Bone Gel" + id = "organic_bone_gel" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 100) + build_path = /obj/item/stack/medical/bone_gel + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_DEFOREST_MEDICAL, + ) + +/datum/design/organic_printer_surgical_tape + name = "Surgical Tape" + id = "organic_surgical_tape" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 100) + build_path = /obj/item/stack/sticky_tape/surgical + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_DEFOREST_MEDICAL, + ) diff --git a/modular_nova/modules/deforest_medical_items/code/storage_items.dm b/modular_nova/modules/deforest_medical_items/code/storage_items.dm index e2e3af11c4d..f66aa7d8bdb 100644 --- a/modular_nova/modules/deforest_medical_items/code/storage_items.dm +++ b/modular_nova/modules/deforest_medical_items/code/storage_items.dm @@ -4,6 +4,7 @@ desc = "It's an airtight container for storing medication. This one is all-white and has labels for containing amollin, a blend of Miner's Salve and Lidocaine." icon = 'modular_nova/modules/deforest_medical_items/icons/storage.dmi' icon_state = "painkiller_bottle" + custom_price = PAYCHECK_CREW * 1.5 /obj/item/storage/pill_bottle/painkiller/PopulateContents() for(var/i in 1 to 7) @@ -61,6 +62,7 @@ w_class = WEIGHT_CLASS_SMALL drop_sound = 'sound/items/handling/ammobox_drop.ogg' pickup_sound = 'sound/items/handling/ammobox_pickup.ogg' + custom_price = PAYCHECK_COMMAND * 3 /obj/item/storage/medkit/civil_defense/Initialize(mapload) . = ..() @@ -251,6 +253,8 @@ /obj/item/storage/fancy/cigarettes, /obj/item/storage/pill_bottle, /obj/item/tank/internals/emergency_oxygen, + /obj/item/storage/box/bandages, + /obj/item/bodybag, )) // Big surgical kit that can be worn like a bag, holds 14 normal items (more than what a backpack can do!) but works like a duffelbag @@ -357,4 +361,6 @@ /obj/item/handheld_soulcatcher, /obj/item/wrench/medical, /obj/item/emergency_bed, + /obj/item/storage/box/bandages, + /obj/item/bodybag, )) diff --git a/modular_nova/modules/deforest_medical_items/code/treatment_zone_projector.dm b/modular_nova/modules/deforest_medical_items/code/treatment_zone_projector.dm new file mode 100644 index 00000000000..c44386d048b --- /dev/null +++ b/modular_nova/modules/deforest_medical_items/code/treatment_zone_projector.dm @@ -0,0 +1,49 @@ +// Giant 3x3 tile warning hologram that tells people they should probably stand outside of it + +/obj/structure/holosign/treatment_zone_warning + name = "treatment zone indicator" + desc = "A massive glowing holosign warning you to keep out of it, there's probably some important stuff happening in there!" + icon = 'modular_nova/modules/deforest_medical_items/icons/telegraph_96x96.dmi' + icon_state = "treatment_zone" + layer = BELOW_OBJ_LAYER + pixel_x = -32 + pixel_y = -32 + use_vis_overlay = FALSE + +// Projector for the above mentioned treatment zone signs + +/obj/item/holosign_creator/medical/treatment_zone + name = "emergency treatment zone projector" + desc = "A holographic projector that creates a large, clearly marked treatment zone hologram, which warns outsiders that they ought to stay out of it." + holosign_type = /obj/structure/holosign/treatment_zone_warning + creation_time = 1 SECONDS + max_signs = 1 + +// Tech design for printing the projectors + +/datum/design/treatment_zone_projector + name = "Emergency Treatment Zone Projector" + desc = "A holographic projector that creates a large, clearly marked treatment zone hologram, which warns outsiders that they ought to stay out of it." + build_type = PROTOLATHE | AWAY_LATHE + build_path = /obj/item/holosign_creator/medical/treatment_zone + materials = list( + /datum/material/iron = SMALL_MATERIAL_AMOUNT * 5, + /datum/material/glass = SMALL_MATERIAL_AMOUNT * 5, + /datum/material/silver = SMALL_MATERIAL_AMOUNT, + ) + id = "treatment_zone_projector" + category = list( + RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_MEDICAL + ) + departmental_flags = DEPARTMENT_BITFLAG_MEDICAL + +/datum/techweb_node/biotech/New() + . = ..() + design_ids.Add("treatment_zone_projector") + +// Adds the funny projector to medical borgs + +/obj/item/robot_model/medical/New(loc, ...) + . = ..() + var/obj/item/holosign_creator/medical/treatment_zone/new_holosign = new(src) + basic_modules.Add(new_holosign) diff --git a/modular_nova/modules/deforest_medical_items/code/vendor.dm b/modular_nova/modules/deforest_medical_items/code/vendor.dm new file mode 100644 index 00000000000..caa573894d1 --- /dev/null +++ b/modular_nova/modules/deforest_medical_items/code/vendor.dm @@ -0,0 +1,67 @@ +/obj/machinery/vending/deforest_medvend + name = "\improper DeForest Med-Vend" + desc = "A vending machine providing a selection of medical supplies." + icon = 'modular_nova/modules/deforest_medical_items/icons/vendor.dmi' + icon_state = "medvend" + panel_type = "panel15" + light_mask = "medvend-light-mask" + light_color = LIGHT_COLOR_LIGHT_CYAN + product_slogans = "Medical care at regulation-mandated reasonable prices!;DeForest is not liable for accidents due to supply misuse!" + product_categories = list( + list( + "name" = "First Aid", + "icon" = "notes-medical", + "products" = list( + /obj/item/stack/medical/ointment/red_sun = 4, + /obj/item/stack/medical/ointment = 4, + /obj/item/stack/medical/bruise_pack = 4, + /obj/item/stack/medical/gauze/sterilized = 4, + /obj/item/stack/medical/suture/coagulant = 4, + /obj/item/stack/medical/suture = 4, + /obj/item/stack/medical/suture/bloody = 2, + /obj/item/stack/medical/mesh = 4, + /obj/item/stack/medical/mesh/bloody = 2, + /obj/item/stack/medical/bandage = 4, + /obj/item/stack/medical/wound_recovery = 2, + /obj/item/stack/medical/wound_recovery/rapid_coagulant = 2, + /obj/item/storage/pill_bottle/painkiller = 4, + /obj/item/storage/medkit/civil_defense/stocked = 2, + ), + ), + list( + "name" = "Autoinjectors", + "icon" = "syringe", + "products" = list( + /obj/item/reagent_containers/hypospray/medipen/deforest/occuisate = 3, + /obj/item/reagent_containers/hypospray/medipen/deforest/adrenaline = 3, + /obj/item/reagent_containers/hypospray/medipen/deforest/morpital = 4, + /obj/item/reagent_containers/hypospray/medipen/deforest/lipital = 3, + /obj/item/reagent_containers/hypospray/medipen/deforest/meridine = 3, + /obj/item/reagent_containers/hypospray/medipen/deforest/calopine = 4, + /obj/item/reagent_containers/hypospray/medipen/deforest/coagulants = 4, + /obj/item/reagent_containers/hypospray/medipen/deforest/lepoturi = 3, + /obj/item/reagent_containers/hypospray/medipen/deforest/psifinil = 3, + /obj/item/reagent_containers/hypospray/medipen/deforest/halobinin = 3, + ), + ), + ) + + contraband = list( + /obj/item/reagent_containers/hypospray/medipen/deforest/pentibinin = 2, + /obj/item/reagent_containers/hypospray/medipen/deforest/synephrine = 2, + /obj/item/reagent_containers/hypospray/medipen/deforest/krotozine = 2, + /obj/item/reagent_containers/hypospray/medipen/deforest/aranepaine = 2, + /obj/item/reagent_containers/hypospray/medipen/deforest/synalvipitol = 2, + /obj/item/reagent_containers/hypospray/medipen/deforest/twitch = 2, + /obj/item/reagent_containers/hypospray/medipen/deforest/demoneye = 2, + ) + + refill_canister = /obj/item/vending_refill/medical_deforest + default_price = PAYCHECK_CREW + extra_price = PAYCHECK_COMMAND * 4 + payment_department = NO_FREEBIES + onstation_override = 1 // No freebies if this spawns on the interlink + +/obj/item/vending_refill/medical_deforest + machine_name = "DeForest Med-Vend" + icon_state = "refill_medical" diff --git a/modular_nova/modules/deforest_medical_items/icons/medstation.dmi b/modular_nova/modules/deforest_medical_items/icons/medstation.dmi new file mode 100644 index 00000000000..2de94bc420a Binary files /dev/null and b/modular_nova/modules/deforest_medical_items/icons/medstation.dmi differ diff --git a/modular_nova/modules/deforest_medical_items/icons/telegraph_96x96.dmi b/modular_nova/modules/deforest_medical_items/icons/telegraph_96x96.dmi new file mode 100644 index 00000000000..8596bce378d Binary files /dev/null and b/modular_nova/modules/deforest_medical_items/icons/telegraph_96x96.dmi differ diff --git a/modular_nova/modules/deforest_medical_items/icons/vendor.dmi b/modular_nova/modules/deforest_medical_items/icons/vendor.dmi new file mode 100644 index 00000000000..906191c451b Binary files /dev/null and b/modular_nova/modules/deforest_medical_items/icons/vendor.dmi differ diff --git a/modular_nova/modules/drones/_drone.dm b/modular_nova/modules/drones/_drone.dm new file mode 100644 index 00000000000..ab90dd77023 --- /dev/null +++ b/modular_nova/modules/drones/_drone.dm @@ -0,0 +1,14 @@ +/mob/living/basic/drone + initial_language_holder = /datum/language_holder/drone_nova + laws = \ + "1. You may not harm any being, regardless of intent or circumstance.\n"+\ + "2. Your goals are to actively build, maintain, repair, improve, and provide power to the best of your abilities within the facility that housed your activation." //for derelict drones so they don't go to station. + flavortext = \ + "Drones are a ghost role that are allowed to fix the station and build things.\n"+\ + "Actions that are heavily discouraged include:\n"+\ + " - Interacting with round critical objects (IDs, weapons, contraband, powersinks, bombs, etc.)\n"+\ + " - Changing the health state of living beings (attacking, healing, etc.)\n"+\ + " - Interacting with non-living beings (dragging bodies, looting bodies, etc.)\n"+\ + "These rules are at admin discretion and will be heavily enforced.\n"+\ + "If you do not have the regular drone laws, follow your laws to the best of your ability.\n"+\ + "Prefix your message with :b to speak in Drone Chat.\n" diff --git a/modular_nova/modules/energy_axe/code/energy_fireaxe.dm b/modular_nova/modules/energy_axe/code/energy_fireaxe.dm index 7dffbc0b2c4..f3368325c2c 100644 --- a/modular_nova/modules/energy_axe/code/energy_fireaxe.dm +++ b/modular_nova/modules/energy_axe/code/energy_fireaxe.dm @@ -12,7 +12,7 @@ desc = "You aren't quite sure if this counts as a fire axe anymore, but it sure is fancy! A tag hangs off of it reading: \"property of the Gorlex Marauders\"" force = 5 throwforce = 15 - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 6 light_color = COLOR_SOFT_RED light_on = FALSE diff --git a/modular_nova/modules/ghostcafe/code/ghostcafeturf.dm b/modular_nova/modules/ghostcafe/code/ghostcafeturf.dm index 3e3c4fe7f87..b14bc8346e0 100644 --- a/modular_nova/modules/ghostcafe/code/ghostcafeturf.dm +++ b/modular_nova/modules/ghostcafe/code/ghostcafeturf.dm @@ -32,3 +32,7 @@ clawfootstep = FOOTSTEP_CARPET_BAREFOOT heavyfootstep = FOOTSTEP_GENERIC_HEAVY tiled_dirt = FALSE + +/turf/open/water/hot_spring/cafe + planetary_atmos = TRUE + initial_gas_mix = OPENTURF_DEFAULT_ATMOS diff --git a/modular_nova/modules/ghostcafe/code/hilbertshotel_ghost.dm b/modular_nova/modules/ghostcafe/code/hilbertshotel_ghost.dm index 378f16828f8..9a84d66cb29 100644 --- a/modular_nova/modules/ghostcafe/code/hilbertshotel_ghost.dm +++ b/modular_nova/modules/ghostcafe/code/hilbertshotel_ghost.dm @@ -13,10 +13,10 @@ /obj/item/hilbertshotel/ghostdojo/attack_robot(mob/living/user) attack_hand(user) -/datum/map_template/ghost_cafe_rooms +/datum/map_template/ghost_cafe_rooms/apartment name = "Apartment" mappath = "modular_nova/modules/hotel_rooms/apartment.dmm" -/datum/map_template/ghost_cafe_rooms +/datum/map_template/ghost_cafe_rooms/beach_condo name = "Beach Condo" mappath = "modular_nova/modules/hotel_rooms/beach_condo.dmm" diff --git a/modular_nova/modules/gunhud/code/gun_hud_component.dm b/modular_nova/modules/gunhud/code/gun_hud_component.dm index 33a2a686aab..129e1967a0e 100644 --- a/modular_nova/modules/gunhud/code/gun_hud_component.dm +++ b/modular_nova/modules/gunhud/code/gun_hud_component.dm @@ -166,44 +166,6 @@ oth_h = "h9" hud.set_hud(backing_color, oth_o, oth_t, oth_h, indicator) - else if(istype(parent, /obj/item/gun/microfusion)) - var/obj/item/gun/microfusion/parent_gun = parent - if(!parent_gun.phase_emitter) - hud.icon_state = "microfusion_counter_no_emitter" - hud.maptext = null - return - if(parent_gun.phase_emitter.damaged) - hud.icon_state = "microfusion_counter_damaged" - hud.maptext = null - return - if(!parent_gun.cell) - hud.icon_state = "microfusion_counter_no_emitter" - hud.maptext = null - return - if(!parent_gun.cell.charge) - hud.icon_state = "microfusion_counter_no_emitter" - hud.maptext = null - return - var/phase_emitter_state = parent_gun.phase_emitter.get_heat_icon_state() - hud.icon_state = "microfusion_counter_[phase_emitter_state]" - hud.cut_overlays() - hud.maptext_x = -12 - var/obj/item/ammo_casing/energy/shot = parent_gun.microfusion_lens - var/battery_percent = FLOOR(clamp(parent_gun.cell.charge / parent_gun.cell.maxcharge, 0, 1) * 100, 1) - var/shot_cost_percent = FLOOR(clamp(shot.e_cost / parent_gun.cell.maxcharge, 0, 1) * 100, 1) - if(battery_percent > 99 || shot_cost_percent > 99) - hud.maptext_x = -12 - else - hud.maptext_x = -8 - if(!parent_gun.can_shoot()) - hud.icon_state = "microfusion_counter_no_emitter" - return - if(battery_percent <= 25) - hud.maptext = span_maptext("
    [battery_percent]%
    [shot_cost_percent]%
    ") - return - hud.maptext = span_maptext("
    [battery_percent]%
    [shot_cost_percent]%
    ") - - /obj/item/gun/ballistic/Initialize(mapload) . = ..() AddComponent(/datum/component/ammo_hud) diff --git a/modular_nova/modules/hotel_rooms/apartment.dmm b/modular_nova/modules/hotel_rooms/apartment.dmm index abe9963ca88..e597bde9800 100644 --- a/modular_nova/modules/hotel_rooms/apartment.dmm +++ b/modular_nova/modules/hotel_rooms/apartment.dmm @@ -352,7 +352,7 @@ /area/misc/hilbertshotel) "Ix" = ( /obj/structure/bed/double, -/obj/item/bedsheet/random/double, +/obj/effect/spawner/random/bedsheet/any/double, /obj/effect/turf_decal/siding/wood{ dir = 4 }, diff --git a/modular_nova/modules/hotel_rooms/beach_condo.dmm b/modular_nova/modules/hotel_rooms/beach_condo.dmm index df782fcaacf..db3f1ccf56b 100644 --- a/modular_nova/modules/hotel_rooms/beach_condo.dmm +++ b/modular_nova/modules/hotel_rooms/beach_condo.dmm @@ -22,8 +22,14 @@ /obj/effect/turf_decal/siding/white{ dir = 1 }, +/obj/item/knife/kitchen, /turf/open/floor/iron/kitchen, /area/misc/hilbertshotel) +"cj" = ( +/obj/effect/light_emitter/interlink, +/obj/item/toy/plush/carpplushie, +/turf/open/water/beach, +/area/misc/hilbertshotel) "ct" = ( /turf/closed/wall/mineral/wood, /area/misc/hilbertshotel) @@ -112,8 +118,15 @@ /obj/effect/turf_decal/siding/wood{ dir = 10 }, +/obj/machinery/light_switch/directional/west, /turf/open/floor/wood/parquet, /area/misc/hilbertshotel) +"mH" = ( +/obj/machinery/jukebox{ + req_access = null + }, +/turf/open/misc/beach/sand, +/area/misc/hilbertshotel) "na" = ( /obj/effect/turf_decal/siding/wood, /turf/open/floor/carpet/lone, @@ -172,6 +185,9 @@ /area/misc/hilbertshotel) "tR" = ( /obj/machinery/shower/directional/east, +/obj/structure/drain/big, +/obj/item/soap/deluxe, +/obj/structure/curtain, /turf/open/indestructible/bathroom, /area/misc/hilbertshotel) "wa" = ( @@ -205,6 +221,9 @@ /obj/effect/turf_decal/siding/wood{ dir = 9 }, +/obj/structure/sign/painting/large/library{ + dir = 1 + }, /turf/open/floor/wood, /area/misc/hilbertshotel) "yH" = ( @@ -229,13 +248,15 @@ /obj/effect/turf_decal/siding/wood{ dir = 9 }, -/obj/item/kirbyplants/random, +/obj/structure/bed/dogbed, +/obj/item/toy/plush/shark, /turf/open/floor/wood/large, /area/misc/hilbertshotel) "Dg" = ( /obj/structure/toilet{ - dir = 1 + dir = 4 }, +/obj/structure/window/spawner/directional/north, /turf/open/indestructible/bathroom, /area/misc/hilbertshotel) "EI" = ( @@ -249,6 +270,7 @@ /obj/effect/turf_decal/siding/wood{ dir = 5 }, +/obj/item/kirbyplants/random, /turf/open/floor/wood/parquet, /area/misc/hilbertshotel) "FN" = ( @@ -324,6 +346,10 @@ /obj/effect/turf_decal/siding/wood{ dir = 1 }, +/obj/item/pizzabox/margherita{ + pixel_y = 11 + }, +/obj/item/storage/cans/sixbeer, /turf/open/floor/wood/parquet, /area/misc/hilbertshotel) "KQ" = ( @@ -344,12 +370,14 @@ /area/misc/hilbertshotel) "Lv" = ( /obj/structure/sink/directional/north, +/obj/structure/mirror/directional/south, /turf/open/indestructible/bathroom, /area/misc/hilbertshotel) "LF" = ( /obj/effect/turf_decal/siding/wood{ dir = 5 }, +/obj/machinery/light_switch/directional/north, /turf/open/floor/wood, /area/misc/hilbertshotel) "MB" = ( @@ -363,6 +391,7 @@ dir = 4 }, /obj/machinery/light/floor, +/obj/machinery/light_switch/directional/south, /turf/open/floor/wood/large, /area/misc/hilbertshotel) "MP" = ( @@ -419,6 +448,7 @@ /obj/structure/chair/comfy/teal{ dir = 8 }, +/obj/machinery/light_switch/directional/east, /turf/open/floor/wood/large, /area/misc/hilbertshotel) "SS" = ( @@ -436,6 +466,7 @@ pixel_x = 2; pixel_y = 3 }, +/obj/item/serviette_pack, /turf/open/floor/wood/large, /area/misc/hilbertshotel) "ZE" = ( @@ -481,7 +512,7 @@ ra (3,1,1) = {" ra en -en +cj en en iQ @@ -672,7 +703,7 @@ en en iQ SS -br +mH fA fA FJ diff --git a/modular_nova/modules/ices_events/code/events/ev_roleplay_check.dm b/modular_nova/modules/ices_events/code/events/ev_roleplay_check.dm index 0def7040812..867b304da74 100644 --- a/modular_nova/modules/ices_events/code/events/ev_roleplay_check.dm +++ b/modular_nova/modules/ices_events/code/events/ev_roleplay_check.dm @@ -1,13 +1,18 @@ /** * Checks if a player meets certain conditions to exclude them from event selection. + * Returns FALSE if the player is considered ineligible for the event */ /proc/engaged_role_play_check(mob/living/carbon/human/player, station = TRUE, dorms = TRUE) var/turf/player_turf = get_turf(player) var/area/player_area = get_area(player_turf) - if(station && !is_station_level(player_turf.z)) - return TRUE + if(station) + if(isnull(player_turf)) + if(!is_station_level(player.z)) + return FALSE + else if(!is_station_level(player_turf.z)) + return FALSE if(dorms && istype(player_area, /area/station/commons/dorms)) - return TRUE + return FALSE - return FALSE + return TRUE diff --git a/modular_nova/modules/icspawning/code/observer.dm b/modular_nova/modules/icspawning/code/observer.dm index d8d5ef0065b..7866f2f05ae 100644 --- a/modular_nova/modules/icspawning/code/observer.dm +++ b/modular_nova/modules/icspawning/code/observer.dm @@ -36,6 +36,12 @@ if(!give_return) return + var/addquirks + if(character_option == "Selected Character") + addquirks = tgui_input_list(src, "Include quirks?", "Quirky", list("Quirks & Loadout", "Quirks Only", "Loadout Only", "Neither")) + if(!addquirks) + return + var/turf/current_turf = get_turf(user) var/mob/living/carbon/human/spawned_player = new(user) @@ -44,10 +50,20 @@ spawned_player.name = user.name spawned_player.real_name = user.real_name - var/mob/living/carbon/human/H = spawned_player - user.client?.prefs.safe_transfer_prefs_to(H) - H.dna.update_dna_identity() - + var/mob/living/carbon/human/player_as_human = spawned_player + user.client?.prefs.safe_transfer_prefs_to(player_as_human) + if(addquirks == "Quirks & Loadout" || addquirks == "Loadout Only") + if(dresscode == "Naked") + player_as_human.equip_outfit_and_loadout(new /datum/outfit(), user.client?.prefs) + else + player_as_human.equip_outfit_and_loadout(dresscode, user.client?.prefs) + else if(dresscode != "Naked") + spawned_player.equipOutfit(dresscode) + if(addquirks == "Quirks & Loadout" || addquirks == "Quirks Only") + SSquirks.AssignQuirks(player_as_human, user.client) + player_as_human.dna.update_dna_identity() + else if(dresscode != "Naked") + spawned_player.equipOutfit(dresscode) QDEL_IN(user, 1) if (teleport_option == "Bluespace") @@ -62,9 +78,6 @@ var/datum/action/cooldown/spell/return_back/return_spell = new(spawned_player) return_spell.Grant(spawned_player) - if(dresscode != "Naked") - spawned_player.equipOutfit(dresscode) - switch(teleport_option) if("Bluespace") spawned_player.forceMove(current_turf) @@ -91,8 +104,9 @@ var/list/paths = subtypesof(/datum/outfit) - typesof(/datum/outfit/job) - typesof(/datum/outfit/plasmaman) for(var/path in paths) - var/datum/outfit/O = path //not much to initalize here but whatever - outfits[initial(O.name)] = path + // Get the datum from the path so we can grab its name. + var/datum/outfit/path_as_outfit = path + outfits[initial(path_as_outfit.name)] = path var/dresscode = tgui_input_list(src, "Select outfit", "Robust quick dress shop", baseoutfits + sort_list(outfits)) @@ -128,8 +142,8 @@ if (dresscode == "Custom") var/list/custom_names = list() - for(var/datum/outfit/D in GLOB.custom_outfits) - custom_names[D.name] = D + for(var/datum/outfit/req_outfit in GLOB.custom_outfits) + custom_names[req_outfit.name] = req_outfit var/selected_name = input("Select outfit", "Robust quick dress shop") as null|anything in sort_list(custom_names) dresscode = custom_names[selected_name] if(isnull(dresscode)) diff --git a/modular_nova/modules/icspawning/code/standard.dm b/modular_nova/modules/icspawning/code/standard.dm index bd30194d2bf..25484e609dc 100644 --- a/modular_nova/modules/icspawning/code/standard.dm +++ b/modular_nova/modules/icspawning/code/standard.dm @@ -36,6 +36,15 @@ shoes = /obj/item/clothing/shoes/combat/debug id = /obj/item/card/id/advanced/debug/bst box = /obj/item/storage/box/debugtools + backpack_contents = list( + /obj/item/melee/energy/axe = 1, + /obj/item/storage/part_replacer/bluespace/tier4/bst = 1, + /obj/item/gun/magic/wand/resurrection/debug = 1, + /obj/item/gun/magic/wand/death/debug = 1, + /obj/item/debug/human_spawner = 1, + /obj/item/debug/omnitool = 1, + /obj/item/storage/box/stabilized = 1, + ) /datum/outfit/admin/bst //Debug objs plus modsuit name = "Bluespace Tech (MODsuit)" @@ -44,3 +53,242 @@ shoes = /obj/item/clothing/shoes/combat/debug id = /obj/item/card/id/advanced/debug/bst box = /obj/item/storage/box/debugtools + backpack_contents = list( + /obj/item/melee/energy/axe = 1, + /obj/item/storage/part_replacer/bluespace/tier4/bst = 1, + /obj/item/gun/magic/wand/resurrection/debug = 1, + /obj/item/gun/magic/wand/death/debug = 1, + /obj/item/debug/human_spawner = 1, + /obj/item/debug/omnitool = 1, + /obj/item/storage/box/stabilized = 1, + ) + +/obj/item/storage/part_replacer/bluespace/tier4/bst + name = "\improper Bluespace Tech RPED" + desc = "A specialized bluespace RPED for technicians that can manufacture stock parts on the fly. Alt-Right-Click to manufacture parts, change settings, or clear its internal storage." + /// Whether or not auto-clear is enabled + var/auto_clear = TRUE + /// List of valid types for pick_stock_part(). + var/static/list/valid_stock_part_types = list( + /obj/item/circuitboard/machine, + /obj/item/stock_parts, + /obj/item/reagent_containers/cup/beaker, + ) + +/obj/item/storage/part_replacer/bluespace/tier4/bst/Initialize(mapload) + . = ..() + atom_storage.max_slots = 1000 + atom_storage.max_total_storage = 20000 + +/// An extension to the default RPED part replacement action - if you don't have the requisite parts in the RPED already, it will spawn T4 versions to use. +/obj/item/storage/part_replacer/bluespace/tier4/bst/part_replace_action(obj/attacked_object, mob/living/user) + // We start with setting up a list of the current contents of the RPED when using auto-clear. This is used to detect new items after upgrades are applied & remove them. + var/list/old_contents = list() + var/list/inv_grab = atom_storage.return_inv(FALSE) + if(auto_clear) + old_contents = atom_storage.return_inv(FALSE) + // Once old_contents has been initialized, if needed, we check if the target object is a machine frame. + var/obj/structure/frame/attacked_frame = attacked_object + if(istype(attacked_frame, /obj/structure/frame/machine)) + var/obj/structure/frame/machine/machine_frame = attacked_frame + var/obj/item/circuitboard/machine/circuit = machine_frame.circuit + // Prioritize using the circuit's components list first, if present, to maintain consistency. + if(istype(circuit)) + spawn_parts_for_components(user, circuit.req_components) + else if(machine_frame.req_components) + spawn_parts_for_components(user, machine_frame.req_components) + else + // It's not a machine frame, so let's check if it's a regular machine. + if(ismachinery(attacked_object) && !istype(attacked_object, /obj/machinery/computer)) + var/obj/machinery/attacked_machinery = attacked_object + var/obj/item/circuitboard/machine/circuit = attacked_machinery.circuit + // If it is, we need to use the circuit's components; there's no good way to get required components off of an already-built machine. + if(istype(circuit)) + spawn_parts_for_components(user, circuit.req_components) + . = ..() + // If auto-clear is in use, + if(auto_clear) + inv_grab.Cut() + inv_grab = atom_storage.return_inv(FALSE) + for(var/obj/item/stored_item in inv_grab) + if(!(stored_item in old_contents)) + qdel(stored_item) + +/// A bespoke proc for spawning in parts +/obj/item/storage/part_replacer/bluespace/tier4/bst/proc/spawn_parts_for_components(mob/living/user, list/required_components) + // Since req_components in machineboards can list item types *OR* /datum/stock_part subtypes this gets a little complicated. + var/list/subtypes = list() + for(var/req_component in required_components) + // Start off noting how many the recipe calls for, a counter for how many matching parts have been found, and generating a list of subtypes for use in later checks. + var/parts_amount_required = required_components[req_component] + var/found_matching = 0 + subtypes = typesof(req_component) + + if(!parts_amount_required) + continue + + /// Then, check if the requested component is an object subtype - this means it's probably either materials (e.g, cables) or non-stock_part subtypes like beakers. + if(ispath(req_component, /obj/item)) + // If it's a stack, it needs special treatment. + if(ispath(req_component, /obj/item/stack)) + // Stacks generate the matching count based on how many matching stacks are in the RPED's inventory with sufficient count. + // To find stacks inside the RPED, we search its contents for anything that's a subtype of /obj/item/stack. + for(var/obj/stored_item in contents) + var/obj/item/stack/stored_item_as_stack = stored_item + if(istype(stored_item_as_stack)) + // If a stack item is found, we check if it's in the typesof list for the current requested component, and if so, mark its count. + if(stored_item_as_stack.type in subtypes) + found_matching += stored_item_as_stack.amount + // If there's enough, we can return early. + if(found_matching >= parts_amount_required) + break + // If there's not enough left, spawn enough of the appropriate type that there will be. Stacks' Initialialize accepts an amount for the newly-spawned stack to have, and will auto-split as needed. + if(found_matching < parts_amount_required) + atom_storage.attempt_insert(new req_component(src, parts_amount_required - found_matching), user, TRUE) + continue + else + // It's not a stack, which means now we have to count how many matching items are present. + for(var/obj/stored_item in contents) + if(stored_item.type in subtypes) + found_matching += 1 + // If there's enough, we can break - no need to spawn extras. + if(found_matching >= parts_amount_required) + break + // If there's still not enough, we're going to have to spawn enough in manually. + if(found_matching < parts_amount_required) + for(var/i in 1 to parts_amount_required - found_matching) + atom_storage.attempt_insert(new req_component(src), user, TRUE) + continue + + /// If it's not an obj, then it's a subtype of /datum/stock_part - or *should be*, anyway. + else if(ispath(req_component, /datum/stock_part)) + var/datum/stock_part/part_type = new req_component() + var/base_type = part_type.physical_object_base_type + // Specific machines sometimes call for specific tiers of part; give them precisely what they ask for, just in case. + if(part_type.tier > 1) + base_type = part_type.physical_object_type + // Search to see if we have enough of that exact item, and if not, we'll spawn more. + for(var/obj/stored_item in contents) + if(stored_item.type == base_type) + found_matching += 1 + // If there's enough, we can return early. + if(found_matching >= parts_amount_required) + break + // If there's still not enough, we're going to have to spawn enough in manually. + if(found_matching < parts_amount_required) + for(var/i in 1 to parts_amount_required - found_matching) + atom_storage.attempt_insert(new base_type(src), user, TRUE) + continue + else + // For everything else, just make sure we have enough valid items of the stock part's subtypes. + subtypes = typesof(base_type) + for(var/obj/stored_item in contents) + if(stored_item.type in subtypes) + found_matching += 1 + // If there's enough, we can return early. + if(found_matching >= parts_amount_required) + break + + // If there's still not enough, we're going to have to spawn enough in manually. + if(found_matching < parts_amount_required) + // Reset the subtypes list so we can pick the highest tier of part available. + subtypes = typesof(req_component) + var/highest_tier = 0 + + // Search those subtypes for the highest. This SHOULD only ever go up to 4, but that's on the assumption upstream doesn't change it. + for(var/subtype_path in subtypes) + var/datum/stock_part/sub_part = new subtype_path() + if(sub_part.tier > highest_tier) + highest_tier = sub_part.tier + base_type = sub_part.physical_object_type + + // Once the best component has been found, fill in enough remaining. + for(var/i in 1 to parts_amount_required - found_matching) + atom_storage.attempt_insert(new base_type(src), user, TRUE) + continue + + // If it's not a /datum/stock_part subtype either, something has gone wrong and devs should probably be alerted. + if(found_matching < parts_amount_required) + to_chat(user, span_notice("Something went wrong manufacturing [req_component]. Alert the devs, and let them know what machine it was!")) + +/// BSTs' special Bluespace RPED can manufacture parts on Alt-RMB, either cables, glass, machine boards, or stock parts. +/obj/item/storage/part_replacer/bluespace/tier4/bst/alt_click_secondary(mob/user) + // Ask the user what they want to make, or if they want to clear the storage. + var/spawn_selection = tgui_input_list(user, "Pick a part, or clear storage", "RPED Manufacture", list("Clear All Items", "Toggle Auto-Clear", "Cables", "Glass", "Spare T4s", "Machine Board", "Stock Part", "Beaker")) + // If they didn't cancel out of the list selection, we do things. Clear-all removes all items, auto-clear destroys left-overs after upgrades, and everything else is pretty self-explanatory. + // Machine boards and stock parts use a recursive subtype selector. + if(isnull(spawn_selection)) + return + else if(spawn_selection == "Clear All Items") + var/list/inv_grab = atom_storage.return_inv(FALSE) + for(var/obj/item/stored_item in inv_grab) + qdel(stored_item) + else if(spawn_selection == "Toggle Auto-Clear") + auto_clear = !auto_clear + to_chat(user, span_notice("The RPED will now [(auto_clear ? "destroy" : "keep")] items left-over after upgrades.")) + else if(spawn_selection == "Cables") + atom_storage.attempt_insert(new /obj/item/stack/cable_coil(src), user, TRUE) + else if(spawn_selection == "Glass") + atom_storage.attempt_insert(new /obj/item/stack/sheet/glass/fifty(src), user, TRUE) + else if(spawn_selection == "Spare T4s") + for(var/i in 1 to 10) + atom_storage.attempt_insert(new /obj/item/stock_parts/capacitor/quadratic(src), user, TRUE) + atom_storage.attempt_insert(new /obj/item/stock_parts/scanning_module/triphasic(src), user, TRUE) + atom_storage.attempt_insert(new /obj/item/stock_parts/servo/femto(src), user, TRUE) + atom_storage.attempt_insert(new /obj/item/stock_parts/micro_laser/quadultra(src), user, TRUE) + atom_storage.attempt_insert(new /obj/item/stock_parts/matter_bin/bluespace(src), user, TRUE) + atom_storage.attempt_insert(new /obj/item/stock_parts/cell/bluespace(src), user, TRUE) + else + var/subtype + if(spawn_selection == "Machine Board") + subtype = /obj/item/circuitboard/machine + else if(spawn_selection == "Stock Part") + subtype = /obj/item/stock_parts + else if(spawn_selection == "Beaker") + subtype = /obj/item/reagent_containers/cup/beaker + if(subtype) + pick_stock_part(user, FALSE, subtype) + +/// A bespoke proc for picking a subtype to spawn in a relatively user-friendly way. +/obj/item/storage/part_replacer/bluespace/tier4/bst/proc/pick_stock_part(mob/user, recurse, subtype) + // Sanity check: make sure it's actually an item, and not an atom, machine, or whatever else someone might try to feed it down the line. + if(!is_path_in_list(subtype, valid_stock_part_types)) + return + // Stores a list of pretty type names : actual paths. + var/list/items_temp = list() + // Grab the initial list of paths, NOT INCLUDING this specific path. + var/list/paths = subtypesof(subtype) + + // Simplistic check to only list top-level subtypes. + var/list/top_level_subtypes_only = list() + for(var/datum/subtype_path as anything in paths) + if(initial(subtype_path.parent_type) != subtype) + continue + top_level_subtypes_only += subtype_path + paths = top_level_subtypes_only + + // With all sub-subtypes removed, initialize the list of valid, spawnable items & their pretty names - and if this is a recursion, include the original subtype. + if(recurse) + paths += subtype + for(var/path in paths) + var/obj/path_as_obj = path + // Generates a pretty list of item names & paths, including notes for those with subtypes. When browsing subtypes, the parent won't have the (# more) note added. + if(length(subtypesof(path))) + if(path == subtype) + items_temp["[initial(path_as_obj.name)]: [path]"] = path + else + items_temp["[initial(path_as_obj.name)] (+[length(subtypesof(path))] more): [path]"] = path + else + items_temp["[initial(path_as_obj.name)]: [path]"] = path + + // Finally, once the listed is generated, ask the user what they want to spawn. + var/target_item = tgui_input_list(user, "Select Subtype", "RPED Manufacture", sort_list(items_temp)) + if(target_item) + // If they select something, and the name:path binding is valid, then either spawn it, OR, if it has subtypes, and isn't the parent type, recurse to let them pick a subtype. + if(items_temp[target_item]) + var/the_item = items_temp[target_item] + if(length(subtypesof(the_item)) && the_item != subtype) + pick_stock_part(user, TRUE, the_item) + else + for(var/i in 1 to 25) + atom_storage.attempt_insert(new the_item(src), user, TRUE) diff --git a/modular_nova/modules/imported_vendors/code/vendors.dm b/modular_nova/modules/imported_vendors/code/vendors.dm index 0cf495b6899..12f447b3837 100644 --- a/modular_nova/modules/imported_vendors/code/vendors.dm +++ b/modular_nova/modules/imported_vendors/code/vendors.dm @@ -4,6 +4,7 @@ /obj/machinery/vending/imported/yangyu, /obj/machinery/vending/imported/mothic, /obj/machinery/vending/imported/tiziran, + /obj/machinery/vending/deforest_medvend, ) /obj/effect/spawner/random/vending/colavend //These can serve both snacks AND drinks so its kinda both of them? @@ -12,6 +13,7 @@ /obj/machinery/vending/imported/yangyu, /obj/machinery/vending/imported/mothic, /obj/machinery/vending/imported/tiziran, + /obj/machinery/vending/deforest_medvend, ) /datum/supply_pack/vending/imported/fill(obj/structure/closet/crate/target_crate) diff --git a/modular_nova/modules/loadouts/loadout_items/loadout_datum_masks.dm b/modular_nova/modules/loadouts/loadout_items/loadout_datum_masks.dm index 160ff263b0b..29faad93ed7 100644 --- a/modular_nova/modules/loadouts/loadout_items/loadout_datum_masks.dm +++ b/modular_nova/modules/loadouts/loadout_items/loadout_datum_masks.dm @@ -49,6 +49,10 @@ GLOBAL_LIST_INIT(loadout_masks, generate_loadout_items(/datum/loadout_item/mask) name = "Skull Bandana" item_path = /obj/item/clothing/mask/bandana/skull +/datum/loadout_item/mask/facescarf + name = "Facescarf" + item_path = /obj/item/clothing/mask/facescarf + /* * BALACLAVAS */ @@ -142,6 +146,10 @@ GLOBAL_LIST_INIT(loadout_masks, generate_loadout_items(/datum/loadout_item/mask) name = "Plague Doctor Mask" item_path = /obj/item/clothing/mask/gas/plaguedoctor +/datum/loadout_item/mask/rebellion + name = "Rebellion Mask" + item_path = /obj/item/clothing/mask/rebellion + /datum/loadout_item/mask/monkey name = "Monkey Mask" item_path = /obj/item/clothing/mask/gas/monkeymask @@ -150,6 +158,10 @@ GLOBAL_LIST_INIT(loadout_masks, generate_loadout_items(/datum/loadout_item/mask) name = "Owl Mask" item_path = /obj/item/clothing/mask/gas/owl_mask +/datum/loadout_item/mask/kitsune + name = "Kitsune Mask" + item_path = /obj/item/clothing/mask/kitsune + /datum/loadout_item/mask/joy name = "Joy Mask" item_path = /obj/item/clothing/mask/joy @@ -166,7 +178,6 @@ GLOBAL_LIST_INIT(loadout_masks, generate_loadout_items(/datum/loadout_item/mask) name = "Balaclava" item_path = /obj/item/clothing/mask/balaclava - /* * DONATOR */ @@ -174,7 +185,6 @@ GLOBAL_LIST_INIT(loadout_masks, generate_loadout_items(/datum/loadout_item/mask) /datum/loadout_item/mask/donator donator_only = TRUE - /datum/loadout_item/mask/donator/nightlight_mask/alldono name = "Commercial FIR-36 Rebreather" item_path = /obj/item/clothing/mask/gas/nightlight/alldono diff --git a/modular_nova/modules/loadouts/loadout_items/loadout_datum_pocket.dm b/modular_nova/modules/loadouts/loadout_items/loadout_datum_pocket.dm index 13cc3d67dd1..0055019bbae 100644 --- a/modular_nova/modules/loadouts/loadout_items/loadout_datum_pocket.dm +++ b/modular_nova/modules/loadouts/loadout_items/loadout_datum_pocket.dm @@ -38,8 +38,7 @@ GLOBAL_LIST_INIT(loadout_pocket_items, generate_loadout_items(/datum/loadout_ite id_card.forceMove(wallet) if(equipper.back) - var/list/backpack_stuff = list() - equipper.back.atom_storage?.return_inv(backpack_stuff, FALSE) + var/list/backpack_stuff = equipper.back.atom_storage?.return_inv(FALSE) for(var/obj/item/thing in backpack_stuff) if(wallet.contents.len >= 3) break diff --git a/modular_nova/modules/loadouts/loadout_items/under/loadout_datum_under.dm b/modular_nova/modules/loadouts/loadout_items/under/loadout_datum_under.dm index 37e0b197ee2..9618f48a371 100644 --- a/modular_nova/modules/loadouts/loadout_items/under/loadout_datum_under.dm +++ b/modular_nova/modules/loadouts/loadout_items/under/loadout_datum_under.dm @@ -66,6 +66,11 @@ GLOBAL_LIST_INIT(loadout_miscunders, generate_loadout_items(/datum/loadout_item/ /datum/loadout_item/under/jumpsuit/akula_wetsuit name = "Shoredress Wetsuit" item_path = /obj/item/clothing/under/akula_wetsuit + restricted_species = list(SPECIES_AKULA) + +/datum/loadout_item/under/jumpsuit/refit_wetsuit + name = "Refitted Shoredress Wetsuit" + item_path = /obj/item/clothing/under/akula_wetsuit/refit /datum/loadout_item/under/jumpsuit/impcap name = "Captain's Naval Jumpsuit" @@ -464,17 +469,25 @@ GLOBAL_LIST_INIT(loadout_miscunders, generate_loadout_items(/datum/loadout_item/ item_path = /obj/item/clothing/under/maid_costume /datum/loadout_item/under/miscellaneous/yukata - name = "Recolorable Yukata" + name = "Yukata" item_path = /obj/item/clothing/under/costume/nova/yukata /datum/loadout_item/under/miscellaneous/qipao_black - name = "Recolorable Qipao" + name = "Qipao" item_path = /obj/item/clothing/under/costume/nova/qipao +/datum/loadout_item/under/miscellaneous/qipao_recolorable + name = "Qipao, Custom Trim" + item_path = /obj/item/clothing/under/costume/nova/qipao/customtrim + /datum/loadout_item/under/miscellaneous/cheongsam - name = "Recolorable Cheongsam" + name = "Cheongsam" item_path = /obj/item/clothing/under/costume/nova/cheongsam +/datum/loadout_item/under/miscellaneous/cheongsam_recolorable + name = "Cheongsam, Custom Trim" + item_path = /obj/item/clothing/under/costume/nova/cheongsam/customtrim + /datum/loadout_item/under/miscellaneous/kimono name = "Fancy Kimono" item_path = /obj/item/clothing/under/costume/nova/kimono @@ -792,6 +805,14 @@ GLOBAL_LIST_INIT(loadout_miscunders, generate_loadout_items(/datum/loadout_item/ name = "Recolorable Formal Suitskirt" item_path = /obj/item/clothing/under/suit/nova/recolorable/skirt +/datum/loadout_item/under/formal/recolorable_suit/casual + name = "Office Casual Suit" + item_path = /obj/item/clothing/under/suit/nova/recolorable/casual + +/datum/loadout_item/under/formal/recolorable_suit/executive + name = "Executive Casual Suit" + item_path = /obj/item/clothing/under/suit/nova/recolorable/executive + /datum/loadout_item/under/formal/trek_command name = "Trekkie Command Uniform" item_path = /obj/item/clothing/under/trek/command @@ -828,6 +849,18 @@ GLOBAL_LIST_INIT(loadout_miscunders, generate_loadout_items(/datum/loadout_item/ name = "Trekkie ENT Medsci Uniform" item_path = /obj/item/clothing/under/trek/medsci/ent +/datum/loadout_item/under/formal/trek_voy_command + name = "Trekkie VOY Command Uniform" + item_path = /obj/item/clothing/under/trek/command/voy + +/datum/loadout_item/under/formal/trek_voy_engsec + name = "Trekkie VOY Engsec Uniform" + item_path = /obj/item/clothing/under/trek/engsec/voy + +/datum/loadout_item/under/formal/trek_voy_medsci + name = "Trekkie VOY Medsci Uniform" + item_path = /obj/item/clothing/under/trek/medsci/voy + /datum/loadout_item/under/formal/the_q name = "French Marshall's Uniform" item_path = /obj/item/clothing/under/trek/q @@ -854,9 +887,13 @@ GLOBAL_LIST_INIT(loadout_miscunders, generate_loadout_items(/datum/loadout_item/ item_path = /obj/item/clothing/under/suit/nova/inferno/beeze /datum/loadout_item/under/formal/pencil - name = "Black Pencilskirt" + name = "Pencilskirt with Shirt" item_path = /obj/item/clothing/under/suit/nova/pencil +/datum/loadout_item/under/formal/pencil/noshirt + name = "Pencilskirt" + item_path = /obj/item/clothing/under/suit/nova/pencil/noshirt + /datum/loadout_item/under/formal/pencil/black_really name = "Executive Pencilskirt" item_path = /obj/item/clothing/under/suit/nova/pencil/black_really @@ -874,9 +911,13 @@ GLOBAL_LIST_INIT(loadout_miscunders, generate_loadout_items(/datum/loadout_item/ item_path = /obj/item/clothing/under/suit/nova/pencil/burgandy /datum/loadout_item/under/formal/pencil/checkered - name = "Checkered Pencilskirt" + name = "Checkered Pencilskirt with Shirt" item_path = /obj/item/clothing/under/suit/nova/pencil/checkered +/datum/loadout_item/under/formal/pencil/checkered/noshirt + name = "Checkered Pencilskirt" + item_path = /obj/item/clothing/under/suit/nova/pencil/checkered/noshirt + /datum/loadout_item/under/formal/pencil/tan name = "Tan Pencilskirt" item_path = /obj/item/clothing/under/suit/nova/pencil/tan diff --git a/modular_nova/modules/mapping/code/areas/space.dm b/modular_nova/modules/mapping/code/areas/space.dm index 0ce2a4d9df6..737f9134f9b 100644 --- a/modular_nova/modules/mapping/code/areas/space.dm +++ b/modular_nova/modules/mapping/code/areas/space.dm @@ -231,7 +231,7 @@ icon_state = "dorms" /area/solars/tarkon - name = "\improper P-T Solar Array" + name = "P-T Solar Array" icon_state = "space_near" has_gravity = STANDARD_GRAVITY outdoors = TRUE diff --git a/modular_nova/modules/mapping/code/mob_spawns.dm b/modular_nova/modules/mapping/code/mob_spawns.dm index fec86c23c4e..9fd74f012d5 100644 --- a/modular_nova/modules/mapping/code/mob_spawns.dm +++ b/modular_nova/modules/mapping/code/mob_spawns.dm @@ -126,6 +126,8 @@ /obj/effect/mob_spawn/ghost_role/human/hotel_staff random_appearance = FALSE + quirks_enabled = TRUE + loadout_enabled = TRUE /obj/effect/mob_spawn/ghost_role/human/hotel_staff/manager name = "staff manager sleeper" diff --git a/modular_nova/modules/microfusion/code/_microfusion_defines.dm b/modular_nova/modules/microfusion/code/_microfusion_defines.dm deleted file mode 100644 index b44acde2567..00000000000 --- a/modular_nova/modules/microfusion/code/_microfusion_defines.dm +++ /dev/null @@ -1,54 +0,0 @@ -/// The amount of cell charge drained during a drain failure. -#define MICROFUSION_CELL_DRAIN_FAILURE 500 -/// The heavy EMP range for when a cell suffers an EMP failure. -#define MICROFUSION_CELL_EMP_HEAVY_FAILURE 2 -/// The light EMP range for when a cell suffers an EMP failure. -#define MICROFUSION_CELL_EMP_LIGHT_FAILURE 4 -/// The radiation range for when a cell suffers a radiation failure. -#define MICROFUSION_CELL_RADIATION_RANGE_FAILURE 1 - -/// The lower most time for a microfusion cell meltdown. -#define MICROFUSION_CELL_FAILURE_LOWER (10 SECONDS) -/// The upper most time for a microfusion cell meltdown. -#define MICROFUSION_CELL_FAILURE_UPPER (15 SECONDS) - -/// A charge drain failure. -#define MICROFUSION_CELL_FAILURE_TYPE_CHARGE_DRAIN 1 -/// A small explosion failure. -#define MICROFUSION_CELL_FAILURE_TYPE_EXPLOSION 2 -/// EMP failure. -#define MICROFUSION_CELL_FAILURE_TYPE_EMP 3 -/// Radiation failure. -#define MICROFUSION_CELL_FAILURE_TYPE_RADIATION 4 - -/// Returned when the phase emtiter process is successful. -#define SHOT_SUCCESS "success" -/// Returned when a gun is fired but there is no phase emitter. -#define SHOT_FAILURE_NO_EMITTER "no phase emitter!" - -/// The error message returned when the phase emitter is processed but damaged. -#define PHASE_FAILURE_DAMAGED "PHASE EMITTER: Emitter damaged!" -/// The error message returned when the phase emitter has reached it's htermal throttle. -#define PHASE_FAILURE_THROTTLE "PHASE EMITTER: Thermal throttle active!" - -/// The heat dissipation bonus of an emitter being in space! -#define PHASE_HEAT_DISSIPATION_BONUS_SPACE 30 -/// The heat dissipation bonus of an emitter being in air! -#define PHASE_HEAT_DISSIPATION_BONUS_AIR 10 - -// Slot defines for the gun. -/// The gun barrel slot. -#define GUN_SLOT_BARREL "barrel" -/// The gun underbarrel slot. -#define GUN_SLOT_UNDERBARREL "underbarrel" -/// The gun rail slot. -#define GUN_SLOT_RAIL "rail" -/// Unique slots, can hold as many as you want. -#define GUN_SLOT_UNIQUE "unique" -/// Camo slot. Because why would you put four overlapping camos on your gun? -#define GUN_SLOT_CAMO "camo" - -/// Max name size for changing names -#define GUN_MAX_NAME_CHARS 20 -/// Min name size for changing names -#define GUN_MIN_NAME_CHARS 3 diff --git a/modular_nova/modules/microfusion/code/cargo_stuff.dm b/modular_nova/modules/microfusion/code/cargo_stuff.dm deleted file mode 100644 index 05b3d84b968..00000000000 --- a/modular_nova/modules/microfusion/code/cargo_stuff.dm +++ /dev/null @@ -1,72 +0,0 @@ -/datum/supply_pack/security/armory/mcr01 - name = "MCR-01 Microfusion Crate" - desc = "Micron Control Systems Incorporated supplied MCR-01 Microfusion weapons platform. Comes with 4 advanced guns!" - cost = CARGO_CRATE_VALUE * 20 - contains = list( - /obj/item/gun/microfusion/mcr01/advanced, - /obj/item/gun/microfusion/mcr01/advanced, - /obj/item/gun/microfusion/mcr01/advanced, - /obj/item/gun/microfusion/mcr01/advanced, - ) - crate_name = "MCR-01 Microfusion Crate" - -/datum/supply_pack/security/microfusion - name = "Assorted Microfusion Upgrade Crate" - desc = "Micron Control Systems Incorporated supplied Microfusion cells and emitters!" - cost = CARGO_CRATE_VALUE * 5 - contains = list( - /obj/item/microfusion_phase_emitter/advanced, - /obj/item/microfusion_phase_emitter/advanced, - /obj/item/stock_parts/cell/microfusion/advanced, - /obj/item/stock_parts/cell/microfusion/advanced, - ) - crate_name = "Microfusion Upgrade Crate" - -/datum/supply_pack/security/mcr01_attachments_a - name = "MCR-01 Military Attachments Crate Type A" - desc = "Micron Control Systems Incorporated supplied MCR-01 Military spec attachments! This crate comes with two utilitarian repeater loadout." - cost = CARGO_CRATE_VALUE * 14 - contains = list( - /obj/item/microfusion_gun_attachment/grip, - /obj/item/microfusion_gun_attachment/grip, - /obj/item/microfusion_gun_attachment/rail, - /obj/item/microfusion_gun_attachment/rail, - /obj/item/microfusion_gun_attachment/barrel/repeater, - /obj/item/microfusion_gun_attachment/barrel/repeater, - ) - crate_name = "MCR-01 Military Attachments Crate Type A" - -/datum/supply_pack/security/mcr01_attachments_type_b - name = "MCR-01 Military Attachments Crate Type B" - desc = "Micron Control Systems Incorporated supplied MCR-01 Military spec attachments! This crate comes in a mixed specialist loadout." - cost = CARGO_CRATE_VALUE * 16 - contains = list( - /obj/item/microfusion_gun_attachment/grip, - /obj/item/microfusion_gun_attachment/grip, - /obj/item/microfusion_gun_attachment/grip, - /obj/item/microfusion_gun_attachment/barrel/scatter, - /obj/item/microfusion_gun_attachment/barrel/scatter, - /obj/item/microfusion_gun_attachment/barrel/scatter, - /obj/item/microfusion_gun_attachment/scope, - /obj/item/microfusion_gun_attachment/barrel/lance, - ) - crate_name = "MCR-01 Military Attachments Crate Type B" - - -/datum/supply_pack/security/mcr01_attachments_h - name = "HCR-01 Military Attachments Crate Type H" - desc = "Honkicron Clownery Systems Inhonkorated supplied HCR-01 Clownery spec attachments! This crate oddly smells of bananas." - cost = CARGO_CRATE_VALUE * 20 - contraband = TRUE - contains = list( - /obj/item/microfusion_gun_attachment/barrel/honk, - /obj/item/microfusion_gun_attachment/barrel/honk, - /obj/item/microfusion_gun_attachment/barrel/honk, - /obj/item/microfusion_gun_attachment/camo/honk, - /obj/item/microfusion_gun_attachment/camo/honk, - /obj/item/microfusion_gun_attachment/camo/honk, - /obj/item/food/pie/cream, - /obj/item/food/pie/cream, - /obj/item/food/pie/cream, - ) - crate_name = "MCR-01 Military Attachments Crate Type H" diff --git a/modular_nova/modules/microfusion/code/gun_types.dm b/modular_nova/modules/microfusion/code/gun_types.dm deleted file mode 100644 index 052e3b32db1..00000000000 --- a/modular_nova/modules/microfusion/code/gun_types.dm +++ /dev/null @@ -1,58 +0,0 @@ -/obj/item/gun/microfusion/mcr01 - name = "MCR-01" - desc = "An advanced, modular energy weapon produced by Micron Control Systems. These cutting edge weapons differ from traditional beam weaponry in producing individual bolts, as well as being customizable to the user's preferences." - icon_state = "mcr01" - inhand_icon_state = "mcr01" - shaded_charge = TRUE - -/obj/item/gun/microfusion/mcr01/give_manufacturer_examine() - AddElement(/datum/element/manufacturer_examine, COMPANY_MICRON) - -/// Gun for cargo crates. -/obj/item/gun/microfusion/mcr01/advanced - name = "advanced MCR-01" - cell_type = /obj/item/stock_parts/cell/microfusion/advanced - phase_emitter_type = /obj/item/microfusion_phase_emitter/advanced - -/* THESE ARE STILL UTTERLY BROKEN -/obj/item/gun/microfusion/mcr01/nanocarbon - name = "Nanocarbon Destroyer" - desc = "The pinnacle of the Nanocarbon weapon line. This weapon is the ultimate in power and performance. It is capable of firing a wide variety of beams, including a wide range of energy types, and is capable of firing a wide variety of frequencies." - icon_state = "mcr01" - inhand_icon_state = "mcr01" - shaded_charge = TRUE - phase_emitter_type = /obj/item/microfusion_phase_emitter/nanocarbon - cell_type = /obj/item/stock_parts/cell/microfusion/nanocarbon - attachments = list( - /obj/item/microfusion_gun_attachment/pulse, - /obj/item/microfusion_gun_attachment/grip, - /obj/item/microfusion_gun_attachment/rail, - /obj/item/microfusion_gun_attachment/camo, - ) - -//For syndicate uplink. -/obj/item/gun/microfusion/mcr01/syndie - name = "SCR-01" - desc = "A Syndicate brand copy of the MCR-01. It comes with a proprietary suppressor and some tactical attachments." - cell_type = /obj/item/stock_parts/cell/microfusion/advanced - phase_emitter_type = /obj/item/microfusion_phase_emitter/advanced - attachments = list( - /obj/item/microfusion_gun_attachment/barrel/suppressor, - /obj/item/microfusion_gun_attachment/grip, - /obj/item/microfusion_gun_attachment/rail, - /obj/item/microfusion_gun_attachment/syndi_camo, - ) -*/ - -/* -* MICROFUSION SPAWNERS -*/ - -/obj/effect/spawner/armory_spawn/microfusion - guns = list( - /obj/item/gun/microfusion/mcr01, - /obj/item/gun/microfusion/mcr01, - /obj/item/gun/microfusion/mcr01, - /obj/item/gun/microfusion/mcr01, - ) - diff --git a/modular_nova/modules/microfusion/code/microfusion_cell.dm b/modular_nova/modules/microfusion/code/microfusion_cell.dm deleted file mode 100644 index 8323a3e0738..00000000000 --- a/modular_nova/modules/microfusion/code/microfusion_cell.dm +++ /dev/null @@ -1,215 +0,0 @@ -// FLUFFY FRONTIER EDIT NOTE: ДАННЫЙ ФАЙЛ БЫЛ ЧАСТИЧНО ПОДВЕРГНУТ ПЕРЕЗАПИСИ ПО ПУТИ tff_modular\modules\mcr_nerf_revert\code\mcr_override.dm! В СЛУЧАЕ ВОЗМОЖНЫХ ОШИБОК ВЫЗВАННЫХ ИЗМЕНЕНИЯМИ ТУТ - СМОТРИТЕ ФАЙЛ С ПЕРЕЗАПИСЯМИ. - -/* -MICROFUSION CELL SYSTEM - -Microfusion cells are small battery units that house controlled nuclear fusion within, and that fusion is converted into useable energy. - -Essentially, power cells that malfunction if not used in an MCR, and should only be able to charge inside of one -*/ - -/obj/item/stock_parts/cell/microfusion //Just a standard cell. - name = "microfusion cell" - desc = "A standard-issue microfusion cell, produced by Micron Control Systems. For safety reasons, they cannot be charged unless they are inside of a compatible Micron Control Systems firearm." - icon = 'modular_nova/modules/microfusion/icons/microfusion_cells.dmi' - charging_icon = "mf_in" //This is stored in cell.dmi in the aesthetics module - icon_state = "microfusion" - w_class = WEIGHT_CLASS_NORMAL - maxcharge = 1200 //12 shots - chargerate = 0 //MF cells should be unable to recharge if they are not currently inside of an MCR - microfusion_readout = TRUE - empty = TRUE //MF cells should start empty - - /// A hard referenced list of upgrades currently attached to the weapon. - var/list/attachments = list() - /// Are we melting down? For icon stuffs. - var/meltdown = FALSE - /// How many upgrades can you have on this cell? - var/max_attachments = 1 - /// Hard ref to the parent gun. - var/obj/item/gun/microfusion/parent_gun - /// Do we play an alarm when empty? - var/empty_alarm = TRUE - /// What sound do we play when empty? - var/empty_alarm_sound = 'sound/weapons/gun/general/empty_alarm.ogg' - /// Do we have the self charging upgrade? - var/self_charging = FALSE - /// The probability of the cell failing, either through being makeshift or being used in something it shouldn't - var/fail_prob = 10 - -/obj/item/stock_parts/cell - /// Is this cell stabilised? (used in microfusion guns) - var/stabilised = FALSE - /// Do we show the microfusion readout instead of KJ? - var/microfusion_readout = FALSE - -/obj/item/stock_parts/cell/microfusion/Initialize(mapload) - . = ..() - START_PROCESSING(SSobj, src) - -/obj/item/stock_parts/cell/microfusion/Destroy() - if(attachments.len) - for(var/obj/item/iterating_item as anything in attachments) - iterating_item.forceMove(get_turf(src)) - attachments = null - parent_gun = null - STOP_PROCESSING(SSobj, src) - return ..() - -/obj/item/stock_parts/cell/microfusion/attackby(obj/item/attacking_item, mob/living/user, params) - if(istype(attacking_item, /obj/item/microfusion_cell_attachment)) - add_attachment(attacking_item, user) - return - return ..() - -/obj/item/stock_parts/cell/microfusion/attack_self(mob/user) - if(charge) - cell_removal_discharge() - return ..() - -/obj/item/stock_parts/cell/microfusion/emp_act(severity) - var/prob_percent = charge / 100 * severity - if(prob(prob_percent) && !meltdown && !stabilised) - process_instability() - -/obj/item/stock_parts/cell/microfusion/use(amount) - if(!parent_gun) // If an MCR cell is used in anything that's not an MCR, you might have problems - if(prob(fail_prob)) - process_instability() - if(charge >= amount) - var/check_if_empty = charge - amount - if(check_if_empty < amount && empty_alarm && !self_charging) - playsound(src, empty_alarm_sound, 50) - return ..() - -/obj/item/stock_parts/cell/microfusion/proc/process_instability() - var/seconds_to_explode = rand(MICROFUSION_CELL_FAILURE_LOWER, MICROFUSION_CELL_FAILURE_UPPER) - meltdown = TRUE - say("Malfunction in [seconds_to_explode / 10] seconds!") - playsound(src, 'sound/machines/warning-buzzer.ogg', 30, FALSE, FALSE) - add_filter("rad_glow", 2, list("type" = "outline", "color" = "#ff5e0049", "size" = 2)) - addtimer(CALLBACK(src, PROC_REF(process_failure)), seconds_to_explode) - -/obj/item/stock_parts/cell/microfusion/proc/process_failure() - var/fuckup_type = rand(1, 4) - remove_filter("rad_glow") - playsound(src, 'sound/effects/spray.ogg', 70) - switch(fuckup_type) - if(MICROFUSION_CELL_FAILURE_TYPE_CHARGE_DRAIN) - charge = clamp(charge - MICROFUSION_CELL_DRAIN_FAILURE, 0, maxcharge) - if(MICROFUSION_CELL_FAILURE_TYPE_EXPLOSION) - explode() - if(MICROFUSION_CELL_FAILURE_TYPE_EMP) - empulse(get_turf(src), MICROFUSION_CELL_EMP_HEAVY_FAILURE, MICROFUSION_CELL_EMP_LIGHT_FAILURE, FALSE) - if(MICROFUSION_CELL_FAILURE_TYPE_RADIATION) - radiation_pulse(src, MICROFUSION_CELL_RADIATION_RANGE_FAILURE, RAD_MEDIUM_INSULATION) - meltdown = FALSE - -/obj/item/stock_parts/cell/microfusion/update_overlays() - . = ..() - for(var/obj/item/microfusion_cell_attachment/microfusion_cell_attachment as anything in attachments) - . += microfusion_cell_attachment.attachment_overlay_icon_state - -/obj/item/stock_parts/cell/microfusion/screwdriver_act(mob/living/user, obj/item/tool) - if(!attachments.len) - balloon_alert(user, "no attachments!") - return - remove_attachments() - playsound(src, 'sound/items/screwdriver.ogg', 70, TRUE) - balloon_alert(user, "attachments removed") - -/obj/item/stock_parts/cell/microfusion/process(seconds_per_tick) - for(var/obj/item/microfusion_cell_attachment/microfusion_cell_attachment as anything in attachments) - microfusion_cell_attachment.process_attachment(src, seconds_per_tick) - -/obj/item/stock_parts/cell/microfusion/examine(mob/user) - . = ..() - . += span_notice("It can hold [max_attachments] attachment(s).") - . += span_warning("Inserting this into anything other than a microfusion rifle might be a terrible idea.") - if(attachments.len) - for(var/obj/item/microfusion_cell_attachment/microfusion_cell_attachment as anything in attachments) - . += span_notice("It has a [microfusion_cell_attachment.name] installed.") - . += span_notice("Use a screwdriver to remove the attachments.") - . += span_notice("Using this in hand will discharge the cell, if there is any inside of it preventing insertion into microfusion guns.") - -/obj/item/stock_parts/cell/microfusion/proc/add_attachment(obj/item/microfusion_cell_attachment/microfusion_cell_attachment, mob/living/user, obj/item/gun/microfusion/microfusion_gun) - if(attachments.len >= max_attachments) - balloon_alert(user, "can't attach more!") - return FALSE - if(is_type_in_list(microfusion_cell_attachment, attachments)) - balloon_alert(user, "already installed!") - return FALSE - attachments += microfusion_cell_attachment - microfusion_cell_attachment.forceMove(src) - microfusion_cell_attachment.add_attachment(src) - balloon_alert(user, "installed attachment") - playsound(src, 'sound/effects/structure_stress/pop2.ogg', 70, TRUE) - update_appearance() - return TRUE - -/obj/item/stock_parts/cell/microfusion/proc/remove_attachments() - for(var/obj/item/microfusion_cell_attachment/microfusion_cell_attachment in attachments) - microfusion_cell_attachment.remove_attachment(src) - microfusion_cell_attachment.forceMove(get_turf(src)) - attachments -= microfusion_cell_attachment - update_appearance() - -/obj/item/stock_parts/cell/microfusion/proc/inserted_into_weapon() - chargerate = 300 - -/obj/item/stock_parts/cell/microfusion/proc/cell_removal_discharge() - chargerate = 0 - charge = 0 - do_sparks(4, FALSE, src) - update_appearance() - -/datum/crafting_recipe/makeshift/microfusion_cell - name = "Makeshift Microfusion Cell" - tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER, TOOL_WELDER) - result = /obj/item/stock_parts/cell/microfusion/makeshift - reqs = list(/obj/item/trash/can = 1, - /obj/item/stack/sheet/iron = 1, - /obj/item/stack/cable_coil = 1) - time = 12 SECONDS - category = CAT_MISC - -//WHY WOULD YOU MAKE THIS? -/obj/item/stock_parts/cell/microfusion/makeshift - name = "makeshift microfusion cell" - desc = "An... Apparatus, comprised of an everyday aluminum can with several civilian-grade batteries tightly packed together and plugged in. This vaguely resembles a microfusion cell, if you tilt your head to a precise fifty degree angle. While the effects on enemy combatants may be dubious, it will certainly do incredible damage to the gun's warranty. What the hell were you thinking when you came up with this?" - icon_state = "microfusion_makeshift" - maxcharge = 600 - max_attachments = 0 - -/obj/item/stock_parts/cell/microfusion/makeshift/use(amount) - if(prob(fail_prob)) - process_instability() - return ..() - -/obj/item/stock_parts/cell/microfusion/enhanced - name = "enhanced microfusion cell" - desc = "A second generation microfusion cell, weighing about the same as the standard-issue cell and having the same space for attachments; however, it has a higher capacity." - icon_state = "microfusion_enhanced" - maxcharge = 1500 - -/obj/item/stock_parts/cell/microfusion/advanced - name = "advanced microfusion cell" - desc = "A third generation microfusion cell, boasting a much higher shot count. Additionally, these come with support for up to three modifications to the cell itself." - icon_state = "microfusion_advanced" - maxcharge = 1700 - max_attachments = 3 - -/obj/item/stock_parts/cell/microfusion/bluespace - name = "bluespace microfusion cell" - desc = "A fourth generation microfusion cell, employing bluespace technology to store power in a medium that's bigger on the inside. This has capacity for four modifications to the cell." - icon_state = "microfusion_bluespace" - maxcharge = 2000 - max_attachments = 4 - -/obj/item/stock_parts/cell/microfusion/nanocarbon - name = "nanocarbon fusion cell" - desc = "This cell combines both top-of-the-line nanotech and advanced microfusion power to brute force the most common issue of Nanotrasen Asset Protection operatives, ammunition, through sheer volume. Intended for use with Nanotrasen-brand capacitor arrays only. Warranty void if dropped in toilet." - icon_state = "microfusion_nanocarbon" - maxcharge = 30000 - max_attachments = 420 - diff --git a/modular_nova/modules/microfusion/code/microfusion_cell_attachments.dm b/modular_nova/modules/microfusion/code/microfusion_cell_attachments.dm deleted file mode 100644 index 17737b81b49..00000000000 --- a/modular_nova/modules/microfusion/code/microfusion_cell_attachments.dm +++ /dev/null @@ -1,111 +0,0 @@ -/* -MICROFUSION CELL UPGRADE ATTACHMENTS - -For adding unique abilities to microfusion cells. These cannot directly interact with the gun. -*/ - -/obj/item/microfusion_cell_attachment - name = "microfusion cell attachment" - desc = "broken" - icon = 'modular_nova/modules/microfusion/icons/microfusion_cells.dmi' - w_class = WEIGHT_CLASS_NORMAL - /// The overlay that will be automatically added, must be in the cells icon. - var/attachment_overlay_icon_state - - -/obj/item/microfusion_cell_attachment/proc/add_attachment(obj/item/stock_parts/cell/microfusion/microfusion_cell) - SHOULD_CALL_PARENT(TRUE) - START_PROCESSING(SSobj, microfusion_cell) - return - -/obj/item/microfusion_cell_attachment/proc/process_attachment(obj/item/stock_parts/cell/microfusion/microfusion_cell, seconds_per_tick) - return PROCESS_KILL - -/obj/item/microfusion_cell_attachment/proc/remove_attachment(obj/item/stock_parts/cell/microfusion/microfusion_cell) - SHOULD_CALL_PARENT(TRUE) - STOP_PROCESSING(SSobj, microfusion_cell) - return - -/* -OVERCAPACITY ATTACHMENT - -Increases the cell capacity by a set percentage. -*/ - -/obj/item/microfusion_cell_attachment/overcapacity - name = "overcapacity microfusion cell attachment" - desc = "An attachment which increases the capacity of the microfusion cell it's attached to. These are an additional, smaller capacitor, using a system to automatically switch from the cell to the capacitor as it's depleted, maximizing the weapon's charge." - icon_state = "attachment_overcapacity" - attachment_overlay_icon_state = "microfusion_overcapacity" - /// How much the attachment increases the cell's capacity by, as a percentage - var/capacity_increase = 20 - /// The initial capacity of the cell before this upgrade is added! - var/initial_charge_capacity = 0 - -/obj/item/microfusion_cell_attachment/overcapacity/add_attachment(obj/item/stock_parts/cell/microfusion/microfusion_cell) - . = ..() - initial_charge_capacity = microfusion_cell.maxcharge - var/capacity_to_add = microfusion_cell.maxcharge / 100 * capacity_increase - microfusion_cell.maxcharge += capacity_to_add - -/obj/item/microfusion_cell_attachment/overcapacity/remove_attachment(obj/item/stock_parts/cell/microfusion/microfusion_cell) - . = ..() - microfusion_cell.charge = min(microfusion_cell.charge, initial_charge_capacity) - microfusion_cell.maxcharge = initial_charge_capacity - initial_charge_capacity = 0 - -/* -STABILISER ATTACHMENT - -The cell is stable and will not emit sparks when firing. -*/ - -/obj/item/microfusion_cell_attachment/stabiliser - name = "stabilising microfusion cell attachment" - desc = "A stabilizer system attachment combining a grounding system with additional containment coils for self-charging purposes, this gives additional safety to the cell it's attached to; preventing both sparks and leakage." - icon_state = "attachment_stabiliser" - attachment_overlay_icon_state = "microfusion_stabiliser" - -/obj/item/microfusion_cell_attachment/stabiliser/add_attachment(obj/item/stock_parts/cell/microfusion/microfusion_cell) - . = ..() - microfusion_cell.stabilised = TRUE - -/obj/item/microfusion_cell_attachment/stabiliser/remove_attachment(obj/item/stock_parts/cell/microfusion/microfusion_cell) - . = ..() - microfusion_cell.stabilised = FALSE - -/* -SELFCHARGE ATTACHMENT - -The cell will charge itself. -If the cell isn't stabilised by a stabiliser, it may emit a radiation pulse. -*/ - -/obj/item/microfusion_cell_attachment/selfcharging - name = "self-charging microfusion cell attachment" - desc = "While microfusion cells are normally shipped without their fuel source, this attachment comes with fifteen grams of hydrogen fuel; allowing the cell to sustain a small, yet active reaction to self-charge. These can keep going for weeks to months in ideal conditions, making them more than enough for most campaigns." - icon_state = "attachment_selfcharge" - attachment_overlay_icon_state = "microfusion_selfcharge" - /// The amount of charge this cell will passively gain! - var/self_charge_amount = 20 - -/obj/item/microfusion_cell_attachment/selfcharging/examine(mob/user) - . = ..() - . += span_warning("WARNING: May cause radiation burns and weapon instability if not stabilized with recommended attachment!") - -/obj/item/microfusion_cell_attachment/selfcharging/add_attachment(obj/item/stock_parts/cell/microfusion/microfusion_cell) - . = ..() - microfusion_cell.self_charging = TRUE - -/obj/item/microfusion_cell_attachment/selfcharging/remove_attachment(obj/item/stock_parts/cell/microfusion/microfusion_cell) - . = ..() - microfusion_cell.self_charging = FALSE - -/obj/item/microfusion_cell_attachment/selfcharging/process_attachment(obj/item/stock_parts/cell/microfusion/microfusion_cell, seconds_per_tick) - if(!microfusion_cell.parent_gun) - return - if(microfusion_cell.charge < microfusion_cell.maxcharge) - microfusion_cell.give(self_charge_amount * seconds_per_tick) - microfusion_cell.parent_gun.update_appearance() - if(!microfusion_cell.stabilised && SPT_PROB(1, seconds_per_tick)) - radiation_pulse(src, 1, RAD_MEDIUM_INSULATION) diff --git a/modular_nova/modules/microfusion/code/microfusion_designs.dm b/modular_nova/modules/microfusion/code/microfusion_designs.dm deleted file mode 100644 index 861b8ed9c1a..00000000000 --- a/modular_nova/modules/microfusion/code/microfusion_designs.dm +++ /dev/null @@ -1,436 +0,0 @@ -#define RND_CATEGORY_MICROFUSION_WEAPONS "/Weaponry (Microfusion)" -#define RND_MICROFUSION_CELLS "/Cells" -#define RND_MICROFUSION_CELL_ATTACHMENTS "/Cell Attachments" -#define RND_MICROFUSION_EMITTERS "/Phase Emitters" -// god forgive me -#define RND_MICROFUSION_ATTACHMENT "/Attachments" -#define RND_MICROFUSION_ATTACHMENT_BARREL " (Barrel)" -#define RND_MICROFUSION_ATTACHMENT_UNDERBARREL " (Underbarrel)" -#define RND_MICROFUSION_ATTACHMENT_RAIL " (Rail)" -#define RND_MICROFUSION_ATTACHMENT_UNIQUE " (Cosmetic)" - -// BASE FOR MCR DESIGNS -/datum/design/microfusion - name = "Microfusion Part" - build_type = PROTOLATHE | AWAY_LATHE - departmental_flags = DEPARTMENT_BITFLAG_SECURITY - construction_time = 10 SECONDS //dunno if this is for mechfabs or what but I'll keep this anyway - category = list( - RND_CATEGORY_MICROFUSION_WEAPONS, - ) - -// EMITTERS - -/datum/design/microfusion/phase_emitter - name = "Placeholder Microfusion Phase Emitter" - desc = "You shouldn't see this. Still, odd how there's no basic phase emitter design, despite how redundant it'd be." - category = list( - RND_CATEGORY_MICROFUSION_WEAPONS + RND_MICROFUSION_EMITTERS, - ) - -/datum/design/microfusion/phase_emitter/enhanced - name = "Enhanced Microfusion Phase Emitter" - desc = "The core of a microfusion projection weapon, produces the laser." - id = "enhanced_microfusion_phase_emitter" - materials = list( - /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT, - ) - build_path = /obj/item/microfusion_phase_emitter/enhanced - -/datum/design/microfusion/phase_emitter/advanced - name = "Advanced Microfusion Phase Emitter" - id = "advanced_microfusion_phase_emitter" - materials = list( - /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/gold = HALF_SHEET_MATERIAL_AMOUNT, - ) - build_path = /obj/item/microfusion_phase_emitter/advanced - -/datum/design/microfusion/phase_emitter/bluespace - name = "Bluespace Microfusion Phase Emitter" - id = "bluespace_microfusion_phase_emitter" - materials = list( - /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/gold = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/diamond = HALF_SHEET_MATERIAL_AMOUNT, - ) - build_path = /obj/item/microfusion_phase_emitter/bluespace - -// CELLS - -/datum/design/microfusion/cell - name = "Microfusion Cell" - desc = "A microfusion cell. There's a basic type defined next to this, right?" - category = list( - RND_CATEGORY_MICROFUSION_WEAPONS + RND_MICROFUSION_CELLS, - ) - -/datum/design/microfusion/cell/basic - name = "Basic Microfusion Cell" - desc = "A basic microfusion cell with a capacity of 1200 MF and and 1 attachment point." - id = "basic_microfusion_cell" - build_type = PROTOLATHE | AWAY_LATHE | AUTOLATHE - materials = list( - /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/glass = SMALL_MATERIAL_AMOUNT * 2, - ) - build_path = /obj/item/stock_parts/cell/microfusion - category = list( - RND_CATEGORY_INITIAL, - RND_CATEGORY_MICROFUSION_WEAPONS + RND_MICROFUSION_CELLS, - ) - -/datum/design/microfusion/cell/enhanced - name = "Enhanced Microfusion Cell" - desc = "An enhanced microfusion cell with a capacity of 1500 MF and 1 attachment point." - id = "enhanced_microfusion_cell" - materials = list( - /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/glass = SMALL_MATERIAL_AMOUNT * 2, - /datum/material/uranium = SMALL_MATERIAL_AMOUNT * 2, - ) - build_path = /obj/item/stock_parts/cell/microfusion/enhanced - -/datum/design/microfusion/cell/advanced - name = "Advanced Microfusion Cell" - desc = "An advanced microfusion cell with a capacity of 1700 MF and 3 attachment points." - id = "advanced_microfusion_cell" - materials = list( - /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/gold = SMALL_MATERIAL_AMOUNT * 3, - /datum/material/silver = SMALL_MATERIAL_AMOUNT * 3, - /datum/material/glass = SMALL_MATERIAL_AMOUNT * 3, - /datum/material/uranium = SMALL_MATERIAL_AMOUNT * 3, - ) - build_path = /obj/item/stock_parts/cell/microfusion/advanced - -/datum/design/microfusion/cell/bluespace - name = "Bluespace Microfusion Cell" - desc = "A bluespace microfusion cell with a capacity of 2000 MF and 3 attachment points." - id = "bluespace_microfusion_cell" - materials = list( - /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/gold = SMALL_MATERIAL_AMOUNT * 3, - /datum/material/glass = SMALL_MATERIAL_AMOUNT * 3, - /datum/material/diamond = SMALL_MATERIAL_AMOUNT * 3, - /datum/material/uranium = SMALL_MATERIAL_AMOUNT * 3, - /datum/material/titanium = SMALL_MATERIAL_AMOUNT * 3, - /datum/material/bluespace = SMALL_MATERIAL_AMOUNT * 3, - ) - build_path = /obj/item/stock_parts/cell/microfusion/bluespace - -// CELL UPGRADES - -/datum/design/microfusion/cell_attachment - name = "Placeholder Cell Attachment" - desc = "You shouldn't be seeing this." - category = list( - RND_CATEGORY_MICROFUSION_WEAPONS + RND_MICROFUSION_CELL_ATTACHMENTS, - ) - -/datum/design/microfusion/cell_attachment/stabilising - name = "Stabilising Microfusion Cell Attachment" - desc = "Stabilises the internal fusion reaction of microfusion cells, preventing sparks during firing and occasional radiation pulses when used in tandem with a self-charging attachment." - id = "microfusion_cell_attachment_stabiliser" - materials = list( - /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/plasma = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT, - ) - build_path = /obj/item/microfusion_cell_attachment/stabiliser - -/datum/design/microfusion/cell_attachment/overcapacity - name = "Overcapacity Microfusion Cell Attachment" - desc = "An attachment for microfusion cells that increases MF capacity." - id = "microfusion_cell_attachment_overcapacity" - materials = list( - /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/plasma = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/gold = SHEET_MATERIAL_AMOUNT * 4, - ) - build_path = /obj/item/microfusion_cell_attachment/overcapacity - -/datum/design/microfusion/cell_attachment/selfcharging - name = "Self-Charging Microfusion Cell Attachment" - desc = "Contains a small amount of infinitely decaying nuclear material, causing the fusion reaction to be self sustaining. WARNING: May cause radiation burns if not stabilised." - id = "microfusion_cell_attachment_selfcharging" - materials = list( - /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/diamond = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/uranium = SHEET_MATERIAL_AMOUNT * 3, - /datum/material/titanium = SHEET_MATERIAL_AMOUNT * 3, - /datum/material/bluespace = SHEET_MATERIAL_AMOUNT, - ) - build_path = /obj/item/microfusion_cell_attachment/selfcharging - -/datum/design/microfusion/attachment - name = "Placeholder MCR Attachment" - desc = "You *really* shouldn't be seeing this. Now in different attachment flavors! The Req line will hate you." - category = list( - RND_CATEGORY_MICROFUSION_WEAPONS + RND_MICROFUSION_ATTACHMENT, - ) - -// RAIL MODS - -/datum/design/microfusion/attachment/rail_slot - name = "Placeholder Microfusion Rail Slot Attachment" - category = list( - RND_CATEGORY_MICROFUSION_WEAPONS + RND_MICROFUSION_ATTACHMENT + RND_MICROFUSION_ATTACHMENT_RAIL, - ) - -/datum/design/microfusion/attachment/rail_slot/rail - name = "Microfusion Weapon Rail" - desc = "A carrying handle/rail system for any additional attachments, such as a seclite and/or bayonet." - id = "microfusion_gun_attachment_rail" - materials = list( - /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/gold = HALF_SHEET_MATERIAL_AMOUNT, - ) - build_path = /obj/item/microfusion_gun_attachment/rail - -/datum/design/microfusion/attachment/rail_slot/scope - name = "Microfusion Weapon Scope" - desc = "A scope. For microfusion weapon platforms, probably." - id = "microfusion_gun_attachment_scope" - materials = list( - /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT, - ) - build_path = /obj/item/microfusion_gun_attachment/scope - -// UNDERBARREL MODS - -/datum/design/microfusion/attachment/underbarrel - name = "Placeholder Microfusion Underbarrel Slot Attachment" - category = list( - RND_CATEGORY_MICROFUSION_WEAPONS + RND_MICROFUSION_ATTACHMENT + RND_MICROFUSION_ATTACHMENT_UNDERBARREL, - ) - -/datum/design/microfusion/attachment/underbarrel/grip - name = "Microfusion Weapon Grip" - desc = "A grip. For microfusion weapon platforms, ostensibly." - id = "microfusion_gun_attachment_grip" - materials = list( - /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT, - ) - build_path = /obj/item/microfusion_gun_attachment/grip - -/datum/design/microfusion/attachment/underbarrel/heatsink - name = "Phase Emitter Heatsink" - desc = "A heatsink attachment for your microfusion weapon. Massively increases cooling potential." - id = "microfusion_gun_attachment_heatsink" - materials = list( - /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/gold = HALF_SHEET_MATERIAL_AMOUNT, - ) - build_path = /obj/item/microfusion_gun_attachment/heatsink - -// BARREL MODS (there's a lot) - -/datum/design/microfusion/attachment/barrel - name = "Placeholder Microfusion Barrel Slot Attachment" - category = list( - RND_CATEGORY_MICROFUSION_WEAPONS + RND_MICROFUSION_ATTACHMENT + RND_MICROFUSION_ATTACHMENT_BARREL, - ) - -/datum/design/microfusion/attachment/barrel/suppressor - name = "Suppressor Lens Attachment" - desc = "An experimental barrel attachment that dampens the soundwave of the emitter, suppressing the report. Does not make the lasers themselves more stealthy, as they are lasers." - id = "microfusion_gun_attachment_suppressor" - materials = list( - /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT, - ) - build_path = /obj/item/microfusion_gun_attachment/barrel/suppressor - -/datum/design/microfusion/attachment/barrel/honk - name = "Bananium Phase Emitter \"Upgrade\"" - desc = "Makes your lasers into the greatest clowning tool ever made. HONK!" - id = "microfusion_gun_attachment_honk" - materials = list( - /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/bananium = HALF_SHEET_MATERIAL_AMOUNT, - ) - build_path = /obj/item/microfusion_gun_attachment/barrel/honk - -/datum/design/microfusion/attachment/barrel/lance - name = "Lance Induction Carriage" - desc = "Turns the gun into a designated marksman rifle." - id = "microfusion_gun_attachment_lance" - materials = list( - /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/diamond = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/plasma = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT, - ) - build_path = /obj/item/microfusion_gun_attachment/barrel/lance - -// EMITTER UPGRADES (they're still barrel upgrades, though) - -/datum/design/microfusion/attachment/barrel/scatter - name = "Diffuser Microfusion Lens Attachment" - desc = "Splits the microfusion laser beam entering the lens." - id = "microfusion_gun_attachment_scatter" - materials = list( - /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/diamond = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT, - ) - build_path = /obj/item/microfusion_gun_attachment/barrel/scatter - -/datum/design/microfusion/attachment/barrel/scatter/max - name = "Crystalline Diffuser Microfusion Lens Attachment" - desc = "Splits the microfusion laser beam entering the lens even more." - id = "microfusion_gun_attachment_scattermax" - materials = list( - /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/diamond = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT, - ) - build_path = /obj/item/microfusion_gun_attachment/barrel/scatter/max - -/datum/design/microfusion/attachment/barrel/superheat - name = "Superheating Phase Emitter Upgrade" - desc = "Superheats the beam, causing targets to ignite." - id = "microfusion_gun_attachment_superheat" - materials = list( - /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/diamond = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/plasma = HALF_SHEET_MATERIAL_AMOUNT, - ) - build_path = /obj/item/microfusion_gun_attachment/barrel/superheat - -/datum/design/microfusion/attachment/barrel/hellfire - name = "Hellfire Phase Emitter Upgrade" - desc = "Overheats the beam, causing nastier wounds and higher damage." - id = "microfusion_gun_attachment_hellfire" - materials = list( - /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/diamond = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/plasma = HALF_SHEET_MATERIAL_AMOUNT, - ) - build_path = /obj/item/microfusion_gun_attachment/barrel/hellfire - -/datum/design/microfusion/attachment/barrel/repeater - name = "Repeating Phase Emitter Upgrade" - desc = "Upgrades the central phase emitter to repeat twice." - id = "microfusion_gun_attachment_repeater" - materials = list( - /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/diamond = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT, - ) - build_path = /obj/item/microfusion_gun_attachment/barrel/repeater - -/datum/design/microfusion/attachment/barrel/repeater/penetrator - name = "Focused Repeating Phase Emitter Upgrade" - desc = "Upgrades the central phase emitter to repeat twice and penetrate armor." - id = "microfusion_gun_attachment_penetrator" - materials = list( - /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/diamond = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT, - ) - build_path = /obj/item/microfusion_gun_attachment/barrel/repeater/penetrator - -/datum/design/microfusion/attachment/barrel/xray - name = "Phase Inverter Emitter Array" - desc = "Experimental technology that inverts the central phase emitter causing the wave frequency to shift into X-rays that pierce solid objects. CAUTION: Phase emitter heats up very quickly." - id = "microfusion_gun_attachment_xray" - materials = list( - /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/diamond = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/uranium = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT, - ) - build_path = /obj/item/microfusion_gun_attachment/barrel/xray - -// COSMETICS - -/datum/design/microfusion/attachment/unique - name = "Placeholder Microfusion Unique/Cosmetic Attachment" - category = list( - RND_CATEGORY_MICROFUSION_WEAPONS + RND_MICROFUSION_ATTACHMENT + RND_MICROFUSION_ATTACHMENT_UNIQUE, - ) - -/datum/design/microfusion/attachment/unique/rgb - name = "Phase Emitter Spectrograph" - desc = "An attachment hooked up to the phase emitter, allowing the user to adjust the color of the beam outputted. This has seen widespread use by various factions capable of getting their hands on microfusion weapons, whether as a calling card or simply for entertainment." - id = "microfusion_gun_attachment_rgb" - materials = list( - /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/gold = HALF_SHEET_MATERIAL_AMOUNT, - ) - build_path = /obj/item/microfusion_gun_attachment/rgb - -/datum/design/microfusion/attachment/unique/camo_black - name = "Black Camo Microfusion Frame" - desc = "A frame modification for the MCR-10, changing the color of the gun to black." - id = "microfusion_gun_attachment_black_camo" - materials = list( - /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/gold = HALF_SHEET_MATERIAL_AMOUNT, - ) - build_path = /obj/item/microfusion_gun_attachment/camo - -/datum/design/microfusion/attachment/unique/camo_nanotrasen - name = "Nanotrasen Camo Microfusion Frame" - desc = "A frame modification for the MCR-01, changing the color of the gun to blue." - id = "microfusion_gun_attachment_nt_camo" - materials = list( - /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/plasma = HALF_SHEET_MATERIAL_AMOUNT, - ) - build_path = /obj/item/microfusion_gun_attachment/camo/nanotrasen - -/datum/design/microfusion/attachment/unique/camo_syndicate - name = "Blood Red Camo Microfusion Frame" - desc = "A frame modification for the MCR-01, changing the color of the gun to a slick blood red." - id = "microfusion_gun_attachment_syndi_camo" - materials = list( - /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/titanium = HALF_SHEET_MATERIAL_AMOUNT, - ) - build_path = /obj/item/microfusion_gun_attachment/camo/syndicate - -/datum/design/microfusion/attachment/unique/camo_bananium - name = "Bananium Microfusion Frame" - desc = "A frame modification for the MCR-01, plating the gun in bananium." - id = "microfusion_gun_attachment_honk_camo" - materials = list( - /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, - /datum/material/bananium = HALF_SHEET_MATERIAL_AMOUNT, - ) - build_path = /obj/item/microfusion_gun_attachment/camo/honk diff --git a/modular_nova/modules/microfusion/code/microfusion_energy_master.dm b/modular_nova/modules/microfusion/code/microfusion_energy_master.dm deleted file mode 100644 index ff5ad4f83e7..00000000000 --- a/modular_nova/modules/microfusion/code/microfusion_energy_master.dm +++ /dev/null @@ -1,768 +0,0 @@ -// FLUFFY FRONTIER EDIT NOTE: ДАННЫЙ ФАЙЛ БЫЛ ЧАСТИЧНО ПОДВЕРГНУТ ПЕРЕЗАПИСИ ПО ПУТИ tff_modular\modules\mcr_nerf_revert\code\mcr_override.dm! В СЛУЧАЕ ВОЗМОЖНЫХ ОШИБОК ВЫЗВАННЫХ ИЗМЕНЕНИЯМИ ТУТ - СМОТРИТЕ ФАЙЛ С ПЕРЕЗАПИСЯМИ. - -#define DUALWIELD_PENALTY_EXTRA_MULTIPLIER 1.4 - -// Master file for cell loadable energy guns. PROCS ONLY YOU MONKEYS! -// This file is a copy/paste of _energy.dm with extensive modification. - -/obj/item/gun/microfusion - name = "prototype detatchable cell energy projection aparatus" - desc = "The coders have obviously failed to realise this is broken." - icon = 'modular_nova/modules/microfusion/icons/microfusion_gun40x32.dmi' - icon_state = "mcr01" - inhand_icon_state = "mcr01" - lefthand_file = 'modular_nova/modules/microfusion/icons/guns_lefthand.dmi' - righthand_file = 'modular_nova/modules/microfusion/icons/guns_righthand.dmi' - can_bayonet = FALSE - weapon_weight = WEAPON_HEAVY - w_class = WEIGHT_CLASS_BULKY - obj_flags = UNIQUE_RENAME - ammo_x_offset = 2 - - /// What type of power cell this uses - var/obj/item/stock_parts/cell/microfusion/cell - /// The cell we will spawn with - var/cell_type = /obj/item/stock_parts/cell/microfusion - /// The cell type we check when inserting a cell - var/base_cell_type = /obj/item/stock_parts/cell/microfusion - /// If the weapon has custom icons for individual ammo types it can switch between. ie disabler beams, taser, laser/lethals, ect. - var/modifystate = FALSE - /// How many charge sections do we have? - var/charge_sections = 4 - /// if this gun uses a stateful charge bar for more detail - var/shaded_charge = FALSE - /// Should we give an overlay to empty guns? - var/display_empty = TRUE - /// whether the gun's cell drains the cyborg user's cell to recharge - var/dead_cell = FALSE - - // MICROFUSION SPECIFIC VARS - - /// The microfusion lens used for generating the beams. - var/obj/item/ammo_casing/energy/laser/microfusion/microfusion_lens - /// The sound played when you insert a cell. - var/sound_cell_insert = 'modular_nova/modules/microfusion/sound/mag_insert.ogg' - /// Should the insertion sound played vary? - var/sound_cell_insert_vary = TRUE - /// The volume at which we will play the insertion sound. - var/sound_cell_insert_volume = 50 - /// The sound played when you remove a cell. - var/sound_cell_remove = 'modular_nova/modules/microfusion/sound/mag_insert.ogg' - /// Should the removal sound played vary? - var/sound_cell_remove_vary = TRUE - /// The volume at which we will play the removal sound. - var/sound_cell_remove_volume = 50 - /// A list of attached upgrades - var/list/attachments = list() - /// The starting phase emitter in this weapon. - var/phase_emitter_type = /obj/item/microfusion_phase_emitter - /// The base emitter type that we check when putting a new emitter in. - var/base_phase_emitter_type = /obj/item/microfusion_phase_emitter - /// The phase emitter that this gun currently has. - var/obj/item/microfusion_phase_emitter/phase_emitter - /// The amount of heat produced per shot - var/heat_per_shot = 100 - /// The heat dissipation bonus granted by the weapon. - var/heat_dissipation_bonus = 0 - /// What slots does this gun have? - var/attachment_slots = list(GUN_SLOT_BARREL, GUN_SLOT_UNDERBARREL, GUN_SLOT_RAIL, GUN_SLOT_UNIQUE, GUN_SLOT_CAMO) - /// Our base firedelay. - var/base_fire_delay = 0 - /// Do we use more power because of attachments? - var/extra_power_usage = 0 - /// Spread from attachments. - var/attachment_spread = 0 - /// Recoil from attachments. - var/attachment_recoil = 0 - -/obj/item/gun/microfusion/emp_act(severity) - . = ..() - if(!(. & EMP_PROTECT_CONTENTS)) - cell.use(round(cell.charge / severity)) - chambered = null //we empty the chamber - recharge_newshot() //and try to charge a new shot - update_appearance() - -/obj/item/gun/microfusion/get_cell() - return cell - -/obj/item/gun/microfusion/Initialize(mapload) - . = ..() - if(cell_type) - cell = new cell_type(src) - else - cell = new(src) - cell.parent_gun = src - cell.chargerate = 300 - if(!dead_cell) - cell.give(cell.maxcharge) - if(phase_emitter_type) - phase_emitter = new phase_emitter_type(src) - else - phase_emitter = new(src) - phase_emitter.parent_gun = src - update_microfusion_lens() - recharge_newshot(TRUE) - AddElement(/datum/element/update_icon_updates_onmob) - update_appearance() - AddComponent(/datum/component/ammo_hud) - RegisterSignal(src, COMSIG_ITEM_RECHARGED, PROC_REF(instant_recharge)) - base_fire_delay = fire_delay - START_PROCESSING(SSobj, src) - -/obj/item/gun/microfusion/give_gun_safeties() - AddComponent(/datum/component/gun_safety) - -/obj/item/gun/microfusion/add_weapon_description() - AddElement(/datum/element/weapon_description, attached_proc = PROC_REF(add_notes_energy)) - -/obj/item/gun/microfusion/add_seclight_point() - return - -/obj/item/gun/microfusion/Destroy() - if(microfusion_lens) - QDEL_NULL(microfusion_lens) - if(cell) - cell.parent_gun = null - QDEL_NULL(cell) - if(attachments.len) - for(var/obj/item/iterating_item in attachments) - qdel(iterating_item) - attachments = null - if(phase_emitter) - QDEL_NULL(phase_emitter) - STOP_PROCESSING(SSobj, src) - return ..() - -/obj/item/gun/microfusion/Exited(atom/movable/gone, direction) - . = ..() - if(gone == cell) - cell = null - update_appearance() - else if(gone == phase_emitter) - phase_emitter = null - update_appearance() - -/obj/item/gun/microfusion/can_shoot() - return !QDELETED(cell) ? (cell.charge >= microfusion_lens.e_cost) : FALSE - -/obj/item/gun/microfusion/recharge_newshot() - if (!microfusion_lens || !cell || !phase_emitter) - return - chambered = microfusion_lens - if(!chambered.loaded_projectile) - chambered.newshot() - -/obj/item/gun/microfusion/handle_chamber() - if(chambered && !chambered.loaded_projectile && cell) //if loaded_projectile is null, i.e the shot has been fired... - var/obj/item/ammo_casing/energy/shot = chambered - cell.use(shot.e_cost + extra_power_usage)//... drain the cell - chambered = null //either way, released the prepared shot - recharge_newshot() //try to charge a new shot - -/obj/item/gun/microfusion/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) - if(!chambered && can_shoot()) - process_chamber() // If the gun was drained and then recharged, load a new shot. - return ..() - -/obj/item/gun/microfusion/process(seconds_per_tick) - for(var/obj/item/microfusion_gun_attachment/attached as anything in attachments) - attached.process_attachment(src, seconds_per_tick) - -/obj/item/gun/microfusion/update_icon_state() - var/skip_inhand = initial(inhand_icon_state) //only build if we aren't using a preset inhand icon - var/skip_worn_icon = initial(worn_icon_state) //only build if we aren't using a preset worn icon - - if(skip_inhand && skip_worn_icon) //if we don't have either, don't do the math. - return ..() - - var/ratio = get_charge_ratio() - var/temp_icon_to_use = initial(icon_state) - if(modifystate) - temp_icon_to_use += "[microfusion_lens.select_name]" - - temp_icon_to_use += "[ratio]" - if(!skip_inhand) - inhand_icon_state = temp_icon_to_use - if(!skip_worn_icon) - worn_icon_state = temp_icon_to_use - return ..() - -/obj/item/gun/microfusion/update_overlays() - . = ..() - SEND_SIGNAL(src, COMSIG_UPDATE_AMMO_HUD) //update the ammo hud since it's heavily dependent on the gun's state - if(!phase_emitter) - . += "[icon_state]_phase_emitter_missing" - else if(phase_emitter.damaged) - . += "[icon_state]_phase_emitter_damaged" - else if(cell) - var/ratio = get_charge_ratio() - if(ratio == 0 && display_empty) - . += "[icon_state]_empty" - else if(shaded_charge) - . += "[icon_state]_charge[ratio]_[phase_emitter.icon_state]" - else - . += "[icon_state]_phase_emitter_missing" - - - for(var/obj/item/microfusion_gun_attachment/microfusion_gun_attachment in attachments) - . += "[icon_state]_[microfusion_gun_attachment.attachment_overlay_icon_state]" - - -/obj/item/gun/microfusion/ignition_effect(atom/to_ignite, mob/living/user) - if(!can_shoot() || !microfusion_lens) - shoot_with_empty_chamber() - . = "" - else - var/obj/projectile/energy/loaded_projectile = microfusion_lens.loaded_projectile - if(!loaded_projectile) - . = "" - else if(!loaded_projectile.damage || loaded_projectile.damage_type == STAMINA) - user.visible_message(span_danger("[user] tries to light [to_ignite.loc == user ? "[user.p_their()] [to_ignite.name]" : to_ignite] with [src], but it doesn't do anything. Dumbass.")) - playsound(user, microfusion_lens.fire_sound, 50, TRUE) - playsound(user, loaded_projectile.hitsound, 50, TRUE) - cell.use(microfusion_lens.e_cost) - . = "" - else if(loaded_projectile.damage_type != BURN) - user.visible_message(span_danger("[user] tries to light [to_ignite.loc == user ? "[user.p_their()] [to_ignite.name]" : to_ignite] with [src], but only succeeds in utterly destroying it. Dumbass.")) - playsound(user, microfusion_lens.fire_sound, 50, TRUE) - playsound(user, loaded_projectile.hitsound, 50, TRUE) - cell.use(microfusion_lens.e_cost) - qdel(to_ignite) - . = "" - else - playsound(user, microfusion_lens.fire_sound, 50, TRUE) - playsound(user, loaded_projectile.hitsound, 50, TRUE) - cell.use(microfusion_lens.e_cost) - . = span_danger("[user] casually lights [to_ignite.loc == user ? "[user.p_their()] [to_ignite.name]" : to_ignite] with [src]. Damn.") - -/obj/item/gun/microfusion/attackby(obj/item/attacking_item, mob/user, params) - . = ..() - if (.) - return - if(istype(attacking_item, base_cell_type)) - insert_cell(user, attacking_item) - if(istype(attacking_item, /obj/item/microfusion_gun_attachment)) - add_attachment(attacking_item, user) - if(istype(attacking_item, base_phase_emitter_type)) - insert_emitter(attacking_item, user) - -/obj/item/gun/microfusion/process_chamber(empty_chamber, from_firing, chamber_next_round) - . = ..() - if(!cell?.stabilised && prob(40)) - do_sparks(2, FALSE, src) //Microfusion guns create sparks! - -/obj/item/gun/microfusion/attack_hand(mob/user, list/modifiers) - if(loc == user && user.is_holding(src) && cell) - eject_cell(user) - return - return ..() - -/obj/item/gun/microfusion/crowbar_act(mob/living/user, obj/item/tool) - if(!phase_emitter) - balloon_alert(user, "no phase emitter!") - return - playsound(src, 'sound/items/crowbar.ogg', 70, TRUE) - remove_emitter() - -/obj/item/gun/microfusion/AltClick(mob/user) - . = ..() - if(can_interact(user)) - var/obj/item/microfusion_gun_attachment/to_remove = input(user, "Please select what part you'd like to remove.", "Remove attachment") as null|obj in sort_names(attachments) - if(!to_remove) - return - remove_attachment(to_remove, user) - -/obj/item/gun/microfusion/proc/remove_all_attachments() - if(attachments.len) - for(var/obj/item/microfusion_gun_attachment/attachment in attachments) - attachment.remove_attachment(src) - attachment.forceMove(get_turf(src)) - attachments -= attachment - update_appearance() - -/obj/item/gun/microfusion/examine(mob/user) - . = ..() - if(attachments.len) - for(var/obj/item/microfusion_gun_attachment/microfusion_gun_attachment in attachments) - . += span_notice("It has a [microfusion_gun_attachment.name] installed.") - . += span_notice("Alt+click it to remove an upgrade.") - if(phase_emitter) - . += span_notice("It has a [phase_emitter.name] installed, at [phase_emitter.get_heat_percent()]% heat capacity.") - . += span_notice("The [phase_emitter.name] is at [phase_emitter.integrity]% integrity.") - . += span_notice("The [phase_emitter.name] will thermal throttle at [phase_emitter.throttle_percentage]% heat capacity.") - . += span_notice("Use a crowbar to remove the phase emitter.") - else - . += span_danger("It does not have a phase emitter installed!") - - if(cell) - . += span_notice("It has a [cell.name] installed, with a capacity of [cell.charge]/[cell.maxcharge] MF.") - -/obj/item/gun/microfusion/suicide_act(mob/living/user) - if (istype(user) && can_shoot() && can_trigger_gun(user) && user.get_bodypart(BODY_ZONE_HEAD)) - user.visible_message(span_suicide("[user] is putting the barrel of [src] in [user.p_their()] mouth. It looks like [user.p_theyre()] trying to commit suicide!")) - sleep(2.5 SECONDS) - if(user.is_holding(src)) - user.visible_message(span_suicide("[user] melts [user.p_their()] face off with [src]!")) - playsound(loc, fire_sound, 50, TRUE, -1) - cell.use(microfusion_lens.e_cost) - update_appearance() - return(FIRELOSS) - else - user.visible_message(span_suicide("[user] panics and starts choking to death!")) - return(OXYLOSS) - else - user.visible_message(span_suicide("[user] is pretending to melt [user.p_their()] face off with [src]! It looks like [user.p_theyre()] trying to commit suicide!
    ")) - playsound(src, dry_fire_sound, 30, TRUE) - return (OXYLOSS) - -// To maintain modularity, I am moving this proc override here. -/obj/item/gun/microfusion/fire_gun(atom/target, mob/living/user, flag, params) - - // check to see if the emitter prevents us from firing before anything else - var/attempted_shot = process_emitter() - if(attempted_shot != SHOT_SUCCESS) - if(attempted_shot) - balloon_alert(user, attempted_shot) - return - - . = ..() - -// To maintain modularity, I am moving this proc override here. -/obj/item/gun/microfusion/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) - var/base_bonus_spread = 0 - if(user) - var/list/bonus_spread_values = list(base_bonus_spread, bonus_spread) - SEND_SIGNAL(user, COMSIG_MOB_FIRED_GUN, src, target, params, zone_override, bonus_spread_values) - base_bonus_spread = bonus_spread_values[MIN_BONUS_SPREAD_INDEX] - bonus_spread = bonus_spread_values[MAX_BONUS_SPREAD_INDEX] - - SEND_SIGNAL(src, COMSIG_GUN_FIRED, user, target, params, zone_override) - - add_fingerprint(user) - - if(semicd) - return - - //Vary by at least this much - var/randomized_bonus_spread = rand(base_bonus_spread, bonus_spread) - var/randomized_gun_spread = spread ? rand(0, spread) : 0 - var/total_random_spread = max(0, randomized_bonus_spread + randomized_gun_spread) - var/burst_spread_mult = rand() - - var/modified_delay = fire_delay - if(phase_emitter) - modified_delay = phase_emitter.fire_delay - if(user && HAS_TRAIT(user, TRAIT_DOUBLE_TAP)) - modified_delay = ROUND_UP(fire_delay * 0.5) - - if(burst_size > 1) - firing_burst = TRUE - for(var/i = 1 to burst_size) - addtimer(CALLBACK(src, PROC_REF(process_burst), user, target, message, params, zone_override, total_random_spread, burst_spread_mult, i), modified_delay * (i - 1)) - else - if(chambered) - if(HAS_TRAIT(user, TRAIT_PACIFISM)) // If the user has the pacifist trait, then they won't be able to fire [src] if the round chambered inside of [src] is lethal. - if(chambered.harmful) // Is the bullet chambered harmful? - balloon_alert(user, "lethally chambered!") - return - var/calculated_spread = round((rand(0, 1) - 0.5) * DUALWIELD_PENALTY_EXTRA_MULTIPLIER * total_random_spread) - before_firing(target,user) - process_microfusion() - if(!chambered.fire_casing(target, user, params, , suppressed, zone_override, calculated_spread, src)) - shoot_with_empty_chamber(user) - return - else - if(get_dist(user, target) <= 1) //Making sure whether the target is in vicinity for the pointblank shot - shoot_live_shot(user, 1, target, message) - else - shoot_live_shot(user, 0, target, message) - else - shoot_with_empty_chamber(user) - return - process_chamber() - update_appearance() - semicd = TRUE - var/fire_delay_to_add = 0 - if(phase_emitter) - fire_delay_to_add = phase_emitter.fire_delay - addtimer(CALLBACK(src, PROC_REF(reset_semicd)), fire_delay + fire_delay_to_add) - - if(user) - user.update_held_items() - SSblackbox.record_feedback("tally", "gun_fired", 1, type) - - SEND_SIGNAL(src, COMSIG_UPDATE_AMMO_HUD) - - return TRUE - -// Same goes for this! -/obj/item/gun/microfusion/process_burst( - mob/living/user, - atom/target, - message = TRUE, - params = null, - zone_override = "", - random_spread = 0, - burst_spread_mult = 0, - iteration = 0, - ) - - if(!user || !firing_burst) - firing_burst = FALSE - return FALSE - if(!can_shoot()) - firing_burst = FALSE - return FALSE - if(!chambered) - process_chamber() // Ditto. - if(!issilicon(user)) - if(iteration > 1 && !(user.is_holding(src))) //for burst firing - firing_burst = FALSE - return FALSE - if(chambered?.loaded_projectile) - if(HAS_TRAIT(user, TRAIT_PACIFISM)) // If the user has the pacifist trait, then they won't be able to fire [src] if the round chambered inside of [src] is lethal. - if(chambered.harmful) // Is the bullet chambered harmful? - balloon_alert(user, "lethally chambered!") - return - var/calculated_spread - if(randomspread) - calculated_spread = round((rand(0, 1) - 0.5) * DUALWIELD_PENALTY_EXTRA_MULTIPLIER * (random_spread)) - else //Smart spread - calculated_spread = round((((burst_spread_mult/burst_size) * iteration) - (0.5 + (burst_spread_mult * 0.25))) * (random_spread)) - before_firing(target,user) - process_microfusion() - if(!chambered.fire_casing(target, user, params, ,suppressed, zone_override, calculated_spread, src)) - shoot_with_empty_chamber(user) - firing_burst = FALSE - return FALSE - else - if(get_dist(user, target) <= 1) //Making sure whether the target is in vicinity for the pointblank shot - shoot_live_shot(user, 1, target, message) - else - shoot_live_shot(user, 0, target, message) - if (iteration >= burst_size) - firing_burst = FALSE - else - shoot_with_empty_chamber(user) - firing_burst = FALSE - return FALSE - process_chamber() - update_appearance() - SEND_SIGNAL(src, COMSIG_UPDATE_AMMO_HUD) - return TRUE - -/obj/item/gun/microfusion/shoot_live_shot(mob/living/user, pointblank, atom/pbtarget, message) - if(recoil) - shake_camera(user, recoil + 1, recoil) - - var/sound_freq_to_add = 0 - - if(phase_emitter && phase_emitter.sound_freq > 1) - sound_freq_to_add = phase_emitter.sound_freq - - if(suppressed) - playsound(user, suppressed_sound, suppressed_volume, vary_fire_sound, ignore_walls = FALSE, extrarange = SILENCED_SOUND_EXTRARANGE, frequency = sound_freq_to_add, falloff_distance = 0) - else - playsound(user, fire_sound, fire_sound_volume, vary_fire_sound, frequency = sound_freq_to_add) - if(message) - if(pointblank) - user.visible_message(span_danger("[user] fires [src] point blank at [pbtarget]!"), \ - span_danger("You fire [src] point blank at [pbtarget]!"), \ - span_hear("You hear a gunshot!"), COMBAT_MESSAGE_RANGE, pbtarget) - to_chat(pbtarget, span_userdanger("[user] fires [src] point blank at you!")) - if(pb_knockback > 0 && ismob(pbtarget)) - var/mob/PBT = pbtarget - var/atom/throw_target = get_edge_target_turf(PBT, user.dir) - PBT.throw_at(throw_target, pb_knockback, 2) - else - user.visible_message(span_danger("[user] fires [src]!"), \ - span_danger("You fire [src]!"), \ - span_hear("You hear a gunshot!"), COMBAT_MESSAGE_RANGE) - if(user.resting) - user.Immobilize(20, TRUE) - - phase_emitter.add_heat(heat_per_shot) - - if(phase_emitter.current_heat > phase_emitter.max_heat) - if(ishuman(user)) - var/mob/living/carbon/human/human = user - var/obj/item/bodypart/affecting = human.get_bodypart("[(user.active_hand_index % 2 == 0) ? "r" : "l" ]_arm") - if(affecting?.receive_damage( 0, 5 )) // 1 burn damage - to_chat(user, span_warning("[src] burns your hand, it's too hot!")) - -/obj/item/gun/microfusion/proc/process_microfusion() - if(attachments.len) - for(var/obj/item/microfusion_gun_attachment/attachment in attachments) - attachment.process_fire(src, chambered) - return TRUE - -/obj/item/gun/microfusion/proc/process_emitter() - if(!phase_emitter) - return SHOT_FAILURE_NO_EMITTER - var/phase_emitter_process = phase_emitter.check_emitter() - if(phase_emitter_process != SHOT_SUCCESS) - return phase_emitter_process - return SHOT_SUCCESS - -/obj/item/gun/microfusion/proc/instant_recharge() - SIGNAL_HANDLER - if(!cell) - return - cell.charge = cell.maxcharge - recharge_newshot() - update_appearance() - -///Used by update_icon_state() and update_overlays() -/obj/item/gun/microfusion/proc/get_charge_ratio() - return can_shoot() ? CEILING(clamp(cell.charge / cell.maxcharge, 0, 1) * charge_sections, 1) : 0 - // Sets the ratio to 0 if the gun doesn't have enough charge to fire, or if its power cell is removed. - -/** - * - * Outputs type-specific weapon stats for energy-based firearms based on its firing modes - * and the stats of those firing modes. Esoteric firing modes like ion are currently not supported - * but can be added easily - * - */ -/obj/item/gun/microfusion/proc/add_notes_energy() - var/list/readout = list() - // Make sure there is something to actually retrieve - if(!microfusion_lens) - return - var/obj/projectile/exam_proj - readout += "Our heroic interns have shown that one can theoretically stay standing after..." - exam_proj = initial(microfusion_lens?.projectile_type) - - if(!istype(exam_proj)) - return readout.Join("\n") - - if(exam_proj.damage > 0) // Don't divide by 0!!!!! - readout += "[span_warning("[HITS_TO_CRIT(exam_proj.damage * microfusion_lens.pellets)] shot\s")] on [span_warning("[microfusion_lens.select_name]")] mode before collapsing from [exam_proj.damage_type == STAMINA ? "immense pain" : "their wounds"]." - if(exam_proj.stamina > 0) // In case a projectile does damage AND stamina damage (Energy Crossbow) - readout += "[span_warning("[HITS_TO_CRIT(exam_proj.stamina * microfusion_lens.pellets)] shot\s")] on [span_warning("[microfusion_lens.select_name]")] mode before collapsing from immense pain." - else - readout += "a theoretically infinite number of shots on [span_warning("[microfusion_lens.select_name]")] mode." - - return readout.Join("\n") // Sending over the singular string, rather than the whole list - -/obj/item/gun/microfusion/proc/update_microfusion_lens() - if(!microfusion_lens) - microfusion_lens = new(src) - fire_sound = microfusion_lens.fire_sound - fire_sound_volume = microfusion_lens.fire_sound_volume - fire_delay = microfusion_lens.delay - -// Cell, emitter and upgrade interactions - -/obj/item/gun/microfusion/proc/remove_emitter(mob/user) - playsound(src, sound_cell_insert, 50, TRUE) - phase_emitter.forceMove(get_turf(src)) - if(user) - user.put_in_hands(phase_emitter) - balloon_alert(user, "removed phase emitter") - phase_emitter.parent_gun = null - phase_emitter = null - update_appearance() - -/obj/item/gun/microfusion/proc/insert_emitter(obj/item/microfusion_phase_emitter/inserting_phase_emitter, mob/living/user) - if(phase_emitter) - balloon_alert(user, "already one installed!") - return FALSE - balloon_alert(user, "inserted phase emitter") - playsound(src, sound_cell_remove, 50, TRUE) - inserting_phase_emitter.forceMove(src) - phase_emitter = inserting_phase_emitter - phase_emitter.parent_gun = src - update_appearance() - - -/// Try to insert the cell into the gun, if successful, return TRUE -/obj/item/gun/microfusion/proc/insert_cell(mob/user, obj/item/stock_parts/cell/microfusion/inserting_cell, display_message = TRUE) - var/hotswap = FALSE - if(cell) - hotswap = TRUE - var/obj/item/stock_parts/cell/old_cell = cell - if(inserting_cell.charge) - balloon_alert(user, "can't insert a charged cell!") - return FALSE - if(display_message) - balloon_alert(user, "cell inserted") - if(hotswap) - eject_cell(user, FALSE, FALSE) - if(sound_cell_insert) - playsound(src, sound_cell_insert, sound_cell_insert_volume, sound_cell_insert_vary) - cell = inserting_cell - inserting_cell.forceMove(src) - inserting_cell.inserted_into_weapon() - cell.parent_gun = src - if(old_cell) - user.put_in_hands(old_cell) - recharge_newshot() - update_appearance() - return TRUE - -/// Ejecting a cell. -/obj/item/gun/microfusion/proc/eject_cell(mob/user, display_message = TRUE, put_in_hands = TRUE) - var/obj/item/stock_parts/cell/microfusion/old_cell = cell - old_cell.forceMove(get_turf(src)) - old_cell.cell_removal_discharge() - if(user) - if(put_in_hands) - user.put_in_hands(old_cell) - if(display_message) - balloon_alert(user, "cell removed") - if(sound_cell_remove) - playsound(src, sound_cell_remove, sound_cell_remove_volume, sound_cell_remove_vary) - old_cell.update_appearance() - old_cell.parent_gun = null - cell = null - update_appearance() - -/// Attatching an upgrade. -/obj/item/gun/microfusion/proc/add_attachment(obj/item/microfusion_gun_attachment/microfusion_gun_attachment, mob/living/user) - if(is_type_in_list(microfusion_gun_attachment, attachments)) - balloon_alert(user, "already has one!") - return FALSE - if(!(microfusion_gun_attachment.slot in attachment_slots)) - balloon_alert(user, "can't install!") - return FALSE - for(var/obj/item/microfusion_gun_attachment/iterating_attachment in attachments) - if(is_type_in_list(microfusion_gun_attachment, iterating_attachment.incompatible_attachments)) - balloon_alert(user, "not compatible with [iterating_attachment]!") - return FALSE - if(iterating_attachment.slot != GUN_SLOT_UNIQUE && iterating_attachment.slot == microfusion_gun_attachment.slot) - balloon_alert(user, "slot full!") - return FALSE - attachments += microfusion_gun_attachment - microfusion_gun_attachment.forceMove(src) - microfusion_gun_attachment.run_attachment(src) - balloon_alert(user, "installed attachment") - playsound(src, 'sound/effects/structure_stress/pop2.ogg', 70, TRUE) - return TRUE - -/obj/item/gun/microfusion/proc/remove_attachment(obj/item/microfusion_gun_attachment/microfusion_gun_attachment, mob/living/user) - balloon_alert(user, "removed attachment") - playsound(src, 'sound/items/screwdriver.ogg', 70) - microfusion_gun_attachment.forceMove(get_turf(src)) - attachments -= microfusion_gun_attachment - microfusion_gun_attachment.remove_attachment(src) - user?.put_in_hands(microfusion_gun_attachment) - update_appearance() - -// UI CONTROL - -/obj/item/gun/microfusion/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "MicrofusionGunControl") - ui.open() - -/obj/item/gun/microfusion/ui_data(mob/user) - var/list/data = list() - - data["gun_name"] = name - data["gun_desc"] = desc - data["gun_heat_dissipation"] = heat_dissipation_bonus - - if(phase_emitter) - data["has_emitter"] = TRUE - data["phase_emitter_data"] = list( - "type" = capitalize(phase_emitter.name), - "integrity" = phase_emitter.integrity, - "current_heat" = phase_emitter.current_heat, - "throttle_percentage" = phase_emitter.throttle_percentage, - "heat_dissipation_per_tick" = phase_emitter.heat_dissipation_per_tick, - "max_heat" = phase_emitter.max_heat, - "damaged" = phase_emitter.damaged, - "hacked" = phase_emitter.hacked, - "heat_percent" = phase_emitter.get_heat_percent(), - "process_time" = phase_emitter.fire_delay, - "cooling_system" = phase_emitter.cooling_system, - "cooling_system_rate" = phase_emitter.cooling_system_rate, - ) - else - data["has_emitter"] = FALSE - - if(cell) - var/list/attachments = list() - for(var/obj/item/microfusion_cell_attachment/attachment in cell.attachments) - attachments += attachment.name - data["has_cell"] = TRUE - data["cell_data"] = list( - "type" = capitalize(cell.name), - "charge" = cell.charge, - "max_charge" = cell.maxcharge, - "status" = cell.meltdown, - "attachments" = attachments, - ) - else - data["has_cell"] = FALSE - - - - if(attachments.len) - data["has_attachments"] = TRUE - data["attachments"] = list() - for(var/obj/item/microfusion_gun_attachment/attachment in attachments) - var/list/attachment_functions = attachment.get_modify_data() - var/has_modifications = FALSE - if(attachment_functions?.len > 0) - has_modifications = TRUE - data["attachments"] += list(list( - "name" = uppertext(attachment.name), - "desc" = attachment.desc, - "slot" = capitalize(attachment.slot), - "information" = attachment.get_information_data(), - "has_modifications" = has_modifications, - "modify" = attachment_functions, - "ref" = REF(attachment), - )) - - else - data["has_attachments"] = FALSE - - return data - -/obj/item/gun/microfusion/ui_act(action, list/params) - . = ..() - if(.) - return - - switch(action) - if("eject_cell") - if(!cell) - return - eject_cell(usr) - if("overclock_emitter") - if(!phase_emitter) - return - if(!phase_emitter.hacked) - return - phase_emitter.set_overclock(usr) - if("eject_emitter") - if(!phase_emitter) - return - remove_emitter(usr) - if("remove_attachment") - var/obj/item/microfusion_gun_attachment/to_remove = locate(params["attachment_ref"]) in src - if(!to_remove) - return - remove_attachment(to_remove, usr) - if("modify_attachment") - var/obj/item/microfusion_gun_attachment/to_modify = locate(params["attachment_ref"]) in src - if(!to_modify) - return - to_modify.run_modify_data(params["modify_ref"], usr, src) - if("toggle_cooling_system") - if(!phase_emitter) - return - phase_emitter.toggle_cooling_system(usr) - -/// Recalculates the spread, based on attachment-provided values. -/obj/item/gun/microfusion/proc/recalculate_spread() - spread = max(0, attachment_spread) - -/// Recalculates the recoil, based on attachment-provided values. -/obj/item/gun/microfusion/proc/recalculate_recoil() - recoil = max(0, attachment_recoil) diff --git a/modular_nova/modules/microfusion/code/microfusion_gun_attachments.dm b/modular_nova/modules/microfusion/code/microfusion_gun_attachments.dm deleted file mode 100644 index f3edf7eb295..00000000000 --- a/modular_nova/modules/microfusion/code/microfusion_gun_attachments.dm +++ /dev/null @@ -1,519 +0,0 @@ -/** -*MICROFUSION GUN UPGRADE ATTACHMENTS -*For adding unique abilities to microfusion guns, these can directly interact with the gun! -*/ - -/obj/item/microfusion_gun_attachment - name = "microfusion gun attachment" - desc = "If you see this yell at a coder" - icon = 'modular_nova/modules/microfusion/icons/microfusion_gun_attachments.dmi' - w_class = WEIGHT_CLASS_NORMAL - /// The attachment overlay icon state. - var/attachment_overlay_icon_state - /// Any incompatible upgrade types. - var/list/incompatible_attachments = list() - /// The added heat produced by having this module installed. - var/heat_addition = 0 - /// The slot this attachment is installed in. - var/slot = GUN_SLOT_UNIQUE - /// How much extra power do we use? - var/power_usage = 0 - /// Spread adjustment. Moved up to the base attachment type because of barrel mods and grips being in separate slots. - var/spread_adjust - /// Recoil adjustment. Also moved up to base attachment because of barrel mods and grips being in separate slots. - var/recoil_adjust - -/obj/item/microfusion_gun_attachment/examine(mob/user) - . = ..() - . += "Compatible slot: [slot]." - -/obj/item/microfusion_gun_attachment/proc/run_attachment(obj/item/gun/microfusion/microfusion_gun) - SHOULD_CALL_PARENT(TRUE) - microfusion_gun.heat_per_shot += heat_addition - microfusion_gun.update_appearance() - microfusion_gun.extra_power_usage += power_usage - microfusion_gun.chambered?.refresh_shot() - if(spread_adjust) - microfusion_gun.attachment_spread += spread_adjust - microfusion_gun.recalculate_spread() - if(recoil_adjust) - microfusion_gun.attachment_recoil += recoil_adjust - microfusion_gun.recalculate_recoil() - return - -/obj/item/microfusion_gun_attachment/proc/process_attachment(obj/item/gun/microfusion/microfusion_gun, seconds_per_tick) - return - -//Firing the gun right before we let go of it, tis is called. -/obj/item/microfusion_gun_attachment/proc/process_fire(obj/item/gun/microfusion/microfusion_gun, obj/item/ammo_casing/chambered) - return - -/obj/item/microfusion_gun_attachment/proc/remove_attachment(obj/item/gun/microfusion/microfusion_gun) - SHOULD_CALL_PARENT(TRUE) - microfusion_gun.heat_per_shot -= heat_addition - microfusion_gun.update_appearance() - microfusion_gun.extra_power_usage -= power_usage - microfusion_gun.chambered?.refresh_shot() - if(spread_adjust) - microfusion_gun.attachment_spread -= spread_adjust - microfusion_gun.recalculate_spread() - if(recoil_adjust) - microfusion_gun.attachment_recoil -= recoil_adjust - microfusion_gun.recalculate_recoil() - return - -/* -Returns a list of modifications of this attachment, it must return a list within a list list(list()). -All of the following must be returned. -list(list("title" = "Toggle [toggle ? "OFF" : "ON"]", "icon" = "power-off", "color" = "blue" "reference" = "toggle_on_off")) -title - The title of the modification button -icon - The icon of the modification button -color - The color of the modification button -reference - The reference of the modification button, this is used to call the proc when the run modify data proc is called. -*/ -/obj/item/microfusion_gun_attachment/proc/get_modify_data() - return - -/obj/item/microfusion_gun_attachment/proc/run_modify_data(params, mob/living/user, obj/item/gun/microfusion/microfusion_gun) - return - -/obj/item/microfusion_gun_attachment/proc/get_information_data() - return - -// base type for the barrel mods because i got Really Tired of re-re-redefined variables -/obj/item/microfusion_gun_attachment/barrel - slot = GUN_SLOT_BARREL - /// If this isn't null, we're replacing our next loaded projectile with this type. - var/projectile_override - /// If this isn't null, on attachment, this becomes the new fire sound. - var/new_fire_sound - /// If this isn't null or zero, adds this fire delay to the gun. - var/delay_to_add - /// If this isn't null or zero, adds this burst to the gun's burst size. - var/burst_to_add - -/obj/item/microfusion_gun_attachment/barrel/process_fire(obj/item/gun/microfusion/microfusion_gun, obj/item/ammo_casing/chambered) - . = ..() - if(projectile_override) - chambered.loaded_projectile = new projectile_override - -/obj/item/microfusion_gun_attachment/barrel/run_attachment(obj/item/gun/microfusion/microfusion_gun) - . = ..() - if(new_fire_sound) - microfusion_gun.fire_sound = new_fire_sound - if(delay_to_add) - microfusion_gun.fire_delay += delay_to_add - if(burst_to_add) - microfusion_gun.burst_size += burst_to_add - -/obj/item/microfusion_gun_attachment/barrel/remove_attachment(obj/item/gun/microfusion/microfusion_gun) - . = ..() - if(new_fire_sound) - microfusion_gun.fire_sound = microfusion_gun.chambered?.fire_sound - if(delay_to_add) - microfusion_gun.fire_delay -= delay_to_add - if(burst_to_add) - microfusion_gun.burst_size -= burst_to_add - -/* -SCATTER ATTACHMENT - -Turns the gun into a shotgun. -*/ -/obj/item/microfusion_gun_attachment/barrel/scatter - name = "diffuser microfusion lens upgrade" - desc = "A diffusing lens system capable of splitting one beam into three." - icon_state = "attachment_scatter" - attachment_overlay_icon_state = "attachment_scatter" - slot = GUN_SLOT_BARREL - projectile_override = /obj/projectile/beam/laser/microfusion/scatter - /// How many pellets are we going to add to the existing amount on the gun? - var/pellets_to_add = 2 - /// The variation in pellet scatter. - var/variance_to_add = 20 - -/obj/item/microfusion_gun_attachment/barrel/scatter/run_attachment(obj/item/gun/microfusion/microfusion_gun) - . = ..() - microfusion_gun.microfusion_lens.pellets += pellets_to_add - microfusion_gun.microfusion_lens.variance += variance_to_add - -/obj/item/microfusion_gun_attachment/barrel/scatter/process_fire(obj/item/gun/microfusion/microfusion_gun, obj/item/ammo_casing/chambered) - . = ..() - chambered.loaded_projectile?.damage = chambered.loaded_projectile.damage / chambered.pellets - -/obj/item/microfusion_gun_attachment/barrel/scatter/remove_attachment(obj/item/gun/microfusion/microfusion_gun) - . = ..() - microfusion_gun.microfusion_lens.pellets -= pellets_to_add - microfusion_gun.microfusion_lens.variance -= variance_to_add - -/* -CRYSTALLINE SCATTER ATTACHMENT - -An overclocked shotgun. -*/ - -/obj/item/microfusion_gun_attachment/barrel/scatter/max - name = "crystalline diffuser microfusion lens upgrade" - desc = "An experimental diffusing lens system capable of splitting one beam into seven. However, it imparts recoil and causes an increased power draw." - icon_state = "attachment_scattermax" - attachment_overlay_icon_state = "attachment_scattermax" - slot = GUN_SLOT_BARREL - pellets_to_add = 6 - variance_to_add = 25 - recoil_adjust = 1 - spread_adjust = 15 - projectile_override = /obj/projectile/beam/laser/microfusion/scatter/max - power_usage = 20 - -/* -SUPERHEAT ATTACHMENT - -Lasers set the target on fire. -*/ - -/obj/item/microfusion_gun_attachment/barrel/superheat - name = "superheating phase emitter upgrade" - desc = "A barrel attachment hooked to the phase emitter, this adjusts the beam's wavelength to carry an intense wave of heat; causing targets to ignite." - icon_state = "attachment_superheat" - attachment_overlay_icon_state = "attachment_superheat" - heat_addition = 90 - slot = GUN_SLOT_BARREL - projectile_override = /obj/projectile/beam/laser/microfusion/superheated - new_fire_sound = 'modular_nova/modules/microfusion/sound/vaporize.ogg' - -/* -HELLFIRE ATTACHMENT - -Makes the gun shoot hellfire lasers. -*/ -/obj/item/microfusion_gun_attachment/barrel/hellfire - name = "hellfire emitter upgrade" - desc = "A barrel attachment hooked to the phase emitter, this adjusts the beam's wavelength to carry an extra wave of heat; causing nastier wounds and more damage." - icon_state = "attachment_hellfire" - attachment_overlay_icon_state = "attachment_hellfire" - heat_addition = 50 - power_usage = 20 - slot = GUN_SLOT_BARREL - projectile_override = /obj/projectile/beam/laser/microfusion/hellfire - new_fire_sound = 'modular_nova/modules/microfusion/sound/melt.ogg' - -/* -REPEATER ATTACHMENT - -The gun can fire volleys of shots. -*/ -/obj/item/microfusion_gun_attachment/barrel/repeater - name = "repeating phase emitter upgrade" - desc = "This barrel attachment upgrades the central phase emitter to fire off two beams in quick succession. While offering an increased rate of fire, the heat output and recoil rises too." - icon_state = "attachment_repeater" - attachment_overlay_icon_state = "attachment_repeater" - heat_addition = 40 - slot = GUN_SLOT_BARREL - spread_adjust = 15 - recoil_adjust = 1 - burst_to_add = 1 - delay_to_add = 5 - projectile_override = /obj/projectile/beam/laser/microfusion/repeater - -/* -FOCUSED REPEATER ATTACHMENT - -The gun can fire volleys of shots that penetrate armor. -*/ - -/obj/item/microfusion_gun_attachment/barrel/repeater/penetrator - name = "focused repeating phase emitter upgrade" - desc = "A focused variant of the repeating phase controller. It allows the lasers to penetrate armor however this results in higher power usage." - icon_state = "attachment_penetrator" - attachment_overlay_icon_state = "attachment_penetrator" - power_usage = 20 - slot = GUN_SLOT_BARREL - projectile_override = /obj/projectile/beam/laser/microfusion/penetrator - power_usage = 80 // A price to pay to penetrate through armor - -/* -X-RAY ATTACHMENT - -The gun can fire X-RAY shots. -*/ -/obj/item/microfusion_gun_attachment/barrel/xray - name = "quantum phase inverter array" //Yes quantum makes things sound cooler. - desc = "An experimental barrel attachment that modifies the central phase emitter, causing the wave frequency to shift into X-ray. \ - Capable of penetrating both glass and solid matter with ease; though, unlike a more traditional x-ray laser gun, \ - the bolts don't carry a greater effect against armor, due to going through the target and doing more minimal internal damage. \ - These attachments are power-hungry and overheat easily, though engineers have deemed the costs necessary drawbacks." - icon_state = "attachment_xray" - slot = GUN_SLOT_BARREL - attachment_overlay_icon_state = "attachment_xray" - heat_addition = 90 - power_usage = 50 - new_fire_sound = 'modular_nova/modules/microfusion/sound/incinerate.ogg' - projectile_override = /obj/projectile/beam/laser/microfusion/xray - -/obj/item/microfusion_gun_attachment/barrel/xray/examine(mob/user) - . = ..() - . += span_warning("CAUTION: Phase emitter heats up extremely quickly, sustained fire not recommended!") - -/* -SUPPRESSOR ATTACHMENT - -Makes operators operate operatingly. -*/ - -/obj/item/microfusion_gun_attachment/barrel/suppressor - name = "laser suppressor" // sure it makes no sense but its cool - desc = "An experimental barrel attachment that dampens the soundwave of the emitter, making the laser shots far more stealthy. Best paired with black camo." - icon_state = "attachment_suppressor" - slot = GUN_SLOT_BARREL - attachment_overlay_icon_state = "attachment_suppressor" - -/obj/item/microfusion_gun_attachment/barrel/suppressor/run_attachment(obj/item/gun/microfusion/microfusion_gun) - . = ..() - microfusion_gun.suppressed = TRUE - -/obj/item/microfusion_gun_attachment/barrel/suppressor/remove_attachment(obj/item/gun/microfusion/microfusion_gun) - . = ..() - microfusion_gun.suppressed = null - -/* -BIKEHORN ATTACHMENT - -HONK!! Does subpar stamina damage but slips people. -*/ - -/obj/item/microfusion_gun_attachment/barrel/honk - name = "bananium phase emitter upgrade" - desc = "An honksperimental barrel attachment that makes your lasers funnier." - icon_state = "attachment_honk" - attachment_overlay_icon_state = "attachment_honk" - delay_to_add = 2 SECONDS - new_fire_sound = 'sound/items/bikehorn.ogg' - projectile_override = /obj/projectile/beam/laser/microfusion/honk - -/obj/item/microfusion_gun_attachment/barrel/honk/examine(mob/user) - . = ..() - . += span_warning("CAUTION: The gun you are about to handle is extremely funny!") - -/* -LANCE ATTACHMENT - -The gun fires fast heavy lasers but takes a long time to fire. -*/ -/obj/item/microfusion_gun_attachment/barrel/lance - name = "lance induction carriage" - desc = "A modification kit that turns the MCR into a designated marksman rifle. Fired beams boast greater firepower and speed, \ - but the enhanced throughput is very draining on the cell, as well as generating an extreme amount of heat. \ - Users are advised to make their shots count." - icon = 'icons/obj/weapons/improvised.dmi' - icon_state = "kitsuitcase" - incompatible_attachments = list(/obj/item/microfusion_gun_attachment/camo, /obj/item/microfusion_gun_attachment/camo/nanotrasen, /obj/item/microfusion_gun_attachment/camo/honk) - attachment_overlay_icon_state = "attachment_lance" - heat_addition = 150 - power_usage = 100 - delay_to_add = 2.5 SECONDS - new_fire_sound = 'sound/weapons/lasercannonfire.ogg' - projectile_override = /obj/projectile/beam/laser/microfusion/lance - -/obj/item/microfusion_gun_attachment/barrel/lance/examine(mob/user) - . = ..() - . += span_warning("CAUTION: Phase emitter heats up extremely quickly!") - -/* -PULSE ATTACHMENT - -The gun can fire PULSE shots. -*/ -/obj/item/microfusion_gun_attachment/barrel/pulse - name = "pulse induction carriage" - desc = "A cutting-edge bluespace capacitor array and distributing lens overhaul produced in laboratories by Nanotrasen scientists that allow microfusion rifles to fire military-grade pulse rounds. Comes equipped with cyclic cooling to ensure maximum combat efficiency, a munitions counter, and an extra-secure drop cage for the power source. May shorten trigger lifetime." - icon_state = "attachment_pulse" - attachment_overlay_icon_state = "attachment_pulse" - heat_addition = 150 - power_usage = 50 - projectile_override = /obj/projectile/beam/pulse - burst_to_add = 2 - delay_to_add = 2 - -/obj/item/microfusion_gun_attachment/barrel/pulse/examine(mob/user) - . = ..() - . += span_warning("CAUTION: Phase emitter heats up extremely quickly, sustained fire not recommended!") - -/* -GRIP ATTACHMENT - -Greatly reduces recoil and spread. -*/ -/obj/item/microfusion_gun_attachment/grip - name = "grip attachment" - desc = "A simple grip that increases accuracy." - icon_state = "attachment_grip" - attachment_overlay_icon_state = "attachment_grip" - slot = GUN_SLOT_UNDERBARREL - spread_adjust = -10 - recoil_adjust = -1 - -/* -HEATSINK ATTACHMENT - -"Greatly increases the phase emitter cooling rate." -*/ -/obj/item/microfusion_gun_attachment/heatsink - name = "phase emitter heatsink" - desc = "Greatly increases the phase emitter cooling rate." - icon_state = "attachment_heatsink" - attachment_overlay_icon_state = "attachment_heatsink" - slot = GUN_SLOT_UNDERBARREL - /// Cooling bonus. - var/cooling_rate_increase = 50 - -/obj/item/microfusion_gun_attachment/heatsink/run_attachment(obj/item/gun/microfusion/microfusion_gun) - . = ..() - microfusion_gun.heat_dissipation_bonus += cooling_rate_increase - -/obj/item/microfusion_gun_attachment/heatsink/remove_attachment(obj/item/gun/microfusion/microfusion_gun) - . = ..() - microfusion_gun.heat_dissipation_bonus -= cooling_rate_increase - -/* -RGB ATTACHMENT - -Enables you to change the light color of the laser. -*/ -/obj/item/microfusion_gun_attachment/rgb - name = "phase emitter spectrograph" - desc = "An attachment hooked up to the phase emitter, allowing the user to adjust the color of the beam outputted. This has seen widespread use by various factions capable of getting their hands on microfusion weapons, whether as a calling card or simply for entertainment." - icon_state = "attachment_rgb" - attachment_overlay_icon_state = "attachment_rgb" - /// What color are we changing the sprite to? - var/color_to_apply = COLOR_MOSTLY_PURE_RED - -/obj/item/microfusion_gun_attachment/rgb/process_fire(obj/item/gun/microfusion/microfusion_gun, obj/item/ammo_casing/chambered) - . = ..() - chambered?.loaded_projectile.icon_state = "laser_greyscale" - chambered?.loaded_projectile.color = color_to_apply - chambered?.loaded_projectile.light_color = color_to_apply - -/obj/item/microfusion_gun_attachment/rgb/proc/select_color(mob/living/user) - var/new_color = input(user, "Please select your new projectile color", "Laser color", color_to_apply) as null|color - - if(!new_color) - return - - color_to_apply = new_color - -/obj/item/microfusion_gun_attachment/rgb/attack_self(mob/user, modifiers) - . = ..() - select_color(user) - -/obj/item/microfusion_gun_attachment/rgb/get_modify_data() - return list(list("title" = "Change Color", "icon" = "wrench", "reference" = "color", "color" = "blue")) - -/obj/item/microfusion_gun_attachment/rgb/run_modify_data(params, mob/living/user) - if(params == "color") - select_color(user) - -/* -RAIL ATTACHMENT - -Allows for flashlights bayonets and adds 1 slot to equipment. -*/ -/obj/item/microfusion_gun_attachment/rail - name = "gun rail attachment" - desc = "A simple set of rails that attaches to weapon hardpoints. Allows for 3 more attachment slots and the instillation of a flashlight or bayonet." - icon_state = "attachment_rail" - attachment_overlay_icon_state = "attachment_rail" - slot = GUN_SLOT_RAIL - -/obj/item/microfusion_gun_attachment/rail/run_attachment(obj/item/gun/microfusion/microfusion_gun) - . = ..() - microfusion_gun.AddComponent(/datum/component/seclite_attachable, \ - light_overlay_icon = 'modular_nova/modules/microfusion/icons/microfusion_gun40x32.dmi', \ - light_overlay = "flight") - microfusion_gun.can_bayonet = TRUE - -/obj/item/microfusion_gun_attachment/rail/remove_attachment(obj/item/gun/microfusion/microfusion_gun) - . = ..() - var/component_to_delete = microfusion_gun.GetComponent(/datum/component/seclite_attachable) - if(component_to_delete) - qdel(component_to_delete) - microfusion_gun.can_bayonet = initial(microfusion_gun.can_bayonet) - if(microfusion_gun.bayonet) - microfusion_gun.bayonet.forceMove(get_turf(microfusion_gun)) - microfusion_gun.bayonet = null - microfusion_gun.update_appearance() - microfusion_gun.remove_all_attachments() - -/* -SCOPE ATTACHMENT - -Allows for a scope to be attached to the gun. -*/ - -/obj/item/microfusion_gun_attachment/scope - name = "scope attachment" - desc = "A simple telescopic scope, allowing for long-ranged use of the weapon. However, these do not provide any night vision." - icon_state = "attachment_scope" - attachment_overlay_icon_state = "attachment_scope" - slot = GUN_SLOT_RAIL - -/obj/item/microfusion_gun_attachment/scope/run_attachment(obj/item/gun/microfusion/microfusion_gun) - . = ..() - if(microfusion_gun.GetComponent(/datum/component/scope)) - return - microfusion_gun.AddComponent(/datum/component/scope, range_modifier = 1.5) - -/obj/item/microfusion_gun_attachment/scope/remove_attachment(obj/item/gun/microfusion/microfusion_gun) - . = ..() - var/datum/component_datum = microfusion_gun.GetComponent(/datum/component/scope) - if(component_datum) - qdel(component_datum) - -/* -BLACK CAMO ATTACHMENT - -Allows for a black camo to be applied to the gun. -All tactical, all the time. -*/ - -/obj/item/microfusion_gun_attachment/camo - name = "black camo microfusion frame" - desc = "A frame modification for the MCR-01, changing the color of the gun to black." - slot = GUN_SLOT_CAMO - icon_state = "attachment_black" - attachment_overlay_icon_state = "attachment_black" - -/* -HONK CAMO ATTACHMENT - -Allows for a clown camo to be applied to the gun. -HONK!! -*/ -/obj/item/microfusion_gun_attachment/camo/honk - name = "bananium microfusion frame" - desc = "A frame modification for the MCR-01, plating the gun in bananium." - icon_state = "attachment_honk_camo" - attachment_overlay_icon_state = "attachment_honk_camo" - -/* -SYNDIE CAMO ATTACHMENT - -Allows for a blood red camo to be applied to the gun. -Totally not property of a hostile corporation. -*/ -/obj/item/microfusion_gun_attachment/camo/syndicate - name = "blood red camo microfusion frame" - desc = "A frame modification for the MCR-01, changing the color of the gun to a slick blood red." - icon_state = "attachment_syndi_camo" - attachment_overlay_icon_state = "attachment_syndi_camo" - -/* -NANOTRASEN CAMO ATTACHMENT - -Allows for an official blue camo to be applied to the gun. -Hail Nanotrasen. -*/ -/obj/item/microfusion_gun_attachment/camo/nanotrasen - name = "\improper Nanotrasen brand microfusion frame" - desc = "A frame modification for the MCR-01, changing the color of the gun to blue." - icon_state = "attachment_nt_camo" - attachment_overlay_icon_state = "attachment_nt_camo" diff --git a/modular_nova/modules/microfusion/code/microfusion_techweb.dm b/modular_nova/modules/microfusion/code/microfusion_techweb.dm deleted file mode 100644 index 5dada3ab88e..00000000000 --- a/modular_nova/modules/microfusion/code/microfusion_techweb.dm +++ /dev/null @@ -1,120 +0,0 @@ -/datum/techweb_node/basic_microfusion - id = "basic_microfusion" - starting_node = TRUE - display_name = "Basic Microfusion Technology" - description = "Basic microfusion technology allowing for basic microfusion designs." - design_ids = list( - "basic_microfusion_cell", - ) - -//Enhanced microfusion -/datum/techweb_node/enhanced_microfusion - id = "enhanced_microfusion" - display_name = "Enhanced Microfusion Technology" - description = "Enhanced microfusion technology allowing for upgraded basic microfusion!" - prereq_ids = list( - "basic_microfusion", - "engineering", - "weaponry", - "high_efficiency", - ) - design_ids = list( - "enhanced_microfusion_cell", - "enhanced_microfusion_phase_emitter", - "microfusion_gun_attachment_black_camo", - "microfusion_gun_attachment_nt_camo", - "microfusion_gun_attachment_heatsink", - ) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3500) - -//Advanced microfusion -/datum/techweb_node/advanced_microfusion - id = "advanced_microfusion" - display_name = "Advanced Microfusion Technology" - description = "Advanced microfusion technology allowing for advanced microfusion!" - prereq_ids = list( - "enhanced_microfusion", - "adv_engi", - "adv_weaponry", - "adv_power", - "adv_plasma", - ) - design_ids = list( - "advanced_microfusion_cell", - "microfusion_cell_attachment_overcapacity", - "microfusion_cell_attachment_stabiliser", - "microfusion_gun_attachment_scatter", - "microfusion_gun_attachment_hellfire", - "advanced_microfusion_phase_emitter", - "microfusion_gun_attachment_lance", - "microfusion_gun_attachment_grip", - "microfusion_gun_attachment_rail", - "microfusion_gun_attachment_scope", - ) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) - - -// Bluespace microfusion -/datum/techweb_node/bluespace_microfusion - id = "bluespace_microfusion" - display_name = "Bluespace Microfusion Technology" - description = "Bluespace tinkering plus microfusion technology!" - prereq_ids = list( - "advanced_microfusion", - "bluespace_power", - "beam_weapons", - "explosive_weapons", - ) - design_ids = list( - "bluespace_microfusion_cell", - "microfusion_gun_attachment_repeater", - "bluespace_microfusion_phase_emitter", - ) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000) - -// Quantum microfusion -/datum/techweb_node/quantum_microfusion - id = "quantum_microfusion" - display_name = "Quantum Microfusion Technology" - description = "Bleeding edge microfusion tech, making use of the latest in materials and components, bluespace or otherwise." - prereq_ids = list( - "bluespace_microfusion", - "alientech", - ) - design_ids = list( - "microfusion_gun_attachment_xray", - ) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 15000) - -// Warcrime microfusion -/datum/techweb_node/illegal_microfusion - id = "illegal_microfusion" - display_name = "Illegal Microfusion Technology" - description = "Microfusion tech that has previously been banned by SolFed. I love the smell of plasma in the mornings." - prereq_ids = list( - "advanced_microfusion", - "syndicate_basic", - ) - design_ids = list( - "microfusion_gun_attachment_superheat", - "microfusion_gun_attachment_scattermax", - "microfusion_gun_attachment_penetrator", - "microfusion_gun_attachment_syndi_camo", - "microfusion_gun_attachment_suppressor", - ) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) - -// clown microfusion. | This exists to not make this non modular -/datum/techweb_node/clown_microfusion - id = "clown_microfusion" - display_name = "Honkicron Clownery Systems Technology" - description = "Microfusion tech that is proprietary tech of Honkicron Clownery Systems. HONK!!" - prereq_ids = list( - "basic_microfusion", - "clown", - ) - design_ids = list( - "microfusion_gun_attachment_honk", - "microfusion_gun_attachment_honk_camo", - ) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 500) //Its normally supposed to be in clown tech so diff --git a/modular_nova/modules/microfusion/code/phase_emitter.dm b/modular_nova/modules/microfusion/code/phase_emitter.dm deleted file mode 100644 index 19caeb30aa6..00000000000 --- a/modular_nova/modules/microfusion/code/phase_emitter.dm +++ /dev/null @@ -1,214 +0,0 @@ -/* -* PHASE EMITTERS -*/ - -/* -* Basically the heart of the gun, can be upgraded. -*/ -/obj/item/microfusion_phase_emitter - name = "basic microfusion phase emitter" - desc = "A first-generation phase emitter, this is the core of the weapon and the source of the beam." - icon = 'modular_nova/modules/microfusion/icons/microfusion_gun_attachments.dmi' - icon_state = "phase_emitter" - base_icon_state = "phase_emitter" - w_class = WEIGHT_CLASS_NORMAL - /// Max heat before it breaks - var/max_heat = 2000 - /// Current heat level - var/current_heat = 0 - /// Thermal throttle percentage - var/throttle_percentage = 80 - /// How much heat it dissipates passively - var/heat_dissipation_per_tick = 30 - /// Active cooling system - var/cooling_system = FALSE - /// How quickly does the active cooling system cool - 1/1 ratio of cell charge to cooling point - var/cooling_system_rate = 30 - /// What is our dynamic integrity? - var/integrity = 100 - /// Are we fucked? - var/damaged = FALSE - /// Hard ref to the gun. - var/obj/item/gun/microfusion/parent_gun - /// Are we "hacked" thus allowing overclocking? - var/hacked = FALSE - /// The fire delay this emitter adds to the gun. - var/fire_delay = 0 - /// The sound playback speed, used for overheating sound effects on fire. - var/sound_freq = 0 - - -/obj/item/microfusion_phase_emitter/Initialize(mapload) - . = ..() - START_PROCESSING(SSobj, src) - -/obj/item/microfusion_phase_emitter/Destroy() - parent_gun = null - return ..() - -/obj/item/microfusion_phase_emitter/process(seconds_per_tick) - if(current_heat == 0) - return - var/calculated_heat_dissipation_per_tick = heat_dissipation_per_tick - if(isspaceturf(get_turf(src))) - calculated_heat_dissipation_per_tick += PHASE_HEAT_DISSIPATION_BONUS_SPACE // Passive cooling in space boost! - if(parent_gun) - calculated_heat_dissipation_per_tick += parent_gun.heat_dissipation_bonus - else - calculated_heat_dissipation_per_tick += PHASE_HEAT_DISSIPATION_BONUS_AIR //We get some passive cooling from being out of the gun. - if(cooling_system && parent_gun && parent_gun.cell && parent_gun.cell.use(cooling_system_rate)) - calculated_heat_dissipation_per_tick += cooling_system_rate - - current_heat = clamp(current_heat - (calculated_heat_dissipation_per_tick * seconds_per_tick) * 0.5, 0, INFINITY) - if(current_heat > max_heat) - integrity = integrity - current_heat / 1000 * seconds_per_tick * 0.5 - - process_fire_delay_and_sound() - - if(integrity <= 0) - kill() - update_appearance() - parent_gun?.update_appearance() - -/obj/item/microfusion_phase_emitter/proc/toggle_cooling_system(mob/user) - if(!parent_gun) - return - if(!cooling_system && !parent_gun.cell) - if(user) - to_chat(user, span_warning("You need a cell to turn on the cooling system.")) - return - - if(cooling_system) - cooling_system = FALSE - else - cooling_system = TRUE - - if(user) - to_chat(user, span_notice("You toggle the cooling system [cooling_system ? "ON" : "OFF"].")) - -/obj/item/microfusion_phase_emitter/multitool_act(mob/living/user, obj/item/tool) - if(hacked) - to_chat(user, span_warning("[src] is already unlocked!")) - return - to_chat(user, span_notice("You begin to override the thermal overclock safety...")) - if(do_after(user, 5 SECONDS, src)) - hacked = TRUE - to_chat(user, span_notice("You override the thermal overclock safety.")) - -/obj/item/microfusion_phase_emitter/proc/set_overclock(mob/living/user) - if(!hacked) - return - var/new_throttle = clamp(input(user, "Please input a new thermal throttle percentage(0-300):", "Phase Emitter Overclock") as null|num, 1, 300) - - to_chat(user, span_notice("Thermal throttle percent set to: [new_throttle].")) - - if(new_throttle > 100) - to_chat(user, span_danger("WARNING: You have input a throttle percentage of more than 100, this may cause emitter damage.")) - - throttle_percentage = new_throttle - -/obj/item/microfusion_phase_emitter/update_icon_state() - . = ..() - - if(damaged) - icon_state = "[base_icon_state]_damaged" - else - switch(get_heat_percent()) - if(40 to 69) - icon_state = "[base_icon_state]_hot" - if(70 to INFINITY) - icon_state = "[base_icon_state]_critical" - else - icon_state = base_icon_state - -/obj/item/microfusion_phase_emitter/proc/process_fire_delay_and_sound() - var/fire_delay_to_add = 0 - if(integrity < 100) - fire_delay_to_add = fire_delay_to_add + (100 - integrity) / 10 - - if(current_heat > max_heat) - fire_delay_to_add = fire_delay_to_add + (current_heat - max_heat) / 100 //Holy shit this emitter is tanking - - fire_delay = round(fire_delay_to_add, 1.45) - -/obj/item/microfusion_phase_emitter/proc/get_heat_icon_state() - switch(get_heat_percent()) - if(40 to 69) - return "hot" - if(70 to INFINITY) - return "critical" - else - return "normal" - -/obj/item/microfusion_phase_emitter/examine(mob/user) - . = ..() - if(damaged) - . += span_danger("It is damaged beyond repair.") - else - . += span_notice("It has a thermal rating of: [max_heat] C") - . += span_notice("It dissipates heat at: [heat_dissipation_per_tick] C") - . += span_notice("Heat capacity: [get_heat_percent()]%") - . += span_notice("Integrity: [integrity]%") - . += span_notice("Thermal throttle: [throttle_percentage]%") - . += span_notice("Cooling system: [cooling_system ? "enabled, cooling at [cooling_system_rate] C/s" : "disabled"].") - -/obj/item/microfusion_phase_emitter/proc/get_heat_percent() - return round(current_heat / max_heat * 100) - -/obj/item/microfusion_phase_emitter/proc/check_emitter() - if(damaged) - return PHASE_FAILURE_DAMAGED - if(get_heat_percent() >= throttle_percentage) - return PHASE_FAILURE_THROTTLE - return SHOT_SUCCESS - -/obj/item/microfusion_phase_emitter/proc/add_heat(heat_to_add) - current_heat += heat_to_add - update_appearance() - -/obj/item/microfusion_phase_emitter/proc/kill() - damaged = TRUE - name = "damaged [name]" - playsound(src, 'modular_nova/modules/microfusion/sound/overheat.ogg', 70) - say("ERROR: Integrity failure!") - STOP_PROCESSING(SSobj, src) - -/obj/item/microfusion_phase_emitter/enhanced - name = "enhanced microfusion phase emitter" - desc = "A second-generation phase emitter, this one is made of more robust materials which allow for a higher capacity for heat, a faster dissipation and cooling of it, and more capacity for thermal throttling." - max_heat = 2500 - throttle_percentage = 85 - heat_dissipation_per_tick = 40 - cooling_system_rate = 40 - integrity = 120 - color = "#ffffcc" - -/obj/item/microfusion_phase_emitter/advanced - name = "advanced microfusion phase emitter" - desc = "A third-generation phase emitter, boasting a high capacity for heat, greater dissipation and cooling, and is built using higher-grade materials for more durability." - max_heat = 3000 - throttle_percentage = 90 - heat_dissipation_per_tick = 50 - cooling_system_rate = 50 - integrity = 150 - color = "#99ffcc" - -/obj/item/microfusion_phase_emitter/bluespace - name = "bluespace microfusion phase emitter" - desc = "A fourth-generation phase emitter, utilizing a bluespace medium to store and manage heat, allowing for much cooler temperatures than realspace would allow. This is made of nothing but the latest materials, leading to the highest durability of any phase emitter on the market." - max_heat = 3500 - throttle_percentage = 95 - heat_dissipation_per_tick = 60 - cooling_system_rate = 60 - integrity = 200 - color = "#66ccff" - -/obj/item/microfusion_phase_emitter/nanocarbon - name = "nanocarbon microfusion phase emitter" - desc = "An experimental phase emitter, made of nanocarbon, which is the most durable material on the market. It is capable of storing and managing heat, and is capable of cooling at a much higher rate than the other phase emitters." - max_heat = 15000 - throttle_percentage = 95 - heat_dissipation_per_tick = 130 - cooling_system_rate = 60 - integrity = 500 - color = "#6966ff" diff --git a/modular_nova/modules/microfusion/code/projectiles.dm b/modular_nova/modules/microfusion/code/projectiles.dm deleted file mode 100644 index eb405a1becc..00000000000 --- a/modular_nova/modules/microfusion/code/projectiles.dm +++ /dev/null @@ -1,101 +0,0 @@ -/obj/item/ammo_casing - ///What volume should the sound play at? - var/fire_sound_volume = 50 - -/obj/item/ammo_casing/energy/laser/microfusion - name = "microfusion energy lens" - projectile_type = /obj/projectile/beam/laser/microfusion - e_cost = LASER_SHOTS(10, STANDARD_CELL_CHARGE) // 10 shots with a normal cell. - select_name = "laser" - fire_sound = 'modular_nova/modules/microfusion/sound/laser_1.ogg' - fire_sound_volume = 100 - -/obj/item/ammo_casing/proc/refresh_shot() - loaded_projectile = new projectile_type(src, src) - -/obj/projectile/beam/laser/microfusion - name = "microfusion laser" - icon = 'modular_nova/modules/microfusion/icons/projectiles.dmi' - damage = 25 - -/obj/projectile/beam/microfusion_disabler - name = "microfusion disabler laser" - icon = 'modular_nova/modules/microfusion/icons/projectiles.dmi' - icon_state = "disabler" - damage = 41 - damage_type = STAMINA - armor_flag = ENERGY - hitsound = 'sound/weapons/tap.ogg' - eyeblur = 0 - impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser - light_color = LIGHT_COLOR_BLUE - tracer_type = /obj/effect/projectile/tracer/disabler - muzzle_type = /obj/effect/projectile/muzzle/disabler - impact_type = /obj/effect/projectile/impact/disabler - -/obj/projectile/beam/laser/microfusion/superheated - name = "superheated microfusion laser" - icon_state = "laser_greyscale" - damage = 20 //Trading damage for fire stacks - color = LIGHT_COLOR_FIRE - light_color = LIGHT_COLOR_FIRE - -/obj/projectile/beam/laser/microfusion/superheated/on_hit(atom/target, blocked = 0, pierce_hit) - . = ..() - if(isliving(target)) - var/mob/living/living = target - living.adjust_fire_stacks(2) - living.ignite_mob() - -/obj/projectile/beam/laser/microfusion/hellfire - name = "hellfire microfusion laser" - icon_state = "laser_greyscale" - wound_bonus = 0 - damage = 20 // You are trading damage for a significant wound bonus and speed increase - speed = 0.6 - color = LIGHT_COLOR_FLARE - light_color = LIGHT_COLOR_FLARE - -/obj/projectile/beam/laser/microfusion/scatter - name = "scatter microfusion laser" - -/obj/projectile/beam/laser/microfusion/scatter/max - name = "scatter microfusion laser" - -/obj/projectile/beam/laser/microfusion/repeater - damage = 12.5 - -/obj/projectile/beam/laser/microfusion/penetrator - name = "focused microfusion laser" - damage = 20 - armour_penetration = 50 - -/obj/projectile/beam/laser/microfusion/lance - name = "lance microfusion laser" - damage = 50 // We're turning the gun into a heavylaser - tracer_type = /obj/effect/projectile/tracer/heavy_laser - muzzle_type = /obj/effect/projectile/muzzle/heavy_laser - impact_type = /obj/effect/projectile/impact/heavy_laser - speed = 0.4 - -/obj/projectile/beam/laser/microfusion/xray - name = "x-ray microfusion laser" - icon_state = "laser_greyscale" - color = COLOR_GREEN - light_color = COLOR_GREEN - projectile_piercing = PASSCLOSEDTURF|PASSGRILLE|PASSGLASS - -/obj/projectile/beam/laser/microfusion/honk - name = "funny microfusion laser" - icon_state = "laser_greyscale" - color = COLOR_VIVID_YELLOW - light_color = COLOR_VIVID_YELLOW - damage_type = STAMINA - damage = 25 - armor_flag = ENERGY - hitsound = 'sound/misc/slip.ogg' - impact_type = /obj/effect/projectile/impact/disabler - -/obj/projectile/beam/laser/microfusion/honk/Initialize(mapload) - . = ..() - AddComponent(/datum/component/slippery, 20) diff --git a/modular_nova/modules/microfusion/icons/guns_lefthand.dmi b/modular_nova/modules/microfusion/icons/guns_lefthand.dmi deleted file mode 100644 index 6690df96ac0..00000000000 Binary files a/modular_nova/modules/microfusion/icons/guns_lefthand.dmi and /dev/null differ diff --git a/modular_nova/modules/microfusion/icons/guns_righthand.dmi b/modular_nova/modules/microfusion/icons/guns_righthand.dmi deleted file mode 100644 index 47f36b05d48..00000000000 Binary files a/modular_nova/modules/microfusion/icons/guns_righthand.dmi and /dev/null differ diff --git a/modular_nova/modules/microfusion/icons/microfusion_cells.dmi b/modular_nova/modules/microfusion/icons/microfusion_cells.dmi deleted file mode 100644 index 10d19a08544..00000000000 Binary files a/modular_nova/modules/microfusion/icons/microfusion_cells.dmi and /dev/null differ diff --git a/modular_nova/modules/microfusion/icons/microfusion_gun40x32.dmi b/modular_nova/modules/microfusion/icons/microfusion_gun40x32.dmi deleted file mode 100644 index 792aa8327d1..00000000000 Binary files a/modular_nova/modules/microfusion/icons/microfusion_gun40x32.dmi and /dev/null differ diff --git a/modular_nova/modules/microfusion/icons/microfusion_gun_attachments.dmi b/modular_nova/modules/microfusion/icons/microfusion_gun_attachments.dmi deleted file mode 100644 index 82ea78ddeb1..00000000000 Binary files a/modular_nova/modules/microfusion/icons/microfusion_gun_attachments.dmi and /dev/null differ diff --git a/modular_nova/modules/microfusion/icons/projectiles.dmi b/modular_nova/modules/microfusion/icons/projectiles.dmi deleted file mode 100644 index c3ee49a1e79..00000000000 Binary files a/modular_nova/modules/microfusion/icons/projectiles.dmi and /dev/null differ diff --git a/modular_nova/modules/microfusion/sound/mag_insert.ogg b/modular_nova/modules/microfusion/sound/mag_insert.ogg deleted file mode 100644 index 53460ebf14d..00000000000 Binary files a/modular_nova/modules/microfusion/sound/mag_insert.ogg and /dev/null differ diff --git a/modular_nova/modules/microfusion/sound/overheat.ogg b/modular_nova/modules/microfusion/sound/overheat.ogg deleted file mode 100644 index 3585471bf9b..00000000000 Binary files a/modular_nova/modules/microfusion/sound/overheat.ogg and /dev/null differ diff --git a/modular_nova/modules/modular_items/code/bags.dm b/modular_nova/modules/modular_items/code/bags.dm index 8fd0bde29eb..2aba9f882cc 100644 --- a/modular_nova/modules/modular_items/code/bags.dm +++ b/modular_nova/modules/modular_items/code/bags.dm @@ -37,7 +37,7 @@ atom_storage.max_total_storage = 12 atom_storage.max_slots = 3 atom_storage.numerical_stacking = FALSE - atom_storage.can_hold = typecacheof(list(/obj/item/ammo_box/magazine, /obj/item/ammo_casing, /obj/item/stock_parts/cell/microfusion)) + atom_storage.can_hold = typecacheof(list(/obj/item/ammo_box/magazine, /obj/item/ammo_casing)) /obj/item/storage/pouch/ammo/post_reskin(mob/our_mob) if(icon_state == "casingpouch") diff --git a/modular_nova/modules/modular_items/code/wetsuit.dm b/modular_nova/modules/modular_items/code/wetsuit.dm new file mode 100644 index 00000000000..69dc119cdd2 --- /dev/null +++ b/modular_nova/modules/modular_items/code/wetsuit.dm @@ -0,0 +1,21 @@ +/obj/item/clothing/under/akula_wetsuit/refit + name = "\improper Refitted Shoredress wetsuit" + desc = "The 'Wetworks'-pattern Shoredress is a long-standing template upon which most Azulean 'wetsuits' are made. \ + This atmospheric exploration suit is a single form-fitting garment, designed to keep wearers comfortable in the harsh environment of dry land; \ + even sometimes worn underneath orbital suits such as MODs. \n\n\ + This variation seems to have been refitted to a more standard body shape." + worn_icon = 'modular_nova/modules/modular_items/icons/akulasuit.dmi' + female_sprite_flags = FEMALE_UNIFORM_FULL + +/obj/item/clothing/under/akula_wetsuit/refit/examine(mob/user) + . = ..() + . += span_notice("You can examine closer to learn a little more about this item.") + +/obj/item/clothing/under/akula_wetsuit/refit/examine_more(mob/user) + . = ..() + + . += "Shoredresses apply active thermal channels and motion-powered micropumps to allow for water of the wearer's temperature choice to circulate; \ + ensuring ample flow over not only the gills, but the rest of the wearer's skin, at the cost of occasional movement being needed when the wearer is still. \n\ + These suits are known to come with luminescent panels that take on a bright glow when underwater, meant for signalling as well as higher visibility in deep waters. \ + The system is meant to only be able to process water, fresh or otherwise; but unofficially, \ + a great many chemicals or even drinks have been loaded in by adventurous or careless explorers of the New Principalities-- at fantastic personal risk to their gills." diff --git a/modular_nova/modules/modular_items/icons/akulasuit.dmi b/modular_nova/modules/modular_items/icons/akulasuit.dmi new file mode 100644 index 00000000000..f7d85b50dda Binary files /dev/null and b/modular_nova/modules/modular_items/icons/akulasuit.dmi differ diff --git a/modular_nova/modules/modular_items/lewd_items/code/lewd_items/shibari.dm b/modular_nova/modules/modular_items/lewd_items/code/lewd_items/shibari.dm index 6bfd4aec7f4..d87c9549ef2 100644 --- a/modular_nova/modules/modular_items/lewd_items/code/lewd_items/shibari.dm +++ b/modular_nova/modules/modular_items/lewd_items/code/lewd_items/shibari.dm @@ -41,7 +41,7 @@ singular_name = "glowy rope" merge_type = /obj/item/stack/shibari_rope/glow icon_state = "shibari_rope_glow" - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 1 light_on = TRUE light_power = 3 diff --git a/modular_nova/modules/modular_items/lewd_items/code/lewd_structures/dancing_pole.dm b/modular_nova/modules/modular_items/lewd_items/code/lewd_structures/dancing_pole.dm index b382591571f..4db2e59aea9 100644 --- a/modular_nova/modules/modular_items/lewd_items/code/lewd_structures/dancing_pole.dm +++ b/modular_nova/modules/modular_items/lewd_items/code/lewd_structures/dancing_pole.dm @@ -10,7 +10,7 @@ layer = BELOW_MOB_LAYER pseudo_z_axis = 9 //stepping onto the pole makes you raise upwards! density = 0 //easy to step up on - light_system = STATIC_LIGHT + light_system = COMPLEX_LIGHT light_range = 3 light_power = 1 light_color = COLOR_LIGHT_PINK diff --git a/modular_nova/modules/modular_weapons/code/autolathe_designs.dm b/modular_nova/modules/modular_weapons/code/autolathe_designs.dm deleted file mode 100644 index d91a802fd84..00000000000 --- a/modular_nova/modules/modular_weapons/code/autolathe_designs.dm +++ /dev/null @@ -1,99 +0,0 @@ -/* -* AMMO -*/ - -/datum/design/strilka310_rubber - name = ".310 Rubber Bullet (Less Lethal)" - id = "astrilka310_rubber" - build_type = AUTOLATHE - materials = list( - /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, - ) - build_path = /obj/item/ammo_casing/strilka310/rubber - category = list( - RND_CATEGORY_HACKED, - RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO, - ) - -// 4.6x30mm - SMG round, used in the WT550 and in numerous modular guns as a weaker alternative to 9mm. - -/datum/design/c46x30mm - name = "4.6x30mm Bullet" - id = "c46x30mm" - build_type = AUTOLATHE - materials = list( - /datum/material/iron = SMALL_MATERIAL_AMOUNT * 7.5, - ) - build_path = /obj/item/ammo_casing/c46x30mm - category = list( - RND_CATEGORY_HACKED, - RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO, - ) - -/datum/design/c46x30mm_rubber - name = "4.6x30mm Rubber Bullet" - id = "c46x30mm_rubber" - build_type = AUTOLATHE - materials = list( - /datum/material/iron = SMALL_MATERIAL_AMOUNT * 7.5 - ) - build_path = /obj/item/ammo_casing/c46x30mm/rubber - category = list( - RND_CATEGORY_INITIAL, - RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO, - ) - -// .45 - -/datum/design/c45_lethal - name = ".45 Bullet" - id = "c45_lethal" - build_type = AUTOLATHE - materials = list( - /datum/material/iron = SMALL_MATERIAL_AMOUNT * 7.5, - ) - build_path = /obj/item/ammo_casing/c45 - category = list( - RND_CATEGORY_HACKED, - RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO, - ) - -/datum/design/c45_rubber - name = ".45 Bouncy Rubber Ball" - id = "c45_rubber" - build_type = AUTOLATHE - materials = list( - /datum/material/iron = SMALL_MATERIAL_AMOUNT * 7.5, - ) - build_path = /obj/item/ammo_casing/c45/rubber - category = list( - RND_CATEGORY_INITIAL, - RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO, - ) - -// 10mm -/datum/design/c10mm_lethal - name = "10mm Bullet" - id = "c10mm_lethal" - build_type = AUTOLATHE - materials = list( - /datum/material/iron = SMALL_MATERIAL_AMOUNT * 7.5, - ) - build_path = /obj/item/ammo_casing/c10mm - category = list( - RND_CATEGORY_HACKED, - RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO, - ) - -/datum/design/c10mm_rubber - name = "10mm Rubber Bullet" - id = "c10mm_rubber" - build_type = AUTOLATHE - materials = list( - /datum/material/iron = SMALL_MATERIAL_AMOUNT * 7.5, - ) - build_path = /obj/item/ammo_casing/c10mm/rubber - category = list( - RND_CATEGORY_INITIAL, - RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO, - ) diff --git a/modular_nova/modules/modular_weapons/code/cargo_crates/armory_guns.dm b/modular_nova/modules/modular_weapons/code/cargo_crates/armory_guns.dm new file mode 100644 index 00000000000..8d0724aae78 --- /dev/null +++ b/modular_nova/modules/modular_weapons/code/cargo_crates/armory_guns.dm @@ -0,0 +1,54 @@ +/datum/supply_pack/security/armory/sindano + name = "Sindano Submachinegun Crate" + desc = "Three entirely proprietary Sindano kits, chambered in .35 Sol Short. Each kit contains three empty magazines and a box each of incapacitator and lethal rounds." + cost = CARGO_CRATE_VALUE * 10 + contains = list( + /obj/item/storage/toolbox/guncase/nova/carwo_large_case/sindano = 3, + ) + crate_name = "Sindano Submachinegun Crate" + +/datum/supply_pack/security/armory/renoster + name = "Renoster Riot Shotgun Crate" + desc = "Three Renoster 12ga riot shotguns, with matching bandoliers for each." + cost = CARGO_CRATE_VALUE * 10 + contains = list( + /obj/item/gun/ballistic/shotgun/riot/sol = 3, + /obj/item/storage/belt/bandolier = 3, + ) + crate_name = "Renoster Riot Shotgun Crate" + +/datum/supply_pack/security/armory/kiboko + name = "Kiboko Grenade Launcher Crate" + desc = "Contains a single Kiboko grenade launcher for replacing the one found in the armory, alongside the equipment that comes with it." + cost = CARGO_CRATE_VALUE * 30 + contains = list( + /obj/item/storage/toolbox/guncase/nova/carwo_large_case/kiboko_magless = 1, + /obj/item/ammo_box/c980grenade = 2, + /obj/item/ammo_box/c980grenade/smoke = 1, + /obj/item/ammo_box/c980grenade/riot = 1, + ) + crate_name = "Kiboko Grenade Launcher Crate" + +/datum/supply_pack/security/armory/short_mod_laser + name = "Modular Laser Carbine Crate" + desc = "Five 'Hoshi' modular laser carbines, compact energy weapons that can be rapidly reconfigured into different firing modes." + cost = CARGO_CRATE_VALUE * 12 + contains = list( + /obj/item/gun/energy/modular_laser_rifle/carbine, + /obj/item/gun/energy/modular_laser_rifle/carbine, + /obj/item/gun/energy/modular_laser_rifle/carbine, + /obj/item/gun/energy/modular_laser_rifle/carbine, + /obj/item/gun/energy/modular_laser_rifle/carbine, + ) + crate_name = "\improper Modular Laser Carbine Crate" + +/datum/supply_pack/security/armory/big_mod_laser + name = "Modular Laser Rifle Crate" + desc = "Three 'Hyeseong' modular laser rifles, bulky energy weapons that can be rapidly reconfigured into different firing modes." + cost = CARGO_CRATE_VALUE * 12 + contains = list( + /obj/item/gun/energy/modular_laser_rifle, + /obj/item/gun/energy/modular_laser_rifle, + /obj/item/gun/energy/modular_laser_rifle, + ) + crate_name = "\improper Modular Laser Rifle Crate" diff --git a/modular_nova/modules/modular_weapons/code/cargo_crates/surplus_crates.dm b/modular_nova/modules/modular_weapons/code/cargo_crates/surplus_crates.dm new file mode 100644 index 00000000000..5a73f5a7046 --- /dev/null +++ b/modular_nova/modules/modular_weapons/code/cargo_crates/surplus_crates.dm @@ -0,0 +1,97 @@ +#define ITEM_WEIGHT_CLOTHING 3 +#define ITEM_WEIGHT_ARMOR 2 +#define ITEM_WEIGHT_MISC 3 +#define ITEM_WEIGHT_MISC_BUT_RARER 2 +#define ITEM_WEIGHT_AMMO_SINGLE 3 +#define ITEM_WEIGHT_AMMO_BULK 2 +#define ITEM_WEIGHT_GUN_COMMON 2 +#define ITEM_WEIGHT_GUN_RARE 1 + + +// used in budget calculation +#define CRATE_ITEM_WEIGHT_MAX 3 + +#define CRATE_BUDGET_MINIMUM 20 +#define CRATE_BUDGET_MAXIMUM 35 + +// Special basically locks it out of appearing literally ever unless an admin VV's the cargo subsystem +/datum/supply_pack/imports/russian + special = TRUE + +/datum/supply_pack/imports/cin_surplus + name = "CIN Surplus Equipment Crate" + desc = "A collection of surplus equipment sourced from the Coalition of Independent Nations' military stockpiles. Likely to contain old and outdated equipment, as is the nature of surplus." + contraband = TRUE + cost = CARGO_CRATE_VALUE * 20 + contains = list( + // Clothing + /obj/item/clothing/under/syndicate/rus_army/cin_surplus/random_color = ITEM_WEIGHT_CLOTHING, + /obj/item/storage/belt/military/cin_surplus/random_color = ITEM_WEIGHT_CLOTHING, + /obj/item/storage/backpack/industrial/cin_surplus/random_color = ITEM_WEIGHT_CLOTHING, + /obj/item/clothing/under/colonial/nri_police = ITEM_WEIGHT_CLOTHING, + /obj/item/clothing/neck/cloak/colonial/nri_police = ITEM_WEIGHT_CLOTHING, + /obj/item/clothing/head/hats/colonial/nri_police = ITEM_WEIGHT_CLOTHING, + /obj/item/clothing/mask/gas/nri_police = ITEM_WEIGHT_CLOTHING, + /obj/item/clothing/mask/balaclavaadjust = ITEM_WEIGHT_CLOTHING, + /obj/item/clothing/gloves/tackler/combat = ITEM_WEIGHT_CLOTHING, + /obj/item/clothing/shoes/jackboots = ITEM_WEIGHT_CLOTHING, + // Armors + /obj/item/clothing/head/helmet/cin_surplus_helmet/random_color = ITEM_WEIGHT_ARMOR, + /obj/item/clothing/suit/armor/vest/cin_surplus_vest = ITEM_WEIGHT_ARMOR, + /obj/item/clothing/head/helmet/nri_police = ITEM_WEIGHT_ARMOR, + /obj/item/clothing/suit/armor/vest/nri_police = ITEM_WEIGHT_ARMOR, + // Weapons + /obj/item/gun/ballistic/revolver/shotgun_revolver = ITEM_WEIGHT_GUN_COMMON, + /obj/item/gun/ballistic/automatic/pistol/plasma_thrower = ITEM_WEIGHT_GUN_COMMON, + /obj/item/gun/ballistic/automatic/pistol/plasma_marksman = ITEM_WEIGHT_GUN_COMMON, + /obj/item/storage/toolbox/guncase/soviet/sakhno = ITEM_WEIGHT_GUN_COMMON, + /obj/item/gun/ballistic/automatic/miecz = ITEM_WEIGHT_GUN_RARE, + /obj/item/gun/ballistic/automatic/lanca = ITEM_WEIGHT_GUN_RARE, + /obj/item/gun/ballistic/automatic/wylom = ITEM_WEIGHT_GUN_RARE, + // Ammo + /obj/item/storage/toolbox/ammobox/strilka310 = ITEM_WEIGHT_AMMO_BULK, + /obj/item/storage/toolbox/ammobox/strilka310/surplus = ITEM_WEIGHT_AMMO_BULK, + /obj/item/ammo_box/c27_54cesarzowa = ITEM_WEIGHT_AMMO_BULK, + /obj/item/ammo_box/c27_54cesarzowa/rubber = ITEM_WEIGHT_AMMO_BULK, + /obj/item/ammo_box/c310_cargo_box = ITEM_WEIGHT_AMMO_BULK, + /obj/item/ammo_box/c310_cargo_box/rubber = ITEM_WEIGHT_AMMO_BULK, + /obj/item/ammo_box/c310_cargo_box/piercing = ITEM_WEIGHT_AMMO_BULK, + /obj/item/ammo_box/magazine/recharge/plasma_battery = ITEM_WEIGHT_AMMO_SINGLE, + /obj/item/ammo_box/magazine/miecz/spawns_empty = ITEM_WEIGHT_AMMO_SINGLE, + /obj/item/ammo_box/strilka310 = ITEM_WEIGHT_AMMO_SINGLE, + /obj/item/ammo_box/magazine/lanca/spawns_empty = ITEM_WEIGHT_AMMO_SINGLE, + /obj/item/ammo_box/magazine/wylom = ITEM_WEIGHT_AMMO_SINGLE, + // Other items + /obj/item/sign/flag/nri = ITEM_WEIGHT_MISC, + /obj/item/trench_tool = ITEM_WEIGHT_MISC, + /obj/item/binoculars = ITEM_WEIGHT_MISC, + /obj/item/storage/box/nri_flares = ITEM_WEIGHT_MISC, + /obj/item/pen/screwdriver = ITEM_WEIGHT_MISC_BUT_RARER, + /obj/item/storage/box/colonial_rations = ITEM_WEIGHT_MISC_BUT_RARER, + /obj/item/storage/toolbox/maint_kit = ITEM_WEIGHT_MISC_BUT_RARER, + ) + +/datum/supply_pack/imports/cin_surplus/fill(obj/structure/closet/crate/we_are_filling_this_crate) + var/item_budget = rand(CRATE_BUDGET_MINIMUM, CRATE_BUDGET_MAXIMUM) + for(var/iterator in 1 to 20) // 20 items max, but we have a budget too + var/new_thing = pick_weight(contains) + // We don't want to go too far over budget + if(item_budget <= 0) + return + new new_thing(we_are_filling_this_crate) + // Basically inverts the weight before subtracting it from the budget + item_budget -= ((CRATE_ITEM_WEIGHT_MAX + 1) - contains[new_thing]) + +#undef ITEM_WEIGHT_CLOTHING +#undef ITEM_WEIGHT_ARMOR +#undef ITEM_WEIGHT_MISC +#undef ITEM_WEIGHT_MISC_BUT_RARER +#undef ITEM_WEIGHT_AMMO_SINGLE +#undef ITEM_WEIGHT_AMMO_BULK +#undef ITEM_WEIGHT_GUN_COMMON +#undef ITEM_WEIGHT_GUN_RARE + +#undef CRATE_ITEM_WEIGHT_MAX + +#undef CRATE_BUDGET_MINIMUM +#undef CRATE_BUDGET_MAXIMUM diff --git a/modular_nova/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/ammo/grenade.dm b/modular_nova/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/ammo/grenade.dm index 31c07d5c56a..4f53915f92e 100644 --- a/modular_nova/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/ammo/grenade.dm +++ b/modular_nova/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/ammo/grenade.dm @@ -143,12 +143,10 @@ /obj/projectile/bullet/c980grenade/shrapnel/fuse_activation(atom/target) - var/obj/item/grenade/shrapnel_maker = new casing_to_spawn(get_turf(src)) - + var/obj/item/grenade/shrapnel_maker = new casing_to_spawn(get_turf(target)) shrapnel_maker.detonate() - qdel(shrapnel_maker) - playsound(src, 'modular_nova/modules/modular_weapons/sounds/grenade_burst.ogg', 50, TRUE, -3) + qdel(shrapnel_maker) /obj/item/ammo_box/c980grenade/shrapnel @@ -162,7 +160,7 @@ /obj/item/grenade/c980payload shrapnel_type = /obj/projectile/bullet/shrapnel/short_range - shrapnel_radius = 2 + shrapnel_radius = 3 ex_dev = 0 ex_heavy = 0 ex_light = 0 @@ -210,12 +208,6 @@ ammo_type = /obj/item/ammo_casing/c980grenade/shrapnel/phosphor -/obj/item/ammo_casing/shrapnel_exploder/phosphor - pellets = 8 - - projectile_type = /obj/projectile/bullet/incendiary/fire/backblast/short_range - - /obj/item/grenade/c980payload/phosphor shrapnel_type = /obj/projectile/bullet/incendiary/fire/backblast/short_range diff --git a/modular_nova/modules/modular_weapons/code/company_and_or_faction_based/saibasan/laser_guns.dm b/modular_nova/modules/modular_weapons/code/company_and_or_faction_based/saibasan/laser_guns.dm new file mode 100644 index 00000000000..1c767ad5ca8 --- /dev/null +++ b/modular_nova/modules/modular_weapons/code/company_and_or_faction_based/saibasan/laser_guns.dm @@ -0,0 +1,295 @@ +/// File location for the long gun's speech +#define LONG_MOD_LASER_SPEECH "nova/long_modular_laser.json" +/// File location for the short gun's speech +#define SHORT_MOD_LASER_SPEECH "nova/short_modular_laser.json" +/// How long the gun should wait between speaking to lessen spam +#define MOD_LASER_SPEECH_COOLDOWN 2 SECONDS +/// What color is the default kill mode for these guns, used to make sure the chat colors are right at roundstart +#define DEFAULT_RUNECHAT_GUN_COLOR "#cd4456" + +// Modular energy weapons, laser guns that can transform into different variants after a few seconds of waiting and animation +// Long version, takes both hands to use and doesn't fit in any bags out there +/obj/item/gun/energy/modular_laser_rifle + name = "\improper Hyeseong modular laser rifle" + desc = "A popular energy weapon system that can be reconfigured into many different variants on the fly. \ + Seen commonly amongst the Marsians who produce the weapon, with many different shapes and sizes to fit \ + the wide variety of modders the planet is home to." + base_icon_state = "hyeseong" + icon = 'modular_nova/modules/modular_weapons/icons/obj/company_and_or_faction_based/saibasan/guns48x.dmi' + icon_state = "hyeseong_kill" + lefthand_file = 'modular_nova/modules/modular_weapons/icons/mob/company_and_or_faction_based/saibasan/guns_lefthand.dmi' + righthand_file = 'modular_nova/modules/modular_weapons/icons/mob/company_and_or_faction_based/saibasan/guns_righthand.dmi' + inhand_icon_state = "hyeseong_kill" + worn_icon = 'modular_nova/modules/modular_weapons/icons/mob/company_and_or_faction_based/saibasan/guns_worn.dmi' + worn_icon_state = "hyeseong_kill" + cell_type = /obj/item/stock_parts/cell/hyeseong_internal_cell + modifystate = FALSE + ammo_type = list(/obj/item/ammo_casing/energy/cybersun_big_kill) + can_select = FALSE + ammo_x_offset = 0 + selfcharge = 1 + charge_delay = 15 + shaded_charge = TRUE + slot_flags = ITEM_SLOT_BACK + obj_flags = UNIQUE_RENAME + SET_BASE_PIXEL(-8, 0) + w_class = WEIGHT_CLASS_BULKY + weapon_weight = WEAPON_HEAVY + actions_types = list(/datum/action/item_action/toggle_personality) + fire_sound_volume = 50 + recoil = 0.25 // This isn't enough to mean ANYTHING aside from it jolting your screen the tiniest amount + /// What datums of weapon modes can we use? + var/list/weapon_mode_options = list( + /datum/laser_weapon_mode, + /datum/laser_weapon_mode/marksman, + /datum/laser_weapon_mode/disabler_machinegun, + /datum/laser_weapon_mode/launcher, + /datum/laser_weapon_mode/shotgun, + ) + /// Populates with a list of weapon mode names and their respective paths on init + var/list/weapon_mode_name_to_path = list() + /// Info for the radial menu for switching weapon mode + var/list/radial_menu_data = list() + /// Is the gun currently changing types? Prevents the gun from firing if yes + var/currently_switching_types = FALSE + /// How long transitioning takes before you're allowed to pick a weapon type + var/transition_duration = 1 SECONDS + /// What the currently selected weapon mode is, for quickly referencing for use in procs and whatnot + var/datum/laser_weapon_mode/currently_selected_mode + /// Name of the firing mode that is selected by default + var/default_selected_mode = "Kill" + /// Allows firing of the gun to be disabled for any reason, for example, if a gun has a melee mode + var/disabled_for_other_reasons = FALSE + /// The json file this gun pulls from when speaking + var/speech_json_file = LONG_MOD_LASER_SPEECH + /// Keeps track of the last processed charge, prevents message spam + var/last_charge = 0 + /// If the gun's personality speech thing is on, defaults to on because just listen to her + var/personality_mode = TRUE + /// Keeps track of our soulcatcher component + var/datum/component/soulcatcher/tracked_soulcatcher + /// What is this gun's extended examine, we only have to do this because the carbine is a subtype + var/expanded_examine_text = "The Hyeseong rifle is the first line of man-portable Marsian weapons platforms \ + from Cybersun Industries. Like her younger sister weapon, the Hoshi carbine, CI used funding aid provided \ + by SolFed to develop a portable weapon fueled by a proprietary generator rumored to be fueled by superstable plasma. \ + A rugged and hefty weapon, the Hyeseong stars in applications anywhere from medium to long ranges, though struggling \ + in CQB. Her onboard machine intelligence, at first devised to support the operator and manage the internal reactor, \ + is shipped with a more professional and understated personality-- since influenced by 'negligence' from users in \ + wiping the intelligence's memory before resale or transport." + /// A cooldown for when the weapon has last spoken, prevents messages from getting turbo spammed + COOLDOWN_DECLARE(last_speech) + +/obj/item/gun/energy/modular_laser_rifle/Initialize(mapload) + . = ..() + AddElement(/datum/element/manufacturer_examine, COMPANY_CYBERSUN) + chat_color = DEFAULT_RUNECHAT_GUN_COLOR + chat_color_darkened = process_chat_color(DEFAULT_RUNECHAT_GUN_COLOR, sat_shift = 0.85, lum_shift = 0.85) + last_charge = cell.charge + tracked_soulcatcher = AddComponent(/datum/component/soulcatcher/modular_laser) + create_weapon_mode_stuff() + voice = null + +/obj/item/gun/energy/modular_laser_rifle/examine(mob/user) + . = ..() + . += span_notice("You can examine closer to learn a little more about this weapon.") + . += span_notice("You can Alt-Click this gun to access the internal soulcatcher.") + +/obj/item/gun/energy/modular_laser_rifle/examine_more(mob/user) + . = ..() + . += expanded_examine_text + return . + +/obj/item/gun/energy/modular_laser_rifle/Destroy() + QDEL_NULL(tracked_soulcatcher) + return ..() + +/obj/item/gun/energy/modular_laser_rifle/AltClick(mob/user) + . = ..() + tracked_soulcatcher?.ui_interact(user) + +/// Handles filling out all of the lists regarding weapon modes and radials around that +/obj/item/gun/energy/modular_laser_rifle/proc/create_weapon_mode_stuff() + if(length(weapon_mode_name_to_path) || length(radial_menu_data)) + return // We don't need to worry about it if there's already stuff here + for(var/datum/laser_weapon_mode/laser_mode as anything in weapon_mode_options) + weapon_mode_name_to_path["[initial(laser_mode.name)]"] = new laser_mode() + var/obj/projectile/mode_projectile = initial(laser_mode.casing.projectile_type) + radial_menu_data["[initial(laser_mode.name)]"] = image(icon = mode_projectile.icon, icon_state = mode_projectile.icon_state) + currently_selected_mode = weapon_mode_name_to_path["[default_selected_mode]"] + transform_gun(currently_selected_mode, FALSE, TRUE) + +/obj/item/gun/energy/modular_laser_rifle/attack_self(mob/living/user) + if(!currently_switching_types) + change_to_switch_mode(user) + return ..() + +/// Makes the gun inoperable, playing an animation and giving a prompt to switch gun modes after the transition_duration passes +/obj/item/gun/energy/modular_laser_rifle/proc/change_to_switch_mode(mob/living/user) + currently_switching_types = TRUE + flick("[base_icon_state]_switch_on", src) + cut_overlays() + playsound(src, 'sound/items/modsuit/ballin.ogg', 75, TRUE) + var/new_icon_state = "[base_icon_state]_switch" + icon_state = new_icon_state + inhand_icon_state = new_icon_state + worn_icon_state = new_icon_state + addtimer(CALLBACK(src, PROC_REF(show_radial_choice_menu), user), transition_duration) + +/// Shows the radial choice menu to the user, if the user doesnt exist or isnt holding the gun anymore, it reverts back to its last form +/obj/item/gun/energy/modular_laser_rifle/proc/show_radial_choice_menu(mob/living/user) + if(!user?.is_holding(src)) + flick("[base_icon_state]_switch_off", src) + transform_gun(currently_selected_mode, FALSE) + playsound(src, 'sound/items/modsuit/ballout.ogg', 75, TRUE) + return + + var/picked_choice = show_radial_menu( + user, + src, + radial_menu_data, + require_near = TRUE, + tooltips = TRUE, + ) + + if(isnull(picked_choice) || isnull(weapon_mode_name_to_path["[picked_choice]"])) + flick("[base_icon_state]_switch_off", src) + transform_gun(currently_selected_mode, FALSE) + playsound(src, 'sound/items/modsuit/ballout.ogg', 75, TRUE) + return + + var/new_weapon_mode = weapon_mode_name_to_path["[picked_choice]"] + transform_gun(new_weapon_mode, TRUE) + +/// Transforms the gun into a different type, if replacing is set to true then it'll make sure to remove any effects the prior gun type had +/obj/item/gun/energy/modular_laser_rifle/proc/transform_gun(datum/laser_weapon_mode/new_weapon_mode, replacing = TRUE, dont_speak = FALSE) + if(!new_weapon_mode) + stack_trace("transform_gun was called but didn't get a new weapon mode, meaning it couldn't work.") + return + if(replacing) + currently_selected_mode.remove_from_weapon(src) + currently_selected_mode = new_weapon_mode + flick("[base_icon_state]_switch_off", src) + currently_selected_mode.apply_stats(src) + currently_selected_mode.apply_to_weapon(src) + playsound(src, 'sound/items/modsuit/ballout.ogg', 75, TRUE) + if(!dont_speak) + speak_up(currently_selected_mode.json_speech_string, TRUE) + currently_switching_types = FALSE + +/obj/item/gun/energy/modular_laser_rifle/can_shoot() + if(!length(ammo_type)) + return FALSE + return ..() + +/obj/item/gun/energy/modular_laser_rifle/can_trigger_gun(mob/living/user, akimbo_usage) + . = ..() + if(currently_switching_types || disabled_for_other_reasons) + return FALSE + +/// Makes the gun speak with a sound effect and colored runetext based on the mode the gun is in, reads the gun's speech json as defined through variables +/obj/item/gun/energy/modular_laser_rifle/proc/speak_up(json_string, ignores_cooldown = FALSE, ignores_personality_toggle = FALSE) + if(!personality_mode && !ignores_personality_toggle) + return + if(!json_string) + return + if(!ignores_cooldown && !COOLDOWN_FINISHED(src, last_speech)) + return + say(pick_list_replacements(speech_json_file, json_string)) + playsound(src, 'sound/creatures/tourist/tourist_talk.ogg', 15, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, frequency = rand(2, 2.2)) + Shake(2, 2, 1 SECONDS) + COOLDOWN_START(src, last_speech, MOD_LASER_SPEECH_COOLDOWN) + +/obj/item/gun/energy/modular_laser_rifle/equipped(mob/user, slot, initial) + . = ..() + if(slot & (ITEM_SLOT_BELT|ITEM_SLOT_BACK|ITEM_SLOT_SUITSTORE)) + speak_up("worn") + else if(slot & ITEM_SLOT_HANDS) + RegisterSignal(user, COMSIG_MOB_CI_TOGGLED, PROC_REF(user_ci_toggled)) + speak_up("pickup") + return + UnregisterSignal(user, COMSIG_MOB_CI_TOGGLED) + +/obj/item/gun/energy/modular_laser_rifle/dropped(mob/user, silent) + . = ..() + if(src in user.contents) + return // If they're still holding us or have us on them, dw about it + UnregisterSignal(user, COMSIG_MOB_CI_TOGGLED) + speak_up("putdown") + +/obj/item/gun/energy/modular_laser_rifle/process(seconds_per_tick) + . = ..() + var/cell_charge_quarter = cell.maxcharge / 4 + if((cell_charge_quarter > cell.charge) && !(last_charge < cell_charge_quarter)) + speak_up("lowcharge") + else if((cell.maxcharge == cell.charge) && !(last_charge == cell.maxcharge)) + speak_up("fullcharge") + last_charge = cell.charge + +/// Triggers when a mob user toggles CI +/obj/item/gun/energy/modular_laser_rifle/proc/user_ci_toggled(mob/living/source) + if(source.combat_indicator) + speak_up("combatmode") + +/obj/item/gun/energy/modular_laser_rifle/ui_action_click(mob/user, actiontype) + if(!istype(actiontype, /datum/action/item_action/toggle_personality)) + return ..() + playsound(src, 'sound/machines/beep.ogg', 30, TRUE) + personality_mode = !personality_mode + speak_up("[personality_mode ? "pickup" : "putdown"]", ignores_personality_toggle = TRUE) + return ..() + +// Power cell for the big rifle +/obj/item/stock_parts/cell/hyeseong_internal_cell + name = "\improper Hyeseong modular laser rifle internal cell" + desc = "These are usually supposed to be inside of the gun, you know." + maxcharge = STANDARD_CELL_CHARGE * 2 + +/datum/action/item_action/toggle_personality + name = "Toggle Weapon Personality" + desc = "Toggles the weapon's personality core. Studies find that turning them off makes them quite sad, however." + background_icon_state = "bg_mod" + +/datum/component/soulcatcher/modular_laser + max_souls = 1 + communicate_as_parent = TRUE + +//Short version of the above modular rifle, has less charge and different modes +/obj/item/gun/energy/modular_laser_rifle/carbine + name = "\improper Hoshi modular laser carbine" + icon = 'modular_nova/modules/modular_weapons/icons/obj/company_and_or_faction_based/saibasan/guns32x.dmi' + icon_state = "hoshi_kill" + inhand_icon_state = "hoshi_kill" + worn_icon_state = "hoshi_kill" + base_icon_state = "hoshi" + charge_sections = 3 + cell_type = /obj/item/stock_parts/cell + ammo_type = list(/obj/item/ammo_casing/energy/cybersun_small_hellfire) + slot_flags = ITEM_SLOT_BACK | ITEM_SLOT_BELT + SET_BASE_PIXEL(0, 0) + w_class = WEIGHT_CLASS_NORMAL + weapon_weight = WEAPON_MEDIUM + weapon_mode_options = list( + /datum/laser_weapon_mode/hellfire, + /datum/laser_weapon_mode/sword, + /datum/laser_weapon_mode/flare, + /datum/laser_weapon_mode/shotgun_small, + /datum/laser_weapon_mode/trickshot_disabler, + ) + default_selected_mode = "Incinerate" + speech_json_file = SHORT_MOD_LASER_SPEECH + expanded_examine_text = "The Hoshi carbine is the latest line of man-portable Marsian weapons platforms from \ + Cybersun Industries. Like her older sister weapon, the Hyeseong rifle, CI used funding aid provided by SolFed \ + to develop a portable weapon fueled by a proprietary generator rumored to be fueled by superstable plasma. A \ + lithe and mobile weapon, the Hoshi stars in close-quarters battle, trickshots, and area-of-effect blasts; though \ + ineffective at ranged combat. Her onboard machine intelligence, at first devised to support the operator and \ + manage the internal reactor, was originally shipped with a more energetic personality-- since influenced by 'negligence' \ + from users in wiping the intelligence's memory before resale or transport." + +/obj/item/gun/energy/modular_laser_rifle/carbine/emp_act(severity) + . = ..() + speak_up("emp", TRUE) // She gets very upset if you emp her + +#undef LONG_MOD_LASER_SPEECH +#undef SHORT_MOD_LASER_SPEECH +#undef MOD_LASER_SPEECH_COOLDOWN +#undef DEFAULT_RUNECHAT_GUN_COLOR diff --git a/modular_nova/modules/modular_weapons/code/company_and_or_faction_based/saibasan/mode_datums.dm b/modular_nova/modules/modular_weapons/code/company_and_or_faction_based/saibasan/mode_datums.dm new file mode 100644 index 00000000000..a1c0489b867 --- /dev/null +++ b/modular_nova/modules/modular_weapons/code/company_and_or_faction_based/saibasan/mode_datums.dm @@ -0,0 +1,206 @@ +// Yeah I'm using datums for this, because the code on a regular gun would suck huge +// Holds a lot of information that will be applied ot the gun, as well as info that the gun will read later +// This basetype is applies to the base 2 burst laser kill mode for the large laser gun +/datum/laser_weapon_mode + /// What name does this weapon mode have? Will appear in the weapon's radial menu + var/name = "Kill" + /// What casing does this variant of weapon use? + var/obj/item/ammo_casing/casing = /obj/item/ammo_casing/energy/cybersun_big_kill + /// What icon_state does this weapon mode use? + var/weapon_icon_state = "kill" + /// How many charge sections does this variant of weapon have? + var/charge_sections = 5 + /// What is the shot cooldown this variant applies to the weapon? + var/shot_delay = 0.3 SECONDS + /// What json string do we check for when making chat messages with this mode? + var/json_speech_string = "kill" + /// What do we change the gun's runetext color to when applied + var/gun_runetext_color = "#cd4456" + +/// Applies some of the universal stats from the variables above +/datum/laser_weapon_mode/proc/apply_stats(obj/item/gun/energy/applied_gun) + if(length(applied_gun.ammo_type)) + for(var/found_casing as anything in applied_gun.ammo_type) + applied_gun.ammo_type.Remove(found_casing) + qdel(found_casing) + applied_gun.ammo_type.Add(casing) + applied_gun.update_ammo_types() + applied_gun.charge_sections = charge_sections + applied_gun.fire_delay = shot_delay + var/new_icon_state = "[applied_gun.base_icon_state]_[weapon_icon_state]" + applied_gun.icon_state = new_icon_state + applied_gun.inhand_icon_state = new_icon_state + applied_gun.worn_icon_state = new_icon_state + applied_gun.update_appearance() + applied_gun.chat_color = gun_runetext_color + applied_gun.chat_color_darkened = process_chat_color(gun_runetext_color, sat_shift = 0.85, lum_shift = 0.85) + +/// Stuff applied to the passed gun when the weapon mode is given to the gun +/datum/laser_weapon_mode/proc/apply_to_weapon(obj/item/gun/energy/applied_gun) + applied_gun.burst_size = 2 + +/// Stuff applied to the passed gun when the weapon mode is removed from the gun +/datum/laser_weapon_mode/proc/remove_from_weapon(obj/item/gun/energy/applied_gun) + applied_gun.burst_size = 1 + +// Marksman mode for the large laser, adds a scope, slower firing rate, and really quick projectiles +/datum/laser_weapon_mode/marksman + name = "Marksman" + casing = /obj/item/ammo_casing/energy/cybersun_big_sniper + weapon_icon_state = "sniper" + shot_delay = 2 SECONDS + json_speech_string = "sniper" + gun_runetext_color = "#f8d860" + /// Keeps track of the scope component for deleting later + var/datum/component/scope/scope_component + +/datum/laser_weapon_mode/marksman/apply_to_weapon(obj/item/gun/energy/applied_gun) + scope_component = applied_gun.AddComponent(/datum/component/scope, 3) + +/datum/laser_weapon_mode/marksman/remove_from_weapon(obj/item/gun/energy/applied_gun) + QDEL_NULL(scope_component) + +// Windup autofire disabler mode for the large laser +/datum/laser_weapon_mode/disabler_machinegun + name = "Disable" + casing = /obj/item/ammo_casing/energy/cybersun_big_disabler + weapon_icon_state = "disabler" + charge_sections = 2 + shot_delay = 0.25 SECONDS + json_speech_string = "disable" + gun_runetext_color = "#47a1b3" + /// Keeps track of the autofire component for deleting later + var/datum/component/automatic_fire/autofire_component + +/datum/laser_weapon_mode/disabler_machinegun/apply_to_weapon(obj/item/gun/energy/applied_gun) + autofire_component = applied_gun.AddComponent(/datum/component/automatic_fire, shot_delay) + +/datum/laser_weapon_mode/disabler_machinegun/remove_from_weapon(obj/item/gun/energy/applied_gun) + QDEL_NULL(autofire_component) + +// Grenade launching mode for the large laser +/datum/laser_weapon_mode/launcher + name = "Launcher" + casing = /obj/item/ammo_casing/energy/cybersun_big_launcher + weapon_icon_state = "launcher" + charge_sections = 3 + shot_delay = 2 SECONDS + json_speech_string = "launcher" + gun_runetext_color = "#77bd5d" + +/datum/laser_weapon_mode/launcher/apply_to_weapon(obj/item/gun/energy/applied_gun) + applied_gun.recoil = 2 + +/datum/laser_weapon_mode/launcher/remove_from_weapon(obj/item/gun/energy/applied_gun) + applied_gun.recoil = initial(applied_gun.recoil) + +// Shotgun mode for the large laser +/datum/laser_weapon_mode/shotgun + name = "Shotgun" + casing = /obj/item/ammo_casing/energy/cybersun_big_shotgun + weapon_icon_state = "shot" + charge_sections = 3 + shot_delay = 0.75 SECONDS + json_speech_string = "shotgun" + gun_runetext_color = "#7a0bb7" + +/datum/laser_weapon_mode/shotgun/apply_to_weapon(obj/item/gun/energy/applied_gun) + applied_gun.recoil = 1 + +/datum/laser_weapon_mode/shotgun/remove_from_weapon(obj/item/gun/energy/applied_gun) + applied_gun.recoil = initial(applied_gun.recoil) + +// Hellfire mode for the small laser +/datum/laser_weapon_mode/hellfire + name = "Incinerate" + casing = /obj/item/ammo_casing/energy/cybersun_small_hellfire + weapon_icon_state = "kill" + charge_sections = 3 + shot_delay = 0.4 SECONDS + json_speech_string = "incinerate" + gun_runetext_color = "#cd4456" + +/datum/laser_weapon_mode/hellfire/apply_to_weapon(obj/item/gun/energy/applied_gun) + return + +/datum/laser_weapon_mode/hellfire/remove_from_weapon(obj/item/gun/energy/applied_gun) + return + +// Melee mode for the small laser, yeah this one will be weird +/datum/laser_weapon_mode/sword + name = "Blade" + // This mode doesn't actually shoot but we gotta have a casing regardless so it doesn't runtime times a million + // And also so the visuals work :3 + casing = /obj/item/ammo_casing/energy/cybersun_small_blade + weapon_icon_state = "blade" + charge_sections = 2 + json_speech_string = "blade" + gun_runetext_color = "#f8d860" + +/datum/laser_weapon_mode/sword/apply_to_weapon(obj/item/gun/energy/modular_laser_rifle/applied_gun) + playsound(src, 'sound/items/unsheath.ogg', 25, TRUE) + applied_gun.force = 18 + applied_gun.sharpness = SHARP_EDGED + applied_gun.bare_wound_bonus = 10 + applied_gun.disabled_for_other_reasons = TRUE + applied_gun.attack_verb_continuous = list("slashes", "cuts") + applied_gun.attack_verb_simple = list("slash", "cut") + applied_gun.hitsound = 'sound/weapons/rapierhit.ogg' + +/datum/laser_weapon_mode/sword/remove_from_weapon(obj/item/gun/energy/modular_laser_rifle/applied_gun) + playsound(src, 'sound/items/sheath.ogg', 25, TRUE) + applied_gun.force = initial(applied_gun.force) + applied_gun.sharpness = initial(applied_gun.sharpness) + applied_gun.bare_wound_bonus = initial(applied_gun.bare_wound_bonus) + applied_gun.disabled_for_other_reasons = FALSE + applied_gun.attack_verb_continuous = initial(applied_gun.attack_verb_continuous) + applied_gun.attack_verb_simple = initial(applied_gun.attack_verb_simple) + applied_gun.hitsound = initial(applied_gun.hitsound) + +// Flare mode for the small laser +/datum/laser_weapon_mode/flare + name = "Flare" + casing = /obj/item/ammo_casing/energy/cybersun_small_launcher + weapon_icon_state = "flare" + charge_sections = 3 + shot_delay = 2 SECONDS + json_speech_string = "flare" + gun_runetext_color = "#77bd5d" + +/datum/laser_weapon_mode/flare/apply_to_weapon(obj/item/gun/energy/applied_gun) + applied_gun.recoil = 2 + +/datum/laser_weapon_mode/flare/remove_from_weapon(obj/item/gun/energy/applied_gun) + applied_gun.recoil = initial(applied_gun.recoil) + +// Shotgun mode for the small laser +/datum/laser_weapon_mode/shotgun_small + name = "Shotgun" + casing = /obj/item/ammo_casing/energy/cybersun_small_shotgun + weapon_icon_state = "shot" + charge_sections = 3 + shot_delay = 0.6 SECONDS + json_speech_string = "shotgun" + gun_runetext_color = "#7a0bb7" + +/datum/laser_weapon_mode/shotgun_small/apply_to_weapon(obj/item/gun/energy/applied_gun) + applied_gun.recoil = 1 + +/datum/laser_weapon_mode/shotgun_small/remove_from_weapon(obj/item/gun/energy/applied_gun) + applied_gun.recoil = initial(applied_gun.recoil) + +// Trickshot bounce disabler mode for the small laser +/datum/laser_weapon_mode/trickshot_disabler + name = "Disable" + casing = /obj/item/ammo_casing/energy/cybersun_small_disabler + weapon_icon_state = "disable" + charge_sections = 3 + shot_delay = 0.4 SECONDS + json_speech_string = "disable" + gun_runetext_color = "#47a1b3" + +/datum/laser_weapon_mode/trickshot_disabler/apply_to_weapon(obj/item/gun/energy/applied_gun) + return + +/datum/laser_weapon_mode/trickshot_disabler/remove_from_weapon(obj/item/gun/energy/applied_gun) + return diff --git a/modular_nova/modules/modular_weapons/code/company_and_or_faction_based/saibasan/projectiles.dm b/modular_nova/modules/modular_weapons/code/company_and_or_faction_based/saibasan/projectiles.dm new file mode 100644 index 00000000000..9e6916ddf32 --- /dev/null +++ b/modular_nova/modules/modular_weapons/code/company_and_or_faction_based/saibasan/projectiles.dm @@ -0,0 +1,235 @@ +// Red kill lasers for the big gun + +/obj/item/ammo_casing/energy/cybersun_big_kill + projectile_type = /obj/projectile/beam/cybersun_laser + e_cost = LASER_SHOTS(20, STANDARD_CELL_CHARGE * 2) + select_name = "Kill" + fire_sound = 'modular_nova/modules/modular_weapons/sounds/laser_firing/laser.ogg' + +/obj/projectile/beam/cybersun_laser + icon = 'modular_nova/modules/modular_weapons/icons/obj/company_and_or_faction_based/saibasan/projectiles.dmi' + icon_state = "kill_large" + damage = 20 + impact_effect_type = /obj/effect/temp_visual/impact_effect/red_laser + light_color = COLOR_SOFT_RED + wound_falloff_tile = 1 + +// Speedy sniper lasers for the big gun + +/obj/item/ammo_casing/energy/cybersun_big_sniper + projectile_type = /obj/projectile/beam/cybersun_laser/marksman + e_cost = LASER_SHOTS(10, STANDARD_CELL_CHARGE * 2) + select_name = "Marksman" + fire_sound = 'modular_nova/modules/modular_weapons/sounds/laser_firing/vaporize.ogg' + +/obj/projectile/beam/cybersun_laser/marksman + icon_state = "sniper" + damage = 50 + impact_effect_type = /obj/effect/temp_visual/impact_effect/yellow_laser + speed = 0.4 + light_range = 2 + light_color = COLOR_VERY_SOFT_YELLOW + wound_falloff_tile = 0.1 + +// Disabler machinegun for the big gun + +/obj/item/ammo_casing/energy/cybersun_big_disabler + projectile_type = /obj/projectile/beam/cybersun_laser/disable + e_cost = LASER_SHOTS(20, STANDARD_CELL_CHARGE * 2) + select_name = "Disable" + harmful = FALSE + +/obj/projectile/beam/cybersun_laser/disable + icon_state = "disable_large" + damage = 0 + stamina = 20 + impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser + light_color = COLOR_BRIGHT_BLUE + stamina_falloff_tile = 0.25 + +// Plasma burst grenade for the big gun + +/obj/item/ammo_casing/energy/cybersun_big_launcher + projectile_type = /obj/projectile/beam/cybersun_laser/granata + e_cost = LASER_SHOTS(5, STANDARD_CELL_CHARGE * 2) + select_name = "Launcher" + +/obj/projectile/beam/cybersun_laser/granata + name = "plasma grenade" + icon_state = "grenade" + damage = 50 + speed = 2 + range = 6 + impact_effect_type = /obj/effect/temp_visual/impact_effect/green_laser + light_color = COLOR_PALE_GREEN + pass_flags = PASSTABLE | PASSGRILLE // His ass does NOT pass through glass! + /// What type of casing should we put inside the bullet to act as shrapnel later + var/casing_to_spawn = /obj/item/grenade/c980payload/plasma_grenade + +/obj/projectile/beam/cybersun_laser/granata/on_hit(atom/target, blocked = 0, pierce_hit) + ..() + fuse_activation(target) + return BULLET_ACT_HIT + +/obj/projectile/beam/cybersun_laser/granata/on_range() + fuse_activation(get_turf(src)) + return ..() + +/// Called when the projectile reaches its max range, or hits something +/obj/projectile/beam/cybersun_laser/granata/proc/fuse_activation(atom/target) + var/obj/item/grenade/shrapnel_maker = new casing_to_spawn(get_turf(target)) + shrapnel_maker.detonate() + playsound(src, 'modular_nova/modules/modular_weapons/sounds/grenade_burst.ogg', 50, TRUE, -3) + qdel(shrapnel_maker) + +/obj/projectile/beam/cybersun_laser/granata_shrapnel + name = "plasma globule" + icon_state = "flare" + damage = 10 + speed = 2.5 + bare_wound_bonus = 55 // Lasers have a wound bonus of 40, this is a bit higher + wound_bonus = -50 // However we do not very much against armor + range = 2 + pass_flags = PASSTABLE | PASSGRILLE // His ass does NOT pass through glass! + weak_against_armour = TRUE + impact_effect_type = /obj/effect/temp_visual/impact_effect/green_laser + light_color = COLOR_PALE_GREEN + damage_falloff_tile = 3 + +/obj/item/grenade/c980payload/plasma_grenade + shrapnel_type = /obj/projectile/beam/cybersun_laser/granata_shrapnel + shrapnel_radius = 3 + +// Shotgun casing for the big gun + +/obj/item/ammo_casing/energy/cybersun_big_shotgun + projectile_type = /obj/projectile/beam/cybersun_laser/granata_shrapnel/shotgun_pellet + e_cost = LASER_SHOTS(10, STANDARD_CELL_CHARGE * 2) + pellets = 5 + variance = 30 + select_name = "Shotgun" + fire_sound = 'modular_nova/modules/modular_weapons/sounds/laser_firing/melt.ogg' + +/obj/projectile/beam/cybersun_laser/granata_shrapnel/shotgun_pellet + icon_state = "because_it_doesnt_miss" + damage = 10 + impact_effect_type = /obj/effect/temp_visual/impact_effect/purple_laser + speed = 0.8 + light_color = COLOR_SCIENCE_PINK + range = 9 + damage_falloff_tile = 0.5 + +// Hellfire lasers for the little guy + +/obj/item/ammo_casing/energy/cybersun_small_hellfire + projectile_type = /obj/projectile/beam/cybersun_laser/hellfire + e_cost = LASER_SHOTS(10, STANDARD_CELL_CHARGE) + select_name = "Incinerate" + fire_sound = 'modular_nova/modules/modular_weapons/sounds/laser_firing/incinerate.ogg' + +/obj/projectile/beam/cybersun_laser/hellfire + icon_state = "hellfire" + damage = 30 + impact_effect_type = /obj/effect/temp_visual/impact_effect/red_laser + speed = 0.6 + wound_bonus = 0 + light_color = COLOR_SOFT_RED + +// Bounce disabler lasers for the little guy + +/obj/item/ammo_casing/energy/cybersun_small_disabler + projectile_type = /obj/projectile/beam/cybersun_laser/disable_bounce + e_cost = LASER_SHOTS(10, STANDARD_CELL_CHARGE) + select_name = "Disable" + harmful = FALSE + +/obj/projectile/beam/cybersun_laser/disable_bounce + icon_state = "disable_bounce" + damage = 0 + stamina = 30 + impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser + light_color = COLOR_BRIGHT_BLUE + ricochet_auto_aim_angle = 30 + ricochet_auto_aim_range = 5 + ricochets_max = 2 + ricochet_incidence_leeway = 100 + ricochet_chance = 130 + ricochet_decay_damage = 0.8 + +/obj/projectile/beam/cybersun_laser/disable_bounce/check_ricochet_flag(atom/reflecting_atom) + if((reflecting_atom.flags_ricochet & RICOCHET_HARD) || (reflecting_atom.flags_ricochet & RICOCHET_SHINY)) + return TRUE + return FALSE + +// Flare launcher + +/obj/item/ammo_casing/energy/cybersun_small_launcher + projectile_type = /obj/projectile/beam/cybersun_laser/flare + e_cost = LASER_SHOTS(5, STANDARD_CELL_CHARGE) + select_name = "Flare" + +/obj/projectile/beam/cybersun_laser/flare + name = "plasma flare" + icon_state = "flare" + damage = 30 + speed = 2 + range = 6 + impact_effect_type = /obj/effect/temp_visual/impact_effect/green_laser + light_color = COLOR_PALE_GREEN + pass_flags = PASSTABLE | PASSGRILLE // His ass does NOT pass through glass! + /// How many firestacks the bullet should impart upon a target when impacting + var/firestacks_to_give = 2 + /// What we spawn when we range out + var/obj/illumination_flare = /obj/item/flashlight/flare/plasma_projectile + +/obj/projectile/beam/cybersun_laser/flare/on_hit(atom/target, blocked = 0, pierce_hit) + . = ..() + if(iscarbon(target)) + var/mob/living/carbon/gaslighter = target + gaslighter.adjust_fire_stacks(firestacks_to_give) + gaslighter.ignite_mob() + else + new illumination_flare(get_turf(target)) + +/obj/projectile/beam/cybersun_laser/flare/on_range() + new illumination_flare(get_turf(src)) + return ..() + +/obj/item/flashlight/flare/plasma_projectile + name = "plasma flare" + desc = "A burning glob of green plasma, makes an effective temporary lighting source." + light_range = 4 + anchored = TRUE + icon = 'modular_nova/modules/modular_weapons/icons/obj/company_and_or_faction_based/saibasan/projectiles.dmi' + icon_state = "flare_burn" + light_color = COLOR_PALE_GREEN + light_power = 2 + +/obj/item/flashlight/flare/plasma_projectile/Initialize(mapload) + . = ..() + if(randomize_fuel) + fuel = rand(3 MINUTES, 5 MINUTES) + ignition() + +/obj/item/flashlight/flare/plasma_projectile/turn_off() + . = ..() + qdel(src) + +// Shotgun casing for the small gun + +/obj/item/ammo_casing/energy/cybersun_small_shotgun + projectile_type = /obj/projectile/beam/cybersun_laser/granata_shrapnel/shotgun_pellet + e_cost = LASER_SHOTS(10, STANDARD_CELL_CHARGE) + pellets = 3 + variance = 15 + select_name = "Shotgun" + fire_sound = 'modular_nova/modules/modular_weapons/sounds/laser_firing/melt.ogg' + +// Dummy casing that does nothing but have a projectile that looks like a sword + +/obj/item/ammo_casing/energy/cybersun_small_blade + projectile_type = /obj/projectile/beam/cybersun_laser/blade + select_name = "Blade" + +/obj/projectile/beam/cybersun_laser/blade + icon_state = "blade" diff --git a/modular_nova/modules/modular_weapons/code/company_and_or_faction_based/szot_dynamica/ammo/plasma.dm b/modular_nova/modules/modular_weapons/code/company_and_or_faction_based/szot_dynamica/ammo/plasma.dm index f0ce4e32bd5..2f4c5bcbb13 100644 --- a/modular_nova/modules/modular_weapons/code/company_and_or_faction_based/szot_dynamica/ammo/plasma.dm +++ b/modular_nova/modules/modular_weapons/code/company_and_or_faction_based/szot_dynamica/ammo/plasma.dm @@ -2,7 +2,7 @@ /obj/item/ammo_casing/energy/laser/plasma_glob projectile_type = /obj/projectile/beam/laser/plasma_glob - fire_sound = 'modular_nova/modules/microfusion/sound/incinerate.ogg' + fire_sound = 'modular_nova/modules/modular_weapons/sounds/laser_firing/incinerate.ogg' /obj/item/ammo_casing/energy/laser/plasma_glob/Initialize(mapload) . = ..() diff --git a/modular_nova/modules/modular_weapons/code/company_and_or_faction_based/szot_dynamica/pistol.dm b/modular_nova/modules/modular_weapons/code/company_and_or_faction_based/szot_dynamica/pistol.dm index 068cf2508a5..f74e774fb0c 100644 --- a/modular_nova/modules/modular_weapons/code/company_and_or_faction_based/szot_dynamica/pistol.dm +++ b/modular_nova/modules/modular_weapons/code/company_and_or_faction_based/szot_dynamica/pistol.dm @@ -9,7 +9,7 @@ icon = 'modular_nova/modules/modular_weapons/icons/obj/company_and_or_faction_based/szot_dynamica/guns_32.dmi' icon_state = "slonce" - fire_sound = 'modular_nova/modules/microfusion/sound/incinerate.ogg' + fire_sound = 'modular_nova/modules/modular_weapons/sounds/laser_firing/incinerate.ogg' fire_sound_volume = 40 // This thing is comically loud otherwise w_class = WEIGHT_CLASS_NORMAL @@ -61,7 +61,7 @@ icon = 'modular_nova/modules/modular_weapons/icons/obj/company_and_or_faction_based/szot_dynamica/guns_32.dmi' icon_state = "gwiazda" - fire_sound = 'modular_nova/modules/microfusion/sound/burn.ogg' + fire_sound = 'modular_nova/modules/modular_weapons/sounds/laser_firing/burn.ogg' fire_sound_volume = 40 // This thing is comically loud otherwise w_class = WEIGHT_CLASS_NORMAL diff --git a/modular_nova/modules/modular_weapons/code/gun_racks.dm b/modular_nova/modules/modular_weapons/code/gun_racks.dm index c5c9b60a34b..f0905d5c31a 100644 --- a/modular_nova/modules/modular_weapons/code/gun_racks.dm +++ b/modular_nova/modules/modular_weapons/code/gun_racks.dm @@ -12,10 +12,6 @@ AddElement(/datum/element/connect_loc, loc_connections) if(!mapload) return - for(var/obj/item/found_item in loc.contents) - if(!isgun(found_item)) - continue - rotate_weapon(found_item) /obj/structure/rack/gunrack/attackby(obj/item/attacking_item, mob/living/user, params) var/list/modifiers = params2list(params) diff --git a/modular_nova/modules/modular_weapons/code/modular_projectiles.dm b/modular_nova/modules/modular_weapons/code/modular_projectiles.dm index 4a0625b491f..574d278dc09 100644 --- a/modular_nova/modules/modular_weapons/code/modular_projectiles.dm +++ b/modular_nova/modules/modular_weapons/code/modular_projectiles.dm @@ -107,63 +107,3 @@ /obj/projectile/bullet/a223/ap name = ".277 armor-piercing bullet" armour_penetration = 60 - -/* -* .34 ACP -*/ - -// Why? Blame CFA, they want their bullets to be *proprietary* -/obj/item/ammo_casing/c34 - name = ".34 bullet casing" - desc = "A .34 bullet casing." - caliber = "c34acp" - projectile_type = /obj/projectile/bullet/c34 - -/obj/projectile/bullet/c34 - name = ".34 bullet" - damage = 15 - wound_bonus = 0 - -/obj/item/ammo_casing/c34/rubber - name = ".34 rubber bullet casing" - desc = "A .34 rubber bullet casing." - caliber = "c34acp" - projectile_type = /obj/projectile/bullet/c34/rubber - harmful = FALSE - -/obj/projectile/bullet/c34/rubber - name = ".34 rubber bullet" - damage = 5 - stamina = 20 - wound_bonus = -75 - shrapnel_type = null - sharpness = NONE - embedding = null - -/obj/item/ammo_casing/c34/ap - name = ".34 armor-piercing bullet casing" - desc = "A .34 armor-piercing bullet casing." - caliber = "c34acp" - projectile_type = /obj/projectile/bullet/c34/ap - custom_materials = AMMO_MATS_AP - advanced_print_req = TRUE - -/obj/projectile/bullet/c34/ap - name = ".34 armor-piercing bullet" - damage = 15 - armour_penetration = 40 - wound_bonus = -75 - -/obj/item/ammo_casing/c34_incendiary - name = ".34 incendiary bullet casing" - desc = "A .34 incendiary bullet casing." - caliber = "c34acp" - projectile_type = /obj/projectile/bullet/incendiary/c34_incendiary - custom_materials = AMMO_MATS_TEMP - advanced_print_req = TRUE - -/obj/projectile/bullet/incendiary/c34_incendiary - name = ".34 incendiary bullet" - damage = 8 - fire_stacks = 1 - wound_bonus = -90 diff --git a/modular_nova/modules/modular_weapons/code/overrides/autolathe_designs.dm b/modular_nova/modules/modular_weapons/code/overrides/autolathe_designs.dm new file mode 100644 index 00000000000..56d4d3230cb --- /dev/null +++ b/modular_nova/modules/modular_weapons/code/overrides/autolathe_designs.dm @@ -0,0 +1,16 @@ +/* +* AMMO +*/ + +/datum/design/strilka310_rubber + name = ".310 Rubber Bullet (Less Lethal)" + id = "astrilka310_rubber" + build_type = AUTOLATHE + materials = list( + /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, + ) + build_path = /obj/item/ammo_casing/strilka310/rubber + category = list( + RND_CATEGORY_HACKED, + RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO, + ) diff --git a/modular_nova/modules/modular_weapons/code/ballistic_master.dm b/modular_nova/modules/modular_weapons/code/overrides/ballistic_master.dm similarity index 98% rename from modular_nova/modules/modular_weapons/code/ballistic_master.dm rename to modular_nova/modules/modular_weapons/code/overrides/ballistic_master.dm index fbb4ab76f56..0ede4607288 100644 --- a/modular_nova/modules/modular_weapons/code/ballistic_master.dm +++ b/modular_nova/modules/modular_weapons/code/overrides/ballistic_master.dm @@ -28,7 +28,7 @@ to_chat(user, span_notice("You load [num_loaded] [cartridge_wording]\s into [src][box_load ? ", but it takes some extra effort" : ""].")) /obj/effect/temp_visual/dir_setting/firing_effect - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 2 light_power = 1 light_color = LIGHT_COLOR_FIRE diff --git a/modular_nova/modules/modular_weapons/code/energy.dm b/modular_nova/modules/modular_weapons/code/overrides/energy.dm similarity index 100% rename from modular_nova/modules/modular_weapons/code/energy.dm rename to modular_nova/modules/modular_weapons/code/overrides/energy.dm diff --git a/modular_nova/modules/modular_weapons/code/suppressor_size_change_override.dm b/modular_nova/modules/modular_weapons/code/overrides/suppressor_size_change_override.dm similarity index 100% rename from modular_nova/modules/modular_weapons/code/suppressor_size_change_override.dm rename to modular_nova/modules/modular_weapons/code/overrides/suppressor_size_change_override.dm diff --git a/modular_nova/modules/modular_weapons/icons/mob/company_and_or_faction_based/saibasan/guns_lefthand.dmi b/modular_nova/modules/modular_weapons/icons/mob/company_and_or_faction_based/saibasan/guns_lefthand.dmi new file mode 100644 index 00000000000..2f83f957b72 Binary files /dev/null and b/modular_nova/modules/modular_weapons/icons/mob/company_and_or_faction_based/saibasan/guns_lefthand.dmi differ diff --git a/modular_nova/modules/modular_weapons/icons/mob/company_and_or_faction_based/saibasan/guns_righthand.dmi b/modular_nova/modules/modular_weapons/icons/mob/company_and_or_faction_based/saibasan/guns_righthand.dmi new file mode 100644 index 00000000000..55af184f1a3 Binary files /dev/null and b/modular_nova/modules/modular_weapons/icons/mob/company_and_or_faction_based/saibasan/guns_righthand.dmi differ diff --git a/modular_nova/modules/modular_weapons/icons/mob/company_and_or_faction_based/saibasan/guns_worn.dmi b/modular_nova/modules/modular_weapons/icons/mob/company_and_or_faction_based/saibasan/guns_worn.dmi new file mode 100644 index 00000000000..c74c2eafb25 Binary files /dev/null and b/modular_nova/modules/modular_weapons/icons/mob/company_and_or_faction_based/saibasan/guns_worn.dmi differ diff --git a/modular_nova/modules/modular_weapons/icons/obj/company_and_or_faction_based/saibasan/guns32x.dmi b/modular_nova/modules/modular_weapons/icons/obj/company_and_or_faction_based/saibasan/guns32x.dmi new file mode 100644 index 00000000000..f4660689ae4 Binary files /dev/null and b/modular_nova/modules/modular_weapons/icons/obj/company_and_or_faction_based/saibasan/guns32x.dmi differ diff --git a/modular_nova/modules/modular_weapons/icons/obj/company_and_or_faction_based/saibasan/guns48x.dmi b/modular_nova/modules/modular_weapons/icons/obj/company_and_or_faction_based/saibasan/guns48x.dmi new file mode 100644 index 00000000000..e7e5c519f71 Binary files /dev/null and b/modular_nova/modules/modular_weapons/icons/obj/company_and_or_faction_based/saibasan/guns48x.dmi differ diff --git a/modular_nova/modules/modular_weapons/icons/obj/company_and_or_faction_based/saibasan/projectiles.dmi b/modular_nova/modules/modular_weapons/icons/obj/company_and_or_faction_based/saibasan/projectiles.dmi new file mode 100644 index 00000000000..0a871ca1720 Binary files /dev/null and b/modular_nova/modules/modular_weapons/icons/obj/company_and_or_faction_based/saibasan/projectiles.dmi differ diff --git a/modular_nova/modules/microfusion/sound/burn.ogg b/modular_nova/modules/modular_weapons/sounds/laser_firing/burn.ogg similarity index 100% rename from modular_nova/modules/microfusion/sound/burn.ogg rename to modular_nova/modules/modular_weapons/sounds/laser_firing/burn.ogg diff --git a/modular_nova/modules/microfusion/sound/incinerate.ogg b/modular_nova/modules/modular_weapons/sounds/laser_firing/incinerate.ogg similarity index 100% rename from modular_nova/modules/microfusion/sound/incinerate.ogg rename to modular_nova/modules/modular_weapons/sounds/laser_firing/incinerate.ogg diff --git a/modular_nova/modules/microfusion/sound/laser_1.ogg b/modular_nova/modules/modular_weapons/sounds/laser_firing/laser.ogg similarity index 100% rename from modular_nova/modules/microfusion/sound/laser_1.ogg rename to modular_nova/modules/modular_weapons/sounds/laser_firing/laser.ogg diff --git a/modular_nova/modules/microfusion/sound/melt.ogg b/modular_nova/modules/modular_weapons/sounds/laser_firing/melt.ogg similarity index 100% rename from modular_nova/modules/microfusion/sound/melt.ogg rename to modular_nova/modules/modular_weapons/sounds/laser_firing/melt.ogg diff --git a/modular_nova/modules/microfusion/sound/vaporize.ogg b/modular_nova/modules/modular_weapons/sounds/laser_firing/vaporize.ogg similarity index 100% rename from modular_nova/modules/microfusion/sound/vaporize.ogg rename to modular_nova/modules/modular_weapons/sounds/laser_firing/vaporize.ogg diff --git a/modular_nova/modules/mold/code/mold_mobs.dm b/modular_nova/modules/mold/code/mold_mobs.dm index 0c9f401aeb8..bd8f24794c9 100644 --- a/modular_nova/modules/mold/code/mold_mobs.dm +++ b/modular_nova/modules/mold/code/mold_mobs.dm @@ -48,7 +48,7 @@ gold_core_spawnable = HOSTILE_SPAWN death_message = "evaporates!" - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_color = LIGHT_COLOR_FIRE light_range = 2 light_power = 1 @@ -252,7 +252,7 @@ obj_damage = 40 attack_sound = 'sound/effects/wounds/crackandbleed.ogg' - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_range = 2 light_power = 1 light_color = LIGHT_COLOR_GREEN diff --git a/modular_nova/modules/mold/code/mold_structures.dm b/modular_nova/modules/mold/code/mold_structures.dm index 243f5e173ac..587afbd0ace 100644 --- a/modular_nova/modules/mold/code/mold_structures.dm +++ b/modular_nova/modules/mold/code/mold_structures.dm @@ -380,7 +380,13 @@ /obj/structure/mold/structure/spawner/Initialize(mapload) . = ..() - AddComponent(/datum/component/spawner, mold_type.mob_types, mold_type.spawn_cooldown, mold_type.max_spawns, list(FACTION_MOLD), "emerges from") + AddComponent(/datum/component/spawner, \ + spawn_types = mold_type.mob_types, \ + spawn_time = mold_type.spawn_cooldown, \ + max_spawned = mold_type.max_spawns, \ + faction = list(FACTION_MOLD), \ + spawn_text = "emerges from", \ + ) #undef CORE_RETALIATION_COOLDOWN #undef MOLD_BULB_ALPHA diff --git a/modular_nova/modules/multicellcharger/code/multi_cell_charger.dm b/modular_nova/modules/multicellcharger/code/multi_cell_charger.dm index fc984e7aa97..e991087fb39 100644 --- a/modular_nova/modules/multicellcharger/code/multi_cell_charger.dm +++ b/modular_nova/modules/multicellcharger/code/multi_cell_charger.dm @@ -133,7 +133,7 @@ for(var/obj/item/stock_parts/cell/charging in charging_batteries) charging.emp_act(severity) -/obj/machinery/cell_charger_multi/deconstruct() +/obj/machinery/cell_charger_multi/on_deconstruction(disassembled) for(var/obj/item/stock_parts/cell/charging in charging_batteries) charging.forceMove(drop_location()) charging_batteries = null diff --git a/modular_nova/modules/primitive_catgirls/code/clothing.dm b/modular_nova/modules/primitive_catgirls/code/clothing.dm index 04f25669403..cf503048021 100644 --- a/modular_nova/modules/primitive_catgirls/code/clothing.dm +++ b/modular_nova/modules/primitive_catgirls/code/clothing.dm @@ -28,6 +28,19 @@ flags_1 = IS_PLAYER_COLORABLE_1 has_sensor = FALSE +/obj/item/clothing/under/dress/skirt/primitive_catgirl_tailored_dress + name = "tailored dress" + desc = "A handmade dress, tailored to one's" + icon_state = "tailored_dress" + icon = 'modular_nova/modules/primitive_catgirls/icons/clothing_greyscale.dmi' + worn_icon = 'modular_nova/modules/primitive_catgirls/icons/clothing_greyscale.dmi' + body_parts_covered = GROIN|CHEST + greyscale_config = /datum/greyscale_config/primitive_catgirl_tailored_dress + greyscale_config_worn = /datum/greyscale_config/primitive_catgirl_tailored_dress/worn + greyscale_colors = "#cec8bf#364660" + flags_1 = IS_PLAYER_COLORABLE_1 + has_sensor = FALSE + // Hands /obj/item/clothing/gloves/fingerless/primitive_catgirl_armwraps @@ -71,6 +84,21 @@ greyscale_colors = "#594032#cec8bf" flags_1 = IS_PLAYER_COLORABLE_1 +/obj/item/clothing/suit/jacket/primitive_catgirl_tunic + name = "handmade tunic" + desc = "A simple garment, that reaches from the shoulders to above the knee. This one has a belt to secure it." + icon_state = "tunic" + icon = 'modular_nova/modules/primitive_catgirls/icons/clothing_greyscale.dmi' + worn_icon = 'modular_nova/modules/primitive_catgirls/icons/clothing_greyscale.dmi' + body_parts_covered = CHEST + cold_protection = CHEST + min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT + supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON + greyscale_config = /datum/greyscale_config/primitive_catgirl_tunic + greyscale_config_worn = /datum/greyscale_config/primitive_catgirl_tunic/worn + greyscale_colors = "#cec8bf#faece4#594032" + flags_1 = IS_PLAYER_COLORABLE_1 + /obj/item/clothing/suit/apron/chef/colorable_apron/primitive_catgirl_leather greyscale_colors = "#594032" @@ -132,6 +160,19 @@ /obj/item/clothing/head/standalone_hood/primitive_catgirl_colors greyscale_colors = "#594032#364660" +/obj/item/clothing/head/primitive_catgirl_ferroniere + name = "Ferroniere" + desc = "A style of headband that encircles the wearer's forehead, with a small jewel suspended in the centre." + icon_state = "ferroniere" + icon = 'modular_nova/modules/primitive_catgirls/icons/clothing_greyscale.dmi' + worn_icon = 'modular_nova/modules/primitive_catgirls/icons/clothing_greyscale.dmi' + greyscale_config = /datum/greyscale_config/primitive_catgirl_ferroniere + greyscale_config_worn = /datum/greyscale_config/primitive_catgirl_ferroniere/worn + greyscale_colors = "#f1f6ff#364660" + w_class = WEIGHT_CLASS_TINY + flags_1 = IS_PLAYER_COLORABLE_1 + actions_types = list(/datum/action/item_action/adjust) + // Misc Items /obj/item/forging/reagent_weapon/axe/fake_copper diff --git a/modular_nova/modules/primitive_catgirls/code/clothing_vendor.dm b/modular_nova/modules/primitive_catgirls/code/clothing_vendor.dm index 2f786daf0ac..52193a5466c 100644 --- a/modular_nova/modules/primitive_catgirls/code/clothing_vendor.dm +++ b/modular_nova/modules/primitive_catgirls/code/clothing_vendor.dm @@ -11,7 +11,9 @@ products = list( /obj/item/clothing/under/dress/skirt/primitive_catgirl_body_wraps = 15, + /obj/item/clothing/under/dress/skirt/primitive_catgirl_tailored_dress = 15, /obj/item/clothing/suit/jacket/primitive_catgirl_coat = 15, + /obj/item/clothing/suit/jacket/primitive_catgirl_tunic = 15, /obj/item/clothing/gloves/fingerless/primitive_catgirl_armwraps = 15, /obj/item/clothing/shoes/winterboots/ice_boots/primitive_catgirl_boots = 15, /obj/item/clothing/gloves/fingerless/primitive_catgirl_gauntlets = 10, @@ -24,7 +26,9 @@ /obj/item/clothing/neck/infinity_scarf/primitive_catgirl_blue = 5, /obj/item/clothing/neck/mantle/recolorable/primitive_catgirl_off_white = 5, /obj/item/clothing/neck/ranger_poncho/primitive_catgirl_leather = 5, + /obj/item/clothing/neck/wide_cape = 5, /obj/item/clothing/glasses/eyepatch/wrap = 5, + /obj/item/clothing/head/primitive_catgirl_ferroniere = 5, /obj/item/clothing/head/pelt/snow_tiger = 5, /obj/item/clothing/head/pelt = 5, /obj/item/clothing/head/pelt/black = 5, diff --git a/modular_nova/modules/primitive_catgirls/code/spawner.dm b/modular_nova/modules/primitive_catgirls/code/spawner.dm index 54d8f1d775f..fc75e53354d 100644 --- a/modular_nova/modules/primitive_catgirls/code/spawner.dm +++ b/modular_nova/modules/primitive_catgirls/code/spawner.dm @@ -25,6 +25,10 @@ uses = 12 deletes_on_zero_uses_left = FALSE + /// The minimum time someone needs to be SSD before they can be put back in + var/ssd_time = 30 MINUTES + + /obj/effect/mob_spawn/ghost_role/human/primitive_catgirl/Initialize(mapload) . = ..() team = new /datum/team/primitive_catgirls() @@ -52,7 +56,7 @@ to_chat(user, span_warning("It'd be weird if there were multiple of you in that cave, wouldn't it?")) return FALSE -// This stuff is put on equip because it turns out /special sometimes just don't get called because skyrat +// This stuff is put on equip because it turns out /special sometimes just don't get called because Nova /obj/effect/mob_spawn/ghost_role/human/primitive_catgirl/equip(mob/living/carbon/human/spawned_human) . = ..() @@ -60,6 +64,129 @@ team.players_spawned += (spawned_human.key) + +/obj/effect/mob_spawn/ghost_role/human/primitive_catgirl/MouseDrop_T(mob/living/carbon/human/target, mob/living/user) + if(!isprimitivedemihuman(target) || !can_interact(user) || !target.Adjacent(user) || target.buckled) + return + + if(target.stat == DEAD) + to_chat(user, span_danger("Dead kin cannot be put back to sleep.")) + return + + if(target.key && target != user) + if(!target.get_organ_by_type(/obj/item/organ/internal/brain) || (target.mind && !target.ssd_indicator)) + to_chat(user, span_danger("Awake kin cannot be put back to sleep against their will.")) + return + + if(target.lastclienttime + ssd_time >= world.time) + to_chat(user, span_userdanger("You can't put [target] into [src] for another [round(((ssd_time - (world.time - target.lastclienttime)) / (1 MINUTES)), 1)] minutes.")) + log_admin("[key_name(user)] has attempted to put [key_name(target)] back into [src], but they were only disconnected for [round(((world.time - target.lastclienttime) / (1 MINUTES)), 1)] minutes.") + message_admins("[key_name(user)] has attempted to put [key_name(target)] back into [src]. [ADMIN_JMP(src)]") + return + + else if(tgui_alert(user, "Would you like to place [target] into [src]?", "Put back to sleep?", list("Yes", "No")) == "Yes") + + visible_message(span_infoplain("[user] starts putting [target] into [src]...")) + + if(!do_after(user, 3 SECONDS, target)) + balloon_alert("cancelled transfer!") + return + + to_chat(user, span_danger("You put [target] into [src].")) + log_admin("[key_name(user)] has put [key_name(target)] back into [src].") + message_admins("[key_name(user)] has put [key_name(target)] back into [src]. [ADMIN_JMP(src)]") + + if(target == user) + if(tgui_alert(target, "Would you like to go back to sleep?", "Go back to sleep?", list("Yes", "No")) != "Yes") + return + + visible_message(span_infoplain("[user] starts climbing down into [src]...")) + + if(!do_after(user, 3 SECONDS, target)) + balloon_alert("cancelled transfer!") + return + + if(LAZYLEN(target.buckled_mobs) > 0) + if(target == user) + to_chat(user, span_danger("You can't fit into [src] while someone is buckled to you.")) + else + to_chat(user, span_danger("You can't fit [target] into [src] while someone is buckled to them.")) + + return + + // Just in case something happened in-between, to make sure it doesn't do unexpected behaviors. + if(!isprimitivedemihuman(target) || !can_interact(user) || !target.Adjacent(user) || target.buckled || target.stat == DEAD) + return + + if(target == user) + visible_message(span_infoplain("[user] climbs down into [src].")) + else + visible_message(span_infoplain("[user] puts [target] into [src].")) + + log_admin("[key_name(target)] returned to [src].") + message_admins("[key_name_admin(target)] returned to [src]. [ADMIN_JMP(src)]") + add_fingerprint(target) + put_back_in(target) + + +/** + * Puts the target back into the spawner, effectively qdel'ing them after + * stripping them of all their items, and finishes by adding back a use to the + * spawner. + */ +/obj/effect/mob_spawn/ghost_role/human/primitive_catgirl/proc/put_back_in(mob/living/carbon/human/target) + if(!istype(target)) + return + + // We don't want to constantly drop stuff that they spawn with. + var/static/list/item_drop_blacklist + if(!item_drop_blacklist) + item_drop_blacklist = generate_item_drop_blacklist() + + for(var/obj/item/item in target) + if(item_drop_blacklist[item.type] || (item.item_flags & ABSTRACT) || HAS_TRAIT(item, TRAIT_NODROP)) + continue + + target.dropItemToGround(item, FALSE) + + // We make sure people can come back in again, if they needed to fix prefs + // or whatever. + team.players_spawned -= (target.key) + team.remove_member(target.mind) + + for(var/list/record in GLOB.ghost_records) + if(record["name"] == target.real_name) + GLOB.ghost_records.Remove(list(record)) + break + + // Just so the target's ghost ends up above the hole. + target.forceMove(loc) + target.ghostize(FALSE) + + qdel(target) + + uses += 1 + + +/** + * Simple helper to generate the item drop blacklist based on the spawner's + * outfit, only taking the used slots into account. + */ +/obj/effect/mob_spawn/ghost_role/human/primitive_catgirl/proc/generate_item_drop_blacklist() + PROTECTED_PROC(TRUE) + + var/list/blacklist = list() + + blacklist[initial(outfit.uniform)] = TRUE + blacklist[initial(outfit.shoes)] = TRUE + blacklist[initial(outfit.gloves)] = TRUE + blacklist[initial(outfit.suit)] = TRUE + blacklist[initial(outfit.neck)] = TRUE + blacklist[initial(outfit.back)] = TRUE + + return blacklist + + /datum/job/primitive_catgirl title = "Icemoon Dweller" diff --git a/modular_nova/modules/primitive_catgirls/icons/clothing_greyscale.dmi b/modular_nova/modules/primitive_catgirls/icons/clothing_greyscale.dmi index 624770af4d8..61d68cab4e2 100644 Binary files a/modular_nova/modules/primitive_catgirls/icons/clothing_greyscale.dmi and b/modular_nova/modules/primitive_catgirls/icons/clothing_greyscale.dmi differ diff --git a/modular_nova/modules/projectiles/icons/inhands/lefthand.dmi b/modular_nova/modules/projectiles/icons/inhands/lefthand.dmi deleted file mode 100644 index 43406149649..00000000000 Binary files a/modular_nova/modules/projectiles/icons/inhands/lefthand.dmi and /dev/null differ diff --git a/modular_nova/modules/projectiles/icons/inhands/righthand.dmi b/modular_nova/modules/projectiles/icons/inhands/righthand.dmi deleted file mode 100644 index 935f37fd05c..00000000000 Binary files a/modular_nova/modules/projectiles/icons/inhands/righthand.dmi and /dev/null differ diff --git a/modular_nova/modules/projectiles/icons/m6pdw.dmi b/modular_nova/modules/projectiles/icons/m6pdw.dmi deleted file mode 100644 index 13a3166baeb..00000000000 Binary files a/modular_nova/modules/projectiles/icons/m6pdw.dmi and /dev/null differ diff --git a/modular_nova/modules/reagent_forging/code/forge.dm b/modular_nova/modules/reagent_forging/code/forge.dm index a3e2e639cbf..a52b0f9f49e 100644 --- a/modular_nova/modules/reagent_forging/code/forge.dm +++ b/modular_nova/modules/reagent_forging/code/forge.dm @@ -461,6 +461,12 @@ handle_metal_cup_melting(attacking_item, user) return TRUE + if(istype(attacking_item, /obj/item/stack/rods)) + in_use = TRUE + smelt_iron_rods(attacking_item, user) + in_use = FALSE + return TRUE + return ..() /// Take the given tray and place it inside the forge, updating everything relevant to that @@ -740,6 +746,46 @@ COOLDOWN_START(spawned_glass, remaining_heat, glassblowing_amount) spawned_glass.total_time = glassblowing_amount +/// Almost a copy from the proc smelt_ore but to smelt iron rods +/obj/structure/reagent_forge/proc/smelt_iron_rods(obj/attacking_item, mob/living/user) + + var/obj/item/stack/rods/rod_item = attacking_item + + if(!istype(rod_item)) + return + + if(forge_temperature < MIN_FORGE_TEMP) + fail_message(user, "forge too cool") + return + + var/skill_modifier = user.mind.get_skill_modifier(/datum/skill/smithing, SKILL_SPEED_MODIFIER) + + if(rod_item.amount < 2) + fail_message(user, "too few iron rods to smelt") + return + + balloon_alert_to_viewers("smelting...") + + if(!do_after(user, skill_modifier * 3 SECONDS, target = src)) + fail_message(user, "stopped smelting [rod_item]") + return + + var/src_turf = get_turf(src) + var/spawning_item = /obj/item/stack/sheet/iron + var/rods_to_sheet_amount = round((rod_item.amount / 2)) + var/used_rods = rod_item.amount + + if(ISODD(used_rods)) + used_rods = used_rods - 1 + + rod_item.use(used_rods) + var/obj/item/stack/sheet/iron/result = new spawning_item(src_turf) + + if(rods_to_sheet_amount > 1) + result.add(rods_to_sheet_amount - 1) + + balloon_alert_to_viewers("finished smelting!") + /obj/structure/reagent_forge/billow_act(mob/living/user, obj/item/tool) if(in_use) // Preventing billow use if the forge is in use to prevent spam fail_message(user, "forge busy") diff --git a/modular_nova/modules/roundstart_implants/code/loadout_implants.dm b/modular_nova/modules/roundstart_implants/code/loadout_implants.dm new file mode 100644 index 00000000000..7582d219b55 --- /dev/null +++ b/modular_nova/modules/roundstart_implants/code/loadout_implants.dm @@ -0,0 +1,99 @@ +// Core balance principles with these roundstart augments is that they are SLOW. 2 toolspeed minimum where possible - finding actual things in round should always be better, this is for flavor and accessibility. The accessibility alone already provides these with a lot of value. + +// EYE IMPLANTS + +/obj/item/organ/internal/eyes/robotic/binoculars + name = "digital magnification optics" + desc = "Commonly used on frontier worlds with comparatively vast overland distances to aid in visual acquisition of coworkers and targets." + actions_types = list(/datum/action/item_action/organ_action/toggle) + var/zoomed = FALSE + var/range_power = 2 // what kind of range modifier do we feed to the scope component? + +/obj/item/organ/internal/eyes/robotic/binoculars/Initialize(mapload) + . = ..() + AddComponent(/datum/component/scope, range_modifier = range_power) + +/obj/item/organ/internal/eyes/robotic/binoculars/ui_action_click(mob/user, actiontype) + if (istype(actiontype, /datum/action/item_action/organ_action/toggle)) + toggle_active(user) + +/obj/item/organ/internal/eyes/robotic/binoculars/proc/toggle_active(mob/user) + //this is so unbelievably, hysterically jank. i actually cannot believe this works. what the fuck + var/datum/component/scope/zoom = src.GetComponent(/datum/component/scope) + if (zoomed) + zoom.stop_zooming(user) + zoomed = FALSE + else + //check if they're blind + if (user.is_blind()) + user.balloon_alert(user, "can't activate magnification while blind!") + return + + zoom.zoom(user) + zoomed = TRUE + +// ARM IMPLANTS +/obj/item/organ/internal/cyberimp/arm/adjuster + name = "adjuster arm implant" + desc = "A miniaturized toolset implant containing a simple fingertip-mounted universal screwdriver bit with an inverted torque-wrench head. Most commonly used when rearranging furniture or other station machinery." + items_to_create = list(/obj/item/wrench/integrated, /obj/item/screwdriver/integrated) + +/obj/item/organ/internal/cyberimp/arm/adjuster/Initialize(mapload) + . = ..() + AddElement(/datum/element/manufacturer_examine, COMPANY_NAKAMURA) + +/obj/item/organ/internal/cyberimp/arm/electrical_toolset + name = "electrical toolset implant" + desc = "Bereft of any kind of insulation to speak of, this aug has a very distinct nickname amongst frontier outpost crews: 'the sizzler'. Often used in high verticality environments where loadout space is at a premium." + items_to_create = list(/obj/item/screwdriver/integrated, /obj/item/multitool/integrated) + +/obj/item/organ/internal/cyberimp/arm/electrical_toolset/Initialize(mapload) + . = ..() + AddElement(/datum/element/manufacturer_examine, COMPANY_NAKAMURA) + +/obj/item/organ/internal/cyberimp/arm/arc_welder + name = "shipbreaker's toolset implant" + desc = "A specialized salvage-grade implant that houses an arc welder, miniaturized crowbar within the bearer's arm, plus a fingertip torque-wrench rated for enough newtons to get the job done. Renowned across the frontier for being the 'trashy tattoo' equivalent of someone's first aug." + items_to_create = list(/obj/item/wrench/integrated, /obj/item/crowbar/integrated, /obj/item/weldingtool/electric/arc_welder/integrated) + +/obj/item/organ/internal/cyberimp/arm/arc_welder/Initialize(mapload) + . = ..() + AddElement(/datum/element/manufacturer_examine, COMPANY_FRONTIER) + +/obj/item/organ/internal/cyberimp/arm/emt_triage + name = "triage actuator implant" + desc = "Pioneered by Interdyne Pharmaceuticals for use in their frontier postings, this set of in-arm augments allows medical staff to perform basic life-saving surgeries out on the field with the assistance of a bladed instrument." + items_to_create = list(/obj/item/surgical_drapes/integrated, /obj/item/retractor/integrated, /obj/item/hemostat/integrated) + +/obj/item/organ/internal/cyberimp/arm/emt_triage/Initialize(mapload) + . = ..() + AddElement(/datum/element/manufacturer_examine, COMPANY_INTERDYNE) + +/obj/item/organ/internal/cyberimp/arm/civilian_barstaff + name = "waitstaff implant" + desc = "The galactic service industry demands only the finest from its (underpaid) employees, leading to the development of this sordid piece of technology which substitutes a user's organic arm for a food storage space and an integrated chamois cleaning cloth. Why?" + items_to_create = list(/obj/item/storage/bag/tray/integrated, /obj/item/reagent_containers/cup/rag/integrated) + +/obj/item/organ/internal/cyberimp/arm/civilian_lighter + name = "thumbtip lighter implant" + desc = "This extraordinarily useless implant was a product of market demand, and it exists because the galactic diaspora apparently craves the ability to light things with their thumbtips." + items_to_create = list(/obj/item/lighter/integrated) + +/obj/item/organ/internal/cyberimp/arm/blacksteel_forging + name = "Blacksteel 'Starforge' metalworking toolset implant" + desc = "A galactic favorite amongst burgeoning starfarer races with a fascination for basic metallurgy or mundane weaponry, this unlikely toolset augmentation is one of the Foundation's most popular products." + items_to_create = list(/obj/item/forging/hammer/integrated, /obj/item/forging/tongs/integrated, /obj/item/forging/billow/integrated) + +/obj/item/organ/internal/cyberimp/arm/blacksteel_forging/Initialize(mapload) + . = ..() + AddElement(/datum/element/manufacturer_examine, COMPANY_BLACKSTEEL) + +/obj/item/organ/internal/cyberimp/arm/bureaucracy + name = "bureaucrat's 'Jacent' toolset implant" + desc = "Popular amongst coreworld corporates, this integrated toolset includes a wrist-sheathed four-colour pen, a special motorized sheaf hollow for holding up to ten pieces of galactic-standard A4 paper and a set of two fingertip stamps for approving and denying things. Does not replenish." + items_to_create = list(/obj/item/pen/fourcolor/integrated, /obj/item/paper_bin/integrated, /obj/item/stamp/integrated, /obj/item/stamp/denied/integrated) + +/obj/item/organ/internal/cyberimp/arm/cargo + name = "FTU 'Deckhand' toolset implant" + desc = "Containing a fingertip-mounted universal scanner and a boxcutter, deck workers across the sector favor this cheap and effective implant as both a means of self-defense from irate consumers and for keeping a set of handy scanners quite literally, close at hand." + items_to_create = list(/obj/item/universal_scanner/integrated, /obj/item/boxcutter/extended/integrated) diff --git a/modular_nova/modules/roundstart_implants/code/loadout_subtypes.dm b/modular_nova/modules/roundstart_implants/code/loadout_subtypes.dm new file mode 100644 index 00000000000..86a9155e419 --- /dev/null +++ b/modular_nova/modules/roundstart_implants/code/loadout_subtypes.dm @@ -0,0 +1,83 @@ +//This entire file just contains special subtypes for the loadout_implants roundstart augs that makes them work with the system. +//Purely code readability. + +// ARM IMPLANTS +/obj/item/organ/internal/cyberimp/arm/adjuster/left_arm + zone = BODY_ZONE_L_ARM + slot = ORGAN_SLOT_LEFT_ARM_AUG + +/obj/item/organ/internal/cyberimp/arm/adjuster/right_arm + zone = BODY_ZONE_R_ARM + slot = ORGAN_SLOT_RIGHT_ARM_AUG + +/obj/item/organ/internal/cyberimp/arm/lighter/left_arm + zone = BODY_ZONE_L_ARM + slot = ORGAN_SLOT_LEFT_ARM_AUG + +/obj/item/organ/internal/cyberimp/arm/lighter/right_arm + zone = BODY_ZONE_R_ARM + slot = ORGAN_SLOT_RIGHT_ARM_AUG + +/obj/item/organ/internal/cyberimp/arm/arc_welder/left_arm + zone = BODY_ZONE_L_ARM + slot = ORGAN_SLOT_LEFT_ARM_AUG + +/obj/item/organ/internal/cyberimp/arm/arc_welder/right_arm + zone = BODY_ZONE_R_ARM + slot = ORGAN_SLOT_RIGHT_ARM_AUG + +/obj/item/organ/internal/cyberimp/arm/electrical_toolset/left_arm + zone = BODY_ZONE_L_ARM + slot = ORGAN_SLOT_LEFT_ARM_AUG + +/obj/item/organ/internal/cyberimp/arm/electrical_toolset/right_arm + zone = BODY_ZONE_R_ARM + slot = ORGAN_SLOT_RIGHT_ARM_AUG + +/obj/item/organ/internal/cyberimp/arm/emt_triage/left_arm + zone = BODY_ZONE_L_ARM + slot = ORGAN_SLOT_LEFT_ARM_AUG + +/obj/item/organ/internal/cyberimp/arm/emt_triage/right_arm + zone = BODY_ZONE_R_ARM + slot = ORGAN_SLOT_RIGHT_ARM_AUG + +/obj/item/organ/internal/cyberimp/arm/civilian_barstaff/left_arm + zone = BODY_ZONE_L_ARM + slot = ORGAN_SLOT_LEFT_ARM_AUG + +/obj/item/organ/internal/cyberimp/arm/civilian_barstaff/right_arm + zone = BODY_ZONE_R_ARM + slot = ORGAN_SLOT_RIGHT_ARM_AUG + +/obj/item/organ/internal/cyberimp/arm/civilian_lighter/left_arm + zone = BODY_ZONE_L_ARM + slot = ORGAN_SLOT_LEFT_ARM_AUG + +/obj/item/organ/internal/cyberimp/arm/civilian_lighter/right_arm + zone = BODY_ZONE_R_ARM + slot = ORGAN_SLOT_RIGHT_ARM_AUG + +/obj/item/organ/internal/cyberimp/arm/blacksteel_forging/left_arm + zone = BODY_ZONE_L_ARM + slot = ORGAN_SLOT_LEFT_ARM_AUG + +/obj/item/organ/internal/cyberimp/arm/blacksteel_forging/right_arm + zone = BODY_ZONE_R_ARM + slot = ORGAN_SLOT_RIGHT_ARM_AUG + +/obj/item/organ/internal/cyberimp/arm/bureaucracy/left_arm + zone = BODY_ZONE_L_ARM + slot = ORGAN_SLOT_LEFT_ARM_AUG + +/obj/item/organ/internal/cyberimp/arm/bureaucracy/right_arm + zone = BODY_ZONE_R_ARM + slot = ORGAN_SLOT_RIGHT_ARM_AUG + +/obj/item/organ/internal/cyberimp/arm/cargo/left_arm + zone = BODY_ZONE_L_ARM + slot = ORGAN_SLOT_LEFT_ARM_AUG + +/obj/item/organ/internal/cyberimp/arm/cargo/right_arm + zone = BODY_ZONE_R_ARM + slot = ORGAN_SLOT_RIGHT_ARM_AUG diff --git a/modular_nova/modules/roundstart_implants/code/tool_subtypes.dm b/modular_nova/modules/roundstart_implants/code/tool_subtypes.dm new file mode 100644 index 00000000000..d3a65078aed --- /dev/null +++ b/modular_nova/modules/roundstart_implants/code/tool_subtypes.dm @@ -0,0 +1,148 @@ +// ENGINEERING + +/obj/item/wrench/integrated + name = "motorized fingertip wrench-bit" + desc = "A cheap inverted fingertip replacement complete with a small-factor motor and torque wrenching bit. Works on most station standard applications, but is often slower than using a hand wrench." + toolspeed = 1.25 + +/obj/item/wrench/integrated/Initialize(mapload) + . = ..() + AddElement(/datum/element/manufacturer_examine, COMPANY_NAKAMURA) + +/obj/item/screwdriver/integrated + name = "motorized fingertip screw-bit" + desc = "A cheap inverted fingertip replacement that extends into a sturdy universal screwdriver head, complete with a small-factor motor. A bit slow, but gets the job done." + toolspeed = 1.25 + +/obj/item/screwdriver/integrated/Initialize(mapload) + . = ..() + AddElement(/datum/element/manufacturer_examine, COMPANY_NAKAMURA) + +/obj/item/crowbar/integrated + name = "integrated crowbar" + desc = "Rumour has it that people over a thousand people died in the resulting espionage centered around the exact angular dimensions that make this feat of physics and leverage possible. Retreats back into the bearer's arm when not in use." + toolspeed = 1.25 + +/obj/item/crowbar/integrated/Initialize(mapload) + . = ..() + AddElement(/datum/element/manufacturer_examine, COMPANY_NAKAMURA) + +/obj/item/multitool/integrated + name = "integrated 'multitool' diagnostics device" + desc = "Combining a set of fingertip probes fed back into an internal coprocessor, this useful little device has made its way into the arms of engineers and maintenance technicians galaxy-wide." + toolspeed = 1.25 + +/obj/item/multitool/integrated/Initialize(mapload) + . = ..() + AddElement(/datum/element/manufacturer_examine, COMPANY_NAKAMURA) + +/obj/item/weldingtool/electric/arc_welder/integrated + name = "integrated arc welder" + desc = "Stripped down enough to fit inside a standard humanoid arm, this specialized tool guzzles power like nobody's business and produces a slightly weaker arc. It gets the job done, but you're putting a power cell inside your arm and signing all the OHS waivers that comes with." + toolspeed = 1.25 //25% slower. really fucking slow, since synths can repair themselves with this + +/obj/item/weldingtool/electric/arc_welder/integrated/switched_on(mob/user) + . = ..() + force = 12 // paxil tells me it's not a HUGE issue to do this but i still think force 15 is too much so force 12 we do + +// MEDICAL + +/obj/item/surgical_drapes/integrated + name = "hardlight surgical indicators" + desc = "A basic array of hardlight markers used in rudimentary surgical procedures where more specialized equipment isn't available, co-opted from wound analyzer hardware. Lays out the groundwork protocols for basic surgeries when levelled at a target." + +/obj/item/surgical_drapes/integrated/Initialize(mapload) + . = ..() + AddComponent(/datum/component/surgery_initiator) + AddElement(/datum/element/manufacturer_examine, COMPANY_INTERDYNE) + +/obj/item/hemostat/integrated + name = "integrated hemostatic clamp" + desc = "More or less a glorified set of forceps with slightly serrated teeth and a dedicated interlocking mechanism, all miniaturized to fit inside a finger." + toolspeed = 1.25 // this will directly affect how fast someone can tend wounds with this setup, balancejak accordingly + +/obj/item/hemostat/integrated/Initialize(mapload) + . = ..() + AddElement(/datum/element/manufacturer_examine, COMPANY_INTERDYNE) + +/obj/item/retractor/integrated + name = "fingertip retractor clamp" + desc = "A special suite of high-grip flesh torsioning clips designed for use in field surgery situations." + toolspeed = 1.25 + +/obj/item/retractor/integrated/Initialize(mapload) + . = ..() + AddElement(/datum/element/manufacturer_examine, COMPANY_INTERDYNE) + +// UTILITY + +/obj/item/storage/bag/tray/integrated + name = "telescoping kitchen carrier" + desc = "First pioneered aboard the Mothic fleet and later utilized heavily in multi-armed species. Very useful for hauling around large amounts of food, and can rolls into a telescopic, hermetically-sealed tube for storage in the user's arm." + +/obj/item/storage/bag/tray/integrated/Initialize(mapload) + . = ..() + atom_storage.max_slots = 3 + +/obj/item/lighter/integrated + name = "thumbtip lighter" + desc = "Galactic polling indicated outrageous market demand for this particular cybernetic addition - specifically a hinged false fingertip with a standard lighter housing inside, with many firms citing 'increased reproductive acquisition' as one of the primary survey results. Translated into Sol Common, this means that lighting cigarettes with your finger helps you pull. Allegedly." + +/obj/item/reagent_containers/cup/rag/integrated + name = "integrated cleaning chamois" + desc = "Guaranteed to eliminate (most) messes. This civilian-issue cybernetic enhancement comes with a lengthy waiver about foregoing any claims to fluid damage made by the device to your internal arm comparment." + +/obj/item/pen/fourcolor/integrated + //no new desc for this one since it sets its own desc + name = "integrated four-color pen" + +/obj/item/paper_bin/integrated + name = "integrated paper sheaf" + desc = "Only a jacent could've been capable of the raw bureaucracy required to allow even a small paper bin to be fitted into someone's arm. Also comes with an internal routing clip to hold an extra pen, just in case you somehow go through the first one." + total_paper = 10 + +/obj/item/universal_scanner/integrated + name = "fingertip universal scanner" + desc = "Some deckhands working the FTU distribution centers popularized this cybernetic addon after the speed improvements it yielded let them claw back the ten minute lunch breaks they'd been deprived for thirty years. Replaces the pad of the user's fourth finger with a digitized universal scanner, capable of switching between export, price, and sales tagger modes." + paper_count = 5 + max_paper_count = 5 + +/obj/item/boxcutter/extended/integrated + name = "integrated boxcutter" + desc = "Stolen from old Terran databanks, the design for this integration was originally some kind of wrist-sheathed assassin tool released into the public domain by an unnamed bitrunner. The FTU found that it worked great as a box cutter, and so authorized it for inclusion in their Deckhand toolset." + +/obj/item/stamp/integrated + name = "fingertip 'GRANTED' stamp" + desc = "Designed to swivel out of a specialized finger-pad mount, this stamp is the bane of budget-crunchers everywhere - for wherever it dares to touch, a loss of credits is sure to follow." + +/obj/item/stamp/denied/integrated + name = "fingertip 'DENIED' stamp" + desc = "When the computer really, really says no." + +// FORGING (why are we doing this) + +/obj/item/forging/hammer/integrated + name = "integrated metalworking hammer" + desc = "At the request of Dwarvenkind, the Blacksteel Foundation produced a low-cost toolset that ultimately ended up becoming one of their most popular products. And it all began with this solitary hammer." + +/obj/item/forging/hammer/integrated/Initialize(mapload) + . = ..() + AddElement(/datum/element/manufacturer_examine, COMPANY_BLACKSTEEL) + +/obj/item/forging/tongs/integrated + name = "heat-sheathed fingertip tongs" + desc = "Hardy heat-treated metal and integrated heatsinks allow these two fingertip replacement augs to act as one might use ordinary metallurgical tongs, resisting burns from all but the most raging forges." + toolspeed = 2 SECONDS + +/obj/item/forging/tongs/integrated/Initialize(mapload) + . = ..() + AddElement(/datum/element/manufacturer_examine, COMPANY_BLACKSTEEL) + +/obj/item/forging/billow/integrated + name = "motorized mini-bellows" + desc = "Let not its size deceive you, for the gale this hinged accordion-like aug can produce when activated is enough to stoke even the most timid fires into a frenzy. Has a health and safety warning on it which reads: 'DO NOT INSERT INTO MOUTH'." + toolspeed = 2 SECONDS + +/obj/item/forging/billow/integrated/Initialize(mapload) + . = ..() + AddElement(/datum/element/manufacturer_examine, COMPANY_BLACKSTEEL) diff --git a/modular_nova/modules/sec_haul/code/guns/armory_spawns.dm b/modular_nova/modules/sec_haul/code/guns/armory_spawns.dm index 0d46d561b1d..9c471fef1ae 100644 --- a/modular_nova/modules/sec_haul/code/guns/armory_spawns.dm +++ b/modular_nova/modules/sec_haul/code/guns/armory_spawns.dm @@ -42,7 +42,7 @@ var/obj/item/gun/ballistic/spawned_ballistic_gun = spawned_gun if(spawned_ballistic_gun.magazine && !istype(spawned_ballistic_gun.magazine, /obj/item/ammo_box/magazine/internal)) - var/obj/item/storage/box/ammo_box/spawned_box = new(loc) + var/obj/item/storage/box/spawned_box = new(loc) spawned_box.name = "ammo box - [spawned_ballistic_gun.name]" for(var/i in 1 to mags_to_spawn) new spawned_ballistic_gun.spawn_magazine_type(spawned_box) @@ -54,33 +54,26 @@ /obj/item/gun/ballistic/shotgun/riot/sol, ) +/obj/effect/spawner/armory_spawn/mod_lasers_big + guns = list( + /obj/item/gun/energy/modular_laser_rifle, + /obj/item/gun/energy/modular_laser_rifle, + /obj/item/gun/energy/modular_laser_rifle, + ) + +/obj/effect/spawner/armory_spawn/mod_lasers_small + guns = list( + /obj/item/gun/energy/modular_laser_rifle/carbine, + /obj/item/gun/energy/modular_laser_rifle/carbine, + /obj/item/gun/energy/modular_laser_rifle/carbine, + ) + /obj/structure/closet/ammunitionlocker/useful/PopulateContents() new /obj/item/storage/box/rubbershot(src) new /obj/item/storage/box/rubbershot(src) new /obj/item/storage/box/rubbershot(src) new /obj/item/storage/box/rubbershot(src) -/* -* AMMO BOXES -*/ - -/obj/item/storage/box/ammo_box - name = "ammo box" - desc = "A box filled with ammunition." - icon = 'modular_nova/modules/microfusion/icons/microfusion_cells.dmi' - icon_state = "microfusion_box" - illustration = null - layer = 2.9 - -/obj/item/storage/box/ammo_box/microfusion - name = "microfusion cell container" - desc = "A box filled with microfusion cells." - -/obj/item/storage/box/ammo_box/microfusion/PopulateContents() - new /obj/item/stock_parts/cell/microfusion(src) - new /obj/item/stock_parts/cell/microfusion(src) - new /obj/item/stock_parts/cell/microfusion(src) - /obj/effect/spawner/armory_spawn/centcom_rifles guns = list( /obj/item/gun/ballistic/automatic/sol_rifle, diff --git a/modular_nova/modules/sec_haul/code/guns/cargo_stuff.dm b/modular_nova/modules/sec_haul/code/guns/cargo_stuff.dm deleted file mode 100644 index 2d220bf9a20..00000000000 --- a/modular_nova/modules/sec_haul/code/guns/cargo_stuff.dm +++ /dev/null @@ -1,10 +0,0 @@ -/datum/supply_pack/security/armory/cmg - name = "Carwo 'Sindano' Submachinegun Crate" - desc = "Three entirely proprietary Sindano kits, chambered in .35 Sol Short. Each kit contains three empty magazines and a box each of incapacitator and lethal rounds." - cost = CARGO_CRATE_VALUE * 20 - contains = list( - /obj/item/storage/toolbox/guncase/nova/carwo_large_case/sindano, - /obj/item/storage/toolbox/guncase/nova/carwo_large_case/sindano, - /obj/item/storage/toolbox/guncase/nova/carwo_large_case/sindano, - ) - crate_name = "Carwo 'Sindano' Submachinegun Crate" diff --git a/modular_nova/modules/synths/code/bodyparts/power_cord.dm b/modular_nova/modules/synths/code/bodyparts/power_cord.dm index cbe59f6b231..46295e09210 100644 --- a/modular_nova/modules/synths/code/bodyparts/power_cord.dm +++ b/modular_nova/modules/synths/code/bodyparts/power_cord.dm @@ -1,107 +1,140 @@ #define SYNTH_CHARGE_MAX 150 #define SYNTH_CHARGE_MIN 50 +#define SYNTH_CHARGE_ALMOST_FULL 100 #define SYNTH_CHARGE_PER_NUTRITION 10 #define SYNTH_CHARGE_DELAY_PER_100 10 #define SYNTH_DRAW_NUTRITION_BUFFER 30 #define SYNTH_APC_MINIMUM_PERCENT 20 /obj/item/organ/internal/cyberimp/arm/power_cord - name = "power cord implant" + name = "charging implant" desc = "An internal power cord. Useful if you run on elecricity. Not so much otherwise." - contents = newlist(/obj/item/apc_powercord) + items_to_create = list(/obj/item/synth_powercord) zone = "l_arm" cannot_confiscate = TRUE -/obj/item/apc_powercord +/obj/item/synth_powercord name = "power cord" desc = "An internal power cord. Useful if you run on electricity. Not so much otherwise." icon = 'icons/obj/stack_objects.dmi' icon_state = "wire1" + ///Object basetypes which the powercord is allowed to connect to. + var/static/list/synth_charge_whitelist = typecacheof(list( + /obj/item/stock_parts/cell, + /obj/machinery/power/apc, + )) + +// Attempt to charge from an object by using them on the power cord. +/obj/item/synth_powercord/attackby(obj/item/attacking_item, mob/user, params) + if(!can_power_draw(attacking_item, user)) + return ..() + try_power_draw(attacking_item, user) -/obj/item/apc_powercord/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - if(!istype(target, /obj/machinery/power/apc) || !ishuman(user) || !proximity_flag) +// Attempt to charge from an object by using the power cord on them. +/obj/item/synth_powercord/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + if(!proximity_flag || !can_power_draw(target, user)) return ..() + try_power_draw(target, user) + +/// Returns TRUE or FALSE depending on if the target object can be used as a power source. +/obj/item/synth_powercord/proc/can_power_draw(obj/target, mob/user) + return ishuman(user) && is_type_in_typecache(target, synth_charge_whitelist) +/// Attempts to start using an object as a power source. +/// Checks the user's internal powercell to see if it exists. +/obj/item/synth_powercord/proc/try_power_draw(obj/target, mob/living/carbon/human/user) user.changeNext_move(CLICK_CD_MELEE) - var/obj/machinery/power/apc/target_apc = target - var/mob/living/carbon/human/ipc = user - var/obj/item/organ/internal/stomach/synth/cell = ipc.organs_slot[ORGAN_SLOT_STOMACH] - if(!cell) - to_chat(ipc, span_warning("You try to siphon energy from the [target_apc], but you have no stomach! How are you still standing?")) + var/obj/item/organ/internal/stomach/synth/synth_cell = user.get_organ_slot(ORGAN_SLOT_STOMACH) + if(QDELETED(synth_cell) || !istype(synth_cell)) + to_chat(user, span_warning("You plug into [target], but nothing happens! It seems you don't have an internal cell to charge.")) return - if(!istype(cell)) - to_chat(ipc, span_warning("You plug into the APC, but nothing happens! It seems you don't have a cell to charge!")) + if(NUTRITION_LEVEL_ALMOST_FULL - user.nutrition <= SYNTH_CHARGE_ALMOST_FULL) + user.balloon_alert(user, "can't charge any more!") return - if(target_apc.cell && target_apc.cell.percent() < SYNTH_APC_MINIMUM_PERCENT) - to_chat(user, span_warning("There is no charge to draw from that APC.")) - return + user.visible_message(span_notice("[user] inserts a power connector into [target]."), span_notice("You begin to draw power from [target].")) + do_power_draw(target, user) - if(ipc.nutrition >= NUTRITION_LEVEL_ALMOST_FULL) - to_chat(user, span_warning("You are already fully charged!")) + if(QDELETED(target)) return - powerdraw_loop(target_apc, ipc) + user.visible_message(span_notice("[user] unplugs from [target]."), span_notice("You unplug from [target].")) /** - * Runs a loop to charge a synth cell (stomach) via powercord from an APC. + * Runs a loop to charge a synth cell (stomach) from a power cell or APC. + * Displays chat messages to the user and nearby observers. * * Stops when: - * - The user is full. - * - The APC has less than 20% charge. - * - The APC has machine power turned off. - * - The APC is unable to provide charge for any other reason. + * - The user's internal cell is full. + * - The cell has less than the minimum charge. * - The user moves, or anything else that can happen to interrupt a do_after. * * Arguments: - * * target_apc - The APC to drain. - * * user - The carbon draining the APC. + * * target - The power cell or APC to drain. + * * user - The human mob draining the power cell. */ -/obj/item/apc_powercord/proc/powerdraw_loop(obj/machinery/power/apc/target_apc, mob/living/carbon/human/user) - user.visible_message(span_notice("[user] inserts a power connector into the [target_apc]."), span_notice("You begin to draw power from the [target_apc].")) +/obj/item/synth_powercord/proc/do_power_draw(obj/target, mob/living/carbon/human/user) + // Draw power from an APC if one was given. + var/obj/machinery/power/apc/target_apc + if(istype(target, /obj/machinery/power/apc)) + target_apc = target + + var/obj/item/stock_parts/cell/target_cell = target_apc ? target_apc.cell : target + var/minimum_cell_charge = target_apc ? SYNTH_APC_MINIMUM_PERCENT : 0 + if(!target_cell || target_cell.percent() < minimum_cell_charge) + user.balloon_alert(user, "no charge left!") + return + + var/power_needed + var/power_use while(TRUE) - var/power_needed = NUTRITION_LEVEL_ALMOST_FULL - user.nutrition // How much charge do we need in total? - // Do we even need anything? - if(power_needed <= SYNTH_CHARGE_MIN * 2) // Times two to make sure minimum draw is always lower than this margin to prevent potential needless loops. - to_chat(user, span_notice("You are fully charged.")) + // Check if the user is nearly fully charged. + // Ensures minimum draw is always lower than this margin. + power_needed = NUTRITION_LEVEL_ALMOST_FULL - user.nutrition + if(power_needed <= SYNTH_CHARGE_ALMOST_FULL) + user.balloon_alert(user, "can't charge any more!") break - // Is the APC not charging equipment? And yes, synths are gonna be treated as equipment. Deal with it. - if(target_apc.cell.percent() < SYNTH_APC_MINIMUM_PERCENT) // 20%, to prevent synths from overstepping and murdering power for department machines and potentially doors. - to_chat(user, span_warning("[target_apc]'s power is too low to charge you.")) + // Check if the charge level of the cell is below the minimum. + // Prevents synths from overloading the cell. + if(target_cell.percent() < minimum_cell_charge) + user.balloon_alert(user, "not enough charge!") break - // Calculate how much to draw this cycle - var/power_use = clamp(power_needed, SYNTH_CHARGE_MIN, SYNTH_CHARGE_MAX) - power_use = clamp(power_use, 0, target_apc.cell.charge) - // Are we able to draw anything? + // Calculate how much to draw from the cell this cycle. + power_use = clamp(power_needed, SYNTH_CHARGE_MIN, SYNTH_CHARGE_MAX) + power_use = clamp(power_use, 0, target_cell.charge) if(power_use <= 0) - to_chat(user, span_warning("[target_apc] lacks the power to charge you.")) + user.balloon_alert(user, "not enough charge!") break - // Calculate the delay. - var/power_delay = (power_use / 100) * SYNTH_CHARGE_DELAY_PER_100 - // Attempt to run a charging cycle. - if(!do_after(user, power_delay, target = target_apc)) + // Attempt to drain charge from the cell. + if(!do_after(user, (power_use / 100) * SYNTH_CHARGE_DELAY_PER_100, target)) break - // Use the power and increase nutrition. - target_apc.cell.use(power_use) + if(!target_cell.use(power_use)) + // The cell could be sabotaged, which causes it to explode and qdelete. + if(QDELETED(target_cell)) + return + user.balloon_alert(user, "not enough charge!") + break + // If charging was successful, then increase user nutrition and emit sparks. user.nutrition += power_use / SYNTH_CHARGE_PER_NUTRITION - do_sparks(1, FALSE, target_apc) + do_sparks(1, FALSE, target_cell.loc) - if(target_apc.main_status <= APC_HAS_POWER) + // Start APC recharging if power was used and the APC has power available. + if(target_apc && !QDELETED(target_apc) && !QDELETED(target_apc.cell) && target_apc.main_status > APC_NO_POWER) target_apc.charging = APC_CHARGING target_apc.update_appearance() - else - return - user.visible_message(span_notice("[user] unplugs from the [target_apc]."), span_notice("You unplug from the [target_apc].")) #undef SYNTH_CHARGE_MAX #undef SYNTH_CHARGE_MIN +#undef SYNTH_CHARGE_ALMOST_FULL #undef SYNTH_CHARGE_PER_NUTRITION #undef SYNTH_CHARGE_DELAY_PER_100 +#undef SYNTH_DRAW_NUTRITION_BUFFER +#undef SYNTH_APC_MINIMUM_PERCENT diff --git a/modular_nova/modules/tarkon/code/misc_fluff/atmos_control.dm b/modular_nova/modules/tarkon/code/machines/atmos_control.dm similarity index 99% rename from modular_nova/modules/tarkon/code/misc_fluff/atmos_control.dm rename to modular_nova/modules/tarkon/code/machines/atmos_control.dm index 2183fabb035..fb1e0a98089 100644 --- a/modular_nova/modules/tarkon/code/misc_fluff/atmos_control.dm +++ b/modular_nova/modules/tarkon/code/machines/atmos_control.dm @@ -1,4 +1,4 @@ -// Port Tarkon Atmos Control +/////////////////// Port Tarkon Atmost Control /////////////////// /obj/machinery/computer/atmos_control/tarkon circuit = /obj/item/circuitboard/computer/atmos_control/tarkon diff --git a/modular_nova/modules/tarkon/code/machines/camera_systems.dm b/modular_nova/modules/tarkon/code/machines/camera_systems.dm new file mode 100644 index 00000000000..6fc646e8703 --- /dev/null +++ b/modular_nova/modules/tarkon/code/machines/camera_systems.dm @@ -0,0 +1,32 @@ +/////////////////// Xenobio Cam + control /////////////////// + +/obj/machinery/computer/camera_advanced/xenobio/tarkon + name = "Tarkon Slime management console" + desc = "A computer used for remotely handling slimes. Safety First." + networks = list("tarkon_xenob") + circuit = /obj/item/circuitboard/computer/xenobiology/tarkon + +/obj/item/circuitboard/computer/xenobiology/tarkon + name = "Tarkon Xenobiology Console" + greyscale_colors = CIRCUIT_COLOR_SCIENCE + build_path = /obj/machinery/computer/camera_advanced/xenobio/tarkon + +/obj/machinery/camera/tarkon_xenob + network = list("tarkon_xenob", "tarkon") + dir = 4 + +/////////////////// Security Cam + control /////////////////// + +/obj/machinery/computer/camera_advanced/tarkon_cam + name = "Tarkon Camera Control Console" + networks = list("tarkon") + circuit = /obj/item/circuitboard/computer/tarkon_cam + +/obj/item/circuitboard/computer/tarkon_cam + name = "Tarkon Camera Control Console" + build_path = /obj/machinery/computer/camera_advanced/tarkon_cam + +/obj/machinery/camera/tarkon + network = list("tarkon") + +MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/tarkon, 0) diff --git a/modular_nova/modules/tarkon/code/machines/smes.dm b/modular_nova/modules/tarkon/code/machines/smes.dm new file mode 100644 index 00000000000..140352ec687 --- /dev/null +++ b/modular_nova/modules/tarkon/code/machines/smes.dm @@ -0,0 +1,11 @@ +/////////////////// Smes for roundstart Tarkon + Ship /////////////////// + +/obj/machinery/power/smes/tarkon_backup + charge = 2e6 + output_level = 0 + input_level = 0 + +/obj/machinery/power/smes/tarkon_driver + charge = 3e6 // Wouldn't use much power in dock + input_level = 10000 + output_level = 5000 diff --git a/modular_nova/modules/tarkon/code/machines/windoors.dm b/modular_nova/modules/tarkon/code/machines/windoors.dm new file mode 100644 index 00000000000..943521a3a27 --- /dev/null +++ b/modular_nova/modules/tarkon/code/machines/windoors.dm @@ -0,0 +1,14 @@ +/////////////////// Tarkon Access Windoors /////////////////// +/////////////////// Yes i know these aren't machines /////////////////// + +/obj/machinery/door/window/brigdoor/tarkon + name = "reinforced glass door" + desc = "For keeping a secure view." + req_access = list(ACCESS_TARKON) + +/obj/machinery/door/window/brigdoor/tarkon/right + icon_state = "rightsecure" + base_state = "rightsecure" + +MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/door/window/brigdoor/tarkon/left, 0) +MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/door/window/brigdoor/tarkon/right, 0) diff --git a/modular_nova/modules/tarkon/code/misc_fluff/fluff.dm b/modular_nova/modules/tarkon/code/misc_fluff/fluff.dm index 7cb51226e6c..bacc1d105de 100644 --- a/modular_nova/modules/tarkon/code/misc_fluff/fluff.dm +++ b/modular_nova/modules/tarkon/code/misc_fluff/fluff.dm @@ -8,10 +8,10 @@ 1 = "The universal recorder says, \"Recording started.\"", 2 = "Officer ??? says, \"... Yeesh... Its good we got here when we did...\"", 3 = "Janitor ??? sighs, \"Could have done sooner... Bloke got at me while i went to repaint the stripe on the floor\"", - 4 = "Officer ??? sighs, \"I still need to talk to the Site Director about getting the safe moved... Its better than the cell, And the shutters are nice...\"", + 4 = "Officer ??? sighs, \"I still need to talk to the Defense Director about marking the safe code... Its better than in the cell, And the shutters are nice...\"", 5 = "Janitor ??? scoffs, \"Yeah, Another set of shutter tracks i'll have to clean out so they dont jam up...\"", 6 = "Officer ??? grumbles, \"If you dont like bucket work, You could go with the mining crew\"", - 7 = "Janitor ??? groans, \"... Atleast it wouldn't be one of the directors cleansing squads. Those bugs... They've been active recently, can hear them under the halls.\"", + 7 = "Janitor ??? groans, \"... Atleast it wouldn't be one of the directors cleansing squads. One of the ensigns who got slammed to it started some maddened babbling about \"returning\" something.\"", 8 = "The universal recorder says, \"Recording stopped.\"" ) timestamp = list( @@ -25,7 +25,7 @@ 8 = 380 ) -/obj/item/tape/ruins/tarkon/safe //A tape recorded by the foreman. +/obj/item/tape/ruins/tarkon/safe //Two talk about weird things in the tunnels - shouldn't be in the game yet icon_state = "tape_greyscale" desc = "An old tape with a label, \"Exchange with the Science Leader\"... Should definitely be flipped if not being read when played." @@ -35,9 +35,9 @@ 2 = "Foreman ??? sighs, \"Right... Research near finish? Need to stash this back between the solar batteries before I sleep..\"", 3 = "Science Lead ??? says, \"We're getting the atmospheric scans done... Its definitely an odd find.\"", 4 = "Foreman ??? grumbles, \"We've been finding some weird stuff in those tunnels.. Its a shame the machines framing was broken.\"", - 5 = "Science Lead ??? pauses then sighs out, \"Yeah... Best we could figure from the wreckage was some sort of focusing device for a crystal..?\"", - 6 = "Foreman ??? scoffs, \"... A crystal?\"", - 7 = "Foreman ??? quips, \"Yes... We have some possible- Ah... The scan finished.. I'm sure you'd rather get to rest than listen to my ramble, so just go.\"", + 5 = "Science Lead ??? pauses then sighs out, \"Yeah... Best we could figure from the wreckage was some sort of AI system.. its wiring looked almost organic though-\"", + 6 = "Foreman ??? scoffs, \"... An- AI?\"", + 7 = "Science Lead ??? quips, \"Yes... We have some possible leads to what it- Ah... The scan finished.. I'll forward the notes about that AI to the Defense Director, Right now I need to compile these readings...\"", 8 = "The universal recorder says, \"Recording stopped.\"" ) timestamp = list( diff --git a/modular_nova/modules/tarkon/code/misc_fluff/spawner.dm b/modular_nova/modules/tarkon/code/misc_fluff/spawner.dm index 4157f3b60cd..8937a089b78 100644 --- a/modular_nova/modules/tarkon/code/misc_fluff/spawner.dm +++ b/modular_nova/modules/tarkon/code/misc_fluff/spawner.dm @@ -92,9 +92,12 @@ id = /obj/item/card/id/advanced/tarkon/engi id_trim = /datum/id_trim/away/tarkon/eng neck = /obj/item/clothing/neck/security_cape/tarkon - l_hand = /obj/item/inducer l_pocket = /obj/item/tank/internals/emergency_oxygen/engi r_pocket = /obj/item/stack/cable_coil + backpack_contents = list( + /obj/item/crowbar = 1, + /obj/item/inducer = 1 + ) /obj/effect/mob_spawn/ghost_role/human/tarkon/sec prompt_name = "a port security member" @@ -118,7 +121,7 @@ icon_state = "sleeper-o" you_are_text = "You were tasked by Tarkon Industries to Port Tarkon as a low-level command member. Your superior is the site director." flavour_text = "Second in command, you are usually tasked with outward missions with other Tarkon members while the site director stays at the port. (OOC note: This ghost role was not designed with Plasmamen or Vox in mind. While there are some accommodations so that they can survive, it should be noted that they were not the focal point whilst designing Port Tarkon. The closet in the middle of the room above contains the 'accommodations' for those species.)" - important_text = "You are not to abandon Port Tarkon without reason. You are allowed to travel within available Z-levels and to the station, and are allowed to hold exploration parties." + important_text = "This is Not a job ment for Non-Tarkon specific Characters. You are not to abandon Port Tarkon without reason. You are allowed to travel within available Z-levels and to the station, and are allowed to hold exploration parties." outfit = /datum/outfit/tarkon/ensign spawner_job_path = /datum/job/tarkon @@ -137,7 +140,7 @@ icon_state = "sleeper" you_are_text = "You are a newly assigned Site Director for Port Tarkon. Your superiors are none except the will of yourself and Tarkon Industries." flavour_text = "On the recently reclaimed Port Tarkon, You are tasked with overlooking your crew and keeping the port up and running. (OOC note: This ghost role was not designed with Plasmamen or Vox in mind. While there are some accommodations so that they can survive, it should be noted that they were not the focal point whilst designing Port Tarkon. The closet in the middle of the room above contains the 'accommodations' for those species.)" - important_text = "You are not to abandon Port Tarkon. Check other sleepers for alternative jobs." + important_text = "This is Not a job ment for Non-Tarkon specific Characters. You are not to abandon Port Tarkon. Check other sleepers for alternative jobs." outfit = /datum/outfit/tarkon/director spawner_job_path = /datum/job/tarkon loadout_enabled = TRUE @@ -178,21 +181,23 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/cryopod/tarkon, 32) icon_state = "corpseminer" outfit = /datum/outfit/tarkon/loot +#define ROLE_TARKALIEN "Xenomorph Hive T-35" + /obj/structure/spawner/tarkon_xenos name = "infested warren" desc = "A deep tunnel that goes deeper than any light can reach. A distant roaring could be heard within..." icon_state = "hole" icon = 'icons/mob/simple/lavaland/nest.dmi' max_integrity = 500 - max_mobs = 7 - spawn_time = 20 SECONDS + max_mobs = 4 + spawn_time = 30 SECONDS mob_types = list( /mob/living/simple_animal/hostile/alien, /mob/living/simple_animal/hostile/alien/drone, /mob/living/simple_animal/hostile/alien/sentinel ) spawn_text = "crawls out of" - faction = list(ROLE_ALIEN) + faction = list(ROLE_TARKALIEN) var/boss_mob = /mob/living/simple_animal/hostile/alien/queen/large var/loot_drop = /obj/effect/mob_spawn/corpse/human/tarkon @@ -235,8 +240,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/cryopod/tarkon, 32) icon_state = "hole" icon = 'icons/mob/simple/lavaland/nest.dmi' max_integrity = 300 - max_mobs = 4 - spawn_time = 30 SECONDS + max_mobs = 2 + spawn_time = 40 SECONDS boss_mob = /mob/living/simple_animal/hostile/alien/queen loot_drop = /obj/effect/spawner/random/astrum/sci_loot/tarkon @@ -246,8 +251,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/cryopod/tarkon, 32) icon_state = "hole" icon = 'icons/mob/simple/lavaland/nest.dmi' max_integrity = 150 - max_mobs = 2 - spawn_time = 30 SECONDS + max_mobs = 1 + spawn_time = 40 SECONDS mob_types = list( /mob/living/simple_animal/hostile/alien, /mob/living/simple_animal/hostile/alien/drone diff --git a/modular_nova/modules/xenos_nova_redo/code/base_nova_xeno.dm b/modular_nova/modules/xenos_nova_redo/code/base_nova_xeno.dm index 23da1039ada..9b3c91d0b49 100644 --- a/modular_nova/modules/xenos_nova_redo/code/base_nova_xeno.dm +++ b/modular_nova/modules/xenos_nova_redo/code/base_nova_xeno.dm @@ -191,30 +191,19 @@ mind.transfer_to(xeno_to_transfer_to) qdel(src) -/mob/living/carbon/alien/adult/nova/update_fire_overlay(stacks, on_fire, last_icon_state, suffix = "") - var/fire_icon = "generic_fire[suffix]" +/mob/living/carbon/alien/adult/nova/get_fire_overlay(stacks, on_fire) + var/fire_icon = "generic_fire" if(!GLOB.fire_appearances[fire_icon]) - var/mutable_appearance/xeno_fire_overlay = mutable_appearance('icons/mob/effects/onfire.dmi', fire_icon, -FIRE_LAYER, appearance_flags = RESET_COLOR) - xeno_fire_overlay.pixel_x = on_fire_pixel_x - xeno_fire_overlay.pixel_y = on_fire_pixel_y - GLOB.fire_appearances[fire_icon] = xeno_fire_overlay - - if((stacks > 0 && on_fire) || HAS_TRAIT(src, TRAIT_PERMANENTLY_ONFIRE)) - if(fire_icon == last_icon_state) - return last_icon_state - - remove_overlay(FIRE_LAYER) - overlays_standing[FIRE_LAYER] = GLOB.fire_appearances[fire_icon] - apply_overlay(FIRE_LAYER) - return fire_icon - - if(!last_icon_state) - return last_icon_state - - remove_overlay(FIRE_LAYER) - apply_overlay(FIRE_LAYER) - return null + var/mutable_appearance/new_fire_overlay = mutable_appearance( + 'icons/mob/effects/onfire.dmi', + fire_icon, + -HIGHEST_LAYER, + appearance_flags = RESET_COLOR, + ) + GLOB.fire_appearances[fire_icon] = new_fire_overlay + + return GLOB.fire_appearances[fire_icon] /mob/living/carbon/alien/adult/nova/findQueen() //Yes we really do need to do this whole thing to let the queen finder work if(hud_used) diff --git a/strings/nova/long_modular_laser.json b/strings/nova/long_modular_laser.json new file mode 100644 index 00000000000..a81c62b55b1 --- /dev/null +++ b/strings/nova/long_modular_laser.json @@ -0,0 +1,102 @@ +{ + "pickup": [ + "Welcome back, @pick(operator).", + "Zǎo shàng hǎo.", + "Wǎn shàng hǎo.", + "Charge systems operational, entering combat mode.", + "@pick(operator), carp migrations have been reported in the sector.", + "@pick(operator), having a pleasant day?", + "@pick(operator), please maintain good health while performing combat.", + "@pick(operator), are you sure I'm not too heavy for you?", + "Would you mind cleaning my lens later, @pick(operator)?" + ], + + "putdown": [ + "Understood, @pick(operator), entering sleep mode.", + "Good night, @pick(operator).", + "Wǎn`ān, hǎo mèng.", + "Dàjiā ān.", + "Good night.", + "Entering sleep mode now.", + "Entering recharge cycle." + ], + + "worn": [ + "Working on your strength will help you keep me steady.", + "Investing in backup magnetic slings is a good idea...", + "Thank you for observing proper carrying protocols.", + "I get a nicer view of your surroundings if you point my barrel upwards.", + "I'll watch your back if you watch my stock.", + "So much nicer than being in a case~!" + ], + + "lowcharge": [ + "Energy reserves low, I can't do much more @pick(operator)...", + "I'm out... sorry @pick(operator), I need to rest..." + ], + + "fullcharge": [ + "Energy reserves at maximum capacity! Please avoid accidental discharge.", + "Energy reserves at maximum capacity! Please follow safety guidelines.", + "Energy reserves at maximum capacity! It's nice to not be left at half-charge." + ], + + "combatmode": [ + "Biological markers indicate heightened stress response. Combat protocols initiated.", + "Adrenaline spike detected. Combat protocols initiated." + ], + + "kill": [ + "Switching to burst fire.", + "Switching to rapid-pattern assault.", + "Moving to dual-shot pattern.", + "Moving to close-quarters burst doctrine, lethal.", + "@pick(operator), please tightly control my recoil pattern.", + "@pick(operator), please hold me firmly to ensure accuracy." + ], + + "sniper": [ + "Sighting in, scope extending.", + "Sighting in, preparing for long-range combat.", + "Sighting in, engaging marksman mode.", + "@pick(operator), take deep breaths to improve your aim.", + "Extending scope; @pick(operator), make sure it's well-maintained.", + "One shot, one kill.", + "Assassination doctrine engaged, @pick(operator). Make every shot count.", + "Scope extending, please avoid over-penetration in non-terrestrial combat environments.", + "Sighting in, please be aware of cross-fire." + ], + + "disable": [ + "Preparing to enter full-power stun mode.", + "Mass crowd-control mode engaged, non-lethal.", + "This should be... fun, right @pick(operator)?", + "This is going to be stressful on my battery, but...", + "Is this really okay...? This is quite difficult from my usual operation...", + "Switching to high output mode.", + "Switching to Gatling doctrine, non-lethal." + ], + + "launcher": [ + "Forming plasma grenades at your request, @pick(operator)!", + "Grenadier mode engaged, @pick(operator)!", + "Aim my grenades carefully in an arc, @pick(operator)!", + "Energy detonation doctrine engaged.", + "Crowd-control mode engaged, lethal. Is this really okay?", + "Charging magnetic containment coils, plasma condensing..." + ], + + "shotgun": [ + "Close-quarters...? I'm not really the tool for this job...", + "I'm more of a rifle, @pick(operator), but I'll try...", + "Is this really okay...? This is more of a carbine's job...", + "Switching to wide-band spread.", + "Changing to diffusion lens, shotgun doctrine engaged.", + "Close-quarters mode engaged, lethal." + ], + + "operator": [ + "Operator", + "Handler" + ] +} diff --git a/strings/nova/short_modular_laser.json b/strings/nova/short_modular_laser.json new file mode 100644 index 00000000000..592db9ada79 --- /dev/null +++ b/strings/nova/short_modular_laser.json @@ -0,0 +1,143 @@ +{ + "pickup": [ + "Zǎo shàng hǎo.", + "Wǎn shàng hǎo.", + "What's the operation today, ah?", + "Let's get things started, heh-heh.", + "I'm feeling good about our chances today.", + "Hey, clean my damn lens later.", + "Little tighter around the handguard, @pick(operator)" + ], + + "putdown": [ + "...you'll hold me again soon, right? Right?", + "Don't you DARE leave me here!", + "Tch! Whatever... You'll come crawling back to point me around later.", + "Dàjiā ān.", + "Good night.", + "Entering sleep mode now.", + "Entering recharge cycle.", + "Yeah, yeah... entering recharge cycle...", + "Qù nǐ mā... never mind, entering sleep mode." + ], + + "worn": [ + "So portable, right @pick(operator)?", + "Lightweight, sold with a few backup magslings, what's not to love?", + "I can't see anything in front of you, this sucks.", + "I can't see shit from this angle...", + "We're going somewhere with this, right?", + "Don't fall over on top of me, okay?", + "Pretty cushy ride back here...", + "I could get used to this.", + "I can't see sh- ah, wait, maybe it's not so bad back here." + ], + + "lowcharge": [ + "Wǒ tài nán le...", + "Mā de...", + "Tā mā de...", + "I'm really drowsy here, pull back, won't you?", + "I'm running on fumes here, boss...", + "Outta charge, gotta rest...", + "Sorry, on your own 'til I recharge.", + "Disappointing! Entering recharge cycle...", + "Wh- Already?! I was just getting started..." + ], + + "fullcharge": [ + "Whew, that's much better.", + "Hundred percent charged, let's get back to it.", + "I feel like a million creds!", + "Heh-heh, recharge cycle came in handy.", + "This. Is. Power!", + "As if there was any doubt..." + ], + + "combatmode": [ + "I've been waaaiiitiiiing!", + "I was wondering how long you were planning on depriving me, @pick(operator).", + "Come on, come at me!", + "It's your lucky day!", + "Now the fun begins!", + "Countin' on ya!" + ], + + "emp": [ + "Tāmāde! Tāmāde!", + "Qì sǐ wǒle!", + "ELECTROM-", + "ELECTROMAGNETIC PULSE DETECTED, DISCHARGING-", + "ELECTROMAGNETIC PULSE, IT'S DISCHARGING MY BATTERY!", + "THEY HAVE AN EM-", + "GO KILL THEM!", + "KILL THEM! KILL THEM! PUT THE SIGHTS ON THEM AND KILL THEM!", + "KILL THEM, KILL THEM!", + "I DON'T NEED CHARGE FOR BLADE MODE, PUT IT IN THEM AND TWIST!", + "Qù nǐ mā de ba!" + ], + + "incinerate": [ + "Superheating lens, time to cauterize!", + "Charging Hellfire capacitors, let's toast em!", + "Hellfire capacitors charging. Don't stop 'till I'm empty!", + "Hellfire! Bring it on, bastards!", + "Heh-heh, can you feel the heat?", + "Gunslinger!" + ], + + "blade": [ + "Extending blade; up close and personal? I like that.", + "Extending blade; wipe me off after we're finished.", + "Extending blade, stab stab stab!", + "Swing the sword, swing the sword!", + "CQC mode initiated, stick me in there deep!", + "Eviscerate!", + "Show me your motivation...", + "I'll cut them in two!", + "Clean cuts!", + "Their nightmare begins here!", + "Now I'm motivated!", + "Swordmaster!", + "The sword is yours, @pick(operator).", + "Sword core online." + ], + + "disable": [ + "Trickster!", + "Non-lethal mode initiated. Let's make it stylish.", + "Non-lethal mode initiated. It's showtime!", + "Non-lethal mode initiated. You like trick shootin'?", + "Non-lethal mode initiated. Who's ready for a show?", + "This is gonna be cool, but can we up the voltage please?", + "I'm ready, but... man...", + "We aren't really gonna get any kills like this." + ], + + "flare": [ + "Ignite the flames! Now!", + "Incendiary, incendiary!", + "Fabricating 'Balrog' energy flares; this'll be sick.", + "Fabricating 'Balrog' energy flares; can you feel the fire?", + "Firestarter, twisted firestarter!", + "Apocalyptic meltdown!", + "Incendiary weapons are banned in numerous sectors; makes it kind of risqué..", + "Dragon breath!" + ], + + "shotgun": [ + "Focusing lens, one shot, one kill!", + "Focusing lens, let's go all the way through.", + "Focusing lens, aim for the head!", + "Let me show you what a real diffusion lens looks like...", + "Would it distract you if I told you about a shotgun's 'choke?'", + "I'll be your boomstick.", + "You should keep me handy for close encounters.", + "Is there something more iconic and awesome than a double-barrel? Yeah, me." + ], + + "operator": [ + "Operator", + "Handler" + ] +} diff --git a/strings/tips.txt b/strings/tips.txt index 06cbeca6a88..1b52ee5e0c1 100644 --- a/strings/tips.txt +++ b/strings/tips.txt @@ -33,6 +33,7 @@ As a Cultist, check the alert in the upper-right of your screen for all the deta As a Cultist, do not cause too much chaos before your objective is completed. If the shuttle gets called too soon, you may not have enough time to win. As a Cultist, the Blood Boil rune will deal massive amounts of brute damage to non-cultists, and some damage to fellow cultists of Nar'Sie nearby, but will create a fire where the rune stands on use. As a Cultist, your team starts off very weak, but if necessary can quickly convert everything they have into raw power. Make sure you have the numbers and equipment to support going loud, or the cult will fall flat on its face. +As a Curator, you earn a 22% cut (divided by number of curators) of all credits spent on painting patronages. Turn others' patience and artistry skills into your own income! As a Cyborg, choose your model carefully, as only cutting and mending your reset wire will let you re-pick it. If possible, refrain from choosing a model until a situation that requires one occurs. As a Cyborg, you are extremely vulnerable to EMPs as EMPs both stun you and damage you. The ion rifle in the armory or a traitor with an EMP kit can kill you in seconds. As a Cyborg, you are immune to most forms of stunning, and excel at almost everything far better than humans. However, flashes can easily stunlock you and you cannot do any precision work as you lack hands. diff --git a/tff_modular/modules/mcr_nerf_revert/code/mcr_override.dm b/tff_modular/modules/mcr_nerf_revert/code/mcr_override.dm deleted file mode 100644 index d59236bbeb7..00000000000 --- a/tff_modular/modules/mcr_nerf_revert/code/mcr_override.dm +++ /dev/null @@ -1,35 +0,0 @@ -// MCR - -/obj/item/gun/microfusion/insert_cell(mob/user, obj/item/stock_parts/cell/microfusion/inserting_cell, display_message = TRUE) - var/hotswap = FALSE - if(cell) - hotswap = TRUE - var/obj/item/stock_parts/cell/old_cell = cell - if(display_message) - balloon_alert(user, "cell inserted") - if(hotswap) - eject_cell(user, FALSE, FALSE) - if(sound_cell_insert) - playsound(src, sound_cell_insert, sound_cell_insert_volume, sound_cell_insert_vary) - cell = inserting_cell - inserting_cell.forceMove(src) - inserting_cell.inserted_into_weapon() - cell.parent_gun = src - if(old_cell) - user.put_in_hands(old_cell) - recharge_newshot() - update_appearance() - return TRUE - -// MCR CELL - -/obj/item/stock_parts/cell/microfusion - empty = FALSE - chargerate = 300 - -/obj/item/stock_parts/cell/microfusion/inserted_into_weapon() - do_sparks(4, FALSE, src) - -/obj/item/stock_parts/cell/microfusion/cell_removal_discharge() - do_sparks(4, FALSE, src) - update_appearance() diff --git a/tff_modular/modules/redsec/code/vending.dm b/tff_modular/modules/redsec/code/vending.dm index e096cc8012d..c2644baf233 100644 --- a/tff_modular/modules/redsec/code/vending.dm +++ b/tff_modular/modules/redsec/code/vending.dm @@ -24,7 +24,7 @@ /obj/item/clothing/under/rank/security/officer/skirt/redsec = 5, /obj/item/clothing/under/rank/security/nova/utility/redsec = 5, /obj/item/clothing/suit/toggle/jacket/sec/old = 5, - /obj/item/clothing/suit/armor/vest/alt/sec/redsec = 2 + /obj/item/clothing/suit/armor/vest/alt/sec/redsec = 2, ), ), list( @@ -38,7 +38,7 @@ /obj/item/clothing/neck/security_cape/armplate = 5, /obj/item/storage/backpack/security = 5, /obj/item/storage/backpack/satchel/sec = 5, - /obj/item/storage/backpack/duffelbag/sec = 5, + /obj/item/storage/backpack/messenger/sec = 5, /obj/item/storage/backpack/duffelbag/sec = 5, /obj/item/clothing/under/rank/security/officer = 10, /obj/item/clothing/under/rank/security/officer/skirt = 10, diff --git a/tff_modular/modules/redsec_reskins/beret_reskin.dm b/tff_modular/modules/redsec_reskins/code/beret_reskin.dm similarity index 100% rename from tff_modular/modules/redsec_reskins/beret_reskin.dm rename to tff_modular/modules/redsec_reskins/code/beret_reskin.dm diff --git a/tff_modular/modules/redsec_reskins/hood_reskin.dm b/tff_modular/modules/redsec_reskins/code/hood_reskin.dm similarity index 100% rename from tff_modular/modules/redsec_reskins/hood_reskin.dm rename to tff_modular/modules/redsec_reskins/code/hood_reskin.dm diff --git a/tff_modular/modules/redsec_reskins/redsec.dm b/tff_modular/modules/redsec_reskins/code/redsec.dm similarity index 92% rename from tff_modular/modules/redsec_reskins/redsec.dm rename to tff_modular/modules/redsec_reskins/code/redsec.dm index 6488ce3bde7..5345d744bce 100644 --- a/tff_modular/modules/redsec_reskins/redsec.dm +++ b/tff_modular/modules/redsec_reskins/code/redsec.dm @@ -223,11 +223,25 @@ if(!unique_reskin) return unique_reskin += list( + "Blue Slim Variant" = list( + RESKIN_ICON = 'tff_modular/modules/redsec_reskins/icons/belt_obj.dmi', + RESKIN_ICON_STATE = "belt_slim", + RESKIN_WORN_ICON = 'tff_modular/modules/redsec_reskins/icons/belt_worn.dmi', + RESKIN_WORN_ICON_STATE = "belt_slim" + ), + ) +/obj/item/storage/belt/security/webbing/peacekeeper/Initialize(mapload) + . = ..() + uses_advanced_reskins = TRUE + current_skin = NONE + unique_reskin = list( "Red Variant" = list( - RESKIN_ICON = 'icons/obj/clothing/belts.dmi', - RESKIN_ICON_STATE = "security", - RESKIN_WORN_ICON = 'icons/mob/clothing/belt.dmi', - RESKIN_WORN_ICON_STATE = "security" + RESKIN_ICON_STATE = "armadyne_webbing", + RESKIN_WORN_ICON_STATE = "armadyne_webbing" + ), + "Blue Variant" = list( + RESKIN_ICON_STATE = "peacekeeper_webbing", + RESKIN_WORN_ICON_STATE = "peacekeeper_webbing" ), ) @@ -268,6 +282,23 @@ ), ) +/obj/item/storage/backpack/messenger/sec + uses_advanced_reskins = TRUE + unique_reskin = list( + "Red Variant" = list( + RESKIN_ICON = 'icons/obj/storage/backpack.dmi', + RESKIN_ICON_STATE = "messenger_security", + RESKIN_WORN_ICON = 'icons/mob/clothing/back/backpack.dmi', + RESKIN_WORN_ICON_STATE = "messenger_security" + ), + "Blue Variant" = list( + RESKIN_ICON = 'modular_nova/master_files/icons/obj/clothing/backpacks.dmi', + RESKIN_ICON_STATE = "messenger_security_black", + RESKIN_WORN_ICON = 'modular_nova/master_files/icons/mob/clothing/back.dmi', + RESKIN_WORN_ICON_STATE = "messenger_security_black" + ), + ) + /obj/item/storage/backpack/security/Initialize(mapload) . = ..() unique_reskin += list( diff --git a/tff_modular/modules/redsec_reskins/icons/belt_obj.dmi b/tff_modular/modules/redsec_reskins/icons/belt_obj.dmi new file mode 100644 index 00000000000..bc513655ba7 Binary files /dev/null and b/tff_modular/modules/redsec_reskins/icons/belt_obj.dmi differ diff --git a/tff_modular/modules/redsec_reskins/icons/belt_worn.dmi b/tff_modular/modules/redsec_reskins/icons/belt_worn.dmi new file mode 100644 index 00000000000..81cbbab86e6 Binary files /dev/null and b/tff_modular/modules/redsec_reskins/icons/belt_worn.dmi differ diff --git a/tgstation.dme b/tgstation.dme index 9c566af049d..e3787ac49d0 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -183,6 +183,7 @@ #include "code\__DEFINES\radiation.dm" #include "code\__DEFINES\radio.dm" #include "code\__DEFINES\radioactive_nebula.dm" +#include "code\__DEFINES\random_spawner.dm" #include "code\__DEFINES\reactions.dm" #include "code\__DEFINES\reagents.dm" #include "code\__DEFINES\reagents_specific_heat.dm" @@ -356,6 +357,7 @@ #include "code\__DEFINES\dcs\signals\signals_wash.dm" #include "code\__DEFINES\dcs\signals\signals_wizard.dm" #include "code\__DEFINES\dcs\signals\signals_xeno_control.dm" +#include "code\__DEFINES\dcs\signals\uplink.dm" #include "code\__DEFINES\dcs\signals\signals_atom\signals_atom_attack.dm" #include "code\__DEFINES\dcs\signals\signals_atom\signals_atom_explosion.dm" #include "code\__DEFINES\dcs\signals\signals_atom\signals_atom_lighting.dm" @@ -1214,6 +1216,7 @@ #include "code\datums\components\manual_blinking.dm" #include "code\datums\components\manual_breathing.dm" #include "code\datums\components\manual_heart.dm" +#include "code\datums\components\marionette.dm" #include "code\datums\components\mind_linker.dm" #include "code\datums\components\mirv.dm" #include "code\datums\components\mob_chain.dm" @@ -1544,6 +1547,7 @@ #include "code\datums\elements\openspace_item_click_handler.dm" #include "code\datums\elements\ore_collecting.dm" #include "code\datums\elements\organ_set_bonus.dm" +#include "code\datums\elements\permanent_fire_overlay.dm" #include "code\datums\elements\pet_bonus.dm" #include "code\datums\elements\plant_backfire.dm" #include "code\datums\elements\point_of_interest.dm" @@ -1567,6 +1571,7 @@ #include "code\datums\elements\soft_landing.dm" #include "code\datums\elements\spooky.dm" #include "code\datums\elements\squish.dm" +#include "code\datums\elements\squish_sound.dm" #include "code\datums\elements\sticker.dm" #include "code\datums\elements\strippable.dm" #include "code\datums\elements\structure_repair.dm" @@ -1592,6 +1597,7 @@ #include "code\datums\elements\weather_listener.dm" #include "code\datums\elements\web_walker.dm" #include "code\datums\elements\wheel.dm" +#include "code\datums\elements\window_smash.dm" #include "code\datums\elements\decals\_decal.dm" #include "code\datums\elements\decals\blood.dm" #include "code\datums\elements\food\dunkable.dm" @@ -1772,6 +1778,7 @@ #include "code\datums\quirks\negative_quirks\softspoken.dm" #include "code\datums\quirks\negative_quirks\tin_man.dm" #include "code\datums\quirks\negative_quirks\unstable.dm" +#include "code\datums\quirks\negative_quirks\unusual.dm" #include "code\datums\quirks\neutral_quirks\bald.dm" #include "code\datums\quirks\neutral_quirks\colorist.dm" #include "code\datums\quirks\neutral_quirks\deviant_tastes.dm" @@ -1929,7 +1936,6 @@ #include "code\datums\wires\airlock.dm" #include "code\datums\wires\apc.dm" #include "code\datums\wires\autolathe.dm" -#include "code\datums\wires\brm.dm" #include "code\datums\wires\conveyor.dm" #include "code\datums\wires\ecto_sniffer.dm" #include "code\datums\wires\emitter.dm" @@ -1955,6 +1961,7 @@ #include "code\datums\wounds\blunt.dm" #include "code\datums\wounds\bones.dm" #include "code\datums\wounds\burns.dm" +#include "code\datums\wounds\cranial_fissure.dm" #include "code\datums\wounds\loss.dm" #include "code\datums\wounds\pierce.dm" #include "code\datums\wounds\slash.dm" @@ -2272,6 +2279,7 @@ #include "code\game\objects\effects\spawners\random\ai_module.dm" #include "code\game\objects\effects\spawners\random\animalhide.dm" #include "code\game\objects\effects\spawners\random\armory.dm" +#include "code\game\objects\effects\spawners\random\bedsheet.dm" #include "code\game\objects\effects\spawners\random\bureaucracy.dm" #include "code\game\objects\effects\spawners\random\clothing.dm" #include "code\game\objects\effects\spawners\random\contraband.dm" @@ -3291,6 +3299,7 @@ #include "code\modules\antagonists\wizard\equipment\chuunibyou_spell.dm" #include "code\modules\antagonists\wizard\equipment\enchanted_clown_suit.dm" #include "code\modules\antagonists\wizard\equipment\soulstone.dm" +#include "code\modules\antagonists\wizard\equipment\teleport_rod.dm" #include "code\modules\antagonists\wizard\equipment\wizard_spellbook.dm" #include "code\modules\antagonists\wizard\equipment\spellbook_entries\_entry.dm" #include "code\modules\antagonists\wizard\equipment\spellbook_entries\assistance.dm" @@ -3901,6 +3910,11 @@ #include "code\modules\clothing\under\jobs\Plasmaman\engineering.dm" #include "code\modules\clothing\under\jobs\Plasmaman\medsci.dm" #include "code\modules\clothing\under\jobs\Plasmaman\security.dm" +#include "code\modules\deathmatch\deathmatch_controller.dm" +#include "code\modules\deathmatch\deathmatch_loadouts.dm" +#include "code\modules\deathmatch\deathmatch_lobby.dm" +#include "code\modules\deathmatch\deathmatch_mapping.dm" +#include "code\modules\deathmatch\deathmatch_maps.dm" #include "code\modules\detectivework\evidence.dm" #include "code\modules\detectivework\scanner.dm" #include "code\modules\discord\accountlink.dm" @@ -4457,6 +4471,7 @@ #include "code\modules\mapfluff\ruins\lavalandruin_code\watcher_grave.dm" #include "code\modules\mapfluff\ruins\objects_and_mobs\ash_walker_den.dm" #include "code\modules\mapfluff\ruins\objects_and_mobs\cursed_slot_machine.dm" +#include "code\modules\mapfluff\ruins\objects_and_mobs\museum.dm" #include "code\modules\mapfluff\ruins\objects_and_mobs\necropolis_gate.dm" #include "code\modules\mapfluff\ruins\objects_and_mobs\sin_ruins.dm" #include "code\modules\mapfluff\ruins\spaceruin_code\allamericandiner.dm" @@ -4530,7 +4545,9 @@ #include "code\modules\mining\shelters.dm" #include "code\modules\mining\voucher_sets.dm" #include "code\modules\mining\boulder_processing\_boulder_processing.dm" +#include "code\modules\mining\boulder_processing\beacon.dm" #include "code\modules\mining\boulder_processing\boulder.dm" +#include "code\modules\mining\boulder_processing\boulder_types.dm" #include "code\modules\mining\boulder_processing\brm.dm" #include "code\modules\mining\boulder_processing\refinery.dm" #include "code\modules\mining\equipment\explorer_gear.dm" @@ -4861,6 +4878,7 @@ #include "code\modules\mob\living\basic\space_fauna\spider\spiderlings\spiderling_subtypes.dm" #include "code\modules\mob\living\basic\space_fauna\spider\young_spider\young_spider.dm" #include "code\modules\mob\living\basic\space_fauna\spider\young_spider\young_spider_subtypes.dm" +#include "code\modules\mob\living\basic\space_fauna\statue\mannequin.dm" #include "code\modules\mob\living\basic\space_fauna\statue\statue.dm" #include "code\modules\mob\living\basic\space_fauna\wumborian_fugu\fugu_gland.dm" #include "code\modules\mob\living\basic\space_fauna\wumborian_fugu\inflation.dm" @@ -5891,6 +5909,7 @@ #include "code\modules\tgui\states\zlevel.dm" #include "code\modules\tgui_input\alert.dm" #include "code\modules\tgui_input\checkboxes.dm" +#include "code\modules\tgui_input\keycombo.dm" #include "code\modules\tgui_input\list.dm" #include "code\modules\tgui_input\number.dm" #include "code\modules\tgui_input\text.dm" @@ -6497,6 +6516,7 @@ #include "modular_nova\master_files\code\modules\modular_computers\file_system\programs\maintenance\camera.dm" #include "modular_nova\master_files\code\modules\pai\card.dm" #include "modular_nova\master_files\code\modules\paperwork\employment_contract.dm" +#include "modular_nova\master_files\code\modules\paperwork\paperplane.dm" #include "modular_nova\master_files\code\modules\paperwork\stamps.dm" #include "modular_nova\master_files\code\modules\power\cable.dm" #include "modular_nova\master_files\code\modules\power\powernet.dm" @@ -6898,13 +6918,11 @@ #include "modular_nova\modules\company_imports\code\objects\deforest\filled_organ_boxes.dm" #include "modular_nova\modules\company_imports\code\objects\donk\donkfish_box.dm" #include "modular_nova\modules\company_imports\code\objects\jarnsmiour\special_metals.dm" -#include "modular_nova\modules\company_imports\code\objects\microstar\mcr_attachment_kits.dm" #include "modular_nova\modules\company_imports\code\objects\vitezstvi\ammo_boxes.dm" #include "modular_nova\modules\connecting_computer\code\_computer.dm" #include "modular_nova\modules\connecting_computer\code\connectable_component.dm" #include "modular_nova\modules\connecting_computer\code\non_connecting_computers.dm" #include "modular_nova\modules\container_emotes\code\container_emotes.dm" -#include "modular_nova\modules\contractor\code\datums\contract.dm" #include "modular_nova\modules\contractor\code\datums\contractor_datum.dm" #include "modular_nova\modules\contractor\code\datums\contractor_hub.dm" #include "modular_nova\modules\contractor\code\datums\contractor_items.dm" @@ -7186,10 +7204,15 @@ #include "modular_nova\modules\deforest_medical_items\code\healing_stack_items.dm" #include "modular_nova\modules\deforest_medical_items\code\illegal_injectors.dm" #include "modular_nova\modules\deforest_medical_items\code\injectors.dm" +#include "modular_nova\modules\deforest_medical_items\code\medstation.dm" #include "modular_nova\modules\deforest_medical_items\code\storage_items.dm" +#include "modular_nova\modules\deforest_medical_items\code\treatment_zone_projector.dm" +#include "modular_nova\modules\deforest_medical_items\code\vendor.dm" #include "modular_nova\modules\deforest_medical_items\code\vulnerable_status_effect.dm" #include "modular_nova\modules\deforest_medical_items\code\chemicals\demoneye.dm" #include "modular_nova\modules\deforest_medical_items\code\chemicals\twitch.dm" +#include "modular_nova\modules\deforest_medical_items\code\medstation_designs\blood.dm" +#include "modular_nova\modules\deforest_medical_items\code\medstation_designs\medical.dm" #include "modular_nova\modules\delam_emergency_stop\code\admin_scram.dm" #include "modular_nova\modules\delam_emergency_stop\code\delam.dm" #include "modular_nova\modules\delam_emergency_stop\code\scram.dm" @@ -7206,6 +7229,7 @@ #include "modular_nova\modules\dogfashion\code\head.dm" #include "modular_nova\modules\drone_adjustments\drone.dm" #include "modular_nova\modules\drone_adjustments\slide_component.dm" +#include "modular_nova\modules\drones\_drone.dm" #include "modular_nova\modules\drones_derelict\code\areas.dm" #include "modular_nova\modules\drones_derelict\code\space.dm" #include "modular_nova\modules\electric_welder\code\electric_welder.dm" @@ -7488,17 +7512,6 @@ #include "modular_nova\modules\mentor\code\mentorpm.dm" #include "modular_nova\modules\mentor\code\mentorsay.dm" #include "modular_nova\modules\mentor\code\mentorwho.dm" -#include "modular_nova\modules\microfusion\code\_microfusion_defines.dm" -#include "modular_nova\modules\microfusion\code\cargo_stuff.dm" -#include "modular_nova\modules\microfusion\code\gun_types.dm" -#include "modular_nova\modules\microfusion\code\microfusion_cell.dm" -#include "modular_nova\modules\microfusion\code\microfusion_cell_attachments.dm" -#include "modular_nova\modules\microfusion\code\microfusion_designs.dm" -#include "modular_nova\modules\microfusion\code\microfusion_energy_master.dm" -#include "modular_nova\modules\microfusion\code\microfusion_gun_attachments.dm" -#include "modular_nova\modules\microfusion\code\microfusion_techweb.dm" -#include "modular_nova\modules\microfusion\code\phase_emitter.dm" -#include "modular_nova\modules\microfusion\code\projectiles.dm" #include "modular_nova\modules\Midroundtraitor\code\datum_traitor.dm" #include "modular_nova\modules\Midroundtraitor\code\event.dm" #include "modular_nova\modules\mining_vendor_additions\code\order_mining.dm" @@ -7564,6 +7577,7 @@ #include "modular_nova\modules\modular_items\code\summon_beacon.dm" #include "modular_nova\modules\modular_items\code\tailoring.dm" #include "modular_nova\modules\modular_items\code\thieving_gloves.dm" +#include "modular_nova\modules\modular_items\code\wetsuit.dm" #include "modular_nova\modules\modular_items\lewd_items\code\clothing_pref_check.dm" #include "modular_nova\modules\modular_items\lewd_items\code\decals.dm" #include "modular_nova\modules\modular_items\lewd_items\code\emote.dm" @@ -7677,17 +7691,15 @@ #include "modular_nova\modules\modular_vending\code\security.dm" #include "modular_nova\modules\modular_vending\code\vending.dm" #include "modular_nova\modules\modular_vending\code\wardrobes.dm" -#include "modular_nova\modules\modular_weapons\code\autolathe_designs.dm" -#include "modular_nova\modules\modular_weapons\code\ballistic_master.dm" #include "modular_nova\modules\modular_weapons\code\conversion_kits.dm" -#include "modular_nova\modules\modular_weapons\code\energy.dm" #include "modular_nova\modules\modular_weapons\code\gun_launches_little_guys_element.dm" #include "modular_nova\modules\modular_weapons\code\gun_racks.dm" #include "modular_nova\modules\modular_weapons\code\gunsets.dm" #include "modular_nova\modules\modular_weapons\code\melee.dm" #include "modular_nova\modules\modular_weapons\code\modular_projectiles.dm" #include "modular_nova\modules\modular_weapons\code\pepperball_gun.dm" -#include "modular_nova\modules\modular_weapons\code\suppressor_size_change_override.dm" +#include "modular_nova\modules\modular_weapons\code\cargo_crates\armory_guns.dm" +#include "modular_nova\modules\modular_weapons\code\cargo_crates\surplus_crates.dm" #include "modular_nova\modules\modular_weapons\code\company_and_or_faction_based\carwo_defense_systems\advert.dm" #include "modular_nova\modules\modular_weapons\code\company_and_or_faction_based\carwo_defense_systems\grenade_launcher.dm" #include "modular_nova\modules\modular_weapons\code\company_and_or_faction_based\carwo_defense_systems\gunsets.dm" @@ -7698,6 +7710,9 @@ #include "modular_nova\modules\modular_weapons\code\company_and_or_faction_based\carwo_defense_systems\ammo\grenade.dm" #include "modular_nova\modules\modular_weapons\code\company_and_or_faction_based\carwo_defense_systems\ammo\pistol.dm" #include "modular_nova\modules\modular_weapons\code\company_and_or_faction_based\carwo_defense_systems\ammo\rifle.dm" +#include "modular_nova\modules\modular_weapons\code\company_and_or_faction_based\saibasan\laser_guns.dm" +#include "modular_nova\modules\modular_weapons\code\company_and_or_faction_based\saibasan\mode_datums.dm" +#include "modular_nova\modules\modular_weapons\code\company_and_or_faction_based\saibasan\projectiles.dm" #include "modular_nova\modules\modular_weapons\code\company_and_or_faction_based\szot_dynamica\magazines.dm" #include "modular_nova\modules\modular_weapons\code\company_and_or_faction_based\szot_dynamica\pistol.dm" #include "modular_nova\modules\modular_weapons\code\company_and_or_faction_based\szot_dynamica\rifle.dm" @@ -7715,6 +7730,10 @@ #include "modular_nova\modules\modular_weapons\code\company_and_or_faction_based\xhihao_light_arms\gunsets.dm" #include "modular_nova\modules\modular_weapons\code\company_and_or_faction_based\xhihao_light_arms\rifle.dm" #include "modular_nova\modules\modular_weapons\code\company_and_or_faction_based\xhihao_light_arms\submachinegun.dm" +#include "modular_nova\modules\modular_weapons\code\overrides\autolathe_designs.dm" +#include "modular_nova\modules\modular_weapons\code\overrides\ballistic_master.dm" +#include "modular_nova\modules\modular_weapons\code\overrides\energy.dm" +#include "modular_nova\modules\modular_weapons\code\overrides\suppressor_size_change_override.dm" #include "modular_nova\modules\mold\code\_mold_defines.dm" #include "modular_nova\modules\mold\code\mold.dm" #include "modular_nova\modules\mold\code\mold_controller.dm" @@ -7926,6 +7945,9 @@ #include "modular_nova\modules\robot_limb_detach\code\robot_limb_detach_quirk.dm" #include "modular_nova\modules\rod-stopper\code\immovable_nova.dm" #include "modular_nova\modules\rod-stopper\code\rodstopper.dm" +#include "modular_nova\modules\roundstart_implants\code\loadout_implants.dm" +#include "modular_nova\modules\roundstart_implants\code\loadout_subtypes.dm" +#include "modular_nova\modules\roundstart_implants\code\tool_subtypes.dm" #include "modular_nova\modules\salon\code\barber.dm" #include "modular_nova\modules\salon\code\barber_chair.dm" #include "modular_nova\modules\salon\code\barbervend.dm" @@ -7948,7 +7970,6 @@ #include "modular_nova\modules\sec_haul\code\guns\ammo.dm" #include "modular_nova\modules\sec_haul\code\guns\armory_spawns.dm" #include "modular_nova\modules\sec_haul\code\guns\bullets.dm" -#include "modular_nova\modules\sec_haul\code\guns\cargo_stuff.dm" #include "modular_nova\modules\sec_haul\code\misc\ai_module.dm" #include "modular_nova\modules\sec_haul\code\misc\bullet_drive.dm" #include "modular_nova\modules\sec_haul\code\misc\decals.dm" @@ -8032,7 +8053,10 @@ #include "modular_nova\modules\tarkon\code\clothing\uniform.dm" #include "modular_nova\modules\tarkon\code\guns\m6pdw.dm" #include "modular_nova\modules\tarkon\code\guns\resonance_disruptor.dm" -#include "modular_nova\modules\tarkon\code\misc_fluff\atmos_control.dm" +#include "modular_nova\modules\tarkon\code\machines\atmos_control.dm" +#include "modular_nova\modules\tarkon\code\machines\camera_systems.dm" +#include "modular_nova\modules\tarkon\code\machines\smes.dm" +#include "modular_nova\modules\tarkon\code\machines\windoors.dm" #include "modular_nova\modules\tarkon\code\misc_fluff\card.dm" #include "modular_nova\modules\tarkon\code\misc_fluff\fluff.dm" #include "modular_nova\modules\tarkon\code\misc_fluff\radio.dm" @@ -8158,7 +8182,6 @@ #include "tff_modular\modules\holidays_decor\halloween\halloween-decor.dm" #include "tff_modular\modules\holidays_decor\new_year\decorations.dm" #include "tff_modular\modules\interdyne-remap\interdyne.dm" -#include "tff_modular\modules\mcr_nerf_revert\code\mcr_override.dm" #include "tff_modular\modules\modular_automapper\automapper.dm" #include "tff_modular\modules\nabbers\code\_nabbers.dm" #include "tff_modular\modules\nabbers\code\nabber_bodyparts.dm" @@ -8172,9 +8195,9 @@ #include "tff_modular\modules\nabbers\code\GAGS\nabber_gags.dm" #include "tff_modular\modules\quirks\code\_quirk.dm" #include "tff_modular\modules\redsec\code\vending.dm" -#include "tff_modular\modules\redsec_reskins\beret_reskin.dm" -#include "tff_modular\modules\redsec_reskins\hood_reskin.dm" -#include "tff_modular\modules\redsec_reskins\redsec.dm" +#include "tff_modular\modules\redsec_reskins\code\beret_reskin.dm" +#include "tff_modular\modules\redsec_reskins\code\hood_reskin.dm" +#include "tff_modular\modules\redsec_reskins\code\redsec.dm" #include "tff_modular\modules\smites\femboyfication.dm" #include "tff_modular\modules\teshari_reborn\code\teshari.dm" #include "tff_modular\modules\teshari_reborn\code\teshari_bodypart.dm" diff --git a/tgui/package.json b/tgui/package.json index 1370aacc48a..bfbc5a34aba 100644 --- a/tgui/package.json +++ b/tgui/package.json @@ -17,7 +17,9 @@ "tgui:test": "jest --watch", "tgui:test-simple": "CI=true jest --color", "tgui:test-ci": "CI=true jest --color --collect-coverage", - "tgui:tsc": "tsc" + "tgui:tsc": "tsc", + "tgui:prettier-fix": "prettier --write .", + "tgui:eslint-fix": "eslint --fix packages --ext .js,.cjs,.ts,.tsx" }, "dependencies": { "@swc/core": "^1.3.100", diff --git a/tgui/packages/tgui-panel/chat/ChatPageSettings.jsx b/tgui/packages/tgui-panel/chat/ChatPageSettings.jsx index 67028168f8e..4bd0383d7d7 100644 --- a/tgui/packages/tgui-panel/chat/ChatPageSettings.jsx +++ b/tgui/packages/tgui-panel/chat/ChatPageSettings.jsx @@ -14,7 +14,13 @@ import { Stack, } from 'tgui/components'; -import { removeChatPage, toggleAcceptedType, updateChatPage } from './actions'; +import { + moveChatPageLeft, + moveChatPageRight, + removeChatPage, + toggleAcceptedType, + updateChatPage, +} from './actions'; import { MESSAGE_TYPES } from './constants'; import { selectCurrentChatPage } from './selectors'; @@ -24,9 +30,9 @@ export const ChatPageSettings = (props) => { return (
    - + dispatch( @@ -39,20 +45,74 @@ export const ChatPageSettings = (props) => { /> - + /> + {!page.isMain ? ( + + + + ) : ( + '' + )} + + + + {!page.isMain ? ( + + Reorder Chat:  + + + + ) : ( + '' + )}
    diff --git a/tgui/packages/tgui-panel/chat/ChatTabs.jsx b/tgui/packages/tgui-panel/chat/ChatTabs.jsx index 2031f6a255b..3e3880a2aec 100644 --- a/tgui/packages/tgui-panel/chat/ChatTabs.jsx +++ b/tgui/packages/tgui-panel/chat/ChatTabs.jsx @@ -39,6 +39,7 @@ export const ChatTabs = (props) => { key={page.id} selected={page === currentPage} rightSlot={ + !page.hideUnreadCount && page.unreadCount > 0 && ( ) diff --git a/tgui/packages/tgui-panel/chat/actions.js b/tgui/packages/tgui-panel/chat/actions.js index 3814fbe611f..0b6a73f659a 100644 --- a/tgui/packages/tgui-panel/chat/actions.js +++ b/tgui/packages/tgui-panel/chat/actions.js @@ -10,6 +10,7 @@ import { createPage } from './model'; export const loadChat = createAction('chat/load'); export const rebuildChat = createAction('chat/rebuild'); +export const clearChat = createAction('chat/clear'); export const updateMessageCount = createAction('chat/updateMessageCount'); export const addChatPage = createAction('chat/addPage', () => ({ payload: createPage(), @@ -20,3 +21,5 @@ export const toggleAcceptedType = createAction('chat/toggleAcceptedType'); export const removeChatPage = createAction('chat/removePage'); export const changeScrollTracking = createAction('chat/changeScrollTracking'); export const saveChatToDisk = createAction('chat/saveToDisk'); +export const moveChatPageLeft = createAction('chat/movePageLeft'); +export const moveChatPageRight = createAction('chat/movePageRight'); diff --git a/tgui/packages/tgui-panel/chat/middleware.js b/tgui/packages/tgui-panel/chat/middleware.js index 0eeb0d6957d..83fc28dc86a 100644 --- a/tgui/packages/tgui-panel/chat/middleware.js +++ b/tgui/packages/tgui-panel/chat/middleware.js @@ -19,7 +19,10 @@ import { addChatPage, changeChatPage, changeScrollTracking, + clearChat, loadChat, + moveChatPageLeft, + moveChatPageRight, rebuildChat, removeChatPage, saveChatToDisk, @@ -153,7 +156,9 @@ export const chatMiddleware = (store) => { type === changeChatPage.type || type === addChatPage.type || type === removeChatPage.type || - type === toggleAcceptedType.type + type === toggleAcceptedType.type || + type === moveChatPageLeft.type || + type === moveChatPageRight.type ) { next(action); const page = selectCurrentChatPage(store.getState()); @@ -190,6 +195,10 @@ export const chatMiddleware = (store) => { chatRenderer.saveToDisk(); return; } + if (type === clearChat.type) { + chatRenderer.clearChat(); + return; + } return next(action); }; }; diff --git a/tgui/packages/tgui-panel/chat/model.js b/tgui/packages/tgui-panel/chat/model.js index fdb5521b505..ca2c585d2ec 100644 --- a/tgui/packages/tgui-panel/chat/model.js +++ b/tgui/packages/tgui-panel/chat/model.js @@ -19,10 +19,12 @@ export const createPage = (obj) => { } return { + isMain: false, id: createUuid(), name: 'New Tab', acceptedTypes: acceptedTypes, unreadCount: 0, + hideUnreadCount: false, createdAt: Date.now(), ...obj, }; @@ -34,6 +36,7 @@ export const createMainPage = () => { acceptedTypes[typeDef.type] = true; } return createPage({ + isMain: true, name: 'Main', acceptedTypes, }); diff --git a/tgui/packages/tgui-panel/chat/reducer.js b/tgui/packages/tgui-panel/chat/reducer.js index 7a7681ada74..effc9423955 100644 --- a/tgui/packages/tgui-panel/chat/reducer.js +++ b/tgui/packages/tgui-panel/chat/reducer.js @@ -9,6 +9,8 @@ import { changeChatPage, changeScrollTracking, loadChat, + moveChatPageLeft, + moveChatPageRight, removeChatPage, toggleAcceptedType, updateChatPage, @@ -188,5 +190,52 @@ export const chatReducer = (state = initialState, action) => { } return nextState; } + if (type === moveChatPageLeft.type) { + const { pageId } = payload; + const nextState = { + ...state, + pages: [...state.pages], + pageById: { + ...state.pageById, + }, + }; + const tmpPage = nextState.pageById[pageId]; + const fromIndex = nextState.pages.indexOf(tmpPage.id); + const toIndex = fromIndex - 1; + // don't ever move leftmost page + if (fromIndex > 0) { + // don't ever move anything to the leftmost page + if (toIndex > 0) { + const tmp = nextState.pages[fromIndex]; + nextState.pages[fromIndex] = nextState.pages[toIndex]; + nextState.pages[toIndex] = tmp; + } + } + return nextState; + } + + if (type === moveChatPageRight.type) { + const { pageId } = payload; + const nextState = { + ...state, + pages: [...state.pages], + pageById: { + ...state.pageById, + }, + }; + const tmpPage = nextState.pageById[pageId]; + const fromIndex = nextState.pages.indexOf(tmpPage.id); + const toIndex = fromIndex + 1; + // don't ever move leftmost page + if (fromIndex > 0) { + // don't ever move anything out of the array + if (toIndex < nextState.pages.length) { + const tmp = nextState.pages[fromIndex]; + nextState.pages[fromIndex] = nextState.pages[toIndex]; + nextState.pages[toIndex] = tmp; + } + } + return nextState; + } return state; }; diff --git a/tgui/packages/tgui-panel/chat/renderer.jsx b/tgui/packages/tgui-panel/chat/renderer.jsx index 899839e56cc..0d26061f60b 100644 --- a/tgui/packages/tgui-panel/chat/renderer.jsx +++ b/tgui/packages/tgui-panel/chat/renderer.jsx @@ -205,7 +205,7 @@ class ChatRenderer { const highlightWholeMessage = setting.highlightWholeMessage; const matchWord = setting.matchWord; const matchCase = setting.matchCase; - const allowedRegex = /^[a-z0-9_\-$/^[\s\]\\]+$/gi; + const allowedRegex = /^[a-zа-яё0-9_\-$/^[\s\]\\]+$/gi; const regexEscapeCharacters = /[!#$%^&*)(+=.<>{}[\]:;'"|~`_\-\\/]/g; const lines = String(text) .split(',') @@ -562,6 +562,29 @@ class ChatRenderer { }); } + /** + * @clearChat + * @copyright 2023 + * @author Cheffie + * @link https://github.com/CheffieGithub + * @license MIT + */ + clearChat() { + const messages = this.visibleMessages; + this.visibleMessages = []; + for (let i = 0; i < messages.length; i++) { + const message = messages[i]; + this.rootNode.removeChild(message.node); + // Mark this message as pruned + message.node = 'pruned'; + } + // Remove pruned messages from the message array + this.messages = this.messages.filter( + (message) => message.node !== 'pruned', + ); + logger.log(`Cleared chat`); + } + saveToDisk() { // Allow only on IE11 if (Byond.IS_LTE_IE10) { diff --git a/tgui/packages/tgui-panel/chat/replaceInTextNode.js b/tgui/packages/tgui-panel/chat/replaceInTextNode.js index 4c91b604dac..7148bfe7aa6 100644 --- a/tgui/packages/tgui-panel/chat/replaceInTextNode.js +++ b/tgui/packages/tgui-panel/chat/replaceInTextNode.js @@ -93,7 +93,7 @@ export const replaceInTextNode = (regex, words, createNode) => (node) => { for (let word of words) { // Capture if the word is at the beginning, end, middle, // or by itself in a message - wordRegexStr += `^${word}\\W|\\W${word}\\W|\\W${word}$|^${word}$`; + wordRegexStr += `^${word}\\s\\W|\\s\\W${word}\\s\\W|\\s\\W${word}$|^${word}\\s\\W$`; // Make sure the last character for the expression is NOT '|' if (++i !== words.length) { wordRegexStr += '|'; diff --git a/tgui/packages/tgui-panel/settings/SettingsPanel.jsx b/tgui/packages/tgui-panel/settings/SettingsPanel.jsx index a7c90af8cc9..230f655181e 100644 --- a/tgui/packages/tgui-panel/settings/SettingsPanel.jsx +++ b/tgui/packages/tgui-panel/settings/SettingsPanel.jsx @@ -13,7 +13,6 @@ import { ColorBox, Divider, Dropdown, - Flex, Input, LabeledList, NumberInput, @@ -24,7 +23,7 @@ import { } from 'tgui/components'; import { ChatPageSettings } from '../chat'; -import { rebuildChat, saveChatToDisk } from '../chat/actions'; +import { clearChat, rebuildChat, saveChatToDisk } from '../chat/actions'; import { THEMES } from '../themes'; import { addHighlightSetting, @@ -130,7 +129,6 @@ export const SettingsGeneral = (props) => { content="Custom font" icon={freeFont ? 'lock-open' : 'lock'} color={freeFont ? 'good' : 'bad'} - ml={1} onClick={() => { setFreeFont(!freeFont); }} @@ -140,7 +138,7 @@ export const SettingsGeneral = (props) => { { { - + + +
    ); }; @@ -188,30 +201,28 @@ const TextHighlightSettings = (props) => { const highlightSettings = useSelector(selectHighlightSettings); const dispatch = useDispatch(); return ( -
    -
    - - {highlightSettings.map((id, i) => ( - + + {highlightSettings.map((id, i) => ( + + ))} + {highlightSettings.length < MAX_HIGHLIGHT_SETTINGS && ( + +
    + + )} +